tango-app-ui-store-builder 1.2.12 → 1.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/look-plano-collection-form/look-plano-collection-form.component.mjs +125 -20
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +32 -3
- package/esm2022/lib/services/store-builder.service.mjs +4 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +158 -21
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/look-plano-collection-form/look-plano-collection-form.component.d.ts +26 -0
- 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/services/store-builder.service.d.ts +1 -0
- package/package.json +1 -1
package/esm2022/lib/components/look-plano-collection-form/look-plano-collection-form.component.mjs
CHANGED
|
@@ -161,6 +161,57 @@ export class LookPlanoCollectionFormComponent {
|
|
|
161
161
|
}
|
|
162
162
|
ctrl.setValue(current);
|
|
163
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Initial vmConfig coords for a freshly-added VM entry, derived from the
|
|
166
|
+
* vmType and the target library's shelf layout. Mirrors the wall-layout
|
|
167
|
+
* rules in `runLooksAllocation` (onboard.controller.js:buildWallVmEntry)
|
|
168
|
+
* so what the form pre-positions matches what the backend allocator would
|
|
169
|
+
* place there.
|
|
170
|
+
*
|
|
171
|
+
* Top Masking -> first shelf, stretch (top strip of fixture)
|
|
172
|
+
* Mid 1 / Mid -> first mid shelf, left
|
|
173
|
+
* Mid 2 -> last mid shelf, right
|
|
174
|
+
* Mid 3 -> middle mid shelf (or last), stretch
|
|
175
|
+
* Bottom Slanter -> last shelf, stretch (bottom strip)
|
|
176
|
+
*
|
|
177
|
+
* Anything else falls back to the previous neutral default (top, no zone)
|
|
178
|
+
* so behaviour doesn't change for unknown labels.
|
|
179
|
+
*/
|
|
180
|
+
initialVmLayout(vmType, shelfConfig) {
|
|
181
|
+
const norm = String(vmType ?? '').trim().toLowerCase();
|
|
182
|
+
const shelves = Array.isArray(shelfConfig)
|
|
183
|
+
? shelfConfig.slice().sort((a, b) => (a?.shelfNumber || 0) - (b?.shelfNumber || 0))
|
|
184
|
+
: [];
|
|
185
|
+
const inZone = (z) => {
|
|
186
|
+
const target = z.toLowerCase();
|
|
187
|
+
return shelves.filter((s) => String(s?.zone ?? '').trim().toLowerCase() === target);
|
|
188
|
+
};
|
|
189
|
+
const firstShelf = shelves[0]?.shelfNumber || 1;
|
|
190
|
+
const lastShelf = shelves[shelves.length - 1]?.shelfNumber || firstShelf;
|
|
191
|
+
if (norm === 'top masking' || norm === 'top') {
|
|
192
|
+
return { startYPosition: firstShelf, endYPosition: firstShelf, xZone: 'stretch', yZone: 'stretch' };
|
|
193
|
+
}
|
|
194
|
+
if (norm === 'mid 1' || norm === 'mid') {
|
|
195
|
+
const m = inZone('Mid');
|
|
196
|
+
const sn = m[0]?.shelfNumber || firstShelf;
|
|
197
|
+
return { startYPosition: sn, endYPosition: sn, xZone: 'left', yZone: 'stretch' };
|
|
198
|
+
}
|
|
199
|
+
if (norm === 'mid 2') {
|
|
200
|
+
const m = inZone('Mid');
|
|
201
|
+
const sn = m[m.length - 1]?.shelfNumber || firstShelf;
|
|
202
|
+
return { startYPosition: sn, endYPosition: sn, xZone: 'right', yZone: 'stretch' };
|
|
203
|
+
}
|
|
204
|
+
if (norm === 'mid 3') {
|
|
205
|
+
const m = inZone('Mid');
|
|
206
|
+
const target = m.length >= 3 ? m[Math.floor(m.length / 2)] : m[m.length - 1];
|
|
207
|
+
const sn = target?.shelfNumber || firstShelf;
|
|
208
|
+
return { startYPosition: sn, endYPosition: sn, xZone: 'stretch', yZone: 'stretch' };
|
|
209
|
+
}
|
|
210
|
+
if (norm === 'bottom slanter') {
|
|
211
|
+
return { startYPosition: lastShelf, endYPosition: lastShelf, xZone: 'stretch', yZone: 'stretch' };
|
|
212
|
+
}
|
|
213
|
+
return { startYPosition: 1, endYPosition: 1, xZone: '', yZone: '' };
|
|
214
|
+
}
|
|
164
215
|
/** Resolve a VM placement's artwork NAME (+ vmType) to its planovm _id. */
|
|
165
216
|
resolveVmId(vmName, vmType) {
|
|
166
217
|
const name = this.normVmType(vmName);
|
|
@@ -181,7 +232,7 @@ export class LookPlanoCollectionFormComponent {
|
|
|
181
232
|
* artwork (vmId/vmName) is updated while the library keeps its own VM
|
|
182
233
|
* positions. vmTypes not yet present are appended.
|
|
183
234
|
*/
|
|
184
|
-
applyPlacementsToAssignedLibraries() {
|
|
235
|
+
async applyPlacementsToAssignedLibraries() {
|
|
185
236
|
const slot = this.selectedSlotGroup;
|
|
186
237
|
if (!slot)
|
|
187
238
|
return;
|
|
@@ -214,10 +265,30 @@ export class LookPlanoCollectionFormComponent {
|
|
|
214
265
|
label,
|
|
215
266
|
});
|
|
216
267
|
}
|
|
268
|
+
// Nothing to apply — bail out before any fetch.
|
|
269
|
+
if (pidByZone.size === 0 && vmByType.size === 0)
|
|
270
|
+
return;
|
|
271
|
+
// For any library that doesn't have a snapshot yet, fetch its details so
|
|
272
|
+
// we can use the doc as the base. Without this, applyPlacements silently
|
|
273
|
+
// skipped libraries the user hadn't viewed and only the currently-visible
|
|
274
|
+
// chip ever received updates.
|
|
275
|
+
const fetchedBases = new Map();
|
|
276
|
+
await Promise.all(refs.map(async (libId) => {
|
|
277
|
+
if (this.getLibrarySnapshot(libId))
|
|
278
|
+
return;
|
|
279
|
+
try {
|
|
280
|
+
const res = await lastValueFrom(this.builderService.getFixtureLibraryDetails(libId));
|
|
281
|
+
if (res?.data)
|
|
282
|
+
fetchedBases.set(libId, res.data);
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
console.log('@@ ~ applyPlacementsToAssignedLibraries [fetch ERR]:', err);
|
|
286
|
+
}
|
|
287
|
+
}));
|
|
217
288
|
for (const libId of refs) {
|
|
218
|
-
const target = this.getLibrarySnapshot(libId);
|
|
289
|
+
const target = this.getLibrarySnapshot(libId) || fetchedBases.get(libId);
|
|
219
290
|
if (!target)
|
|
220
|
-
continue;
|
|
291
|
+
continue;
|
|
221
292
|
const shelves = Array.isArray(target.shelfConfig) ? target.shelfConfig : [];
|
|
222
293
|
const newShelfConfig = shelves.map((shelf) => {
|
|
223
294
|
const zone = norm(shelf?.zone || shelf?.label);
|
|
@@ -240,14 +311,12 @@ export class LookPlanoCollectionFormComponent {
|
|
|
240
311
|
for (const [key, upd] of vmByType) {
|
|
241
312
|
if (seen.has(key))
|
|
242
313
|
continue;
|
|
314
|
+
const layout = this.initialVmLayout(upd.label, newShelfConfig);
|
|
243
315
|
newVmConfig.push({
|
|
244
316
|
vmType: upd.label,
|
|
245
317
|
vmId: upd.vmId,
|
|
246
318
|
vmName: upd.vmName,
|
|
247
|
-
|
|
248
|
-
endYPosition: 1,
|
|
249
|
-
xZone: '',
|
|
250
|
-
yZone: '',
|
|
319
|
+
...layout,
|
|
251
320
|
position: '',
|
|
252
321
|
});
|
|
253
322
|
}
|
|
@@ -522,6 +591,14 @@ export class LookPlanoCollectionFormComponent {
|
|
|
522
591
|
? seed.fixtureSlots
|
|
523
592
|
: Array.from({ length: Math.max(1, Number(seed.fixtureCount) || 1) }, (_, i) => ({ slotIndex: i + 1 }));
|
|
524
593
|
const slots = seedSlots.map((s, i) => this.createSlotGroup({ ...s, slotIndex: i + 1 }));
|
|
594
|
+
// Legacy data may have stored cadHeaderVariants at the slot level. If the
|
|
595
|
+
// incoming look doesn't have its own variants array, fold the union of
|
|
596
|
+
// slot-level variants into the look so editing in the new UI doesn't lose
|
|
597
|
+
// them.
|
|
598
|
+
const seedLookVariants = Array.isArray(seed.cadHeaderVariants)
|
|
599
|
+
? seed.cadHeaderVariants
|
|
600
|
+
: Array.from(new Set((Array.isArray(seed.fixtureSlots) ? seed.fixtureSlots : [])
|
|
601
|
+
.flatMap((s) => Array.isArray(s?.cadHeaderVariants) ? s.cadHeaderVariants : [])));
|
|
525
602
|
const lookGroup = this.fb.group({
|
|
526
603
|
keyType: [seed.keyType || 'mbq'],
|
|
527
604
|
mbqBucket: [seed.mbqBucket || ''],
|
|
@@ -530,6 +607,7 @@ export class LookPlanoCollectionFormComponent {
|
|
|
530
607
|
fixtureType: [Array.isArray(seed.fixtureType) ? seed.fixtureType : []],
|
|
531
608
|
layoutVariant: [seed.layoutVariant || 'shelf'],
|
|
532
609
|
storeProto: [seed.storeProto || ''],
|
|
610
|
+
cadHeaderVariants: [seedLookVariants],
|
|
533
611
|
fixtureSlots: this.fb.array(slots),
|
|
534
612
|
});
|
|
535
613
|
// fixtureCount → slots length (user-edited count adjusts the slots array)
|
|
@@ -573,7 +651,6 @@ export class LookPlanoCollectionFormComponent {
|
|
|
573
651
|
fixtureLibraryRef: [seed.fixtureLibraryRef || ''],
|
|
574
652
|
fixtureLibraryLabel: [seed.fixtureLibraryLabel || ''],
|
|
575
653
|
fixtureLibraryRefs: [Array.isArray(seed.fixtureLibraryRefs) ? seed.fixtureLibraryRefs : []],
|
|
576
|
-
cadHeaderVariants: [Array.isArray(seed.cadHeaderVariants) ? seed.cadHeaderVariants : []],
|
|
577
654
|
placements: this.fb.array(placements),
|
|
578
655
|
libraryConfigurations: this.fb.array(libraryConfigs),
|
|
579
656
|
// Per-library snapshot of the embedded fixture-template editor state
|
|
@@ -928,15 +1005,17 @@ export class LookPlanoCollectionFormComponent {
|
|
|
928
1005
|
if (existingVms.length === 0) {
|
|
929
1006
|
const vmPlacements = placements.filter((p) => p?.kind === 'vm' && p?.rawValue);
|
|
930
1007
|
if (vmPlacements.length > 0) {
|
|
931
|
-
newVmConfig = vmPlacements.map((p) =>
|
|
932
|
-
vmType
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
1008
|
+
newVmConfig = vmPlacements.map((p) => {
|
|
1009
|
+
const vmType = String(p?.position || '');
|
|
1010
|
+
const layout = this.initialVmLayout(vmType, newShelfConfig);
|
|
1011
|
+
return {
|
|
1012
|
+
vmType,
|
|
1013
|
+
vmId: String(p?.rawValue || ''),
|
|
1014
|
+
vmName: String(p?.rawValue || ''),
|
|
1015
|
+
...layout,
|
|
1016
|
+
position: '',
|
|
1017
|
+
};
|
|
1018
|
+
});
|
|
940
1019
|
vmsApplied = true;
|
|
941
1020
|
}
|
|
942
1021
|
}
|
|
@@ -1053,6 +1132,32 @@ export class LookPlanoCollectionFormComponent {
|
|
|
1053
1132
|
const count = lookGroup.get('fixtureCount')?.value;
|
|
1054
1133
|
return `${key || '(unnamed)'} — ${count || 0} fixtures`;
|
|
1055
1134
|
}
|
|
1135
|
+
/**
|
|
1136
|
+
* Short visual indicator for the slotType mix of a look — rendered as a
|
|
1137
|
+
* coloured chip in the MBQ Bucket - Fixture Combinations list. Returns
|
|
1138
|
+
* `null` for an empty look so the chip is hidden.
|
|
1139
|
+
*/
|
|
1140
|
+
fixtureTypeBadge(lookGroup) {
|
|
1141
|
+
const slots = lookGroup.get('fixtureSlots');
|
|
1142
|
+
if (!slots || slots.length === 0)
|
|
1143
|
+
return null;
|
|
1144
|
+
let hasShelf = false;
|
|
1145
|
+
let hasEuro = false;
|
|
1146
|
+
for (const c of slots.controls) {
|
|
1147
|
+
const t = c.get('slotType')?.value;
|
|
1148
|
+
if (t === 'eurocenter')
|
|
1149
|
+
hasEuro = true;
|
|
1150
|
+
else
|
|
1151
|
+
hasShelf = true;
|
|
1152
|
+
if (hasShelf && hasEuro)
|
|
1153
|
+
break;
|
|
1154
|
+
}
|
|
1155
|
+
if (hasShelf && hasEuro)
|
|
1156
|
+
return { label: 'Wall + Floor', cls: 'badge-mixed' };
|
|
1157
|
+
if (hasEuro)
|
|
1158
|
+
return { label: 'Floor', cls: 'badge-floor' };
|
|
1159
|
+
return { label: 'Wall', cls: 'badge-wall' };
|
|
1160
|
+
}
|
|
1056
1161
|
bucketKey(lookGroup) {
|
|
1057
1162
|
const keyType = lookGroup.get('keyType')?.value;
|
|
1058
1163
|
const key = keyType === 'brandCategory'
|
|
@@ -1195,10 +1300,10 @@ export class LookPlanoCollectionFormComponent {
|
|
|
1195
1300
|
this.planoDataService.fixtureTemplateDetails.next(null);
|
|
1196
1301
|
}
|
|
1197
1302
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LookPlanoCollectionFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i4.StoreBuilderService }, { token: i5.ToastService }, { token: i3.PageInfoService }, { token: i6.PlanoDataService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1198
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LookPlanoCollectionFormComponent, selector: "lib-look-plano-collection-form", ngImport: i0, template: "<section class=\"look-form\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n </span>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeLook(i)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"mbqBucket\" placeholder=\"e.g. JJ / OD Eye\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"brand\" placeholder=\"John Jacobs\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"fixtureLevelZone\" placeholder=\"Premium Trending\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:75vh!important;min-height:600px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField", "maxSelection", "compact", "extraActionLabel", "extraActionActive", "disabled"], outputs: ["extraActionClick"] }, { kind: "component", type: i9.TemplateProductsComponent, selector: "lib-template-products", inputs: ["looksMode"] }, { kind: "component", type: i10.SearchableSelectComponent, selector: "lib-searchable-select", inputs: ["items", "idField", "nameField", "searchField", "placeholder", "multiple", "compact"] }, { kind: "component", type: i11.ChipsInputComponent, selector: "lib-chips-input", inputs: ["placeholder", "allowDuplicates"] }, { kind: "component", type: i12.TemplateVmsComponent, selector: "lib-template-vms", inputs: ["looksMode"] }] });
|
|
1303
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LookPlanoCollectionFormComponent, selector: "lib-look-plano-collection-form", ngImport: i0, template: "<section class=\"look-form\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n </ng-container>\r\n </span>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeLook(i)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"mbqBucket\" placeholder=\"e.g. JJ / OD Eye\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n class=\"cad-header-variants-input\"\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"brand\" placeholder=\"John Jacobs\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"fixtureLevelZone\" placeholder=\"Premium Trending\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:85vh!important;min-height:720px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .fixture-type-badge{display:inline-block;flex-shrink:0;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:600;line-height:14px;letter-spacing:.2px;border:1px solid transparent;white-space:nowrap}.look-form .fixture-type-badge.badge-wall{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.look-form .fixture-type-badge.badge-floor{background:#fed7aa;color:#9a3412;border-color:#fdba74}.look-form .fixture-type-badge.badge-mixed{background:#ede9fe;color:#6d28d9;border-color:#c4b5fd}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .cad-header-variants-input{display:block}.look-form .cad-header-variants-input ::ng-deep .chips-input{max-height:84px;overflow-y:auto;align-content:flex-start;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField", "maxSelection", "compact", "extraActionLabel", "extraActionActive", "disabled"], outputs: ["extraActionClick"] }, { kind: "component", type: i9.TemplateProductsComponent, selector: "lib-template-products", inputs: ["looksMode"] }, { kind: "component", type: i10.SearchableSelectComponent, selector: "lib-searchable-select", inputs: ["items", "idField", "nameField", "searchField", "placeholder", "multiple", "compact"] }, { kind: "component", type: i11.ChipsInputComponent, selector: "lib-chips-input", inputs: ["placeholder", "allowDuplicates"] }, { kind: "component", type: i12.TemplateVmsComponent, selector: "lib-template-vms", inputs: ["looksMode"] }] });
|
|
1199
1304
|
}
|
|
1200
1305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LookPlanoCollectionFormComponent, decorators: [{
|
|
1201
1306
|
type: Component,
|
|
1202
|
-
args: [{ selector: 'lib-look-plano-collection-form', template: "<section class=\"look-form\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n </span>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeLook(i)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"mbqBucket\" placeholder=\"e.g. JJ / OD Eye\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"brand\" placeholder=\"John Jacobs\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"fixtureLevelZone\" placeholder=\"Premium Trending\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:75vh!important;min-height:600px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"] }]
|
|
1307
|
+
args: [{ selector: 'lib-look-plano-collection-form', template: "<section class=\"look-form\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n </ng-container>\r\n </span>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeLook(i)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"mbqBucket\" placeholder=\"e.g. JJ / OD Eye\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n class=\"cad-header-variants-input\"\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"brand\" placeholder=\"John Jacobs\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"fixtureLevelZone\" placeholder=\"Premium Trending\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:85vh!important;min-height:720px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .fixture-type-badge{display:inline-block;flex-shrink:0;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:600;line-height:14px;letter-spacing:.2px;border:1px solid transparent;white-space:nowrap}.look-form .fixture-type-badge.badge-wall{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.look-form .fixture-type-badge.badge-floor{background:#fed7aa;color:#9a3412;border-color:#fdba74}.look-form .fixture-type-badge.badge-mixed{background:#ede9fe;color:#6d28d9;border-color:#c4b5fd}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .cad-header-variants-input{display:block}.look-form .cad-header-variants-input ::ng-deep .chips-input{max-height:84px;overflow-y:auto;align-content:flex-start;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"] }]
|
|
1203
1308
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i4.StoreBuilderService }, { type: i5.ToastService }, { type: i3.PageInfoService }, { type: i6.PlanoDataService }] });
|
|
1204
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVd2RSxNQUFNLE9BQU8sZ0NBQWdDO0lBb1pqQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBMVpWLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDZCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ2IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsSUFBSSxDQUFhO0lBQ2pCLGlCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9CLGlCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBRS9CLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsZ0ZBQWdGO0lBQ3ZFLGtCQUFrQixHQUFHO1FBQzVCLEVBQUUsRUFB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LFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO3dHQTV0Q1UsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0Msc0VDZDdDLDAwZEF3U0E7OzRGRDFSYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rLXBsYW5vLWNvbGxlY3Rpb24tZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2xvb2stcGxhbm8tY29sbGVjdGlvbi1mb3JtLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkID0gJyc7XHJcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpc05ldyA9IHRydWU7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG5cclxuICBmb3JtITogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkTG9va0luZGV4OiBudW1iZXIgPSAtMTtcclxuICBzZWxlY3RlZFNsb3RJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vIERpc3BsYXkgbGFiZWxzIGFyZSBXYWxsIC8gRmxvb3I7IHRoZSBzdG9yZWQgaWRzIHN0YXkgJ3NoZWxmJyAvICdldXJvY2VudGVyJ1xyXG4gIC8vIHNvIHRoZSBsaWJyYXJ5IGZpbHRlciwgc2xvdCBkZWZhdWx0cywgYW5kIHRoZSBiYWNrZW5kIHNsb3RUeXBlL2ZpeHR1cmVUeXBlXHJcbiAgLy8gZW51bXMga2VlcCB3b3JraW5nIHVuY2hhbmdlZCAoJ3NoZWxmJyDihpIgd2FsbCBmaXh0dXJlcywgJ2V1cm9jZW50ZXInIOKGkiBmbG9vcikuXHJcbiAgcmVhZG9ubHkgZml4dHVyZVR5cGVPcHRpb25zID0gW1xyXG4gICAgeyBpZDogJ3NoZWxmJywgbmFtZTogJ1dhbGwnIH0sXHJcbiAgICB7IGlkOiAnZXVyb2NlbnRlcicsIG5hbWU6ICdGbG9vcicgfSxcclxuICBdO1xyXG5cclxuICBmaXh0dXJlTGlicmFyeUl0ZW1zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gRHJvcGRvd25zIGluc2lkZSBwbGFjZW1lbnQgcm93cy5cclxuICB2bVR5cGVPcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgdm1BcnR3b3JrT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyB2bVR5cGU/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgcHJvZHVjdE9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICAvKiogQ2FjaGVkIHBlci12bVR5cGUgYXJ0d29yayBsaXN0IOKAlCBzYW1lIHJlZmVyZW5jZSByZXR1cm5lZCBlYWNoIGxvb2t1cCBzb1xyXG4gICAqICBsaWItcmVhY3RpdmUtc2VsZWN0IGRvZXNuJ3QgcmVzZXQgc3RhdGUgZXZlcnkgQ0QgY3ljbGUuICovXHJcbiAgcHJpdmF0ZSB2bUFydHdvcmtCeVR5cGU6IE1hcDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiAodm1OYW1lfHx2bVR5cGUpIGFuZCAodm1OYW1lKSDihpIgcGxhbm92bSBfaWQsIHNvIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29ya1xyXG4gICAqICBuYW1lIGNhbiBiZSByZXNvbHZlZCB0byB0aGUgX2lkIHRoZSBlbWJlZGRlZCBWTSBlZGl0b3IgbWF0Y2hlcyBhZ2FpbnN0LiAqL1xyXG4gIHByaXZhdGUgdm1JZEJ5TmFtZVR5cGU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGVkIGZpbHRlcmVkIGxpc3QgYm91bmQgdG8gdGhlIFwiRml4dHVyZSBsaWJyYXJpZXNcIiBtdWx0aXNlbGVjdC5cclxuICAgKiBNdXN0IE5PVCBiZSBhIGdldHRlciDigJQgdGhlIHVuZGVybHlpbmcgbXVsdGlzZWxlY3QgcmUtY2xvbmVzIGl0cyBpdGVtcyBvblxyXG4gICAqIGV2ZXJ5IG5nT25DaGFuZ2VzLCB3aGljaCBkZXRhY2hlcyBjbGljayB0YXJnZXRzIGFuZCBicmVha3Mgc2VsZWN0aW9uLlxyXG4gICAqL1xyXG4gIGZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90OiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gU3RhdGUgZm9yIHRoZSBwZXItc2xvdCBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkLlxyXG4gIHNlbGVjdGVkTGlicmFyeUlkSW5NYXA6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkTGlicmFyeURldGFpbHM6IGFueSA9IG51bGw7XHJcbiAgbG9hZGluZ0xpYnJhcnlEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW1iZWRkZWRUYWI6ICdwcm9kdWN0cycgfCAndm1zJyA9ICdwcm9kdWN0cyc7XHJcblxyXG4gIC8vID09PSBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkIGhlbHBlcnMgPT09XHJcblxyXG4gIC8qKiBTbG90J3MgcGxhY2VtZW50cyB3aXRoIGtpbmQgPSAndm0nLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFZtSXRlbXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNlbWVudHNUb0l0ZW1zKCd2bScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNsb3QncyBwbGFjZW1lbnRzIHdpdGgga2luZCA9ICdwaWQnLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFBpZEl0ZW1zKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnRzVG9JdGVtcygncGlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBsYWNlbWVudHNUb0l0ZW1zKGtpbmQ6ICd2bScgfCAncGlkJyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3QgYXJyID0gc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgaWYgKCFhcnIpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBhcnIuY29udHJvbHNcclxuICAgICAgICAubWFwKChjKSA9PiBjLnZhbHVlKVxyXG4gICAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcD8ua2luZCA9PT0ga2luZCAmJiBwPy5wb3NpdGlvbilcclxuICAgICAgICAubWFwKChwOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBpZDogcC5wb3NpdGlvbixcclxuICAgICAgICAgIG5hbWU6IHAucmF3VmFsdWUgPyBgJHtwLnBvc2l0aW9ufSDigJQgJHtwLnJhd1ZhbHVlfWAgOiBwLnBvc2l0aW9uLFxyXG4gICAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKiBGaXh0dXJlLWxpYnJhcnkgb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duIOKAlCBmaWx0ZXJlZCB0byB0aGUgbGlicmFyaWVzXHJcbiAgICogIHNlbGVjdGVkIG9uIHRoZSBjdXJyZW50bHktYWN0aXZlIHNsb3QncyBtdWx0aXNlbGVjdC4gKi9cclxuICBnZXQgc2VsZWN0ZWRTbG90TGlicmFyaWVzRm9yRHJvcGRvd24oKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gW107XHJcbiAgICBjb25zdCByZWZzOiBzdHJpbmdbXSA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW107XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gcmVmcy5pbmNsdWRlcyhpdGVtLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEZvcm1BcnJheSB0aGF0IHN0b3JlcyBwZXItKGxpYnJhcnksIHNoZWxmKSBWTS9QSUQgdmFsdWVzIGZvciB0aGUgYWN0aXZlIHNsb3QuICovXHJcbiAgZ2V0IHNlbGVjdGVkU2xvdExpYnJhcnlDb25maWdzKCk6IEZvcm1BcnJheSB8IG51bGwge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICByZXR1cm4gc2xvdCA/IChzbG90LmdldCgnbGlicmFyeUNvbmZpZ3VyYXRpb25zJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogRm9ybS1hcnJheSBlbnRyaWVzIHNjb3BlZCB0byB0aGUgY3VycmVudGx5LXNob3duIGxpYnJhcnkgaW4gdGhlIGNvbmZpZyBjYXJkLiAqL1xyXG4gIGNvbmZpZ0VudHJpZXNGb3JDdXJyZW50TGlicmFyeSgpOiB7IGNvbnRyb2w6IEZvcm1Hcm91cDsgYXJyYXlJbmRleDogbnVtYmVyIH1bXSB7XHJcbiAgICBjb25zdCBjb25maWdzID0gdGhpcy5zZWxlY3RlZFNsb3RMaWJyYXJ5Q29uZmlncztcclxuICAgIGlmICghY29uZmlncyB8fCAhdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gY29uZmlncy5jb250cm9sc1xyXG4gICAgICAgIC5tYXAoKGMsIGkpID0+ICh7IGNvbnRyb2w6IGMgYXMgRm9ybUdyb3VwLCBhcnJheUluZGV4OiBpIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguY29udHJvbC5nZXQoJ2xpYnJhcnlSZWYnKT8udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzZXQgY2FyZCBzdGF0ZSB3aGVuZXZlciB0aGUgYWN0aXZlIHNsb3QgY2hhbmdlcyBzbyB3ZSBkb24ndCBjYXJyeSBvdmVyXHJcbiAgICogIHN0YWxlIHNlbGVjdGlvbnMgZnJvbSBhIHByZXZpb3VzbHktdmlld2VkIHNsb3QuICovXHJcbiAgcHJpdmF0ZSByZXNldExpYnJhcnlNYXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSAnJztcclxuICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA9IG51bGw7XHJcbiAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAvLyBDbGVhciB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCB0b28gc28gdGhlIGVtYmVkZGVkIFRlbXBsYXRlUHJvZHVjdHMgL1xyXG4gICAgLy8gVGVtcGxhdGVWbXMgY29tcG9uZW50cywgaWYgdGhleSdyZSBzdGlsbCBtb3VudGVkLCBkb24ndCByZW5kZXIgc3RhbGVcclxuICAgIC8vIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgc2xvdCdzIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZW4gYSBzbG90IGlzIGxvYWRlZCwgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBsaWJyYXJ5IGl0IGhhcyBsaW5rZWRcclxuICAgKiAgc28gdGhlIGVtYmVkZGVkIGZpeHR1cmUtdGVtcGxhdGUgZWRpdG9yIG9wZW5zIHN0cmFpZ2h0IHRvIHRoYXQgbGlicmFyeS4gKi9cclxuICBwcml2YXRlIGF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVmczogc3RyaW5nW10gPSBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWZzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZmlyc3RJZCA9IHJlZnMuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgaWYgKCFmaXJzdElkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBmaXJzdElkKSByZXR1cm47XHJcbiAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdChmaXJzdElkKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIHRoZSBzbG90J3Mgc2F2ZWQgc25hcHNob3QgZm9yIGEgbGlicmFyeSwgaWYgYW55LiAqL1xyXG4gIHByaXZhdGUgZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkOiBzdHJpbmcpOiBhbnkgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNuYXBzOiBhbnlbXSA9IHNsb3QuZ2V0KCdsaWJyYXJ5U25hcHNob3RzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZW50cnkgPSBzbmFwcy5maW5kKChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICByZXR1cm4gZW50cnk/LnNuYXBzaG90IHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyc2lzdCBhIHNuYXBzaG90IGludG8gdGhlIHNsb3QncyBsaWJyYXJ5U25hcHNob3RzIEZvcm1Db250cm9sLiAqL1xyXG4gIHByaXZhdGUgY2FwdHVyZUxpYnJhcnlTbmFwc2hvdChsaWJJZDogc3RyaW5nLCBzbmFwc2hvdDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCB8fCAhbGliSWQpIHJldHVybjtcclxuICAgIGNvbnN0IGN0cmwgPSBzbG90LmdldCgnbGlicmFyeVNuYXBzaG90cycpO1xyXG4gICAgaWYgKCFjdHJsKSByZXR1cm47XHJcbiAgICBjb25zdCBjdXJyZW50OiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoY3RybC52YWx1ZSkgPyBbLi4uY3RybC52YWx1ZV0gOiBbXTtcclxuICAgIC8vIFN0cmlwIHRoZSBpZ25vcmVVcGRhdGUgZmxhZyBiZWZvcmUgc2F2aW5nIHNvIHdlIGRvbid0IGVjaG8gaXQgYmFjayBsYXRlci5cclxuICAgIGNvbnN0IHsgaWdub3JlVXBkYXRlOiBfaWdub3JlZCwgLi4uY2xlYW4gfSA9IHNuYXBzaG90IHx8IHt9O1xyXG4gICAgY29uc3QgaSA9IGN1cnJlbnQuZmluZEluZGV4KChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIGN1cnJlbnRbaV0gPSB7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1cnJlbnQucHVzaCh7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfSk7XHJcbiAgICB9XHJcbiAgICBjdHJsLnNldFZhbHVlKGN1cnJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmUgYSBWTSBwbGFjZW1lbnQncyBhcnR3b3JrIE5BTUUgKCsgdm1UeXBlKSB0byBpdHMgcGxhbm92bSBfaWQuICovXHJcbiAgcHJpdmF0ZSByZXNvbHZlVm1JZCh2bU5hbWU6IHN0cmluZywgdm1UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMubm9ybVZtVHlwZSh2bU5hbWUpO1xyXG4gICAgY29uc3QgdHlwZSA9IHRoaXMubm9ybVZtVHlwZSh2bVR5cGUpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy52bUlkQnlOYW1lVHlwZS5nZXQoYCR7bmFtZX18fCR7dHlwZX1gKSB8fFxyXG4gICAgICB0aGlzLnZtSWRCeU5hbWVUeXBlLmdldChuYW1lKSB8fFxyXG4gICAgICB2bU5hbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZS1kZXJpdmUgZXZlcnkgYXNzaWduZWQgbGlicmFyeSdzIHNuYXBzaG90IGZyb20gdGhlIGFjdGl2ZSBzbG90J3NcclxuICAgKiBjdXJyZW50IHBsYWNlbWVudHMuIERyaXZlbiBieSB0aGUgXCJMb29rIGFuZCBWaXN1YWwgTWVyY2hhbmRpc2luZ1xyXG4gICAqIFBsYWNlbWVudHNcIiBsaXN0IOKAlCBzbyBlZGl0aW5nIG9uZSBwbGFjZW1lbnQgdXBkYXRlcyBBTEwgYXNzaWduZWRcclxuICAgKiBsaWJyYXJpZXMgYXQgb25jZS5cclxuICAgKlxyXG4gICAqICAtIFBJRCBwbGFjZW1lbnRzOiBgcG9zaXRpb25gIChUb3AvTWlkL0JvdHRvbSkg4oaSIHNoZWxmIHpvbmU7IHRoZSBzaGVsZidzXHJcbiAgICogICAgcHJvZHVjdEJyYW5kTmFtZSBpcyBPVkVSV1JJVFRFTiB3aXRoIHRoZSBwbGFjZW1lbnQncyBwcm9kdWN0IGxpc3QuXHJcbiAgICogIC0gVk0gcGxhY2VtZW50czogYHBvc2l0aW9uYCDihpIgdm1UeXBlOyB0aGUgbWF0Y2hpbmcgdm1Db25maWcgZW50cnknc1xyXG4gICAqICAgIGFydHdvcmsgKHZtSWQvdm1OYW1lKSBpcyB1cGRhdGVkIHdoaWxlIHRoZSBsaWJyYXJ5IGtlZXBzIGl0cyBvd24gVk1cclxuICAgKiAgICBwb3NpdGlvbnMuIHZtVHlwZXMgbm90IHlldCBwcmVzZW50IGFyZSBhcHBlbmRlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5UGxhY2VtZW50c1RvQXNzaWduZWRMaWJyYXJpZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVmczogc3RyaW5nW10gPSAoc2xvdC5nZXQoJ2ZpeHR1cmVMaWJyYXJ5UmVmcycpPy52YWx1ZSB8fCBbXSlcclxuICAgICAgICAuZmlsdGVyKChyOiBzdHJpbmcpID0+ICEhcik7XHJcbiAgICBpZiAoIXJlZnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcGxhY2VtZW50czogYW55W10gPSAoc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkgfCBudWxsKT8udmFsdWUgfHwgW107XHJcbiAgICBjb25zdCBub3JtID0gKHM6IGFueSk6IHN0cmluZyA9PiBTdHJpbmcocyA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgLy8gem9uZSAtPiBwcm9kdWN0IGxpc3QgKFBJRHMpOyBzdXBwb3J0cyBib3RoIHJhd1ZhbHVlc1tdIGFuZCBsZWdhY3kgcmF3VmFsdWUuXHJcbiAgICBjb25zdCBwaWRCeVpvbmUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XHJcbiAgICBmb3IgKGNvbnN0IHAgb2YgcGxhY2VtZW50cykge1xyXG4gICAgICBpZiAocD8ua2luZCAhPT0gJ3BpZCcgfHwgIXA/LnBvc2l0aW9uKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgdmFsczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHAucmF3VmFsdWVzKSAmJiBwLnJhd1ZhbHVlcy5sZW5ndGhcclxuICAgICAgICA/IHAucmF3VmFsdWVzLmZpbHRlcigodjogc3RyaW5nKSA9PiAhIXYpXHJcbiAgICAgICAgOiAocC5yYXdWYWx1ZSA/IFsgU3RyaW5nKHAucmF3VmFsdWUpIF0gOiBbXSk7XHJcbiAgICAgIGlmICh2YWxzLmxlbmd0aCkgcGlkQnlab25lLnNldChub3JtKHAucG9zaXRpb24pLCB2YWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB2bVR5cGUgLT4geyB2bUlkLCB2bU5hbWUsIGxhYmVsIH0gKFZNcylcclxuICAgIGNvbnN0IHZtQnlUeXBlID0gbmV3IE1hcDxzdHJpbmcsIHsgdm1JZDogc3RyaW5nOyB2bU5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBsYWNlbWVudHMpIHtcclxuICAgICAgaWYgKHA/LmtpbmQgIT09ICd2bScgfHwgIXA/LnBvc2l0aW9uIHx8ICFwPy5yYXdWYWx1ZSkgY29udGludWU7XHJcbiAgICAgIGNvbnN0IGxhYmVsID0gU3RyaW5nKHAucG9zaXRpb24pO1xyXG4gICAgICB2bUJ5VHlwZS5zZXQobm9ybShsYWJlbCksIHtcclxuICAgICAgICB2bUlkOiB0aGlzLnJlc29sdmVWbUlkKFN0cmluZyhwLnJhd1ZhbHVlKSwgbGFiZWwpLFxyXG4gICAgICAgIHZtTmFtZTogU3RyaW5nKHAucmF3VmFsdWUpLFxyXG4gICAgICAgIGxhYmVsLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGxpYklkIG9mIHJlZnMpIHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpO1xyXG4gICAgICBpZiAoIXRhcmdldCkgY29udGludWU7IC8vIHNlZWQgY3JlYXRlcyBvbmUgcGVyIGFzc2lnbmVkIGxpYnJhcnlcclxuXHJcbiAgICAgIGNvbnN0IHNoZWx2ZXM6IGFueVtdID0gQXJyYXkuaXNBcnJheSh0YXJnZXQuc2hlbGZDb25maWcpID8gdGFyZ2V0LnNoZWxmQ29uZmlnIDogW107XHJcbiAgICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbHZlcy5tYXAoKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB6b25lID0gbm9ybShzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwpO1xyXG4gICAgICAgIGlmICghem9uZSB8fCAhcGlkQnlab25lLmhhcyh6b25lKSkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5zaGVsZixcclxuICAgICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNoZWxmPy5sYWJlbCB8fCAnJyxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFsgLi4ucGlkQnlab25lLmdldCh6b25lKSEgXSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVm1zOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0LnZtQ29uZmlnKSA/IHRhcmdldC52bUNvbmZpZyA6IFtdO1xyXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IG5ld1ZtQ29uZmlnID0gZXhpc3RpbmdWbXMubWFwKCh2bTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbm9ybSh2bT8udm1UeXBlKTtcclxuICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICAgIGNvbnN0IHVwZCA9IHZtQnlUeXBlLmdldChrZXkpO1xyXG4gICAgICAgIHJldHVybiB1cGQgPyB7IC4uLnZtLCB2bUlkOiB1cGQudm1JZCwgdm1OYW1lOiB1cGQudm1OYW1lIH0gOiB2bTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvciAoY29uc3QgWyBrZXksIHVwZCBdIG9mIHZtQnlUeXBlKSB7XHJcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnLnB1c2goe1xyXG4gICAgICAgICAgdm1UeXBlOiB1cGQubGFiZWwsXHJcbiAgICAgICAgICB2bUlkOiB1cGQudm1JZCxcclxuICAgICAgICAgIHZtTmFtZTogdXBkLnZtTmFtZSxcclxuICAgICAgICAgIHN0YXJ0WVBvc2l0aW9uOiAxLFxyXG4gICAgICAgICAgZW5kWVBvc2l0aW9uOiAxLFxyXG4gICAgICAgICAgeFpvbmU6ICcnLFxyXG4gICAgICAgICAgeVpvbmU6ICcnLFxyXG4gICAgICAgICAgcG9zaXRpb246ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNhcHR1cmVMaWJyYXJ5U25hcHNob3QobGliSWQsIHtcclxuICAgICAgICAuLi50YXJnZXQsXHJcbiAgICAgICAgc2hlbGZDb25maWc6IG5ld1NoZWxmQ29uZmlnLFxyXG4gICAgICAgIHZtQ29uZmlnOiBuZXdWbUNvbmZpZyxcclxuICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiAnTDMnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZWZsZWN0IHRoZSBjaGFuZ2UgaW4gdGhlIGN1cnJlbnRseS1vcGVuIGVtYmVkZGVkIGVkaXRvci5cclxuICAgIHRoaXMucmVsb2FkRGlzcGxheWVkTGlicmFyeSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3VudCB0aGUgZW1iZWRkZWQgZWRpdG9yIGZvciB0aGUgYWN0aXZlIGxpYnJhcnkgc28gaXQgcGlja3MgdXAgdGhlXHJcbiAgICogc25hcHNob3Qgd2UganVzdCByZXdyb3RlLiBUaGUgZW1iZWRkZWQgY29tcG9uZW50cyBndWFyZCBhZ2FpbnN0IHJlLWluaXRcclxuICAgKiB3aGlsZSBtb3VudGVkLCBzbyB3ZSB0b2dnbGUgdGhlIGhvc3Qga2V5IG9mZiB0aGVuIG9uIHRvIGZvcmNlIGEgZnJlc2hcclxuICAgKiBuZ09uSW5pdCB3aXRoIHRoZSB1cGRhdGVkIGRhdGEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWxvYWREaXNwbGF5ZWRMaWJyYXJ5KCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGliSWQgPSB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXA7XHJcbiAgICBpZiAoIWxpYklkKSByZXR1cm47XHJcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpO1xyXG4gICAgaWYgKCF1cGRhdGVkKSByZXR1cm47XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeURldGFpbHMgPSB1cGRhdGVkO1xyXG4gICAgLy8gUHVzaCB0aGUgZnJlc2ggc25hcHNob3QsIHRoZW4gYnVtcCB0aGUgbm9uY2Ugc28gcmVmcmVzaEVtYmVkZGVkSG9zdEtleXNcclxuICAgIC8vIHByb2R1Y2VzIGEgTkVXIGtleSDigJQgdGhhdCdzIHdoYXQgYWN0dWFsbHkgZm9yY2VzIHRoZSAqbmdGb3IgdG8gZGVzdHJveVxyXG4gICAgLy8gdGhlIG9sZCBlbWJlZGRlZCBlZGl0b3IgYW5kIG1vdW50IGEgbmV3IG9uZSB0aGF0IHJlLXJlYWRzIHRoZSBzbmFwc2hvdC5cclxuICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQoe1xyXG4gICAgICAuLi51cGRhdGVkLFxyXG4gICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiB1cGRhdGVkLnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgfHwgJ0wzJyxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lbWJlZGRlZFJlbG9hZE5vbmNlKys7XHJcbiAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkxpYnJhcnlNYXBTZWxlY3QobGliSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVG9nZ2xpbmcgdGhlIGFjdGl2ZSBjaGlwIG9mZiDihpIgY2xlYXIgaW1tZWRpYXRlbHkgKG5vIGFzeW5jIHdvcmsgbmVlZGVkKS5cclxuICAgIGlmICghbGliSWQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwID0gJyc7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA9IG51bGw7XHJcbiAgICAgIHRoaXMucmVmcmVzaEVtYmVkZGVkSG9zdEtleXMoKTtcclxuICAgICAgdGhpcy5wbGFub0RhdGFTZXJ2aWNlLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dChudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBjaGlwOiBsaWdodCB0aGUgbmV3IGNoaXAgdXAgcmlnaHQgYXdheSwgYnV0XHJcbiAgICAvLyBLRUVQIHRoZSBwcmV2aW91cyBsaWJyYXJ5J3MgZW1iZWRkZWQgcHJldmlldyBtb3VudGVkIHdoaWxlIHdlIGZldGNoXHJcbiAgICAvLyB0aGUgbmV3IHNuYXBzaG90L2RldGFpbHMuIE90aGVyd2lzZSB0aGUgY2FyZCB3b3VsZCBjb2xsYXBzZSB0byBpdHNcclxuICAgIC8vIGhlYWRlciBoZWlnaHQgZHVyaW5nIHRoZSBmZXRjaCBhbmQgcmUtZXhwYW5kIG9uY2UgbmV3IGRhdGEgbGFuZHMg4oCUXHJcbiAgICAvLyB2aXNpYmxlIGFzIGEgXCJjcnVuY2hcIiB0aGUgdXNlciByZXBvcnRlZC5cclxuICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9IGxpYklkO1xyXG4gICAgdGhpcy5sb2FkaW5nTGlicmFyeURldGFpbHMgPSB0cnVlO1xyXG5cclxuICAgIGxldCBuZXdEZXRhaWxzOiBhbnkgPSBudWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gSWYgYW4gYXV0by1hcHBseSBmb3IgdGhpcyBsaWJyYXJ5IGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yIGl0IHNvXHJcbiAgICAgIC8vIHdlIGRvbid0IGJlYXQgaXQgdG8gdGhlIHNuYXBzaG90IGFuZCByZW5kZXIgdGhlIHVuLWZpbGxlZCBsaWJyYXJ5LlxyXG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5hdXRvQXBwbHlJbkZsaWdodC5nZXQobGliSWQpO1xyXG4gICAgICBpZiAocGVuZGluZykge1xyXG4gICAgICAgIHRyeSB7IGF3YWl0IHBlbmRpbmc7IH0gY2F0Y2ggKF9lKSB7IC8qIGlnbm9yZSAqLyB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgc2F2ZWQgPSB0aGlzLmdldExpYnJhcnlTbmFwc2hvdChsaWJJZCk7XHJcbiAgICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIG5ld0RldGFpbHMgPSBzYXZlZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJyYXJ5RGV0YWlscyhsaWJJZCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBuZXdEZXRhaWxzID0gcmVzPy5kYXRhIHx8IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBvbkxpYnJhcnlNYXBTZWxlY3QgW0VSUl06JywgZXJyKTtcclxuICAgICAgbmV3RGV0YWlscyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXRvbWljIHN3YXAg4oCUIHNlbGVjdGVkTGlicmFyeURldGFpbHMsIEJlaGF2aW9yU3ViamVjdCwgYW5kIHRoZVxyXG4gICAgLy8gbmdGb3IgaG9zdCBrZXkgYWxsIGZsaXAgaW4gb25lIHN5bmNocm9ub3VzIGJsb2NrLCBzbyBBbmd1bGFyIGRlc3Ryb3lzXHJcbiAgICAvLyB0aGUgb2xkIGVtYmVkZGVkIGNvbXBvbmVudCBhbmQgbW91bnRzIHRoZSBuZXcgb25lIGluIHRoZSBzYW1lIGNoYW5nZVxyXG4gICAgLy8gZGV0ZWN0aW9uIGN5Y2xlLiBObyBlbXB0eS1zdGF0ZSBpbiBiZXR3ZWVuIOKGkiBubyBjYXJkLWhlaWdodCBjcnVuY2guXHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeURldGFpbHMgPSBuZXdEZXRhaWxzO1xyXG4gICAgaWYgKG5ld0RldGFpbHMpIHtcclxuICAgICAgdGhpcy5wbGFub0RhdGFTZXJ2aWNlLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dCh7XHJcbiAgICAgICAgLi4ubmV3RGV0YWlscyxcclxuICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBuZXdEZXRhaWxzLnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgfHwgJ0wzJyxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpO1xyXG4gICAgdGhpcy5sb2FkaW5nTGlicmFyeURldGFpbHMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBvc2l0ZSBrZXkgdGllZCB0byB0aGUgY3VycmVudGx5LWFjdGl2ZSAobG9vaywgc2xvdCwgbGlicmFyeSkgdHJpcGxlLlxyXG4gICAqIFN0YWJsZSBwcm9wZXJ0eSDigJQgcmVjb21wdXRlZCBvbmx5IHdoZW4gdGhlIHVuZGVybHlpbmcgc2VsZWN0aW9uIGNoYW5nZXNcclxuICAgKiAoc2VlIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCkpLiBBdm9pZHMgcmV0dXJuaW5nIGEgbmV3IGFycmF5IHJlZmVyZW5jZVxyXG4gICAqIGV2ZXJ5IENEIGN5Y2xlLCB3aGljaCB1c2VkIHRvIHJpcHBsZSBpbnRvIG90aGVyIG11bHRpLXNlbGVjdHMnIGlucHV0cy5cclxuICAgKi9cclxuICBlbWJlZGRlZEhvc3RLZXk6IHN0cmluZyA9ICcnO1xyXG4gIGVtYmVkZGVkSG9zdEtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gQnVtcGVkIGJ5IHJlbG9hZERpc3BsYXllZExpYnJhcnkoKSB0byBmb3JjZSB0aGUgZW1iZWRkZWQgZWRpdG9yIHRvIHJlbW91bnRcclxuICAvLyBldmVuIHdoZW4gbG9vay9zbG90L2xpYnJhcnkgYXJlIHVuY2hhbmdlZCAoYSBzYW1lLWtleSByb3VuZC10cmlwIHZpYSB0aGVcclxuICAvLyAqbmdGb3IgdHJhY2tCeSBkb2VzIE5PVCByZW1vdW50OyBhIGNoYW5nZWQga2V5IGRvZXMpLlxyXG4gIHByaXZhdGUgZW1iZWRkZWRSZWxvYWROb25jZSA9IDA7XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaEVtYmVkZGVkSG9zdEtleXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLnNlbGVjdGVkTG9va0luZGV4fS0ke3RoaXMuc2VsZWN0ZWRTbG90SW5kZXh9LSR7dGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwfS0ke3RoaXMuZW1iZWRkZWRSZWxvYWROb25jZX1gO1xyXG4gICAgaWYgKGtleSAhPT0gdGhpcy5lbWJlZGRlZEhvc3RLZXkpIHtcclxuICAgICAgdGhpcy5lbWJlZGRlZEhvc3RLZXkgPSBrZXk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID8gW3RoaXMuZW1iZWRkZWRIb3N0S2V5XSA6IFtdO1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZW1iZWRkZWRIb3N0S2V5cztcclxuICAgIC8vIE9ubHkgYXNzaWduIGEgbmV3IGFycmF5IGlmIHRoZSBjb250ZW50cyBkaWZmZXIg4oCUIG90aGVyd2lzZSB0aGUgbmdGb3Igc2Vlc1xyXG4gICAgLy8gYSBcIm5ld1wiIGFycmF5IGVhY2ggQ0QgYW5kIHRyYWNrQnkgc3RpbGwgaGFzIHRvIGNvbXBhcmUgZXZlcnkgZW50cnkuXHJcbiAgICBpZiAobmV4dC5sZW5ndGggIT09IGN1cnJlbnQubGVuZ3RoIHx8IG5leHRbMF0gIT09IGN1cnJlbnRbMF0pIHtcclxuICAgICAgdGhpcy5lbWJlZGRlZEhvc3RLZXlzID0gbmV4dDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyYWNrQnlFbWJlZGRlZEtleShfOiBudW1iZXIsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBrZXk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2xvdC10eXBlIGRyb3Bkb3duIGluIHRoZSByaWdodCBwYW5lIG9ubHkgb2ZmZXJzIHZhbHVlcyB0aGF0IHRoZVxyXG4gICAqIHBhcmVudCBMb29rIGhhcyBzZWxlY3RlZCBpbiBpdHMgRml4dHVyZSBUeXBlIG11bHRpc2VsZWN0LiBJZiBub3RoaW5nIGlzXHJcbiAgICogc2VsZWN0ZWQgeWV0LCBmYWxsIGJhY2sgdG8gc2hvd2luZyBhbGwgb3B0aW9ucyBzbyB0aGUgdXNlciBpc24ndCBibG9ja2VkLlxyXG4gICAqL1xyXG4gIGdldCBhdmFpbGFibGVTbG90VHlwZXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIGNvbnN0IGxvb2tHcm91cCA9IHRoaXMuc2VsZWN0ZWRMb29rR3JvdXA7XHJcbiAgICBpZiAoIWxvb2tHcm91cCkgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBsb29rR3JvdXAuZ2V0KCdmaXh0dXJlVHlwZScpPy52YWx1ZSBhcyBzdHJpbmdbXSB8IG51bGw7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpIHx8IHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5maXh0dXJlVHlwZU9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlVHlwZU9wdGlvbnMuZmlsdGVyKChvcHQpID0+IHNlbGVjdGVkLmluY2x1ZGVzKG9wdC5pZCkpO1xyXG4gIH1cclxuXHJcbiAgLy8gMjAgdmVyeSBtaWxkIHBhc3RlbHMgKGFsbCBUYWlsd2luZC01MCAvIDEwMCByYW5nZSkgYXJyYW5nZWQgc28gYWRqYWNlbnRcclxuICAvLyBwYWxldHRlIHNsb3RzIGFyZSBvbiBvcHBvc2l0ZSBzaWRlcyBvZiB0aGUgY29sb3VyIHdoZWVsIGZvciBkaXN0aW5ndWlzaC1cclxuICAvLyBhYmlsaXR5IHdpdGhvdXQgYW55IGNvbG91ciBmZWVsaW5nIHNhdHVyYXRlZC5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCVUNLRVRfUEFMRVRURTogcmVhZG9ubHkgc3RyaW5nW10gPSBbXHJcbiAgICAnI2ZlZjJmMicsIC8vICAxIEJsdXNoICAgICAgICAgIHJlZC01MFxyXG4gICAgJyNmMGZkZmEnLCAvLyAgMiBNaW50IFdoaXNwZXIgICB0ZWFsLTUwICAgIChvcHBvc2l0ZSBvZiByZWQpXHJcbiAgICAnI2ZmZjdlZCcsIC8vICAzIEFwcmljb3QgICAgICAgIG9yYW5nZS01MFxyXG4gICAgJyNlZWYyZmYnLCAvLyAgNCBJcmlzICAgICAgICAgICBpbmRpZ28tNTAgIChvcHBvc2l0ZSBvZiBvcmFuZ2UpXHJcbiAgICAnI2ZlZmNlOCcsIC8vICA1IEJ1dHRlciAgICAgICAgIHllbGxvdy01MFxyXG4gICAgJyNmYWY1ZmYnLCAvLyAgNiBMYXZlbmRlciAgICAgICBwdXJwbGUtNTAgIChvcHBvc2l0ZSBvZiB5ZWxsb3cpXHJcbiAgICAnI2YwZmRmNCcsIC8vICA3IFNwcmluZyAgICAgICAgIGdyZWVuLTUwXHJcbiAgICAnI2ZmZjFmMicsIC8vICA4IFJvc2UgUGV0YWwgICAgIHJvc2UtNTAgICAgKG9wcG9zaXRlIG9mIGdyZWVuKVxyXG4gICAgJyNlY2ZlZmYnLCAvLyAgOSBTa3kgVGludCAgICAgICBjeWFuLTUwXHJcbiAgICAnI2ZmZWRkNScsIC8vIDEwIFBlYWNoICAgICAgICAgIG9yYW5nZS0xMDBcclxuICAgICcjZWZmNmZmJywgLy8gMTEgUG93ZGVyIEJsdWUgICAgYmx1ZS01MFxyXG4gICAgJyNmMGY5ZmYnLCAvLyAxMiBTa3kgICAgICAgICAgICBza3ktNTAgICAgIChvcHBvc2l0ZSBvZiBvcmFuZ2UpXHJcbiAgICAnI2Y1ZjNmZicsIC8vIDEzIFZpb2xldCBNaXN0ICAgIHZpb2xldC01MFxyXG4gICAgJyNmN2ZlZTcnLCAvLyAxNCBMaW1lIFdoaXNwZXIgICBsaW1lLTUwICAgIChvcHBvc2l0ZSBvZiB2aW9sZXQpXHJcbiAgICAnI2ZkZjRmZicsIC8vIDE1IExpbGFjICAgICAgICAgIGZ1Y2hzaWEtNTBcclxuICAgICcjZWNmZGY1JywgLy8gMTYgTWludCAgICAgICAgICAgZW1lcmFsZC01MFxyXG4gICAgJyNmZGYyZjgnLCAvLyAxNyBQZXRhbCBQaW5rICAgICBwaW5rLTUwXHJcbiAgICAnI2ZmZmJlYicsIC8vIDE4IEhvbmV5ICAgICAgICAgIGFtYmVyLTUwXHJcbiAgICAnI2YxZjVmOScsIC8vIDE5IENsb3VkICAgICAgICAgIHNsYXRlLTEwMFxyXG4gICAgJyNmNWY1ZjQnLCAvLyAyMCBMaW5lbiAgICAgICAgICBzdG9uZS0xMDBcclxuICBdO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBsYW5vRGF0YVNlcnZpY2U6IFBsYW5vRGF0YVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcclxuICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuXHJcbiAgICAvLyBMaXN0ZW4gdG8gdGhlIHNoYXJlZCBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzIOKAlCB3aGVuIHRoZSBlbWJlZGRlZFxyXG4gICAgLy8gVGVtcGxhdGVQcm9kdWN0cy9UZW1wbGF0ZVZtcyBjb21wb25lbnRzIHB1c2ggZWRpdHMgYmFjayBpbnRvIHRoZVxyXG4gICAgLy8gQmVoYXZpb3JTdWJqZWN0LCBwZXJzaXN0IGEgc25hcHNob3QgdW5kZXIgdGhlIGFjdGl2ZSBzbG90ICsgbGlicmFyeS5cclxuICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhIHx8ICF0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXApIHJldHVybjtcclxuICAgICAgICAvLyBPbmx5IGNhcHR1cmUgdXNlciBlZGl0cywgbm90IHRoZSBpbml0aWFsIGxvYWQgd2UgcHVzaGVkIG91cnNlbHZlcy5cclxuICAgICAgICAvLyBUaGUgZW1iZWRkZWQgY29tcG9uZW50cyBzZXQgYGlnbm9yZVVwZGF0ZTogdHJ1ZWAgd2hlbiB0aGV5IHB1c2hcclxuICAgICAgICAvLyB0aGVpciBmb3JtIGNoYW5nZXMgYmFjazsgd2UgdXNlIHRoYXQgYXMgb3VyIHNpZ25hbC5cclxuICAgICAgICBpZiAoIWRhdGEuaWdub3JlVXBkYXRlKSByZXR1cm47XHJcbiAgICAgICAgLy8gUGVyc2lzdCBlZGl0cyBtYWRlIGRpcmVjdGx5IGluIHRoZSBlbWJlZGRlZCBlZGl0b3IgKGUuZy4gVk1cclxuICAgICAgICAvLyBwb3NpdGlvbnMsIHdoaWNoIHN0YXkgZWRpdGFibGUgaW4gbG9va3NNb2RlKSB0byB0aGUgYWN0aXZlIGxpYnJhcnkuXHJcbiAgICAgICAgLy8gQ3Jvc3MtbGlicmFyeSBwcm9wYWdhdGlvbiBpcyBkcml2ZW4gYnkgdGhlIHNsb3QncyBwbGFjZW1lbnRzIGxpc3RcclxuICAgICAgICAvLyBpbnN0ZWFkIChzZWUgYXBwbHlQbGFjZW1lbnRzVG9Bc3NpZ25lZExpYnJhcmllcykuXHJcbiAgICAgICAgdGhpcy5jYXB0dXJlTGlicmFyeVNuYXBzaG90KHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCwgZGF0YSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSB8fCAne30nKTtcclxuICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudCB8fCBoZWFkZXJGaWx0ZXJzPy5jbGllbnQ7XHJcbiAgICAgIGlmICh0aGlzLmNsaWVudElkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRml4dHVyZUxpYnJhcmllcygpO1xyXG4gICAgICAgIHRoaXMubG9hZFBsYWNlbWVudERyb3Bkb3duRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFzeW5jIChwYXJhbXMpID0+IHtcclxuICAgICAgY29uc3QgaWQgPSBwYXJhbXNbJ2NvbGxlY3Rpb25JZCddO1xyXG4gICAgICB0aGlzLmNvbGxlY3Rpb25JZCA9IGlkICYmIGlkICE9PSAnbmV3JyA/IGlkIDogbnVsbDtcclxuICAgICAgdGhpcy5pc05ldyA9ICF0aGlzLmNvbGxlY3Rpb25JZDtcclxuICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbklkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGV0YWlscygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBFbWJlZGRlZCBUZW1wbGF0ZVByb2R1Y3RzQ29tcG9uZW50IC8gVGVtcGxhdGVWbXNDb21wb25lbnQgcmVhZCB0aGVzZVxyXG4gICAgLy8gcXVlcnkgcGFyYW1zIGZyb20gdGhlIGFjdGl2ZSByb3V0ZS4gRm9yY2UgdGhlbSB0byBlZGl0LW1vZGUgYW5kIHBpblxyXG4gICAgLy8gdGhlIHByb2R1Y3RzIHZpZXcgdG8gdGhlIFwic2VjdGlvblwiIGxldmVsLlxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiAndHJ1ZScsIGxldmVsOiAnc2VjdGlvbicgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKCdMb29rIENvbGxlY3Rpb24nKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7IHRpdGxlOiAnUGxhbm9ncmFtJywgcGF0aDogJy9tYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW1zJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogJycsIHBhdGg6ICcnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6ICdMb29rcycsIHBhdGg6ICcvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICAgIHsgdGl0bGU6ICcnLCBwYXRoOiAnJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnRWRpdCcsIHBhdGg6ICcnLCBpc0FjdGl2ZTogdHJ1ZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIGluaXRGb3JtKCkge1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxyXG4gICAgICBpc0FjdGl2ZTogW2ZhbHNlXSxcclxuICAgICAgbG9va3M6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgbG9va3MoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdsb29rcycpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGZpeHR1cmVTbG90cyhsb29rSW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb29rcy5hdChsb29rSW5kZXgpLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgcGxhY2VtZW50cyhsb29rSW5kZXg6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZVNsb3RzKGxvb2tJbmRleCkuYXQoc2xvdEluZGV4KS5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRMb29rR3JvdXAoKTogRm9ybUdyb3VwIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZExvb2tJbmRleCA+PSAwICYmIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPCB0aGlzLmxvb2tzLmxlbmd0aFxyXG4gICAgICA/ICh0aGlzLmxvb2tzLmF0KHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpIGFzIEZvcm1Hcm91cClcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkU2xvdHNBcnJheSgpOiBGb3JtQXJyYXkgfCBudWxsIHtcclxuICAgIGNvbnN0IGxvb2sgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgcmV0dXJuIGxvb2sgPyAobG9vay5nZXQoJ2ZpeHR1cmVTbG90cycpIGFzIEZvcm1BcnJheSkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkU2xvdEdyb3VwKCk6IEZvcm1Hcm91cCB8IG51bGwge1xyXG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLnNlbGVjdGVkU2xvdHNBcnJheTtcclxuICAgIGlmICghc2xvdHMpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPj0gMCAmJiB0aGlzLnNlbGVjdGVkU2xvdEluZGV4IDwgc2xvdHMubGVuZ3RoXHJcbiAgICAgID8gKHNsb3RzLmF0KHRoaXMuc2VsZWN0ZWRTbG90SW5kZXgpIGFzIEZvcm1Hcm91cClcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkUGxhY2VtZW50cygpOiBGb3JtQXJyYXkgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgcmV0dXJuIHNsb3QgPyAoc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUxvb2tHcm91cChzZWVkOiBhbnkgPSB7fSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBzZWVkU2xvdHMgPSBBcnJheS5pc0FycmF5KHNlZWQuZml4dHVyZVNsb3RzKSAmJiBzZWVkLmZpeHR1cmVTbG90cy5sZW5ndGhcclxuICAgICAgPyBzZWVkLmZpeHR1cmVTbG90c1xyXG4gICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWF4KDEsIE51bWJlcihzZWVkLmZpeHR1cmVDb3VudCkgfHwgMSkgfSwgKF8sIGkpID0+ICh7IHNsb3RJbmRleDogaSArIDEgfSkpO1xyXG4gICAgY29uc3Qgc2xvdHMgPSBzZWVkU2xvdHMubWFwKChzOiBhbnksIGk6IG51bWJlcikgPT4gdGhpcy5jcmVhdGVTbG90R3JvdXAoeyAuLi5zLCBzbG90SW5kZXg6IGkgKyAxIH0pKTtcclxuXHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAga2V5VHlwZTogW3NlZWQua2V5VHlwZSB8fCAnbWJxJ10sXHJcbiAgICAgIG1icUJ1Y2tldDogW3NlZWQubWJxQnVja2V0IHx8ICcnXSxcclxuICAgICAgYnJhbmRDYXRlZ29yeTogW3NlZWQuYnJhbmRDYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVDb3VudDogW3Nsb3RzLmxlbmd0aCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIGZpeHR1cmVUeXBlOiBbQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVUeXBlKSA/IHNlZWQuZml4dHVyZVR5cGUgOiBbXV0sXHJcbiAgICAgIGxheW91dFZhcmlhbnQ6IFtzZWVkLmxheW91dFZhcmlhbnQgfHwgJ3NoZWxmJ10sXHJcbiAgICAgIHN0b3JlUHJvdG86IFtzZWVkLnN0b3JlUHJvdG8gfHwgJyddLFxyXG4gICAgICBmaXh0dXJlU2xvdHM6IHRoaXMuZmIuYXJyYXkoc2xvdHMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZml4dHVyZUNvdW50IOKGkiBzbG90cyBsZW5ndGggKHVzZXItZWRpdGVkIGNvdW50IGFkanVzdHMgdGhlIHNsb3RzIGFycmF5KVxyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKG5leHQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDMwLCBOdW1iZXIobmV4dCkgfHwgMCkpO1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHdoaWxlIChzbG90c0Fyci5sZW5ndGggPCB0YXJnZXQpIHtcclxuICAgICAgICAgIHNsb3RzQXJyLnB1c2godGhpcy5jcmVhdGVTbG90R3JvdXAoeyBzbG90SW5kZXg6IHNsb3RzQXJyLmxlbmd0aCArIDEgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoc2xvdHNBcnIubGVuZ3RoID4gdGFyZ2V0KSB7XHJcbiAgICAgICAgICBzbG90c0Fyci5yZW1vdmVBdChzbG90c0Fyci5sZW5ndGggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwKTtcclxuICAgICAgICAvLyBSZWNvbmNpbGUgc2xvdCBzZWxlY3Rpb24gaWYgaXQncyBub3cgb3V0IG9mIGJvdW5kc1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID49IDAgJiYgdGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSA9PT0gbG9va0dyb3VwKSB7XHJcbiAgICAgICAgICBpZiAoc2xvdHNBcnIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFNsb3RJbmRleCA+PSBzbG90c0Fyci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzQXJyLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGxvb2tHcm91cDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVNsb3RHcm91cChzZWVkOiBhbnkgPSB7fSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gKEFycmF5LmlzQXJyYXkoc2VlZC5wbGFjZW1lbnRzKSA/IHNlZWQucGxhY2VtZW50cyA6IFtdKVxyXG4gICAgICAubWFwKChwOiBhbnkpID0+IHRoaXMuY3JlYXRlUGxhY2VtZW50R3JvdXAocCkpO1xyXG4gICAgY29uc3QgbGlicmFyeUNvbmZpZ3MgPSAoQXJyYXkuaXNBcnJheShzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucykgPyBzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucyA6IFtdKVxyXG4gICAgICAubWFwKChjOiBhbnkpID0+IHRoaXMuY3JlYXRlTGlicmFyeUNvbmZpZ0dyb3VwKGMpKTtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2xvdEluZGV4OiBbc2VlZC5zbG90SW5kZXggPz8gMSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNsb3RUeXBlOiBbc2VlZC5zbG90VHlwZSB8fCAnc2hlbGYnXSxcclxuICAgICAgYnJhbmQ6IFtzZWVkLmJyYW5kIHx8ICcnXSxcclxuICAgICAgZml4dHVyZUxldmVsWm9uZTogW3NlZWQuZml4dHVyZUxldmVsWm9uZSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5UmVmOiBbc2VlZC5maXh0dXJlTGlicmFyeVJlZiB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5TGFiZWw6IFtzZWVkLmZpeHR1cmVMaWJyYXJ5TGFiZWwgfHwgJyddLFxyXG4gICAgICBmaXh0dXJlTGlicmFyeVJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzKSA/IHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzIDogW11dLFxyXG4gICAgICBjYWRIZWFkZXJWYXJpYW50czogW0FycmF5LmlzQXJyYXkoc2VlZC5jYWRIZWFkZXJWYXJpYW50cykgPyBzZWVkLmNhZEhlYWRlclZhcmlhbnRzIDogW11dLFxyXG4gICAgICBwbGFjZW1lbnRzOiB0aGlzLmZiLmFycmF5KHBsYWNlbWVudHMpLFxyXG4gICAgICBsaWJyYXJ5Q29uZmlndXJhdGlvbnM6IHRoaXMuZmIuYXJyYXkobGlicmFyeUNvbmZpZ3MpLFxyXG4gICAgICAvLyBQZXItbGlicmFyeSBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgZml4dHVyZS10ZW1wbGF0ZSBlZGl0b3Igc3RhdGVcclxuICAgICAgLy8gKHNoZWxmQ29uZmlnICsgcHJvZHVjdC9WTSBwbGFjZW1lbnRzKS4gS2V5ZWQgYnkgbGlicmFyeVJlZi5cclxuICAgICAgbGlicmFyeVNuYXBzaG90czogW1xyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2VlZC5saWJyYXJ5U25hcHNob3RzKSA/IHNlZWQubGlicmFyeVNuYXBzaG90cyA6IFtdLFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMaWJyYXJ5Q29uZmlnR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBsaWJyYXJ5UmVmOiBbc2VlZC5saWJyYXJ5UmVmIHx8ICcnXSxcclxuICAgICAgc2hlbGZOdW1iZXI6IFtzZWVkLnNoZWxmTnVtYmVyID8/IDFdLFxyXG4gICAgICBsYWJlbDogW3NlZWQubGFiZWwgfHwgJyddLFxyXG4gICAgICBzaGVsZlR5cGU6IFtzZWVkLnNoZWxmVHlwZSB8fCAnJ10sXHJcbiAgICAgIC8vIFZNcyBhbmQgUElEcyBwaWNrZWQgZnJvbSB0aGUgc2xvdCdzIGBwbGFjZW1lbnRzYCBhcnJheSAoYnkgcG9zaXRpb24gbmFtZSkuXHJcbiAgICAgIHZtUmVmczogW0FycmF5LmlzQXJyYXkoc2VlZC52bVJlZnMpID8gc2VlZC52bVJlZnMgOiBbXV0sXHJcbiAgICAgIHBpZFJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQucGlkUmVmcykgPyBzZWVkLnBpZFJlZnMgOiBbXV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVBsYWNlbWVudEdyb3VwKHNlZWQ6IGFueSA9IHt9KTogRm9ybUdyb3VwIHtcclxuICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogbGVnYWN5IGRhdGEgc3RvcmVkIGEgc2luZ2xlIHN0cmluZyBpbiBgcmF3VmFsdWVgLiBGb3JcclxuICAgIC8vIFBJRCBwbGFjZW1lbnRzIHdlIG5vdyB1c2UgYHJhd1ZhbHVlc2AgKGFycmF5LCBtdWx0aS1zZWxlY3QpLiBJZiB0aGVcclxuICAgIC8vIHNlZWQgb25seSBoYXMgYHJhd1ZhbHVlYCwgbWlncmF0ZSBpdCB0byB0aGUgYXJyYXkgb24gZmlyc3QgbG9hZC5cclxuICAgIGNvbnN0IHJhd1ZhbHVlc1NlZWQgPSBBcnJheS5pc0FycmF5KHNlZWQucmF3VmFsdWVzKVxyXG4gICAgICA/IHNlZWQucmF3VmFsdWVzXHJcbiAgICAgIDogKHNlZWQua2luZCA9PT0gJ3BpZCcgJiYgc2VlZC5yYXdWYWx1ZSA/IFtTdHJpbmcoc2VlZC5yYXdWYWx1ZSldIDogW10pO1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwb3NpdGlvbjogW3NlZWQucG9zaXRpb24gfHwgJyddLFxyXG4gICAgICBraW5kOiBbc2VlZC5raW5kIHx8ICdwaWQnXSxcclxuICAgICAgLy8gRm9yIFZNIHJvd3MgdGhpcyBob2xkcyB0aGUgYXJ0d29yayBpZCAoc2luZ2xlIHN0cmluZykuIEZvciBQSUQgcm93c1xyXG4gICAgICAvLyBpdCdzIGxlZnQgZW1wdHkgaW4gZmF2b3VyIG9mIGByYXdWYWx1ZXNgLlxyXG4gICAgICByYXdWYWx1ZTogW3NlZWQua2luZCA9PT0gJ3BpZCcgPyAnJyA6IChzZWVkLnJhd1ZhbHVlIHx8ICcnKV0sXHJcbiAgICAgIHJhd1ZhbHVlczogW3Jhd1ZhbHVlc1NlZWRdLFxyXG4gICAgICB2bVJlZjogW3NlZWQudm1SZWYgfHwgJyddLFxyXG4gICAgICBza3VDb2xsZWN0aW9uUmVmOiBbc2VlZC5za3VDb2xsZWN0aW9uUmVmIHx8ICcnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUGxhY2VtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGxhY2VtZW50cykgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMucHVzaCh0aGlzLmNyZWF0ZVBsYWNlbWVudEdyb3VwKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUGxhY2VtZW50KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMpIHJldHVybjtcclxuICAgIHRoaXMuc2VsZWN0ZWRQbGFjZW1lbnRzLnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybVZtVHlwZSh0OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFN0cmluZyh0ID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdGFibGUgcGVyLXZtVHlwZSBhcnR3b3JrIGxpc3QgbG9va3VwLiBSZXR1cm5zIHRoZSBzYW1lIGFycmF5IHJlZmVyZW5jZVxyXG4gICAqICBmb3IgdGhlIHNhbWUgdm1UeXBlIGFjcm9zcyBDRCBjeWNsZXMgc28gbGliLXJlYWN0aXZlLXNlbGVjdCBkb2Vzbid0XHJcbiAgICogIHJlLWluaXQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgbGlzdCB3aGVuIHZtVHlwZSBpcyBlbXB0eS4gKi9cclxuICB2bUFydHdvcmtPcHRpb25zRm9yKHZtVHlwZTogc3RyaW5nKTogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIGlmIChrZXkgJiYgdGhpcy52bUFydHdvcmtCeVR5cGUuaGFzKGtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpITtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZtQXJ0d29ya0J5VHlwZS5nZXQoJycpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlIHRoZSBkcm9wZG93biBkYXRhIHVzZWQgYnkgUGxhY2VtZW50IHJvd3M6XHJcbiAgICogIC0gVk0gVHlwZSBsaXN0IChgZ2V0Vm1UeXBlc0xpc3RgKVxyXG4gICAqICAtIFZNIEFydHdvcmsgbGlzdCAoYHZtTmFtZUxpc3RgKVxyXG4gICAqICAtIFByb2R1Y3QgLyBTS1UgY29sbGVjdGlvbiBsaXN0IChmbGF0dGVuZWQgZnJvbSBicmFuZCDihpIgY2F0ZWdvcnkgbWFwcGluZ1xyXG4gICAqICAgIHRoYXQgcG93ZXJzIC9tYW5hZ2UvcGxhbm9ncmFtL2NvbmZpZykuICovXHJcbiAgYXN5bmMgbG9hZFBsYWNlbWVudERyb3Bkb3duRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgW3ZtVHlwZXNSZXMsIHZtc1JlcywgYnJhbmRzUmVzLCBicmFuZE1ldGFSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRWbVR5cGVzTGlzdCh0aGlzLmNsaWVudElkKSksXHJcbiAgICAgICAgbGFzdFZhbHVlRnJvbSh0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldFZNTmFtZUxpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZExpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZE1ldGFEYXRhKHRoaXMuY2xpZW50SWQpKSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBjb25zdCB2bVR5cGVzOiBhbnlbXSA9ICh2bVR5cGVzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIHRoaXMudm1UeXBlT3B0aW9ucyA9IHZtVHlwZXNcclxuICAgICAgICAubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSB0Py52bVR5cGUgfHwgdD8udm1UeXBlTmFtZSB8fCB0Py5uYW1lIHx8IHQ/Ll9pZDtcclxuICAgICAgICAgIGNvbnN0IGwgPSB0Py52bVR5cGVOYW1lIHx8IHQ/LnZtVHlwZSB8fCB0Py5uYW1lIHx8IHY7XHJcbiAgICAgICAgICByZXR1cm4gdiA/IHsgdmFsdWU6IFN0cmluZyh2KSwgbGFiZWw6IFN0cmluZyhsKSB9IDogbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5maWx0ZXIoKHgpOiB4IGlzIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICBjb25zdCB2bXM6IGFueVtdID0gKHZtc1JlcyBhcyBhbnkpPy5kYXRhIHx8IFtdO1xyXG4gICAgICB0aGlzLnZtQXJ0d29ya09wdGlvbnMgPSB2bXNcclxuICAgICAgICAubWFwKCh2OiBhbnkpOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpZCA9IHY/LnZtTmFtZSB8fCB2Py5faWQ7XHJcbiAgICAgICAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoaWQpLFxyXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKHY/LnZtTmFtZSB8fCBpZCksXHJcbiAgICAgICAgICAgIHZtVHlwZTogdj8udm1UeXBlID8gU3RyaW5nKHYudm1UeXBlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKCh4KTogeCBpcyB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICAvLyAodm1OYW1lLCB2bVR5cGUpIOKGkiBfaWQgc28gd2UgY2FuIHR1cm4gYSBwbGFjZW1lbnQncyBhcnR3b3JrIE5BTUUgaW50b1xyXG4gICAgICAvLyB0aGUgcGxhbm92bSBfaWQgdGhlIGVtYmVkZGVkIFZNIGVkaXRvciBtYXRjaGVzIGFnYWluc3QuXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2bXMpIHtcclxuICAgICAgICBpZiAoIXY/Ll9pZCB8fCAhdj8udm1OYW1lKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ub3JtVm1UeXBlKHYudm1OYW1lKTtcclxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICB0aGlzLnZtSWRCeU5hbWVUeXBlLnNldChgJHtuYW1lfXx8JHt0eXBlfWAsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIGlmICghdGhpcy52bUlkQnlOYW1lVHlwZS5oYXMobmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuc2V0KG5hbWUsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVidWlsZCB0aGUgKHZtVHlwZSDihpIgYXJ0d29ya3MpIGluZGV4IG5vdyB0aGF0IHRoZSBhcnR3b3JrIGxpc3RcclxuICAgICAgLy8gY2hhbmdlZC4gS2V5cyBhcmUgbm9ybWFsaXNlZCAodHJpbSArIGxvd2VyLWNhc2UpIHNvIGEgbWlzbWF0Y2ggaW5cclxuICAgICAgLy8gY2FzaW5nL3doaXRlc3BhY2UgYmV0d2VlbiB2bVR5cGVzIGFuZCB2bXMudm1UeXBlIHN0aWxsIG1hdGNoZXMuXHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlID0gbmV3IE1hcCgpO1xyXG4gICAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMudm1BcnR3b3JrT3B0aW9ucy5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LnZhbHVlLCBsYWJlbDogdi5sYWJlbCB9KSk7XHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLnNldCgnJywgZnVsbExpc3QpO1xyXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52bUFydHdvcmtPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZtQXJ0d29ya0J5VHlwZS5oYXMoa2V5KSkgdGhpcy52bUFydHdvcmtCeVR5cGUuc2V0KGtleSwgW10pO1xyXG4gICAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpIS5wdXNoKHsgdmFsdWU6IHYudmFsdWUsIGxhYmVsOiB2LmxhYmVsIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gdm1UeXBlczonLCB0aGlzLnZtVHlwZU9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3JrczonLCB0aGlzLnZtQXJ0d29ya09wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3Jrc0J5VHlwZSBrZXlzOicsIEFycmF5LmZyb20odGhpcy52bUFydHdvcmtCeVR5cGUua2V5cygpKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFNvdXJjZTogZXZlcnkgdmFsdWUgdGhlIGJyYW5kICYgcHJvZHVjdCBtYXBwaW5nIHBhZ2UgZXhwb3Nlcy5cclxuICAgICAgLy8gIC0gYGdldEJyYW5kTGlzdGAgICAgIOKGkiBwZXItYnJhbmQgYGNhdGVnb3J5W11gIGFuZCBgc3ViQ2F0ZWdvcnlbXWBcclxuICAgICAgLy8gIC0gYGdldEJyYW5kTWV0YURhdGFgIOKGkiByb3dzIHdpdGggYHBpZENhdGAsIGBjYXRlZ29yeWAsIGB0ZW1wR3JvdXBgXHJcbiAgICAgIGNvbnN0IGJyYW5kczogYW55W10gPSAoYnJhbmRzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IGJyYW5kTWV0YTogYW55W10gPSAoYnJhbmRNZXRhUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IHNlZW5DYXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgIGNvbnN0IHB1c2hPbmUgPSAodjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcyA9IFN0cmluZyh2ID8/ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKCFzIHx8IHNlZW5DYXRzLmhhcyhzKSkgcmV0dXJuO1xyXG4gICAgICAgIHNlZW5DYXRzLmFkZChzKTtcclxuICAgICAgICBwcm9kdWN0cy5wdXNoKHsgdmFsdWU6IHMsIGxhYmVsOiBzIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBwdXNoQXJyID0gKGFycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgYXJyKSBwdXNoT25lKHYpO1xyXG4gICAgICB9O1xyXG4gICAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmRzKSB7XHJcbiAgICAgICAgcHVzaEFycihiPy5jYXRlZ29yeSk7XHJcbiAgICAgICAgcHVzaEFycihiPy5zdWJDYXRlZ29yeSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCByb3cgb2YgYnJhbmRNZXRhKSB7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LnBpZENhdCk7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LmNhdGVnb3J5KTtcclxuICAgICAgICBwdXNoT25lKHJvdz8udGVtcEdyb3VwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByb2R1Y3RPcHRpb25zID0gcHJvZHVjdHM7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gcHJvZHVjdC9TS1Ugb3B0aW9uczonLFxyXG4gICAgICAgIHRoaXMucHJvZHVjdE9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdmcm9tJyxcclxuICAgICAgICBicmFuZHMubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZHMgYW5kJyxcclxuICAgICAgICBicmFuZE1ldGEubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZC1tZXRhIHJvd3MnLFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGxvYWRQbGFjZW1lbnREcm9wZG93bkRhdGEgW0VSUl06JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRGaXh0dXJlTGlicmFyaWVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBPbmx5IGxpc3QgZml4dHVyZSB0ZW1wbGF0ZXMgYXZhaWxhYmxlIGluIEluZGlhIChjb3VudHJ5IGNvZGUgJ0lOJykuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJOYW1lTGlzdCh0aGlzLmNsaWVudElkLCAnbm9uLWRyYWZ0JywgJ0lOJyksXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFJlc3BvbnNlIHNoYXBlOiB7IGNvZGUsIHN0YXR1cywgZGF0YTogW3sgaWQsIGZpeHR1cmVOYW1lLCBmaXh0dXJlVHlwZSB9XSB9LlxyXG4gICAgICBjb25zdCBsaXN0OiB7IGlkOiBzdHJpbmc7IGZpeHR1cmVOYW1lOiBzdHJpbmc7IGZpeHR1cmVUeXBlOiBzdHJpbmcgfVtdID1cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJlcz8uZGF0YSkgPyByZXMuZGF0YSA6IFtdO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBsaXN0Lm1hcCgobCkgPT4gKHtcclxuICAgICAgICBpZDogbC5pZCxcclxuICAgICAgICBuYW1lOiBsLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIGZpeHR1cmVUeXBlOiAobC5maXh0dXJlVHlwZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSxcclxuICAgICAgfSkpO1xyXG4gICAgICBjb25zdCB0eXBlVGFsbHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMpIHtcclxuICAgICAgICBjb25zdCBrID0gaXQuZml4dHVyZVR5cGUgfHwgJyhlbXB0eSknO1xyXG4gICAgICAgIHR5cGVUYWxseVtrXSA9ICh0eXBlVGFsbHlba10gfHwgMCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gZml4dHVyZSBsaWJyYXJpZXMgbG9hZGVkOicsXHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAnZml4dHVyZVR5cGUgdGFsbHk6JyxcclxuICAgICAgICB0eXBlVGFsbHksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkRml4dHVyZUxpYnJhcmllcyBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY29tcHV0ZSB0aGUgc2xvdC10eXBlLWZpbHRlcmVkIGxpYnJhcnkgbGlzdCBvbmNlLiBTdGFibGUgcmVmZXJlbmNlXHJcbiAgICogc28gdGhlIG11bHRpc2VsZWN0IGRvZXNuJ3QgdGVhciBkb3duIGl0cyBjbGljayB0YXJnZXRzIGV2ZXJ5IENEIGN5Y2xlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLnNsaWNlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNsb3RUeXBlID0gc2xvdC5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gc2xvdFR5cGUgPT09ICdldXJvY2VudGVyJyA/ICdmbG9vcicgOiAnd2FsbCc7XHJcbiAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCB0ID0gaXRlbS5maXh0dXJlVHlwZTtcclxuICAgICAgaWYgKCF0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0YXJnZXQgPT09ICd3YWxsJykgcmV0dXJuIHQgPT09ICd3YWxsJyB8fCB0LmluY2x1ZGVzKCd3YWxsJyk7XHJcbiAgICAgIHJldHVybiB0ID09PSAnZmxvb3InIHx8IHQuaW5jbHVkZXMoJ2Zsb29yJykgfHwgdC5pbmNsdWRlcygnZXVybycpIHx8IHQuaW5jbHVkZXMoJ2ZyZWUnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9ucyBzY29wZWQgdG8gd2hpY2hldmVyIHNsb3QgaXMgY3VycmVudGx5IGFjdGl2ZS4gQ2xlYXJlZCBhbmRcclxuICAgKiByZWJ1aWx0IGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBzbG90IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzbG90U3ViczogYW55W10gPSBbXTtcclxuXHJcbiAgLyoqIFBlbmRpbmcgYXV0by1hcHBseSBwcm9taXNlcyBrZXllZCBieSBsaWJJZCBzbyBjaGlwIGNsaWNrcyBjYW4gYXdhaXQuICovXHJcbiAgcHJpdmF0ZSBhdXRvQXBwbHlJbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xyXG5cclxuICAvKiogV2lyZS9yZWZyZXNoIHN1YnNjcmlwdGlvbnMgdGhhdCBkZXBlbmQgb24gdGhlIGFjdGl2ZSBzbG90OlxyXG4gICAqICAtIHJlLWZpbHRlciB0aGUgbGlicmFyeSBtdWx0aXNlbGVjdCB3aGVuIHNsb3RUeXBlIGNoYW5nZXNcclxuICAgKiAgLSBydW4gYXV0by1hcHBseSB3aGVuIGEgbmV3IGxpYnJhcnkgaXMgYWRkZWQgdG8gZml4dHVyZUxpYnJhcnlSZWZzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiaW5kQWN0aXZlU2xvdExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnNsb3RTdWJzKSBzPy51bnN1YnNjcmliZT8uKCk7XHJcbiAgICB0aGlzLnNsb3RTdWJzID0gW107XHJcblxyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHtcclxuICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdCA9IHRoaXMuZml4dHVyZUxpYnJhcnlJdGVtcy5zbGljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90KCk7XHJcblxyXG4gICAgY29uc3QgdHlwZVN1YiA9IHNsb3QuZ2V0KCdzbG90VHlwZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKSk7XHJcbiAgICBpZiAodHlwZVN1YikgdGhpcy5zbG90U3Vicy5wdXNoKHR5cGVTdWIpO1xyXG5cclxuICAgIC8vIFRyYWNrIHByZXZpb3VzIHJlZnMgc28gd2UgY2FuIGRldGVjdCAqbmV3KiBhZGRpdGlvbnMgYW5kIGF1dG8tYXBwbHlcclxuICAgIC8vIHRoZSBzbG90J3MgUElEcyB0byB0aG9zZSBuZXcgbGlicmFyaWVzLlxyXG4gICAgbGV0IHByZXZSZWZzOiBzdHJpbmdbXSA9IFsuLi4oc2xvdC5nZXQoJ2ZpeHR1cmVMaWJyYXJ5UmVmcycpPy52YWx1ZSB8fCBbXSldO1xyXG4gICAgY29uc3QgcmVmc1N1YiA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobmV4dFJlZnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBBcnJheS5pc0FycmF5KG5leHRSZWZzKSA/IG5leHRSZWZzIDogW107XHJcbiAgICAgIGNvbnN0IGFkZGVkID0gbmV4dC5maWx0ZXIoKHIpID0+ICEhciAmJiAhcHJldlJlZnMuaW5jbHVkZXMocikpO1xyXG4gICAgICBwcmV2UmVmcyA9IFsuLi5uZXh0XTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50bHktcHJldmlld2VkIGxpYnJhcnkgd2FzIHVuc2VsZWN0ZWQsIGNsZWFyIHRoZVxyXG4gICAgICAvLyBlbWJlZGRlZCB2aWV3IHNvIHdlIGRvbid0IHNob3cgc3RhbGUgZGF0YS5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcFxyXG4gICAgICAgICAgJiYgIW5leHQuaW5jbHVkZXModGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdCgnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgbGliSWQgb2YgYWRkZWQpIHtcclxuICAgICAgICBjb25zdCBwID0gdGhpcy5hdXRvQXBwbHlQaWRzVG9MaWJyYXJ5KGxpYklkKTtcclxuICAgICAgICB0aGlzLmF1dG9BcHBseUluRmxpZ2h0LnNldChsaWJJZCwgcCk7XHJcbiAgICAgICAgcC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmF1dG9BcHBseUluRmxpZ2h0LmdldChsaWJJZCkgPT09IHApIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvQXBwbHlJbkZsaWdodC5kZWxldGUobGliSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBub3RoaW5nIGlzIGJlaW5nIHByZXZpZXdlZCB5ZXQsIGF1dG8tYWN0aXZhdGUgdGhlIGZpcnN0IGxpYnJhcnlcclxuICAgICAgLy8gdGhlIHVzZXIganVzdCBhZGRlZCBzbyB0aGUgZW1iZWRkZWQgUElEL1ZNIGVkaXRvciBvcGVucyBpbW1lZGlhdGVseVxyXG4gICAgICAvLyAoZXNwZWNpYWxseSByZWxldmFudCB3aGVuIGFkZGluZyB0aGUgRklSU1QgbGlicmFyeSB0byBhbiBlbXB0eVxyXG4gICAgICAvLyBtdWx0aXNlbGVjdCDigJQgcHJldmlvdXNseSB0aGUgY2hpcCBzdHJpcCBzaG93ZWQgaXQgYnV0IHRoZSBwcmV2aWV3XHJcbiAgICAgIC8vIHBhbmUgc3RheWVkIGJsYW5rIHVudGlsIHRoZSB1c2VyIGNsaWNrZWQgdGhlIGNoaXApLlxyXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gYWRkZWQuZmluZCgoaWQpID0+ICEhaWQpIHx8IG5leHQuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgICAgIGlmIChmaXJzdEFjdGl2ZSkgdGhpcy5vbkxpYnJhcnlNYXBTZWxlY3QoZmlyc3RBY3RpdmUpO1xyXG4gICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHJlZnNTdWIpIHRoaXMuc2xvdFN1YnMucHVzaChyZWZzU3ViKTtcclxuXHJcbiAgICAvLyBXaGVuIGFueSBwbGFjZW1lbnQgaW4gdGhlIFwiTG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmcgUGxhY2VtZW50c1wiXHJcbiAgICAvLyBsaXN0IGNoYW5nZXMsIHJlLWRlcml2ZSBldmVyeSBhc3NpZ25lZCBsaWJyYXJ5J3Mgc25hcHNob3Qgc28gdGhlIGVkaXRcclxuICAgIC8vIHByb3BhZ2F0ZXMgdG8gYWxsIG9mIHRoZW0uIERlYm91bmNlZCBzbyByYXBpZCB0eXBpbmcgY29sbGFwc2VzIGludG8gYVxyXG4gICAgLy8gc2luZ2xlIHJlLWFwcGx5LlxyXG4gICAgY29uc3QgcGxhY2VtZW50c0FyciA9IHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgIGNvbnN0IHBsYWNlbWVudHNTdWIgPSBwbGFjZW1lbnRzQXJyPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDQwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFwcGx5UGxhY2VtZW50c1RvQXNzaWduZWRMaWJyYXJpZXMoKSk7XHJcbiAgICBpZiAocGxhY2VtZW50c1N1YikgdGhpcy5zbG90U3Vicy5wdXNoKHBsYWNlbWVudHNTdWIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhIG5ldyBsaWJyYXJ5IGlzIGFkZGVkIHRvIHRoZSBzbG90LCB3YWxrIGl0cyBzaGVsZkNvbmZpZyBhbmQgZm9yXHJcbiAgICogZWFjaCBzaGVsZiB3aG9zZSBzZWN0aW9uIGN1cnJlbnRseSBoYXMgbm8gYnJhbmQsIGNvcHkgdGhlIHJhd1ZhbHVlIG9mXHJcbiAgICogdGhlIHNsb3QncyBQSUQgcGxhY2VtZW50IHdob3NlIGBwb3NpdGlvbmAgbWF0Y2hlcyB0aGUgc2hlbGYnc1xyXG4gICAqIGB6b25lYC9gbGFiZWxgLiBSZXN1bHQgaXMgc2F2ZWQgYXMgdGhlIGxpYnJhcnkncyBzbmFwc2hvdCBzbyB0aGVcclxuICAgKiBlbWJlZGRlZCBmaXh0dXJlLXRlbXBsYXRlIGVkaXRvciBwaWNrcyBpdCB1cCB0aGUgbmV4dCB0aW1lIHRoZSBjaGlwXHJcbiAgICogaXMgb3BlbmVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYXV0b0FwcGx5UGlkc1RvTGlicmFyeShsaWJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWxpYklkKSByZXR1cm47XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudHNBcnIgPSBzbG90LmdldCgncGxhY2VtZW50cycpIGFzIEZvcm1BcnJheSB8IG51bGw7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzOiBhbnlbXSA9IHBsYWNlbWVudHNBcnI/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgcGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKFxyXG4gICAgICAocCkgPT4gcD8ua2luZCA9PT0gJ3BpZCcgJiYgcD8ucG9zaXRpb24gJiYgcD8ucmF3VmFsdWUsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG5vcm0gPSAoczogYW55KTogc3RyaW5nID0+IFN0cmluZyhzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBwbGFjZW1lbnRNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBpZFBsYWNlbWVudHMpIHtcclxuICAgICAgcGxhY2VtZW50TWFwLnNldChub3JtKHAucG9zaXRpb24pLCBTdHJpbmcocC5yYXdWYWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXJ0IGZyb20gYW4gZXhpc3Rpbmcgc25hcHNob3QgaWYgd2UgYWxyZWFkeSBzYXZlZCBvbmUgZm9yIHRoaXMgc2xvdFxyXG4gICAgLy8gKyBsaWJyYXJ5OyBvdGhlcndpc2UgZmV0Y2ggdGhlIGZyZXNoIGxpYnJhcnkgZG9jLiBUaGUgcGVyLWZpZWxkIGd1YXJkc1xyXG4gICAgLy8gYmVsb3cgc3RpbGwgZW5zdXJlIHdlIG5ldmVyIG92ZXJ3cml0ZSB1c2VyLXNldCBicmFuZHMgb3IgVk1zLlxyXG4gICAgbGV0IGxpYkRhdGE6IGFueSA9IHRoaXMuZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkKTtcclxuICAgIGlmICghbGliRGF0YSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0Rml4dHVyZUxpYnJhcnlEZXRhaWxzKGxpYklkKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxpYkRhdGEgPSByZXM/LmRhdGE7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGF1dG9BcHBseVBpZHNUb0xpYnJhcnkgW0VSUl06JywgZXJyKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghbGliRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmQ29uZmlnOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkobGliRGF0YS5zaGVsZkNvbmZpZykgPyBsaWJEYXRhLnNoZWxmQ29uZmlnIDogW107XHJcbiAgICBsZXQgcGlkc0FwcGxpZWQgPSBmYWxzZTtcclxuICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbGZDb25maWcubWFwKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNoZWxmPy5wcm9kdWN0QnJhbmROYW1lKSAmJiBzaGVsZi5wcm9kdWN0QnJhbmROYW1lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4gc2hlbGY7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSBzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwgfHwgJyc7XHJcbiAgICAgIGNvbnN0IG1hdGNoS2V5ID0gbm9ybShzb3VyY2VMYWJlbCk7XHJcbiAgICAgIGlmICghbWF0Y2hLZXkpIHJldHVybiBzaGVsZjtcclxuICAgICAgY29uc3QgbWF0Y2ggPSBwbGFjZW1lbnRNYXAuZ2V0KG1hdGNoS2V5KTtcclxuICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICBwaWRzQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIC8vIGdyb3VwU2hlbHZlc0J5Wm9uZSgpIGluIFRlbXBsYXRlUHJvZHVjdHNDb21wb25lbnQgU0tJUFMgYW55IHNoZWxmXHJcbiAgICAgIC8vIHdob3NlIGB6b25lYCBpcyBlbXB0eSwgc28gd2UgbXVzdCBzZXQgem9uZSAodXNpbmcgdGhlIHNoZWxmJ3MgbGFiZWxcclxuICAgICAgLy8gaWYgaXQgaXNuJ3QgYWxyZWFkeSBzZXQpIGZvciB0aGUgc2VjdGlvbiB0byBmb3JtLlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNoZWxmLFxyXG4gICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNvdXJjZUxhYmVsLFxyXG4gICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFttYXRjaF0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0gVk0gYXV0by1hcHBseSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gSWYgdGhlIGxpYnJhcnkgaGFzIG5vIFZNcyBjb25maWd1cmVkIHlldCwgY29weSBlYWNoIG9mIHRoZSBzbG90J3MgVk1cclxuICAgIC8vIHBsYWNlbWVudHMgb3ZlciBhcyBhIHZtQ29uZmlnIGVudHJ5LiBObyBwb3NpdGlvbi1iYXNlZCBtYXRjaGluZyBoZXJlIOKAlFxyXG4gICAgLy8gdGhlIHBsYWNlbWVudCdzIGByYXdWYWx1ZWAgYmVjb21lcyB0aGUgVk0gYXJ0d29yayBhbmQgYHBvc2l0aW9uYFxyXG4gICAgLy8gYmVjb21lcyB0aGUgVk0gdHlwZSBsYWJlbC5cclxuICAgIGNvbnN0IGV4aXN0aW5nVm1zID0gQXJyYXkuaXNBcnJheShsaWJEYXRhLnZtQ29uZmlnKSA/IGxpYkRhdGEudm1Db25maWcgOiBbXTtcclxuICAgIGxldCBuZXdWbUNvbmZpZyA9IGV4aXN0aW5nVm1zO1xyXG4gICAgbGV0IHZtc0FwcGxpZWQgPSBmYWxzZTtcclxuICAgIGlmIChleGlzdGluZ1Ztcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgdm1QbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoXHJcbiAgICAgICAgKHApID0+IHA/LmtpbmQgPT09ICd2bScgJiYgcD8ucmF3VmFsdWUsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh2bVBsYWNlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnID0gdm1QbGFjZW1lbnRzLm1hcCgocCkgPT4gKHtcclxuICAgICAgICAgIHZtVHlwZTogU3RyaW5nKHA/LnBvc2l0aW9uIHx8ICcnKSxcclxuICAgICAgICAgIHZtSWQ6IFN0cmluZyhwPy5yYXdWYWx1ZSB8fCAnJyksXHJcbiAgICAgICAgICBzdGFydFlQb3NpdGlvbjogMSxcclxuICAgICAgICAgIGVuZFlQb3NpdGlvbjogMSxcclxuICAgICAgICAgIHhab25lOiAnJyxcclxuICAgICAgICAgIHlab25lOiAnJyxcclxuICAgICAgICAgIHBvc2l0aW9uOiAnJyxcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdm1zQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXBpZHNBcHBsaWVkICYmICF2bXNBcHBsaWVkKSByZXR1cm47XHJcblxyXG4gICAgLy8gVGhlIGVtYmVkZGVkIFRlbXBsYXRlUHJvZHVjdHNDb21wb25lbnQgb25seSByZWFkcyBzZWN0aW9uLWxldmVsIGJyYW5kXHJcbiAgICAvLyB2YWx1ZXMgd2hlbiBwcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDMnLlxyXG4gICAgY29uc3QgdXBkYXRlZExpYiA9IHtcclxuICAgICAgLi4ubGliRGF0YSxcclxuICAgICAgc2hlbGZDb25maWc6IG5ld1NoZWxmQ29uZmlnLFxyXG4gICAgICB2bUNvbmZpZzogbmV3Vm1Db25maWcsXHJcbiAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6ICdMMycsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5jYXB0dXJlTGlicmFyeVNuYXBzaG90KGxpYklkLCB1cGRhdGVkTGliKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWREZXRhaWxzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbGxlY3Rpb25JZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldExvb2tQbGFub0NvbGxlY3Rpb25EZXRhaWxzKHRoaXMuY29sbGVjdGlvbklkKSxcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YTtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUgfHwgJycsXHJcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5kZXNjcmlwdGlvbiB8fCAnJyxcclxuICAgICAgICAgIGlzQWN0aXZlOiAhIWRhdGEuaXNBY3RpdmUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5sb29rcy5jbGVhcigpO1xyXG4gICAgICAgIChkYXRhLmxvb2tzIHx8IFtdKS5mb3JFYWNoKChsOiBhbnkpID0+IHRoaXMubG9va3MucHVzaCh0aGlzLmNyZWF0ZUxvb2tHcm91cChsKSkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPSB0aGlzLmxvb2tzLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgICAgICBjb25zdCBzbG90cyA9IHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCA/IHRoaXMuZml4dHVyZVNsb3RzKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpIDogbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID0gc2xvdHMgJiYgc2xvdHMubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgICAgIHRoaXMucmVzZXRMaWJyYXJ5TWFwKCk7XHJcbiAgICAgICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gICAgICAgIHRoaXMuYXV0b1NlbGVjdEZpcnN0TGlicmFyeSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gbG9hZERldGFpbHMgW0VSUl06JywgZXJyKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0Py4oJ0ZhaWxlZCB0byBsb2FkIExvb2sgY29sbGVjdGlvbicpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRMb29rKCkge1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuY3JlYXRlTG9va0dyb3VwKHsgbWJxQnVja2V0OiAnJywgZml4dHVyZUNvdW50OiAxIH0pO1xyXG4gICAgdGhpcy5sb29rcy5wdXNoKG5leHQpO1xyXG4gICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IHRoaXMubG9va3MubGVuZ3RoIC0gMTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KS5sZW5ndGggPyAwIDogLTE7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVMb29rKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMubG9va3MucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPT09IGluZGV4KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPSB0aGlzLmxvb2tzLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IC0xO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID4gaW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCAtPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0TG9vayhpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gaW5kZXg7XHJcbiAgICBjb25zdCBzbG90cyA9IHRoaXMuZml4dHVyZVNsb3RzKGluZGV4KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90cy5sZW5ndGggPyAwIDogLTE7XHJcbiAgICB0aGlzLnJlc2V0TGlicmFyeU1hcCgpO1xyXG4gICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RMaWJyYXJ5KCk7XHJcbiAgfVxyXG5cclxuICBhZGRTbG90KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPCAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmxvb2tzLmF0KHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICBzbG90cy5wdXNoKHRoaXMuY3JlYXRlU2xvdEdyb3VwKHsgc2xvdEluZGV4OiBzbG90cy5sZW5ndGggKyAxIH0pKTtcclxuICAgIGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVDb3VudCcpIS5zZXRWYWx1ZShzbG90cy5sZW5ndGgsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90cy5sZW5ndGggLSAxO1xyXG4gICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2xvdChzbG90SW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPCAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmxvb2tzLmF0KHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICBzbG90cy5yZW1vdmVBdChzbG90SW5kZXgpO1xyXG4gICAgdGhpcy5yZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwKTtcclxuICAgIGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVDb3VudCcpIS5zZXRWYWx1ZShzbG90cy5sZW5ndGgsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID09PSBzbG90SW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzLmxlbmd0aCA/IE1hdGgubWluKHNsb3RJbmRleCwgc2xvdHMubGVuZ3RoIC0gMSkgOiAtMTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFNsb3RJbmRleCA+IHNsb3RJbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4IC09IDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIGNvbnN0IHNsb3RzQXJyID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgc2xvdHNBcnIuY29udHJvbHMuZm9yRWFjaCgoc2xvdCwgaSkgPT4ge1xyXG4gICAgICAoc2xvdCBhcyBGb3JtR3JvdXApLmdldCgnc2xvdEluZGV4Jyk/LnNldFZhbHVlKGkgKyAxLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNsb3Qoc2xvdEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90SW5kZXg7XHJcbiAgICB0aGlzLnJlc2V0TGlicmFyeU1hcCgpO1xyXG4gICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RMaWJyYXJ5KCk7XHJcbiAgfVxyXG5cclxuICBsb29rVGl0bGUobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5VHlwZSA9IGxvb2tHcm91cC5nZXQoJ2tleVR5cGUnKT8udmFsdWU7XHJcbiAgICBjb25zdCBrZXkgPSBrZXlUeXBlID09PSAnYnJhbmRDYXRlZ29yeSdcclxuICAgICAgPyBsb29rR3JvdXAuZ2V0KCdicmFuZENhdGVnb3J5Jyk/LnZhbHVlXHJcbiAgICAgIDogbG9va0dyb3VwLmdldCgnbWJxQnVja2V0Jyk/LnZhbHVlO1xyXG4gICAgY29uc3QgY291bnQgPSBsb29rR3JvdXAuZ2V0KCdmaXh0dXJlQ291bnQnKT8udmFsdWU7XHJcbiAgICByZXR1cm4gYCR7a2V5IHx8ICcodW5uYW1lZCknfSDigJQgJHtjb3VudCB8fCAwfSBmaXh0dXJlc2A7XHJcbiAgfVxyXG5cclxuICBidWNrZXRLZXkobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5VHlwZSA9IGxvb2tHcm91cC5nZXQoJ2tleVR5cGUnKT8udmFsdWU7XHJcbiAgICBjb25zdCBrZXkgPSBrZXlUeXBlID09PSAnYnJhbmRDYXRlZ29yeSdcclxuICAgICAgPyBsb29rR3JvdXAuZ2V0KCdicmFuZENhdGVnb3J5Jyk/LnZhbHVlXHJcbiAgICAgIDogbG9va0dyb3VwLmdldCgnbWJxQnVja2V0Jyk/LnZhbHVlO1xyXG4gICAgcmV0dXJuIChrZXkgfHwgJycpLnRyaW0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFzc2lnbiBhIGNvbG91ciB0byBlYWNoIHVuaXF1ZSBidWNrZXQga2V5IGJ5ICoqaW5zZXJ0aW9uIG9yZGVyKiosIG5vdCBieSBoYXNoLlxyXG4gICAqIFRoZSBOdGggZGlzdGluY3QgYnVja2V0IChjb3VudGVkIHRvcC10by1ib3R0b20gdGhyb3VnaCB0aGUgbG9va3MgYXJyYXkpIGdldHNcclxuICAgKiBgQlVDS0VUX1BBTEVUVEVbTl1gLiBPbmx5IGFmdGVyIGFsbCAyMCBwYWxldHRlIHNsb3RzIGFyZSB1c2VkIGRvZXMgdGhlIGFzc2lnbm1lbnRcclxuICAgKiB3cmFwIGFyb3VuZCDigJQgc28gbm8gY29sb3VyIGlzIGV2ZXIgcmV1c2VkIHdoaWxlIDwgMjAgZGlzdGluY3QgYnVja2V0cyBleGlzdC5cclxuICAgKlxyXG4gICAqIFJlY29tcHV0ZWQgb24gZXZlcnkgY2FsbCBzbyBsaXZlIGVkaXRzIHRvIHRoZSBidWNrZXQgbmFtZSByZS1mbG93IGNvbG91cnMuXHJcbiAgICovXHJcbiAgYnVja2V0Q29sb3IobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWNrZXRLZXkobG9va0dyb3VwKTtcclxuICAgIGlmICgha2V5KSByZXR1cm4gJyNmOWZhZmInO1xyXG4gICAgY29uc3QgcGFsZXR0ZSA9IExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50LkJVQ0tFVF9QQUxFVFRFO1xyXG4gICAgbGV0IG5leHRJbmRleCA9IDA7XHJcbiAgICBjb25zdCBhc3NpZ25lZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMubG9va3MuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgayA9IHRoaXMuYnVja2V0S2V5KGdyb3VwIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgIGlmIChrICYmICFhc3NpZ25lZC5oYXMoaykpIHtcclxuICAgICAgICBhc3NpZ25lZC5zZXQoaywgcGFsZXR0ZVtuZXh0SW5kZXggJSBwYWxldHRlLmxlbmd0aF0pO1xyXG4gICAgICAgIG5leHRJbmRleCArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChrID09PSBrZXkpIHtcclxuICAgICAgICByZXR1cm4gYXNzaWduZWQuZ2V0KGspITtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcjZjlmYWZiJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlb3JkZXIgdGhlIGxvb2tzIEZvcm1BcnJheSBzbyB0aGF0IHRoZSBidWNrZXQgd2l0aCB0aGUgKiptb3N0KiogbG9va3NcclxuICAgKiBjb21lcyBmaXJzdCBhbmQgdGhlIG9uZSB3aXRoIHRoZSBmZXdlc3QgY29tZXMgbGFzdCAoYWxwaGFiZXRpY2FsIHRpZS1icmVha1xyXG4gICAqIHdpdGhpbiB0aGUgc2FtZSBjb3VudCkuIExvb2tzIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQgYXJlIHNvcnRlZCBieVxyXG4gICAqIGFzY2VuZGluZyBmaXh0dXJlQ291bnQuIFNlbGVjdGlvbiBpcyBwcmVzZXJ2ZWQgYnkgcmVmZXJlbmNlLCBub3QgYnkgaW5kZXguXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseVNvcnRlZE9yZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5sb29rcy5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIGlmIChncm91cHMubGVuZ3RoIDw9IDEpIHJldHVybjtcclxuXHJcbiAgICAvLyBUYWxseSBob3cgbWFueSBsb29rcyBlYWNoIGJ1Y2tldCBoYXMgc28gd2UgY2FuIHNvcnQgYnVja2V0cyBieSBmcmVxdWVuY3kuXHJcbiAgICBjb25zdCBidWNrZXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5idWNrZXRLZXkoZyk7XHJcbiAgICAgIGlmICghaykgY29udGludWU7XHJcbiAgICAgIGJ1Y2tldENvdW50cy5zZXQoaywgKGJ1Y2tldENvdW50cy5nZXQoaykgfHwgMCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZ3JvdXBzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFLZXkgPSB0aGlzLmJ1Y2tldEtleShhKTtcclxuICAgICAgY29uc3QgYktleSA9IHRoaXMuYnVja2V0S2V5KGIpO1xyXG4gICAgICAvLyBFbXB0eSBidWNrZXQga2V5cyBnbyB0byB0aGUgZW5kIHNvIHVuZmluaXNoZWQgbG9va3MgZG9uJ3QgZGlzcnVwdCB0aGUgZ3JvdXBzXHJcbiAgICAgIGlmIChhS2V5ICYmICFiS2V5KSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUtleSAmJiBiS2V5KSByZXR1cm4gMTtcclxuXHJcbiAgICAgIC8vIFByaW1hcnk6IGJ1Y2tldCBmcmVxdWVuY3ksIGRlc2NlbmRpbmcgKG1vc3QtcG9wdWxhdGVkIGJ1Y2tldCBmaXJzdClcclxuICAgICAgY29uc3QgYUNvdW50ID0gYnVja2V0Q291bnRzLmdldChhS2V5KSB8fCAwO1xyXG4gICAgICBjb25zdCBiQ291bnQgPSBidWNrZXRDb3VudHMuZ2V0KGJLZXkpIHx8IDA7XHJcbiAgICAgIGlmIChhQ291bnQgIT09IGJDb3VudCkgcmV0dXJuIGJDb3VudCAtIGFDb3VudDtcclxuXHJcbiAgICAgIC8vIFRpZS1icmVhazogYWxwaGFiZXRpY2FsIGJ1Y2tldCBuYW1lXHJcbiAgICAgIGlmIChhS2V5ICE9PSBiS2V5KSByZXR1cm4gYUtleS5sb2NhbGVDb21wYXJlKGJLZXkpO1xyXG5cclxuICAgICAgLy8gV2l0aGluIHRoZSBzYW1lIGJ1Y2tldDogYXNjZW5kaW5nIGZpeHR1cmVDb3VudFxyXG4gICAgICBjb25zdCBhRkMgPSBOdW1iZXIoYS5nZXQoJ2ZpeHR1cmVDb3VudCcpPy52YWx1ZSkgfHwgMDtcclxuICAgICAgY29uc3QgYkZDID0gTnVtYmVyKGIuZ2V0KCdmaXh0dXJlQ291bnQnKT8udmFsdWUpIHx8IDA7XHJcbiAgICAgIHJldHVybiBhRkMgLSBiRkM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBvcmRlckNoYW5nZWQgPSBzb3J0ZWQuc29tZSgoZywgaSkgPT4gZyAhPT0gZ3JvdXBzW2ldKTtcclxuICAgIGlmICghb3JkZXJDaGFuZ2VkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3VycmVudExvb2sgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgY29uc3QgY3VycmVudFNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG5cclxuICAgIHRoaXMubG9va3MuY2xlYXIoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgc29ydGVkLmZvckVhY2goKGcpID0+IHRoaXMubG9va3MucHVzaChnLCB7IGVtaXRFdmVudDogZmFsc2UgfSkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50TG9vaykge1xyXG4gICAgICBjb25zdCBuZXdMb29rSWR4ID0gc29ydGVkLmluZGV4T2YoY3VycmVudExvb2spO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gbmV3TG9va0lkeDtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCAmJiBjdXJyZW50U2xvdCkge1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICAgICAgY29uc3QgbmV3U2xvdElkeCA9IHNsb3RzQXJyLmNvbnRyb2xzLmluZGV4T2YoY3VycmVudFNsb3QpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBuZXdTbG90SWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzYXZlKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdD8uKCdQbGVhc2UgZmlsbCBhbGwgcmVxdWlyZWQgZmllbGRzJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFNvcnQgdGhlIGxvb2tzIGJlZm9yZSBzZXJpYWxpc2luZyBzbyBib3RoIHRoZSBwZXJzaXN0ZWQgcGF5bG9hZFxyXG4gICAgICAvLyBhbmQgdGhlIG9uLXNjcmVlbiBsaXN0IHJlZmxlY3QgZ3JvdXBpbmcgYnkgTUJRIGJ1Y2tldCAvIGJyYW5kIGNhdGVnb3J5XHJcbiAgICAgIC8vIGFuZCBhc2NlbmRpbmcgZml4dHVyZSBjb3VudC5cclxuICAgICAgdGhpcy5hcHBseVNvcnRlZE9yZGVyKCk7XHJcblxyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXcpIHtcclxuICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5jcmVhdGVMb29rUGxhbm9Db2xsZWN0aW9uKHBheWxvYWQpKTtcclxuICAgICAgICBjb25zdCBuZXdJZCA9IHJlcz8uZGF0YT8uX2lkO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0Py4oJ0xvb2sgY29sbGVjdGlvbiBjcmVhdGVkJyk7XHJcbiAgICAgICAgaWYgKG5ld0lkKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2xvb2tzJywgbmV3SWRdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcyddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UudXBkYXRlTG9va1BsYW5vQ29sbGVjdGlvbih7IC4uLnBheWxvYWQsIGNvbGxlY3Rpb25JZDogdGhpcy5jb2xsZWN0aW9uSWQgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdD8uKCdMb29rIGNvbGxlY3Rpb24gdXBkYXRlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gc2F2ZSBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Q/LignRmFpbGVkIHRvIHNhdmUgTG9vayBjb2xsZWN0aW9uJyk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcyddKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgLy8gUmVsZWFzZSB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCBzbyBvdGhlciBwYWdlcyBkb24ndCBpbmhlcml0IGEgc3RhbGUgbGlicmFyeS5cclxuICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQobnVsbCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwibG9vay1mb3JtXCI+XHJcbiAgPCEtLSBUb3AgYmFyIChib3VuZCB0byB0aGUgb3V0ZXIgZm9ybSkgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPk5hbWUgKjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIE1hc3RlciBMb29rIFBsYW4gRlkyNlwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgZGVzY3JpcHRpb25cIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmdy1ib2xkIGQtYmxvY2tcIj5BY3RpdmU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0FjdGl2ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgdGV4dC1lbmRcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMlwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInNhdmluZ1wiIChjbGljayk9XCJzYXZlKClcIj5cclxuICAgICAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogJ1NhdmUnIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVGhyZWUtcGFuZSBlZGl0b3IgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBteC0wIGctM1wiPlxyXG4gICAgPCEtLSBMZWZ0OiBMb29rcyBsaXN0IChubyBmb3JtIGJpbmRpbmcgbmVlZGVkIOKAlCBqdXN0IG5hdmlnYXRpb24pIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBoLTEwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgIDxoNiBjbGFzcz1cIm0tMFwiPk1CUSBCdWNrZXQgLSBGaXh0dXJlIENvbWJpbmF0aW9uczwvaDY+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkTG9vaygpXCI+KyBBZGQgTG9vazwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsb29rcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBsb29rcyB5ZXQuIEFkZCBvbmUgdG8gc3RhcnQuPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvb2tzLXRyZWVcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvb2sgb2YgbG9va3MuY29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibG9vay1yb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yIHB5LTIgbWItMSByb3VuZGVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkTG9va0luZGV4ID09PSBpXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TG9vayhpKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidWNrZXQtZG90XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3sgbG9va1RpdGxlKCRhbnkobG9vaykpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQtZGFuZ2VyIG1zLTJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVMb29rKGkpXCI+w5c8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2VudHJlOiBzZWxlY3RlZCBMb29rIG1ldGFkYXRhICsgc2xvdHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9va0dyb3VwIGFzIGxvb2tHcm91cDsgZWxzZSBub0xvb2tcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgaC0xMDBcIiBbZm9ybUdyb3VwXT1cImxvb2tHcm91cFwiPlxyXG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItM1wiPkZpeHR1cmUgQ29tYmluYXRpb24gRGV0YWlsczwvaDY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+TUJRIGJ1Y2tldDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwibWJxQnVja2V0XCIgcGxhY2Vob2xkZXI9XCJlLmcuIEpKIC8gT0QgRXllXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIGNvdW50ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjMwXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNvdW50XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rml4dHVyZSBQb3NpdGlvbnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZml4dHVyZVR5cGVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGZpeHR1cmUgcG9zaXRpb25cIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZVR5cGVcIj5cclxuICAgICAgICAgICAgICA8L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGhyIC8+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtLTBcIj5GaXh0dXJlczwvaDY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiAoY2xpY2spPVwiYWRkU2xvdCgpXCI+KyBBZGQgRml4dHVyZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xvdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNsb3Qgb2YgKHNlbGVjdGVkU2xvdHNBcnJheT8uY29udHJvbHMgfHwgW10pOyBsZXQgcyA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2xvdC1yb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yIHB5LTIgbWItMSByb3VuZGVkXCJcclxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0ZWRTbG90SW5kZXggPT09IHNcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTbG90KHMpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctYm9sZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICBGaXh0dXJlIHt7ICRhbnkoc2xvdCkuZ2V0KCdzbG90SW5kZXgnKT8udmFsdWUgfX0g4oCUIHt7ICRhbnkoc2xvdCkuZ2V0KCdzbG90VHlwZScpPy52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7ICRhbnkoc2xvdCkuZ2V0KCdicmFuZCcpPy52YWx1ZSB8fCAnKG5vIGJyYW5kKScgfX0gwrdcclxuICAgICAgICAgICAgICAgICAge3sgJGFueShzbG90KS5nZXQoJ2ZpeHR1cmVMZXZlbFpvbmUnKT8udmFsdWUgfHwgJyhubyB6b25lKScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0LWRhbmdlciBtcy0yXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcmVtb3ZlU2xvdChzKVwiPsOXPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI25vTG9vaz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTUgaC0xMDAgdGV4dC1jZW50ZXIgdGV4dC1tdXRlZFwiPlNlbGVjdCBvciBhZGQgYSBMb29rIHRvIGVkaXQgaXQuPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJpZ2h0OiBzZWxlY3RlZCBzbG90IOKAlCBwbGFjZW1lbnRzIGVkaXRvciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRTbG90R3JvdXAgYXMgc2xvdEdyb3VwOyBlbHNlIG5vU2xvdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBoLTEwMFwiIFtmb3JtR3JvdXBdPVwic2xvdEdyb3VwXCI+XHJcbiAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0zXCI+Rml4dHVyZSB7eyBzZWxlY3RlZFNsb3RJbmRleCArIDEgfX0gLSBEZWZpbml0aW9uPC9oNj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMiBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsIHRleHQtbXV0ZWRcIj5TbG90IGluZGV4IChhdXRvKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3ZhbHVlXT1cInNlbGVjdGVkU2xvdEluZGV4ICsgMVwiIHJlYWRvbmx5IGRpc2FibGVkIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rml4dHVyZSBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBmb3JtQ29udHJvbE5hbWU9XCJzbG90VHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGF2YWlsYWJsZVNsb3RUeXBlc1wiIFt2YWx1ZV09XCJvcHQuaWRcIj57eyBvcHQubmFtZSB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJyYW5kPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBmb3JtQ29udHJvbE5hbWU9XCJicmFuZFwiIHBsYWNlaG9sZGVyPVwiSm9obiBKYWNvYnNcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIEhlYWRlcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUxldmVsWm9uZVwiIHBsYWNlaG9sZGVyPVwiUHJlbWl1bSBUcmVuZGluZ1wiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkNBRCBIZWFkZXIgVmFyaWVudHM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxsaWItY2hpcHMtaW5wdXRcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNhZEhlYWRlclZhcmlhbnRzXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBhIHZhcmlhbnQgYW5kIHByZXNzIEVudGVyXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItY2hpcHMtaW5wdXQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkZpeHR1cmUgVGVtcGxhdGVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaXh0dXJlLWxpYnJhcmllcy1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90XCJcclxuICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZD1cIm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZml4dHVyZSB0ZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUxpYnJhcnlSZWZzXCI+XHJcbiAgICAgICAgICAgICAgPC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cInNsb3RHcm91cC5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlID09PSAnZXVyb2NlbnRlcidcIj5cclxuICAgICAgICAgICAgICAgIFNob3dpbmcgZmxvb3IgZml4dHVyZXMgKGV1cm9jZW50ZXIgc2xvdCkuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJzbG90R3JvdXAuZ2V0KCdzbG90VHlwZScpPy52YWx1ZSAhPT0gJ2V1cm9jZW50ZXInXCI+XHJcbiAgICAgICAgICAgICAgICBTaG93aW5nIHdhbGwgZml4dHVyZXMgKHNoZWxmIHNsb3QpLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGhyIC8+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtLTBcIj5Mb29rIGFuZCBWaXN1YWwgTWVyY2hhbmRpc2luZyBQbGFjZW1lbnRzPC9oNj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodFwiIChjbGljayk9XCJhZGRQbGFjZW1lbnQoKVwiPisgQWRkIHBsYWNlbWVudDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkUGxhY2VtZW50cz8ubGVuZ3RoIHx8IDApID09PSAwXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTJcIj5cclxuICAgICAgICAgICAgTm8gcGxhY2VtZW50cyB5ZXQuIENsaWNrIDxzdHJvbmc+KyBBZGQgcGxhY2VtZW50PC9zdHJvbmc+IHRvIGFkZCBvbmUuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbGFjZW1lbnRzLXNjcm9sbFwiIGZvcm1BcnJheU5hbWU9XCJwbGFjZW1lbnRzXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcCBvZiAoc2VsZWN0ZWRQbGFjZW1lbnRzPy5jb250cm9scyB8fCBbXSk7IGxldCBwaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicGxhY2VtZW50LXJvdyBtYi0yXCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJwaVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGdhcC0yIHBsYWNlbWVudC1maWVsZHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBmb3JtQ29udHJvbE5hbWU9XCJraW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInBpZFwiPlByb2R1Y3QgTWVyY2hhbmRpc2luZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ2bVwiPlZpc3VhbCBNZXJjaGFuZGlzaW5nPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBWaXN1YWwgTWVyY2hhbmRpc2luZyByb3dzOiBWTSBUeXBlIChzaW5nbGUpICsgVk0gQXJ0d29yayAoc2luZ2xlKSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIkYW55KHApLmdldCgna2luZCcpPy52YWx1ZSA9PT0gJ3ZtJzsgZWxzZSBwaWRJbnB1dHNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBoLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1zZWFyY2hhYmxlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInZtVHlwZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWRGaWVsZD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWVGaWVsZD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVmlzdWFsIE1lcmNoYW5kaXNpbmcgVHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwb3NpdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBoLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1zZWFyY2hhYmxlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInZtQXJ0d29ya09wdGlvbnNGb3IoJGFueShwKS5nZXQoJ3Bvc2l0aW9uJyk/LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZEZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJWaXN1YWwgTWVyY2hhbmRpc2luZyBBcnR3b3JrXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJhd1ZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saWItc2VhcmNoYWJsZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBQcm9kdWN0IE1lcmNoYW5kaXNpbmcgcm93czogVG9wL01pZC9Cb3R0b20gcG9zaXRpb24gKyBtdWx0aS1zZWxlY3QgcHJvZHVjdC9TS1UgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BpZElucHV0cz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBoLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9zaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Qb3NpdGlvbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlRvcFwiPlRvcDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIk1pZFwiPk1pZDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkJvdHRvbVwiPkJvdHRvbTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBoLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1zZWFyY2hhYmxlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInByb2R1Y3RPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlByb2R1Y3QgLyBTS1VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmF3VmFsdWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saWItc2VhcmNoYWJsZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0LWRhbmdlciBwaC1yZW1vdmVcIiAoY2xpY2spPVwicmVtb3ZlUGxhY2VtZW50KHBpKVwiPsOXPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI25vU2xvdD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTUgaC0xMDAgdGV4dC1jZW50ZXIgdGV4dC1tdXRlZFwiPlNlbGVjdCBhIGZpeHR1cmUgc2xvdCB0byBlZGl0IHBsYWNlbWVudHMuPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBQZXItc2xvdCBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFNsb3RHcm91cCBhcyBzbG90R3JvdXBGb3JNYXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtdC00IGxpYnJhcnktY29uZmlnLWNhcmRcIiBbZm9ybUdyb3VwXT1cInNsb3RHcm91cEZvck1hcFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgIDxoNSBjbGFzcz1cImZvcm0tbGFiZWwgZC1ibG9jayBtYi0zXCI+Rml4dHVyZSBsaWJyYXJ5PC9oNT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlicmFyeS1jaGlwc1wiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGliIG9mIHNlbGVjdGVkU2xvdExpYnJhcmllc0ZvckRyb3Bkb3duXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGlicmFyeS1jaGlwXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBsaWIuaWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25MaWJyYXJ5TWFwU2VsZWN0KHNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPT09IGxpYi5pZCA/ICcnIDogbGliLmlkKVwiPlxyXG4gICAgICAgICAgICB7eyBsaWIubmFtZSB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNtYWxsICpuZ0lmPVwic2VsZWN0ZWRTbG90TGlicmFyaWVzRm9yRHJvcGRvd24ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICBObyBsaWJyYXJpZXMgbGlua2VkIHRvIHRoaXMgc2xvdCB5ZXQuIEFkZCBzb21lIGluIHRoZSBcIkZpeHR1cmUgbGlicmFyaWVzXCIgbXVsdGlzZWxlY3QgYWJvdmUuXHJcbiAgICAgICAgPC9zbWFsbD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ0xpYnJhcnlEZXRhaWxzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+TG9hZGluZyBmaXh0dXJlIGRldGFpbHPigKY8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS1cclxuICAgICAgICBVc2UgKm5nRm9yICsgdHJhY2tCeSBrZXllZCBvbiAobG9vaywgc2xvdCwgbGlicmFyeSkgc28gQW5ndWxhciB0cmVhdHNcclxuICAgICAgICBhIHN3aXRjaCBhcyBhIG5ldyBpdGVtIOKAlCB0aGF0IGZvcmNlcyB0aGUgZW1iZWRkZWQgdGVtcGxhdGUtcHJvZHVjdHNcclxuICAgICAgICAvIHRlbXBsYXRlLXZtcyBjb21wb25lbnRzIHRvIHJlbW91bnQgYW5kIHJlcnVuIHRoZWlyIG5nT25Jbml0XHJcbiAgICAgICAgKG90aGVyd2lzZSB0aGVpciBgaXNQYWdlTG9hZGluZ2AgZ3VhcmQgc2tpcHMgdGhlIGZvcm0gcmVidWlsZCkuXHJcbiAgICAgIC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBfIG9mIGVtYmVkZGVkSG9zdEtleXM7IHRyYWNrQnk6IHRyYWNrQnlFbWJlZGRlZEtleVwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtdGFicyBjdXN0b20tdGFicyBtYi0zXCI+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1saW5rXCJcclxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImVtYmVkZGVkVGFiID09PSAncHJvZHVjdHMnXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZW1iZWRkZWRUYWIgPSAncHJvZHVjdHMnXCI+UHJvZHVjdCBNZXJjaGFuZGlzaW5nPC9idXR0b24+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlbWJlZGRlZFRhYiA9PT0gJ3ZtcydcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJlbWJlZGRlZFRhYiA9ICd2bXMnXCI+VmlzdWFsIE1lcmNoYW5kaXNpbmc8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImVtYmVkZGVkVGFiID09PSAncHJvZHVjdHMnXCI+XHJcbiAgICAgICAgICA8bGliLXRlbXBsYXRlLXByb2R1Y3RzIFtsb29rc01vZGVdPVwidHJ1ZVwiPjwvbGliLXRlbXBsYXRlLXByb2R1Y3RzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJlbWJlZGRlZFRhYiA9PT0gJ3ZtcydcIj5cclxuICAgICAgICAgIDxsaWItdGVtcGxhdGUtdm1zIFtsb29rc01vZGVdPVwidHJ1ZVwiPjwvbGliLXRlbXBsYXRlLXZtcz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
|
|
1309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVd2RSxNQUFNLE9BQU8sZ0NBQWdDO0lBa2VqQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBeGVWLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDZCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ2IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsSUFBSSxDQUFhO0lBQ2pCLGlCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9CLGlCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBRS9CLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsZ0ZBQWdGO0lBQ3ZFLGtCQUFrQixHQUFHO1FBQzVCLEVBQUUsRUFB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QUFPLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUMvRixDQUFDO2dCQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMseUJBQXlCLENBQUMsQ0FBQzthQUN6RDtTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUM5RDtnQkFBUztZQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO3dHQTUwQ1UsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0Msc0VDZDdDLG1sZUE0U0E7OzRGRDlSYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rLXBsYW5vLWNvbGxlY3Rpb24tZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2xvb2stcGxhbm8tY29sbGVjdGlvbi1mb3JtLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkID0gJyc7XHJcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpc05ldyA9IHRydWU7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG5cclxuICBmb3JtITogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkTG9va0luZGV4OiBudW1iZXIgPSAtMTtcclxuICBzZWxlY3RlZFNsb3RJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vIERpc3BsYXkgbGFiZWxzIGFyZSBXYWxsIC8gRmxvb3I7IHRoZSBzdG9yZWQgaWRzIHN0YXkgJ3NoZWxmJyAvICdldXJvY2VudGVyJ1xyXG4gIC8vIHNvIHRoZSBsaWJyYXJ5IGZpbHRlciwgc2xvdCBkZWZhdWx0cywgYW5kIHRoZSBiYWNrZW5kIHNsb3RUeXBlL2ZpeHR1cmVUeXBlXHJcbiAgLy8gZW51bXMga2VlcCB3b3JraW5nIHVuY2hhbmdlZCAoJ3NoZWxmJyDihpIgd2FsbCBmaXh0dXJlcywgJ2V1cm9jZW50ZXInIOKGkiBmbG9vcikuXHJcbiAgcmVhZG9ubHkgZml4dHVyZVR5cGVPcHRpb25zID0gW1xyXG4gICAgeyBpZDogJ3NoZWxmJywgbmFtZTogJ1dhbGwnIH0sXHJcbiAgICB7IGlkOiAnZXVyb2NlbnRlcicsIG5hbWU6ICdGbG9vcicgfSxcclxuICBdO1xyXG5cclxuICBmaXh0dXJlTGlicmFyeUl0ZW1zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gRHJvcGRvd25zIGluc2lkZSBwbGFjZW1lbnQgcm93cy5cclxuICB2bVR5cGVPcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgdm1BcnR3b3JrT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyB2bVR5cGU/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgcHJvZHVjdE9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICAvKiogQ2FjaGVkIHBlci12bVR5cGUgYXJ0d29yayBsaXN0IOKAlCBzYW1lIHJlZmVyZW5jZSByZXR1cm5lZCBlYWNoIGxvb2t1cCBzb1xyXG4gICAqICBsaWItcmVhY3RpdmUtc2VsZWN0IGRvZXNuJ3QgcmVzZXQgc3RhdGUgZXZlcnkgQ0QgY3ljbGUuICovXHJcbiAgcHJpdmF0ZSB2bUFydHdvcmtCeVR5cGU6IE1hcDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiAodm1OYW1lfHx2bVR5cGUpIGFuZCAodm1OYW1lKSDihpIgcGxhbm92bSBfaWQsIHNvIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29ya1xyXG4gICAqICBuYW1lIGNhbiBiZSByZXNvbHZlZCB0byB0aGUgX2lkIHRoZSBlbWJlZGRlZCBWTSBlZGl0b3IgbWF0Y2hlcyBhZ2FpbnN0LiAqL1xyXG4gIHByaXZhdGUgdm1JZEJ5TmFtZVR5cGU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGVkIGZpbHRlcmVkIGxpc3QgYm91bmQgdG8gdGhlIFwiRml4dHVyZSBsaWJyYXJpZXNcIiBtdWx0aXNlbGVjdC5cclxuICAgKiBNdXN0IE5PVCBiZSBhIGdldHRlciDigJQgdGhlIHVuZGVybHlpbmcgbXVsdGlzZWxlY3QgcmUtY2xvbmVzIGl0cyBpdGVtcyBvblxyXG4gICAqIGV2ZXJ5IG5nT25DaGFuZ2VzLCB3aGljaCBkZXRhY2hlcyBjbGljayB0YXJnZXRzIGFuZCBicmVha3Mgc2VsZWN0aW9uLlxyXG4gICAqL1xyXG4gIGZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90OiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gU3RhdGUgZm9yIHRoZSBwZXItc2xvdCBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkLlxyXG4gIHNlbGVjdGVkTGlicmFyeUlkSW5NYXA6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkTGlicmFyeURldGFpbHM6IGFueSA9IG51bGw7XHJcbiAgbG9hZGluZ0xpYnJhcnlEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW1iZWRkZWRUYWI6ICdwcm9kdWN0cycgfCAndm1zJyA9ICdwcm9kdWN0cyc7XHJcblxyXG4gIC8vID09PSBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkIGhlbHBlcnMgPT09XHJcblxyXG4gIC8qKiBTbG90J3MgcGxhY2VtZW50cyB3aXRoIGtpbmQgPSAndm0nLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFZtSXRlbXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNlbWVudHNUb0l0ZW1zKCd2bScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNsb3QncyBwbGFjZW1lbnRzIHdpdGgga2luZCA9ICdwaWQnLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFBpZEl0ZW1zKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnRzVG9JdGVtcygncGlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBsYWNlbWVudHNUb0l0ZW1zKGtpbmQ6ICd2bScgfCAncGlkJyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3QgYXJyID0gc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgaWYgKCFhcnIpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBhcnIuY29udHJvbHNcclxuICAgICAgICAubWFwKChjKSA9PiBjLnZhbHVlKVxyXG4gICAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcD8ua2luZCA9PT0ga2luZCAmJiBwPy5wb3NpdGlvbilcclxuICAgICAgICAubWFwKChwOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBpZDogcC5wb3NpdGlvbixcclxuICAgICAgICAgIG5hbWU6IHAucmF3VmFsdWUgPyBgJHtwLnBvc2l0aW9ufSDigJQgJHtwLnJhd1ZhbHVlfWAgOiBwLnBvc2l0aW9uLFxyXG4gICAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKiBGaXh0dXJlLWxpYnJhcnkgb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duIOKAlCBmaWx0ZXJlZCB0byB0aGUgbGlicmFyaWVzXHJcbiAgICogIHNlbGVjdGVkIG9uIHRoZSBjdXJyZW50bHktYWN0aXZlIHNsb3QncyBtdWx0aXNlbGVjdC4gKi9cclxuICBnZXQgc2VsZWN0ZWRTbG90TGlicmFyaWVzRm9yRHJvcGRvd24oKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gW107XHJcbiAgICBjb25zdCByZWZzOiBzdHJpbmdbXSA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW107XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gcmVmcy5pbmNsdWRlcyhpdGVtLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEZvcm1BcnJheSB0aGF0IHN0b3JlcyBwZXItKGxpYnJhcnksIHNoZWxmKSBWTS9QSUQgdmFsdWVzIGZvciB0aGUgYWN0aXZlIHNsb3QuICovXHJcbiAgZ2V0IHNlbGVjdGVkU2xvdExpYnJhcnlDb25maWdzKCk6IEZvcm1BcnJheSB8IG51bGwge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICByZXR1cm4gc2xvdCA/IChzbG90LmdldCgnbGlicmFyeUNvbmZpZ3VyYXRpb25zJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogRm9ybS1hcnJheSBlbnRyaWVzIHNjb3BlZCB0byB0aGUgY3VycmVudGx5LXNob3duIGxpYnJhcnkgaW4gdGhlIGNvbmZpZyBjYXJkLiAqL1xyXG4gIGNvbmZpZ0VudHJpZXNGb3JDdXJyZW50TGlicmFyeSgpOiB7IGNvbnRyb2w6IEZvcm1Hcm91cDsgYXJyYXlJbmRleDogbnVtYmVyIH1bXSB7XHJcbiAgICBjb25zdCBjb25maWdzID0gdGhpcy5zZWxlY3RlZFNsb3RMaWJyYXJ5Q29uZmlncztcclxuICAgIGlmICghY29uZmlncyB8fCAhdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gY29uZmlncy5jb250cm9sc1xyXG4gICAgICAgIC5tYXAoKGMsIGkpID0+ICh7IGNvbnRyb2w6IGMgYXMgRm9ybUdyb3VwLCBhcnJheUluZGV4OiBpIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguY29udHJvbC5nZXQoJ2xpYnJhcnlSZWYnKT8udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzZXQgY2FyZCBzdGF0ZSB3aGVuZXZlciB0aGUgYWN0aXZlIHNsb3QgY2hhbmdlcyBzbyB3ZSBkb24ndCBjYXJyeSBvdmVyXHJcbiAgICogIHN0YWxlIHNlbGVjdGlvbnMgZnJvbSBhIHByZXZpb3VzbHktdmlld2VkIHNsb3QuICovXHJcbiAgcHJpdmF0ZSByZXNldExpYnJhcnlNYXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSAnJztcclxuICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA9IG51bGw7XHJcbiAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAvLyBDbGVhciB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCB0b28gc28gdGhlIGVtYmVkZGVkIFRlbXBsYXRlUHJvZHVjdHMgL1xyXG4gICAgLy8gVGVtcGxhdGVWbXMgY29tcG9uZW50cywgaWYgdGhleSdyZSBzdGlsbCBtb3VudGVkLCBkb24ndCByZW5kZXIgc3RhbGVcclxuICAgIC8vIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgc2xvdCdzIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZW4gYSBzbG90IGlzIGxvYWRlZCwgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBsaWJyYXJ5IGl0IGhhcyBsaW5rZWRcclxuICAgKiAgc28gdGhlIGVtYmVkZGVkIGZpeHR1cmUtdGVtcGxhdGUgZWRpdG9yIG9wZW5zIHN0cmFpZ2h0IHRvIHRoYXQgbGlicmFyeS4gKi9cclxuICBwcml2YXRlIGF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVmczogc3RyaW5nW10gPSBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWZzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZmlyc3RJZCA9IHJlZnMuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgaWYgKCFmaXJzdElkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBmaXJzdElkKSByZXR1cm47XHJcbiAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdChmaXJzdElkKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIHRoZSBzbG90J3Mgc2F2ZWQgc25hcHNob3QgZm9yIGEgbGlicmFyeSwgaWYgYW55LiAqL1xyXG4gIHByaXZhdGUgZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkOiBzdHJpbmcpOiBhbnkgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNuYXBzOiBhbnlbXSA9IHNsb3QuZ2V0KCdsaWJyYXJ5U25hcHNob3RzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZW50cnkgPSBzbmFwcy5maW5kKChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICByZXR1cm4gZW50cnk/LnNuYXBzaG90IHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyc2lzdCBhIHNuYXBzaG90IGludG8gdGhlIHNsb3QncyBsaWJyYXJ5U25hcHNob3RzIEZvcm1Db250cm9sLiAqL1xyXG4gIHByaXZhdGUgY2FwdHVyZUxpYnJhcnlTbmFwc2hvdChsaWJJZDogc3RyaW5nLCBzbmFwc2hvdDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCB8fCAhbGliSWQpIHJldHVybjtcclxuICAgIGNvbnN0IGN0cmwgPSBzbG90LmdldCgnbGlicmFyeVNuYXBzaG90cycpO1xyXG4gICAgaWYgKCFjdHJsKSByZXR1cm47XHJcbiAgICBjb25zdCBjdXJyZW50OiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoY3RybC52YWx1ZSkgPyBbLi4uY3RybC52YWx1ZV0gOiBbXTtcclxuICAgIC8vIFN0cmlwIHRoZSBpZ25vcmVVcGRhdGUgZmxhZyBiZWZvcmUgc2F2aW5nIHNvIHdlIGRvbid0IGVjaG8gaXQgYmFjayBsYXRlci5cclxuICAgIGNvbnN0IHsgaWdub3JlVXBkYXRlOiBfaWdub3JlZCwgLi4uY2xlYW4gfSA9IHNuYXBzaG90IHx8IHt9O1xyXG4gICAgY29uc3QgaSA9IGN1cnJlbnQuZmluZEluZGV4KChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIGN1cnJlbnRbaV0gPSB7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1cnJlbnQucHVzaCh7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfSk7XHJcbiAgICB9XHJcbiAgICBjdHJsLnNldFZhbHVlKGN1cnJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbCB2bUNvbmZpZyBjb29yZHMgZm9yIGEgZnJlc2hseS1hZGRlZCBWTSBlbnRyeSwgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAqIHZtVHlwZSBhbmQgdGhlIHRhcmdldCBsaWJyYXJ5J3Mgc2hlbGYgbGF5b3V0LiBNaXJyb3JzIHRoZSB3YWxsLWxheW91dFxyXG4gICAqIHJ1bGVzIGluIGBydW5Mb29rc0FsbG9jYXRpb25gIChvbmJvYXJkLmNvbnRyb2xsZXIuanM6YnVpbGRXYWxsVm1FbnRyeSlcclxuICAgKiBzbyB3aGF0IHRoZSBmb3JtIHByZS1wb3NpdGlvbnMgbWF0Y2hlcyB3aGF0IHRoZSBiYWNrZW5kIGFsbG9jYXRvciB3b3VsZFxyXG4gICAqIHBsYWNlIHRoZXJlLlxyXG4gICAqXHJcbiAgICogICBUb3AgTWFza2luZyAgICAgIC0+IGZpcnN0IHNoZWxmLCAgc3RyZXRjaCAodG9wIHN0cmlwIG9mIGZpeHR1cmUpXHJcbiAgICogICBNaWQgMSAvIE1pZCAgICAgIC0+IGZpcnN0IG1pZCBzaGVsZiwgbGVmdFxyXG4gICAqICAgTWlkIDIgICAgICAgICAgICAtPiBsYXN0IG1pZCBzaGVsZiwgIHJpZ2h0XHJcbiAgICogICBNaWQgMyAgICAgICAgICAgIC0+IG1pZGRsZSBtaWQgc2hlbGYgKG9yIGxhc3QpLCBzdHJldGNoXHJcbiAgICogICBCb3R0b20gU2xhbnRlciAgIC0+IGxhc3Qgc2hlbGYsICAgIHN0cmV0Y2ggKGJvdHRvbSBzdHJpcClcclxuICAgKlxyXG4gICAqIEFueXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGUgcHJldmlvdXMgbmV1dHJhbCBkZWZhdWx0ICh0b3AsIG5vIHpvbmUpXHJcbiAgICogc28gYmVoYXZpb3VyIGRvZXNuJ3QgY2hhbmdlIGZvciB1bmtub3duIGxhYmVscy5cclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxWbUxheW91dCh2bVR5cGU6IHN0cmluZywgc2hlbGZDb25maWc6IGFueVtdKTpcclxuICAgICAgeyBzdGFydFlQb3NpdGlvbjogbnVtYmVyOyBlbmRZUG9zaXRpb246IG51bWJlcjsgeFpvbmU6IHN0cmluZzsgeVpvbmU6IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG5vcm0gPSBTdHJpbmcodm1UeXBlID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHNoZWx2ZXMgPSBBcnJheS5pc0FycmF5KHNoZWxmQ29uZmlnKVxyXG4gICAgICA/IHNoZWxmQ29uZmlnLnNsaWNlKCkuc29ydChcclxuICAgICAgICAgIChhLCBiKSA9PiAoYT8uc2hlbGZOdW1iZXIgfHwgMCkgLSAoYj8uc2hlbGZOdW1iZXIgfHwgMCksXHJcbiAgICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgaW5ab25lID0gKHo6IHN0cmluZyk6IGFueVtdID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gei50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gc2hlbHZlcy5maWx0ZXIoXHJcbiAgICAgICAgICAocykgPT4gU3RyaW5nKHM/LnpvbmUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQsXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZmlyc3RTaGVsZiA9IHNoZWx2ZXNbMF0/LnNoZWxmTnVtYmVyIHx8IDE7XHJcbiAgICBjb25zdCBsYXN0U2hlbGYgPSBzaGVsdmVzW3NoZWx2ZXMubGVuZ3RoIC0gMV0/LnNoZWxmTnVtYmVyIHx8IGZpcnN0U2hlbGY7XHJcblxyXG4gICAgaWYgKG5vcm0gPT09ICd0b3AgbWFza2luZycgfHwgbm9ybSA9PT0gJ3RvcCcpIHtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IGZpcnN0U2hlbGYsIGVuZFlQb3NpdGlvbjogZmlyc3RTaGVsZiwgeFpvbmU6ICdzdHJldGNoJywgeVpvbmU6ICdzdHJldGNoJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKG5vcm0gPT09ICdtaWQgMScgfHwgbm9ybSA9PT0gJ21pZCcpIHtcclxuICAgICAgY29uc3QgbSA9IGluWm9uZSgnTWlkJyk7XHJcbiAgICAgIGNvbnN0IHNuID0gbVswXT8uc2hlbGZOdW1iZXIgfHwgZmlyc3RTaGVsZjtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IHNuLCBlbmRZUG9zaXRpb246IHNuLCB4Wm9uZTogJ2xlZnQnLCB5Wm9uZTogJ3N0cmV0Y2gnIH07XHJcbiAgICB9XHJcbiAgICBpZiAobm9ybSA9PT0gJ21pZCAyJykge1xyXG4gICAgICBjb25zdCBtID0gaW5ab25lKCdNaWQnKTtcclxuICAgICAgY29uc3Qgc24gPSBtW20ubGVuZ3RoIC0gMV0/LnNoZWxmTnVtYmVyIHx8IGZpcnN0U2hlbGY7XHJcbiAgICAgIHJldHVybiB7IHN0YXJ0WVBvc2l0aW9uOiBzbiwgZW5kWVBvc2l0aW9uOiBzbiwgeFpvbmU6ICdyaWdodCcsIHlab25lOiAnc3RyZXRjaCcgfTtcclxuICAgIH1cclxuICAgIGlmIChub3JtID09PSAnbWlkIDMnKSB7XHJcbiAgICAgIGNvbnN0IG0gPSBpblpvbmUoJ01pZCcpO1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBtLmxlbmd0aCA+PSAzID8gbVtNYXRoLmZsb29yKG0ubGVuZ3RoIC8gMildIDogbVttLmxlbmd0aCAtIDFdO1xyXG4gICAgICBjb25zdCBzbiA9IHRhcmdldD8uc2hlbGZOdW1iZXIgfHwgZmlyc3RTaGVsZjtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IHNuLCBlbmRZUG9zaXRpb246IHNuLCB4Wm9uZTogJ3N0cmV0Y2gnLCB5Wm9uZTogJ3N0cmV0Y2gnIH07XHJcbiAgICB9XHJcbiAgICBpZiAobm9ybSA9PT0gJ2JvdHRvbSBzbGFudGVyJykge1xyXG4gICAgICByZXR1cm4geyBzdGFydFlQb3NpdGlvbjogbGFzdFNoZWxmLCBlbmRZUG9zaXRpb246IGxhc3RTaGVsZiwgeFpvbmU6ICdzdHJldGNoJywgeVpvbmU6ICdzdHJldGNoJyB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IDEsIGVuZFlQb3NpdGlvbjogMSwgeFpvbmU6ICcnLCB5Wm9uZTogJycgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNvbHZlIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29yayBOQU1FICgrIHZtVHlwZSkgdG8gaXRzIHBsYW5vdm0gX2lkLiAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVZtSWQodm1OYW1lOiBzdHJpbmcsIHZtVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vcm1WbVR5cGUodm1OYW1lKTtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuZ2V0KGAke25hbWV9fHwke3R5cGV9YCkgfHxcclxuICAgICAgdGhpcy52bUlkQnlOYW1lVHlwZS5nZXQobmFtZSkgfHxcclxuICAgICAgdm1OYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmUtZGVyaXZlIGV2ZXJ5IGFzc2lnbmVkIGxpYnJhcnkncyBzbmFwc2hvdCBmcm9tIHRoZSBhY3RpdmUgc2xvdCdzXHJcbiAgICogY3VycmVudCBwbGFjZW1lbnRzLiBEcml2ZW4gYnkgdGhlIFwiTG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmdcclxuICAgKiBQbGFjZW1lbnRzXCIgbGlzdCDigJQgc28gZWRpdGluZyBvbmUgcGxhY2VtZW50IHVwZGF0ZXMgQUxMIGFzc2lnbmVkXHJcbiAgICogbGlicmFyaWVzIGF0IG9uY2UuXHJcbiAgICpcclxuICAgKiAgLSBQSUQgcGxhY2VtZW50czogYHBvc2l0aW9uYCAoVG9wL01pZC9Cb3R0b20pIOKGkiBzaGVsZiB6b25lOyB0aGUgc2hlbGYnc1xyXG4gICAqICAgIHByb2R1Y3RCcmFuZE5hbWUgaXMgT1ZFUldSSVRURU4gd2l0aCB0aGUgcGxhY2VtZW50J3MgcHJvZHVjdCBsaXN0LlxyXG4gICAqICAtIFZNIHBsYWNlbWVudHM6IGBwb3NpdGlvbmAg4oaSIHZtVHlwZTsgdGhlIG1hdGNoaW5nIHZtQ29uZmlnIGVudHJ5J3NcclxuICAgKiAgICBhcnR3b3JrICh2bUlkL3ZtTmFtZSkgaXMgdXBkYXRlZCB3aGlsZSB0aGUgbGlicmFyeSBrZWVwcyBpdHMgb3duIFZNXHJcbiAgICogICAgcG9zaXRpb25zLiB2bVR5cGVzIG5vdCB5ZXQgcHJlc2VudCBhcmUgYXBwZW5kZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBhcHBseVBsYWNlbWVudHNUb0Fzc2lnbmVkTGlicmFyaWVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHJldHVybjtcclxuICAgIGNvbnN0IHJlZnM6IHN0cmluZ1tdID0gKHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW10pXHJcbiAgICAgICAgLmZpbHRlcigocjogc3RyaW5nKSA9PiAhIXIpO1xyXG4gICAgaWYgKCFyZWZzLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudHM6IGFueVtdID0gKHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbCk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3Qgbm9ybSA9IChzOiBhbnkpOiBzdHJpbmcgPT4gU3RyaW5nKHMgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIC8vIHpvbmUgLT4gcHJvZHVjdCBsaXN0IChQSURzKTsgc3VwcG9ydHMgYm90aCByYXdWYWx1ZXNbXSBhbmQgbGVnYWN5IHJhd1ZhbHVlLlxyXG4gICAgY29uc3QgcGlkQnlab25lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBsYWNlbWVudHMpIHtcclxuICAgICAgaWYgKHA/LmtpbmQgIT09ICdwaWQnIHx8ICFwPy5wb3NpdGlvbikgY29udGludWU7XHJcbiAgICAgIGNvbnN0IHZhbHM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShwLnJhd1ZhbHVlcykgJiYgcC5yYXdWYWx1ZXMubGVuZ3RoXHJcbiAgICAgICAgPyBwLnJhd1ZhbHVlcy5maWx0ZXIoKHY6IHN0cmluZykgPT4gISF2KVxyXG4gICAgICAgIDogKHAucmF3VmFsdWUgPyBbIFN0cmluZyhwLnJhd1ZhbHVlKSBdIDogW10pO1xyXG4gICAgICBpZiAodmFscy5sZW5ndGgpIHBpZEJ5Wm9uZS5zZXQobm9ybShwLnBvc2l0aW9uKSwgdmFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdm1UeXBlIC0+IHsgdm1JZCwgdm1OYW1lLCBsYWJlbCB9IChWTXMpXHJcbiAgICBjb25zdCB2bUJ5VHlwZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHZtSWQ6IHN0cmluZzsgdm1OYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4oKTtcclxuICAgIGZvciAoY29uc3QgcCBvZiBwbGFjZW1lbnRzKSB7XHJcbiAgICAgIGlmIChwPy5raW5kICE9PSAndm0nIHx8ICFwPy5wb3NpdGlvbiB8fCAhcD8ucmF3VmFsdWUpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyhwLnBvc2l0aW9uKTtcclxuICAgICAgdm1CeVR5cGUuc2V0KG5vcm0obGFiZWwpLCB7XHJcbiAgICAgICAgdm1JZDogdGhpcy5yZXNvbHZlVm1JZChTdHJpbmcocC5yYXdWYWx1ZSksIGxhYmVsKSxcclxuICAgICAgICB2bU5hbWU6IFN0cmluZyhwLnJhd1ZhbHVlKSxcclxuICAgICAgICBsYWJlbCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm90aGluZyB0byBhcHBseSDigJQgYmFpbCBvdXQgYmVmb3JlIGFueSBmZXRjaC5cclxuICAgIGlmIChwaWRCeVpvbmUuc2l6ZSA9PT0gMCAmJiB2bUJ5VHlwZS5zaXplID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gRm9yIGFueSBsaWJyYXJ5IHRoYXQgZG9lc24ndCBoYXZlIGEgc25hcHNob3QgeWV0LCBmZXRjaCBpdHMgZGV0YWlscyBzb1xyXG4gICAgLy8gd2UgY2FuIHVzZSB0aGUgZG9jIGFzIHRoZSBiYXNlLiBXaXRob3V0IHRoaXMsIGFwcGx5UGxhY2VtZW50cyBzaWxlbnRseVxyXG4gICAgLy8gc2tpcHBlZCBsaWJyYXJpZXMgdGhlIHVzZXIgaGFkbid0IHZpZXdlZCBhbmQgb25seSB0aGUgY3VycmVudGx5LXZpc2libGVcclxuICAgIC8vIGNoaXAgZXZlciByZWNlaXZlZCB1cGRhdGVzLlxyXG4gICAgY29uc3QgZmV0Y2hlZEJhc2VzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICByZWZzLm1hcChhc3luYyAobGliSWQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpKSByZXR1cm47XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJyYXJ5RGV0YWlscyhsaWJJZCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkgZmV0Y2hlZEJhc2VzLnNldChsaWJJZCwgcmVzLmRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0BAIH4gYXBwbHlQbGFjZW1lbnRzVG9Bc3NpZ25lZExpYnJhcmllcyBbZmV0Y2ggRVJSXTonLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIGZvciAoY29uc3QgbGliSWQgb2YgcmVmcykge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldExpYnJhcnlTbmFwc2hvdChsaWJJZCkgfHwgZmV0Y2hlZEJhc2VzLmdldChsaWJJZCk7XHJcbiAgICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IHNoZWx2ZXM6IGFueVtdID0gQXJyYXkuaXNBcnJheSh0YXJnZXQuc2hlbGZDb25maWcpID8gdGFyZ2V0LnNoZWxmQ29uZmlnIDogW107XHJcbiAgICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbHZlcy5tYXAoKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB6b25lID0gbm9ybShzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwpO1xyXG4gICAgICAgIGlmICghem9uZSB8fCAhcGlkQnlab25lLmhhcyh6b25lKSkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5zaGVsZixcclxuICAgICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNoZWxmPy5sYWJlbCB8fCAnJyxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFsgLi4ucGlkQnlab25lLmdldCh6b25lKSEgXSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVm1zOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0LnZtQ29uZmlnKSA/IHRhcmdldC52bUNvbmZpZyA6IFtdO1xyXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IG5ld1ZtQ29uZmlnID0gZXhpc3RpbmdWbXMubWFwKCh2bTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbm9ybSh2bT8udm1UeXBlKTtcclxuICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICAgIGNvbnN0IHVwZCA9IHZtQnlUeXBlLmdldChrZXkpO1xyXG4gICAgICAgIHJldHVybiB1cGQgPyB7IC4uLnZtLCB2bUlkOiB1cGQudm1JZCwgdm1OYW1lOiB1cGQudm1OYW1lIH0gOiB2bTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvciAoY29uc3QgWyBrZXksIHVwZCBdIG9mIHZtQnlUeXBlKSB7XHJcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuaW5pdGlhbFZtTGF5b3V0KHVwZC5sYWJlbCwgbmV3U2hlbGZDb25maWcpO1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnLnB1c2goe1xyXG4gICAgICAgICAgdm1UeXBlOiB1cGQubGFiZWwsXHJcbiAgICAgICAgICB2bUlkOiB1cGQudm1JZCxcclxuICAgICAgICAgIHZtTmFtZTogdXBkLnZtTmFtZSxcclxuICAgICAgICAgIC4uLmxheW91dCxcclxuICAgICAgICAgIHBvc2l0aW9uOiAnJyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXB0dXJlTGlicmFyeVNuYXBzaG90KGxpYklkLCB7XHJcbiAgICAgICAgLi4udGFyZ2V0LFxyXG4gICAgICAgIHNoZWxmQ29uZmlnOiBuZXdTaGVsZkNvbmZpZyxcclxuICAgICAgICB2bUNvbmZpZzogbmV3Vm1Db25maWcsXHJcbiAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogJ0wzJyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVmbGVjdCB0aGUgY2hhbmdlIGluIHRoZSBjdXJyZW50bHktb3BlbiBlbWJlZGRlZCBlZGl0b3IuXHJcbiAgICB0aGlzLnJlbG9hZERpc3BsYXllZExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW91bnQgdGhlIGVtYmVkZGVkIGVkaXRvciBmb3IgdGhlIGFjdGl2ZSBsaWJyYXJ5IHNvIGl0IHBpY2tzIHVwIHRoZVxyXG4gICAqIHNuYXBzaG90IHdlIGp1c3QgcmV3cm90ZS4gVGhlIGVtYmVkZGVkIGNvbXBvbmVudHMgZ3VhcmQgYWdhaW5zdCByZS1pbml0XHJcbiAgICogd2hpbGUgbW91bnRlZCwgc28gd2UgdG9nZ2xlIHRoZSBob3N0IGtleSBvZmYgdGhlbiBvbiB0byBmb3JjZSBhIGZyZXNoXHJcbiAgICogbmdPbkluaXQgd2l0aCB0aGUgdXBkYXRlZCBkYXRhLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVsb2FkRGlzcGxheWVkTGlicmFyeSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxpYklkID0gdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwO1xyXG4gICAgaWYgKCFsaWJJZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkKTtcclxuICAgIGlmICghdXBkYXRlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID0gdXBkYXRlZDtcclxuICAgIC8vIFB1c2ggdGhlIGZyZXNoIHNuYXBzaG90LCB0aGVuIGJ1bXAgdGhlIG5vbmNlIHNvIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzXHJcbiAgICAvLyBwcm9kdWNlcyBhIE5FVyBrZXkg4oCUIHRoYXQncyB3aGF0IGFjdHVhbGx5IGZvcmNlcyB0aGUgKm5nRm9yIHRvIGRlc3Ryb3lcclxuICAgIC8vIHRoZSBvbGQgZW1iZWRkZWQgZWRpdG9yIGFuZCBtb3VudCBhIG5ldyBvbmUgdGhhdCByZS1yZWFkcyB0aGUgc25hcHNob3QuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KHtcclxuICAgICAgLi4udXBkYXRlZCxcclxuICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogdXBkYXRlZC5wcm9kdWN0UmVzb2x1dGlvbkxldmVsIHx8ICdMMycsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZW1iZWRkZWRSZWxvYWROb25jZSsrO1xyXG4gICAgdGhpcy5yZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25MaWJyYXJ5TWFwU2VsZWN0KGxpYklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFRvZ2dsaW5nIHRoZSBhY3RpdmUgY2hpcCBvZmYg4oaSIGNsZWFyIGltbWVkaWF0ZWx5IChubyBhc3luYyB3b3JrIG5lZWRlZCkuXHJcbiAgICBpZiAoIWxpYklkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9ICcnO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGlicmFyeURldGFpbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgY2hpcDogbGlnaHQgdGhlIG5ldyBjaGlwIHVwIHJpZ2h0IGF3YXksIGJ1dFxyXG4gICAgLy8gS0VFUCB0aGUgcHJldmlvdXMgbGlicmFyeSdzIGVtYmVkZGVkIHByZXZpZXcgbW91bnRlZCB3aGlsZSB3ZSBmZXRjaFxyXG4gICAgLy8gdGhlIG5ldyBzbmFwc2hvdC9kZXRhaWxzLiBPdGhlcndpc2UgdGhlIGNhcmQgd291bGQgY29sbGFwc2UgdG8gaXRzXHJcbiAgICAvLyBoZWFkZXIgaGVpZ2h0IGR1cmluZyB0aGUgZmV0Y2ggYW5kIHJlLWV4cGFuZCBvbmNlIG5ldyBkYXRhIGxhbmRzIOKAlFxyXG4gICAgLy8gdmlzaWJsZSBhcyBhIFwiY3J1bmNoXCIgdGhlIHVzZXIgcmVwb3J0ZWQuXHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSBsaWJJZDtcclxuICAgIHRoaXMubG9hZGluZ0xpYnJhcnlEZXRhaWxzID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgbmV3RGV0YWlsczogYW55ID0gbnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIElmIGFuIGF1dG8tYXBwbHkgZm9yIHRoaXMgbGlicmFyeSBpcyBzdGlsbCBydW5uaW5nLCB3YWl0IGZvciBpdCBzb1xyXG4gICAgICAvLyB3ZSBkb24ndCBiZWF0IGl0IHRvIHRoZSBzbmFwc2hvdCBhbmQgcmVuZGVyIHRoZSB1bi1maWxsZWQgbGlicmFyeS5cclxuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYXV0b0FwcGx5SW5GbGlnaHQuZ2V0KGxpYklkKTtcclxuICAgICAgaWYgKHBlbmRpbmcpIHtcclxuICAgICAgICB0cnkgeyBhd2FpdCBwZW5kaW5nOyB9IGNhdGNoIChfZSkgeyAvKiBpZ25vcmUgKi8gfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNhdmVkID0gdGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpO1xyXG4gICAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBuZXdEZXRhaWxzID0gc2F2ZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMobGliSWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbmV3RGV0YWlscyA9IHJlcz8uZGF0YSB8fCBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gb25MaWJyYXJ5TWFwU2VsZWN0IFtFUlJdOicsIGVycik7XHJcbiAgICAgIG5ld0RldGFpbHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF0b21pYyBzd2FwIOKAlCBzZWxlY3RlZExpYnJhcnlEZXRhaWxzLCBCZWhhdmlvclN1YmplY3QsIGFuZCB0aGVcclxuICAgIC8vIG5nRm9yIGhvc3Qga2V5IGFsbCBmbGlwIGluIG9uZSBzeW5jaHJvbm91cyBibG9jaywgc28gQW5ndWxhciBkZXN0cm95c1xyXG4gICAgLy8gdGhlIG9sZCBlbWJlZGRlZCBjb21wb25lbnQgYW5kIG1vdW50cyB0aGUgbmV3IG9uZSBpbiB0aGUgc2FtZSBjaGFuZ2VcclxuICAgIC8vIGRldGVjdGlvbiBjeWNsZS4gTm8gZW1wdHktc3RhdGUgaW4gYmV0d2VlbiDihpIgbm8gY2FyZC1oZWlnaHQgY3J1bmNoLlxyXG4gICAgdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID0gbmV3RGV0YWlscztcclxuICAgIGlmIChuZXdEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQoe1xyXG4gICAgICAgIC4uLm5ld0RldGFpbHMsXHJcbiAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbmV3RGV0YWlscy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsIHx8ICdMMycsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wbGFub0RhdGFTZXJ2aWNlLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dChudWxsKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaEVtYmVkZGVkSG9zdEtleXMoKTtcclxuICAgIHRoaXMubG9hZGluZ0xpYnJhcnlEZXRhaWxzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wb3NpdGUga2V5IHRpZWQgdG8gdGhlIGN1cnJlbnRseS1hY3RpdmUgKGxvb2ssIHNsb3QsIGxpYnJhcnkpIHRyaXBsZS5cclxuICAgKiBTdGFibGUgcHJvcGVydHkg4oCUIHJlY29tcHV0ZWQgb25seSB3aGVuIHRoZSB1bmRlcmx5aW5nIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgICogKHNlZSByZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpKS4gQXZvaWRzIHJldHVybmluZyBhIG5ldyBhcnJheSByZWZlcmVuY2VcclxuICAgKiBldmVyeSBDRCBjeWNsZSwgd2hpY2ggdXNlZCB0byByaXBwbGUgaW50byBvdGhlciBtdWx0aS1zZWxlY3RzJyBpbnB1dHMuXHJcbiAgICovXHJcbiAgZW1iZWRkZWRIb3N0S2V5OiBzdHJpbmcgPSAnJztcclxuICBlbWJlZGRlZEhvc3RLZXlzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vIEJ1bXBlZCBieSByZWxvYWREaXNwbGF5ZWRMaWJyYXJ5KCkgdG8gZm9yY2UgdGhlIGVtYmVkZGVkIGVkaXRvciB0byByZW1vdW50XHJcbiAgLy8gZXZlbiB3aGVuIGxvb2svc2xvdC9saWJyYXJ5IGFyZSB1bmNoYW5nZWQgKGEgc2FtZS1rZXkgcm91bmQtdHJpcCB2aWEgdGhlXHJcbiAgLy8gKm5nRm9yIHRyYWNrQnkgZG9lcyBOT1QgcmVtb3VudDsgYSBjaGFuZ2VkIGtleSBkb2VzKS5cclxuICBwcml2YXRlIGVtYmVkZGVkUmVsb2FkTm9uY2UgPSAwO1xyXG5cclxuICBwcml2YXRlIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gYCR7dGhpcy5zZWxlY3RlZExvb2tJbmRleH0tJHt0aGlzLnNlbGVjdGVkU2xvdEluZGV4fS0ke3RoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcH0tJHt0aGlzLmVtYmVkZGVkUmVsb2FkTm9uY2V9YDtcclxuICAgIGlmIChrZXkgIT09IHRoaXMuZW1iZWRkZWRIb3N0S2V5KSB7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRIb3N0S2V5ID0ga2V5O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA/IFt0aGlzLmVtYmVkZGVkSG9zdEtleV0gOiBbXTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVtYmVkZGVkSG9zdEtleXM7XHJcbiAgICAvLyBPbmx5IGFzc2lnbiBhIG5ldyBhcnJheSBpZiB0aGUgY29udGVudHMgZGlmZmVyIOKAlCBvdGhlcndpc2UgdGhlIG5nRm9yIHNlZXNcclxuICAgIC8vIGEgXCJuZXdcIiBhcnJheSBlYWNoIENEIGFuZCB0cmFja0J5IHN0aWxsIGhhcyB0byBjb21wYXJlIGV2ZXJ5IGVudHJ5LlxyXG4gICAgaWYgKG5leHQubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCB8fCBuZXh0WzBdICE9PSBjdXJyZW50WzBdKSB7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRIb3N0S2V5cyA9IG5leHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmFja0J5RW1iZWRkZWRLZXkoXzogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4ga2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNsb3QtdHlwZSBkcm9wZG93biBpbiB0aGUgcmlnaHQgcGFuZSBvbmx5IG9mZmVycyB2YWx1ZXMgdGhhdCB0aGVcclxuICAgKiBwYXJlbnQgTG9vayBoYXMgc2VsZWN0ZWQgaW4gaXRzIEZpeHR1cmUgVHlwZSBtdWx0aXNlbGVjdC4gSWYgbm90aGluZyBpc1xyXG4gICAqIHNlbGVjdGVkIHlldCwgZmFsbCBiYWNrIHRvIHNob3dpbmcgYWxsIG9wdGlvbnMgc28gdGhlIHVzZXIgaXNuJ3QgYmxvY2tlZC5cclxuICAgKi9cclxuICBnZXQgYXZhaWxhYmxlU2xvdFR5cGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgaWYgKCFsb29rR3JvdXApIHJldHVybiB0aGlzLmZpeHR1cmVUeXBlT3B0aW9ucztcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVR5cGUnKT8udmFsdWUgYXMgc3RyaW5nW10gfCBudWxsO1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSB8fCBzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zLmZpbHRlcigob3B0KSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHQuaWQpKTtcclxuICB9XHJcblxyXG4gIC8vIDIwIHZlcnkgbWlsZCBwYXN0ZWxzIChhbGwgVGFpbHdpbmQtNTAgLyAxMDAgcmFuZ2UpIGFycmFuZ2VkIHNvIGFkamFjZW50XHJcbiAgLy8gcGFsZXR0ZSBzbG90cyBhcmUgb24gb3Bwb3NpdGUgc2lkZXMgb2YgdGhlIGNvbG91ciB3aGVlbCBmb3IgZGlzdGluZ3Vpc2gtXHJcbiAgLy8gYWJpbGl0eSB3aXRob3V0IGFueSBjb2xvdXIgZmVlbGluZyBzYXR1cmF0ZWQuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQlVDS0VUX1BBTEVUVEU6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xyXG4gICAgJyNmZWYyZjInLCAvLyAgMSBCbHVzaCAgICAgICAgICByZWQtNTBcclxuICAgICcjZjBmZGZhJywgLy8gIDIgTWludCBXaGlzcGVyICAgdGVhbC01MCAgICAob3Bwb3NpdGUgb2YgcmVkKVxyXG4gICAgJyNmZmY3ZWQnLCAvLyAgMyBBcHJpY290ICAgICAgICBvcmFuZ2UtNTBcclxuICAgICcjZWVmMmZmJywgLy8gIDQgSXJpcyAgICAgICAgICAgaW5kaWdvLTUwICAob3Bwb3NpdGUgb2Ygb3JhbmdlKVxyXG4gICAgJyNmZWZjZTgnLCAvLyAgNSBCdXR0ZXIgICAgICAgICB5ZWxsb3ctNTBcclxuICAgICcjZmFmNWZmJywgLy8gIDYgTGF2ZW5kZXIgICAgICAgcHVycGxlLTUwICAob3Bwb3NpdGUgb2YgeWVsbG93KVxyXG4gICAgJyNmMGZkZjQnLCAvLyAgNyBTcHJpbmcgICAgICAgICBncmVlbi01MFxyXG4gICAgJyNmZmYxZjInLCAvLyAgOCBSb3NlIFBldGFsICAgICByb3NlLTUwICAgIChvcHBvc2l0ZSBvZiBncmVlbilcclxuICAgICcjZWNmZWZmJywgLy8gIDkgU2t5IFRpbnQgICAgICAgY3lhbi01MFxyXG4gICAgJyNmZmVkZDUnLCAvLyAxMCBQZWFjaCAgICAgICAgICBvcmFuZ2UtMTAwXHJcbiAgICAnI2VmZjZmZicsIC8vIDExIFBvd2RlciBCbHVlICAgIGJsdWUtNTBcclxuICAgICcjZjBmOWZmJywgLy8gMTIgU2t5ICAgICAgICAgICAgc2t5LTUwICAgICAob3Bwb3NpdGUgb2Ygb3JhbmdlKVxyXG4gICAgJyNmNWYzZmYnLCAvLyAxMyBWaW9sZXQgTWlzdCAgICB2aW9sZXQtNTBcclxuICAgICcjZjdmZWU3JywgLy8gMTQgTGltZSBXaGlzcGVyICAgbGltZS01MCAgICAob3Bwb3NpdGUgb2YgdmlvbGV0KVxyXG4gICAgJyNmZGY0ZmYnLCAvLyAxNSBMaWxhYyAgICAgICAgICBmdWNoc2lhLTUwXHJcbiAgICAnI2VjZmRmNScsIC8vIDE2IE1pbnQgICAgICAgICAgIGVtZXJhbGQtNTBcclxuICAgICcjZmRmMmY4JywgLy8gMTcgUGV0YWwgUGluayAgICAgcGluay01MFxyXG4gICAgJyNmZmZiZWInLCAvLyAxOCBIb25leSAgICAgICAgICBhbWJlci01MFxyXG4gICAgJyNmMWY1ZjknLCAvLyAxOSBDbG91ZCAgICAgICAgICBzbGF0ZS0xMDBcclxuICAgICcjZjVmNWY0JywgLy8gMjAgTGluZW4gICAgICAgICAgc3RvbmUtMTAwXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwbGFub0RhdGFTZXJ2aWNlOiBQbGFub0RhdGFTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICB0aGlzLmluaXRGb3JtKCk7XHJcblxyXG4gICAgLy8gTGlzdGVuIHRvIHRoZSBzaGFyZWQgZml4dHVyZVRlbXBsYXRlRGV0YWlscyDigJQgd2hlbiB0aGUgZW1iZWRkZWRcclxuICAgIC8vIFRlbXBsYXRlUHJvZHVjdHMvVGVtcGxhdGVWbXMgY29tcG9uZW50cyBwdXNoIGVkaXRzIGJhY2sgaW50byB0aGVcclxuICAgIC8vIEJlaGF2aW9yU3ViamVjdCwgcGVyc2lzdCBhIHNuYXBzaG90IHVuZGVyIHRoZSBhY3RpdmUgc2xvdCArIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlsc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSB8fCAhdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSByZXR1cm47XHJcbiAgICAgICAgLy8gT25seSBjYXB0dXJlIHVzZXIgZWRpdHMsIG5vdCB0aGUgaW5pdGlhbCBsb2FkIHdlIHB1c2hlZCBvdXJzZWx2ZXMuXHJcbiAgICAgICAgLy8gVGhlIGVtYmVkZGVkIGNvbXBvbmVudHMgc2V0IGBpZ25vcmVVcGRhdGU6IHRydWVgIHdoZW4gdGhleSBwdXNoXHJcbiAgICAgICAgLy8gdGhlaXIgZm9ybSBjaGFuZ2VzIGJhY2s7IHdlIHVzZSB0aGF0IGFzIG91ciBzaWduYWwuXHJcbiAgICAgICAgaWYgKCFkYXRhLmlnbm9yZVVwZGF0ZSkgcmV0dXJuO1xyXG4gICAgICAgIC8vIFBlcnNpc3QgZWRpdHMgbWFkZSBkaXJlY3RseSBpbiB0aGUgZW1iZWRkZWQgZWRpdG9yIChlLmcuIFZNXHJcbiAgICAgICAgLy8gcG9zaXRpb25zLCB3aGljaCBzdGF5IGVkaXRhYmxlIGluIGxvb2tzTW9kZSkgdG8gdGhlIGFjdGl2ZSBsaWJyYXJ5LlxyXG4gICAgICAgIC8vIENyb3NzLWxpYnJhcnkgcHJvcGFnYXRpb24gaXMgZHJpdmVuIGJ5IHRoZSBzbG90J3MgcGxhY2VtZW50cyBsaXN0XHJcbiAgICAgICAgLy8gaW5zdGVhZCAoc2VlIGFwcGx5UGxhY2VtZW50c1RvQXNzaWduZWRMaWJyYXJpZXMpLlxyXG4gICAgICAgIHRoaXMuY2FwdHVyZUxpYnJhcnlTbmFwc2hvdCh0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAsIGRhdGEpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgY29uc3QgaGVhZGVyRmlsdGVycyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJykgfHwgJ3t9Jyk7XHJcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQgfHwgaGVhZGVyRmlsdGVycz8uY2xpZW50O1xyXG4gICAgICBpZiAodGhpcy5jbGllbnRJZCkge1xyXG4gICAgICAgIHRoaXMubG9hZEZpeHR1cmVMaWJyYXJpZXMoKTtcclxuICAgICAgICB0aGlzLmxvYWRQbGFjZW1lbnREcm9wZG93bkRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhc3luYyAocGFyYW1zKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlkID0gcGFyYW1zWydjb2xsZWN0aW9uSWQnXTtcclxuICAgICAgdGhpcy5jb2xsZWN0aW9uSWQgPSBpZCAmJiBpZCAhPT0gJ25ldycgPyBpZCA6IG51bGw7XHJcbiAgICAgIHRoaXMuaXNOZXcgPSAhdGhpcy5jb2xsZWN0aW9uSWQ7XHJcbiAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb25JZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZERldGFpbHMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRW1iZWRkZWQgVGVtcGxhdGVQcm9kdWN0c0NvbXBvbmVudCAvIFRlbXBsYXRlVm1zQ29tcG9uZW50IHJlYWQgdGhlc2VcclxuICAgIC8vIHF1ZXJ5IHBhcmFtcyBmcm9tIHRoZSBhY3RpdmUgcm91dGUuIEZvcmNlIHRoZW0gdG8gZWRpdC1tb2RlIGFuZCBwaW5cclxuICAgIC8vIHRoZSBwcm9kdWN0cyB2aWV3IHRvIHRoZSBcInNlY3Rpb25cIiBsZXZlbC5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlzRWRpdDogJ3RydWUnLCBsZXZlbDogJ3NlY3Rpb24nIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXHJcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFBhZ2VEYXRhKCkge1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRUaXRsZSgnTG9vayBDb2xsZWN0aW9uJyk7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogJ1BsYW5vZ3JhbScsIHBhdGg6ICcvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtcycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICAgIHsgdGl0bGU6ICcnLCBwYXRoOiAnJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnTG9va3MnLCBwYXRoOiAnL21hbmFnZS9wbGFub2dyYW0vbG9va3MnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnJywgcGF0aDogJycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgICAgeyB0aXRsZTogJ0VkaXQnLCBwYXRoOiAnJywgaXNBY3RpdmU6IHRydWUsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBpbml0Rm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBkZXNjcmlwdGlvbjogWycnXSxcclxuICAgICAgaXNBY3RpdmU6IFtmYWxzZV0sXHJcbiAgICAgIGxvb2tzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxvb2tzKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbG9va3MnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBmaXh0dXJlU2xvdHMobG9va0luZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMubG9va3MuYXQobG9va0luZGV4KS5nZXQoJ2ZpeHR1cmVTbG90cycpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIHBsYWNlbWVudHMobG9va0luZGV4OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVTbG90cyhsb29rSW5kZXgpLmF0KHNsb3RJbmRleCkuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkTG9va0dyb3VwKCk6IEZvcm1Hcm91cCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCAmJiB0aGlzLnNlbGVjdGVkTG9va0luZGV4IDwgdGhpcy5sb29rcy5sZW5ndGhcclxuICAgICAgPyAodGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSBhcyBGb3JtR3JvdXApXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFNsb3RzQXJyYXkoKTogRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBjb25zdCBsb29rID0gdGhpcy5zZWxlY3RlZExvb2tHcm91cDtcclxuICAgIHJldHVybiBsb29rID8gKGxvb2suZ2V0KCdmaXh0dXJlU2xvdHMnKSBhcyBGb3JtQXJyYXkpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFNsb3RHcm91cCgpOiBGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5zZWxlY3RlZFNsb3RzQXJyYXk7XHJcbiAgICBpZiAoIXNsb3RzKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID49IDAgJiYgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA8IHNsb3RzLmxlbmd0aFxyXG4gICAgICA/IChzbG90cy5hdCh0aGlzLnNlbGVjdGVkU2xvdEluZGV4KSBhcyBGb3JtR3JvdXApXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFBsYWNlbWVudHMoKTogRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIHJldHVybiBzbG90ID8gKHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb29rR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3Qgc2VlZFNsb3RzID0gQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVTbG90cykgJiYgc2VlZC5maXh0dXJlU2xvdHMubGVuZ3RoXHJcbiAgICAgID8gc2VlZC5maXh0dXJlU2xvdHNcclxuICAgICAgOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCBOdW1iZXIoc2VlZC5maXh0dXJlQ291bnQpIHx8IDEpIH0sIChfLCBpKSA9PiAoeyBzbG90SW5kZXg6IGkgKyAxIH0pKTtcclxuICAgIGNvbnN0IHNsb3RzID0gc2VlZFNsb3RzLm1hcCgoczogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3JlYXRlU2xvdEdyb3VwKHsgLi4ucywgc2xvdEluZGV4OiBpICsgMSB9KSk7XHJcblxyXG4gICAgLy8gTGVnYWN5IGRhdGEgbWF5IGhhdmUgc3RvcmVkIGNhZEhlYWRlclZhcmlhbnRzIGF0IHRoZSBzbG90IGxldmVsLiBJZiB0aGVcclxuICAgIC8vIGluY29taW5nIGxvb2sgZG9lc24ndCBoYXZlIGl0cyBvd24gdmFyaWFudHMgYXJyYXksIGZvbGQgdGhlIHVuaW9uIG9mXHJcbiAgICAvLyBzbG90LWxldmVsIHZhcmlhbnRzIGludG8gdGhlIGxvb2sgc28gZWRpdGluZyBpbiB0aGUgbmV3IFVJIGRvZXNuJ3QgbG9zZVxyXG4gICAgLy8gdGhlbS5cclxuICAgIGNvbnN0IHNlZWRMb29rVmFyaWFudHMgPSBBcnJheS5pc0FycmF5KHNlZWQuY2FkSGVhZGVyVmFyaWFudHMpXHJcbiAgICAgID8gc2VlZC5jYWRIZWFkZXJWYXJpYW50c1xyXG4gICAgICA6IEFycmF5LmZyb20obmV3IFNldChcclxuICAgICAgICAoQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVTbG90cykgPyBzZWVkLmZpeHR1cmVTbG90cyA6IFtdKVxyXG4gICAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gQXJyYXkuaXNBcnJheShzPy5jYWRIZWFkZXJWYXJpYW50cykgPyBzLmNhZEhlYWRlclZhcmlhbnRzIDogW10pLFxyXG4gICAgICApKTtcclxuXHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAga2V5VHlwZTogW3NlZWQua2V5VHlwZSB8fCAnbWJxJ10sXHJcbiAgICAgIG1icUJ1Y2tldDogW3NlZWQubWJxQnVja2V0IHx8ICcnXSxcclxuICAgICAgYnJhbmRDYXRlZ29yeTogW3NlZWQuYnJhbmRDYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVDb3VudDogW3Nsb3RzLmxlbmd0aCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIGZpeHR1cmVUeXBlOiBbQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVUeXBlKSA/IHNlZWQuZml4dHVyZVR5cGUgOiBbXV0sXHJcbiAgICAgIGxheW91dFZhcmlhbnQ6IFtzZWVkLmxheW91dFZhcmlhbnQgfHwgJ3NoZWxmJ10sXHJcbiAgICAgIHN0b3JlUHJvdG86IFtzZWVkLnN0b3JlUHJvdG8gfHwgJyddLFxyXG4gICAgICBjYWRIZWFkZXJWYXJpYW50czogW3NlZWRMb29rVmFyaWFudHNdLFxyXG4gICAgICBmaXh0dXJlU2xvdHM6IHRoaXMuZmIuYXJyYXkoc2xvdHMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZml4dHVyZUNvdW50IOKGkiBzbG90cyBsZW5ndGggKHVzZXItZWRpdGVkIGNvdW50IGFkanVzdHMgdGhlIHNsb3RzIGFycmF5KVxyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKG5leHQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDMwLCBOdW1iZXIobmV4dCkgfHwgMCkpO1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHdoaWxlIChzbG90c0Fyci5sZW5ndGggPCB0YXJnZXQpIHtcclxuICAgICAgICAgIHNsb3RzQXJyLnB1c2godGhpcy5jcmVhdGVTbG90R3JvdXAoeyBzbG90SW5kZXg6IHNsb3RzQXJyLmxlbmd0aCArIDEgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoc2xvdHNBcnIubGVuZ3RoID4gdGFyZ2V0KSB7XHJcbiAgICAgICAgICBzbG90c0Fyci5yZW1vdmVBdChzbG90c0Fyci5sZW5ndGggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwKTtcclxuICAgICAgICAvLyBSZWNvbmNpbGUgc2xvdCBzZWxlY3Rpb24gaWYgaXQncyBub3cgb3V0IG9mIGJvdW5kc1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID49IDAgJiYgdGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSA9PT0gbG9va0dyb3VwKSB7XHJcbiAgICAgICAgICBpZiAoc2xvdHNBcnIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFNsb3RJbmRleCA+PSBzbG90c0Fyci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzQXJyLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGxvb2tHcm91cDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVNsb3RHcm91cChzZWVkOiBhbnkgPSB7fSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gKEFycmF5LmlzQXJyYXkoc2VlZC5wbGFjZW1lbnRzKSA/IHNlZWQucGxhY2VtZW50cyA6IFtdKVxyXG4gICAgICAubWFwKChwOiBhbnkpID0+IHRoaXMuY3JlYXRlUGxhY2VtZW50R3JvdXAocCkpO1xyXG4gICAgY29uc3QgbGlicmFyeUNvbmZpZ3MgPSAoQXJyYXkuaXNBcnJheShzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucykgPyBzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucyA6IFtdKVxyXG4gICAgICAubWFwKChjOiBhbnkpID0+IHRoaXMuY3JlYXRlTGlicmFyeUNvbmZpZ0dyb3VwKGMpKTtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2xvdEluZGV4OiBbc2VlZC5zbG90SW5kZXggPz8gMSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNsb3RUeXBlOiBbc2VlZC5zbG90VHlwZSB8fCAnc2hlbGYnXSxcclxuICAgICAgYnJhbmQ6IFtzZWVkLmJyYW5kIHx8ICcnXSxcclxuICAgICAgZml4dHVyZUxldmVsWm9uZTogW3NlZWQuZml4dHVyZUxldmVsWm9uZSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5UmVmOiBbc2VlZC5maXh0dXJlTGlicmFyeVJlZiB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5TGFiZWw6IFtzZWVkLmZpeHR1cmVMaWJyYXJ5TGFiZWwgfHwgJyddLFxyXG4gICAgICBmaXh0dXJlTGlicmFyeVJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzKSA/IHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzIDogW11dLFxyXG4gICAgICBwbGFjZW1lbnRzOiB0aGlzLmZiLmFycmF5KHBsYWNlbWVudHMpLFxyXG4gICAgICBsaWJyYXJ5Q29uZmlndXJhdGlvbnM6IHRoaXMuZmIuYXJyYXkobGlicmFyeUNvbmZpZ3MpLFxyXG4gICAgICAvLyBQZXItbGlicmFyeSBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgZml4dHVyZS10ZW1wbGF0ZSBlZGl0b3Igc3RhdGVcclxuICAgICAgLy8gKHNoZWxmQ29uZmlnICsgcHJvZHVjdC9WTSBwbGFjZW1lbnRzKS4gS2V5ZWQgYnkgbGlicmFyeVJlZi5cclxuICAgICAgbGlicmFyeVNuYXBzaG90czogW1xyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2VlZC5saWJyYXJ5U25hcHNob3RzKSA/IHNlZWQubGlicmFyeVNuYXBzaG90cyA6IFtdLFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMaWJyYXJ5Q29uZmlnR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBsaWJyYXJ5UmVmOiBbc2VlZC5saWJyYXJ5UmVmIHx8ICcnXSxcclxuICAgICAgc2hlbGZOdW1iZXI6IFtzZWVkLnNoZWxmTnVtYmVyID8/IDFdLFxyXG4gICAgICBsYWJlbDogW3NlZWQubGFiZWwgfHwgJyddLFxyXG4gICAgICBzaGVsZlR5cGU6IFtzZWVkLnNoZWxmVHlwZSB8fCAnJ10sXHJcbiAgICAgIC8vIFZNcyBhbmQgUElEcyBwaWNrZWQgZnJvbSB0aGUgc2xvdCdzIGBwbGFjZW1lbnRzYCBhcnJheSAoYnkgcG9zaXRpb24gbmFtZSkuXHJcbiAgICAgIHZtUmVmczogW0FycmF5LmlzQXJyYXkoc2VlZC52bVJlZnMpID8gc2VlZC52bVJlZnMgOiBbXV0sXHJcbiAgICAgIHBpZFJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQucGlkUmVmcykgPyBzZWVkLnBpZFJlZnMgOiBbXV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVBsYWNlbWVudEdyb3VwKHNlZWQ6IGFueSA9IHt9KTogRm9ybUdyb3VwIHtcclxuICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogbGVnYWN5IGRhdGEgc3RvcmVkIGEgc2luZ2xlIHN0cmluZyBpbiBgcmF3VmFsdWVgLiBGb3JcclxuICAgIC8vIFBJRCBwbGFjZW1lbnRzIHdlIG5vdyB1c2UgYHJhd1ZhbHVlc2AgKGFycmF5LCBtdWx0aS1zZWxlY3QpLiBJZiB0aGVcclxuICAgIC8vIHNlZWQgb25seSBoYXMgYHJhd1ZhbHVlYCwgbWlncmF0ZSBpdCB0byB0aGUgYXJyYXkgb24gZmlyc3QgbG9hZC5cclxuICAgIGNvbnN0IHJhd1ZhbHVlc1NlZWQgPSBBcnJheS5pc0FycmF5KHNlZWQucmF3VmFsdWVzKVxyXG4gICAgICA/IHNlZWQucmF3VmFsdWVzXHJcbiAgICAgIDogKHNlZWQua2luZCA9PT0gJ3BpZCcgJiYgc2VlZC5yYXdWYWx1ZSA/IFtTdHJpbmcoc2VlZC5yYXdWYWx1ZSldIDogW10pO1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwb3NpdGlvbjogW3NlZWQucG9zaXRpb24gfHwgJyddLFxyXG4gICAgICBraW5kOiBbc2VlZC5raW5kIHx8ICdwaWQnXSxcclxuICAgICAgLy8gRm9yIFZNIHJvd3MgdGhpcyBob2xkcyB0aGUgYXJ0d29yayBpZCAoc2luZ2xlIHN0cmluZykuIEZvciBQSUQgcm93c1xyXG4gICAgICAvLyBpdCdzIGxlZnQgZW1wdHkgaW4gZmF2b3VyIG9mIGByYXdWYWx1ZXNgLlxyXG4gICAgICByYXdWYWx1ZTogW3NlZWQua2luZCA9PT0gJ3BpZCcgPyAnJyA6IChzZWVkLnJhd1ZhbHVlIHx8ICcnKV0sXHJcbiAgICAgIHJhd1ZhbHVlczogW3Jhd1ZhbHVlc1NlZWRdLFxyXG4gICAgICB2bVJlZjogW3NlZWQudm1SZWYgfHwgJyddLFxyXG4gICAgICBza3VDb2xsZWN0aW9uUmVmOiBbc2VlZC5za3VDb2xsZWN0aW9uUmVmIHx8ICcnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUGxhY2VtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGxhY2VtZW50cykgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMucHVzaCh0aGlzLmNyZWF0ZVBsYWNlbWVudEdyb3VwKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUGxhY2VtZW50KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMpIHJldHVybjtcclxuICAgIHRoaXMuc2VsZWN0ZWRQbGFjZW1lbnRzLnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybVZtVHlwZSh0OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFN0cmluZyh0ID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdGFibGUgcGVyLXZtVHlwZSBhcnR3b3JrIGxpc3QgbG9va3VwLiBSZXR1cm5zIHRoZSBzYW1lIGFycmF5IHJlZmVyZW5jZVxyXG4gICAqICBmb3IgdGhlIHNhbWUgdm1UeXBlIGFjcm9zcyBDRCBjeWNsZXMgc28gbGliLXJlYWN0aXZlLXNlbGVjdCBkb2Vzbid0XHJcbiAgICogIHJlLWluaXQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgbGlzdCB3aGVuIHZtVHlwZSBpcyBlbXB0eS4gKi9cclxuICB2bUFydHdvcmtPcHRpb25zRm9yKHZtVHlwZTogc3RyaW5nKTogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIGlmIChrZXkgJiYgdGhpcy52bUFydHdvcmtCeVR5cGUuaGFzKGtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpITtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZtQXJ0d29ya0J5VHlwZS5nZXQoJycpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlIHRoZSBkcm9wZG93biBkYXRhIHVzZWQgYnkgUGxhY2VtZW50IHJvd3M6XHJcbiAgICogIC0gVk0gVHlwZSBsaXN0IChgZ2V0Vm1UeXBlc0xpc3RgKVxyXG4gICAqICAtIFZNIEFydHdvcmsgbGlzdCAoYHZtTmFtZUxpc3RgKVxyXG4gICAqICAtIFByb2R1Y3QgLyBTS1UgY29sbGVjdGlvbiBsaXN0IChmbGF0dGVuZWQgZnJvbSBicmFuZCDihpIgY2F0ZWdvcnkgbWFwcGluZ1xyXG4gICAqICAgIHRoYXQgcG93ZXJzIC9tYW5hZ2UvcGxhbm9ncmFtL2NvbmZpZykuICovXHJcbiAgYXN5bmMgbG9hZFBsYWNlbWVudERyb3Bkb3duRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgW3ZtVHlwZXNSZXMsIHZtc1JlcywgYnJhbmRzUmVzLCBicmFuZE1ldGFSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRWbVR5cGVzTGlzdCh0aGlzLmNsaWVudElkKSksXHJcbiAgICAgICAgbGFzdFZhbHVlRnJvbSh0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldFZNTmFtZUxpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZExpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZE1ldGFEYXRhKHRoaXMuY2xpZW50SWQpKSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBjb25zdCB2bVR5cGVzOiBhbnlbXSA9ICh2bVR5cGVzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIHRoaXMudm1UeXBlT3B0aW9ucyA9IHZtVHlwZXNcclxuICAgICAgICAubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSB0Py52bVR5cGUgfHwgdD8udm1UeXBlTmFtZSB8fCB0Py5uYW1lIHx8IHQ/Ll9pZDtcclxuICAgICAgICAgIGNvbnN0IGwgPSB0Py52bVR5cGVOYW1lIHx8IHQ/LnZtVHlwZSB8fCB0Py5uYW1lIHx8IHY7XHJcbiAgICAgICAgICByZXR1cm4gdiA/IHsgdmFsdWU6IFN0cmluZyh2KSwgbGFiZWw6IFN0cmluZyhsKSB9IDogbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5maWx0ZXIoKHgpOiB4IGlzIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICBjb25zdCB2bXM6IGFueVtdID0gKHZtc1JlcyBhcyBhbnkpPy5kYXRhIHx8IFtdO1xyXG4gICAgICB0aGlzLnZtQXJ0d29ya09wdGlvbnMgPSB2bXNcclxuICAgICAgICAubWFwKCh2OiBhbnkpOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpZCA9IHY/LnZtTmFtZSB8fCB2Py5faWQ7XHJcbiAgICAgICAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoaWQpLFxyXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKHY/LnZtTmFtZSB8fCBpZCksXHJcbiAgICAgICAgICAgIHZtVHlwZTogdj8udm1UeXBlID8gU3RyaW5nKHYudm1UeXBlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKCh4KTogeCBpcyB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICAvLyAodm1OYW1lLCB2bVR5cGUpIOKGkiBfaWQgc28gd2UgY2FuIHR1cm4gYSBwbGFjZW1lbnQncyBhcnR3b3JrIE5BTUUgaW50b1xyXG4gICAgICAvLyB0aGUgcGxhbm92bSBfaWQgdGhlIGVtYmVkZGVkIFZNIGVkaXRvciBtYXRjaGVzIGFnYWluc3QuXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2bXMpIHtcclxuICAgICAgICBpZiAoIXY/Ll9pZCB8fCAhdj8udm1OYW1lKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ub3JtVm1UeXBlKHYudm1OYW1lKTtcclxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICB0aGlzLnZtSWRCeU5hbWVUeXBlLnNldChgJHtuYW1lfXx8JHt0eXBlfWAsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIGlmICghdGhpcy52bUlkQnlOYW1lVHlwZS5oYXMobmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuc2V0KG5hbWUsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVidWlsZCB0aGUgKHZtVHlwZSDihpIgYXJ0d29ya3MpIGluZGV4IG5vdyB0aGF0IHRoZSBhcnR3b3JrIGxpc3RcclxuICAgICAgLy8gY2hhbmdlZC4gS2V5cyBhcmUgbm9ybWFsaXNlZCAodHJpbSArIGxvd2VyLWNhc2UpIHNvIGEgbWlzbWF0Y2ggaW5cclxuICAgICAgLy8gY2FzaW5nL3doaXRlc3BhY2UgYmV0d2VlbiB2bVR5cGVzIGFuZCB2bXMudm1UeXBlIHN0aWxsIG1hdGNoZXMuXHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlID0gbmV3IE1hcCgpO1xyXG4gICAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMudm1BcnR3b3JrT3B0aW9ucy5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LnZhbHVlLCBsYWJlbDogdi5sYWJlbCB9KSk7XHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLnNldCgnJywgZnVsbExpc3QpO1xyXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52bUFydHdvcmtPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZtQXJ0d29ya0J5VHlwZS5oYXMoa2V5KSkgdGhpcy52bUFydHdvcmtCeVR5cGUuc2V0KGtleSwgW10pO1xyXG4gICAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpIS5wdXNoKHsgdmFsdWU6IHYudmFsdWUsIGxhYmVsOiB2LmxhYmVsIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gdm1UeXBlczonLCB0aGlzLnZtVHlwZU9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3JrczonLCB0aGlzLnZtQXJ0d29ya09wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3Jrc0J5VHlwZSBrZXlzOicsIEFycmF5LmZyb20odGhpcy52bUFydHdvcmtCeVR5cGUua2V5cygpKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFNvdXJjZTogZXZlcnkgdmFsdWUgdGhlIGJyYW5kICYgcHJvZHVjdCBtYXBwaW5nIHBhZ2UgZXhwb3Nlcy5cclxuICAgICAgLy8gIC0gYGdldEJyYW5kTGlzdGAgICAgIOKGkiBwZXItYnJhbmQgYGNhdGVnb3J5W11gIGFuZCBgc3ViQ2F0ZWdvcnlbXWBcclxuICAgICAgLy8gIC0gYGdldEJyYW5kTWV0YURhdGFgIOKGkiByb3dzIHdpdGggYHBpZENhdGAsIGBjYXRlZ29yeWAsIGB0ZW1wR3JvdXBgXHJcbiAgICAgIGNvbnN0IGJyYW5kczogYW55W10gPSAoYnJhbmRzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IGJyYW5kTWV0YTogYW55W10gPSAoYnJhbmRNZXRhUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IHNlZW5DYXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgIGNvbnN0IHB1c2hPbmUgPSAodjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcyA9IFN0cmluZyh2ID8/ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKCFzIHx8IHNlZW5DYXRzLmhhcyhzKSkgcmV0dXJuO1xyXG4gICAgICAgIHNlZW5DYXRzLmFkZChzKTtcclxuICAgICAgICBwcm9kdWN0cy5wdXNoKHsgdmFsdWU6IHMsIGxhYmVsOiBzIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBwdXNoQXJyID0gKGFycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgYXJyKSBwdXNoT25lKHYpO1xyXG4gICAgICB9O1xyXG4gICAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmRzKSB7XHJcbiAgICAgICAgcHVzaEFycihiPy5jYXRlZ29yeSk7XHJcbiAgICAgICAgcHVzaEFycihiPy5zdWJDYXRlZ29yeSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCByb3cgb2YgYnJhbmRNZXRhKSB7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LnBpZENhdCk7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LmNhdGVnb3J5KTtcclxuICAgICAgICBwdXNoT25lKHJvdz8udGVtcEdyb3VwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByb2R1Y3RPcHRpb25zID0gcHJvZHVjdHM7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gcHJvZHVjdC9TS1Ugb3B0aW9uczonLFxyXG4gICAgICAgIHRoaXMucHJvZHVjdE9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdmcm9tJyxcclxuICAgICAgICBicmFuZHMubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZHMgYW5kJyxcclxuICAgICAgICBicmFuZE1ldGEubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZC1tZXRhIHJvd3MnLFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGxvYWRQbGFjZW1lbnREcm9wZG93bkRhdGEgW0VSUl06JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRGaXh0dXJlTGlicmFyaWVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBPbmx5IGxpc3QgZml4dHVyZSB0ZW1wbGF0ZXMgYXZhaWxhYmxlIGluIEluZGlhIChjb3VudHJ5IGNvZGUgJ0lOJykuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJOYW1lTGlzdCh0aGlzLmNsaWVudElkLCAnbm9uLWRyYWZ0JywgJ0lOJyksXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFJlc3BvbnNlIHNoYXBlOiB7IGNvZGUsIHN0YXR1cywgZGF0YTogW3sgaWQsIGZpeHR1cmVOYW1lLCBmaXh0dXJlVHlwZSB9XSB9LlxyXG4gICAgICBjb25zdCBsaXN0OiB7IGlkOiBzdHJpbmc7IGZpeHR1cmVOYW1lOiBzdHJpbmc7IGZpeHR1cmVUeXBlOiBzdHJpbmcgfVtdID1cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJlcz8uZGF0YSkgPyByZXMuZGF0YSA6IFtdO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBsaXN0Lm1hcCgobCkgPT4gKHtcclxuICAgICAgICBpZDogbC5pZCxcclxuICAgICAgICBuYW1lOiBsLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIGZpeHR1cmVUeXBlOiAobC5maXh0dXJlVHlwZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSxcclxuICAgICAgfSkpO1xyXG4gICAgICBjb25zdCB0eXBlVGFsbHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMpIHtcclxuICAgICAgICBjb25zdCBrID0gaXQuZml4dHVyZVR5cGUgfHwgJyhlbXB0eSknO1xyXG4gICAgICAgIHR5cGVUYWxseVtrXSA9ICh0eXBlVGFsbHlba10gfHwgMCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gZml4dHVyZSBsaWJyYXJpZXMgbG9hZGVkOicsXHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAnZml4dHVyZVR5cGUgdGFsbHk6JyxcclxuICAgICAgICB0eXBlVGFsbHksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkRml4dHVyZUxpYnJhcmllcyBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY29tcHV0ZSB0aGUgc2xvdC10eXBlLWZpbHRlcmVkIGxpYnJhcnkgbGlzdCBvbmNlLiBTdGFibGUgcmVmZXJlbmNlXHJcbiAgICogc28gdGhlIG11bHRpc2VsZWN0IGRvZXNuJ3QgdGVhciBkb3duIGl0cyBjbGljayB0YXJnZXRzIGV2ZXJ5IENEIGN5Y2xlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLnNsaWNlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNsb3RUeXBlID0gc2xvdC5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gc2xvdFR5cGUgPT09ICdldXJvY2VudGVyJyA/ICdmbG9vcicgOiAnd2FsbCc7XHJcbiAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCB0ID0gaXRlbS5maXh0dXJlVHlwZTtcclxuICAgICAgaWYgKCF0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0YXJnZXQgPT09ICd3YWxsJykgcmV0dXJuIHQgPT09ICd3YWxsJyB8fCB0LmluY2x1ZGVzKCd3YWxsJyk7XHJcbiAgICAgIHJldHVybiB0ID09PSAnZmxvb3InIHx8IHQuaW5jbHVkZXMoJ2Zsb29yJykgfHwgdC5pbmNsdWRlcygnZXVybycpIHx8IHQuaW5jbHVkZXMoJ2ZyZWUnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9ucyBzY29wZWQgdG8gd2hpY2hldmVyIHNsb3QgaXMgY3VycmVudGx5IGFjdGl2ZS4gQ2xlYXJlZCBhbmRcclxuICAgKiByZWJ1aWx0IGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBzbG90IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzbG90U3ViczogYW55W10gPSBbXTtcclxuXHJcbiAgLyoqIFBlbmRpbmcgYXV0by1hcHBseSBwcm9taXNlcyBrZXllZCBieSBsaWJJZCBzbyBjaGlwIGNsaWNrcyBjYW4gYXdhaXQuICovXHJcbiAgcHJpdmF0ZSBhdXRvQXBwbHlJbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xyXG5cclxuICAvKiogV2lyZS9yZWZyZXNoIHN1YnNjcmlwdGlvbnMgdGhhdCBkZXBlbmQgb24gdGhlIGFjdGl2ZSBzbG90OlxyXG4gICAqICAtIHJlLWZpbHRlciB0aGUgbGlicmFyeSBtdWx0aXNlbGVjdCB3aGVuIHNsb3RUeXBlIGNoYW5nZXNcclxuICAgKiAgLSBydW4gYXV0by1hcHBseSB3aGVuIGEgbmV3IGxpYnJhcnkgaXMgYWRkZWQgdG8gZml4dHVyZUxpYnJhcnlSZWZzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiaW5kQWN0aXZlU2xvdExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnNsb3RTdWJzKSBzPy51bnN1YnNjcmliZT8uKCk7XHJcbiAgICB0aGlzLnNsb3RTdWJzID0gW107XHJcblxyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHtcclxuICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdCA9IHRoaXMuZml4dHVyZUxpYnJhcnlJdGVtcy5zbGljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90KCk7XHJcblxyXG4gICAgY29uc3QgdHlwZVN1YiA9IHNsb3QuZ2V0KCdzbG90VHlwZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKSk7XHJcbiAgICBpZiAodHlwZVN1YikgdGhpcy5zbG90U3Vicy5wdXNoKHR5cGVTdWIpO1xyXG5cclxuICAgIC8vIFRyYWNrIHByZXZpb3VzIHJlZnMgc28gd2UgY2FuIGRldGVjdCAqbmV3KiBhZGRpdGlvbnMgYW5kIGF1dG8tYXBwbHlcclxuICAgIC8vIHRoZSBzbG90J3MgUElEcyB0byB0aG9zZSBuZXcgbGlicmFyaWVzLlxyXG4gICAgbGV0IHByZXZSZWZzOiBzdHJpbmdbXSA9IFsuLi4oc2xvdC5nZXQoJ2ZpeHR1cmVMaWJyYXJ5UmVmcycpPy52YWx1ZSB8fCBbXSldO1xyXG4gICAgY29uc3QgcmVmc1N1YiA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobmV4dFJlZnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBBcnJheS5pc0FycmF5KG5leHRSZWZzKSA/IG5leHRSZWZzIDogW107XHJcbiAgICAgIGNvbnN0IGFkZGVkID0gbmV4dC5maWx0ZXIoKHIpID0+ICEhciAmJiAhcHJldlJlZnMuaW5jbHVkZXMocikpO1xyXG4gICAgICBwcmV2UmVmcyA9IFsuLi5uZXh0XTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50bHktcHJldmlld2VkIGxpYnJhcnkgd2FzIHVuc2VsZWN0ZWQsIGNsZWFyIHRoZVxyXG4gICAgICAvLyBlbWJlZGRlZCB2aWV3IHNvIHdlIGRvbid0IHNob3cgc3RhbGUgZGF0YS5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcFxyXG4gICAgICAgICAgJiYgIW5leHQuaW5jbHVkZXModGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdCgnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgbGliSWQgb2YgYWRkZWQpIHtcclxuICAgICAgICBjb25zdCBwID0gdGhpcy5hdXRvQXBwbHlQaWRzVG9MaWJyYXJ5KGxpYklkKTtcclxuICAgICAgICB0aGlzLmF1dG9BcHBseUluRmxpZ2h0LnNldChsaWJJZCwgcCk7XHJcbiAgICAgICAgcC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmF1dG9BcHBseUluRmxpZ2h0LmdldChsaWJJZCkgPT09IHApIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvQXBwbHlJbkZsaWdodC5kZWxldGUobGliSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBub3RoaW5nIGlzIGJlaW5nIHByZXZpZXdlZCB5ZXQsIGF1dG8tYWN0aXZhdGUgdGhlIGZpcnN0IGxpYnJhcnlcclxuICAgICAgLy8gdGhlIHVzZXIganVzdCBhZGRlZCBzbyB0aGUgZW1iZWRkZWQgUElEL1ZNIGVkaXRvciBvcGVucyBpbW1lZGlhdGVseVxyXG4gICAgICAvLyAoZXNwZWNpYWxseSByZWxldmFudCB3aGVuIGFkZGluZyB0aGUgRklSU1QgbGlicmFyeSB0byBhbiBlbXB0eVxyXG4gICAgICAvLyBtdWx0aXNlbGVjdCDigJQgcHJldmlvdXNseSB0aGUgY2hpcCBzdHJpcCBzaG93ZWQgaXQgYnV0IHRoZSBwcmV2aWV3XHJcbiAgICAgIC8vIHBhbmUgc3RheWVkIGJsYW5rIHVudGlsIHRoZSB1c2VyIGNsaWNrZWQgdGhlIGNoaXApLlxyXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gYWRkZWQuZmluZCgoaWQpID0+ICEhaWQpIHx8IG5leHQuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgICAgIGlmIChmaXJzdEFjdGl2ZSkgdGhpcy5vbkxpYnJhcnlNYXBTZWxlY3QoZmlyc3RBY3RpdmUpO1xyXG4gICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHJlZnNTdWIpIHRoaXMuc2xvdFN1YnMucHVzaChyZWZzU3ViKTtcclxuXHJcbiAgICAvLyBXaGVuIGFueSBwbGFjZW1lbnQgaW4gdGhlIFwiTG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmcgUGxhY2VtZW50c1wiXHJcbiAgICAvLyBsaXN0IGNoYW5nZXMsIHJlLWRlcml2ZSBldmVyeSBhc3NpZ25lZCBsaWJyYXJ5J3Mgc25hcHNob3Qgc28gdGhlIGVkaXRcclxuICAgIC8vIHByb3BhZ2F0ZXMgdG8gYWxsIG9mIHRoZW0uIERlYm91bmNlZCBzbyByYXBpZCB0eXBpbmcgY29sbGFwc2VzIGludG8gYVxyXG4gICAgLy8gc2luZ2xlIHJlLWFwcGx5LlxyXG4gICAgY29uc3QgcGxhY2VtZW50c0FyciA9IHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgIGNvbnN0IHBsYWNlbWVudHNTdWIgPSBwbGFjZW1lbnRzQXJyPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDQwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFwcGx5UGxhY2VtZW50c1RvQXNzaWduZWRMaWJyYXJpZXMoKSk7XHJcbiAgICBpZiAocGxhY2VtZW50c1N1YikgdGhpcy5zbG90U3Vicy5wdXNoKHBsYWNlbWVudHNTdWIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhIG5ldyBsaWJyYXJ5IGlzIGFkZGVkIHRvIHRoZSBzbG90LCB3YWxrIGl0cyBzaGVsZkNvbmZpZyBhbmQgZm9yXHJcbiAgICogZWFjaCBzaGVsZiB3aG9zZSBzZWN0aW9uIGN1cnJlbnRseSBoYXMgbm8gYnJhbmQsIGNvcHkgdGhlIHJhd1ZhbHVlIG9mXHJcbiAgICogdGhlIHNsb3QncyBQSUQgcGxhY2VtZW50IHdob3NlIGBwb3NpdGlvbmAgbWF0Y2hlcyB0aGUgc2hlbGYnc1xyXG4gICAqIGB6b25lYC9gbGFiZWxgLiBSZXN1bHQgaXMgc2F2ZWQgYXMgdGhlIGxpYnJhcnkncyBzbmFwc2hvdCBzbyB0aGVcclxuICAgKiBlbWJlZGRlZCBmaXh0dXJlLXRlbXBsYXRlIGVkaXRvciBwaWNrcyBpdCB1cCB0aGUgbmV4dCB0aW1lIHRoZSBjaGlwXHJcbiAgICogaXMgb3BlbmVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYXV0b0FwcGx5UGlkc1RvTGlicmFyeShsaWJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWxpYklkKSByZXR1cm47XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudHNBcnIgPSBzbG90LmdldCgncGxhY2VtZW50cycpIGFzIEZvcm1BcnJheSB8IG51bGw7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzOiBhbnlbXSA9IHBsYWNlbWVudHNBcnI/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgcGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKFxyXG4gICAgICAocCkgPT4gcD8ua2luZCA9PT0gJ3BpZCcgJiYgcD8ucG9zaXRpb24gJiYgcD8ucmF3VmFsdWUsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG5vcm0gPSAoczogYW55KTogc3RyaW5nID0+IFN0cmluZyhzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBwbGFjZW1lbnRNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBpZFBsYWNlbWVudHMpIHtcclxuICAgICAgcGxhY2VtZW50TWFwLnNldChub3JtKHAucG9zaXRpb24pLCBTdHJpbmcocC5yYXdWYWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXJ0IGZyb20gYW4gZXhpc3Rpbmcgc25hcHNob3QgaWYgd2UgYWxyZWFkeSBzYXZlZCBvbmUgZm9yIHRoaXMgc2xvdFxyXG4gICAgLy8gKyBsaWJyYXJ5OyBvdGhlcndpc2UgZmV0Y2ggdGhlIGZyZXNoIGxpYnJhcnkgZG9jLiBUaGUgcGVyLWZpZWxkIGd1YXJkc1xyXG4gICAgLy8gYmVsb3cgc3RpbGwgZW5zdXJlIHdlIG5ldmVyIG92ZXJ3cml0ZSB1c2VyLXNldCBicmFuZHMgb3IgVk1zLlxyXG4gICAgbGV0IGxpYkRhdGE6IGFueSA9IHRoaXMuZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkKTtcclxuICAgIGlmICghbGliRGF0YSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0Rml4dHVyZUxpYnJhcnlEZXRhaWxzKGxpYklkKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxpYkRhdGEgPSByZXM/LmRhdGE7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGF1dG9BcHBseVBpZHNUb0xpYnJhcnkgW0VSUl06JywgZXJyKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghbGliRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmQ29uZmlnOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkobGliRGF0YS5zaGVsZkNvbmZpZykgPyBsaWJEYXRhLnNoZWxmQ29uZmlnIDogW107XHJcbiAgICBsZXQgcGlkc0FwcGxpZWQgPSBmYWxzZTtcclxuICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbGZDb25maWcubWFwKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNoZWxmPy5wcm9kdWN0QnJhbmROYW1lKSAmJiBzaGVsZi5wcm9kdWN0QnJhbmROYW1lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4gc2hlbGY7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSBzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwgfHwgJyc7XHJcbiAgICAgIGNvbnN0IG1hdGNoS2V5ID0gbm9ybShzb3VyY2VMYWJlbCk7XHJcbiAgICAgIGlmICghbWF0Y2hLZXkpIHJldHVybiBzaGVsZjtcclxuICAgICAgY29uc3QgbWF0Y2ggPSBwbGFjZW1lbnRNYXAuZ2V0KG1hdGNoS2V5KTtcclxuICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICBwaWRzQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIC8vIGdyb3VwU2hlbHZlc0J5Wm9uZSgpIGluIFRlbXBsYXRlUHJvZHVjdHNDb21wb25lbnQgU0tJUFMgYW55IHNoZWxmXHJcbiAgICAgIC8vIHdob3NlIGB6b25lYCBpcyBlbXB0eSwgc28gd2UgbXVzdCBzZXQgem9uZSAodXNpbmcgdGhlIHNoZWxmJ3MgbGFiZWxcclxuICAgICAgLy8gaWYgaXQgaXNuJ3QgYWxyZWFkeSBzZXQpIGZvciB0aGUgc2VjdGlvbiB0byBmb3JtLlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNoZWxmLFxyXG4gICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNvdXJjZUxhYmVsLFxyXG4gICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFttYXRjaF0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0gVk0gYXV0by1hcHBseSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gSWYgdGhlIGxpYnJhcnkgaGFzIG5vIFZNcyBjb25maWd1cmVkIHlldCwgY29weSBlYWNoIG9mIHRoZSBzbG90J3MgVk1cclxuICAgIC8vIHBsYWNlbWVudHMgb3ZlciBhcyBhIHZtQ29uZmlnIGVudHJ5LiBObyBwb3NpdGlvbi1iYXNlZCBtYXRjaGluZyBoZXJlIOKAlFxyXG4gICAgLy8gdGhlIHBsYWNlbWVudCdzIGByYXdWYWx1ZWAgYmVjb21lcyB0aGUgVk0gYXJ0d29yayBhbmQgYHBvc2l0aW9uYFxyXG4gICAgLy8gYmVjb21lcyB0aGUgVk0gdHlwZSBsYWJlbC5cclxuICAgIGNvbnN0IGV4aXN0aW5nVm1zID0gQXJyYXkuaXNBcnJheShsaWJEYXRhLnZtQ29uZmlnKSA/IGxpYkRhdGEudm1Db25maWcgOiBbXTtcclxuICAgIGxldCBuZXdWbUNvbmZpZyA9IGV4aXN0aW5nVm1zO1xyXG4gICAgbGV0IHZtc0FwcGxpZWQgPSBmYWxzZTtcclxuICAgIGlmIChleGlzdGluZ1Ztcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgdm1QbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoXHJcbiAgICAgICAgKHApID0+IHA/LmtpbmQgPT09ICd2bScgJiYgcD8ucmF3VmFsdWUsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh2bVBsYWNlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnID0gdm1QbGFjZW1lbnRzLm1hcCgocCkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgdm1UeXBlID0gU3RyaW5nKHA/LnBvc2l0aW9uIHx8ICcnKTtcclxuICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuaW5pdGlhbFZtTGF5b3V0KHZtVHlwZSwgbmV3U2hlbGZDb25maWcpO1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdm1UeXBlLFxyXG4gICAgICAgICAgICB2bUlkOiBTdHJpbmcocD8ucmF3VmFsdWUgfHwgJycpLFxyXG4gICAgICAgICAgICB2bU5hbWU6IFN0cmluZyhwPy5yYXdWYWx1ZSB8fCAnJyksXHJcbiAgICAgICAgICAgIC4uLmxheW91dCxcclxuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2bXNBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGlkc0FwcGxpZWQgJiYgIXZtc0FwcGxpZWQpIHJldHVybjtcclxuXHJcbiAgICAvLyBUaGUgZW1iZWRkZWQgVGVtcGxhdGVQcm9kdWN0c0NvbXBvbmVudCBvbmx5IHJlYWRzIHNlY3Rpb24tbGV2ZWwgYnJhbmRcclxuICAgIC8vIHZhbHVlcyB3aGVuIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09ICdMMycuXHJcbiAgICBjb25zdCB1cGRhdGVkTGliID0ge1xyXG4gICAgICAuLi5saWJEYXRhLFxyXG4gICAgICBzaGVsZkNvbmZpZzogbmV3U2hlbGZDb25maWcsXHJcbiAgICAgIHZtQ29uZmlnOiBuZXdWbUNvbmZpZyxcclxuICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogJ0wzJyxcclxuICAgIH07XHJcbiAgICB0aGlzLmNhcHR1cmVMaWJyYXJ5U25hcHNob3QobGliSWQsIHVwZGF0ZWRMaWIpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZERldGFpbHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbklkKSByZXR1cm47XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0TG9va1BsYW5vQ29sbGVjdGlvbkRldGFpbHModGhpcy5jb2xsZWN0aW9uSWQpLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhO1xyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCAnJyxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgaXNBY3RpdmU6ICEhZGF0YS5pc0FjdGl2ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmxvb2tzLmNsZWFyKCk7XHJcbiAgICAgICAgKGRhdGEubG9va3MgfHwgW10pLmZvckVhY2goKGw6IGFueSkgPT4gdGhpcy5sb29rcy5wdXNoKHRoaXMuY3JlYXRlTG9va0dyb3VwKGwpKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IHRoaXMubG9va3MubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgICAgIGNvbnN0IHNsb3RzID0gdGhpcy5zZWxlY3RlZExvb2tJbmRleCA+PSAwID8gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90cyAmJiBzbG90cy5sZW5ndGggPyAwIDogLTE7XHJcbiAgICAgICAgdGhpcy5yZXNldExpYnJhcnlNYXAoKTtcclxuICAgICAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RMaWJyYXJ5KCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkRGV0YWlscyBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Q/LignRmFpbGVkIHRvIGxvYWQgTG9vayBjb2xsZWN0aW9uJyk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZExvb2soKSB7XHJcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5jcmVhdGVMb29rR3JvdXAoeyBtYnFCdWNrZXQ6ICcnLCBmaXh0dXJlQ291bnQ6IDEgfSk7XHJcbiAgICB0aGlzLmxvb2tzLnB1c2gobmV4dCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gdGhpcy5sb29rcy5sZW5ndGggLSAxO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHRoaXMuZml4dHVyZVNsb3RzKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgIHRoaXMuYmluZEFjdGl2ZVNsb3RMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUxvb2soaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5sb29rcy5yZW1vdmVBdChpbmRleCk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb2tJbmRleCA9PT0gaW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IHRoaXMubG9va3MubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID0gLTE7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPiBpbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4IC09IDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RMb29rKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5maXh0dXJlU2xvdHMoaW5kZXgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgIHRoaXMucmVzZXRMaWJyYXJ5TWFwKCk7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIGFkZFNsb3QoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb2tJbmRleCA8IDApIHJldHVybjtcclxuICAgIGNvbnN0IGxvb2tHcm91cCA9IHRoaXMubG9va3MuYXQodGhpcy5zZWxlY3RlZExvb2tJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KTtcclxuICAgIHNsb3RzLnB1c2godGhpcy5jcmVhdGVTbG90R3JvdXAoeyBzbG90SW5kZXg6IHNsb3RzLmxlbmd0aCArIDEgfSkpO1xyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnNldFZhbHVlKHNsb3RzLmxlbmd0aCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzLmxlbmd0aCAtIDE7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTbG90KHNsb3RJbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb2tJbmRleCA8IDApIHJldHVybjtcclxuICAgIGNvbnN0IGxvb2tHcm91cCA9IHRoaXMubG9va3MuYXQodGhpcy5zZWxlY3RlZExvb2tJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KTtcclxuICAgIHNsb3RzLnJlbW92ZUF0KHNsb3RJbmRleCk7XHJcbiAgICB0aGlzLnJlbnVtYmVyU2xvdHNGb3JHcm91cChsb29rR3JvdXApO1xyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnNldFZhbHVlKHNsb3RzLmxlbmd0aCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPT09IHNsb3RJbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID0gc2xvdHMubGVuZ3RoID8gTWF0aC5taW4oc2xvdEluZGV4LCBzbG90cy5sZW5ndGggLSAxKSA6IC0xO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID4gc2xvdEluZGV4KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggLT0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbnVtYmVyU2xvdHNGb3JHcm91cChsb29rR3JvdXA6IEZvcm1Hcm91cCkge1xyXG4gICAgY29uc3Qgc2xvdHNBcnIgPSBsb29rR3JvdXAuZ2V0KCdmaXh0dXJlU2xvdHMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICBzbG90c0Fyci5jb250cm9scy5mb3JFYWNoKChzbG90LCBpKSA9PiB7XHJcbiAgICAgIChzbG90IGFzIEZvcm1Hcm91cCkuZ2V0KCdzbG90SW5kZXgnKT8uc2V0VmFsdWUoaSArIDEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2xvdChzbG90SW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RJbmRleDtcclxuICAgIHRoaXMucmVzZXRMaWJyYXJ5TWFwKCk7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIGxvb2tUaXRsZShsb29rR3JvdXA6IEZvcm1Hcm91cCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZXlUeXBlID0gbG9va0dyb3VwLmdldCgna2V5VHlwZScpPy52YWx1ZTtcclxuICAgIGNvbnN0IGtleSA9IGtleVR5cGUgPT09ICdicmFuZENhdGVnb3J5J1xyXG4gICAgICA/IGxvb2tHcm91cC5nZXQoJ2JyYW5kQ2F0ZWdvcnknKT8udmFsdWVcclxuICAgICAgOiBsb29rR3JvdXAuZ2V0KCdtYnFCdWNrZXQnKT8udmFsdWU7XHJcbiAgICBjb25zdCBjb3VudCA9IGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVDb3VudCcpPy52YWx1ZTtcclxuICAgIHJldHVybiBgJHtrZXkgfHwgJyh1bm5hbWVkKSd9IOKAlCAke2NvdW50IHx8IDB9IGZpeHR1cmVzYDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3J0IHZpc3VhbCBpbmRpY2F0b3IgZm9yIHRoZSBzbG90VHlwZSBtaXggb2YgYSBsb29rIOKAlCByZW5kZXJlZCBhcyBhXHJcbiAgICogY29sb3VyZWQgY2hpcCBpbiB0aGUgTUJRIEJ1Y2tldCAtIEZpeHR1cmUgQ29tYmluYXRpb25zIGxpc3QuIFJldHVybnNcclxuICAgKiBgbnVsbGAgZm9yIGFuIGVtcHR5IGxvb2sgc28gdGhlIGNoaXAgaXMgaGlkZGVuLlxyXG4gICAqL1xyXG4gIGZpeHR1cmVUeXBlQmFkZ2UobG9va0dyb3VwOiBGb3JtR3JvdXApOiB7IGxhYmVsOiBzdHJpbmc7IGNsczogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3RzID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgIGlmICghc2xvdHMgfHwgc2xvdHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBoYXNTaGVsZiA9IGZhbHNlO1xyXG4gICAgbGV0IGhhc0V1cm8gPSBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgYyBvZiBzbG90cy5jb250cm9scykge1xyXG4gICAgICBjb25zdCB0ID0gKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlO1xyXG4gICAgICBpZiAodCA9PT0gJ2V1cm9jZW50ZXInKSBoYXNFdXJvID0gdHJ1ZTtcclxuICAgICAgZWxzZSBoYXNTaGVsZiA9IHRydWU7XHJcbiAgICAgIGlmIChoYXNTaGVsZiAmJiBoYXNFdXJvKSBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChoYXNTaGVsZiAmJiBoYXNFdXJvKSByZXR1cm4geyBsYWJlbDogJ1dhbGwgKyBGbG9vcicsIGNsczogJ2JhZGdlLW1peGVkJyB9O1xyXG4gICAgaWYgKGhhc0V1cm8pIHJldHVybiB7IGxhYmVsOiAnRmxvb3InLCBjbHM6ICdiYWRnZS1mbG9vcicgfTtcclxuICAgIHJldHVybiB7IGxhYmVsOiAnV2FsbCcsIGNsczogJ2JhZGdlLXdhbGwnIH07XHJcbiAgfVxyXG5cclxuICBidWNrZXRLZXkobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5VHlwZSA9IGxvb2tHcm91cC5nZXQoJ2tleVR5cGUnKT8udmFsdWU7XHJcbiAgICBjb25zdCBrZXkgPSBrZXlUeXBlID09PSAnYnJhbmRDYXRlZ29yeSdcclxuICAgICAgPyBsb29rR3JvdXAuZ2V0KCdicmFuZENhdGVnb3J5Jyk/LnZhbHVlXHJcbiAgICAgIDogbG9va0dyb3VwLmdldCgnbWJxQnVja2V0Jyk/LnZhbHVlO1xyXG4gICAgcmV0dXJuIChrZXkgfHwgJycpLnRyaW0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFzc2lnbiBhIGNvbG91ciB0byBlYWNoIHVuaXF1ZSBidWNrZXQga2V5IGJ5ICoqaW5zZXJ0aW9uIG9yZGVyKiosIG5vdCBieSBoYXNoLlxyXG4gICAqIFRoZSBOdGggZGlzdGluY3QgYnVja2V0IChjb3VudGVkIHRvcC10by1ib3R0b20gdGhyb3VnaCB0aGUgbG9va3MgYXJyYXkpIGdldHNcclxuICAgKiBgQlVDS0VUX1BBTEVUVEVbTl1gLiBPbmx5IGFmdGVyIGFsbCAyMCBwYWxldHRlIHNsb3RzIGFyZSB1c2VkIGRvZXMgdGhlIGFzc2lnbm1lbnRcclxuICAgKiB3cmFwIGFyb3VuZCDigJQgc28gbm8gY29sb3VyIGlzIGV2ZXIgcmV1c2VkIHdoaWxlIDwgMjAgZGlzdGluY3QgYnVja2V0cyBleGlzdC5cclxuICAgKlxyXG4gICAqIFJlY29tcHV0ZWQgb24gZXZlcnkgY2FsbCBzbyBsaXZlIGVkaXRzIHRvIHRoZSBidWNrZXQgbmFtZSByZS1mbG93IGNvbG91cnMuXHJcbiAgICovXHJcbiAgYnVja2V0Q29sb3IobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWNrZXRLZXkobG9va0dyb3VwKTtcclxuICAgIGlmICgha2V5KSByZXR1cm4gJyNmOWZhZmInO1xyXG4gICAgY29uc3QgcGFsZXR0ZSA9IExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50LkJVQ0tFVF9QQUxFVFRFO1xyXG4gICAgbGV0IG5leHRJbmRleCA9IDA7XHJcbiAgICBjb25zdCBhc3NpZ25lZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMubG9va3MuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgayA9IHRoaXMuYnVja2V0S2V5KGdyb3VwIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgIGlmIChrICYmICFhc3NpZ25lZC5oYXMoaykpIHtcclxuICAgICAgICBhc3NpZ25lZC5zZXQoaywgcGFsZXR0ZVtuZXh0SW5kZXggJSBwYWxldHRlLmxlbmd0aF0pO1xyXG4gICAgICAgIG5leHRJbmRleCArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChrID09PSBrZXkpIHtcclxuICAgICAgICByZXR1cm4gYXNzaWduZWQuZ2V0KGspITtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcjZjlmYWZiJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlb3JkZXIgdGhlIGxvb2tzIEZvcm1BcnJheSBzbyB0aGF0IHRoZSBidWNrZXQgd2l0aCB0aGUgKiptb3N0KiogbG9va3NcclxuICAgKiBjb21lcyBmaXJzdCBhbmQgdGhlIG9uZSB3aXRoIHRoZSBmZXdlc3QgY29tZXMgbGFzdCAoYWxwaGFiZXRpY2FsIHRpZS1icmVha1xyXG4gICAqIHdpdGhpbiB0aGUgc2FtZSBjb3VudCkuIExvb2tzIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQgYXJlIHNvcnRlZCBieVxyXG4gICAqIGFzY2VuZGluZyBmaXh0dXJlQ291bnQuIFNlbGVjdGlvbiBpcyBwcmVzZXJ2ZWQgYnkgcmVmZXJlbmNlLCBub3QgYnkgaW5kZXguXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseVNvcnRlZE9yZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5sb29rcy5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIGlmIChncm91cHMubGVuZ3RoIDw9IDEpIHJldHVybjtcclxuXHJcbiAgICAvLyBUYWxseSBob3cgbWFueSBsb29rcyBlYWNoIGJ1Y2tldCBoYXMgc28gd2UgY2FuIHNvcnQgYnVja2V0cyBieSBmcmVxdWVuY3kuXHJcbiAgICBjb25zdCBidWNrZXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5idWNrZXRLZXkoZyk7XHJcbiAgICAgIGlmICghaykgY29udGludWU7XHJcbiAgICAgIGJ1Y2tldENvdW50cy5zZXQoaywgKGJ1Y2tldENvdW50cy5nZXQoaykgfHwgMCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZ3JvdXBzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFLZXkgPSB0aGlzLmJ1Y2tldEtleShhKTtcclxuICAgICAgY29uc3QgYktleSA9IHRoaXMuYnVja2V0S2V5KGIpO1xyXG4gICAgICAvLyBFbXB0eSBidWNrZXQga2V5cyBnbyB0byB0aGUgZW5kIHNvIHVuZmluaXNoZWQgbG9va3MgZG9uJ3QgZGlzcnVwdCB0aGUgZ3JvdXBzXHJcbiAgICAgIGlmIChhS2V5ICYmICFiS2V5KSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUtleSAmJiBiS2V5KSByZXR1cm4gMTtcclxuXHJcbiAgICAgIC8vIFByaW1hcnk6IGJ1Y2tldCBmcmVxdWVuY3ksIGRlc2NlbmRpbmcgKG1vc3QtcG9wdWxhdGVkIGJ1Y2tldCBmaXJzdClcclxuICAgICAgY29uc3QgYUNvdW50ID0gYnVja2V0Q291bnRzLmdldChhS2V5KSB8fCAwO1xyXG4gICAgICBjb25zdCBiQ291bnQgPSBidWNrZXRDb3VudHMuZ2V0KGJLZXkpIHx8IDA7XHJcbiAgICAgIGlmIChhQ291bnQgIT09IGJDb3VudCkgcmV0dXJuIGJDb3VudCAtIGFDb3VudDtcclxuXHJcbiAgICAgIC8vIFRpZS1icmVhazogYWxwaGFiZXRpY2FsIGJ1Y2tldCBuYW1lXHJcbiAgICAgIGlmIChhS2V5ICE9PSBiS2V5KSByZXR1cm4gYUtleS5sb2NhbGVDb21wYXJlKGJLZXkpO1xyXG5cclxuICAgICAgLy8gV2l0aGluIHRoZSBzYW1lIGJ1Y2tldDogYXNjZW5kaW5nIGZpeHR1cmVDb3VudFxyXG4gICAgICBjb25zdCBhRkMgPSBOdW1iZXIoYS5nZXQoJ2ZpeHR1cmVDb3VudCcpPy52YWx1ZSkgfHwgMDtcclxuICAgICAgY29uc3QgYkZDID0gTnVtYmVyKGIuZ2V0KCdmaXh0dXJlQ291bnQnKT8udmFsdWUpIHx8IDA7XHJcbiAgICAgIHJldHVybiBhRkMgLSBiRkM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBvcmRlckNoYW5nZWQgPSBzb3J0ZWQuc29tZSgoZywgaSkgPT4gZyAhPT0gZ3JvdXBzW2ldKTtcclxuICAgIGlmICghb3JkZXJDaGFuZ2VkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3VycmVudExvb2sgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgY29uc3QgY3VycmVudFNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG5cclxuICAgIHRoaXMubG9va3MuY2xlYXIoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgc29ydGVkLmZvckVhY2goKGcpID0+IHRoaXMubG9va3MucHVzaChnLCB7IGVtaXRFdmVudDogZmFsc2UgfSkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50TG9vaykge1xyXG4gICAgICBjb25zdCBuZXdMb29rSWR4ID0gc29ydGVkLmluZGV4T2YoY3VycmVudExvb2spO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gbmV3TG9va0lkeDtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCAmJiBjdXJyZW50U2xvdCkge1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICAgICAgY29uc3QgbmV3U2xvdElkeCA9IHNsb3RzQXJyLmNvbnRyb2xzLmluZGV4T2YoY3VycmVudFNsb3QpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBuZXdTbG90SWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzYXZlKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdD8uKCdQbGVhc2UgZmlsbCBhbGwgcmVxdWlyZWQgZmllbGRzJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFNvcnQgdGhlIGxvb2tzIGJlZm9yZSBzZXJpYWxpc2luZyBzbyBib3RoIHRoZSBwZXJzaXN0ZWQgcGF5bG9hZFxyXG4gICAgICAvLyBhbmQgdGhlIG9uLXNjcmVlbiBsaXN0IHJlZmxlY3QgZ3JvdXBpbmcgYnkgTUJRIGJ1Y2tldCAvIGJyYW5kIGNhdGVnb3J5XHJcbiAgICAgIC8vIGFuZCBhc2NlbmRpbmcgZml4dHVyZSBjb3VudC5cclxuICAgICAgdGhpcy5hcHBseVNvcnRlZE9yZGVyKCk7XHJcblxyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXcpIHtcclxuICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5jcmVhdGVMb29rUGxhbm9Db2xsZWN0aW9uKHBheWxvYWQpKTtcclxuICAgICAgICBjb25zdCBuZXdJZCA9IHJlcz8uZGF0YT8uX2lkO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0Py4oJ0xvb2sgY29sbGVjdGlvbiBjcmVhdGVkJyk7XHJcbiAgICAgICAgaWYgKG5ld0lkKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2xvb2tzJywgbmV3SWRdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcyddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UudXBkYXRlTG9va1BsYW5vQ29sbGVjdGlvbih7IC4uLnBheWxvYWQsIGNvbGxlY3Rpb25JZDogdGhpcy5jb2xsZWN0aW9uSWQgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdD8uKCdMb29rIGNvbGxlY3Rpb24gdXBkYXRlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gc2F2ZSBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Q/LignRmFpbGVkIHRvIHNhdmUgTG9vayBjb2xsZWN0aW9uJyk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcyddKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgLy8gUmVsZWFzZSB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCBzbyBvdGhlciBwYWdlcyBkb24ndCBpbmhlcml0IGEgc3RhbGUgbGlicmFyeS5cclxuICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQobnVsbCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwibG9vay1mb3JtXCI+XHJcbiAgPCEtLSBUb3AgYmFyIChib3VuZCB0byB0aGUgb3V0ZXIgZm9ybSkgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPk5hbWUgKjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIE1hc3RlciBMb29rIFBsYW4gRlkyNlwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgZGVzY3JpcHRpb25cIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmdy1ib2xkIGQtYmxvY2tcIj5BY3RpdmU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0FjdGl2ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgdGV4dC1lbmRcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMlwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInNhdmluZ1wiIChjbGljayk9XCJzYXZlKClcIj5cclxuICAgICAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogJ1NhdmUnIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVGhyZWUtcGFuZSBlZGl0b3IgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBteC0wIGctM1wiPlxyXG4gICAgPCEtLSBMZWZ0OiBMb29rcyBsaXN0IChubyBmb3JtIGJpbmRpbmcgbmVlZGVkIOKAlCBqdXN0IG5hdmlnYXRpb24pIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBoLTEwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgIDxoNiBjbGFzcz1cIm0tMFwiPk1CUSBCdWNrZXQgLSBGaXh0dXJlIENvbWJpbmF0aW9uczwvaDY+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkTG9vaygpXCI+KyBBZGQgTG9vazwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsb29rcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBsb29rcyB5ZXQuIEFkZCBvbmUgdG8gc3RhcnQuPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvb2tzLXRyZWVcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvb2sgb2YgbG9va3MuY29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibG9vay1yb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yIHB5LTIgbWItMSByb3VuZGVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkTG9va0luZGV4ID09PSBpXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TG9vayhpKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidWNrZXQtZG90XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3sgbG9va1RpdGxlKCRhbnkobG9vaykpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXh0dXJlVHlwZUJhZGdlKCRhbnkobG9vaykpIGFzIGZ0YlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaXh0dXJlLXR5cGUtYmFkZ2VcIiBbbmdDbGFzc109XCJmdGIuY2xzXCI+e3sgZnRiLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQtZGFuZ2VyIG1zLTJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVMb29rKGkpXCI+w5c8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2VudHJlOiBzZWxlY3RlZCBMb29rIG1ldGFkYXRhICsgc2xvdHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9va0dyb3VwIGFzIGxvb2tHcm91cDsgZWxzZSBub0xvb2tcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgaC0xMDBcIiBbZm9ybUdyb3VwXT1cImxvb2tHcm91cFwiPlxyXG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItM1wiPkZpeHR1cmUgQ29tYmluYXRpb24gRGV0YWlsczwvaDY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+TUJRIGJ1Y2tldDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwibWJxQnVja2V0XCIgcGxhY2Vob2xkZXI9XCJlLmcuIEpKIC8gT0QgRXllXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIGNvdW50ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjMwXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNvdW50XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Q0FEIEhlYWRlciBWYXJpZW50czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGxpYi1jaGlwcy1pbnB1dFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjYWQtaGVhZGVyLXZhcmlhbnRzLWlucHV0XCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNhZEhlYWRlclZhcmlhbnRzXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBhIHZhcmlhbnQgYW5kIHByZXNzIEVudGVyXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItY2hpcHMtaW5wdXQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkZpeHR1cmUgUG9zaXRpb25zPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpeHR1cmVUeXBlT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICBpZEZpZWxkPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBmaXh0dXJlIHBvc2l0aW9uXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVUeXBlXCI+XHJcbiAgICAgICAgICAgICAgPC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxociAvPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibS0wXCI+Rml4dHVyZXM8L2g2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cImFkZFNsb3QoKVwiPisgQWRkIEZpeHR1cmU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsb3RzLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbG90IG9mIChzZWxlY3RlZFNsb3RzQXJyYXk/LmNvbnRyb2xzIHx8IFtdKTsgbGV0IHMgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNsb3Qtcm93IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtMiBweS0yIG1iLTEgcm91bmRlZFwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkU2xvdEluZGV4ID09PSBzXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2xvdChzKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LWJvbGQgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgRml4dHVyZSB7eyAkYW55KHNsb3QpLmdldCgnc2xvdEluZGV4Jyk/LnZhbHVlIH19IOKAlCB7eyAkYW55KHNsb3QpLmdldCgnc2xvdFR5cGUnKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyAkYW55KHNsb3QpLmdldCgnYnJhbmQnKT8udmFsdWUgfHwgJyhubyBicmFuZCknIH19IMK3XHJcbiAgICAgICAgICAgICAgICAgIHt7ICRhbnkoc2xvdCkuZ2V0KCdmaXh0dXJlTGV2ZWxab25lJyk/LnZhbHVlIHx8ICcobm8gem9uZSknIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodC1kYW5nZXIgbXMtMlwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHJlbW92ZVNsb3QocylcIj7DlzwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub0xvb2s+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC01IGgtMTAwIHRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5TZWxlY3Qgb3IgYWRkIGEgTG9vayB0byBlZGl0IGl0LjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSaWdodDogc2VsZWN0ZWQgc2xvdCDigJQgcGxhY2VtZW50cyBlZGl0b3IgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkU2xvdEdyb3VwIGFzIHNsb3RHcm91cDsgZWxzZSBub1Nsb3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgaC0xMDBcIiBbZm9ybUdyb3VwXT1cInNsb3RHcm91cFwiPlxyXG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItM1wiPkZpeHR1cmUge3sgc2VsZWN0ZWRTbG90SW5kZXggKyAxIH19IC0gRGVmaW5pdGlvbjwvaDY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCB0ZXh0LW11dGVkXCI+U2xvdCBpbmRleCAoYXV0byk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIFt2YWx1ZV09XCJzZWxlY3RlZFNsb3RJbmRleCArIDFcIiByZWFkb25seSBkaXNhYmxlZCAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkZpeHR1cmUgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic2xvdFR5cGVcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBhdmFpbGFibGVTbG90VHlwZXNcIiBbdmFsdWVdPVwib3B0LmlkXCI+e3sgb3B0Lm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRcIiBwbGFjZWhvbGRlcj1cIkpvaG4gSmFjb2JzXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rml4dHVyZSBIZWFkZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVMZXZlbFpvbmVcIiBwbGFjZWhvbGRlcj1cIlByZW1pdW0gVHJlbmRpbmdcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIFRlbXBsYXRlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZml4dHVyZS1saWJyYXJpZXMtc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdFwiXHJcbiAgICAgICAgICAgICAgICBpZEZpZWxkPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgc2VhcmNoRmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGZpeHR1cmUgdGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVMaWJyYXJ5UmVmc1wiPlxyXG4gICAgICAgICAgICAgIDwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJzbG90R3JvdXAuZ2V0KCdzbG90VHlwZScpPy52YWx1ZSA9PT0gJ2V1cm9jZW50ZXInXCI+XHJcbiAgICAgICAgICAgICAgICBTaG93aW5nIGZsb29yIGZpeHR1cmVzIChldXJvY2VudGVyIHNsb3QpLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwic2xvdEdyb3VwLmdldCgnc2xvdFR5cGUnKT8udmFsdWUgIT09ICdldXJvY2VudGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgU2hvd2luZyB3YWxsIGZpeHR1cmVzIChzaGVsZiBzbG90KS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxociAvPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibS0wXCI+TG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmcgUGxhY2VtZW50czwvaDY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiAoY2xpY2spPVwiYWRkUGxhY2VtZW50KClcIj4rIEFkZCBwbGFjZW1lbnQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIihzZWxlY3RlZFBsYWNlbWVudHM/Lmxlbmd0aCB8fCAwKSA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtYi0yXCI+XHJcbiAgICAgICAgICAgIE5vIHBsYWNlbWVudHMgeWV0LiBDbGljayA8c3Ryb25nPisgQWRkIHBsYWNlbWVudDwvc3Ryb25nPiB0byBhZGQgb25lLlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGxhY2VtZW50cy1zY3JvbGxcIiBmb3JtQXJyYXlOYW1lPVwicGxhY2VtZW50c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHAgb2YgKHNlbGVjdGVkUGxhY2VtZW50cz8uY29udHJvbHMgfHwgW10pOyBsZXQgcGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInBsYWNlbWVudC1yb3cgbWItMlwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwicGlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMiBwbGFjZW1lbnQtZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGgtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwia2luZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwaWRcIj5Qcm9kdWN0IE1lcmNoYW5kaXNpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidm1cIj5WaXN1YWwgTWVyY2hhbmRpc2luZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVmlzdWFsIE1lcmNoYW5kaXNpbmcgcm93czogVk0gVHlwZSAoc2luZ2xlKSArIFZNIEFydHdvcmsgKHNpbmdsZSkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJGFueShwKS5nZXQoJ2tpbmQnKT8udmFsdWUgPT09ICd2bSc7IGVsc2UgcGlkSW5wdXRzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ2bVR5cGVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlZpc3VhbCBNZXJjaGFuZGlzaW5nIFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicG9zaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1zZWFyY2hhYmxlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ2bUFydHdvcmtPcHRpb25zRm9yKCRhbnkocCkuZ2V0KCdwb3NpdGlvbicpPy52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWRGaWVsZD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWVGaWVsZD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVmlzdWFsIE1lcmNoYW5kaXNpbmcgQXJ0d29ya1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYXdWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUHJvZHVjdCBNZXJjaGFuZGlzaW5nIHJvd3M6IFRvcC9NaWQvQm90dG9tIHBvc2l0aW9uICsgbXVsdGktc2VsZWN0IHByb2R1Y3QvU0tVIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwaWRJbnB1dHM+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGZvcm1Db250cm9sTmFtZT1cInBvc2l0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+UG9zaXRpb248L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3BcIj5Ub3A8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJNaWRcIj5NaWQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJCb3R0b21cIj5Cb3R0b208L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJwcm9kdWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZEZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQcm9kdWN0IC8gU0tVXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJhd1ZhbHVlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodC1kYW5nZXIgcGgtcmVtb3ZlXCIgKGNsaWNrKT1cInJlbW92ZVBsYWNlbWVudChwaSlcIj7DlzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub1Nsb3Q+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC01IGgtMTAwIHRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5TZWxlY3QgYSBmaXh0dXJlIHNsb3QgdG8gZWRpdCBwbGFjZW1lbnRzLjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gUGVyLXNsb3QgRml4dHVyZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gY2FyZCAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRTbG90R3JvdXAgYXMgc2xvdEdyb3VwRm9yTWFwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbXQtNCBsaWJyYXJ5LWNvbmZpZy1jYXJkXCIgW2Zvcm1Hcm91cF09XCJzbG90R3JvdXBGb3JNYXBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJmb3JtLWxhYmVsIGQtYmxvY2sgbWItM1wiPkZpeHR1cmUgbGlicmFyeTwvaDU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnJhcnktY2hpcHNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxpYiBvZiBzZWxlY3RlZFNsb3RMaWJyYXJpZXNGb3JEcm9wZG93blwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxpYnJhcnktY2hpcFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9PT0gbGliLmlkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTGlicmFyeU1hcFNlbGVjdChzZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBsaWIuaWQgPyAnJyA6IGxpYi5pZClcIj5cclxuICAgICAgICAgICAge3sgbGliLm5hbWUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzbWFsbCAqbmdJZj1cInNlbGVjdGVkU2xvdExpYnJhcmllc0ZvckRyb3Bkb3duLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgTm8gbGlicmFyaWVzIGxpbmtlZCB0byB0aGlzIHNsb3QgeWV0LiBBZGQgc29tZSBpbiB0aGUgXCJGaXh0dXJlIGxpYnJhcmllc1wiIG11bHRpc2VsZWN0IGFib3ZlLlxyXG4gICAgICAgIDwvc21hbGw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmdMaWJyYXJ5RGV0YWlsc1wiIGNsYXNzPVwidGV4dC1tdXRlZFwiPkxvYWRpbmcgZml4dHVyZSBkZXRhaWxz4oCmPC9kaXY+XHJcblxyXG4gICAgICA8IS0tXHJcbiAgICAgICAgVXNlICpuZ0ZvciArIHRyYWNrQnkga2V5ZWQgb24gKGxvb2ssIHNsb3QsIGxpYnJhcnkpIHNvIEFuZ3VsYXIgdHJlYXRzXHJcbiAgICAgICAgYSBzd2l0Y2ggYXMgYSBuZXcgaXRlbSDigJQgdGhhdCBmb3JjZXMgdGhlIGVtYmVkZGVkIHRlbXBsYXRlLXByb2R1Y3RzXHJcbiAgICAgICAgLyB0ZW1wbGF0ZS12bXMgY29tcG9uZW50cyB0byByZW1vdW50IGFuZCByZXJ1biB0aGVpciBuZ09uSW5pdFxyXG4gICAgICAgIChvdGhlcndpc2UgdGhlaXIgYGlzUGFnZUxvYWRpbmdgIGd1YXJkIHNraXBzIHRoZSBmb3JtIHJlYnVpbGQpLlxyXG4gICAgICAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgXyBvZiBlbWJlZGRlZEhvc3RLZXlzOyB0cmFja0J5OiB0cmFja0J5RW1iZWRkZWRLZXlcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgbWItM1wiPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlbWJlZGRlZFRhYiA9PT0gJ3Byb2R1Y3RzJ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVtYmVkZGVkVGFiID0gJ3Byb2R1Y3RzJ1wiPlByb2R1Y3QgTWVyY2hhbmRpc2luZzwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZW1iZWRkZWRUYWIgPT09ICd2bXMnXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZW1iZWRkZWRUYWIgPSAndm1zJ1wiPlZpc3VhbCBNZXJjaGFuZGlzaW5nPC9idXR0b24+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJlbWJlZGRlZFRhYiA9PT0gJ3Byb2R1Y3RzJ1wiPlxyXG4gICAgICAgICAgPGxpYi10ZW1wbGF0ZS1wcm9kdWN0cyBbbG9va3NNb2RlXT1cInRydWVcIj48L2xpYi10ZW1wbGF0ZS1wcm9kdWN0cz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW1iZWRkZWRUYWIgPT09ICd2bXMnXCI+XHJcbiAgICAgICAgICA8bGliLXRlbXBsYXRlLXZtcyBbbG9va3NNb2RlXT1cInRydWVcIj48L2xpYi10ZW1wbGF0ZS12bXM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvc2VjdGlvbj5cclxuIl19
|