tango-app-ui-store-builder 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2022/lib/components/fixture-template/fixture-template.component.mjs +9 -23
  2. package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +47 -84
  3. package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +1 -1
  4. package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +5 -4
  5. package/esm2022/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.mjs +3 -3
  6. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +46 -366
  7. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +10 -51
  8. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +9 -26
  9. package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +2 -2
  10. package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +73 -101
  11. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +3 -3
  12. package/esm2022/lib/interfaces/fixture-template.interface.mjs +1 -1
  13. package/esm2022/lib/services/store-builder.service.mjs +4 -4
  14. package/esm2022/lib/tango-store-builder.module.mjs +7 -11
  15. package/fesm2022/tango-app-ui-store-builder.mjs +1147 -2524
  16. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  17. package/lib/components/fixture-template/fixture-template.component.d.ts +0 -1
  18. package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +9 -9
  19. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +1 -1
  20. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +1 -1
  21. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +6 -23
  22. package/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.d.ts +1 -1
  23. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +6 -7
  24. package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +9 -9
  25. package/lib/interfaces/fixture-template.interface.d.ts +2 -2
  26. package/lib/services/store-builder.service.d.ts +1 -1
  27. package/lib/tango-store-builder.module.d.ts +33 -35
  28. package/package.json +1 -1
  29. package/esm2022/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.mjs +0 -80
  30. package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +0 -375
  31. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +0 -486
  32. package/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.d.ts +0 -21
  33. package/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.d.ts +0 -48
  34. package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +0 -76
@@ -1,11 +1,11 @@
1
- import { Component, EventEmitter, Input, Output, } from "@angular/core";
2
- import { FormsModule, ReactiveFormsModule, Validators, } from "@angular/forms";
3
- import { firstValueFrom, lastValueFrom, Subject, takeUntil } from "rxjs";
4
- import { CommonModule, TitleCasePipe } from "@angular/common";
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
3
+ import { firstValueFrom, lastValueFrom, Subject, takeUntil } from 'rxjs';
4
+ import { CommonModule, TitleCasePipe } from '@angular/common';
5
5
  import { ReactiveSelectComponent } from "../../reactive-select/reactive-select.component";
6
- import { SHELF_COLORS } from "../../../data/fixture-template.data";
7
- import { rgbToHex } from "../../../functions/plano.function";
8
- import { NgbTooltip } from "@ng-bootstrap/ng-bootstrap";
6
+ import { SHELF_COLORS } from '../../../data/fixture-template.data';
7
+ import { rgbToHex } from '../../../functions/plano.function';
8
+ import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/forms";
11
11
  import * as i2 from "../../../services/store-builder.service";
