tango-app-ui-store-builder 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/create-layout/create-layout.component.mjs +1 -1
- package/esm2022/lib/components/create-store/create-store.component.mjs +1 -1
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +6 -3
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +1 -1
- package/esm2022/lib/components/layout-summary/layout-summary.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +38 -7
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.mjs +11 -1
- package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.mjs +628 -0
- package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +24 -12
- package/esm2022/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.mjs +34 -8
- package/esm2022/lib/components/onboard-store-plano/create-planogram/create-planogram.component.mjs +19 -7
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +2 -2
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +10 -2
- package/esm2022/lib/tango-store-builder.module.mjs +8 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +761 -40
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/custom-select/custom-select.component.d.ts +2 -1
- package/lib/components/manage-plano/onboard-table/onboard-table.component.d.ts +1 -1
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +1 -0
- package/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.d.ts +1 -1
- package/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.d.ts +89 -0
- package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +4 -1
- package/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.d.ts +9 -2
- package/lib/components/onboard-store-plano/create-planogram/create-planogram.component.d.ts +1 -0
- package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +1 -1
- package/lib/services/store-builder.service.d.ts +5 -3
- package/lib/tango-store-builder.module.d.ts +68 -66
- package/package.json +1 -1
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, } from "@angular/core";
|
|
2
|
+
import { SHELF_COLORS } from "../../../../data/fixture-template.data";
|
|
3
|
+
import { Subject, takeUntil } from "rxjs";
|
|
4
|
+
import { rgbToHex } from "../../../../functions/plano.function";
|
|
5
|
+
import { firstValueFrom } from "rxjs";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../../../../services/store-builder.service";
|
|
8
|
+
import * as i2 from "tango-app-ui-global";
|
|
9
|
+
import * as i3 from "@angular/common";
|
|
10
|
+
import * as i4 from "@angular/forms";
|
|
11
|
+
import * as i5 from "@ng-bootstrap/ng-bootstrap";
|
|
12
|
+
import * as i6 from "../../../multiselect-chip-dropdown/multiselect-chip-dropdown.component";
|
|
13
|
+
import * as i7 from "../../../custom-select/custom-select.component";
|
|
14
|
+
export class ZoneEditableFixtureComponent {
|
|
15
|
+
apiService;
|
|
16
|
+
gs;
|
|
17
|
+
cd;
|
|
18
|
+
fixture;
|
|
19
|
+
// @Input() vmList: VmLibraryList[] = [];
|
|
20
|
+
showColors = true;
|
|
21
|
+
showVMs = true;
|
|
22
|
+
showBCs = true;
|
|
23
|
+
showHeaderFooterAlways = false;
|
|
24
|
+
editable = true;
|
|
25
|
+
headerOptions = [];
|
|
26
|
+
brandOptions = [];
|
|
27
|
+
allPidsOptions = [];
|
|
28
|
+
selectedHeader = [];
|
|
29
|
+
brandsByZone = {};
|
|
30
|
+
othersModeByZone = {};
|
|
31
|
+
allPidsLoaded = false;
|
|
32
|
+
originalHeaderLabel = "";
|
|
33
|
+
originalBrandsByZone = {};
|
|
34
|
+
fixtureRoot;
|
|
35
|
+
clientId;
|
|
36
|
+
imgCDN;
|
|
37
|
+
shelfColors = SHELF_COLORS;
|
|
38
|
+
sectionByZones = [];
|
|
39
|
+
// vmList: VmLibraryList[] = [];
|
|
40
|
+
isPageLoading = true;
|
|
41
|
+
isVMInitialized = false;
|
|
42
|
+
isBCInitialized = false;
|
|
43
|
+
destroy$ = new Subject();
|
|
44
|
+
get isValid() {
|
|
45
|
+
const headerLabel = this.fixture?.header?.label?.trim();
|
|
46
|
+
if (!headerLabel)
|
|
47
|
+
return false;
|
|
48
|
+
const zones = this.uniqueZones();
|
|
49
|
+
for (const zone of zones) {
|
|
50
|
+
if (!this.brandsByZone[zone]?.length)
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
get validationMessage() {
|
|
56
|
+
const headerLabel = this.fixture?.header?.label?.trim();
|
|
57
|
+
if (!headerLabel)
|
|
58
|
+
return "Pick a header before accepting.";
|
|
59
|
+
const emptyZones = [];
|
|
60
|
+
for (const zone of this.uniqueZones()) {
|
|
61
|
+
if (!this.brandsByZone[zone]?.length)
|
|
62
|
+
emptyZones.push(zone);
|
|
63
|
+
}
|
|
64
|
+
if (emptyZones.length) {
|
|
65
|
+
return `Pick at least one brand for: ${emptyZones.join(", ")}`;
|
|
66
|
+
}
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
uniqueZones() {
|
|
70
|
+
const zones = new Set();
|
|
71
|
+
(this.fixture?.shelfConfig ?? []).forEach((shelf) => {
|
|
72
|
+
if (shelf?.zone)
|
|
73
|
+
zones.add(shelf.zone);
|
|
74
|
+
});
|
|
75
|
+
return Array.from(zones);
|
|
76
|
+
}
|
|
77
|
+
get isDirty() {
|
|
78
|
+
if ((this.fixture?.header?.label ?? "") !== this.originalHeaderLabel) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const zoneKeys = new Set([
|
|
82
|
+
...Object.keys(this.brandsByZone),
|
|
83
|
+
...Object.keys(this.originalBrandsByZone),
|
|
84
|
+
]);
|
|
85
|
+
for (const zone of zoneKeys) {
|
|
86
|
+
const current = [...(this.brandsByZone[zone] ?? [])].sort();
|
|
87
|
+
const original = [...(this.originalBrandsByZone[zone] ?? [])].sort();
|
|
88
|
+
if (current.length !== original.length)
|
|
89
|
+
return true;
|
|
90
|
+
for (let i = 0; i < current.length; i++) {
|
|
91
|
+
if (current[i] !== original[i])
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
constructor(apiService, gs, cd) {
|
|
98
|
+
this.apiService = apiService;
|
|
99
|
+
this.gs = gs;
|
|
100
|
+
this.cd = cd;
|
|
101
|
+
}
|
|
102
|
+
ngOnInit() {
|
|
103
|
+
this.gs.environment
|
|
104
|
+
.pipe(takeUntil(this.destroy$))
|
|
105
|
+
.subscribe((env) => (this.imgCDN = env.planogramCDN));
|
|
106
|
+
this.isPageLoading = true;
|
|
107
|
+
this.gs.dataRangeValue
|
|
108
|
+
.pipe(takeUntil(this.destroy$))
|
|
109
|
+
.subscribe(async (data) => {
|
|
110
|
+
if (data?.client) {
|
|
111
|
+
this.clientId = data?.client;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
let headerData = JSON.parse(localStorage.getItem("header-filters"));
|
|
115
|
+
this.clientId = headerData?.client;
|
|
116
|
+
}
|
|
117
|
+
this.isPageLoading = false;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async ngOnChanges(changes) {
|
|
121
|
+
if (changes["fixture"]?.currentValue) {
|
|
122
|
+
this.sanitizeVmConfig();
|
|
123
|
+
await this.initInlineEditState();
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
this.applyShelfColors();
|
|
126
|
+
this.handleVmPositionAndSize();
|
|
127
|
+
}, 400);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async initInlineEditState() {
|
|
131
|
+
const currentLabel = this.fixture?.header?.label ?? "";
|
|
132
|
+
this.originalHeaderLabel = currentLabel;
|
|
133
|
+
this.selectedHeader = currentLabel ? [{ label: currentLabel }] : [];
|
|
134
|
+
this.originalBrandsByZone = this.snapshotBrandsByZone();
|
|
135
|
+
this.brandsByZone = structuredClone(this.originalBrandsByZone);
|
|
136
|
+
this.othersModeByZone = {};
|
|
137
|
+
await this.loadHeaders();
|
|
138
|
+
await this.loadBrandsForHeader(currentLabel);
|
|
139
|
+
await this.detectOthersSourcedZones();
|
|
140
|
+
}
|
|
141
|
+
async detectOthersSourcedZones() {
|
|
142
|
+
if (!this.brandOptions.length)
|
|
143
|
+
return;
|
|
144
|
+
const knownBrands = new Set(this.brandOptions.map((b) => b.brandName));
|
|
145
|
+
const zonesWithForeignBrands = [];
|
|
146
|
+
for (const [zone, brands] of Object.entries(this.brandsByZone)) {
|
|
147
|
+
if (brands.some((b) => !knownBrands.has(b))) {
|
|
148
|
+
zonesWithForeignBrands.push(zone);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (!zonesWithForeignBrands.length)
|
|
152
|
+
return;
|
|
153
|
+
await this.ensureAllPidsLoaded();
|
|
154
|
+
zonesWithForeignBrands.forEach((zone) => (this.othersModeByZone[zone] = true));
|
|
155
|
+
}
|
|
156
|
+
async ensureAllPidsLoaded() {
|
|
157
|
+
if (this.allPidsLoaded)
|
|
158
|
+
return;
|
|
159
|
+
try {
|
|
160
|
+
const result = await firstValueFrom(this.apiService.getPIDList("others"));
|
|
161
|
+
const list = result?.data ?? [];
|
|
162
|
+
this.allPidsOptions = list.map((brandName) => ({ brandName }));
|
|
163
|
+
this.allPidsLoaded = true;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.log(`@@ ~ ensureAllPidsLoaded [ERR]:`, error);
|
|
167
|
+
this.allPidsOptions = [];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
brandOptionsForZone(zone) {
|
|
171
|
+
return this.othersModeByZone[zone] ? this.allPidsOptions : this.brandOptions;
|
|
172
|
+
}
|
|
173
|
+
isToggleAvailable() {
|
|
174
|
+
return !!this.selectedHeader?.[0]?.label;
|
|
175
|
+
}
|
|
176
|
+
async onToggleOthers(zone) {
|
|
177
|
+
const nextActive = !this.othersModeByZone[zone];
|
|
178
|
+
this.othersModeByZone = { ...this.othersModeByZone, [zone]: nextActive };
|
|
179
|
+
if (nextActive) {
|
|
180
|
+
await this.ensureAllPidsLoaded();
|
|
181
|
+
}
|
|
182
|
+
this.brandsByZone = { ...this.brandsByZone, [zone]: [] };
|
|
183
|
+
this.applyBrandsToFixture();
|
|
184
|
+
}
|
|
185
|
+
snapshotBrandsByZone() {
|
|
186
|
+
const result = {};
|
|
187
|
+
(this.fixture?.shelfConfig ?? []).forEach((shelf) => {
|
|
188
|
+
const zone = shelf?.zone;
|
|
189
|
+
if (!zone || result[zone])
|
|
190
|
+
return;
|
|
191
|
+
result[zone] = Array.isArray(shelf?.productBrandName)
|
|
192
|
+
? [...shelf.productBrandName]
|
|
193
|
+
: [];
|
|
194
|
+
});
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
async loadHeaders() {
|
|
198
|
+
try {
|
|
199
|
+
const result = await firstValueFrom(this.apiService.getHeadersList());
|
|
200
|
+
const list = result?.data ?? [];
|
|
201
|
+
this.headerOptions = list.map((label) => ({ label }));
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
console.log(`@@ ~ loadHeaders [ERR]:`, error);
|
|
205
|
+
this.headerOptions = [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async loadBrandsForHeader(header) {
|
|
209
|
+
if (!header) {
|
|
210
|
+
this.brandOptions = [];
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const result = await firstValueFrom(this.apiService.getPIDList(header));
|
|
215
|
+
const list = result?.data ?? [];
|
|
216
|
+
this.brandOptions = list.map((brandName) => ({ brandName }));
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.log(`@@ ~ loadBrandsForHeader [ERR]:`, error);
|
|
220
|
+
this.brandOptions = [];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async onHeaderChange(selected) {
|
|
224
|
+
const newLabel = selected?.label ?? "";
|
|
225
|
+
if (!this.fixture)
|
|
226
|
+
return;
|
|
227
|
+
this.fixture.header = { ...(this.fixture.header ?? {}), label: newLabel };
|
|
228
|
+
this.selectedHeader = newLabel ? [{ label: newLabel }] : [];
|
|
229
|
+
const cleared = {};
|
|
230
|
+
Object.keys(this.brandsByZone).forEach((zone) => (cleared[zone] = []));
|
|
231
|
+
this.brandsByZone = cleared;
|
|
232
|
+
this.othersModeByZone = {};
|
|
233
|
+
this.applyBrandsToFixture();
|
|
234
|
+
await this.loadBrandsForHeader(newLabel);
|
|
235
|
+
}
|
|
236
|
+
onZoneBrandsChange(zone, brands) {
|
|
237
|
+
this.brandsByZone = { ...this.brandsByZone, [zone]: brands ?? [] };
|
|
238
|
+
this.applyBrandsToFixture();
|
|
239
|
+
}
|
|
240
|
+
applyBrandsToFixture() {
|
|
241
|
+
(this.fixture?.shelfConfig ?? []).forEach((shelf) => {
|
|
242
|
+
const zone = shelf?.zone;
|
|
243
|
+
if (!zone)
|
|
244
|
+
return;
|
|
245
|
+
shelf.productBrandName = [...(this.brandsByZone[zone] ?? [])];
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
sanitizeVmConfig() {
|
|
249
|
+
const shelfCount = this.fixture?.shelfConfig?.length ?? 1;
|
|
250
|
+
this.fixture?.vmConfig?.forEach((vm) => {
|
|
251
|
+
if (!vm?.startYPosition && !vm?.endYPosition) {
|
|
252
|
+
if (vm?.xZone === "stretch" && vm?.yZone === "stretch") {
|
|
253
|
+
vm.startYPosition = shelfCount;
|
|
254
|
+
vm.endYPosition = shelfCount;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
vm.startYPosition = 1;
|
|
258
|
+
vm.endYPosition = shelfCount;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
ngAfterViewChecked() {
|
|
264
|
+
if (!this.isBCInitialized) {
|
|
265
|
+
this.isBCInitialized = this.applyShelfColors();
|
|
266
|
+
}
|
|
267
|
+
if (!this.isVMInitialized) {
|
|
268
|
+
this.isVMInitialized = this.handleVmPositionAndSize();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// getSelectedVM(vm: any) {
|
|
272
|
+
// if (vm?.vmId) {
|
|
273
|
+
// return this.vmList.find((v) => v.id === vm.vmId);
|
|
274
|
+
// } else {
|
|
275
|
+
// return this.vmList.find(
|
|
276
|
+
// (v) => v.name === vm.vmName && v.type === vm.vmType
|
|
277
|
+
// );
|
|
278
|
+
// }
|
|
279
|
+
// }
|
|
280
|
+
get bodyEl() {
|
|
281
|
+
return (this.fixtureRoot?.nativeElement?.querySelector("#body-block-sum") ?? null);
|
|
282
|
+
}
|
|
283
|
+
handleVmPositionAndSize() {
|
|
284
|
+
if (!this.showVMs)
|
|
285
|
+
return true;
|
|
286
|
+
const viewPort = this.bodyEl;
|
|
287
|
+
if (!viewPort)
|
|
288
|
+
return false;
|
|
289
|
+
const bodyWidth = viewPort.offsetWidth;
|
|
290
|
+
this.fixture?.vmConfig?.forEach((e, i) => {
|
|
291
|
+
let startShelf = e?.startYPosition;
|
|
292
|
+
let endShelf = e?.endYPosition;
|
|
293
|
+
const vm = viewPort.querySelector(`#vm${i}`);
|
|
294
|
+
if (!vm)
|
|
295
|
+
return;
|
|
296
|
+
let x = 0;
|
|
297
|
+
let y = 0;
|
|
298
|
+
let yStart = 0;
|
|
299
|
+
for (let k = 1; k < startShelf; k++) {
|
|
300
|
+
const s = getShelfDiv(k);
|
|
301
|
+
if (!s)
|
|
302
|
+
return;
|
|
303
|
+
yStart += s.offsetHeight;
|
|
304
|
+
}
|
|
305
|
+
let placementHeight = 0;
|
|
306
|
+
let placementWidth = bodyWidth;
|
|
307
|
+
for (let k = startShelf; k <= endShelf; k++) {
|
|
308
|
+
const s = getShelfDiv(k);
|
|
309
|
+
if (!s)
|
|
310
|
+
return;
|
|
311
|
+
placementHeight += s.offsetHeight;
|
|
312
|
+
}
|
|
313
|
+
let defaultW = placementWidth / 3;
|
|
314
|
+
let defaultH = placementHeight / 3;
|
|
315
|
+
let width = defaultW;
|
|
316
|
+
let height = defaultH;
|
|
317
|
+
switch (e?.xZone) {
|
|
318
|
+
case "left":
|
|
319
|
+
x = 0;
|
|
320
|
+
width = defaultW;
|
|
321
|
+
break;
|
|
322
|
+
case "right":
|
|
323
|
+
width = defaultW;
|
|
324
|
+
x = bodyWidth - width;
|
|
325
|
+
break;
|
|
326
|
+
case "middle":
|
|
327
|
+
width = defaultW;
|
|
328
|
+
x = (bodyWidth - width) / 2;
|
|
329
|
+
break;
|
|
330
|
+
case "stretch":
|
|
331
|
+
width = bodyWidth;
|
|
332
|
+
x = 0;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
switch (e?.yZone) {
|
|
336
|
+
case "top":
|
|
337
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
338
|
+
y = yStart;
|
|
339
|
+
break;
|
|
340
|
+
case "middle":
|
|
341
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
342
|
+
y = (placementHeight - height) / 2 + yStart;
|
|
343
|
+
break;
|
|
344
|
+
case "bottom":
|
|
345
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
346
|
+
y = placementHeight - height + yStart;
|
|
347
|
+
break;
|
|
348
|
+
case "stretch":
|
|
349
|
+
height = placementHeight;
|
|
350
|
+
y = yStart;
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
vm.style.width = `${width}px`;
|
|
354
|
+
vm.style.height = ` ${height}px`;
|
|
355
|
+
vm.style.transform = `translate(${x}px, ${y}px)`;
|
|
356
|
+
function getShelfDiv(k) {
|
|
357
|
+
return (viewPort?.querySelector(`#shelf${k}`) ||
|
|
358
|
+
viewPort?.querySelector(`#tray${k}`) ||
|
|
359
|
+
viewPort?.querySelector(`#vmonly${k}`));
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
applyShelfColors() {
|
|
365
|
+
const bodies = this.bodyEl;
|
|
366
|
+
if (!bodies)
|
|
367
|
+
return false;
|
|
368
|
+
const bodyChildren = Array.from(bodies?.children ?? []);
|
|
369
|
+
const shelfDivs = bodyChildren
|
|
370
|
+
.map((div) => div)
|
|
371
|
+
.filter((d) => d?.id.includes("sumShelfContainer"));
|
|
372
|
+
if (!shelfDivs)
|
|
373
|
+
return false;
|
|
374
|
+
const adjust = 0;
|
|
375
|
+
switch (this.fixture?.productResolutionLevel) {
|
|
376
|
+
case "L1": //fixture
|
|
377
|
+
{
|
|
378
|
+
let y = 0;
|
|
379
|
+
shelfDivs.forEach((d) => {
|
|
380
|
+
if (!d)
|
|
381
|
+
return;
|
|
382
|
+
if (this.showColors) {
|
|
383
|
+
d.style.backgroundColor = this.shelfColors[0].bg;
|
|
384
|
+
}
|
|
385
|
+
const cap = d.querySelector(".capacity");
|
|
386
|
+
const sY = y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;
|
|
387
|
+
cap.style.transform = `translateY(${sY}px)`;
|
|
388
|
+
cap.style.border = `1px solid ${this.shelfColors[0].border}`;
|
|
389
|
+
y += d.offsetHeight;
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
break;
|
|
393
|
+
case "L3": //section
|
|
394
|
+
{
|
|
395
|
+
const shelves = shelfDivs
|
|
396
|
+
.map((div) => div.lastElementChild?.tagName.toLowerCase() === "div"
|
|
397
|
+
? div.lastElementChild
|
|
398
|
+
: null)
|
|
399
|
+
.filter(Boolean);
|
|
400
|
+
this.constructSequentialSection(shelves);
|
|
401
|
+
const sectionArray = this.groupShelvesByZone(this.fixture?.shelfConfig ?? []);
|
|
402
|
+
const allSectionShelves = [];
|
|
403
|
+
sectionArray.forEach((se, i) => {
|
|
404
|
+
const shelfIds = se.shelves?.map((sh) => sh.replace(/\s/g, "").toLowerCase()) ??
|
|
405
|
+
[];
|
|
406
|
+
allSectionShelves.push(...shelfIds);
|
|
407
|
+
const secDivs = shelves.filter((item) => shelfIds?.includes(item?.id ?? ""));
|
|
408
|
+
if (this.showColors) {
|
|
409
|
+
secDivs.forEach((d) => {
|
|
410
|
+
if (!d)
|
|
411
|
+
return;
|
|
412
|
+
d.style.backgroundColor = this.shelfColors[i].bg;
|
|
413
|
+
const cap = d.querySelector(".capacity");
|
|
414
|
+
if (cap) {
|
|
415
|
+
cap.style.border = `1px solid ${this.shelfColors[i].border}`;
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
let y = 0;
|
|
421
|
+
shelfDivs.forEach((d) => {
|
|
422
|
+
const cap = d.querySelector(".capacity");
|
|
423
|
+
if (cap) {
|
|
424
|
+
const sY = y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;
|
|
425
|
+
cap.style.transform = `translateY(${sY}px)`;
|
|
426
|
+
}
|
|
427
|
+
y += d.offsetHeight;
|
|
428
|
+
});
|
|
429
|
+
if (!this.showBCs)
|
|
430
|
+
return true;
|
|
431
|
+
const unassignedShelves = shelfDivs.filter((item) => !allSectionShelves.includes(item.id));
|
|
432
|
+
unassignedShelves.forEach((d) => (d.style.backgroundColor = "white"));
|
|
433
|
+
let sectionGroupHeight = 0;
|
|
434
|
+
setTimeout(() => {
|
|
435
|
+
this.sectionByZones.forEach((sz, i) => {
|
|
436
|
+
const currentSectionHeight = sz.section.shelfDivs.reduce((h, d) => h + (d?.offsetHeight ?? 0), 0);
|
|
437
|
+
const currentSectionWidth = sz.section.shelfDivs[0]?.offsetWidth ?? 345;
|
|
438
|
+
const bc = bodies.querySelector(`#brand-category${i}`);
|
|
439
|
+
if (bc) {
|
|
440
|
+
const secBg = rgbToHex(sz.section.shelfDivs[0]?.style.backgroundColor);
|
|
441
|
+
const color = this.shelfColors.find((c) => c.bg === secBg) ??
|
|
442
|
+
this.shelfColors[i];
|
|
443
|
+
if (this.showColors) {
|
|
444
|
+
bc.style.borderColor = color.border;
|
|
445
|
+
bc.style.backgroundColor = "#fff";
|
|
446
|
+
}
|
|
447
|
+
const bcX = (currentSectionWidth - bc.offsetWidth) / 2;
|
|
448
|
+
const bcY = (currentSectionHeight - bc.offsetHeight) / 2 +
|
|
449
|
+
sectionGroupHeight;
|
|
450
|
+
bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
|
|
451
|
+
sectionGroupHeight += currentSectionHeight;
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
}, 0);
|
|
455
|
+
}
|
|
456
|
+
break;
|
|
457
|
+
case "L2": //shelf
|
|
458
|
+
{
|
|
459
|
+
let y = 0;
|
|
460
|
+
shelfDivs.forEach((div, i) => {
|
|
461
|
+
const cap = div.querySelector(".capacity");
|
|
462
|
+
if (!cap) {
|
|
463
|
+
y += div.offsetHeight;
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
const sY = y + (div.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;
|
|
467
|
+
cap.style.transform = `translateY(${sY}px)`;
|
|
468
|
+
cap.style.border = `1px solid ${this.shelfColors[i].border}`;
|
|
469
|
+
y += div.offsetHeight;
|
|
470
|
+
if (this.showColors) {
|
|
471
|
+
div.style.backgroundColor = this.shelfColors[i].bg;
|
|
472
|
+
div.style.border = `1.4px solid ${this.shelfColors[i].border}`;
|
|
473
|
+
}
|
|
474
|
+
if (!this.showBCs)
|
|
475
|
+
return;
|
|
476
|
+
const bc = div.querySelector(`#brand-category${i}`);
|
|
477
|
+
if (!bc)
|
|
478
|
+
return;
|
|
479
|
+
const bcX = (div.offsetWidth - bc.offsetWidth) / 2;
|
|
480
|
+
const bcY = (div.offsetHeight - bc.offsetHeight) / 2;
|
|
481
|
+
if (this.showColors) {
|
|
482
|
+
bc.style.borderColor = this.shelfColors[i].border;
|
|
483
|
+
bc.style.backgroundColor = this.shelfColors[i].textBg;
|
|
484
|
+
}
|
|
485
|
+
bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
break;
|
|
489
|
+
case "L4": //spot
|
|
490
|
+
{
|
|
491
|
+
let y = 0;
|
|
492
|
+
shelfDivs.forEach((d) => {
|
|
493
|
+
if (!d)
|
|
494
|
+
return;
|
|
495
|
+
if (this.showColors) {
|
|
496
|
+
d.style.backgroundColor = this.shelfColors[0].bg;
|
|
497
|
+
}
|
|
498
|
+
const cap = d.querySelector(".capacity");
|
|
499
|
+
const sY = y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;
|
|
500
|
+
cap.style.transform = `translateY(${sY}px)`;
|
|
501
|
+
cap.style.border = `1px solid ${this.shelfColors[0].border}`;
|
|
502
|
+
y += d.offsetHeight;
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
break;
|
|
506
|
+
default:
|
|
507
|
+
let y = 0;
|
|
508
|
+
shelfDivs.forEach((d) => {
|
|
509
|
+
if (!d)
|
|
510
|
+
return;
|
|
511
|
+
if (this.showColors) {
|
|
512
|
+
d.style.backgroundColor = this.shelfColors[0].bg;
|
|
513
|
+
}
|
|
514
|
+
const cap = d.querySelector(".capacity");
|
|
515
|
+
const sY = y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;
|
|
516
|
+
cap.style.transform = `translateY(${sY}px)`;
|
|
517
|
+
cap.style.border = `1px solid ${this.shelfColors[0].border}`;
|
|
518
|
+
y += d.offsetHeight;
|
|
519
|
+
});
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
constructSequentialSection(shelfDivs) {
|
|
525
|
+
const newSectionByZones = [];
|
|
526
|
+
let pZone = null;
|
|
527
|
+
for (const s of this.fixture?.shelfConfig ?? []) {
|
|
528
|
+
const zone = s.zone || "";
|
|
529
|
+
const shelfId = `${s.shelfType}${s.shelfNumber}`;
|
|
530
|
+
const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);
|
|
531
|
+
if (zone === "")
|
|
532
|
+
continue;
|
|
533
|
+
if (zone !== pZone) {
|
|
534
|
+
newSectionByZones.push({
|
|
535
|
+
zone,
|
|
536
|
+
section: {
|
|
537
|
+
brands: s.productBrandName ?? [],
|
|
538
|
+
categories: s.productCategory ?? [],
|
|
539
|
+
shelves: [shelfId],
|
|
540
|
+
shelfDivs: [shelfDiv],
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
pZone = zone;
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
const section = newSectionByZones[newSectionByZones.length - 1].section;
|
|
547
|
+
section.shelves.push(shelfId);
|
|
548
|
+
section.shelfDivs.push(shelfDiv);
|
|
549
|
+
if (!section.brands.length)
|
|
550
|
+
section.brands = s?.productBrandName ?? [];
|
|
551
|
+
if (!section.categories.length)
|
|
552
|
+
section.categories = s?.productCategory ?? [];
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
this.sectionByZones = [...newSectionByZones];
|
|
556
|
+
this.cd.detectChanges();
|
|
557
|
+
}
|
|
558
|
+
groupShelvesByZone(input) {
|
|
559
|
+
const zoneMap = {};
|
|
560
|
+
for (const item of input) {
|
|
561
|
+
const zone = item?.zone ?? "";
|
|
562
|
+
const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;
|
|
563
|
+
if (!zoneMap[zone]) {
|
|
564
|
+
zoneMap[zone] = {
|
|
565
|
+
shelves: [],
|
|
566
|
+
productBrandName: this.fixture?.productResolutionLevel === "L2"
|
|
567
|
+
? item.productBrandName
|
|
568
|
+
: [],
|
|
569
|
+
productCategory: this.fixture?.productResolutionLevel === "L2"
|
|
570
|
+
? item.productCategory
|
|
571
|
+
: [],
|
|
572
|
+
zone: zone,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
zoneMap[zone]?.shelves?.push(shelfLabel);
|
|
576
|
+
}
|
|
577
|
+
return Object.values(zoneMap);
|
|
578
|
+
}
|
|
579
|
+
applySectionConfigToShelves(sections) {
|
|
580
|
+
const sectionMap = new Map();
|
|
581
|
+
for (const section of sections) {
|
|
582
|
+
for (const shelfLabel of section.shelves) {
|
|
583
|
+
sectionMap.set(shelfLabel, {
|
|
584
|
+
zone: section.zone,
|
|
585
|
+
productBrandName: section.productBrandName,
|
|
586
|
+
productCategory: section.productCategory,
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
// Apply overrides to matching shelves
|
|
591
|
+
return (this.fixture?.shelfConfig?.map((s) => {
|
|
592
|
+
const shelfLabel = `${s.shelfType} ${s.shelfNumber}`;
|
|
593
|
+
const override = sectionMap.get(shelfLabel);
|
|
594
|
+
return {
|
|
595
|
+
...s,
|
|
596
|
+
zone: override?.zone || "",
|
|
597
|
+
productBrandName: override?.productBrandName ?? [],
|
|
598
|
+
productCategory: override?.productCategory ?? [],
|
|
599
|
+
};
|
|
600
|
+
}) ?? []);
|
|
601
|
+
}
|
|
602
|
+
ngOnDestroy() {
|
|
603
|
+
this.destroy$.next();
|
|
604
|
+
this.destroy$.complete();
|
|
605
|
+
}
|
|
606
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneEditableFixtureComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
607
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ZoneEditableFixtureComponent, selector: "zone-editable-fixture", inputs: { fixture: "fixture", showColors: "showColors", showVMs: "showVMs", showBCs: "showBCs", showHeaderFooterAlways: "showHeaderFooterAlways", editable: "editable" }, viewQueries: [{ propertyName: "fixtureRoot", first: true, predicate: ["fixtureRoot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if(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>\r\n\r\n}@else {\r\n\r\n <section #fixtureRoot id=\"fixture-view\">\r\n <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block zone-header-editor\"\r\n *ngIf=\"(fixture?.header?.isEnabled && fixture?.fixtureType === 'wall') || showHeaderFooterAlways\">\r\n\r\n <div class=\"zone-header-select\" [class.readonly]=\"!editable\">\r\n <lib-select-plano\r\n [items]=\"headerOptions\"\r\n [multi]=\"false\"\r\n [idField]=\"'label'\"\r\n [searchField]=\"'label'\"\r\n [selectedValues]=\"selectedHeader\"\r\n [disabled]=\"!editable\"\r\n [compact]=\"true\"\r\n [label]=\"'Header'\"\r\n (selected)=\"onHeaderChange($event)\">\r\n </lib-select-plano>\r\n </div>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block-sum\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <div *ngIf=\"fixture?.vmConfig?.length && showVMs\">\r\n <ng-container *ngFor=\"let vm of fixture?.vmConfig; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container>\r\n <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN + vm?.vmImageUrl\"\r\n alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ vm?.vmName }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixture?.productResolutionLevel === 'L1' && showBCs\">\r\n <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixture?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixture?.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=\"fixture?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixture?.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 fixture?.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=\"fixture?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixture?.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=\"fixture?.productResolutionLevel === 'L3' && showBCs\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category zone-brand-editor\">\r\n <div class=\"zone-brand-select\" [class.readonly]=\"!editable\">\r\n <multiselect-chip-dropdown\r\n [items]=\"brandOptionsForZone(item.zone)\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n [search]=\"true\"\r\n [compact]=\"true\"\r\n [maxSelection]=\"3\"\r\n [placeholder]=\"'Select brands'\"\r\n [extraActionLabel]=\"isToggleAvailable() ? (othersModeByZone[item.zone] ? 'Hide others' : 'Show others') : ''\"\r\n [extraActionActive]=\"!!othersModeByZone[item.zone]\"\r\n (extraActionClick)=\"onToggleOthers(item.zone)\"\r\n [ngModel]=\"brandsByZone[item.zone]\"\r\n (ngModelChange)=\"onZoneBrandsChange(item.zone, $event)\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixture?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixture?.productResolutionLevel === 'L2' && showBCs\">\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\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 ==='tray'){\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 class=\"capacity\">{{item.productPerShelf * item.trayRows}}</div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div class=\"capacity\">{{item.productPerShelf}}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"(fixture?.footer?.isEnabled && fixture?.fixtureType === 'wall') || (showHeaderFooterAlways && fixture?.footer?.label)\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixture?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </section>\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.inactive{background:#f2f4f7!important;color:#344054!important}.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;max-width:345px;min-width:234px;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 .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{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 .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.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}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#fixture-view .wall-viewport{max-width:340px;width:unset}#fixture-view #vm-products-sum{margin:0 auto}#fixture-view #vm-products-sum .body-block{position:relative}#fixture-view #vm-products-sum .body-block .block{border:1px solid #98a2b3}#fixture-view #vm-products-sum .body-block .block .capacity{position:absolute;right:12px;top:8px;border:1px solid #98a2b3;color:#1d2939;box-shadow:0 .77px 1.55px #1018280d;background:#fff;border-radius:50%;padding:6px 12px;font-weight:600;font-size:12px;line-height:18px;height:36px;width:36px;display:flex;align-items:center;justify-content:center;transition:all .3s ease}#fixture-view #vm-products-sum #fixture-level .brand-category{position:absolute;width:96%;overflow:hidden;padding:4px;border-radius:8px;border:1px solid var(--Primary-200, #99daff);background:#f6fcff;top:50%;left:50%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-view #vm-products-sum #fixture-level .brand,#fixture-view #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-view #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-view #vm-products-sum #section-level .brand-category{position:absolute;width:96%;overflow:hidden;padding:4px;border-radius:8px;border:1px solid;background:#f6fcff;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-view #vm-products-sum #section-level .brand,#fixture-view #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-view #vm-products-sum #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-view #vm-products-sum #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-view #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-view #vm-products-sum #section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#fixture-view #vm-products-sum #section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#fixture-view #vm-products-sum #shelf-level .brand-category{position:absolute;width:96%;overflow:hidden;padding:8px 4px;border-radius:8px;border:1px solid;background:#f6fcff;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-view #vm-products-sum #shelf-level .brand,#fixture-view #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-view #vm-products-sum #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-view #vm-products-sum #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-view #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-view #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#fixture-view #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-view #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-view #vm-products-sum img{width:100%;height:100%;display:block}#fixture-view #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-view #vm-products-sum .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}#fixture-view #vm-products-sum .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}#fixture-view .zone-header-editor .zone-header-select{width:100%}#fixture-view .zone-header-editor .zone-header-select.readonly{pointer-events:none;opacity:.7}#fixture-view .zone-header-editor .zone-header-select ::ng-deep .outer-container{width:100%}#fixture-view .zone-brand-editor.brand-category{overflow:visible!important;align-items:flex-start!important;background:transparent!important;border:none!important;padding:2px 4px!important;z-index:5;gap:4px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select{width:100%}#fixture-view .zone-brand-editor.brand-category .zone-brand-select.readonly{pointer-events:none}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container{padding:4px 8px;min-height:28px;border-radius:6px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .chip-list{min-height:18px;gap:3px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .chip-list .chip{font-size:11px;padding:1px 4px 1px 6px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .multi-placeholder{font-size:12px;line-height:18px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .dropdown-panel{z-index:20}:host ::ng-deep #fixture-view .zone-brand-editor.brand-category:has(.dropdown-panel.open){z-index:50!important}:host ::ng-deep #fixture-view .zone-header-editor:has(.input-container.dropdown:not(.d-none)){position:relative;z-index:60!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i6.MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField", "maxSelection", "compact", "extraActionLabel", "extraActionActive"], outputs: ["extraActionClick"] }, { kind: "component", type: i7.CustomSelectComponent, selector: "lib-select-plano", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "compact"], outputs: ["selected"] }] });
|
|
608
|
+
}
|
|
609
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneEditableFixtureComponent, decorators: [{
|
|
610
|
+
type: Component,
|
|
611
|
+
args: [{ selector: "zone-editable-fixture", template: "@if(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>\r\n\r\n}@else {\r\n\r\n <section #fixtureRoot id=\"fixture-view\">\r\n <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block zone-header-editor\"\r\n *ngIf=\"(fixture?.header?.isEnabled && fixture?.fixtureType === 'wall') || showHeaderFooterAlways\">\r\n\r\n <div class=\"zone-header-select\" [class.readonly]=\"!editable\">\r\n <lib-select-plano\r\n [items]=\"headerOptions\"\r\n [multi]=\"false\"\r\n [idField]=\"'label'\"\r\n [searchField]=\"'label'\"\r\n [selectedValues]=\"selectedHeader\"\r\n [disabled]=\"!editable\"\r\n [compact]=\"true\"\r\n [label]=\"'Header'\"\r\n (selected)=\"onHeaderChange($event)\">\r\n </lib-select-plano>\r\n </div>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block-sum\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <div *ngIf=\"fixture?.vmConfig?.length && showVMs\">\r\n <ng-container *ngFor=\"let vm of fixture?.vmConfig; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container>\r\n <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN + vm?.vmImageUrl\"\r\n alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ vm?.vmName }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixture?.productResolutionLevel === 'L1' && showBCs\">\r\n <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixture?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixture?.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=\"fixture?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixture?.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 fixture?.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=\"fixture?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixture?.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=\"fixture?.productResolutionLevel === 'L3' && showBCs\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category zone-brand-editor\">\r\n <div class=\"zone-brand-select\" [class.readonly]=\"!editable\">\r\n <multiselect-chip-dropdown\r\n [items]=\"brandOptionsForZone(item.zone)\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n [search]=\"true\"\r\n [compact]=\"true\"\r\n [maxSelection]=\"3\"\r\n [placeholder]=\"'Select brands'\"\r\n [extraActionLabel]=\"isToggleAvailable() ? (othersModeByZone[item.zone] ? 'Hide others' : 'Show others') : ''\"\r\n [extraActionActive]=\"!!othersModeByZone[item.zone]\"\r\n (extraActionClick)=\"onToggleOthers(item.zone)\"\r\n [ngModel]=\"brandsByZone[item.zone]\"\r\n (ngModelChange)=\"onZoneBrandsChange(item.zone, $event)\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixture?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixture?.productResolutionLevel === 'L2' && showBCs\">\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\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 ==='tray'){\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 class=\"capacity\">{{item.productPerShelf * item.trayRows}}</div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n\r\n @if(item.shelfType ==='shelf'){\r\n <div class=\"capacity\">{{item.productPerShelf}}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"(fixture?.footer?.isEnabled && fixture?.fixtureType === 'wall') || (showHeaderFooterAlways && fixture?.footer?.label)\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixture?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </section>\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.inactive{background:#f2f4f7!important;color:#344054!important}.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;max-width:345px;min-width:234px;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 .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{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 .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.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}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#fixture-view .wall-viewport{max-width:340px;width:unset}#fixture-view #vm-products-sum{margin:0 auto}#fixture-view #vm-products-sum .body-block{position:relative}#fixture-view #vm-products-sum .body-block .block{border:1px solid #98a2b3}#fixture-view #vm-products-sum .body-block .block .capacity{position:absolute;right:12px;top:8px;border:1px solid #98a2b3;color:#1d2939;box-shadow:0 .77px 1.55px #1018280d;background:#fff;border-radius:50%;padding:6px 12px;font-weight:600;font-size:12px;line-height:18px;height:36px;width:36px;display:flex;align-items:center;justify-content:center;transition:all .3s ease}#fixture-view #vm-products-sum #fixture-level .brand-category{position:absolute;width:96%;overflow:hidden;padding:4px;border-radius:8px;border:1px solid var(--Primary-200, #99daff);background:#f6fcff;top:50%;left:50%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-view #vm-products-sum #fixture-level .brand,#fixture-view #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-view #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-view #vm-products-sum #section-level .brand-category{position:absolute;width:96%;overflow:hidden;padding:4px;border-radius:8px;border:1px solid;background:#f6fcff;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-view #vm-products-sum #section-level .brand,#fixture-view #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-view #vm-products-sum #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-view #vm-products-sum #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-view #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-view #vm-products-sum #section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#fixture-view #vm-products-sum #section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#fixture-view #vm-products-sum #shelf-level .brand-category{position:absolute;width:96%;overflow:hidden;padding:8px 4px;border-radius:8px;border:1px solid;background:#f6fcff;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-view #vm-products-sum #shelf-level .brand,#fixture-view #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-view #vm-products-sum #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-view #vm-products-sum #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-view #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-view #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#fixture-view #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-view #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-view #vm-products-sum img{width:100%;height:100%;display:block}#fixture-view #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-view #vm-products-sum .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}#fixture-view #vm-products-sum .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}#fixture-view .zone-header-editor .zone-header-select{width:100%}#fixture-view .zone-header-editor .zone-header-select.readonly{pointer-events:none;opacity:.7}#fixture-view .zone-header-editor .zone-header-select ::ng-deep .outer-container{width:100%}#fixture-view .zone-brand-editor.brand-category{overflow:visible!important;align-items:flex-start!important;background:transparent!important;border:none!important;padding:2px 4px!important;z-index:5;gap:4px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select{width:100%}#fixture-view .zone-brand-editor.brand-category .zone-brand-select.readonly{pointer-events:none}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container{padding:4px 8px;min-height:28px;border-radius:6px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .chip-list{min-height:18px;gap:3px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .chip-list .chip{font-size:11px;padding:1px 4px 1px 6px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .multi-placeholder{font-size:12px;line-height:18px}#fixture-view .zone-brand-editor.brand-category .zone-brand-select ::ng-deep .multiselect-container .dropdown-panel{z-index:20}:host ::ng-deep #fixture-view .zone-brand-editor.brand-category:has(.dropdown-panel.open){z-index:50!important}:host ::ng-deep #fixture-view .zone-header-editor:has(.input-container.dropdown:not(.d-none)){position:relative;z-index:60!important}\n"] }]
|
|
612
|
+
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { fixture: [{
|
|
613
|
+
type: Input
|
|
614
|
+
}], showColors: [{
|
|
615
|
+
type: Input
|
|
616
|
+
}], showVMs: [{
|
|
617
|
+
type: Input
|
|
618
|
+
}], showBCs: [{
|
|
619
|
+
type: Input
|
|
620
|
+
}], showHeaderFooterAlways: [{
|
|
621
|
+
type: Input
|
|
622
|
+
}], editable: [{
|
|
623
|
+
type: Input
|
|
624
|
+
}], fixtureRoot: [{
|
|
625
|
+
type: ViewChild,
|
|
626
|
+
args: ["fixtureRoot", { static: false }]
|
|
627
|
+
}] } });
|
|
628
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZS1lZGl0YWJsZS1maXh0dXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svem9uZS1lZGl0YWJsZS1maXh0dXJlL3pvbmUtZWRpdGFibGUtZml4dHVyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2Utc3RvcmUtcGxhbm8vdmVyaWZpY2F0aW9uLWZlZWRiYWNrL3pvbmUtZWRpdGFibGUtZml4dHVyZS96b25lLWVkaXRhYmxlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxLQUFLLEVBS0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU0xQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7O0FBT3RDLE1BQU0sT0FBTyw0QkFBNEI7SUF1RzdCO0lBQ0E7SUFDQTtJQXRHRCxPQUFPLENBQU07SUFFdEIseUNBQXlDO0lBRWhDLFVBQVUsR0FBWSxJQUFJLENBQUM7SUFDM0IsT0FBTyxHQUFZLElBQUksQ0FBQztJQUN4QixPQUFPLEdBQVksSUFBSSxDQUFDO0lBQ3hCLHNCQUFzQixHQUFZLEtBQUssQ0FBQztJQUN4QyxRQUFRLEdBQVksSUFBSSxDQUFD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c0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNIRUxGX0NPTE9SUyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXRhL2ZpeHR1cmUtdGVtcGxhdGUuZGF0YVwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQge1xyXG4gIFNlY3Rpb25Db25maWcsXHJcbiAgU2hlbGZDb25maWcsXHJcbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2ludGVyZmFjZXMvZml4dHVyZS10ZW1wbGF0ZS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgcmdiVG9IZXggfSBmcm9tIFwiLi4vLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcInpvbmUtZWRpdGFibGUtZml4dHVyZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vem9uZS1lZGl0YWJsZS1maXh0dXJlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi96b25lLWVkaXRhYmxlLWZpeHR1cmUuY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFpvbmVFZGl0YWJsZUZpeHR1cmVDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3lcclxue1xyXG4gIEBJbnB1dCgpIGZpeHR1cmU6IGFueTtcclxuXHJcbiAgLy8gQElucHV0KCkgdm1MaXN0OiBWbUxpYnJhcnlMaXN0W10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NvbG9yczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd1ZNczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0JDczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0hlYWRlckZvb3RlckFsd2F5czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgaGVhZGVyT3B0aW9uczogeyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIGJyYW5kT3B0aW9uczogeyBicmFuZE5hbWU6IHN0cmluZyB9W10gPSBbXTtcclxuICBhbGxQaWRzT3B0aW9uczogeyBicmFuZE5hbWU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgc2VsZWN0ZWRIZWFkZXI6IHsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICBicmFuZHNCeVpvbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG4gIG90aGVyc01vZGVCeVpvbmU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XHJcblxyXG4gIHByaXZhdGUgYWxsUGlkc0xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgb3JpZ2luYWxIZWFkZXJMYWJlbDogc3RyaW5nID0gXCJcIjtcclxuICBwcml2YXRlIG9yaWdpbmFsQnJhbmRzQnlab25lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcclxuXHJcbiAgQFZpZXdDaGlsZChcImZpeHR1cmVSb290XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGZpeHR1cmVSb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcblxyXG4gIGltZ0NETjogc3RyaW5nO1xyXG4gIHNoZWxmQ29sb3JzID0gU0hFTEZfQ09MT1JTO1xyXG5cclxuICBzZWN0aW9uQnlab25lczoge1xyXG4gICAgem9uZTogc3RyaW5nO1xyXG4gICAgc2VjdGlvbjoge1xyXG4gICAgICBicmFuZHM6IHN0cmluZ1tdO1xyXG4gICAgICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcclxuICAgICAgc2hlbHZlczogc3RyaW5nW107XHJcbiAgICAgIHNoZWxmRGl2czogKEhUTUxFbGVtZW50IHwgbnVsbCB8IHVuZGVmaW5lZClbXTtcclxuICAgIH07XHJcbiAgfVtdID0gW107XHJcblxyXG4gIC8vIHZtTGlzdDogVm1MaWJyYXJ5TGlzdFtdID0gW107XHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaXNWTUluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc0JDSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBoZWFkZXJMYWJlbCA9IHRoaXMuZml4dHVyZT8uaGVhZGVyPy5sYWJlbD8udHJpbSgpO1xyXG4gICAgaWYgKCFoZWFkZXJMYWJlbCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHpvbmVzID0gdGhpcy51bmlxdWVab25lcygpO1xyXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHpvbmVzKSB7XHJcbiAgICAgIGlmICghdGhpcy5icmFuZHNCeVpvbmVbem9uZV0/Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhlYWRlckxhYmVsID0gdGhpcy5maXh0dXJlPy5oZWFkZXI/LmxhYmVsPy50cmltKCk7XHJcbiAgICBpZiAoIWhlYWRlckxhYmVsKSByZXR1cm4gXCJQaWNrIGEgaGVhZGVyIGJlZm9yZSBhY2NlcHRpbmcuXCI7XHJcblxyXG4gICAgY29uc3QgZW1wdHlab25lczogc3RyaW5nW10gPSBbXTtcclxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLnVuaXF1ZVpvbmVzKCkpIHtcclxuICAgICAgaWYgKCF0aGlzLmJyYW5kc0J5Wm9uZVt6b25lXT8ubGVuZ3RoKSBlbXB0eVpvbmVzLnB1c2goem9uZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZW1wdHlab25lcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGBQaWNrIGF0IGxlYXN0IG9uZSBicmFuZCBmb3I6ICR7ZW1wdHlab25lcy5qb2luKFwiLCBcIil9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bmlxdWVab25lcygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCB6b25lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgKHRoaXMuZml4dHVyZT8uc2hlbGZDb25maWcgPz8gW10pLmZvckVhY2goKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHNoZWxmPy56b25lKSB6b25lcy5hZGQoc2hlbGYuem9uZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHpvbmVzKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0RpcnR5KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCh0aGlzLmZpeHR1cmU/LmhlYWRlcj8ubGFiZWwgPz8gXCJcIikgIT09IHRoaXMub3JpZ2luYWxIZWFkZXJMYWJlbCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHpvbmVLZXlzID0gbmV3IFNldChbXHJcbiAgICAgIC4uLk9iamVjdC5rZXlzKHRoaXMuYnJhbmRzQnlab25lKSxcclxuICAgICAgLi4uT2JqZWN0LmtleXModGhpcy5vcmlnaW5hbEJyYW5kc0J5Wm9uZSksXHJcbiAgICBdKTtcclxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB6b25lS2V5cykge1xyXG4gICAgICBjb25zdCBjdXJyZW50ID0gWy4uLih0aGlzLmJyYW5kc0J5Wm9uZVt6b25lXSA/PyBbXSldLnNvcnQoKTtcclxuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBbLi4uKHRoaXMub3JpZ2luYWxCcmFuZHNCeVpvbmVbem9uZV0gPz8gW10pXS5zb3J0KCk7XHJcbiAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gb3JpZ2luYWwubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRbaV0gIT09IG9yaWdpbmFsW2ldKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5ncy5lbnZpcm9ubWVudFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGVudikgPT4gKHRoaXMuaW1nQ0ROID0gZW52LnBsYW5vZ3JhbUNETikpO1xyXG5cclxuICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1tcImZpeHR1cmVcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnNhbml0aXplVm1Db25maWcoKTtcclxuICAgICAgYXdhaXQgdGhpcy5pbml0SW5saW5lRWRpdFN0YXRlKCk7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5U2hlbGZDb2xvcnMoKTtcclxuICAgICAgICB0aGlzLmhhbmRsZVZtUG9zaXRpb25BbmRTaXplKCk7XHJcbiAgICAgIH0sIDQwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXRJbmxpbmVFZGl0U3RhdGUoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50TGFiZWw6IHN0cmluZyA9IHRoaXMuZml4dHVyZT8uaGVhZGVyPy5sYWJlbCA/PyBcIlwiO1xyXG4gICAgdGhpcy5vcmlnaW5hbEhlYWRlckxhYmVsID0gY3VycmVudExhYmVsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEhlYWRlciA9IGN1cnJlbnRMYWJlbCA/IFt7IGxhYmVsOiBjdXJyZW50TGFiZWwgfV0gOiBbXTtcclxuXHJcbiAgICB0aGlzLm9yaWdpbmFsQnJhbmRzQnlab25lID0gdGhpcy5zbmFwc2hvdEJyYW5kc0J5Wm9uZSgpO1xyXG4gICAgdGhpcy5icmFuZHNCeVpvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5vcmlnaW5hbEJyYW5kc0J5Wm9uZSk7XHJcbiAgICB0aGlzLm90aGVyc01vZGVCeVpvbmUgPSB7fTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRIZWFkZXJzKCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRCcmFuZHNGb3JIZWFkZXIoY3VycmVudExhYmVsKTtcclxuICAgIGF3YWl0IHRoaXMuZGV0ZWN0T3RoZXJzU291cmNlZFpvbmVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRldGVjdE90aGVyc1NvdXJjZWRab25lcygpIHtcclxuICAgIGlmICghdGhpcy5icmFuZE9wdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcbiAgICBjb25zdCBrbm93bkJyYW5kcyA9IG5ldyBTZXQodGhpcy5icmFuZE9wdGlvbnMubWFwKChiKSA9PiBiLmJyYW5kTmFtZSkpO1xyXG5cclxuICAgIGNvbnN0IHpvbmVzV2l0aEZvcmVpZ25CcmFuZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFt6b25lLCBicmFuZHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuYnJhbmRzQnlab25lKSkge1xyXG4gICAgICBpZiAoYnJhbmRzLnNvbWUoKGIpID0+ICFrbm93bkJyYW5kcy5oYXMoYikpKSB7XHJcbiAgICAgICAgem9uZXNXaXRoRm9yZWlnbkJyYW5kcy5wdXNoKHpvbmUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF6b25lc1dpdGhGb3JlaWduQnJhbmRzLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZW5zdXJlQWxsUGlkc0xvYWRlZCgpO1xyXG4gICAgem9uZXNXaXRoRm9yZWlnbkJyYW5kcy5mb3JFYWNoKFxyXG4gICAgICAoem9uZSkgPT4gKHRoaXMub3RoZXJzTW9kZUJ5Wm9uZVt6b25lXSA9IHRydWUpLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQWxsUGlkc0xvYWRlZCgpIHtcclxuICAgIGlmICh0aGlzLmFsbFBpZHNMb2FkZWQpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldFBJRExpc3QoXCJvdGhlcnNcIiksXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gcmVzdWx0Py5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLmFsbFBpZHNPcHRpb25zID0gbGlzdC5tYXAoKGJyYW5kTmFtZSkgPT4gKHsgYnJhbmROYW1lIH0pKTtcclxuICAgICAgdGhpcy5hbGxQaWRzTG9hZGVkID0gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBAQCB+IGVuc3VyZUFsbFBpZHNMb2FkZWQgW0VSUl06YCwgZXJyb3IpO1xyXG4gICAgICB0aGlzLmFsbFBpZHNPcHRpb25zID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBicmFuZE9wdGlvbnNGb3Jab25lKHpvbmU6IHN0cmluZyk6IHsgYnJhbmROYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLm90aGVyc01vZGVCeVpvbmVbem9uZV0gPyB0aGlzLmFsbFBpZHNPcHRpb25zIDogdGhpcy5icmFuZE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBpc1RvZ2dsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWRIZWFkZXI/LlswXT8ubGFiZWw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblRvZ2dsZU90aGVycyh6b25lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG5leHRBY3RpdmUgPSAhdGhpcy5vdGhlcnNNb2RlQnlab25lW3pvbmVdO1xyXG4gICAgdGhpcy5vdGhlcnNNb2RlQnlab25lID0geyAuLi50aGlzLm90aGVyc01vZGVCeVpvbmUsIFt6b25lXTogbmV4dEFjdGl2ZSB9O1xyXG5cclxuICAgIGlmIChuZXh0QWN0aXZlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQWxsUGlkc0xvYWRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnJhbmRzQnlab25lID0geyAuLi50aGlzLmJyYW5kc0J5Wm9uZSwgW3pvbmVdOiBbXSB9O1xyXG4gICAgdGhpcy5hcHBseUJyYW5kc1RvRml4dHVyZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzbmFwc2hvdEJyYW5kc0J5Wm9uZSgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcclxuICAgICh0aGlzLmZpeHR1cmU/LnNoZWxmQ29uZmlnID8/IFtdKS5mb3JFYWNoKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzaGVsZj8uem9uZTtcclxuICAgICAgaWYgKCF6b25lIHx8IHJlc3VsdFt6b25lXSkgcmV0dXJuO1xyXG4gICAgICByZXN1bHRbem9uZV0gPSBBcnJheS5pc0FycmF5KHNoZWxmPy5wcm9kdWN0QnJhbmROYW1lKVxyXG4gICAgICAgID8gWy4uLnNoZWxmLnByb2R1Y3RCcmFuZE5hbWVdXHJcbiAgICAgICAgOiBbXTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEhlYWRlcnMoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRIZWFkZXJzTGlzdCgpLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBsaXN0OiBzdHJpbmdbXSA9IHJlc3VsdD8uZGF0YSA/PyBbXTtcclxuICAgICAgdGhpcy5oZWFkZXJPcHRpb25zID0gbGlzdC5tYXAoKGxhYmVsKSA9PiAoeyBsYWJlbCB9KSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgQEAgfiBsb2FkSGVhZGVycyBbRVJSXTpgLCBlcnJvcik7XHJcbiAgICAgIHRoaXMuaGVhZGVyT3B0aW9ucyA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkQnJhbmRzRm9ySGVhZGVyKGhlYWRlcjogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWhlYWRlcikge1xyXG4gICAgICB0aGlzLmJyYW5kT3B0aW9ucyA9IFtdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRQSURMaXN0KGhlYWRlciksXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gcmVzdWx0Py5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLmJyYW5kT3B0aW9ucyA9IGxpc3QubWFwKChicmFuZE5hbWUpID0+ICh7IGJyYW5kTmFtZSB9KSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgQEAgfiBsb2FkQnJhbmRzRm9ySGVhZGVyIFtFUlJdOmAsIGVycm9yKTtcclxuICAgICAgdGhpcy5icmFuZE9wdGlvbnMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uSGVhZGVyQ2hhbmdlKHNlbGVjdGVkOiB7IGxhYmVsOiBzdHJpbmcgfSB8IG51bGwpIHtcclxuICAgIGNvbnN0IG5ld0xhYmVsID0gc2VsZWN0ZWQ/LmxhYmVsID8/IFwiXCI7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZS5oZWFkZXIgPSB7IC4uLih0aGlzLmZpeHR1cmUuaGVhZGVyID8/IHt9KSwgbGFiZWw6IG5ld0xhYmVsIH07XHJcbiAgICB0aGlzLnNlbGVjdGVkSGVhZGVyID0gbmV3TGFiZWwgPyBbeyBsYWJlbDogbmV3TGFiZWwgfV0gOiBbXTtcclxuXHJcbiAgICBjb25zdCBjbGVhcmVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuYnJhbmRzQnlab25lKS5mb3JFYWNoKCh6b25lKSA9PiAoY2xlYXJlZFt6b25lXSA9IFtdKSk7XHJcbiAgICB0aGlzLmJyYW5kc0J5Wm9uZSA9IGNsZWFyZWQ7XHJcbiAgICB0aGlzLm90aGVyc01vZGVCeVpvbmUgPSB7fTtcclxuICAgIHRoaXMuYXBwbHlCcmFuZHNUb0ZpeHR1cmUoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRCcmFuZHNGb3JIZWFkZXIobmV3TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgb25ab25lQnJhbmRzQ2hhbmdlKHpvbmU6IHN0cmluZywgYnJhbmRzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5icmFuZHNCeVpvbmUgPSB7IC4uLnRoaXMuYnJhbmRzQnlab25lLCBbem9uZV06IGJyYW5kcyA/PyBbXSB9O1xyXG4gICAgdGhpcy5hcHBseUJyYW5kc1RvRml4dHVyZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUJyYW5kc1RvRml4dHVyZSgpIHtcclxuICAgICh0aGlzLmZpeHR1cmU/LnNoZWxmQ29uZmlnID8/IFtdKS5mb3JFYWNoKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzaGVsZj8uem9uZTtcclxuICAgICAgaWYgKCF6b25lKSByZXR1cm47XHJcbiAgICAgIHNoZWxmLnByb2R1Y3RCcmFuZE5hbWUgPSBbLi4uKHRoaXMuYnJhbmRzQnlab25lW3pvbmVdID8/IFtdKV07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2FuaXRpemVWbUNvbmZpZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNoZWxmQ291bnQgPSB0aGlzLmZpeHR1cmU/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmU/LnZtQ29uZmlnPy5mb3JFYWNoKCh2bTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdm0/LnN0YXJ0WVBvc2l0aW9uICYmICF2bT8uZW5kWVBvc2l0aW9uKSB7XHJcbiAgICAgICAgaWYgKHZtPy54Wm9uZSA9PT0gXCJzdHJldGNoXCIgJiYgdm0/Lnlab25lID09PSBcInN0cmV0Y2hcIikge1xyXG4gICAgICAgICAgdm0uc3RhcnRZUG9zaXRpb24gPSBzaGVsZkNvdW50O1xyXG4gICAgICAgICAgdm0uZW5kWVBvc2l0aW9uID0gc2hlbGZDb3VudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdm0uc3RhcnRZUG9zaXRpb24gPSAxO1xyXG4gICAgICAgICAgdm0uZW5kWVBvc2l0aW9uID0gc2hlbGZDb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzQkNJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzQkNJbml0aWFsaXplZCA9IHRoaXMuYXBwbHlTaGVsZkNvbG9ycygpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmlzVk1Jbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVk1Jbml0aWFsaXplZCA9IHRoaXMuaGFuZGxlVm1Qb3NpdGlvbkFuZFNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldFNlbGVjdGVkVk0odm06IGFueSkge1xyXG4gIC8vICAgaWYgKHZtPy52bUlkKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLnZtTGlzdC5maW5kKCh2KSA9PiB2LmlkID09PSB2bS52bUlkKTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLnZtTGlzdC5maW5kKFxyXG4gIC8vICAgICAgICh2KSA9PiB2Lm5hbWUgPT09IHZtLnZtTmFtZSAmJiB2LnR5cGUgPT09IHZtLnZtVHlwZVxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgYm9keUVsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmZpeHR1cmVSb290Py5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2JvZHktYmxvY2stc3VtXCIpID8/IG51bGxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpIHtcclxuICAgIGlmICghdGhpcy5zaG93Vk1zKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB2aWV3UG9ydCA9IHRoaXMuYm9keUVsO1xyXG4gICAgaWYgKCF2aWV3UG9ydCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHZpZXdQb3J0Lm9mZnNldFdpZHRoO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZT8udm1Db25maWc/LmZvckVhY2goKGU6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCBzdGFydFNoZWxmID0gZT8uc3RhcnRZUG9zaXRpb247XHJcbiAgICAgIGxldCBlbmRTaGVsZiA9IGU/LmVuZFlQb3NpdGlvbjtcclxuXHJcbiAgICAgIGNvbnN0IHZtID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3ZtJHtpfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAoIXZtKSByZXR1cm47XHJcblxyXG4gICAgICBsZXQgeCA9IDA7XHJcbiAgICAgIGxldCB5ID0gMDtcclxuXHJcbiAgICAgIGxldCB5U3RhcnQgPSAwO1xyXG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8IHN0YXJ0U2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgeVN0YXJ0ICs9IHMub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcGxhY2VtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgbGV0IHBsYWNlbWVudFdpZHRoID0gYm9keVdpZHRoO1xyXG5cclxuICAgICAgZm9yIChsZXQgayA9IHN0YXJ0U2hlbGY7IGsgPD0gZW5kU2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuICAgICAgICBwbGFjZW1lbnRIZWlnaHQgKz0gcy5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkZWZhdWx0VyA9IHBsYWNlbWVudFdpZHRoIC8gMztcclxuICAgICAgbGV0IGRlZmF1bHRIID0gcGxhY2VtZW50SGVpZ2h0IC8gMztcclxuXHJcbiAgICAgIGxldCB3aWR0aCA9IGRlZmF1bHRXO1xyXG4gICAgICBsZXQgaGVpZ2h0ID0gZGVmYXVsdEg7XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnhab25lKSB7XHJcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgIHggPSAwO1xyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIHggPSBib2R5V2lkdGggLSB3aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgICAgICB4ID0gKGJvZHlXaWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RyZXRjaFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBib2R5V2lkdGg7XHJcbiAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnlab25lKSB7XHJcbiAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gcGxhY2VtZW50SGVpZ2h0IDwgZGVmYXVsdEggPyBwbGFjZW1lbnRIZWlnaHQgLSAyMCA6IGRlZmF1bHRIO1xyXG4gICAgICAgICAgeSA9IHlTdGFydDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodCA8IGRlZmF1bHRIID8gcGxhY2VtZW50SGVpZ2h0IC0gMjAgOiBkZWZhdWx0SDtcclxuICAgICAgICAgIHkgPSAocGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0KSAvIDIgKyB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYm90dG9tXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQgPCBkZWZhdWx0SCA/IHBsYWNlbWVudEhlaWdodCAtIDIwIDogZGVmYXVsdEg7XHJcbiAgICAgICAgICB5ID0gcGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0ICsgeVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInN0cmV0Y2hcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodDtcclxuICAgICAgICAgIHkgPSB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdm0uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgIHZtLnN0eWxlLmhlaWdodCA9IGAgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB2bS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRTaGVsZkRpdihrOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gKHZpZXdQb3J0Py5xdWVyeVNlbGVjdG9yKGAjc2hlbGYke2t9YCkgfHxcclxuICAgICAgICAgIHZpZXdQb3J0Py5xdWVyeVNlbGVjdG9yKGAjdHJheSR7a31gKSB8fFxyXG4gICAgICAgICAgdmlld1BvcnQ/LnF1ZXJ5U2VsZWN0b3IoYCN2bW9ubHkke2t9YCkpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaGVsZkNvbG9ycygpIHtcclxuICAgIGNvbnN0IGJvZGllcyA9IHRoaXMuYm9keUVsO1xyXG4gICAgaWYgKCFib2RpZXMpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBib2R5Q2hpbGRyZW4gPSBBcnJheS5mcm9tKGJvZGllcz8uY2hpbGRyZW4gPz8gW10pIGFzIEhUTUxFbGVtZW50W107XHJcblxyXG4gICAgY29uc3Qgc2hlbGZEaXZzID0gYm9keUNoaWxkcmVuXHJcbiAgICAgIC5tYXAoKGRpdikgPT4gZGl2IGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAuZmlsdGVyKChkKSA9PiBkPy5pZC5pbmNsdWRlcyhcInN1bVNoZWxmQ29udGFpbmVyXCIpKTtcclxuXHJcbiAgICBpZiAoIXNoZWxmRGl2cykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGFkanVzdCA9IDA7XHJcbiAgICBzd2l0Y2ggKHRoaXMuZml4dHVyZT8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCkge1xyXG4gICAgICBjYXNlIFwiTDFcIjogLy9maXh0dXJlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93Q29sb3JzKSB7XHJcbiAgICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzWzBdLmJnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXAgPSBkLnF1ZXJ5U2VsZWN0b3IoXCIuY2FwYWNpdHlcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNZID1cclxuICAgICAgICAgICAgICB5ICsgKGQub2Zmc2V0SGVpZ2h0IC0gY2FwLm9mZnNldEhlaWdodCkgLyAyIC0gY2FwLm9mZnNldFRvcDtcclxuICAgICAgICAgICAgY2FwLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7c1l9cHgpYDtcclxuICAgICAgICAgICAgY2FwLnN0eWxlLmJvcmRlciA9IGAxcHggc29saWQgJHt0aGlzLnNoZWxmQ29sb3JzWzBdLmJvcmRlcn1gO1xyXG4gICAgICAgICAgICB5ICs9IGQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcIkwzXCI6IC8vc2VjdGlvblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnN0IHNoZWx2ZXMgPSBzaGVsZkRpdnNcclxuICAgICAgICAgICAgLm1hcCgoZGl2KSA9PlxyXG4gICAgICAgICAgICAgIGRpdi5sYXN0RWxlbWVudENoaWxkPy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZGl2XCJcclxuICAgICAgICAgICAgICAgID8gKGRpdi5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XHJcblxyXG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RTZXF1ZW50aWFsU2VjdGlvbihzaGVsdmVzKTtcclxuICAgICAgICAgIGNvbnN0IHNlY3Rpb25BcnJheSA9IHRoaXMuZ3JvdXBTaGVsdmVzQnlab25lKFxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmU/LnNoZWxmQ29uZmlnID8/IFtdLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IGFsbFNlY3Rpb25TaGVsdmVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgIHNlY3Rpb25BcnJheS5mb3JFYWNoKChzZSwgaSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVsZklkcyA9XHJcbiAgICAgICAgICAgICAgc2Uuc2hlbHZlcz8ubWFwKChzaCkgPT4gc2gucmVwbGFjZSgvXFxzL2csIFwiXCIpLnRvTG93ZXJDYXNlKCkpID8/XHJcbiAgICAgICAgICAgICAgW107XHJcbiAgICAgICAgICAgIGFsbFNlY3Rpb25TaGVsdmVzLnB1c2goLi4uc2hlbGZJZHMpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWNEaXZzID0gc2hlbHZlcy5maWx0ZXIoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgICAgc2hlbGZJZHM/LmluY2x1ZGVzKGl0ZW0/LmlkID8/IFwiXCIpLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbG9ycykge1xyXG4gICAgICAgICAgICAgIHNlY0RpdnMuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0uYmc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXAgPSBkLnF1ZXJ5U2VsZWN0b3IoXCIuY2FwYWNpdHlcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhcC5zdHlsZS5ib3JkZXIgPSBgMXB4IHNvbGlkICR7dGhpcy5zaGVsZkNvbG9yc1tpXS5ib3JkZXJ9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gZC5xdWVyeVNlbGVjdG9yKFwiLmNhcGFjaXR5XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoY2FwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc1kgPVxyXG4gICAgICAgICAgICAgICAgeSArIChkLm9mZnNldEhlaWdodCAtIGNhcC5vZmZzZXRIZWlnaHQpIC8gMiAtIGNhcC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgY2FwLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7c1l9cHgpYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB5ICs9IGQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dCQ3MpIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHVuYXNzaWduZWRTaGVsdmVzID0gc2hlbGZEaXZzLmZpbHRlcihcclxuICAgICAgICAgICAgKGl0ZW0pID0+ICFhbGxTZWN0aW9uU2hlbHZlcy5pbmNsdWRlcyhpdGVtLmlkKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB1bmFzc2lnbmVkU2hlbHZlcy5mb3JFYWNoKChkKSA9PiAoZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCIpKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25CeVpvbmVzLmZvckVhY2goKHN6LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25IZWlnaHQgPSBzei5zZWN0aW9uLnNoZWxmRGl2cy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25XaWR0aCA9XHJcbiAgICAgICAgICAgICAgICBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8ub2Zmc2V0V2lkdGggPz8gMzQ1O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiYyA9IGJvZGllcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcclxuICAgICAgICAgICAgICAgIGAjYnJhbmQtY2F0ZWdvcnkke2l9YCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoYmMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlY0JnID0gcmdiVG9IZXgoXHJcbiAgICAgICAgICAgICAgICAgIHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZWxmQ29sb3JzLmZpbmQoKGMpID0+IGMuYmcgPT09IHNlY0JnKSA/P1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZWxmQ29sb3JzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dDb2xvcnMpIHtcclxuICAgICAgICAgICAgICAgICAgYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb2xvci5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgICAgIGJjLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2ZmZlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJjWCA9IChjdXJyZW50U2VjdGlvbldpZHRoIC0gYmMub2Zmc2V0V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJjWSA9XHJcbiAgICAgICAgICAgICAgICAgIChjdXJyZW50U2VjdGlvbkhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyICtcclxuICAgICAgICAgICAgICAgICAgc2VjdGlvbkdyb3VwSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWCArIGFkanVzdH1weCwgJHtiY1l9cHgpYDtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQgKz0gY3VycmVudFNlY3Rpb25IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiTDJcIjogLy9zaGVsZlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCB5ID0gMDtcclxuXHJcbiAgICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaCgoZGl2LCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IGRpdi5xdWVyeVNlbGVjdG9yKFwiLmNhcGFjaXR5XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoIWNhcCkge1xyXG4gICAgICAgICAgICAgIHkgKz0gZGl2Lm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc1kgPVxyXG4gICAgICAgICAgICAgIHkgKyAoZGl2Lm9mZnNldEhlaWdodCAtIGNhcC5vZmZzZXRIZWlnaHQpIC8gMiAtIGNhcC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgIGNhcC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3NZfXB4KWA7XHJcbiAgICAgICAgICAgIGNhcC5zdHlsZS5ib3JkZXIgPSBgMXB4IHNvbGlkICR7dGhpcy5zaGVsZkNvbG9yc1tpXS5ib3JkZXJ9YDtcclxuICAgICAgICAgICAgeSArPSBkaXYub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbG9ycykge1xyXG4gICAgICAgICAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLmJnO1xyXG4gICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgJHt0aGlzLnNoZWxmQ29sb3JzW2ldLmJvcmRlcn1gO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0JDcykgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmMgPSBkaXYucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYCNicmFuZC1jYXRlZ29yeSR7aX1gKTtcclxuICAgICAgICAgICAgaWYgKCFiYykgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmNYID0gKGRpdi5vZmZzZXRXaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjWSA9IChkaXYub2Zmc2V0SGVpZ2h0IC0gYmMub2Zmc2V0SGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93Q29sb3JzKSB7XHJcbiAgICAgICAgICAgICAgYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLmJvcmRlcjtcclxuICAgICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLnRleHRCZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiYy5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7YmNYICsgYWRqdXN0fXB4LCAke2JjWX1weClgO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiTDRcIjogLy9zcG90XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93Q29sb3JzKSB7XHJcbiAgICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzWzBdLmJnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXAgPSBkLnF1ZXJ5U2VsZWN0b3IoXCIuY2FwYWNpdHlcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNZID1cclxuICAgICAgICAgICAgICB5ICsgKGQub2Zmc2V0SGVpZ2h0IC0gY2FwLm9mZnNldEhlaWdodCkgLyAyIC0gY2FwLm9mZnNldFRvcDtcclxuICAgICAgICAgICAgY2FwLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7c1l9cHgpYDtcclxuICAgICAgICAgICAgY2FwLnN0eWxlLmJvcmRlciA9IGAxcHggc29saWQgJHt0aGlzLnNoZWxmQ29sb3JzWzBdLmJvcmRlcn1gO1xyXG4gICAgICAgICAgICB5ICs9IGQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbG9ycykge1xyXG4gICAgICAgICAgICBkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbMF0uYmc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgY2FwID0gZC5xdWVyeVNlbGVjdG9yKFwiLmNhcGFjaXR5XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgY29uc3Qgc1kgPVxyXG4gICAgICAgICAgICB5ICsgKGQub2Zmc2V0SGVpZ2h0IC0gY2FwLm9mZnNldEhlaWdodCkgLyAyIC0gY2FwLm9mZnNldFRvcDtcclxuICAgICAgICAgIGNhcC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3NZfXB4KWA7XHJcbiAgICAgICAgICBjYXAuc3R5bGUuYm9yZGVyID0gYDFweCBzb2xpZCAke3RoaXMuc2hlbGZDb2xvcnNbMF0uYm9yZGVyfWA7XHJcbiAgICAgICAgICB5ICs9IGQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsKVtdKSB7XHJcbiAgICBjb25zdCBuZXdTZWN0aW9uQnlab25lcyA9IFtdO1xyXG5cclxuICAgIGxldCBwWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5maXh0dXJlPy5zaGVsZkNvbmZpZyA/PyBbXSkge1xyXG4gICAgICBjb25zdCB6b25lID0gcy56b25lIHx8IFwiXCI7XHJcbiAgICAgIGNvbnN0IHNoZWxmSWQgPSBgJHtzLnNoZWxmVHlwZX0ke3Muc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgY29uc3Qgc2hlbGZEaXYgPSBzaGVsZkRpdnMuZmluZCgoZCkgPT4gZD8uaWQgPT09IHNoZWxmSWQpO1xyXG5cclxuICAgICAgaWYgKHpvbmUgPT09IFwiXCIpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoem9uZSAhPT0gcFpvbmUpIHtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lcy5wdXNoKHtcclxuICAgICAgICAgIHpvbmUsXHJcbiAgICAgICAgICBzZWN0aW9uOiB7XHJcbiAgICAgICAgICAgIGJyYW5kczogcy5wcm9kdWN0QnJhbmROYW1lID8/IFtdLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBzLnByb2R1Y3RDYXRlZ29yeSA/PyBbXSxcclxuICAgICAgICAgICAgc2hlbHZlczogW3NoZWxmSWRdLFxyXG4gICAgICAgICAgICBzaGVsZkRpdnM6IFtzaGVsZkRpdl0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBab25lID0gem9uZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzZWN0aW9uID0gbmV3U2VjdGlvbkJ5Wm9uZXNbbmV3U2VjdGlvbkJ5Wm9uZXMubGVuZ3RoIC0gMV0uc2VjdGlvbjtcclxuICAgICAgICBzZWN0aW9uLnNoZWx2ZXMucHVzaChzaGVsZklkKTtcclxuICAgICAgICBzZWN0aW9uLnNoZWxmRGl2cy5wdXNoKHNoZWxmRGl2KTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWN0aW9uLmJyYW5kcy5sZW5ndGgpIHNlY3Rpb24uYnJhbmRzID0gcz8ucHJvZHVjdEJyYW5kTmFtZSA/PyBbXTtcclxuICAgICAgICBpZiAoIXNlY3Rpb24uY2F0ZWdvcmllcy5sZW5ndGgpXHJcbiAgICAgICAgICBzZWN0aW9uLmNhdGVnb3JpZXMgPSBzPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlY3Rpb25CeVpvbmVzID0gWy4uLm5ld1NlY3Rpb25CeVpvbmVzXTtcclxuXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGdyb3VwU2hlbHZlc0J5Wm9uZShpbnB1dDogU2hlbGZDb25maWdbXSk6IFNlY3Rpb25Db25maWdbXSB7XHJcbiAgICBjb25zdCB6b25lTWFwOiB7IFt6b25lOiBzdHJpbmddOiBTZWN0aW9uQ29uZmlnIH0gPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IGl0ZW0/LnpvbmUgPz8gXCJcIjtcclxuICAgICAgY29uc3Qgc2hlbGZMYWJlbCA9IGAke2l0ZW0uc2hlbGZUeXBlfSAke2l0ZW0uc2hlbGZOdW1iZXJ9YDtcclxuXHJcbiAgICAgIGlmICghem9uZU1hcFt6b25lXSkge1xyXG4gICAgICAgIHpvbmVNYXBbem9uZV0gPSB7XHJcbiAgICAgICAgICBzaGVsdmVzOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZT8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiXHJcbiAgICAgICAgICAgICAgPyBpdGVtLnByb2R1Y3RCcmFuZE5hbWVcclxuICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OlxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmU/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDJcIlxyXG4gICAgICAgICAgICAgID8gaXRlbS5wcm9kdWN0Q2F0ZWdvcnlcclxuICAgICAgICAgICAgICA6IFtdLFxyXG4gICAgICAgICAgem9uZTogem9uZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB6b25lTWFwW3pvbmVdPy5zaGVsdmVzPy5wdXNoKHNoZWxmTGFiZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHpvbmVNYXApO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTZWN0aW9uQ29uZmlnVG9TaGVsdmVzKHNlY3Rpb25zOiBTZWN0aW9uQ29uZmlnW10pOiBTaGVsZkNvbmZpZ1tdIHtcclxuICAgIGNvbnN0IHNlY3Rpb25NYXAgPSBuZXcgTWFwPFxyXG4gICAgICBzdHJpbmcsXHJcbiAgICAgIFBpY2s8U2VjdGlvbkNvbmZpZywgXCJ6b25lXCIgfCBcInByb2R1Y3RCcmFuZE5hbWVcIiB8IFwicHJvZHVjdENhdGVnb3J5XCI+XHJcbiAgICA+KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XHJcbiAgICAgIGZvciAoY29uc3Qgc2hlbGZMYWJlbCBvZiBzZWN0aW9uLnNoZWx2ZXMhKSB7XHJcbiAgICAgICAgc2VjdGlvbk1hcC5zZXQoc2hlbGZMYWJlbCwge1xyXG4gICAgICAgICAgem9uZTogc2VjdGlvbi56b25lLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogc2VjdGlvbi5wcm9kdWN0QnJhbmROYW1lLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBzZWN0aW9uLnByb2R1Y3RDYXRlZ29yeSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFwcGx5IG92ZXJyaWRlcyB0byBtYXRjaGluZyBzaGVsdmVzXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmZpeHR1cmU/LnNoZWxmQ29uZmlnPy5tYXAoKHM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtzLnNoZWxmVHlwZX0gJHtzLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBzZWN0aW9uTWFwLmdldChzaGVsZkxhYmVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnMsXHJcbiAgICAgICAgICB6b25lOiBvdmVycmlkZT8uem9uZSB8fCBcIlwiLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogb3ZlcnJpZGU/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IG92ZXJyaWRlPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSkgPz8gW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYoaXNQYWdlTG9hZGluZyl7XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxufUBlbHNlIHtcclxuXHJcbiAgICA8c2VjdGlvbiAjZml4dHVyZVJvb3QgaWQ9XCJmaXh0dXJlLXZpZXdcIj5cclxuICAgICAgICA8ZGl2IGlkPVwidm0tcHJvZHVjdHMtc3VtXCIgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrIHpvbmUtaGVhZGVyLWVkaXRvclwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIihmaXh0dXJlPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnKSB8fCBzaG93SGVhZGVyRm9vdGVyQWx3YXlzXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInpvbmUtaGVhZGVyLXNlbGVjdFwiIFtjbGFzcy5yZWFkb25seV09XCIhZWRpdGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLXNlbGVjdC1wbGFub1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaGVhZGVyT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcGFjdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidIZWFkZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cIm9uSGVhZGVyQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1zZWxlY3QtcGxhbm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJib2R5LWJsb2NrLXN1bVwiIGNsYXNzPVwiYm9keS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW1ZNIEJMT0NLXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaXh0dXJlPy52bUNvbmZpZz8ubGVuZ3RoICYmIHNob3dWTXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2bSBvZiBmaXh0dXJlPy52bUNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCIndm0nICsgaVwiIGNsYXNzPVwidm0tYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInZtPy52bUltYWdlVXJsOyBlbHNlIHBsYWNlaG9sZGVyXCIgW3NyY109XCJpbWdDRE4gKyB2bT8udm1JbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlZtIEltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm0tcGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz57eyB2bT8udm1OYW1lIH19PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtGSVhUVVJFIExFVkVMIC0gQlJBTkQgQ0FURUdPUlldLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZT8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wxJyAmJiBzaG93QkNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImJyYW5kLWNhdGVnb3J5XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiICpuZ0lmPVwiZml4dHVyZT8ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cImZpeHR1cmU/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmU/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmU/LnByb2R1Y3RCcmFuZE5hbWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpeHR1cmU/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZT8ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtTRUNUSU9OIExFVkVMIC0gQlJBTkQgQ0FURUdPUlldLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic2VjdGlvbi1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZT8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wzJyAmJiBzaG93QkNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWN0aW9uQnlab25lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyAkaW5kZXhcIiBjbGFzcz1cImJyYW5kLWNhdGVnb3J5IHpvbmUtYnJhbmQtZWRpdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiem9uZS1icmFuZC1zZWxlY3RcIiBbY2xhc3MucmVhZG9ubHldPVwiIWVkaXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImJyYW5kT3B0aW9uc0ZvclpvbmUoaXRlbS56b25lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInYnJhbmROYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wYWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4U2VsZWN0aW9uXT1cIjNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBicmFuZHMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dHJhQWN0aW9uTGFiZWxdPVwiaXNUb2dnbGVBdmFpbGFibGUoKSA/IChvdGhlcnNNb2RlQnlab25lW2l0ZW0uem9uZV0gPyAnSGlkZSBvdGhlcnMnIDogJ1Nob3cgb3RoZXJzJykgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRyYUFjdGlvbkFjdGl2ZV09XCIhIW90aGVyc01vZGVCeVpvbmVbaXRlbS56b25lXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHRyYUFjdGlvbkNsaWNrKT1cIm9uVG9nZ2xlT3RoZXJzKGl0ZW0uem9uZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJicmFuZHNCeVpvbmVbaXRlbS56b25lXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uWm9uZUJyYW5kc0NoYW5nZShpdGVtLnpvbmUsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ3N1bVNoZWxmQ29udGFpbmVyJyArIGlcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bU0hFTEYgTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzaGVsZi1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZT8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wyJyAmJiBzaG93QkNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyBpXCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiICpuZ0lmPVwiaXRlbS5wcm9kdWN0QnJhbmROYW1lPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBpdGVtLnByb2R1Y3RCcmFuZE5hbWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIiBjbGFzcz1cInNlcGFyYXRvclwiPiAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGl0ZW0ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBpdGVtLnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0ndHJheScpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcGFjaXR5XCI+e3tpdGVtLnByb2R1Y3RQZXJTaGVsZiAqIGl0ZW0udHJheVJvd3N9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5zaGVsZlR5cGUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXBhY2l0eVwiPnt7aXRlbS5wcm9kdWN0UGVyU2hlbGZ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIihmaXh0dXJlPy5mb290ZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnKSB8fCAoc2hvd0hlYWRlckZvb3RlckFsd2F5cyAmJiBmaXh0dXJlPy5mb290ZXI/LmxhYmVsKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZT8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3NlY3Rpb24+XHJcbn0iXX0=
|