@@ -35,20 +35,20 @@ export class InstanceVmsComponent {
35
35
  startYPositionList = [];
36
36
  endYPositionsList = [];
37
37
  xZonesList = [
38
- { label: "Left", value: "left" },
39
- { label: "Right", value: "right" },
40
- { label: "Middle", value: "middle" },
41
- { label: "Stretch", value: "stretch" },
38
+ { label: 'Left', value: 'left' },
39
+ { label: 'Right', value: 'right' },
40
+ { label: 'Middle', value: 'middle' },
41
+ { label: 'Stretch', value: 'stretch' },
42
42
  ];
43
43
  yZonesList = [
44
- { label: "Top", value: "top" },
45
- { label: "Bottom", value: "bottom" },
46
- { label: "Middle", value: "middle" },
47
- { label: "Stretch", value: "stretch" },
44
+ { label: 'Top', value: 'top' },
45
+ { label: 'Bottom', value: 'bottom' },
46
+ { label: 'Middle', value: 'middle' },
47
+ { label: 'Stretch', value: 'stretch' },
48
48
  ];
49
49
  positionsList = [
50
- { label: "Front", value: "front" },
51
- { label: "Back", value: "back" },
50
+ { label: 'Front', value: 'front' },
51
+ { label: 'Back', value: 'back' }
52
52
  ];
53
53
  imgCDN;
54
54
  isVMInitialized = false;
@@ -65,30 +65,33 @@ export class InstanceVmsComponent {
65
65
  this.cd = cd;
66
66
  }
67
67
  async ngOnChanges(changes) {
68
- if (changes["fixtureData"]) {
68
+ if (changes['fixtureData']) {
69
69
  this.isPageLoading = true;
70
- this.gs.environment.subscribe((env) => (this.imgCDN = env.planogramCDN));
70
+ this.gs.environment.subscribe((env) => this.imgCDN = env.planogramCDN);
71
71
  this.gs.dataRangeValue.subscribe(async (data) => {
72
72
  if (data?.client) {
73
73
  this.clientId = data?.client;
74
74
  }
75
75
  else {
76
- let headerData = JSON.parse(localStorage.getItem("header-filters"));
76
+ let headerData = JSON.parse(localStorage.getItem('header-filters'));
77
77
  this.clientId = headerData?.client;
78
78
  }
79
- await Promise.all([this.getVmTypes(), this.getVmsList()]);
80
- this.fixtureTemplateDetails = changes["fixtureData"].currentValue;
79
+ await Promise.all([
80
+ this.getVmTypes(),
81
+ this.getVmsList(),
82
+ ]);
83
+ this.fixtureTemplateDetails = changes['fixtureData'].currentValue;
81
84
  this.initVmForm();
82
85
  });
83
86
  }
84
- if (changes["editMode"]) {
85
- this.isEditMode = changes["editMode"].currentValue;
87
+ if (changes['editMode']) {
88
+ this.isEditMode = changes['editMode'].currentValue;
86
89
  if (this.isEditMode) {
87
90
  this.fixtureVmForm?.enable({ emitEvent: false });
88
91
  }
89
92
  }
90
- if (changes["isSubmitted"]) {
91
- if (changes["isSubmitted"].currentValue) {
93
+ if (changes['isSubmitted']) {
94
+ if (changes['isSubmitted'].currentValue) {
92
95
  this.submitForm();
93
96
  }
94
97
  }
@@ -98,7 +101,7 @@ export class InstanceVmsComponent {
98
101
  this.isVMInitialized = this.handleVmPositionAndSize();
99
102
  this.vmArray?.valueChanges
100
103
  .pipe(takeUntil(this.destroy$))
101
- .subscribe((val) => {
104
+ .subscribe(val => {
102
105
  this.vmArray.controls.forEach((e, i) => {
103
106
  this.handleVmPositionAndSize();
104
107
  });
@@ -112,7 +115,7 @@ export class InstanceVmsComponent {
112
115
  if (this.fixtureVmForm)
113
116
  return;
114
117
  this.fixtureVmForm = this.fb.group({
115
- vmConfig: this.fb.array([]),
118
+ vmConfig: this.fb.array([])
116
119
  });
117
120
  if (this.fixtureTemplateDetails?.vmConfig?.length) {
118
121
  this.fixtureTemplateDetails?.vmConfig?.forEach((e) => this.addVM(e));
@@ -125,29 +128,26 @@ export class InstanceVmsComponent {
125
128
  this.isPageLoading = false;
126
129
  }
127
130
  get vmArray() {
128
- return this.fixtureVmForm?.get("vmConfig");
131
+ return this.fixtureVmForm?.get('vmConfig');
129
132
  }
130
133
  async getVmsList() {
131
134
  try {
132
135
  const res = await lastValueFrom(this.storeBuilderService.getVMNameList(this.clientId));
133
- if (res?.status === "success") {
136
+ if (res?.status === 'success') {
134
137
  this.vmList = res?.data?.map((item) => {
135
138
  return {
136
139
  id: item._id,
137
140
  name: item.vmName,
138
- displayName: item.vmName + (item?.vmType ? `(${item.vmType})` : ""),
141
+ displayName: item.vmName + (item?.vmType ? `(${item.vmType})` : ''),
139
142
  width: item.vmWidth.value,
140
143
  height: item.vmHeight.value,
141
144
  type: item.vmType,
142
- ...(item.vmImageUrl
143
- ? { imgUrl: `${this.imgCDN}${item.vmImageUrl}` }
144
- : {}),
145
+ ...(item.vmImageUrl ? { imgUrl: `${this.imgCDN}${item.vmImageUrl}` } : {}),
145
146
  };
146
147
  });
147
- if (this.fixtureData?.taskType?.includes("fixture")) {
148
+ if (this.fixtureData.taskType.includes('fixture')) {
148
149
  this.fixtureData.vmConfig.forEach((vm) => {
149
- let findVm = this.vmList.findIndex((ele) => ele?.name?.toLowerCase() == vm?.vmName?.toLowerCase() &&
150
- ele?.vmType?.toLowerCase() == vm?.vmType?.toLowerCase());
150
+ let findVm = this.vmList.findIndex((ele) => ele?.name?.toLowerCase() == vm?.vmName?.toLowerCase());
151
151
  if (findVm == -1) {
152
152
  this.vmList.push({
153
153
  id: vm.vmName,
@@ -156,9 +156,7 @@ export class InstanceVmsComponent {
156
156
  width: 100,
157
157
  height: 100,
158
158
  type: vm.vmType,
159
- ...(vm.vmImage
160
- ? { imgUrl: `${this.imgCDN}${vm.vmImage}` }
161
- : {}),
159
+ ...(vm.vmImage ? { imgUrl: `${this.imgCDN}${vm.vmImage}` } : {}),
162
160
  });
163
161
  }
164
162
  else {
@@ -182,13 +180,9 @@ export class InstanceVmsComponent {
182
180
  try {
183
181
  const res = await firstValueFrom(this.storeBuilderService.getVmTypesList(this.clientId));
184
182
  if (res?.data) {
185
- this.vmTypeList = res.data.map((b) => {
186
- return { label: b.vmType ?? "", value: b.vmType ?? "" };
187
- });
188
- if (this.fixtureData?.taskType?.includes("fixture")) {
189
- let fixtureVM = this.fixtureData.vmConfig.map((vm) => {
190
- return { label: vm.vmType ?? "", value: vm.vmType ?? "" };
191
- });
183
+ this.vmTypeList = res.data.map((b) => { return { label: b.vmType ?? '', value: b.vmType ?? '' }; });
184
+ if (this.fixtureData.taskType.includes('fixture')) {
185
+ let fixtureVM = this.fixtureData.vmConfig.map((vm) => { return { label: vm.vmType ?? '', value: vm.vmType ?? '' }; });
192
186
  let mergedArray = [...this.vmTypeList, ...fixtureVM];
193
187
  this.vmTypeList = [...new Set(mergedArray.map((ele) => ele))];
194
188
  }
@@ -204,7 +198,7 @@ export class InstanceVmsComponent {
204
198
  }
205
199
  onImgError(event) {
206
200
  const target = event.target;
207
- target.src = "assets/tango/Images/vm-placeholder.png";
201
+ target.src = 'assets/tango/Images/vm-placeholder.png';
208
202
  }
209
203
  addVM(vm, i = this.vmArray.controls.length) {
210
204
  const vmGroup = this.fb.group({
@@ -212,52 +206,39 @@ export class InstanceVmsComponent {
212
206
  vmId: [vm?.vmId ?? vm?.vmName, Validators.required],
213
207
  startYPosition: [vm?.startYPosition, Validators.required],
214
208
  endYPosition: [vm?.endYPosition, Validators.required],
215
- xZone: [vm?.xZone ?? ""],
216
- yZone: [vm?.yZone ?? ""],
217
- position: [vm?.position ?? ""],
209
+ xZone: [vm?.xZone ?? ''],
210
+ yZone: [vm?.yZone ?? ''],
211
+ position: [vm?.position ?? '']
218
212
  });
219
213
  this.vmArray.push(vmGroup);
220
214
  const mapId = `vm${i}`;
221
215
  if (vm?.vmType) {
222
- this.vmListMap.set(mapId, this.vmList
223
- .filter((v) => v.type === vm?.vmType)
224
- .map((v) => {
225
- return { value: v.id, label: v.displayName };
226
- }));
216
+ this.vmListMap.set(mapId, this.vmList.filter(v => v.type === vm?.vmType).map(v => { return { value: v.id, label: v.displayName }; }));
227
217
  }
228
218
  else {
229
- this.vmListMap.set(mapId, this.vmList.map((v) => {
230
- return { value: v.id, label: v.displayName };
231
- }));
219
+ this.vmListMap.set(mapId, this.vmList.map(v => { return { value: v.id, label: v.displayName }; }));
232
220
  }
233
221
  this.setupVMListener(vmGroup, mapId);
234
- const yPositions = this.fixtureTemplateDetails?.shelfConfig?.map((e, i) => ({
222
+ const yPositions = (this.fixtureTemplateDetails?.shelfConfig?.map((e, i) => ({
235
223
  label: `${this.titleCasePipe.transform(e?.shelfType)} ${e?.shelfNumber}`,
236
- value: e?.shelfNumber ?? i + 1,
237
- })) ?? [];
224
+ value: e?.shelfNumber ?? (i + 1),
225
+ })) ?? []);
238
226
  this.startYPositionList.push(yPositions);
239
227
  this.endYPositionsList.push(yPositions);
240
228
  this.onChangeStartY(this.vmArray.length - 1, vm?.startYPosition ?? 1);
241
229
  }
242
230
  setupVMListener(vmGroup, i) {
243
- vmGroup
244
- .get("vmType")
245
- ?.valueChanges.pipe(takeUntil(this.destroy$))
246
- .subscribe((vmType) => {
231
+ vmGroup.get('vmType')?.valueChanges
232
+ .pipe(takeUntil(this.destroy$))
233
+ .subscribe(vmType => {
247
234
  this.vmListMap.set(i, []);
248
235
  if (vmType) {
249
- this.vmListMap.set(i, this.vmList
250
- .filter((v) => v.type === vmType)
251
- .map((v) => {
252
- return { value: v.id, label: v.displayName };
253
- }));
236
+ this.vmListMap.set(i, this.vmList.filter(v => v.type === vmType).map(v => { return { value: v.id, label: v.displayName }; }));
254
237
  }
255
238
  else {
256
- this.vmListMap.set(i, this.vmList.map((v) => {
257
- return { value: v.id, label: v.displayName };
258
- }));
239
+ this.vmListMap.set(i, this.vmList.map(v => { return { value: v.id, label: v.displayName }; }));
259
240
  }
260
- vmGroup.get("vmId")?.reset();
241
+ vmGroup.get('vmId')?.reset();
261
242
  });
262
243
  }
263
244
  onChangeStartY(i, event) {
@@ -266,12 +247,12 @@ export class InstanceVmsComponent {
266
247
  return {
267
248
  label: k.label,
268
249
  value: k.value,
269
- disabled: k.value < event,
250
+ disabled: k.value < event
270
251
  };
271
252
  }) ?? [];
272
253
  this.endYPositionsList[i] = newEndY;
273
- if (event > this.vmArray.controls[i].get("endYPosition")?.value) {
274
- this.vmArray.controls[i].get("endYPosition")?.reset();
254
+ if (event > this.vmArray.controls[i].get('endYPosition')?.value) {
255
+ this.vmArray.controls[i].get('endYPosition')?.reset();
275
256
  }
276
257
  }
277
258
  removeVM(index) {
@@ -286,9 +267,7 @@ export class InstanceVmsComponent {
286
267
  const bodyWidth = viewPort.offsetWidth;
287
268
  this.vmArray?.controls.forEach((e, i) => {
288
269
  let startShelf = e?.value?.startYPosition || 1;
289
- let endShelf = e?.value?.endYPosition ||
290
- this.fixtureTemplateDetails?.shelfConfig?.length ||
291
- 1;
270
+ let endShelf = e?.value?.endYPosition || this.fixtureTemplateDetails?.shelfConfig?.length || 1;
292
271
  const vm = viewPort.querySelector(`#vm${i}`);
293
272
  if (!vm)
294
273
  return;
@@ -314,19 +293,19 @@ export class InstanceVmsComponent {
314
293
  let width = defaultW;
315
294
  let height = defaultH;
316
295
  switch (e?.value?.xZone) {
317
- case "left":
296
+ case 'left':
318
297
  x = 0;
319
298
  width = defaultW;
320
299
  break;
321
- case "right":
300
+ case 'right':
322
301
  width = defaultW;
323
302
  x = bodyWidth - width;
324
303
  break;
325
- case "middle":
304
+ case 'middle':
326
305
  width = defaultW;
327
306
  x = (bodyWidth - width) / 2;
328
307
  break;
329
- case "stretch":
308
+ case 'stretch':
330
309
  width = bodyWidth;
331
310
  x = 0;
332
311
  break;
@@ -446,6 +425,7 @@ export class InstanceVmsComponent {
446
425
  d.style.backgroundColor = this.shelfColors[0].bg;
447
426
  d.style.border = `1.4px solid ${this.shelfColors[0].border}`;
448
427
  }
428
+ ;
449
429
  });
450
430
  }
451
431
  break;
@@ -455,6 +435,7 @@ export class InstanceVmsComponent {
455
435
  d.style.backgroundColor = this.shelfColors[0].bg;
456
436
  d.style.border = `1.4px solid ${this.shelfColors[0].border}`;
457
437
  }
438
+ ;
458
439
  });
459
440
  break;
460
441
  }
@@ -527,8 +508,7 @@ export class InstanceVmsComponent {
527
508
  updatedAt: new Date(Date.now()).toISOString(),
528
509
  ...(this.isRollout && { isVmEdited: true }),
529
510
  };
530
- if (this.fixtureData?.taskType?.includes("fixture") &&
531
- payload?.vmConfig?.length) {
511
+ if (this.fixtureData?.taskType?.includes('fixture') && payload?.vmConfig?.length) {
532
512
  payload.vmConfig?.forEach((vm, index) => {
533
513
  let findVm = this.fixtureData.vmConfig.find((ele) => ele?.vmName == vm?.vmId || ele?.vmName == vm?.vmName);
534
514
  if (findVm && payload?.vmConfig?.length) {
@@ -540,9 +520,7 @@ export class InstanceVmsComponent {
540
520
  const req = {
541
521
  fixtureId: this.fixtureTemplateDetails._id,
542
522
  data: payload,
543
- ...(!this.fixtureData?.taskType && !this.isRollout
544
- ? { editMode: this.isEditMode }
545
- : {}),
523
+ ...(!this.fixtureData?.taskType && !this.isRollout) ? { editMode: this.isEditMode } : {},
546
524
  };
547
525
  this.storeBuilderService.updateStoreFixture(req).subscribe({
548
526
  next: (res) => {
@@ -555,7 +533,7 @@ export class InstanceVmsComponent {
555
533
  this.toast.getSuccessToast("Fixture updated successfully");
556
534
  }
557
535
  this.submitEvent.emit(true);
558
- },
536
+ }
559
537
  });
560
538
  }
561
539
  }
@@ -563,7 +541,7 @@ export class InstanceVmsComponent {
563
541
  let vmConfig = this.vmArray.controls.map((e) => {
564
542
  return e.value;
565
543
  });
566
- if (this.fixtureData?.taskType?.includes("fixture") && vmConfig?.length) {
544
+ if (this.fixtureData?.taskType?.includes('fixture') && vmConfig?.length) {
567
545
  vmConfig?.forEach((vm, index) => {
568
546
  let findVm = this.fixtureData.vmConfig.find((ele) => ele?.vmName == vm?.vmId || ele?.vmName == vm?.vmName);
569
547
  if (findVm && vmConfig?.length) {
@@ -576,17 +554,11 @@ export class InstanceVmsComponent {
576
554
  this.submitEvent.emit(vmConfig);
577
555
  }
578
556
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InstanceVmsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.StoreBuilderService }, { token: i3.ToastService }, { token: i4.GlobalStateService }, { token: i5.TitleCasePipe }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
579
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InstanceVmsComponent, isStandalone: true, selector: "lib-instance-vms", inputs: { fixtureData: "fixtureData", editMode: "editMode", isSubmitted: "isSubmitted", isRollout: "isRollout" }, outputs: { submitEvent: "submitEvent" }, providers: [TitleCasePipe], usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-template-vms\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!--============================Left Column============================ -->\r\n <div class=\"cols col\">\r\n <h2>All visual merchandise from library</h2>\r\n <p>Configure your VMs position and placements</p>\r\n <form [formGroup]=\"fixtureVmForm\">\r\n <div formArrayName=\"vmConfig\" class=\"array-wrapper\">\r\n <div *ngFor=\"let vm of vmArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">VISUAL MERCHANDISE {{ i + 1 }}</h6>\r\n <!-- *ngIf=\"i != 0\" -->\r\n <svg\r\n (click)=\"removeVM(i)\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmTypeList\"\r\n formControlName=\"vmType\"\r\n [search]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmType')?.touched && vm.get('vmType')?.errors\">\r\n <small *ngIf=\"vm.get('vmType')?.hasError('required')\" class=\"text-danger\"> Choose a VM Type </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmListMap.get('vm' + i) ?? []\"\r\n formControlName=\"vmId\"\r\n [search]=\"true\"\r\n [prefix]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmId')?.touched && vm.get('vmId')?.errors\">\r\n <small *ngIf=\"vm.get('vmId')?.hasError('required')\" class=\"text-danger\"> Select a VM </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"getSelectedVM(vm) as selectedVM\" class=\"vm-preview\">\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"preview\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM.imgUrl\" alt=\"Vm Image\" />\r\n\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n <div class=\"badge inactive\">{{ selectedVM?.height }}*{{ selectedVM?.height }}</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div style=\"overflow: hidden\">\r\n <h3 class=\"ellipsis cursor-pointer\" [ngbTooltip]=\"selectedVM?.name\">{{ selectedVM?.name }}</h3>\r\n <p>Can be found in the fixture with the size of {{ selectedVM?.height }}*{{ selectedVM?.height }}mm</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"startYPosition\" class=\"form-label mb-1\">Placement start</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"startYPositionList[i]\"\r\n formControlName=\"startYPosition\"\r\n (ngModelChange)=\"onChangeStartY(i, $event)\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('startYPosition')?.touched && vm.get('startYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('startYPosition')?.hasError('required')\"> Please select start </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"endYPosition\" class=\"form-label mb-1\">Placement end</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"endYPositionsList[i]\"\r\n formControlName=\"endYPosition\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('endYPosition')?.touched && vm.get('endYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('endYPosition')?.hasError('required')\"> Please select end </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"yZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Vertical zone\r\n <svg\r\n width=\"18px\"\r\n height=\"18px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(90)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"yZonesList\" formControlName=\"yZone\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"xZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Horizontal zone\r\n <svg\r\n width=\"20px\"\r\n height=\"20px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"xZonesList\" formControlName=\"xZone\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"position\" class=\"form-label mb-1\">Position</label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"positionsList\" formControlName=\"position\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <button [disabled]=\"!isEditMode\" class=\"btn btn-outline text-end\" (click)=\"addVM()\">Add visual Merchandise</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!--============================Right Column=========================== -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div id=\"vm-products\" class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n id=\"header-block\"\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <ng-container *ngFor=\"let vm of vmArray?.controls; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div\r\n id=\"brand-category\"\r\n class=\"brand-category\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'shelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div\r\n [id]=\"'brand-category' + i\"\r\n class=\"brand-category\"\r\n *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\" ></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"max-width: 200px;width:100%\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-vms-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#vm-products{margin:0 auto}#vm-products .body-block{position:relative}#vm-products .body-block .block{border:none}#vm-products #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#vm-products #fixture-level .brand,#vm-products #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#vm-products #fixture-level .category{margin-top:12px}#vm-products #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#vm-products #section-level .brand,#vm-products #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #section-level .separator{margin:0 4px;font-weight:600}#vm-products #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#vm-products #shelf-level .brand,#vm-products #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #shelf-level .separator{margin:0 4px;font-weight:600}#vm-products .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#vm-products .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#vm-products .sub-footer{position:relative;width:48%}#vm-products .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#vm-products .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px}.wall-viewport{position:relative}img{width:100%;height:100%;display:block}.vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}.vm-preview{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px}.vm-preview h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.vm-preview p{color:var(--Gray-700, #344054);font-size:12px;font-weight:400}.vm-preview .preview{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}.vm-preview .preview img{border-radius:2px}\n"], dependencies: [{ kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
557
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InstanceVmsComponent, isStandalone: true, selector: "lib-instance-vms", inputs: { fixtureData: "fixtureData", editMode: "editMode", isSubmitted: "isSubmitted", isRollout: "isRollout" }, outputs: { submitEvent: "submitEvent" }, providers: [TitleCasePipe], usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-template-vms\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!--============================Left Column============================ -->\r\n <div class=\"cols col\">\r\n <h2>All visual merchandise from library</h2>\r\n <p>Configure your VMs position and placements</p>\r\n <form [formGroup]=\"fixtureVmForm\">\r\n <div formArrayName=\"vmConfig\" class=\"array-wrapper\">\r\n <div *ngFor=\"let vm of vmArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">VISUAL MERCHANDISE {{ i + 1 }}</h6>\r\n <!-- *ngIf=\"i != 0\" -->\r\n <svg\r\n (click)=\"removeVM(i)\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmTypeList\"\r\n formControlName=\"vmType\"\r\n [search]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmType')?.touched && vm.get('vmType')?.errors\">\r\n <small *ngIf=\"vm.get('vmType')?.hasError('required')\" class=\"text-danger\"> Choose a VM Type </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmListMap.get('vm' + i) ?? []\"\r\n formControlName=\"vmId\"\r\n [search]=\"true\"\r\n [prefix]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmId')?.touched && vm.get('vmId')?.errors\">\r\n <small *ngIf=\"vm.get('vmId')?.hasError('required')\" class=\"text-danger\"> Select a VM </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"getSelectedVM(vm) as selectedVM\" class=\"vm-preview\">\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"preview\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM.imgUrl\" alt=\"Vm Image\" />\r\n\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n <div class=\"badge inactive\">{{ selectedVM?.height }}*{{ selectedVM?.height }}</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div style=\"overflow: hidden\">\r\n <h3 class=\"ellipsis cursor-pointer\" [ngbTooltip]=\"selectedVM?.name\">{{ selectedVM?.name }}</h3>\r\n <p>Can be found in the fixture with the size of {{ selectedVM?.height }}*{{ selectedVM?.height }}mm</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"startYPosition\" class=\"form-label mb-1\">Placement start</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"startYPositionList[i]\"\r\n formControlName=\"startYPosition\"\r\n (ngModelChange)=\"onChangeStartY(i, $event)\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('startYPosition')?.touched && vm.get('startYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('startYPosition')?.hasError('required')\"> Please select start </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"endYPosition\" class=\"form-label mb-1\">Placement end</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"endYPositionsList[i]\"\r\n formControlName=\"endYPosition\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('endYPosition')?.touched && vm.get('endYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('endYPosition')?.hasError('required')\"> Please select end </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"yZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Vertical zone\r\n <svg\r\n width=\"18px\"\r\n height=\"18px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(90)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"yZonesList\" formControlName=\"yZone\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"xZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Horizontal zone\r\n <svg\r\n width=\"20px\"\r\n height=\"20px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"xZonesList\" formControlName=\"xZone\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"position\" class=\"form-label mb-1\">Position</label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"positionsList\" formControlName=\"position\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <button [disabled]=\"!isEditMode\" class=\"btn btn-outline text-end\" (click)=\"addVM()\">Add visual Merchandise</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!--============================Right Column=========================== -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div id=\"vm-products\" class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n id=\"header-block\"\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <ng-container *ngFor=\"let vm of vmArray?.controls; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div\r\n id=\"brand-category\"\r\n class=\"brand-category\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'shelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div\r\n [id]=\"'brand-category' + i\"\r\n class=\"brand-category\"\r\n *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\" ></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"width: 200px\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-vms-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#vm-products{margin:0 auto}#vm-products .body-block{position:relative}#vm-products .body-block .block{border:none}#vm-products #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#vm-products #fixture-level .brand,#vm-products #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#vm-products #fixture-level .category{margin-top:12px}#vm-products #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#vm-products #section-level .brand,#vm-products #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #section-level .separator{margin:0 4px;font-weight:600}#vm-products #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#vm-products #shelf-level .brand,#vm-products #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #shelf-level .separator{margin:0 4px;font-weight:600}#vm-products .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#vm-products .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#vm-products .sub-footer{position:relative;width:48%}#vm-products .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#vm-products .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px}.wall-viewport{position:relative}img{width:100%;height:100%;display:block}.vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}.vm-preview{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px}.vm-preview h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.vm-preview p{color:var(--Gray-700, #344054);font-size:12px;font-weight:400}.vm-preview .preview{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}.vm-preview .preview img{border-radius:2px}\n"], dependencies: [{ kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
580
558
  }
581
559
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InstanceVmsComponent, decorators: [{
582
560
  type: Component,
583
- args: [{ selector: "lib-instance-vms", providers: [TitleCasePipe], standalone: true, imports: [
584
- ReactiveSelectComponent,
585
- FormsModule,
586
- ReactiveFormsModule,
587
- CommonModule,
588
- NgbTooltip,
589
- ], template: "<section id=\"fixture-template-vms\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!--============================Left Column============================ -->\r\n <div class=\"cols col\">\r\n <h2>All visual merchandise from library</h2>\r\n <p>Configure your VMs position and placements</p>\r\n <form [formGroup]=\"fixtureVmForm\">\r\n <div formArrayName=\"vmConfig\" class=\"array-wrapper\">\r\n <div *ngFor=\"let vm of vmArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">VISUAL MERCHANDISE {{ i + 1 }}</h6>\r\n <!-- *ngIf=\"i != 0\" -->\r\n <svg\r\n (click)=\"removeVM(i)\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmTypeList\"\r\n formControlName=\"vmType\"\r\n [search]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmType')?.touched && vm.get('vmType')?.errors\">\r\n <small *ngIf=\"vm.get('vmType')?.hasError('required')\" class=\"text-danger\"> Choose a VM Type </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmListMap.get('vm' + i) ?? []\"\r\n formControlName=\"vmId\"\r\n [search]=\"true\"\r\n [prefix]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmId')?.touched && vm.get('vmId')?.errors\">\r\n <small *ngIf=\"vm.get('vmId')?.hasError('required')\" class=\"text-danger\"> Select a VM </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"getSelectedVM(vm) as selectedVM\" class=\"vm-preview\">\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"preview\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM.imgUrl\" alt=\"Vm Image\" />\r\n\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n <div class=\"badge inactive\">{{ selectedVM?.height }}*{{ selectedVM?.height }}</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div style=\"overflow: hidden\">\r\n <h3 class=\"ellipsis cursor-pointer\" [ngbTooltip]=\"selectedVM?.name\">{{ selectedVM?.name }}</h3>\r\n <p>Can be found in the fixture with the size of {{ selectedVM?.height }}*{{ selectedVM?.height }}mm</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"startYPosition\" class=\"form-label mb-1\">Placement start</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"startYPositionList[i]\"\r\n formControlName=\"startYPosition\"\r\n (ngModelChange)=\"onChangeStartY(i, $event)\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('startYPosition')?.touched && vm.get('startYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('startYPosition')?.hasError('required')\"> Please select start </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"endYPosition\" class=\"form-label mb-1\">Placement end</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"endYPositionsList[i]\"\r\n formControlName=\"endYPosition\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('endYPosition')?.touched && vm.get('endYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('endYPosition')?.hasError('required')\"> Please select end </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"yZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Vertical zone\r\n <svg\r\n width=\"18px\"\r\n height=\"18px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(90)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"yZonesList\" formControlName=\"yZone\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"xZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Horizontal zone\r\n <svg\r\n width=\"20px\"\r\n height=\"20px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"xZonesList\" formControlName=\"xZone\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"position\" class=\"form-label mb-1\">Position</label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"positionsList\" formControlName=\"position\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <button [disabled]=\"!isEditMode\" class=\"btn btn-outline text-end\" (click)=\"addVM()\">Add visual Merchandise</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!--============================Right Column=========================== -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div id=\"vm-products\" class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n id=\"header-block\"\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <ng-container *ngFor=\"let vm of vmArray?.controls; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div\r\n id=\"brand-category\"\r\n class=\"brand-category\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'shelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div\r\n [id]=\"'brand-category' + i\"\r\n class=\"brand-category\"\r\n *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\" ></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"max-width: 200px;width:100%\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-vms-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#vm-products{margin:0 auto}#vm-products .body-block{position:relative}#vm-products .body-block .block{border:none}#vm-products #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#vm-products #fixture-level .brand,#vm-products #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#vm-products #fixture-level .category{margin-top:12px}#vm-products #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#vm-products #section-level .brand,#vm-products #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #section-level .separator{margin:0 4px;font-weight:600}#vm-products #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#vm-products #shelf-level .brand,#vm-products #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #shelf-level .separator{margin:0 4px;font-weight:600}#vm-products .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#vm-products .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#vm-products .sub-footer{position:relative;width:48%}#vm-products .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#vm-products .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px}.wall-viewport{position:relative}img{width:100%;height:100%;display:block}.vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}.vm-preview{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px}.vm-preview h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.vm-preview p{color:var(--Gray-700, #344054);font-size:12px;font-weight:400}.vm-preview .preview{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}.vm-preview .preview img{border-radius:2px}\n"] }]
561
+ args: [{ selector: 'lib-instance-vms', providers: [TitleCasePipe], standalone: true, imports: [ReactiveSelectComponent, FormsModule, ReactiveFormsModule, CommonModule, NgbTooltip], template: "<section id=\"fixture-template-vms\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!--============================Left Column============================ -->\r\n <div class=\"cols col\">\r\n <h2>All visual merchandise from library</h2>\r\n <p>Configure your VMs position and placements</p>\r\n <form [formGroup]=\"fixtureVmForm\">\r\n <div formArrayName=\"vmConfig\" class=\"array-wrapper\">\r\n <div *ngFor=\"let vm of vmArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">VISUAL MERCHANDISE {{ i + 1 }}</h6>\r\n <!-- *ngIf=\"i != 0\" -->\r\n <svg\r\n (click)=\"removeVM(i)\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmTypeList\"\r\n formControlName=\"vmType\"\r\n [search]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmType')?.touched && vm.get('vmType')?.errors\">\r\n <small *ngIf=\"vm.get('vmType')?.hasError('required')\" class=\"text-danger\"> Choose a VM Type </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"vmListMap.get('vm' + i) ?? []\"\r\n formControlName=\"vmId\"\r\n [search]=\"true\"\r\n [prefix]=\"true\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"vm.get('vmId')?.touched && vm.get('vmId')?.errors\">\r\n <small *ngIf=\"vm.get('vmId')?.hasError('required')\" class=\"text-danger\"> Select a VM </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"getSelectedVM(vm) as selectedVM\" class=\"vm-preview\">\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"preview\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM.imgUrl\" alt=\"Vm Image\" />\r\n\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n <div class=\"badge inactive\">{{ selectedVM?.height }}*{{ selectedVM?.height }}</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div style=\"overflow: hidden\">\r\n <h3 class=\"ellipsis cursor-pointer\" [ngbTooltip]=\"selectedVM?.name\">{{ selectedVM?.name }}</h3>\r\n <p>Can be found in the fixture with the size of {{ selectedVM?.height }}*{{ selectedVM?.height }}mm</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"startYPosition\" class=\"form-label mb-1\">Placement start</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"startYPositionList[i]\"\r\n formControlName=\"startYPosition\"\r\n (ngModelChange)=\"onChangeStartY(i, $event)\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('startYPosition')?.touched && vm.get('startYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('startYPosition')?.hasError('required')\"> Please select start </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"endYPosition\" class=\"form-label mb-1\">Placement end</label>\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"endYPositionsList[i]\"\r\n formControlName=\"endYPosition\"\r\n >\r\n </lib-reactive-select>\r\n <ng-container *ngIf=\"vm.get('endYPosition')?.touched && vm.get('endYPosition')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"vm.get('endYPosition')?.hasError('required')\"> Please select end </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 mb-4\">\r\n <div class=\"form-group w-100\">\r\n <label for=\"yZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Vertical zone\r\n <svg\r\n width=\"18px\"\r\n height=\"18px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(90)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"yZonesList\" formControlName=\"yZone\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <label for=\"xZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n Horizontal zone\r\n <svg\r\n width=\"20px\"\r\n height=\"20px\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0)\"\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g\r\n id=\"SVGRepo_tracerCarrier\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke=\"#CCCCCC\"\r\n stroke-width=\"1.9200000000000004\"\r\n ></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path\r\n d=\"M5 12L19 12\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M16 16L20 12L16 8\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n <path\r\n d=\"M8 8L4 12L8 16\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.6799999999999997\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n ></path>\r\n </g>\r\n </svg>\r\n </label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"xZonesList\" formControlName=\"xZone\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"position\" class=\"form-label mb-1\">Position</label>\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"positionsList\" formControlName=\"position\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <button [disabled]=\"!isEditMode\" class=\"btn btn-outline text-end\" (click)=\"addVM()\">Add visual Merchandise</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!--============================Right Column=========================== -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div id=\"vm-products\" class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n id=\"header-block\"\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <ng-container *ngFor=\"let vm of vmArray?.controls; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div\r\n id=\"brand-category\"\r\n class=\"brand-category\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'shelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div\r\n [id]=\"'brand-category' + i\"\r\n class=\"brand-category\"\r\n *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\" ></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"width: 200px\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-vms-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#vm-products{margin:0 auto}#vm-products .body-block{position:relative}#vm-products .body-block .block{border:none}#vm-products #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#vm-products #fixture-level .brand,#vm-products #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#vm-products #fixture-level .category{margin-top:12px}#vm-products #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#vm-products #section-level .brand,#vm-products #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #section-level .separator{margin:0 4px;font-weight:600}#vm-products #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#vm-products #shelf-level .brand,#vm-products #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#vm-products #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#vm-products #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#vm-products #shelf-level .separator{margin:0 4px;font-weight:600}#vm-products .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#vm-products .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#vm-products .sub-footer{position:relative;width:48%}#vm-products .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#vm-products .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px}.wall-viewport{position:relative}img{width:100%;height:100%;display:block}.vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}.vm-preview{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px}.vm-preview h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.vm-preview p{color:var(--Gray-700, #344054);font-size:12px;font-weight:400}.vm-preview .preview{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}.vm-preview .preview img{border-radius:2px}\n"] }]
590
562
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.StoreBuilderService }, { type: i3.ToastService }, { type: i4.GlobalStateService }, { type: i5.TitleCasePipe }, { type: i0.ChangeDetectorRef }], propDecorators: { fixtureData: [{
591
563
  type: Input
592
564
  }], editMode: [{
@@ -598,4 +570,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
598
570
  }], isRollout: [{
599
571
  type: Input
600
572
  }] } });
601
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdm1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS12bXMvdGVtcGxhdGUtdm1zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS12bXMvdGVtcGxhdGUtdm1zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWV6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7O0FBZ0J4RCxNQUFNLE9BQU8sb0JBQW9CO0lBNkRyQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUEvREQsV0FBVyxDQUFNO0lBQ2pCLFFBQVEsQ0FBVTtJQUNsQixXQUFXLENB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O2tCQWRoQyxTQUFTOytCQUNFLGtCQUFrQixhQUdqQixDQUFDLGFBQWEsQ0FBQyxjQUNkLElBQUksV0FDUDt3QkFDUCx1QkFBdUI7d0JBQ3ZCLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLFVBQVU7cUJBQ1g7ME9BS1EsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRSxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1BcnJheSxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgbGFzdFZhbHVlRnJvbSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHtcclxuICBWbUxpYnJhcnlMaXN0LFxyXG4gIFZNVHlwZURldGFpbHMsXHJcbn0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvdm0tbGlicmFyeS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzLFxyXG4gIFNlY3Rpb25Db25maWcsXHJcbiAgU2hlbGZDb25maWcsXHJcbiAgVk1Db25maWcsXHJcbn0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvZml4dHVyZS10ZW1wbGF0ZS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgVGl0bGVDYXNlUGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU0hFTEZfQ09MT1JTIH0gZnJvbSBcIi4uLy4uLy4uL2RhdGEvZml4dHVyZS10ZW1wbGF0ZS5kYXRhXCI7XHJcbmltcG9ydCB7IHJnYlRvSGV4IH0gZnJvbSBcIi4uLy4uLy4uL2Z1bmN0aW9ucy9wbGFuby5mdW5jdGlvblwiO1xyXG5pbXBvcnQgeyBOZ2JUb29sdGlwIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItaW5zdGFuY2Utdm1zXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi90ZW1wbGF0ZS12bXMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3RlbXBsYXRlLXZtcy5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHByb3ZpZGVyczogW1RpdGxlQ2FzZVBpcGVdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBOZ2JUb29sdGlwLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbnN0YW5jZVZtc0NvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXNcclxue1xyXG4gIEBJbnB1dCgpIGZpeHR1cmVEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGlzUm9sbG91dDogYm9vbGVhbjtcclxuXHJcbiAgZml4dHVyZVRlbXBsYXRlRGV0YWlsczogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGw7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBmaXh0dXJlVm1Gb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIHZtVHlwZUxpc3Q6IERyb3Bkb3duSUZbXSA9IFtdO1xyXG5cclxuICB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG4gIHZtTGlzdE1hcDogTWFwPHN0cmluZywgRHJvcGRvd25JRltdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc3RhcnRZUG9zaXRpb25MaXN0OiBEcm9wZG93bklGW11bXSA9IFtdO1xyXG4gIGVuZFlQb3NpdGlvbnNMaXN0OiBEcm9wZG93bklGW11bXSA9IFtdO1xyXG5cclxuICB4Wm9uZXNMaXN0ID0gW1xyXG4gICAgeyBsYWJlbDogXCJMZWZ0XCIsIHZhbHVlOiBcImxlZnRcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJSaWdodFwiLCB2YWx1ZTogXCJyaWdodFwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIk1pZGRsZVwiLCB2YWx1ZTogXCJtaWRkbGVcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJTdHJldGNoXCIsIHZhbHVlOiBcInN0cmV0Y2hcIiB9LFxyXG4gIF07XHJcbiAgeVpvbmVzTGlzdCA9IFtcclxuICAgIHsgbGFiZWw6IFwiVG9wXCIsIHZhbHVlOiBcInRvcFwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIkJvdHRvbVwiLCB2YWx1ZTogXCJib3R0b21cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJNaWRkbGVcIiwgdmFsdWU6IFwibWlkZGxlXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiU3RyZXRjaFwiLCB2YWx1ZTogXCJzdHJldGNoXCIgfSxcclxuICBdO1xyXG4gIHBvc2l0aW9uc0xpc3QgPSBbXHJcbiAgICB7IGxhYmVsOiBcIkZyb250XCIsIHZhbHVlOiBcImZyb250XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiQmFja1wiLCB2YWx1ZTogXCJiYWNrXCIgfSxcclxuICBdO1xyXG5cclxuICBpbWdDRE46IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBpc1ZNSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGlzQkNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBzaGVsZkNvbG9ycyA9IFNIRUxGX0NPTE9SUztcclxuICBzZWN0aW9uQnlab25lczoge1xyXG4gICAgem9uZTogc3RyaW5nO1xyXG4gICAgc2VjdGlvbjoge1xyXG4gICAgICBicmFuZHM6IHN0cmluZ1tdO1xyXG4gICAgICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcclxuICAgICAgc2hlbHZlczogc3RyaW5nW107XHJcbiAgICAgIHNoZWxmRGl2czogKEhUTUxFbGVtZW50IHwgbnVsbCB8IHVuZGVmaW5lZClbXTtcclxuICAgIH07XHJcbiAgfVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aXRsZUNhc2VQaXBlOiBUaXRsZUNhc2VQaXBlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURhdGFcIl0pIHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ncy5lbnZpcm9ubWVudC5zdWJzY3JpYmUoKGVudikgPT4gKHRoaXMuaW1nQ0ROID0gZW52LnBsYW5vZ3JhbUNETikpO1xyXG4gICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnN1YnNjcmliZShhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Vm1UeXBlcygpLCB0aGlzLmdldFZtc0xpc3QoKV0pO1xyXG5cclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMgPSBjaGFuZ2VzW1wiZml4dHVyZURhdGFcIl0uY3VycmVudFZhbHVlO1xyXG4gICAgICAgIHRoaXMuaW5pdFZtRm9ybSgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1tcImVkaXRNb2RlXCJdKSB7XHJcbiAgICAgIHRoaXMuaXNFZGl0TW9kZSA9IGNoYW5nZXNbXCJlZGl0TW9kZVwiXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVWbUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1tcImlzU3VibWl0dGVkXCJdKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzW1wiaXNTdWJtaXR0ZWRcIl0uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc1ZNSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pc1ZNSW5pdGlhbGl6ZWQgPSB0aGlzLmhhbmRsZVZtUG9zaXRpb25BbmRTaXplKCk7XHJcbiAgICAgIHRoaXMudm1BcnJheT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy52bUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGUsIGkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzQkNJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzQkNJbml0aWFsaXplZCA9IHRoaXMuYXBwbHlTaGVsZkNvbG9ycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdFZtRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVWbUZvcm0pIHJldHVybjtcclxuICAgIHRoaXMuZml4dHVyZVZtRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB2bUNvbmZpZzogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy52bUNvbmZpZz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/LmZvckVhY2goKGUpID0+IHRoaXMuYWRkVk0oZSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuYWRkVk0oKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5maXh0dXJlVm1Gb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZtQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVWbUZvcm0/LmdldChcInZtQ29uZmlnXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFZtc0xpc3QoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldFZNTmFtZUxpc3QodGhpcy5jbGllbnRJZClcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgIHRoaXMudm1MaXN0ID0gcmVzPy5kYXRhPy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IGl0ZW0uX2lkLFxyXG4gICAgICAgICAgICBuYW1lOiBpdGVtLnZtTmFtZSxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGl0ZW0udm1OYW1lICsgKGl0ZW0/LnZtVHlwZSA/IGAoJHtpdGVtLnZtVHlwZX0pYCA6IFwiXCIpLFxyXG4gICAgICAgICAgICB3aWR0aDogaXRlbS52bVdpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGl0ZW0udm1IZWlnaHQudmFsdWUsXHJcbiAgICAgICAgICAgIHR5cGU6IGl0ZW0udm1UeXBlLFxyXG4gICAgICAgICAgICAuLi4oaXRlbS52bUltYWdlVXJsXHJcbiAgICAgICAgICAgICAgPyB7IGltZ1VybDogYCR7dGhpcy5pbWdDRE59JHtpdGVtLnZtSW1hZ2VVcmx9YCB9XHJcbiAgICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEYXRhPy50YXNrVHlwZT8uaW5jbHVkZXMoXCJmaXh0dXJlXCIpKSB7XHJcbiAgICAgICAgICB0aGlzLmZpeHR1cmVEYXRhLnZtQ29uZmlnLmZvckVhY2goKHZtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGZpbmRWbSA9IHRoaXMudm1MaXN0LmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAoZWxlOiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICBlbGU/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPT0gdm0/LnZtTmFtZT8udG9Mb3dlckNhc2UoKSAmJlxyXG4gICAgICAgICAgICAgICAgZWxlPy52bVR5cGU/LnRvTG93ZXJDYXNlKCkgPT0gdm0/LnZtVHlwZT8udG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZpbmRWbSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMudm1MaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaWQ6IHZtLnZtTmFtZSxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHZtLnZtTmFtZSxcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB2bS52bU5hbWUgKyAodm0/LnZtVHlwZSA/IGAoJHt2bS52bVR5cGV9KWAgOiBcIlwiKSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IHZtLnZtVHlwZSxcclxuICAgICAgICAgICAgICAgIC4uLih2bS52bUltYWdlXHJcbiAgICAgICAgICAgICAgICAgID8geyBpbWdVcmw6IGAke3RoaXMuaW1nQ0ROfSR7dm0udm1JbWFnZX1gIH1cclxuICAgICAgICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgICAgICAgfSBhcyBhbnkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudm1MaXN0W2ZpbmRWbV0uaWQgPSB2bS52bU5hbWU7XHJcbiAgICAgICAgICAgICAgaWYgKHZtPy52bUltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZtTGlzdFtmaW5kVm1dLmltZ1VybCA9IGAke3RoaXMuaW1nQ0ROfSR7dm0udm1JbWFnZX1gO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0Vm1zTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRWbVR5cGVzKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0Vm1UeXBlc0xpc3QodGhpcy5jbGllbnRJZClcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgIHRoaXMudm1UeXBlTGlzdCA9IHJlcy5kYXRhLm1hcCgoYjogVk1UeXBlRGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGIudm1UeXBlID8/IFwiXCIsIHZhbHVlOiBiLnZtVHlwZSA/PyBcIlwiIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZml4dHVyZURhdGE/LnRhc2tUeXBlPy5pbmNsdWRlcyhcImZpeHR1cmVcIikpIHtcclxuICAgICAgICAgIGxldCBmaXh0dXJlVk0gPSB0aGlzLmZpeHR1cmVEYXRhLnZtQ29uZmlnLm1hcCgodm06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4geyBsYWJlbDogdm0udm1UeXBlID8/IFwiXCIsIHZhbHVlOiB2bS52bVR5cGUgPz8gXCJcIiB9O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBsZXQgbWVyZ2VkQXJyYXkgPSBbLi4udGhpcy52bVR5cGVMaXN0LCAuLi5maXh0dXJlVk1dO1xyXG4gICAgICAgICAgdGhpcy52bVR5cGVMaXN0ID0gWy4uLm5ldyBTZXQobWVyZ2VkQXJyYXkubWFwKChlbGU6IGFueSkgPT4gZWxlKSldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFZtVHlwZXMgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkVk0odm06IGFueSkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRWTSA9IHRoaXMudm1MaXN0LmZpbmQoKHYpID0+IHYuaWQgPT09IHZtPy52YWx1ZT8udm1JZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRWTTtcclxuICB9XHJcblxyXG4gIG9uSW1nRXJyb3IoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcclxuICAgIHRhcmdldC5zcmMgPSBcImFzc2V0cy90YW5nby9JbWFnZXMvdm0tcGxhY2Vob2xkZXIucG5nXCI7XHJcbiAgfVxyXG5cclxuICBhZGRWTSh2bT86IFZNQ29uZmlnLCBpOiBudW1iZXIgPSB0aGlzLnZtQXJyYXkuY29udHJvbHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCB2bUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHZtVHlwZTogW3ZtPy52bVR5cGVdLFxyXG4gICAgICB2bUlkOiBbdm0/LnZtSWQgPz8gdm0/LnZtTmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0YXJ0WVBvc2l0aW9uOiBbdm0/LnN0YXJ0WVBvc2l0aW9uLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgZW5kWVBvc2l0aW9uOiBbdm0/LmVuZFlQb3NpdGlvbiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHhab25lOiBbdm0/Lnhab25lID8/IFwiXCJdLFxyXG4gICAgICB5Wm9uZTogW3ZtPy55Wm9uZSA/PyBcIlwiXSxcclxuICAgICAgcG9zaXRpb246IFt2bT8ucG9zaXRpb24gPz8gXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZtQXJyYXkucHVzaCh2bUdyb3VwKTtcclxuXHJcbiAgICBjb25zdCBtYXBJZCA9IGB2bSR7aX1gO1xyXG5cclxuICAgIGlmICh2bT8udm1UeXBlKSB7XHJcbiAgICAgIHRoaXMudm1MaXN0TWFwLnNldChcclxuICAgICAgICBtYXBJZCxcclxuICAgICAgICB0aGlzLnZtTGlzdFxyXG4gICAgICAgICAgLmZpbHRlcigodikgPT4gdi50eXBlID09PSB2bT8udm1UeXBlKVxyXG4gICAgICAgICAgLm1hcCgodikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdi5pZCwgbGFiZWw6IHYuZGlzcGxheU5hbWUgfTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZtTGlzdE1hcC5zZXQoXHJcbiAgICAgICAgbWFwSWQsXHJcbiAgICAgICAgdGhpcy52bUxpc3QubWFwKCh2KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdi5pZCwgbGFiZWw6IHYuZGlzcGxheU5hbWUgfTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0dXBWTUxpc3RlbmVyKHZtR3JvdXAsIG1hcElkKTtcclxuXHJcbiAgICBjb25zdCB5UG9zaXRpb25zOiBEcm9wZG93bklGW10gPVxyXG4gICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKGUsIGkpID0+ICh7XHJcbiAgICAgICAgbGFiZWw6IGAke3RoaXMudGl0bGVDYXNlUGlwZS50cmFuc2Zvcm0oZT8uc2hlbGZUeXBlKX0gJHtcclxuICAgICAgICAgIGU/LnNoZWxmTnVtYmVyXHJcbiAgICAgICAgfWAsXHJcbiAgICAgICAgdmFsdWU6IGU/LnNoZWxmTnVtYmVyID8/IGkgKyAxLFxyXG4gICAgICB9KSkgPz8gW107XHJcblxyXG4gICAgdGhpcy5zdGFydFlQb3NpdGlvbkxpc3QucHVzaCh5UG9zaXRpb25zKTtcclxuICAgIHRoaXMuZW5kWVBvc2l0aW9uc0xpc3QucHVzaCh5UG9zaXRpb25zKTtcclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlU3RhcnRZKHRoaXMudm1BcnJheS5sZW5ndGggLSAxLCB2bT8uc3RhcnRZUG9zaXRpb24gPz8gMSk7XHJcbiAgfVxyXG5cclxuICBzZXR1cFZNTGlzdGVuZXIodm1Hcm91cDogRm9ybUdyb3VwLCBpOiBzdHJpbmcpIHtcclxuICAgIHZtR3JvdXBcclxuICAgICAgLmdldChcInZtVHlwZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodm1UeXBlKSA9PiB7XHJcbiAgICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KGksIFtdKTtcclxuXHJcbiAgICAgICAgaWYgKHZtVHlwZSkge1xyXG4gICAgICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KFxyXG4gICAgICAgICAgICBpLFxyXG4gICAgICAgICAgICB0aGlzLnZtTGlzdFxyXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHYpID0+IHYudHlwZSA9PT0gdm1UeXBlKVxyXG4gICAgICAgICAgICAgIC5tYXAoKHYpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2LmlkLCBsYWJlbDogdi5kaXNwbGF5TmFtZSB9O1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZtTGlzdE1hcC5zZXQoXHJcbiAgICAgICAgICAgIGksXHJcbiAgICAgICAgICAgIHRoaXMudm1MaXN0Lm1hcCgodikgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2LmlkLCBsYWJlbDogdi5kaXNwbGF5TmFtZSB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtR3JvdXAuZ2V0KFwidm1JZFwiKT8ucmVzZXQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVN0YXJ0WShpOiBudW1iZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGVuZFkgPSB0aGlzLmVuZFlQb3NpdGlvbnNMaXN0W2ldO1xyXG5cclxuICAgIGNvbnN0IG5ld0VuZFk6IERyb3Bkb3duSUZbXSA9XHJcbiAgICAgIGVuZFk/Lm1hcCgoaykgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBsYWJlbDogay5sYWJlbCxcclxuICAgICAgICAgIHZhbHVlOiBrLnZhbHVlLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGsudmFsdWUgPCBldmVudCxcclxuICAgICAgICB9O1xyXG4gICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICB0aGlzLmVuZFlQb3NpdGlvbnNMaXN0W2ldID0gbmV3RW5kWTtcclxuXHJcbiAgICBpZiAoZXZlbnQgPiB0aGlzLnZtQXJyYXkuY29udHJvbHNbaV0uZ2V0KFwiZW5kWVBvc2l0aW9uXCIpPy52YWx1ZSkge1xyXG4gICAgICB0aGlzLnZtQXJyYXkuY29udHJvbHNbaV0uZ2V0KFwiZW5kWVBvc2l0aW9uXCIpPy5yZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVk0oaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy52bUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICAgIHRoaXMuc3RhcnRZUG9zaXRpb25MaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB0aGlzLmVuZFlQb3NpdGlvbnNMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpIHtcclxuICAgIGNvbnN0IHZpZXdQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJib2R5LWJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF2aWV3UG9ydCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHZpZXdQb3J0Lm9mZnNldFdpZHRoO1xyXG5cclxuICAgIHRoaXMudm1BcnJheT8uY29udHJvbHMuZm9yRWFjaCgoZSwgaSkgPT4ge1xyXG4gICAgICBsZXQgc3RhcnRTaGVsZiA9IGU/LnZhbHVlPy5zdGFydFlQb3NpdGlvbiB8fCAxO1xyXG4gICAgICBsZXQgZW5kU2hlbGYgPVxyXG4gICAgICAgIGU/LnZhbHVlPy5lbmRZUG9zaXRpb24gfHxcclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggfHxcclxuICAgICAgICAxO1xyXG5cclxuICAgICAgY29uc3Qgdm0gPSB2aWV3UG9ydC5xdWVyeVNlbGVjdG9yKGAjdm0ke2l9YCkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmICghdm0pIHJldHVybjtcclxuXHJcbiAgICAgIGxldCB4ID0gMDtcclxuICAgICAgbGV0IHkgPSAwO1xyXG5cclxuICAgICAgbGV0IHlTdGFydCA9IDA7XHJcbiAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgc3RhcnRTaGVsZjsgaysrKSB7XHJcbiAgICAgICAgY29uc3QgcyA9IGdldFNoZWxmRGl2KGspO1xyXG4gICAgICAgIGlmICghcykgcmV0dXJuO1xyXG5cclxuICAgICAgICB5U3RhcnQgKz0gcy5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwbGFjZW1lbnRIZWlnaHQgPSAwO1xyXG4gICAgICBsZXQgcGxhY2VtZW50V2lkdGggPSBib2R5V2lkdGg7XHJcblxyXG4gICAgICBmb3IgKGxldCBrID0gc3RhcnRTaGVsZjsgayA8PSBlbmRTaGVsZjsgaysrKSB7XHJcbiAgICAgICAgY29uc3QgcyA9IGdldFNoZWxmRGl2KGspO1xyXG4gICAgICAgIGlmICghcykgcmV0dXJuO1xyXG4gICAgICAgIHBsYWNlbWVudEhlaWdodCArPSBzLm9mZnNldEhlaWdodDtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGRlZmF1bHRXID0gcGxhY2VtZW50V2lkdGggLyAzO1xyXG4gICAgICBsZXQgZGVmYXVsdEggPSBwbGFjZW1lbnRIZWlnaHQgLyAzO1xyXG5cclxuICAgICAgbGV0IHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgIGxldCBoZWlnaHQgPSBkZWZhdWx0SDtcclxuXHJcbiAgICAgIHN3aXRjaCAoZT8udmFsdWU/Lnhab25lKSB7XHJcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgIHggPSAwO1xyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIHggPSBib2R5V2lkdGggLSB3aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgICAgICB4ID0gKGJvZHlXaWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RyZXRjaFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBib2R5V2lkdGg7XHJcbiAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/LnZhbHVlPy55Wm9uZSkge1xyXG4gICAgICAgIGNhc2UgXCJ0b3BcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodCA8IGRlZmF1bHRIID8gcGxhY2VtZW50SGVpZ2h0IC0gMjAgOiBkZWZhdWx0SDtcclxuICAgICAgICAgIHkgPSB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWlkZGxlXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQgPCBkZWZhdWx0SCA/IHBsYWNlbWVudEhlaWdodCAtIDIwIDogZGVmYXVsdEg7XHJcbiAgICAgICAgICB5ID0gKHBsYWNlbWVudEhlaWdodCAtIGhlaWdodCkgLyAyICsgeVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gcGxhY2VtZW50SGVpZ2h0IDwgZGVmYXVsdEggPyBwbGFjZW1lbnRIZWlnaHQgLSAyMCA6IGRlZmF1bHRIO1xyXG4gICAgICAgICAgeSA9IHBsYWNlbWVudEhlaWdodCAtIGhlaWdodCArIHlTdGFydDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJzdHJldGNoXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQ7XHJcbiAgICAgICAgICB5ID0geVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZtLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICB2bS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB2bS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRTaGVsZkRpdihrOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGl2ID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3NoZWxmJHtrfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICghZGl2KSBkaXYgPSB2aWV3UG9ydC5xdWVyeVNlbGVjdG9yKGAjdHJheSR7a31gKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICByZXR1cm4gZGl2IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaGVsZkNvbG9ycygpIHtcclxuICAgIGNvbnN0IGJvZGllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYm9keS1ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghYm9kaWVzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9keUNoaWxkcmVuID0gQXJyYXkuZnJvbShib2RpZXM/LmNoaWxkcmVuID8/IFtdKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmRGl2cyA9IGJvZHlDaGlsZHJlblxyXG5cclxuICAgICAgLm1hcCgoZGl2KSA9PiBkaXYgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQ/LmlkLmluY2x1ZGVzKFwic2hlbGZDb250YWluZXJcIikpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYWRqdXN0ID0gMzAwO1xyXG4gICAgc3dpdGNoICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcIkwxXCI6IC8vZml4dHVyZVxyXG4gICAgICAgIHNoZWxmRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZCkgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzWzBdLmJnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcIkwzXCI6IC8vc2VjdGlvblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnN0IHNoZWx2ZXMgPSBzaGVsZkRpdnNcclxuICAgICAgICAgICAgLm1hcCgoZGl2KSA9PlxyXG4gICAgICAgICAgICAgIGRpdi5sYXN0RWxlbWVudENoaWxkPy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZGl2XCJcclxuICAgICAgICAgICAgICAgID8gKGRpdi5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWx2ZXMpO1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbkFycmF5ID0gdGhpcy5ncm91cFNoZWx2ZXNCeVpvbmUoXHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcgPz8gW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBhbGxTZWN0aW9uU2hlbHZlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICBzZWN0aW9uQXJyYXkuZm9yRWFjaCgoc2UsIGkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2hlbGZJZHMgPVxyXG4gICAgICAgICAgICAgIHNlLnNoZWx2ZXM/Lm1hcCgoc2gpID0+IHNoLnJlcGxhY2UoL1xccy9nLCBcIlwiKS50b0xvd2VyQ2FzZSgpKSA/P1xyXG4gICAgICAgICAgICAgIFtdO1xyXG4gICAgICAgICAgICBhbGxTZWN0aW9uU2hlbHZlcy5wdXNoKC4uLnNoZWxmSWRzKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VjRGl2cyA9IHNoZWx2ZXMuZmlsdGVyKChpdGVtKSA9PlxyXG4gICAgICAgICAgICAgIHNoZWxmSWRzPy5pbmNsdWRlcyhpdGVtPy5pZCA/PyBcIlwiKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgc2VjRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGQpIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjb25zdCB1bmFzc2lnbmVkU2hlbHZlcyA9IHNoZWxmRGl2cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiAhYWxsU2VjdGlvblNoZWx2ZXMuaW5jbHVkZXMoaXRlbS5pZClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB1bmFzc2lnbmVkU2hlbHZlcy5mb3JFYWNoKChkKSA9PiAoZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCIpKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25CeVpvbmVzLmZvckVhY2goKHN6LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25IZWlnaHQgPSBzei5zZWN0aW9uLnNoZWxmRGl2cy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksXHJcbiAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2VjdGlvbldpZHRoID1cclxuICAgICAgICAgICAgICAgIHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5vZmZzZXRXaWR0aCA/PyAzNDU7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGJjID0gYm9kaWVzLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxyXG4gICAgICAgICAgICAgICAgYCNicmFuZC1jYXRlZ29yeSR7aX1gXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWNCZyA9IHJnYlRvSGV4KFxyXG4gICAgICAgICAgICAgICAgICBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8uc3R5bGUuYmFja2dyb3VuZENvbG9yXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZWxmQ29sb3JzLmZpbmQoKGMpID0+IGMuYmcgPT09IHNlY0JnKSA/P1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZWxmQ29sb3JzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLmJvcmRlckNvbG9yID0gY29sb3IuYm9yZGVyO1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZmZmXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmNYID0gKGN1cnJlbnRTZWN0aW9uV2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmNZID1cclxuICAgICAgICAgICAgICAgICAgKGN1cnJlbnRTZWN0aW9uSGVpZ2h0IC0gYmMub2Zmc2V0SGVpZ2h0KSAvIDIgK1xyXG4gICAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7YmNYICsgYWRqdXN0fXB4LCAke2JjWX1weClgO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlY3Rpb25Hcm91cEhlaWdodCArPSBjdXJyZW50U2VjdGlvbkhlaWdodDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJMMlwiOiAvL3NoZWxmXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGRpdiwgaSkgPT4ge1xyXG4gICAgICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlciA9IGAxLjRweCBzb2xpZCAke3RoaXMuc2hlbGZDb2xvcnNbaV0uYm9yZGVyfWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjID0gZGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAjYnJhbmQtY2F0ZWdvcnkke2l9YCk7XHJcbiAgICAgICAgICAgIGlmICghYmMpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJjWCA9IChkaXYub2Zmc2V0V2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICBjb25zdCBiY1kgPSAoZGl2Lm9mZnNldEhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyO1xyXG5cclxuICAgICAgICAgICAgYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLmJvcmRlcjtcclxuICAgICAgICAgICAgYmMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS50ZXh0Qmc7XHJcbiAgICAgICAgICAgIGJjLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtiY1ggKyBhZGp1c3R9cHgsICR7YmNZfXB4KWA7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJMNFwiOiAvL3Nwb3RcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICAgIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZztcclxuICAgICAgICAgICAgICBkLnN0eWxlLmJvcmRlciA9IGAxLjRweCBzb2xpZCAke3RoaXMuc2hlbGZDb2xvcnNbMF0uYm9yZGVyfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGQpIHtcclxuICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzWzBdLmJnO1xyXG4gICAgICAgICAgICBkLnN0eWxlLmJvcmRlciA9IGAxLjRweCBzb2xpZCAke3RoaXMuc2hlbGZDb2xvcnNbMF0uYm9yZGVyfWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RTZXF1ZW50aWFsU2VjdGlvbihzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwpW10pIHtcclxuICAgIGNvbnN0IG5ld1NlY3Rpb25CeVpvbmVzID0gW107XHJcblxyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnID8/IFtdKSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzLnpvbmUgfHwgXCJcIjtcclxuICAgICAgY29uc3Qgc2hlbGZJZCA9IGAke3Muc2hlbGZUeXBlfSR7cy5zaGVsZk51bWJlcn1gO1xyXG4gICAgICBjb25zdCBzaGVsZkRpdiA9IHNoZWxmRGl2cy5maW5kKChkKSA9PiBkPy5pZCA9PT0gc2hlbGZJZCk7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gXCJcIikgY29udGludWU7XHJcbiAgICAgIGlmICh6b25lICE9PSBwWm9uZSkge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgem9uZSxcclxuICAgICAgICAgIHNlY3Rpb246IHtcclxuICAgICAgICAgICAgYnJhbmRzOiBzLnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHMucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICBzaGVsdmVzOiBbc2hlbGZJZF0sXHJcbiAgICAgICAgICAgIHNoZWxmRGl2czogW3NoZWxmRGl2XSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcFpvbmUgPSB6b25lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzW25ld1NlY3Rpb25CeVpvbmVzLmxlbmd0aCAtIDFdLnNlY3Rpb24uc2hlbHZlcy5wdXNoKFxyXG4gICAgICAgICAgc2hlbGZJZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXNbbmV3U2VjdGlvbkJ5Wm9uZXMubGVuZ3RoIC0gMV0uc2VjdGlvbi5zaGVsZkRpdnMucHVzaChcclxuICAgICAgICAgIHNoZWxmRGl2XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMgPSBbLi4ubmV3U2VjdGlvbkJ5Wm9uZXNdO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBncm91cFNoZWx2ZXNCeVpvbmUoaW5wdXQ6IFNoZWxmQ29uZmlnW10pOiBTZWN0aW9uQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgem9uZU1hcDogeyBbem9uZTogc3RyaW5nXTogU2VjdGlvbkNvbmZpZyB9ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBpdGVtPy56b25lID8/IFwiXCI7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoIXpvbmVNYXBbem9uZV0pIHtcclxuICAgICAgICB6b25lTWFwW3pvbmVdID0ge1xyXG4gICAgICAgICAgc2hlbHZlczogW10sXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOlxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDJcIlxyXG4gICAgICAgICAgICAgID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lXHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwyXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5XHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHN1Ym1pdEZvcm0oKSB7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscykgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLmZpeHR1cmVWbUZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVWbUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJGb3JtIGlzIGludmFsaWRcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlVm1Gb3JtLnZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQ6IEZpeHR1cmVUZW1wbGF0ZURldGFpbHMgPSB7XHJcbiAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLFxyXG4gICAgICAgIHZtQ29uZmlnOiB0aGlzLnZtQXJyYXkuY29udHJvbHMubWFwKChlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZS52YWx1ZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgLi4uKHRoaXMuaXNSb2xsb3V0ICYmIHsgaXNWbUVkaXRlZDogdHJ1ZSB9KSxcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLmZpeHR1cmVEYXRhPy50YXNrVHlwZT8uaW5jbHVkZXMoXCJmaXh0dXJlXCIpICYmXHJcbiAgICAgICAgcGF5bG9hZD8udm1Db25maWc/Lmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICBwYXlsb2FkLnZtQ29uZmlnPy5mb3JFYWNoKCh2bTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZmluZFZtID0gdGhpcy5maXh0dXJlRGF0YS52bUNvbmZpZy5maW5kKFxyXG4gICAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZT8udm1OYW1lID09IHZtPy52bUlkIHx8IGVsZT8udm1OYW1lID09IHZtPy52bU5hbWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoZmluZFZtICYmIHBheWxvYWQ/LnZtQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcGF5bG9hZC52bUNvbmZpZ1tpbmRleF0udm1OYW1lID0gZmluZFZtPy52bU5hbWU7XHJcbiAgICAgICAgICAgIHBheWxvYWQudm1Db25maWdbaW5kZXhdLnZtSW1hZ2UgPSBmaW5kVm0/LnZtSW1hZ2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcmVxID0ge1xyXG4gICAgICAgIGZpeHR1cmVJZDogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLl9pZCxcclxuICAgICAgICBkYXRhOiBwYXlsb2FkLFxyXG4gICAgICAgIC4uLighdGhpcy5maXh0dXJlRGF0YT8udGFza1R5cGUgJiYgIXRoaXMuaXNSb2xsb3V0XHJcbiAgICAgICAgICA/IHsgZWRpdE1vZGU6IHRoaXMuaXNFZGl0TW9kZSB9XHJcbiAgICAgICAgICA6IHt9KSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVTdG9yZUZpeHR1cmUocmVxKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpXHJcbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5pZCkge1xyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0ZW1wbGF0ZSBpcyBjcmVhdGVkIDxhIGhyZWY9J21hbmFnZS9wbGFub2dyYW0vZml4dHVyZS10ZW1wbGF0ZS9iYXNpYy1kZXRhaWxzP3RlbXBsYXRlSWQ9JHtyZXMuZGF0YS5pZH0maXNFZGl0PWZhbHNlJz5WaWV3PC9hPmA7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBsZXQgdm1Db25maWc6IGFueSA9IHRoaXMudm1BcnJheS5jb250cm9scy5tYXAoKGUpID0+IHtcclxuICAgICAgcmV0dXJuIGUudmFsdWU7XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEYXRhPy50YXNrVHlwZT8uaW5jbHVkZXMoXCJmaXh0dXJlXCIpICYmIHZtQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgdm1Db25maWc/LmZvckVhY2goKHZtOiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgZmluZFZtID0gdGhpcy5maXh0dXJlRGF0YS52bUNvbmZpZy5maW5kKFxyXG4gICAgICAgICAgKGVsZTogYW55KSA9PiBlbGU/LnZtTmFtZSA9PSB2bT8udm1JZCB8fCBlbGU/LnZtTmFtZSA9PSB2bT8udm1OYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZmluZFZtICYmIHZtQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHZtQ29uZmlnW2luZGV4XS52bU5hbWUgPSBmaW5kVm0/LnZtTmFtZTtcclxuICAgICAgICAgIHZtQ29uZmlnW2luZGV4XS52bUltYWdlID0gZmluZFZtPy52bUltYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB2bUNvbmZpZyA9IHsgdm1Db25maWc6IHZtQ29uZmlnIH07XHJcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQodm1Db25maWcpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cImZpeHR1cmUtdGVtcGxhdGUtdm1zXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiPlxyXG4gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT1MZWZ0IENvbHVtbj09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2xcIj5cclxuICAgICAgPGgyPkFsbCB2aXN1YWwgbWVyY2hhbmRpc2UgZnJvbSBsaWJyYXJ5PC9oMj5cclxuICAgICAgPHA+Q29uZmlndXJlIHlvdXIgVk1zIHBvc2l0aW9uIGFuZCBwbGFjZW1lbnRzPC9wPlxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpeHR1cmVWbUZvcm1cIj5cclxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJ2bUNvbmZpZ1wiIGNsYXNzPVwiYXJyYXktd3JhcHBlclwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdm0gb2Ygdm1BcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJhcnJheS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+VklTVUFMIE1FUkNIQU5ESVNFIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICA8IS0tICpuZ0lmPVwiaSAhPSAwXCIgLS0+XHJcbiAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVZNKGkpXCJcclxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ2bVR5cGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJ2bVR5cGVMaXN0XCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZtVHlwZVwiXHJcbiAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2bS5nZXQoJ3ZtVHlwZScpPy50b3VjaGVkICYmIHZtLmdldCgndm1UeXBlJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidm0uZ2V0KCd2bVR5cGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+IENob29zZSBhIFZNIFR5cGUgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgIFtkYXRhXT1cInZtTGlzdE1hcC5nZXQoJ3ZtJyArIGkpID8/IFtdXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZtSWRcIlxyXG4gICAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtwcmVmaXhdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZtLmdldCgndm1JZCcpPy50b3VjaGVkICYmIHZtLmdldCgndm1JZCcpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInZtLmdldCgndm1JZCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4gU2VsZWN0IGEgVk0gPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0U2VsZWN0ZWRWTSh2bSkgYXMgc2VsZWN0ZWRWTVwiIGNsYXNzPVwidm0tcHJldmlld1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJzZWxlY3RlZFZNPy5pbWdVcmw7IGVsc2UgcGxhY2Vob2xkZXJcIiBbc3JjXT1cInNlbGVjdGVkVk0uaW1nVXJsXCIgYWx0PVwiVm0gSW1hZ2VcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm0tcGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxoMz57eyBzZWxlY3RlZFZNPy5uYW1lIH19PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZVwiPnt7IHNlbGVjdGVkVk0/LmhlaWdodCB9fSp7eyBzZWxlY3RlZFZNPy5oZWlnaHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZWxsaXBzaXMgY3Vyc29yLXBvaW50ZXJcIiBbbmdiVG9vbHRpcF09XCJzZWxlY3RlZFZNPy5uYW1lXCI+e3sgc2VsZWN0ZWRWTT8ubmFtZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgIDxwPkNhbiBiZSBmb3VuZCBpbiB0aGUgZml4dHVyZSB3aXRoIHRoZSBzaXplIG9mIHt7IHNlbGVjdGVkVk0/LmhlaWdodCB9fSp7eyBzZWxlY3RlZFZNPy5oZWlnaHQgfX1tbTwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgbWItNFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhcnRZUG9zaXRpb25cIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBsYWNlbWVudCBzdGFydDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwic3RhcnRZUG9zaXRpb25MaXN0W2ldXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnRZUG9zaXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZVN0YXJ0WShpLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2bS5nZXQoJ3N0YXJ0WVBvc2l0aW9uJyk/LnRvdWNoZWQgJiYgdm0uZ2V0KCdzdGFydFlQb3NpdGlvbicpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ2bS5nZXQoJ3N0YXJ0WVBvc2l0aW9uJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+IFBsZWFzZSBzZWxlY3Qgc3RhcnQgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZW5kWVBvc2l0aW9uXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5QbGFjZW1lbnQgZW5kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJlbmRZUG9zaXRpb25zTGlzdFtpXVwiXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVuZFlQb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidm0uZ2V0KCdlbmRZUG9zaXRpb24nKT8udG91Y2hlZCAmJiB2bS5nZXQoJ2VuZFlQb3NpdGlvbicpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ2bS5nZXQoJ2VuZFlQb3NpdGlvbicpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPiBQbGVhc2Ugc2VsZWN0IGVuZCA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ5Wm9uZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xIGQtZmxleCB0ZXh0LW5vd3JhcCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgVmVydGljYWwgem9uZVxyXG4gICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxOHB4XCJcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOHB4XCJcclxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDkwKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9fYmdDYXJyaWVyXCIgc3Ryb2tlLXdpZHRoPVwiMFwiPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICA8Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJTVkdSZXBvX3RyYWNlckNhcnJpZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQ0NDQ0NDXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuOTIwMDAwMDAwMDAwMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9faWNvbkNhcnJpZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNSAxMkwxOSAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3OTk5OTk5OTk5OTk5OTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTYgMTZMMjAgMTJMMTYgOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3OTk5OTk5OTk5OTk5OTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOCA4TDQgMTJMOCAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3OTk5OTk5OTk5OTk5OTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJ5Wm9uZXNMaXN0XCIgZm9ybUNvbnRyb2xOYW1lPVwieVpvbmVcIj5cclxuICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInhab25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTEgZC1mbGV4IHRleHQtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIHpvbmVcclxuICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjBweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjBweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgwKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9fYmdDYXJyaWVyXCIgc3Ryb2tlLXdpZHRoPVwiMFwiPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICA8Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJTVkdSZXBvX3RyYWNlckNhcnJpZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjQ0NDQ0NDXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuOTIwMDAwMDAwMDAwMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9faWNvbkNhcnJpZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNSAxMkwxOSAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3OTk5OTk5OTk5OTk5OTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTYgMTZMMjAgMTJMMTYgOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3OTk5OTk5OTk5OTk5OTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOCA4TDQgMTJMOCAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3OTk5OTk5OTk5OTk5OTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJ4Wm9uZXNMaXN0XCIgZm9ybUNvbnRyb2xOYW1lPVwieFpvbmVcIj5cclxuICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvc2l0aW9uXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Qb3NpdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBvc2l0aW9uc0xpc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJwb3NpdGlvblwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtNFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LWVuZFwiIChjbGljayk9XCJhZGRWTSgpXCI+QWRkIHZpc3VhbCBNZXJjaGFuZGlzZTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PVJpZ2h0IENvbHVtbj09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbC04XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgIDwhLS0gVmVydGljYWwgYXJyb3dzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyB1cFwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPCEtLSBIb3Jpem9udGFsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPGRpdiBpZD1cInZtLXByb2R1Y3RzXCIgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgaWQ9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJib2R5LWJsb2NrXCIgY2xhc3M9XCJib2R5LWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW1ZNIEJMT0NLXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2bSBvZiB2bUFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ3ZtJyArIGlcIiBjbGFzcz1cInZtLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRTZWxlY3RlZFZNKHZtKSBhcyBzZWxlY3RlZFZNXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInNlbGVjdGVkVk0/LmltZ1VybDsgZWxzZSBwbGFjZWhvbGRlclwiIFtzcmNdPVwic2VsZWN0ZWRWTT8uaW1nVXJsXCIgYWx0PVwiVm0gSW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm0tcGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPnt7IHNlbGVjdGVkVk0/Lm5hbWUgfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW0ZJWFRVUkUgTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wxJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtTRUNUSU9OIExFVkVMIC0gQlJBTkQgQ0FURUdPUlldLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBpZD1cInNlY3Rpb24tbGV2ZWxcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09ICdMMydcIj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc2VjdGlvbkJ5Wm9uZXM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ2JyYW5kLWNhdGVnb3J5JyArICRpbmRleFwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIiBbbmdiVG9vbHRpcF09XCJicmFuZENhdGVnb3J5VG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnpvbmUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kXCIgKm5nSWY9XCJpdGVtPy5zZWN0aW9uPy5icmFuZHM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoYyBvZiBpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoYyBvZiBpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidzaGVsZkNvbnRhaW5lcicgKyBpXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bU0hFTEYgTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInNoZWxmLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDInXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2JyYW5kLWNhdGVnb3J5JyArIGlcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5wcm9kdWN0QnJhbmROYW1lPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIiBjbGFzcz1cInNlcGFyYXRvclwiPiAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCIgKm5nSWY9XCJpdGVtLnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGl0ZW0ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBpdGVtLnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUhICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIiA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGb290ZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5mb290ZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgcmlnaHQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOiAyMDBweDt3aWR0aDoxMDAlXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwiZml4dHVyZS10ZW1wbGF0ZS12bXMtc2tlbGV0b25cIiAqbmdJZj1cImlzUGFnZUxvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBDb21tb24gZGltZW5zaW9uIGFycm93cyAtLT5cclxuPG5nLXRlbXBsYXRlICNkaW1lbnNpb25BcnJvd3MgbGV0LWxhYmVsPVwibGFiZWxcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJob3Jpem9udGFsLWRpbWVuc2lvblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IGxlZnRcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgIDxzcGFuPnt7IHZhbHVlIH19IHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IHJpZ2h0XCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
573
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdm1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS12bXMvdGVtcGxhdGUtdm1zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS12bXMvdGVtcGxhdGUtdm1zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDakosT0FBTyxFQUFxQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU96RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7O0FBVXhELE1BQU0sT0FBTyxvQkFBb0I7SUEyRHJCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQS9ERCxXQUFXLENBQU07SUFDakIsUUFBUSxDQUFVO0lBQ2xCLFdBQVcs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QzswT0FHckYsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRSxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgbGFzdFZhbHVlRnJvbSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVm1MaWJyYXJ5TGlzdCwgVk1UeXBlRGV0YWlscyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvdm0tbGlicmFyeS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRml4dHVyZVRlbXBsYXRlRGV0YWlscywgU2VjdGlvbkNvbmZpZywgU2hlbGZDb25maWcsIFZNQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLXRlbXBsYXRlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duSUYgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBUaXRsZUNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU0hFTEZfQ09MT1JTIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGEnO1xyXG5pbXBvcnQgeyByZ2JUb0hleCB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9wbGFuby5mdW5jdGlvbic7XHJcbmltcG9ydCB7IE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1pbnN0YW5jZS12bXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12bXMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZW1wbGF0ZS12bXMuY29tcG9uZW50LnNjc3MnLFxyXG4gIHByb3ZpZGVyczogW1RpdGxlQ2FzZVBpcGVdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1JlYWN0aXZlU2VsZWN0Q29tcG9uZW50LCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBOZ2JUb29sdGlwXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEluc3RhbmNlVm1zQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGZpeHR1cmVEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGlzUm9sbG91dDogYm9vbGVhbjtcclxuXHJcbiAgZml4dHVyZVRlbXBsYXRlRGV0YWlsczogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGw7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBmaXh0dXJlVm1Gb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIHZtVHlwZUxpc3Q6IERyb3Bkb3duSUZbXSA9IFtdO1xyXG5cclxuICB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG4gIHZtTGlzdE1hcDogTWFwPHN0cmluZywgRHJvcGRvd25JRltdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc3RhcnRZUG9zaXRpb25MaXN0OiBEcm9wZG93bklGW11bXSA9IFtdO1xyXG4gIGVuZFlQb3NpdGlvbnNMaXN0OiBEcm9wZG93bklGW11bXSA9IFtdO1xyXG5cclxuICB4Wm9uZXNMaXN0ID0gW1xyXG4gICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXHJcbiAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9LFxyXG4gICAgeyBsYWJlbDogJ01pZGRsZScsIHZhbHVlOiAnbWlkZGxlJyB9LFxyXG4gICAgeyBsYWJlbDogJ1N0cmV0Y2gnLCB2YWx1ZTogJ3N0cmV0Y2gnIH0sXHJcbiAgXTtcclxuICB5Wm9uZXNMaXN0ID0gW1xyXG4gICAgeyBsYWJlbDogJ1RvcCcsIHZhbHVlOiAndG9wJyB9LFxyXG4gICAgeyBsYWJlbDogJ0JvdHRvbScsIHZhbHVlOiAnYm90dG9tJyB9LFxyXG4gICAgeyBsYWJlbDogJ01pZGRsZScsIHZhbHVlOiAnbWlkZGxlJyB9LFxyXG4gICAgeyBsYWJlbDogJ1N0cmV0Y2gnLCB2YWx1ZTogJ3N0cmV0Y2gnIH0sXHJcbiAgXTtcclxuICBwb3NpdGlvbnNMaXN0ID0gW1xyXG4gICAgeyBsYWJlbDogJ0Zyb250JywgdmFsdWU6ICdmcm9udCcgfSxcclxuICAgIHsgbGFiZWw6ICdCYWNrJywgdmFsdWU6ICdiYWNrJyB9XHJcbiAgXTtcclxuXHJcbiAgaW1nQ0ROOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgaXNWTUluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc0JDSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgc2hlbGZDb2xvcnMgPSBTSEVMRl9DT0xPUlM7XHJcbiAgc2VjdGlvbkJ5Wm9uZXM6IHtcclxuICAgIHpvbmU6IHN0cmluZztcclxuICAgIHNlY3Rpb246IHtcclxuICAgICAgYnJhbmRzOiBzdHJpbmdbXTtcclxuICAgICAgY2F0ZWdvcmllczogc3RyaW5nW107XHJcbiAgICAgIHNoZWx2ZXM6IHN0cmluZ1tdO1xyXG4gICAgICBzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQpW107XHJcbiAgICB9O1xyXG4gIH1bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdGl0bGVDYXNlUGlwZTogVGl0bGVDYXNlUGlwZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydmaXh0dXJlRGF0YSddKSB7XHJcbiAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQuc3Vic2NyaWJlKChlbnYpID0+IHRoaXMuaW1nQ0ROID0gZW52LnBsYW5vZ3JhbUNETik7XHJcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUuc3Vic2NyaWJlKGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZyk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgdGhpcy5nZXRWbVR5cGVzKCksXHJcbiAgICAgICAgICB0aGlzLmdldFZtc0xpc3QoKSxcclxuICAgICAgICBdKVxyXG5cclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMgPSBjaGFuZ2VzWydmaXh0dXJlRGF0YSddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICB0aGlzLmluaXRWbUZvcm0oKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2VkaXRNb2RlJ10pIHtcclxuICAgICAgdGhpcy5pc0VkaXRNb2RlID0gY2hhbmdlc1snZWRpdE1vZGUnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVWbUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydpc1N1Ym1pdHRlZCddKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWydpc1N1Ym1pdHRlZCddLmN1cnJlbnRWYWx1ZSkge1xyXG5cclxuICAgICAgICB0aGlzLnN1Ym1pdEZvcm0oKVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVk1Jbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVk1Jbml0aWFsaXplZCA9IHRoaXMuaGFuZGxlVm1Qb3NpdGlvbkFuZFNpemUoKTtcclxuICAgICAgdGhpcy52bUFycmF5Py52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSh2YWwgPT4ge1xyXG4gICAgICAgICAgdGhpcy52bUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGUsIGkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzQkNJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzQkNJbml0aWFsaXplZCA9IHRoaXMuYXBwbHlTaGVsZkNvbG9ycygpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGluaXRWbUZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlVm1Gb3JtKSByZXR1cm47XHJcbiAgICB0aGlzLmZpeHR1cmVWbUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdm1Db25maWc6IHRoaXMuZmIuYXJyYXkoW10pXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy52bUNvbmZpZz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/LmZvckVhY2goKGUpID0+IHRoaXMuYWRkVk0oZSkpXHJcbiAgICB9IFxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuYWRkVk0oKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5maXh0dXJlVm1Gb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgdm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZVZtRm9ybT8uZ2V0KCd2bUNvbmZpZycpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFZtc0xpc3QoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldFZNTmFtZUxpc3QodGhpcy5jbGllbnRJZCkpO1xyXG4gICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgIHRoaXMudm1MaXN0ID0gcmVzPy5kYXRhPy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IGl0ZW0uX2lkLFxyXG4gICAgICAgICAgICBuYW1lOiBpdGVtLnZtTmFtZSxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGl0ZW0udm1OYW1lICsgKGl0ZW0/LnZtVHlwZSA/IGAoJHtpdGVtLnZtVHlwZX0pYCA6ICcnKSxcclxuICAgICAgICAgICAgd2lkdGg6IGl0ZW0udm1XaWR0aC52YWx1ZSxcclxuICAgICAgICAgICAgaGVpZ2h0OiBpdGVtLnZtSGVpZ2h0LnZhbHVlLFxyXG4gICAgICAgICAgICB0eXBlOiBpdGVtLnZtVHlwZSxcclxuICAgICAgICAgICAgLi4uKGl0ZW0udm1JbWFnZVVybCA/IHsgaW1nVXJsOiBgJHt0aGlzLmltZ0NETn0ke2l0ZW0udm1JbWFnZVVybH1gIH0gOiB7fSksXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZih0aGlzLmZpeHR1cmVEYXRhLnRhc2tUeXBlLmluY2x1ZGVzKCdmaXh0dXJlJykpIHtcclxuICAgICAgICAgIHRoaXMuZml4dHVyZURhdGEudm1Db25maWcuZm9yRWFjaCgodm06IGFueSkgPT4geyBcclxuICAgICAgICAgICAgbGV0IGZpbmRWbSA9IHRoaXMudm1MaXN0LmZpbmRJbmRleCgoZWxlOmFueSkgPT4gZWxlPy5uYW1lPy50b0xvd2VyQ2FzZSgpID09IHZtPy52bU5hbWU/LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICBpZiAoZmluZFZtID09IC0xKSB7XHJcbiAgICAgICAgICAgICB0aGlzLnZtTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgaWQ6IHZtLnZtTmFtZSxcclxuICAgICAgICAgICAgICAgbmFtZTogdm0udm1OYW1lLFxyXG4gICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogdm0udm1OYW1lICsgKHZtPy52bVR5cGUgPyBgKCR7dm0udm1UeXBlfSlgIDogXCJcIiksXHJcbiAgICAgICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICAgICAgIGhlaWdodDogMTAwLFxyXG4gICAgICAgICAgICAgICB0eXBlOiB2bS52bVR5cGUsXHJcbiAgICAgICAgICAgICAgIC4uLih2bS52bUltYWdlID8geyBpbWdVcmw6IGAke3RoaXMuaW1nQ0ROfSR7dm0udm1JbWFnZX1gIH0gOiB7fSksXHJcbiAgICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy52bUxpc3RbZmluZFZtXS5pZCA9IHZtLnZtTmFtZTtcclxuICAgICAgICAgICAgICBpZih2bT8udm1JbWFnZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52bUxpc3RbZmluZFZtXS5pbWdVcmwgPSBgJHt0aGlzLmltZ0NETn0ke3ZtLnZtSW1hZ2V9YDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRWbXNMaXN0IFtFUlJdOlwiLCBlcnJvcilcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRWbVR5cGVzKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0Vm1UeXBlc0xpc3QodGhpcy5jbGllbnRJZCkpO1xyXG4gICAgICBpZiAocmVzPy5kYXRhKSB7XHJcbiAgICAgICAgdGhpcy52bVR5cGVMaXN0ID0gcmVzLmRhdGEubWFwKChiOiBWTVR5cGVEZXRhaWxzKSA9PiB7IHJldHVybiB7IGxhYmVsOiBiLnZtVHlwZSA/PyAnJywgdmFsdWU6IGIudm1UeXBlID8/ICcnIH0gfSk7XHJcbiAgICAgICAgaWYodGhpcy5maXh0dXJlRGF0YS50YXNrVHlwZS5pbmNsdWRlcygnZml4dHVyZScpKSB7XHJcbiAgICAgICAgICBsZXQgZml4dHVyZVZNID0gdGhpcy5maXh0dXJlRGF0YS52bUNvbmZpZy5tYXAoKHZtOmFueSkgPT4geyByZXR1cm4geyBsYWJlbDogdm0udm1UeXBlID8/ICcnLCB2YWx1ZTogdm0udm1UeXBlID8/ICcnIH0gfSk7XHJcbiAgICAgICAgICBsZXQgbWVyZ2VkQXJyYXkgPSBbLi4udGhpcy52bVR5cGVMaXN0LCAuLi5maXh0dXJlVk1dO1xyXG4gICAgICAgICAgdGhpcy52bVR5cGVMaXN0ID0gWy4uLm5ldyBTZXQobWVyZ2VkQXJyYXkubWFwKChlbGU6YW55KSA9PiBlbGUpKV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0Vm1UeXBlcyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRWTSh2bTogYW55KSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFZNID0gdGhpcy52bUxpc3QuZmluZCgodikgPT4gdi5pZCA9PT0gdm0/LnZhbHVlPy52bUlkKTtcclxuICAgIHJldHVybiBzZWxlY3RlZFZNO1xyXG4gIH1cclxuXHJcbiAgb25JbWdFcnJvcihldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xyXG4gICAgdGFyZ2V0LnNyYyA9ICdhc3NldHMvdGFuZ28vSW1hZ2VzL3ZtLXBsYWNlaG9sZGVyLnBuZyc7XHJcbiAgfVxyXG5cclxuICBhZGRWTSh2bT86IFZNQ29uZmlnLCBpOiBudW1iZXIgPSB0aGlzLnZtQXJyYXkuY29udHJvbHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCB2bUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHZtVHlwZTogW3ZtPy52bVR5cGVdLFxyXG4gICAgICB2bUlkOiBbdm0/LnZtSWQgPz8gdm0/LnZtTmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0YXJ0WVBvc2l0aW9uOiBbdm0/LnN0YXJ0WVBvc2l0aW9uLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgZW5kWVBvc2l0aW9uOiBbdm0/LmVuZFlQb3NpdGlvbiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHhab25lOiBbdm0/Lnhab25lID8/ICcnXSxcclxuICAgICAgeVpvbmU6IFt2bT8ueVpvbmUgPz8gJyddLFxyXG4gICAgICBwb3NpdGlvbjogW3ZtPy5wb3NpdGlvbiA/PyAnJ11cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudm1BcnJheS5wdXNoKHZtR3JvdXApO1xyXG5cclxuICAgIGNvbnN0IG1hcElkID0gYHZtJHtpfWA7XHJcblxyXG4gICAgaWYgKHZtPy52bVR5cGUpIHtcclxuICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KG1hcElkLCB0aGlzLnZtTGlzdC5maWx0ZXIodiA9PiB2LnR5cGUgPT09IHZtPy52bVR5cGUpLm1hcCh2ID0+IHsgcmV0dXJuIHsgdmFsdWU6IHYuaWQsIGxhYmVsOiB2LmRpc3BsYXlOYW1lIH0gfSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KG1hcElkLCB0aGlzLnZtTGlzdC5tYXAodiA9PiB7IHJldHVybiB7IHZhbHVlOiB2LmlkLCBsYWJlbDogdi5kaXNwbGF5TmFtZSB9IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldHVwVk1MaXN0ZW5lcih2bUdyb3VwLCBtYXBJZClcclxuXHJcbiAgICBjb25zdCB5UG9zaXRpb25zOiBEcm9wZG93bklGW10gPSAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChlLCBpKSA9PiAoe1xyXG4gICAgICBsYWJlbDogYCR7dGhpcy50aXRsZUNhc2VQaXBlLnRyYW5zZm9ybShlPy5zaGVsZlR5cGUpfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgIHZhbHVlOiBlPy5zaGVsZk51bWJlciA/PyAoaSArIDEpLFxyXG4gICAgfSkpID8/IFtdKTtcclxuXHJcbiAgICB0aGlzLnN0YXJ0WVBvc2l0aW9uTGlzdC5wdXNoKHlQb3NpdGlvbnMpO1xyXG4gICAgdGhpcy5lbmRZUG9zaXRpb25zTGlzdC5wdXNoKHlQb3NpdGlvbnMpO1xyXG5cclxuICAgIHRoaXMub25DaGFuZ2VTdGFydFkodGhpcy52bUFycmF5Lmxlbmd0aCAtIDEsIHZtPy5zdGFydFlQb3NpdGlvbiA/PyAxKTtcclxuICB9XHJcblxyXG4gIHNldHVwVk1MaXN0ZW5lcih2bUdyb3VwOiBGb3JtR3JvdXAsIGk6IHN0cmluZykge1xyXG4gICAgdm1Hcm91cC5nZXQoJ3ZtVHlwZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHZtVHlwZSA9PiB7XHJcbiAgICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KGksIFtdKTtcclxuXHJcbiAgICAgICAgaWYgKHZtVHlwZSkge1xyXG4gICAgICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KGksIHRoaXMudm1MaXN0LmZpbHRlcih2ID0+IHYudHlwZSA9PT0gdm1UeXBlKS5tYXAodiA9PiB7IHJldHVybiB7IHZhbHVlOiB2LmlkLCBsYWJlbDogdi5kaXNwbGF5TmFtZSB9IH0pKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52bUxpc3RNYXAuc2V0KGksIHRoaXMudm1MaXN0Lm1hcCh2ID0+IHsgcmV0dXJuIHsgdmFsdWU6IHYuaWQsIGxhYmVsOiB2LmRpc3BsYXlOYW1lIH0gfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm1Hcm91cC5nZXQoJ3ZtSWQnKT8ucmVzZXQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVN0YXJ0WShpOiBudW1iZXIsIGV2ZW50OiBhbnkpIHtcclxuXHJcbiAgICBjb25zdCBlbmRZID0gdGhpcy5lbmRZUG9zaXRpb25zTGlzdFtpXTtcclxuXHJcbiAgICBjb25zdCBuZXdFbmRZOiBEcm9wZG93bklGW10gPSBlbmRZPy5tYXAoKGspID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsYWJlbDogay5sYWJlbCxcclxuICAgICAgICB2YWx1ZTogay52YWx1ZSxcclxuICAgICAgICBkaXNhYmxlZDogay52YWx1ZSA8IGV2ZW50XHJcbiAgICAgIH1cclxuICAgIH0pID8/IFtdO1xyXG5cclxuICAgIHRoaXMuZW5kWVBvc2l0aW9uc0xpc3RbaV0gPSBuZXdFbmRZO1xyXG5cclxuICAgIGlmIChldmVudCA+IHRoaXMudm1BcnJheS5jb250cm9sc1tpXS5nZXQoJ2VuZFlQb3NpdGlvbicpPy52YWx1ZSkge1xyXG4gICAgICB0aGlzLnZtQXJyYXkuY29udHJvbHNbaV0uZ2V0KCdlbmRZUG9zaXRpb24nKT8ucmVzZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVZNKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMudm1BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICB0aGlzLnN0YXJ0WVBvc2l0aW9uTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgdGhpcy5lbmRZUG9zaXRpb25zTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcblxyXG4gIGhhbmRsZVZtUG9zaXRpb25BbmRTaXplKCkge1xyXG4gICAgY29uc3Qgdmlld1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJvZHktYmxvY2tcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXZpZXdQb3J0KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9keVdpZHRoID0gdmlld1BvcnQub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgdGhpcy52bUFycmF5Py5jb250cm9scy5mb3JFYWNoKChlLCBpKSA9PiB7XHJcbiAgICAgIGxldCBzdGFydFNoZWxmID0gZT8udmFsdWU/LnN0YXJ0WVBvc2l0aW9uIHx8IDE7XHJcbiAgICAgIGxldCBlbmRTaGVsZiA9IGU/LnZhbHVlPy5lbmRZUG9zaXRpb24gfHwgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoIHx8IDE7XHJcblxyXG4gICAgICBjb25zdCB2bSA9IHZpZXdQb3J0LnF1ZXJ5U2VsZWN0b3IoYCN2bSR7aX1gKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgaWYgKCF2bSkgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IHggPSAwO1xyXG4gICAgICBsZXQgeSA9IDA7XHJcblxyXG4gICAgICBsZXQgeVN0YXJ0ID0gMDtcclxuICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzdGFydFNoZWxmOyBrKyspIHtcclxuICAgICAgICBjb25zdCBzID0gZ2V0U2hlbGZEaXYoayk7XHJcbiAgICAgICAgaWYgKCFzKSByZXR1cm47XHJcblxyXG4gICAgICAgIHlTdGFydCArPSBzLm9mZnNldEhlaWdodDtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHBsYWNlbWVudEhlaWdodCA9IDA7XHJcbiAgICAgIGxldCBwbGFjZW1lbnRXaWR0aCA9IGJvZHlXaWR0aDtcclxuXHJcbiAgICAgIGZvciAobGV0IGsgPSBzdGFydFNoZWxmOyBrIDw9IGVuZFNoZWxmOyBrKyspIHtcclxuICAgICAgICBjb25zdCBzID0gZ2V0U2hlbGZEaXYoayk7XHJcbiAgICAgICAgaWYgKCFzKSByZXR1cm47XHJcbiAgICAgICAgcGxhY2VtZW50SGVpZ2h0ICs9IHMub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVmYXVsdFcgPSBwbGFjZW1lbnRXaWR0aCAvIDM7XHJcbiAgICAgIGxldCBkZWZhdWx0SCA9IHBsYWNlbWVudEhlaWdodCAvIDM7XHJcblxyXG4gICAgICBsZXQgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgbGV0IGhlaWdodCA9IGRlZmF1bHRIO1xyXG5cclxuICAgICAgc3dpdGNoIChlPy52YWx1ZT8ueFpvbmUpIHtcclxuICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgIHggPSAwO1xyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgIHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgICAgICB4ID0gYm9keVdpZHRoIC0gd2lkdGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdtaWRkbGUnOlxyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIHggPSAoYm9keVdpZHRoIC0gd2lkdGgpIC8gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3N0cmV0Y2gnOlxyXG4gICAgICAgICAgd2lkdGggPSBib2R5V2lkdGg7XHJcbiAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/LnZhbHVlPy55Wm9uZSkge1xyXG4gICAgICAgIGNhc2UgXCJ0b3BcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodCA8IGRlZmF1bHRIID8gcGxhY2VtZW50SGVpZ2h0IC0gMjAgOiBkZWZhdWx0SDtcclxuICAgICAgICAgIHkgPSB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWlkZGxlXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQgPCBkZWZhdWx0SCA/IHBsYWNlbWVudEhlaWdodCAtIDIwIDogZGVmYXVsdEg7XHJcbiAgICAgICAgICB5ID0gKHBsYWNlbWVudEhlaWdodCAtIGhlaWdodCkgLyAyICsgeVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gcGxhY2VtZW50SGVpZ2h0IDwgZGVmYXVsdEggPyBwbGFjZW1lbnRIZWlnaHQgLSAyMCA6IGRlZmF1bHRIO1xyXG4gICAgICAgICAgeSA9IHBsYWNlbWVudEhlaWdodCAtIGhlaWdodCArIHlTdGFydDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJzdHJldGNoXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQ7XHJcbiAgICAgICAgICB5ID0geVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZtLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICB2bS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB2bS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRTaGVsZkRpdihrOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGl2ID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3NoZWxmJHtrfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICghZGl2KSBkaXYgPSB2aWV3UG9ydC5xdWVyeVNlbGVjdG9yKGAjdHJheSR7a31gKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICByZXR1cm4gZGl2IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaGVsZkNvbG9ycygpIHtcclxuICAgIGNvbnN0IGJvZGllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYm9keS1ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghYm9kaWVzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9keUNoaWxkcmVuID0gQXJyYXkuZnJvbShib2RpZXM/LmNoaWxkcmVuID8/IFtdKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmRGl2cyA9IGJvZHlDaGlsZHJlblxyXG5cclxuICAgICAgLm1hcCgoZGl2KSA9PiBkaXYgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQ/LmlkLmluY2x1ZGVzKFwic2hlbGZDb250YWluZXJcIikpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYWRqdXN0ID0gMzAwO1xyXG4gICAgc3dpdGNoICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcIkwxXCI6IC8vZml4dHVyZVxyXG4gICAgICAgIHNoZWxmRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZCkgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzWzBdLmJnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcIkwzXCI6IC8vc2VjdGlvblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnN0IHNoZWx2ZXMgPSBzaGVsZkRpdnNcclxuICAgICAgICAgICAgLm1hcCgoZGl2KSA9PlxyXG4gICAgICAgICAgICAgIGRpdi5sYXN0RWxlbWVudENoaWxkPy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZGl2XCJcclxuICAgICAgICAgICAgICAgID8gKGRpdi5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWx2ZXMpO1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbkFycmF5ID0gdGhpcy5ncm91cFNoZWx2ZXNCeVpvbmUoXHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcgPz8gW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBhbGxTZWN0aW9uU2hlbHZlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICBzZWN0aW9uQXJyYXkuZm9yRWFjaCgoc2UsIGkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2hlbGZJZHMgPVxyXG4gICAgICAgICAgICAgIHNlLnNoZWx2ZXM/Lm1hcCgoc2gpID0+IHNoLnJlcGxhY2UoL1xccy9nLCBcIlwiKS50b0xvd2VyQ2FzZSgpKSA/P1xyXG4gICAgICAgICAgICAgIFtdO1xyXG4gICAgICAgICAgICBhbGxTZWN0aW9uU2hlbHZlcy5wdXNoKC4uLnNoZWxmSWRzKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VjRGl2cyA9IHNoZWx2ZXMuZmlsdGVyKChpdGVtKSA9PlxyXG4gICAgICAgICAgICAgIHNoZWxmSWRzPy5pbmNsdWRlcyhpdGVtPy5pZCA/PyBcIlwiKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgc2VjRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGQpIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjb25zdCB1bmFzc2lnbmVkU2hlbHZlcyA9IHNoZWxmRGl2cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiAhYWxsU2VjdGlvblNoZWx2ZXMuaW5jbHVkZXMoaXRlbS5pZClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB1bmFzc2lnbmVkU2hlbHZlcy5mb3JFYWNoKChkKSA9PiAoZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCIpKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25CeVpvbmVzLmZvckVhY2goKHN6LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25IZWlnaHQgPSBzei5zZWN0aW9uLnNoZWxmRGl2cy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksXHJcbiAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2VjdGlvbldpZHRoID1cclxuICAgICAgICAgICAgICAgIHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5vZmZzZXRXaWR0aCA/PyAzNDU7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGJjID0gYm9kaWVzLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxyXG4gICAgICAgICAgICAgICAgYCNicmFuZC1jYXRlZ29yeSR7aX1gXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWNCZyA9IHJnYlRvSGV4KFxyXG4gICAgICAgICAgICAgICAgICBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8uc3R5bGUuYmFja2dyb3VuZENvbG9yXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZWxmQ29sb3JzLmZpbmQoKGMpID0+IGMuYmcgPT09IHNlY0JnKSA/P1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZWxmQ29sb3JzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLmJvcmRlckNvbG9yID0gY29sb3IuYm9yZGVyO1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZmZmXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmNYID0gKGN1cnJlbnRTZWN0aW9uV2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmNZID1cclxuICAgICAgICAgICAgICAgICAgKGN1cnJlbnRTZWN0aW9uSGVpZ2h0IC0gYmMub2Zmc2V0SGVpZ2h0KSAvIDIgK1xyXG4gICAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7YmNYICsgYWRqdXN0fXB4LCAke2JjWX1weClgO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlY3Rpb25Hcm91cEhlaWdodCArPSBjdXJyZW50U2VjdGlvbkhlaWdodDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJMMlwiOiAvL3NoZWxmXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGRpdiwgaSkgPT4ge1xyXG4gICAgICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlciA9IGAxLjRweCBzb2xpZCAke3RoaXMuc2hlbGZDb2xvcnNbaV0uYm9yZGVyfWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjID0gZGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAjYnJhbmQtY2F0ZWdvcnkke2l9YCk7XHJcbiAgICAgICAgICAgIGlmICghYmMpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJjWCA9IChkaXYub2Zmc2V0V2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICBjb25zdCBiY1kgPSAoZGl2Lm9mZnNldEhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyO1xyXG5cclxuICAgICAgICAgICAgYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLmJvcmRlcjtcclxuICAgICAgICAgICAgYmMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS50ZXh0Qmc7XHJcbiAgICAgICAgICAgIGJjLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtiY1ggKyBhZGp1c3R9cHgsICR7YmNZfXB4KWA7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJMNFwiOiAvL3Nwb3RcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICAgIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZ1xyXG4gICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyID0gYDEuNHB4IHNvbGlkICR7dGhpcy5zaGVsZkNvbG9yc1swXS5ib3JkZXJ9YDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGQpIHtcclxuICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzWzBdLmJnXHJcbiAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyID0gYDEuNHB4IHNvbGlkICR7dGhpcy5zaGVsZkNvbG9yc1swXS5ib3JkZXJ9YDtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RTZXF1ZW50aWFsU2VjdGlvbihzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwpW10pIHtcclxuICAgIGNvbnN0IG5ld1NlY3Rpb25CeVpvbmVzID0gW107XHJcblxyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnID8/IFtdKSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzLnpvbmUgfHwgXCJcIjtcclxuICAgICAgY29uc3Qgc2hlbGZJZCA9IGAke3Muc2hlbGZUeXBlfSR7cy5zaGVsZk51bWJlcn1gO1xyXG4gICAgICBjb25zdCBzaGVsZkRpdiA9IHNoZWxmRGl2cy5maW5kKChkKSA9PiBkPy5pZCA9PT0gc2hlbGZJZCk7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gXCJcIikgY29udGludWU7XHJcbiAgICAgIGlmICh6b25lICE9PSBwWm9uZSkge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgem9uZSxcclxuICAgICAgICAgIHNlY3Rpb246IHtcclxuICAgICAgICAgICAgYnJhbmRzOiBzLnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHMucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICBzaGVsdmVzOiBbc2hlbGZJZF0sXHJcbiAgICAgICAgICAgIHNoZWxmRGl2czogW3NoZWxmRGl2XSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcFpvbmUgPSB6b25lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzW25ld1NlY3Rpb25CeVpvbmVzLmxlbmd0aCAtIDFdLnNlY3Rpb24uc2hlbHZlcy5wdXNoKFxyXG4gICAgICAgICAgc2hlbGZJZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXNbbmV3U2VjdGlvbkJ5Wm9uZXMubGVuZ3RoIC0gMV0uc2VjdGlvbi5zaGVsZkRpdnMucHVzaChcclxuICAgICAgICAgIHNoZWxmRGl2XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMgPSBbLi4ubmV3U2VjdGlvbkJ5Wm9uZXNdO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBncm91cFNoZWx2ZXNCeVpvbmUoaW5wdXQ6IFNoZWxmQ29uZmlnW10pOiBTZWN0aW9uQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgem9uZU1hcDogeyBbem9uZTogc3RyaW5nXTogU2VjdGlvbkNvbmZpZyB9ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBpdGVtPy56b25lID8/IFwiXCI7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoIXpvbmVNYXBbem9uZV0pIHtcclxuICAgICAgICB6b25lTWFwW3pvbmVdID0ge1xyXG4gICAgICAgICAgc2hlbHZlczogW10sXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOlxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDJcIlxyXG4gICAgICAgICAgICAgID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lXHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwyXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5XHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBzdWJtaXRGb3JtKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlVm1Gb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5maXh0dXJlVm1Gb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiRm9ybSBpcyBpbnZhbGlkXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZml4dHVyZVZtRm9ybS52YWxpZCkge1xyXG4gICAgICBjb25zdCBwYXlsb2FkOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyxcclxuICAgICAgICB2bUNvbmZpZzogdGhpcy52bUFycmF5LmNvbnRyb2xzLm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGUudmFsdWU7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgIC4uLih0aGlzLmlzUm9sbG91dCAmJiB7IGlzVm1FZGl0ZWQ6IHRydWUgfSksXHJcbiAgICAgIH07XHJcbiAgICAgIGlmKHRoaXMuZml4dHVyZURhdGE/LnRhc2tUeXBlPy5pbmNsdWRlcygnZml4dHVyZScpICYmIHBheWxvYWQ/LnZtQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgICBwYXlsb2FkLnZtQ29uZmlnPy5mb3JFYWNoKCh2bTphbnksaW5kZXg6YW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZmluZFZtID0gdGhpcy5maXh0dXJlRGF0YS52bUNvbmZpZy5maW5kKChlbGU6YW55KSA9PiBlbGU/LnZtTmFtZSA9PSB2bT8udm1JZCB8fCBlbGU/LnZtTmFtZSA9PSB2bT8udm1OYW1lKTtcclxuICAgICAgICAgIGlmIChmaW5kVm0gJiYgcGF5bG9hZD8udm1Db25maWc/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBwYXlsb2FkLnZtQ29uZmlnW2luZGV4XS52bU5hbWUgPSBmaW5kVm0/LnZtTmFtZTtcclxuICAgICAgICAgICAgcGF5bG9hZC52bUNvbmZpZ1tpbmRleF0udm1JbWFnZSA9IGZpbmRWbT8udm1JbWFnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5faWQsXHJcbiAgICAgICAgZGF0YTogcGF5bG9hZCxcclxuICAgICAgICAuLi4oIXRoaXMuZml4dHVyZURhdGE/LnRhc2tUeXBlICYmICF0aGlzLmlzUm9sbG91dCkgPyB7IGVkaXRNb2RlOiB0aGlzLmlzRWRpdE1vZGUgfSA6IHt9LFxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UudXBkYXRlU3RvcmVGaXh0dXJlKHJlcSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOmFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpXHJcbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5pZCkge1xyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0ZW1wbGF0ZSBpcyBjcmVhdGVkIDxhIGhyZWY9J21hbmFnZS9wbGFub2dyYW0vZml4dHVyZS10ZW1wbGF0ZS9iYXNpYy1kZXRhaWxzP3RlbXBsYXRlSWQ9JHtyZXMuZGF0YS5pZH0maXNFZGl0PWZhbHNlJz5WaWV3PC9hPmA7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRydWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBsZXQgdm1Db25maWc6YW55ID0gdGhpcy52bUFycmF5LmNvbnRyb2xzLm1hcCgoZSkgPT4ge1xyXG4gICAgICByZXR1cm4gZS52YWx1ZTtcclxuICAgIH0pO1xyXG4gICAgaWYodGhpcy5maXh0dXJlRGF0YT8udGFza1R5cGU/LmluY2x1ZGVzKCdmaXh0dXJlJykgJiYgdm1Db25maWc/Lmxlbmd0aCkge1xyXG4gICAgICB2bUNvbmZpZz8uZm9yRWFjaCgodm06YW55LGluZGV4OmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBmaW5kVm0gPSB0aGlzLmZpeHR1cmVEYXRhLnZtQ29uZmlnLmZpbmQoKGVsZTphbnkpID0+IGVsZT8udm1OYW1lID09IHZtPy52bUlkIHx8IGVsZT8udm1OYW1lID09IHZtPy52bU5hbWUpO1xyXG4gICAgICAgIGlmIChmaW5kVm0gJiYgdm1Db25maWc/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdm1Db25maWdbaW5kZXhdLnZtTmFtZSA9IGZpbmRWbT8udm1OYW1lO1xyXG4gICAgICAgICAgdm1Db25maWdbaW5kZXhdLnZtSW1hZ2UgPSBmaW5kVm0/LnZtSW1hZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdm1Db25maWcgPSB7dm1Db25maWc6dm1Db25maWd9XHJcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQodm1Db25maWcpO1xyXG4gIH1cclxufSIsIjxzZWN0aW9uIGlkPVwiZml4dHVyZS10ZW1wbGF0ZS12bXNcIiAqbmdJZj1cIiFpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCI+XHJcbiAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PUxlZnQgQ29sdW1uPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8aDI+QWxsIHZpc3VhbCBtZXJjaGFuZGlzZSBmcm9tIGxpYnJhcnk8L2gyPlxyXG4gICAgICA8cD5Db25maWd1cmUgeW91ciBWTXMgcG9zaXRpb24gYW5kIHBsYWNlbWVudHM8L3A+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZml4dHVyZVZtRm9ybVwiPlxyXG4gICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInZtQ29uZmlnXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2bSBvZiB2bUFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImFycmF5LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5WSVNVQUwgTUVSQ0hBTkRJU0Uge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJpICE9IDBcIiAtLT5cclxuICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVk0oaSlcIlxyXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInZtVHlwZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+VHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgIFtkYXRhXT1cInZtVHlwZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidm1UeXBlXCJcclxuICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZtLmdldCgndm1UeXBlJyk/LnRvdWNoZWQgJiYgdm0uZ2V0KCd2bVR5cGUnKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ2bS5nZXQoJ3ZtVHlwZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4gQ2hvb3NlIGEgVk0gVHlwZSA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwidm1MaXN0TWFwLmdldCgndm0nICsgaSkgPz8gW11cIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidm1JZFwiXHJcbiAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3ByZWZpeF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidm0uZ2V0KCd2bUlkJyk/LnRvdWNoZWQgJiYgdm0uZ2V0KCd2bUlkJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidm0uZ2V0KCd2bUlkJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPiBTZWxlY3QgYSBWTSA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRTZWxlY3RlZFZNKHZtKSBhcyBzZWxlY3RlZFZNXCIgY2xhc3M9XCJ2bS1wcmV2aWV3XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXdcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInNlbGVjdGVkVk0/LmltZ1VybDsgZWxzZSBwbGFjZWhvbGRlclwiIFtzcmNdPVwic2VsZWN0ZWRWTS5pbWdVcmxcIiBhbHQ9XCJWbSBJbWFnZVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2bS1wbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGgzPnt7IHNlbGVjdGVkVk0/Lm5hbWUgfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGluYWN0aXZlXCI+e3sgc2VsZWN0ZWRWTT8uaGVpZ2h0IH19Knt7IHNlbGVjdGVkVk0/LmhlaWdodCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJlbGxpcHNpcyBjdXJzb3ItcG9pbnRlclwiIFtuZ2JUb29sdGlwXT1cInNlbGVjdGVkVk0/Lm5hbWVcIj57eyBzZWxlY3RlZFZNPy5uYW1lIH19PC9oMz5cclxuICAgICAgICAgICAgICAgICAgPHA+Q2FuIGJlIGZvdW5kIGluIHRoZSBmaXh0dXJlIHdpdGggdGhlIHNpemUgb2Yge3sgc2VsZWN0ZWRWTT8uaGVpZ2h0IH19Knt7IHNlbGVjdGVkVk0/LmhlaWdodCB9fW1tPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGFydFlQb3NpdGlvblwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UGxhY2VtZW50IHN0YXJ0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJzdGFydFlQb3NpdGlvbkxpc3RbaV1cIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGFydFlQb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlU3RhcnRZKGksICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZtLmdldCgnc3RhcnRZUG9zaXRpb24nKT8udG91Y2hlZCAmJiB2bS5nZXQoJ3N0YXJ0WVBvc2l0aW9uJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInZtLmdldCgnc3RhcnRZUG9zaXRpb24nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gUGxlYXNlIHNlbGVjdCBzdGFydCA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbmRZUG9zaXRpb25cIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBsYWNlbWVudCBlbmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImVuZFlQb3NpdGlvbnNMaXN0W2ldXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW5kWVBvc2l0aW9uXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2bS5nZXQoJ2VuZFlQb3NpdGlvbicpPy50b3VjaGVkICYmIHZtLmdldCgnZW5kWVBvc2l0aW9uJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInZtLmdldCgnZW5kWVBvc2l0aW9uJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+IFBsZWFzZSBzZWxlY3QgZW5kIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IG1iLTRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInlab25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTEgZC1mbGV4IHRleHQtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICBWZXJ0aWNhbCB6b25lXHJcbiAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoOTApXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19iZ0NhcnJpZXJcIiBzdHJva2Utd2lkdGg9XCIwXCI+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cIlNWR1JlcG9fdHJhY2VyQ2FycmllclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNDQ0NDQ0NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS45MjAwMDAwMDAwMDAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19pY29uQ2FycmllclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01IDEyTDE5IDEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjc5OTk5OTk5OTk5OTk5N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNiAxNkwyMCAxMkwxNiA4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjc5OTk5OTk5OTk5OTk5N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04IDhMNCAxMkw4IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjc5OTk5OTk5OTk5OTk5N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInlab25lc0xpc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJ5Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwieFpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMSBkLWZsZXggdGV4dC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIEhvcml6b250YWwgem9uZVxyXG4gICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMHB4XCJcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyMHB4XCJcclxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDApXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19iZ0NhcnJpZXJcIiBzdHJva2Utd2lkdGg9XCIwXCI+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cIlNWR1JlcG9fdHJhY2VyQ2FycmllclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNDQ0NDQ0NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS45MjAwMDAwMDAwMDAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb19pY29uQ2FycmllclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01IDEyTDE5IDEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjc5OTk5OTk5OTk5OTk5N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNiAxNkwyMCAxMkwxNiA4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjc5OTk5OTk5OTk5OTk5N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04IDhMNCAxMkw4IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjc5OTk5OTk5OTk5OTk5N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInhab25lc0xpc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJ4Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicG9zaXRpb25cIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBvc2l0aW9uPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwicG9zaXRpb25zTGlzdFwiIGZvcm1Db250cm9sTmFtZT1cInBvc2l0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtdC00XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtZW5kXCIgKGNsaWNrKT1cImFkZFZNKClcIj5BZGQgdmlzdWFsIE1lcmNoYW5kaXNlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09UmlnaHQgQ29sdW1uPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgPCEtLSBWZXJ0aWNhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8IS0tIEhvcml6b250YWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGlkPVwidm0tcHJvZHVjdHNcIiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgPCEtLSBIZWFkZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBpZD1cImhlYWRlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBibG9jayAtLT5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImJvZHktYmxvY2tcIiBjbGFzcz1cImJvZHktYmxvY2tcIj5cclxuICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bVk0gQkxPQ0tdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZtIG9mIHZtQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCIndm0nICsgaVwiIGNsYXNzPVwidm0tYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFNlbGVjdGVkVk0odm0pIGFzIHNlbGVjdGVkVk1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwic2VsZWN0ZWRWTT8uaW1nVXJsOyBlbHNlIHBsYWNlaG9sZGVyXCIgW3NyY109XCJzZWxlY3RlZFZNPy5pbWdVcmxcIiBhbHQ9XCJWbSBJbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2bS1wbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+e3sgc2VsZWN0ZWRWTT8ubmFtZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bRklYVFVSRSBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDEnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGlkPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJyYW5kLWNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJicmFuZENhdGVnb3J5VG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBkcmFmdCBtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0Q2F0ZWdvcnk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW1NFQ1RJT04gTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICA8ZGl2IGlkPVwic2VjdGlvbi1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wzJ1wiPlxyXG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWN0aW9uQnlab25lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgJGluZGV4XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmJyYW5kcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCIgY2xhc3M9XCJzZXBhcmF0b3JcIj4gLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ3NoZWxmQ29udGFpbmVyJyArIGlcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtTSEVMRiBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic2hlbGYtbGV2ZWxcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09ICdMMidcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnByb2R1Y3RCcmFuZE5hbWU/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwiaXRlbS5wcm9kdWN0QnJhbmROYW1lPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2YgaXRlbS5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5wcm9kdWN0Q2F0ZWdvcnk/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2YgaXRlbS5wcm9kdWN0Q2F0ZWdvcnk7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgaXRlbS5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgICBAaWYoaXRlbS5zaGVsZlR5cGUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiID48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5mb290ZXI/LmxhYmVsIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMjAwcHhcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXRlbXBsYXRlLXZtcy1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48IS0tIENvbW1vbiBkaW1lbnNpb24gYXJyb3dzIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpbWVuc2lvbkFycm93cyBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC12YWx1ZT1cInZhbHVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGltZW5zaW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgbGVmdFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgPHNwYW4+e3sgdmFsdWUgfX0ge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19