ng-zenduit 1.0.64 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/filter/zendu-filter.component.mjs +23 -144
- package/esm2020/lib/groups/zendu-groups.component.mjs +320 -0
- package/esm2020/lib/ng-zenduit.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/ng-zenduit.mjs +348 -147
- package/fesm2015/ng-zenduit.mjs.map +1 -1
- package/fesm2020/ng-zenduit.mjs +336 -140
- package/fesm2020/ng-zenduit.mjs.map +1 -1
- package/lib/filter/zendu-filter.component.d.ts +0 -10
- package/lib/groups/zendu-groups.component.d.ts +45 -0
- package/lib/ng-zenduit.module.d.ts +32 -31
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -10,10 +10,11 @@ import * as i3 from "../checkbox/zendu-checkbox.component";
|
|
|
10
10
|
import * as i4 from "../toggle-slide/zendu-toggle-slide.component";
|
|
11
11
|
import * as i5 from "../search-box/zendu-search-box.component";
|
|
12
12
|
import * as i6 from "../datepicker/zendu-datepicker.component";
|
|
13
|
-
import * as i7 from "../
|
|
14
|
-
import * as i8 from "../
|
|
15
|
-
import * as i9 from "../
|
|
16
|
-
import * as i10 from "
|
|
13
|
+
import * as i7 from "../groups/zendu-groups.component";
|
|
14
|
+
import * as i8 from "../radio-button/radio-button.component";
|
|
15
|
+
import * as i9 from "../icon/zendu-icon.component";
|
|
16
|
+
import * as i10 from "../spinner/zendu-spinner.component";
|
|
17
|
+
import * as i11 from "@ngx-translate/core";
|
|
17
18
|
export class ZenduFilterComponent {
|
|
18
19
|
constructor(renderer) {
|
|
19
20
|
this.renderer = renderer;
|
|
@@ -35,8 +36,6 @@ export class ZenduFilterComponent {
|
|
|
35
36
|
this.errorMessage = [];
|
|
36
37
|
this.datepickerPosition = DATEPICKER_POSITION;
|
|
37
38
|
this.selectedDateRangeOptions = {};
|
|
38
|
-
this._treeMap = new Map();
|
|
39
|
-
this._childCountCache = new Map();
|
|
40
39
|
}
|
|
41
40
|
ngOnChanges(changes) {
|
|
42
41
|
if (changes.config && changes.config.currentValue) {
|
|
@@ -46,7 +45,6 @@ export class ZenduFilterComponent {
|
|
|
46
45
|
item.dataSource = item.dataSource
|
|
47
46
|
? this.extractUniqueDataSource(item.dataSource)
|
|
48
47
|
: [];
|
|
49
|
-
this.buildTreeLevels(item);
|
|
50
48
|
}
|
|
51
49
|
else if (item.type === 'dateRange' && !item.dateRange) {
|
|
52
50
|
item.dateRange = { start: null, end: null };
|
|
@@ -220,6 +218,11 @@ export class ZenduFilterComponent {
|
|
|
220
218
|
else {
|
|
221
219
|
const isTree = this.hasTreeData(configItem);
|
|
222
220
|
if (isTree && this.searchText) {
|
|
221
|
+
// Build a local lookup map for ancestor traversal
|
|
222
|
+
const localMap = new Map();
|
|
223
|
+
for (const el of configItem.dataSource) {
|
|
224
|
+
localMap.set(el.id, el);
|
|
225
|
+
}
|
|
223
226
|
// For tree data, include matching items and their ancestors
|
|
224
227
|
const matchingIds = new Set();
|
|
225
228
|
for (const el of configItem.dataSource) {
|
|
@@ -230,7 +233,7 @@ export class ZenduFilterComponent {
|
|
|
230
233
|
let current = el;
|
|
231
234
|
while (current.parentId) {
|
|
232
235
|
matchingIds.add(current.parentId);
|
|
233
|
-
current =
|
|
236
|
+
current = localMap.get(current.parentId);
|
|
234
237
|
if (!current)
|
|
235
238
|
break;
|
|
236
239
|
}
|
|
@@ -243,7 +246,7 @@ export class ZenduFilterComponent {
|
|
|
243
246
|
el.isOpen = true;
|
|
244
247
|
}
|
|
245
248
|
}
|
|
246
|
-
configItem.filteredDataSource = this.sortTreeOrder(configItem.filteredDataSource);
|
|
249
|
+
configItem.filteredDataSource = this.sortTreeOrder(configItem.filteredDataSource, localMap);
|
|
247
250
|
}
|
|
248
251
|
else {
|
|
249
252
|
configItem.filteredDataSource = configItem.dataSource.filter((el) => {
|
|
@@ -253,7 +256,11 @@ export class ZenduFilterComponent {
|
|
|
253
256
|
.includes(this.searchText.toLowerCase());
|
|
254
257
|
});
|
|
255
258
|
if (isTree) {
|
|
256
|
-
|
|
259
|
+
const localMap = new Map();
|
|
260
|
+
for (const el of configItem.dataSource) {
|
|
261
|
+
localMap.set(el.id, el);
|
|
262
|
+
}
|
|
263
|
+
configItem.filteredDataSource = this.sortTreeOrder(configItem.filteredDataSource, localMap);
|
|
257
264
|
}
|
|
258
265
|
}
|
|
259
266
|
if (configItem.filteredDataSource.length) {
|
|
@@ -516,27 +523,7 @@ export class ZenduFilterComponent {
|
|
|
516
523
|
// keep only checked
|
|
517
524
|
configItem.dataSource = configItem.dataSource.filter((d) => d.checked);
|
|
518
525
|
}
|
|
519
|
-
|
|
520
|
-
// Cascade to children
|
|
521
|
-
this.cascadeToChildren(item, configItem);
|
|
522
|
-
// Update parent checked state (after full cascade is complete)
|
|
523
|
-
this.updateParentCheckedState(item);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
cascadeToChildren(item, configItem) {
|
|
527
|
-
if (!item.children?.length)
|
|
528
|
-
return;
|
|
529
|
-
configItem.dataSource.forEach((data) => {
|
|
530
|
-
if (item.id == data.id) {
|
|
531
|
-
return;
|
|
532
|
-
}
|
|
533
|
-
if (item.children.includes(data.id)) {
|
|
534
|
-
data.checked = item.checked;
|
|
535
|
-
if (data.children?.length) {
|
|
536
|
-
this.cascadeToChildren(data, configItem);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
});
|
|
526
|
+
// For tree items, zen-groups handles cascade internally
|
|
540
527
|
}
|
|
541
528
|
toggle() {
|
|
542
529
|
this.isVisible = !this.isVisible;
|
|
@@ -691,64 +678,7 @@ export class ZenduFilterComponent {
|
|
|
691
678
|
},
|
|
692
679
|
];
|
|
693
680
|
}
|
|
694
|
-
|
|
695
|
-
if (!configItem.dataSource?.length)
|
|
696
|
-
return;
|
|
697
|
-
const hasChildren = configItem.dataSource.some(d => d.children?.length > 0);
|
|
698
|
-
if (!hasChildren)
|
|
699
|
-
return;
|
|
700
|
-
// Build lookup map
|
|
701
|
-
const map = new Map();
|
|
702
|
-
for (const item of configItem.dataSource) {
|
|
703
|
-
map.set(item.id, item);
|
|
704
|
-
}
|
|
705
|
-
this._treeMap = map;
|
|
706
|
-
// Build parentId from children arrays (first parent wins for shared children)
|
|
707
|
-
for (const item of configItem.dataSource) {
|
|
708
|
-
if (item.children?.length) {
|
|
709
|
-
for (const childId of item.children) {
|
|
710
|
-
const child = map.get(childId);
|
|
711
|
-
if (child && child.parentId == null) {
|
|
712
|
-
child.parentId = item.id;
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
// Compute levels by walking up parentId chain
|
|
718
|
-
for (const item of configItem.dataSource) {
|
|
719
|
-
let level = 0;
|
|
720
|
-
let current = item;
|
|
721
|
-
while (current.parentId != null) {
|
|
722
|
-
level++;
|
|
723
|
-
const parent = map.get(current.parentId);
|
|
724
|
-
if (!parent)
|
|
725
|
-
break;
|
|
726
|
-
current = parent;
|
|
727
|
-
}
|
|
728
|
-
item.level = level;
|
|
729
|
-
}
|
|
730
|
-
// Cache child counts
|
|
731
|
-
this._childCountCache.clear();
|
|
732
|
-
const countChildren = (item) => {
|
|
733
|
-
if (!item.children?.length)
|
|
734
|
-
return 0;
|
|
735
|
-
let count = 0;
|
|
736
|
-
for (const childId of item.children) {
|
|
737
|
-
const child = map.get(childId);
|
|
738
|
-
if (child) {
|
|
739
|
-
const childLeaves = countChildren(child);
|
|
740
|
-
count += childLeaves > 0 ? childLeaves : 1;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
return count;
|
|
744
|
-
};
|
|
745
|
-
for (const item of configItem.dataSource) {
|
|
746
|
-
if (item.children?.length) {
|
|
747
|
-
this._childCountCache.set(item.id, countChildren(item));
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
sortTreeOrder(items) {
|
|
681
|
+
sortTreeOrder(items, treeMap) {
|
|
752
682
|
const itemSet = new Set(items.map(i => i.id));
|
|
753
683
|
const visited = new Set();
|
|
754
684
|
const ordered = [];
|
|
@@ -761,20 +691,18 @@ export class ZenduFilterComponent {
|
|
|
761
691
|
ordered.push(item);
|
|
762
692
|
if (item.children?.length) {
|
|
763
693
|
for (const childId of item.children) {
|
|
764
|
-
const child =
|
|
694
|
+
const child = treeMap.get(childId);
|
|
765
695
|
if (child) {
|
|
766
696
|
visit(child);
|
|
767
697
|
}
|
|
768
698
|
}
|
|
769
699
|
}
|
|
770
700
|
};
|
|
771
|
-
// Visit roots first, preserving original order
|
|
772
701
|
for (const item of items) {
|
|
773
702
|
if (item.parentId == null) {
|
|
774
703
|
visit(item);
|
|
775
704
|
}
|
|
776
705
|
}
|
|
777
|
-
// Add any remaining items
|
|
778
706
|
for (const item of items) {
|
|
779
707
|
if (!visited.has(item.id)) {
|
|
780
708
|
ordered.push(item);
|
|
@@ -782,55 +710,6 @@ export class ZenduFilterComponent {
|
|
|
782
710
|
}
|
|
783
711
|
return ordered;
|
|
784
712
|
}
|
|
785
|
-
isTreeItemVisible(dsItem) {
|
|
786
|
-
if (dsItem.parentId == null) {
|
|
787
|
-
return true;
|
|
788
|
-
}
|
|
789
|
-
const parent = this._treeMap.get(dsItem.parentId);
|
|
790
|
-
if (!parent) {
|
|
791
|
-
return true;
|
|
792
|
-
}
|
|
793
|
-
return parent.isOpen && this.isTreeItemVisible(parent);
|
|
794
|
-
}
|
|
795
|
-
toggleTreeNode(dsItem) {
|
|
796
|
-
dsItem.isOpen = !dsItem.isOpen;
|
|
797
|
-
}
|
|
798
|
-
getChildCount(dsItem) {
|
|
799
|
-
return this._childCountCache.get(dsItem.id) || 0;
|
|
800
|
-
}
|
|
801
|
-
isTreeItemIndeterminate(dsItem) {
|
|
802
|
-
if (!dsItem.children?.length)
|
|
803
|
-
return false;
|
|
804
|
-
const allDescendants = this.getAllDescendants(dsItem);
|
|
805
|
-
if (!allDescendants.length)
|
|
806
|
-
return false;
|
|
807
|
-
const checkedCount = allDescendants.filter(d => d.checked).length;
|
|
808
|
-
return checkedCount > 0 && checkedCount < allDescendants.length;
|
|
809
|
-
}
|
|
810
|
-
getAllDescendants(dsItem) {
|
|
811
|
-
const result = [];
|
|
812
|
-
if (!dsItem.children?.length)
|
|
813
|
-
return result;
|
|
814
|
-
for (const childId of dsItem.children) {
|
|
815
|
-
const child = this._treeMap.get(childId);
|
|
816
|
-
if (child) {
|
|
817
|
-
result.push(child);
|
|
818
|
-
result.push(...this.getAllDescendants(child));
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
return result;
|
|
822
|
-
}
|
|
823
|
-
updateParentCheckedState(dsItem) {
|
|
824
|
-
if (dsItem.parentId == null)
|
|
825
|
-
return;
|
|
826
|
-
const parent = this._treeMap.get(dsItem.parentId);
|
|
827
|
-
if (!parent || !parent.children?.length)
|
|
828
|
-
return;
|
|
829
|
-
const allDescendants = this.getAllDescendants(parent);
|
|
830
|
-
const allChecked = allDescendants.every(d => d.checked);
|
|
831
|
-
parent.checked = allChecked;
|
|
832
|
-
this.updateParentCheckedState(parent);
|
|
833
|
-
}
|
|
834
713
|
hasTreeData(configItem) {
|
|
835
714
|
return configItem.dataSource?.some(d => d.children?.length > 0) || false;
|
|
836
715
|
}
|
|
@@ -860,10 +739,10 @@ export class ZenduFilterComponent {
|
|
|
860
739
|
}
|
|
861
740
|
}
|
|
862
741
|
ZenduFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
863
|
-
ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label", showOptions: "showOptions", customOptions: "customOptions", wrapperBodyClass: "wrapperBodyClass", customPosition: "customPosition" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <button (click)=\"toggle()\"\n class=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <ng-container *ngIf=\"!item.isLazyLoading && hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <ng-container *ngFor=\"let dsItem of item.filteredDataSource\">\n <div *ngIf=\"isTreeItemVisible(dsItem)\"\n class=\"action-item-checkbox ds-item tree-item\"\n [style.padding-left.px]=\"48 + (dsItem.level || 0) * 24\">\n <div class=\"tree-item-row\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [indeterminate]=\"isTreeItemIndeterminate(dsItem)\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.name?.toString() | translate\"></zen-checkbox>\n <span *ngIf=\"dsItem.children?.length\"\n class=\"tree-item-badge\">{{ getChildCount(dsItem) }}</span>\n </div>\n <button *ngIf=\"dsItem.children?.length\"\n class=\"tree-item-toggle\"\n (click)=\"toggleTreeNode(dsItem)\">\n <i class=\"material-icons tree-toggle-icon\"\n [class.open]=\"dsItem.isOpen\">expand_more</i>\n </button>\n </div>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .menu-content .items-wrapper .tree-item{display:flex;align-items:center;justify-content:space-between}.filters-component .menu-content .items-wrapper .tree-item .tree-item-row{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.filters-component .menu-content .items-wrapper .tree-item .tree-item-badge{background:#f1f7fe;color:#105494;font-size:12px;font-weight:500;line-height:18px;padding:2px 8px;border-radius:16px;white-space:nowrap}.filters-component .menu-content .items-wrapper .tree-item .tree-item-toggle{background:none;border:none;padding:0;cursor:pointer;font-family:inherit;display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0}.filters-component .menu-content .items-wrapper .tree-item .tree-item-toggle .tree-toggle-icon{font-size:20px;color:#667085;transition:transform .2s;transform:rotate(-90deg)}.filters-component .menu-content .items-wrapper .tree-item .tree-item-toggle .tree-toggle-icon.open{transform:rotate(0)}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "disabled", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showSeconds", "showDate", "parentContainer", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition", "dispalyOverParent"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl"], outputs: ["radioChange"] }, { kind: "component", type: i8.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "component", type: i9.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] });
|
|
742
|
+
ZenduFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduFilterComponent, selector: "zen-filter", inputs: { config: "config", filter: "filter", position: "position", resetBehavior: "resetBehavior", isVisible: "isVisible", customTrigger: "customTrigger", imageUrl: "imageUrl", label: "label", showOptions: "showOptions", customOptions: "customOptions", wrapperBodyClass: "wrapperBodyClass", customPosition: "customPosition" }, outputs: { filterChange: "filterChange", isVisibleChange: "isVisibleChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:resize": "windowSizeHandling($event)", "window:scroll": "windowScroll($event)", "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "searchBox", first: true, predicate: ["searchBox"], descendants: true }, { propertyName: "_componentElement", first: true, predicate: ["mainComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <button (click)=\"toggle()\"\n class=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduToggleSlideComponent, selector: "zen-toggle-slide", inputs: ["enabled", "disabled"], outputs: ["enabledChange"] }, { kind: "component", type: i5.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "disabled", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i6.ZenduDatepickerComponent, selector: "zen-datepicker", inputs: ["date", "showTime", "showSeconds", "showDate", "parentContainer", "containerClass", "minDate", "maxDate", "boxDesign", "highlightDays", "autoConfirm", "hint", "highlightError", "disabled", "readonly", "xPosition", "yPosition", "dispalyOverParent"], outputs: ["dateChange"] }, { kind: "component", type: i7.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i8.ZenduRadioButtonComponent, selector: "zen-radio", inputs: ["selected", "label", "value", "name", "disabled", "imageUrl"], outputs: ["radioChange"] }, { kind: "component", type: i9.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "component", type: i10.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] });
|
|
864
743
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduFilterComponent, decorators: [{
|
|
865
744
|
type: Component,
|
|
866
|
-
args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <button (click)=\"toggle()\"\n class=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <ng-container *ngIf=\"!item.isLazyLoading && hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <ng-container *ngFor=\"let dsItem of item.filteredDataSource\">\n <div *ngIf=\"isTreeItemVisible(dsItem)\"\n class=\"action-item-checkbox ds-item tree-item\"\n [style.padding-left.px]=\"48 + (dsItem.level || 0) * 24\">\n <div class=\"tree-item-row\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [indeterminate]=\"isTreeItemIndeterminate(dsItem)\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.name?.toString() | translate\"></zen-checkbox>\n <span *ngIf=\"dsItem.children?.length\"\n class=\"tree-item-badge\">{{ getChildCount(dsItem) }}</span>\n </div>\n <button *ngIf=\"dsItem.children?.length\"\n class=\"tree-item-toggle\"\n (click)=\"toggleTreeNode(dsItem)\">\n <i class=\"material-icons tree-toggle-icon\"\n [class.open]=\"dsItem.isOpen\">expand_more</i>\n </button>\n </div>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .menu-content .items-wrapper .tree-item{display:flex;align-items:center;justify-content:space-between}.filters-component .menu-content .items-wrapper .tree-item .tree-item-row{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.filters-component .menu-content .items-wrapper .tree-item .tree-item-badge{background:#f1f7fe;color:#105494;font-size:12px;font-weight:500;line-height:18px;padding:2px 8px;border-radius:16px;white-space:nowrap}.filters-component .menu-content .items-wrapper .tree-item .tree-item-toggle{background:none;border:none;padding:0;cursor:pointer;font-family:inherit;display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0}.filters-component .menu-content .items-wrapper .tree-item .tree-item-toggle .tree-toggle-icon{font-size:20px;color:#667085;transition:transform .2s;transform:rotate(-90deg)}.filters-component .menu-content .items-wrapper .tree-item .tree-item-toggle .tree-toggle-icon.open{transform:rotate(0)}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"] }]
|
|
745
|
+
args: [{ selector: 'zen-filter', template: "<div class=\"filters-component\"\n #mainComponent\n click-out=\"isVisible && hide()\">\n\n <ng-container *ngIf=\"!customTrigger\">\n <button (click)=\"toggle()\"\n class=\"button-stroked filter {{isApplied ? 'applied' : ''}}\">\n <zen-icon [src]=\"imageUrl\"\n *ngIf=\"imageUrl\"></zen-icon>\n <i class=\"filter-icon material-icons\"\n *ngIf=\"!imageUrl\">filter_list</i>\n <span *ngIf=\"label\">{{ label | translate }}</span>\n </button>\n </ng-container>\n\n <ng-content *ngIf=\"customTrigger\"></ng-content>\n\n <div [hidden]=\"!isVisible\"\n class=\"action-menu menu-content\"\n [class.customTrigger]=\"customTrigger\"\n [ngStyle]=\"{ 'left': menuLeft, 'right': menuRight, 'top': menuTop, 'bottom': menuBottom }\">\n <div class=\"action-menu-header\">\n <zen-search-box [(text)]=\"searchText\"\n #searchBox\n (textChange)=\"searchTextChanged()\"></zen-search-box>\n </div>\n\n <div class=\"action-menu-body items-wrapper\"\n ngClass=\"{{wrapperBodyClass}}\">\n <ng-container *ngIf=\"errorMessage.length\">\n <li *ngFor=\"let item of errorMessage\"\n class=\"error-msg\">{{item | translate }}</li>\n </ng-container>\n\n <div *ngFor=\"let item of config.items\">\n <div class=\"menu-item\"\n *ngIf=\"isMenuIsVisible(item)\">\n\n <!-- Divider between two filter -->\n <div *ngIf=\"item.type === 'divider'\">\n <p class=\"filter-divider\"></p>\n </div>\n\n <!-- Boolean toggle -->\n <div *ngIf=\"item.type === 'toggle'\"\n class=\"action-item toggle-row\">\n <div>{{item.title | translate}}</div>\n <zen-toggle-slide [(enabled)]=\"item.enabled\"></zen-toggle-slide>\n </div>\n\n <button class=\"action-item expander-item\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && !item.disableCollapse\"\n (click)=\"toggleItem(item)\">\n <span class=\"expander-title\">{{item.title | translate}}</span>\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': item.expanded}\">expand_more</i>\n </button>\n\n <div class=\"action-item section-title\"\n *ngIf=\"item.type != 'toggle' && item.type != 'divider' && item.disableCollapse\">\n {{item.title | translate}}\n </div>\n\n <ng-container *ngIf=\"item.expanded || item.disableCollapse\">\n <div [ngSwitch]=\"item.type\">\n <!-- Multiselect -->\n <div *ngSwitchCase=\"'multiselect'\">\n <!-- Lazy loading mode -->\n <ng-container *ngIf=\"item.isLazyLoading\">\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n <div *ngIf=\"item.canLoadMore && !item.isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(item, false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"item.isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isLazyLoading && !hasTreeData(item)\">\n <div class=\"action-item-checkbox ds-item select-all\" *ngIf=\"!item.hideSelectAll\">\n <zen-checkbox *ngIf=\"item.dataSource.length === item.filteredDataSource.length\"\n [(checked)]=\"item.isSelectedAll\"\n [indeterminate]=\"isItemActive(item) && !item.isSelectedAll\"\n [label]=\"'Select All' | translate\"\n (checkedChange)=\"onSelectAll(item)\">\n </zen-checkbox>\n </div>\n\n <div *ngFor=\"let dsItem of item.filteredDataSource\"\n class=\"action-item-checkbox ds-item\"\n [class.has-badge]=\"dsItem.badgeBgColor\">\n <zen-checkbox [(checked)]=\"dsItem.checked\"\n [imageUrl]=\"dsItem.imageUrl\"\n (checkedChange)=\"checkChanged(dsItem, item)\"\n [label]=\"dsItem.badgeBgColor ? '' : (dsItem.name?.toString() | translate)\"></zen-checkbox>\n <span *ngIf=\"dsItem.badgeBgColor\"\n class=\"filter-item-badge\"\n [ngStyle]=\"{'background': dsItem.badgeBgColor, 'color': dsItem.badgeColor}\">\n {{ dsItem.name?.toString() | translate }}\n </span>\n </div>\n </ng-container>\n\n <!-- Tree view mode -->\n <zen-groups *ngIf=\"!item.isLazyLoading && hasTreeData(item)\"\n [dataSource]=\"item.dataSource\"\n [filteredDataSource]=\"item.filteredDataSource\"\n [hideSelectAll]=\"item.hideSelectAll\"\n [inline]=\"true\"\n [hideSearch]=\"true\"\n [(isSelectedAll)]=\"item.isSelectedAll\"\n (checkedChange)=\"checkChanged($event, item)\">\n </zen-groups>\n </div>\n\n <!-- Date range picker -->\n <div *ngSwitchCase=\"'dateRange'\">\n <!-- Options date range view -->\n <ng-container *ngIf=\"item.dateRangeOptions?.length\">\n <ng-container *ngFor=\"let option of item.dateRangeOptions\">\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.name\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === option.name\"\n (radioChange)=\"handleDateRangeOptionClick(item, option)\"></zen-radio>\n </div>\n </ng-container>\n <div class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"'Custom'\"\n [label]=\"'Custom' | translate\"\n [name]=\"item.key\"\n [selected]=\"selectedDateRangeOptions[item.key] === 'Custom'\"\n (radioChange)=\"handleCustomDateRangeClick(item)\"></zen-radio>\n </div>\n <ng-container *ngIf=\"selectedDateRangeOptions[item.key] === 'Custom'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Default date range view -->\n <ng-container *ngIf=\"!item.dateRangeOptions?.length\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'From' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.start\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'To' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.dateRange.end\"\n [showTime]=\"item.showTime\"\n [yPosition]=\"item.config?.yPosition ?? datepickerPosition.AUTO\"\n (dateChange)=\"handleEndDateChange(item)\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </ng-container>\n </div>\n\n <!-- Date picker -->\n <div *ngSwitchCase=\"'date'\">\n <div class=\"ds-item filter-row\">\n <div class=\"lbl\">{{'Date' | translate}}:</div>\n <zen-datepicker class=\"width-full\"\n [(date)]=\"item.date\"\n [showTime]=\"item.showTime\"\n [parentContainer]=\"mainComponent\">\n </zen-datepicker>\n </div>\n </div>\n\n <!-- Number range -->\n <div *ngSwitchCase=\"'numberRange'\"\n class=\"filter-row number-range-row\">\n <div>\n <div class=\"lbl\">{{'Min' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.from\"\n type=\"number\" />\n </div>\n <div>\n <div class=\"lbl\">{{'Max' | translate}}:</div>\n <input class=\"material-input\"\n [(ngModel)]=\"item.numberRange.to\"\n type=\"number\" />\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngSwitchCase=\"'radio'\">\n <div *ngFor=\"let option of item.radioOptions\"\n class=\"action-item-radio ds-item\">\n <zen-radio [value]=\"option.id\"\n [label]=\"option.name | translate\"\n [name]=\"item.key\"\n [imageUrl]=\"option.imageUrl\"\n [selected]=\"option.selected\"\n (radioChange)=\"radioChanged($event, item)\"\n [disabled]=\"option.disabled\"></zen-radio>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <span *ngIf=\"showNoFilterResult\"\n class=\"no-item\">{{'No Results Found' | translate}}..</span>\n </div>\n\n <div class=\"action-menu-footer filter-footer\">\n <span class=\"selected-count\" *ngIf=\"hasMultiselectItems\">{{ selectedCount }} {{'Selected' | translate}}</span>\n <div class=\"filter-footer-actions\">\n <button (click)=\"reset()\"\n class=\"filter-btn-clear\"\n [class.has-selection]=\"selectedCount > 0 && hasMultiselectItems\">\n {{'Clear Filter' | translate}}\n </button>\n <button (click)=\"apply()\"\n class=\"filter-btn-apply\">\n {{'Apply' | translate}}\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".filters-component{display:inline-block;position:relative}.filters-component .filter{color:#828282;position:relative;border-color:#ececed;padding:0 7px;height:38px}.filters-component .filter zen-icon{background:#828282}.filters-component .filter.applied{color:var(--color-primary, #2188d9);background:#f4f9fd;border:1px solid var(--color-primary, #2188d9)}.filters-component .filter.applied zen-icon{background:var(--color-primary, #2188d9)}.filters-component .filter .dot{background:var(--color-primary, #2188d9);width:4px;height:4px;position:absolute;border-radius:50%;left:42px;top:9px}.filters-component .menu-content{width:360px;white-space:initial;position:fixed}.filters-component .menu-content.absolute{position:absolute;inset:auto}.filters-component .menu-content.dropdown-left{right:0}.filters-component .menu-content.dropdown-right{left:0}.filters-component .menu-content.dropdown-top{bottom:100%;margin-bottom:8px}.filters-component .menu-content.dropdown-bottom{top:100%;margin-top:8px}.filters-component .menu-content.customTrigger{top:30px}.filters-component .menu-content .items-wrapper{overflow-y:auto;max-height:calc(100vh - 407px);position:relative;padding:8px 0}.filters-component .menu-content .items-wrapper .action-item,.filters-component .menu-content .items-wrapper .action-item-checkbox,.filters-component .menu-content .items-wrapper .action-item-radio{font-weight:500;font-size:14px;line-height:20px;color:#344054;padding:0 24px}.filters-component .menu-content .items-wrapper .action-item:hover,.filters-component .menu-content .items-wrapper .action-item-checkbox:hover,.filters-component .menu-content .items-wrapper .action-item-radio:hover{background:transparent}.filters-component .menu-content .items-wrapper .expander-item{outline:none;border:none;display:flex;width:100%;justify-content:space-between;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#344054;background:transparent;padding:12px 24px}.filters-component .menu-content .items-wrapper .expander-item .expander-title{flex:1;text-align:left}.filters-component .menu-content .items-wrapper .expander-item.expanded,.filters-component .menu-content .items-wrapper .expander-item.active{background:transparent;color:#344054}.filters-component .menu-content .items-wrapper .expander-item:hover{background:transparent}.filters-component .menu-content .items-wrapper .expand-icon{transition:.3s;font-size:20px;color:#667085}.filters-component .menu-content .items-wrapper .expand-icon.active{transform:rotate(180deg)}.filters-component .menu-content .items-wrapper .ds-item{padding-left:32px}.filters-component .menu-content .items-wrapper .no-item,.filters-component .menu-content .items-wrapper .error-msg{color:#dc3e33;display:flex;flex-direction:row;align-items:center;padding:10px 24px;font-weight:400;font-size:14px}.filters-component .menu-content .items-wrapper .select-all{font-weight:500}.filters-component .menu-content .items-wrapper .filter-row{padding:0 24px}.filters-component .menu-content .items-wrapper .filter-row:not(:last-of-type){margin-bottom:20px}.filters-component .menu-content .items-wrapper .filter-row .lbl{color:#344054;font-size:14px;font-weight:500;margin-bottom:8px}.filters-component .menu-content .items-wrapper .filter-row:focus-within .lbl{color:var(--color-primary, #2188d9)}.filters-component .menu-content .items-wrapper .number-range-row{display:flex;margin-left:32px;gap:16px;margin-bottom:10px}.filters-component .menu-content .items-wrapper .toggle-row{justify-content:space-between}.filters-component .filter-footer{justify-content:space-between;padding:16px 24px;border-top:1px solid #eaecf0}.filters-component .filter-footer .selected-count{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.filters-component .filter-footer .filter-footer-actions{display:flex;gap:12px}.filters-component .filter-footer .filter-btn-clear{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:#ffffff;border:1px solid #eaecf0;box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#d0d5dd;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-clear:hover{background:#f9fafb;color:#98a2b3}.filters-component .filter-footer .filter-btn-clear.has-selection{border-color:#fda29b;color:#b42318}.filters-component .filter-footer .filter-btn-clear.has-selection:hover{background:#fef3f2;color:#912018}.filters-component .filter-footer .filter-btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;border-radius:8px;background:var(--color-primary, #2188d9);border:1px solid var(--color-primary, #2188d9);box-shadow:0 1px 2px #1018280d;font-family:inherit;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer;white-space:nowrap}.filters-component .filter-footer .filter-btn-apply:hover{background:var(--color-blue-shade-1, #0d74c5);border-color:var(--color-blue-shade-1, #0d74c5)}.filters-component .section-title{font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:default;padding:12px 24px}.filters-component .section-title:hover{background:transparent}.filters-component .has-badge zen-checkbox{width:auto}.filters-component .filter-item-badge{font-weight:500;font-size:14px;line-height:20px;padding:2px 10px;border-radius:16px;white-space:nowrap}.filters-component .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hidden{display:none}:host ::ng-deep zen-radio label{margin:0}\n"] }]
|
|
867
746
|
}], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { config: [{
|
|
868
747
|
type: Input
|
|
869
748
|
}], filter: [{
|
|
@@ -911,4 +790,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
911
790
|
type: HostListener,
|
|
912
791
|
args: ['window:keydown', ['$event']]
|
|
913
792
|
}] } });
|
|
914
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQVMvRCxNQUFNLE9BQU8sb0JBQW9CO0lBeUQvQixZQUFtQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBeEQ3QixXQUFNLEdBQWtCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBSXRDLGFBQVEsR0FBRyxPQUFPLENBQUM7UUFFbkIsa0JBQWEsR0FBd0IsT0FBTyxDQUFDO1FBRTVDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUzQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUUvQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQVl0QixtQkFBYyxHQUF5QixPQUFPLENBQUM7UUFFakQsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVoQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLHNCQUFpQixHQUFR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QUM7Z0JBdUI1QyxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVV6QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVV6QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaWx0ZXJzQ29uZmlnLFxuICBGaWx0ZXJzQ29uZmlnSXRlbSxcbiAgTXVsdGlTZWxlY3RJdGVtLFxufSBmcm9tICcuL2ZpbHRlcnNDb25maWcnO1xuaW1wb3J0IHVuaXFCeSBmcm9tICdsb2Rhc2gudW5pcWJ5JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50L21vbWVudCc7XG5pbXBvcnQgeyBaZW5kdVNlYXJjaEJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1ib3gvemVuZHUtc2VhcmNoLWJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgREFURVBJQ0tFUl9QT1NJVElPTiB9IGZyb20gJy4uL2RhdGVwaWNrZXIvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuL2RhdGVSYW5nZSc7XG5pbXBvcnQgeyBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnemVuLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi96ZW5kdS1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi96ZW5kdS1maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWc6IEZpbHRlcnNDb25maWcgPSB7IGl0ZW1zOiBbXSB9O1xuXG4gIEBJbnB1dCgpIGZpbHRlcjogb2JqZWN0O1xuXG4gIEBJbnB1dCgpIHBvc2l0aW9uID0gJ3JpZ2h0JztcblxuICBASW5wdXQoKSByZXNldEJlaGF2aW9yOiAnc2V0X2FsbCcgfCAnY2xlYXInID0gJ2NsZWFyJztcblxuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG5cbiAgQElucHV0KCkgaXNWaXNpYmxlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGlzVmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBASW5wdXQoKSBjdXN0b21UcmlnZ2VyID0gZmFsc2U7XG5cbiAgQElucHV0KCkgaW1hZ2VVcmw6IHN0cmluZztcblxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHNob3dPcHRpb25zOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIGN1c3RvbU9wdGlvbnM6IHN0cmluZztcblxuICBASW5wdXQoKSB3cmFwcGVyQm9keUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY3VzdG9tUG9zaXRpb246ICdmaXhlZCcgfCAnYWJzb2x1dGUnID0gJ2ZpeGVkJztcblxuICBwdWJsaWMgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIHB1YmxpYyBpc0FwcGxpZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGxhc3RBcHBsaWVkRmlsdGVyOiBhbnkgPSB7fTtcblxuICBwcml2YXRlIHJlc2V0ZWRGaWx0ZXI6IGFueTtcblxuICBwdWJsaWMgbWVudUxlZnQgPSAnMHB4JztcblxuICBwdWJsaWMgbWVudVJpZ2h0ID0gJzBweCc7XG5cbiAgcHVibGljIG1lbnVUb3AgPSAnMHB4JztcblxuICBwdWJsaWMgbWVudUJvdHRvbSA9ICcwcHgnO1xuXG4gIHB1YmxpYyBzaG93Tm9GaWx0ZXJSZXN1bHQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgZGF0ZXBpY2tlclBvc2l0aW9uID0gREFURVBJQ0tFUl9QT1NJVElPTjtcblxuICBwdWJsaWMgc2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoQm94JywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlYXJjaEJveDogWmVuZHVTZWFyY2hCb3hDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnbWFpbkNvbXBvbmVudCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBfY29tcG9uZW50RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5jb25maWcgJiYgY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlKSB7XG4gICAgICAvLyBpbml0IHZhbHVlc1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgICAgICBpdGVtLmRhdGFTb3VyY2UgPSBpdGVtLmRhdGFTb3VyY2VcbiAgICAgICAgICAgID8gdGhpcy5leHRyYWN0VW5pcXVlRGF0YVNvdXJjZShpdGVtLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICAgIHRoaXMuYnVpbGRUcmVlTGV2ZWxzKGl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScgJiYgIWl0ZW0uZGF0ZVJhbmdlKSB7XG4gICAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICAgICAgICAgIC8vIGluaXQgZGF0ZSByYW5nZSBvcHRpb25zXG4gICAgICAgICAgaWYgKGl0ZW0uc2hvd0RhdGVSYW5nZU9wdGlvbnMgJiYgIWl0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtLmRhdGVSYW5nZU9wdGlvbnMgPSB0aGlzLmdldERlZmF1bHREYXRlUmFuZ2VPcHRpb25zKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ251bWJlclJhbmdlJyAmJiAhaXRlbS5udW1iZXJSYW5nZSkge1xuICAgICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5zaG93VGltZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgaXRlbS5zaG93VGltZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuXG4gICAgICB0aGlzLnJlc2V0ZWRGaWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuICAgICAgdGhpcy5maWx0ZXIgPSB0aGlzLmdldEZpbHRlck9iamVjdCgpO1xuICAgICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUodGhpcy5maWx0ZXIpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmZpbHRlciAmJiBjaGFuZ2VzLmZpbHRlci5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKGNoYW5nZXMuZmlsdGVyLmN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIHRoaXMudXBkYXRlQXBwbGllZFN0YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuaXNWaXNpYmxlICYmIGNoYW5nZXMuaXNWaXNpYmxlLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoQm94KCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG91dHNpZGVIYW5kbGluZyhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIC8vIGVsZW1lbnQgbm90IGluIHRoZSBET01cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaGlkZSB0aGUgbWVudSBmb3Igb3V0c2lkZSBjbGlja1xuICAgIHRoaXMuaGlkZSgpO1xuXG4gICAgLy8gcmVzdG9yZSB2YWx1ZXNcbiAgICB0aGlzLnJlc3RvcmVQcmV2aW91c0FwcGxpZWQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICB3aW5kb3dTaXplSGFuZGxpbmcoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KHRoaXMuY3VzdG9tUG9zaXRpb24pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFsnJGV2ZW50J10pXG4gIHdpbmRvd1Njcm9sbCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uV2luZG93S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBldmVudC5rZXkgPT09ICdBcnJvd1VwJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnUGFnZVVwJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnUGFnZURvd24nIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdIb21lJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnRW5kJ1xuICAgICkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAgICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdidXR0b24tc3Ryb2tlZCcpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB0aGlzLnJlc3RvcmVQcmV2aW91c0FwcGxpZWQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9jdXNTZWFyY2hCb3goKSB7XG4gICAgdGhpcy5zZWFyY2hCb3guZG9Gb2N1cygpO1xuICB9XG5cbiAgcHVibGljIGlzTWVudUlzVmlzaWJsZShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSkge1xuICAgIGlmIChpdGVtLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgIGlmIChpdGVtLmlzTG9hZGluZ05vdyB8fCBpdGVtLmNhbkxvYWRNb3JlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlPy5sZW5ndGggPiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uZmlsdGVyZWREYXRhU291cmNlICYmIHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgaWYgKCFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0VW5pcXVlRGF0YVNvdXJjZShcbiAgICBhcnJheToge1xuICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZyB8IG51bWJlcjtcbiAgICB9W11cbiAgKTogTXVsdGlTZWxlY3RJdGVtW10ge1xuICAgIGNvbnN0IGl0ZW1zID0gYXJyYXkuZmlsdGVyKChlbCkgPT4ge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgIHR5cGVvZiBlbC5pZCA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHR5cGVvZiBlbC5pZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgOiBlbC5pZCAmJiB0eXBlb2YgZWwubmFtZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHR5cGVvZiBlbC5uYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA6IGVsLm5hbWVcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgdW5pcUl0ZW1zID0gdW5pcUJ5KGl0ZW1zLCAoZWwpID0+IGVsLmlkKTtcbiAgICAvLyBhZGQgaW5kZXggdG8gZWFjaCB1bmlxSXRlbXNcbiAgICB1bmlxSXRlbXMuZm9yRWFjaChcbiAgICAgIChlbDogTXVsdGlTZWxlY3RJdGVtLCBpbmRleDogbnVtYmVyKSA9PiAoZWwuaW5kZXggPSBpbmRleClcbiAgICApO1xuICAgIHJldHVybiB1bmlxSXRlbXM7XG4gIH1cblxuICBwdWJsaWMgb25TZWxlY3RBbGwoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpdGVtLmRhdGFTb3VyY2UuZm9yRWFjaCgoZCkgPT4gKGQuY2hlY2tlZCA9IGl0ZW0uaXNTZWxlY3RlZEFsbCkpO1xuICB9XG5cbiAgcHVibGljIGlzSXRlbUFjdGl2ZShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSk6IGJvb2xlYW4ge1xuICAgIGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWRJdGVtcyA9IGl0ZW0uZGF0YVNvdXJjZS5maWx0ZXIoKGVsKSA9PiBlbC5jaGVja2VkKTtcbiAgICAgIGl0ZW0uaXNTZWxlY3RlZEFsbCA9IGNoZWNrZWRJdGVtcy5sZW5ndGggPT09IGl0ZW0uZGF0YVNvdXJjZS5sZW5ndGg7XG4gICAgICByZXR1cm4gY2hlY2tlZEl0ZW1zLmxlbmd0aCA+IDA7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBpdGVtLnJhZGlvT3B0aW9ucy5zb21lKChybykgPT4gcm8uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihpdGVtLm51bWJlclJhbmdlLmZyb20gfHwgaXRlbS5udW1iZXJSYW5nZS50byk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihpdGVtLmRhdGVSYW5nZS5zdGFydCB8fCBpdGVtLmRhdGVSYW5nZS5lbmQpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZScpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGl0ZW0uZGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoVGV4dENoYW5nZWQoKSB7XG4gICAgLy8gcnVuIHRoZSBsYXp5IGxvYWRpbmdcbiAgICAvLyB0aGUgZmlsdGVySXRlbXMgY2FsbGVkIGZyb20gb25DaGFuZ2VzLCBzbyBjYWxsIGxhenkgbG9hZGluZyBvbmx5IG9uIHNlYXJjaCBjaGFuZ2VcbiAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKGZhbHNlKTtcblxuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnSXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGNvbmZpZ0l0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgICBjb25maWdJdGVtLmNhbkxvYWRNb3JlID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgcmVxdWVzdHMucHVzaCh0aGlzLmxvYWRNb3JlKGNvbmZpZ0l0ZW0sIHNob3dTZWxlY3RlZE9uVG9wKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWVzdHMpO1xuXG4gICAgLy8gZmlsdGVyIG5vbi1sYXp5IGxvYWRpbmcgaXRlbXNcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckl0ZW1zKCkge1xuICAgIGxldCBoYXNEYXRhID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ0l0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChjb25maWdJdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgICAgaWYgKGNvbmZpZ0l0ZW0uaXNMYXp5TG9hZGluZykge1xuICAgICAgICAgIGlmIChjb25maWdJdGVtLmlzTG9hZGluZ05vdykge1xuICAgICAgICAgICAgLy8gbWFyayBhcyBkYXRhIGF2YWlsYWJsZSBpbiBsb2FkaW5nIHN0YXRlXG4gICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBpc1RyZWUgPSB0aGlzLmhhc1RyZWVEYXRhKGNvbmZpZ0l0ZW0pO1xuICAgICAgICAgIGlmIChpc1RyZWUgJiYgdGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAvLyBGb3IgdHJlZSBkYXRhLCBpbmNsdWRlIG1hdGNoaW5nIGl0ZW1zIGFuZCB0aGVpciBhbmNlc3RvcnNcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZE5hbWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJyA/IGVsLm5hbWUudG9TdHJpbmcoKSA6IGVsLm5hbWU7XG4gICAgICAgICAgICAgIGlmIChwcmVwYXJlZE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0lkcy5hZGQoZWwuaWQpO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhbGwgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBlbDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudC5wYXJlbnRJZCkge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdJZHMuYWRkKGN1cnJlbnQucGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuX3RyZWVNYXAuZ2V0KGN1cnJlbnQucGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gY29uZmlnSXRlbS5kYXRhU291cmNlLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsKSA9PiBtYXRjaGluZ0lkcy5oYXMoZWwuaWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gQXV0by1leHBhbmQgcGFyZW50cyB3aGVuIHNlYXJjaGluZ1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBpZiAoZWwuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVsLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gdGhpcy5zb3J0VHJlZU9yZGVyKGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChlbCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZE5hbWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJyA/IGVsLm5hbWUudG9TdHJpbmcoKSA6IGVsLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBwcmVwYXJlZE5hbWVcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1RyZWUpIHtcbiAgICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSB0aGlzLnNvcnRUcmVlT3JkZXIoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb25maWdJdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgJiZcbiAgICAgICAgICAhQm9vbGVhbihjb25maWdJdGVtLmRhdGVSYW5nZS5zdGFydCB8fCBjb25maWdJdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgJiZcbiAgICAgICAgICAhQm9vbGVhbihjb25maWdJdGVtLm51bWJlclJhbmdlLmZyb20gfHwgY29uZmlnSXRlbS5udW1iZXJSYW5nZS50bylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2hvd05vRmlsdGVyUmVzdWx0ID0gdGhpcy5zZWFyY2hUZXh0ICYmICFoYXNEYXRhO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRNb3JlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtLCBzaG93U2VsZWN0ZWRPblRvcDogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBpdGVtLmlzTG9hZGluZ05vdyA9IHRydWU7XG4gICAgICBpZiAoIWl0ZW0ubGF6eUxvYWRlcikge1xuICAgICAgICB0aHJvdyBgbG9hZGVyIGlzIG5vdCBhdmFpbGFibGVgO1xuICAgICAgfVxuICAgICAgaWYgKCFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2FkIGZpcnN0IDEwIHJlY29yZHMgZm9yIHRoZSB0aGUgZmlyc3QgdGltZVxuICAgICAgY29uc3QgbGltaXQgPSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGggPT0gMCA/IDEwIDogMTAwO1xuICAgICAgY29uc3QgbmV3SXRlbXMgPSBhd2FpdCBpdGVtLmxhenlMb2FkZXIoXG4gICAgICAgIHsgdGV4dDogdGhpcy5zZWFyY2hUZXh0IHx8ICcnIH0sXG4gICAgICAgIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCxcbiAgICAgICAgbGltaXRcbiAgICAgICk7XG5cbiAgICAgIGl0ZW0uY2FuTG9hZE1vcmUgPSBuZXdJdGVtcy5sZW5ndGggPT0gbGltaXQ7XG5cbiAgICAgIC8vIHRoZSBmaWx0ZXJlZERhdGFTb3VyY2UgY29udGFpbnMgdGhlIGl0ZW1zIHRoYXQgaXMgdmlzaWxpYmxlIHRvIHVzZXIgYXQgdGhlIGN1cnJlbnQgbW9tZW50XG4gICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmNvbmNhdChuZXdJdGVtcyk7XG5cbiAgICAgIC8vIHRoZSBkYXRhU291cmNlIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgY29uc3QgY2hlY2tlZElkcyA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpXG4gICAgICAgIC5tYXAoKGkpID0+IGkuaWQpO1xuXG4gICAgICBpZiAoc2hvd1NlbGVjdGVkT25Ub3ApIHtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjaGVja2VkIGl0ZW1zIGZpcnN0XG4gICAgICAgIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UuZmlsdGVyKFxuICAgICAgICAgIChpKSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhpLmlkKVxuICAgICAgICApO1xuICAgICAgICAvLyBhZGQgYWxsIGNoZWNrZWQgaXRlbXMgdG8gdGhlIHRvcFxuICAgICAgICBjb25zdCBjaGVja2VkSXRlbXMgPSBpdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpO1xuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGNoZWNrZWRJdGVtcy5jb25jYXQoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbWFyayBhcyBjaGVja2VkIGJhc2VkIG9uIHRoZSBkYXRhU291cmNlXG4gICAgICAgIGZvciAobGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgIGRzSXRlbS5jaGVja2VkID0gY2hlY2tlZElkcy5pbmNsdWRlcyhkc0l0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGl0ZW0uaXNMb2FkaW5nTm93ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZUl0ZW0oaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpdGVtLmV4cGFuZGVkID0gIWl0ZW0uZXhwYW5kZWQ7XG5cbiAgICBpZiAoaXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCkge1xuICAgICAgICBpZiAoaXRlbS5jYW5Mb2FkTW9yZSAhPT0gZmFsc2UgJiYgIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmxvYWRNb3JlKGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWx0ZXJzKCkge1xuICAgIGxldCBzZWxlY3RBbGwgPSB0aGlzLnJlc2V0QmVoYXZpb3IgPT09ICdzZXRfYWxsJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9ucyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGl0ZW0uaXNTZWxlY3RlZEFsbCA9IHNlbGVjdEFsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGRzSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICBkc0l0ZW0uY2hlY2tlZCA9IHNlbGVjdEFsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5kYXRlUmFuZ2UpIHtcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0ubnVtYmVyUmFuZ2UpIHtcbiAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHsgZnJvbTogbnVsbCwgdG86IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uZGF0ZSkge1xuICAgICAgICBpdGVtLmRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgaXRlbS5lbmFibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5pZCA9PT0gaXRlbS5zZWxlY3RlZFJhZGlvKSB7XG4gICAgICAgICAgICBlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFJdGVtIG9mIGl0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBkYXRhSXRlbS5jaGVja2VkID0gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgPyBzZWxlY3Rpb24uaW5jbHVkZXMoZGF0YUl0ZW0uaWQpXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7XG4gICAgICAgICAgICBzdGFydDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldIHx8IHt9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGl0ZW0uZGF0ZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgaXRlbS5zZWxlY3RlZFJhZGlvID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XG5cbiAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgdGhpcy5yZXNldGVkRmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcblxuICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5KCkge1xuICAgIHRoaXMuZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBjb25zdCBpdGVtRmxhZyA9IHRoaXMub25DaGVja1ZhbGlkaXR5KGl0ZXJhdG9yKTtcbiAgICAgIGlmICghaXRlbUZsYWcpIHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZXJyb3JNZXNzYWdlID0gW10pLCA1MDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUodGhpcy5maWx0ZXIpO1xuXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcik7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGFwcGx5IHN0YXRlXG4gICAgdGhpcy51cGRhdGVBcHBsaWVkU3RhdGUoKTtcblxuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBcHBsaWVkU3RhdGUoKSB7XG4gICAgdGhpcy5pc0FwcGxpZWQgPSBmYWxzZTtcbiAgICAvLyBzaG93aW5nIGNoZWNrZWQgaXRlbXMgb24gdG9wIG9mIHRoZSBsaXN0XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgIC8vIHJlc29ydCBmaXJzdCBiYXNlZCBvbiBpbmRleFxuICAgICAgICBpdGVtLmRhdGFTb3VyY2Uuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICAgIC8vIHRoZW4gc29ydCBiYXNlZCBvbiBjaGVja2VkIGl0ZW1zIGFnYWluXG4gICAgICAgIGl0ZW0uZGF0YVNvdXJjZS5zb3J0KFxuICAgICAgICAgIChhOiBEYXRhU291cmNlLCBiOiBEYXRhU291cmNlKSA9PlxuICAgICAgICAgICAgTnVtYmVyKGIuY2hlY2tlZCB8fCAwKSAtIE51bWJlcihhLmNoZWNrZWQgfHwgMClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLnJlc2V0ZWRGaWx0ZXIpIHtcbiAgICAgICAgLy8gRmlsdGVyIHdhcyByZXNldCwgc28gY29tcGFyZSB0aGUgcmVzZXQgZmlsdGVyIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IGZpbHRlclxuICAgICAgICAvLyBXaGVuIHVzZXIgY2xpY2sgb24gUmVzZXQgYW5kIFRoZW4gQXBwbHksIGZpbHRlciBtdXN0IHVuaGlnaGxpZ2h0ZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucmVzZXRlZEZpbHRlcikgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmlzQXBwbGllZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNBcHBsaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlckNsYXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGlvbi1tZW51LWJvZHknKTtcbiAgICBpZiAodGhpcy53cmFwcGVyQm9keUNsYXNzKSB7XG4gICAgICB3cmFwcGVyQ2xhc3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLndyYXBwZXJCb2R5Q2xhc3N9YCk7XG4gICAgfVxuICAgIGlmICh3cmFwcGVyQ2xhc3MpIHtcbiAgICAgIHdyYXBwZXJDbGFzcy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdhdXRvJyB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZpbHRlck9iamVjdCgpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGFTb3VyY2UgJiYgaXRlbS5kYXRhU291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZElkcyA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAgICAgICAuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpXG4gICAgICAgICAgICAgIC5tYXAoKGkpID0+IGkuaWQpO1xuXG4gICAgICAgICAgICBpZiAoY2hlY2tlZElkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGNoZWNrZWRJZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGVSYW5nZSAmJiBpdGVtLmRhdGVSYW5nZS5zdGFydCAmJiBpdGVtLmRhdGVSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGVSYW5nZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpdGVtLm51bWJlclJhbmdlICYmXG4gICAgICAgICAgICB0eXBlb2YgaXRlbT8ubnVtYmVyUmFuZ2U/LmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgaXRlbT8ubnVtYmVyUmFuZ2U/LnRvID09PSAnbnVtYmVyJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ubnVtYmVyUmFuZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGUpIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ucmFkaW9PcHRpb25zLmZpbmQoKHJvKSA9PiByby5zZWxlY3RlZCk/LmlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcblxuICAgIHRoaXMuaXNWaXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHJhZGlvQ2hhbmdlZCh2YWx1ZTogc3RyaW5nLCBpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSk6IHZvaWQge1xuICAgIGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goKG9wdCkgPT4gKG9wdC5zZWxlY3RlZCA9IG9wdC5pZCA9PT0gdmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0NoYW5nZWQoaXRlbTogRGF0YVNvdXJjZSwgY29uZmlnSXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAvLyBzdG9yZSB0aGUgY2hlY2sgaXRlbXMgaW4gdGhlIGRhdGEgc291cmNlXG4gICAgICBjb25zdCBleGlzdEl0ZW0gPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmluZCgoaSkgPT4gaS5pZCA9PSBpdGVtLmlkKTtcbiAgICAgIGlmIChleGlzdEl0ZW0pIHtcbiAgICAgICAgZXhpc3RJdGVtLmNoZWNrZWQgPSBpdGVtLmNoZWNrZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIC8vIGtlZXAgb25seSBjaGVja2VkXG4gICAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChkKSA9PiBkLmNoZWNrZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXNjYWRlIHRvIGNoaWxkcmVuXG4gICAgICB0aGlzLmNhc2NhZGVUb0NoaWxkcmVuKGl0ZW0sIGNvbmZpZ0l0ZW0pO1xuICAgICAgLy8gVXBkYXRlIHBhcmVudCBjaGVja2VkIHN0YXRlIChhZnRlciBmdWxsIGNhc2NhZGUgaXMgY29tcGxldGUpXG4gICAgICB0aGlzLnVwZGF0ZVBhcmVudENoZWNrZWRTdGF0ZShpdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhc2NhZGVUb0NoaWxkcmVuKGl0ZW06IERhdGFTb3VyY2UsIGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogdm9pZCB7XG4gICAgaWYgKCFpdGVtLmNoaWxkcmVuPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaWQgPT0gZGF0YS5pZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbi5pbmNsdWRlcyg8c3RyaW5nPmRhdGEuaWQpKSB7XG4gICAgICAgIGRhdGEuY2hlY2tlZCA9IGl0ZW0uY2hlY2tlZDtcbiAgICAgICAgaWYgKGRhdGEuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2FzY2FkZVRvQ2hpbGRyZW4oZGF0YSwgY29uZmlnSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XG4gICAgdGhpcy51cGRhdGVQbGFjZW1lbnQodGhpcy5jdXN0b21Qb3NpdGlvbik7XG4gICAgdGhpcy5mb2N1c1NlYXJjaEJveCgpO1xuXG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLnJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNoZWNrVmFsaWRpdHkoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgIHR5cGVvZiBpdGVtLm51bWJlclJhbmdlLnRvID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBpdGVtLm51bWJlclJhbmdlLmZyb20gPiBpdGVtLm51bWJlclJhbmdlLnRvXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBOdW1iZXIgcmFuZ2U6IFRoZSBNaW4gbnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIE1heCBudW1iZXIuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIGl0ZW0uZGF0ZVJhbmdlLmVuZCAmJlxuICAgICAgICBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5zdGFydCkgPiBuZXcgRGF0ZShpdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICBgSW52YWxpZCBEYXRlIHJhbmdlOiBUaGUgU3RhcnQgZGF0ZSBjYW5ub3QgYmUgYWZ0ZXIgdGhlIEVuZCBkYXRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQocG9zOiAnZml4ZWQnIHwgJ2Fic29sdXRlJyA9ICdmaXhlZCcpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGhvc3QucXVlcnlTZWxlY3RvcignLm1lbnUtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID1cbiAgICAgIHBvcyA9PT0gJ2ZpeGVkJ1xuICAgICAgICA/IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IHJlY3QubGVmdDtcbiAgICBjb25zdCByaWdodCA9IHJlY3QucmlnaHQ7XG4gICAgY29uc3QgdG9wID0gcmVjdC50b3A7XG4gICAgY29uc3QgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wO1xuXG4gICAgaWYgKHBvcyA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsICdhYnNvbHV0ZScpO1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShjb250YWluZXIsICdpbnNldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ2Fic29sdXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA9PT0gJ2ZpeGVkJykge1xuICAgICAgaWYgKHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2F1dG8nKSkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsUG9zaXRpb24gPSB0aGlzLmdldEhvcml6b250YWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9XG4gICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uID09PSAnbGVmdCdcbiAgICAgICAgICAgID8gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGBcbiAgICAgICAgICAgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGhvcml6b250YWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IGAke2xlZnR9cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByaWdodH1weGA7XG4gICAgICAgIHRoaXMubWVudUxlZnQgPSAndW5zZXQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgICB0aGlzLm1lbnVSaWdodCA9ICd1bnNldCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdhdXRvJykpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm1lbnVUb3AgPVxuICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb24gPT09ICdib3R0b20nID8gYCR7dG9wICsgNDJ9cHhgIDogJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gdmVydGljYWxQb3NpdGlvbiA9PT0gJ3RvcCcgPyBgJHtib3R0b219cHhgIDogJ3Vuc2V0JztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykpIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5tZW51Qm90dG9tID0gYCR7Ym90dG9tICsgMTB9cHhgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZW51VG9wID0gYCR7dG9wICsgNTV9cHhgO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSAndW5zZXQnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmVydGljYWxDbGFzcyA9ICcnO1xuICAgICAgbGV0IGhvcml6b250YWxDbGFzcyA9ICcnO1xuXG4gICAgICBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYXV0bycpKSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLmdldFZlcnRpY2FsUG9zaXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvcml6b250YWxDbGFzcyA9IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2xlZnQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgIHZlcnRpY2FsQ2xhc3MgPSB0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgICBbXG4gICAgICAgICdkcm9wZG93bi1sZWZ0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXJpZ2h0JyxcbiAgICAgICAgJ2Ryb3Bkb3duLXRvcCcsXG4gICAgICAgICdkcm9wZG93bi1ib3R0b20nLFxuICAgICAgXS5mb3JFYWNoKChjKSA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNvbnRhaW5lciwgYykpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGBkcm9wZG93bi0ke2hvcml6b250YWxDbGFzc31gKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY29udGFpbmVyLCBgZHJvcGRvd24tJHt2ZXJ0aWNhbENsYXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVydGljYWxQb3NpdGlvbigpOiAnYm90dG9tJyB8ICd0b3AnIHtcbiAgICBjb25zdCB0b3AgPVxuICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICByZXR1cm4gdG9wID4gd2luZG93LmlubmVySGVpZ2h0IC8gMiA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIH1cblxuICBwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbigpOiAncmlnaHQnIHwgJ2xlZnQnIHtcbiAgICBjb25zdCBsZWZ0ID1cbiAgICAgIHRoaXMuX2NvbXBvbmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHJldHVybiBsZWZ0ID4gd2luZG93LmlubmVyV2lkdGggLyAyID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0ZVJhbmdlT3B0aW9ucygpOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRhdGVSYW5nZTogRGF0ZVJhbmdlO1xuICB9W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUb2RheScsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdZZXN0ZXJkYXknLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJykuZW5kT2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RoaXMgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCd3ZWVrJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0xhc3QgV2VlaycsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCg3LCAnZGF5cycpLnN0YXJ0T2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJykuZW5kT2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdUaGlzIE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdMYXN0IE1vbnRoJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgZW5kOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyZWVNYXAgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgRGF0YVNvdXJjZT4oKTtcbiAgcHJpdmF0ZSBfY2hpbGRDb3VudENhY2hlID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj4oKTtcblxuICBwcml2YXRlIGJ1aWxkVHJlZUxldmVscyhjb25maWdJdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSk6IHZvaWQge1xuICAgIGlmICghY29uZmlnSXRlbS5kYXRhU291cmNlPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZS5zb21lKGQgPT4gZC5jaGlsZHJlbj8ubGVuZ3RoID4gMCk7XG4gICAgaWYgKCFoYXNDaGlsZHJlbikgcmV0dXJuO1xuXG4gICAgLy8gQnVpbGQgbG9va3VwIG1hcFxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBEYXRhU291cmNlPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgIG1hcC5zZXQoaXRlbS5pZCwgaXRlbSk7XG4gICAgfVxuICAgIHRoaXMuX3RyZWVNYXAgPSBtYXA7XG5cbiAgICAvLyBCdWlsZCBwYXJlbnRJZCBmcm9tIGNoaWxkcmVuIGFycmF5cyAoZmlyc3QgcGFyZW50IHdpbnMgZm9yIHNoYXJlZCBjaGlsZHJlbilcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29uZmlnSXRlbS5kYXRhU291cmNlKSB7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBtYXAuZ2V0KGNoaWxkSWQpO1xuICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5wYXJlbnRJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjaGlsZC5wYXJlbnRJZCA9IGl0ZW0uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBsZXZlbHMgYnkgd2Fsa2luZyB1cCBwYXJlbnRJZCBjaGFpblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgIGxldCBsZXZlbCA9IDA7XG4gICAgICBsZXQgY3VycmVudCA9IGl0ZW07XG4gICAgICB3aGlsZSAoY3VycmVudC5wYXJlbnRJZCAhPSBudWxsKSB7XG4gICAgICAgIGxldmVsKys7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IG1hcC5nZXQoY3VycmVudC5wYXJlbnRJZCk7XG4gICAgICAgIGlmICghcGFyZW50KSBicmVhaztcbiAgICAgICAgY3VycmVudCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGl0ZW0ubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG5cbiAgICAvLyBDYWNoZSBjaGlsZCBjb3VudHNcbiAgICB0aGlzLl9jaGlsZENvdW50Q2FjaGUuY2xlYXIoKTtcbiAgICBjb25zdCBjb3VudENoaWxkcmVuID0gKGl0ZW06IERhdGFTb3VyY2UpOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKCFpdGVtLmNoaWxkcmVuPy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gbWFwLmdldChjaGlsZElkKTtcbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRMZWF2ZXMgPSBjb3VudENoaWxkcmVuKGNoaWxkKTtcbiAgICAgICAgICBjb3VudCArPSBjaGlsZExlYXZlcyA+IDAgPyBjaGlsZExlYXZlcyA6IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fY2hpbGRDb3VudENhY2hlLnNldChpdGVtLmlkLCBjb3VudENoaWxkcmVuKGl0ZW0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgc29ydFRyZWVPcmRlcihpdGVtczogRGF0YVNvdXJjZVtdKTogRGF0YVNvdXJjZVtdIHtcbiAgICBjb25zdCBpdGVtU2V0ID0gbmV3IFNldChpdGVtcy5tYXAoaSA9PiBpLmlkKSk7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgIGNvbnN0IG9yZGVyZWQ6IERhdGFTb3VyY2VbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ID0gKGl0ZW06IERhdGFTb3VyY2UpID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhpdGVtLmlkKSkgcmV0dXJuO1xuICAgICAgaWYgKCFpdGVtU2V0LmhhcyhpdGVtLmlkKSkgcmV0dXJuO1xuICAgICAgdmlzaXRlZC5hZGQoaXRlbS5pZCk7XG4gICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLl90cmVlTWFwLmdldChjaGlsZElkKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZpc2l0KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIFZpc2l0IHJvb3RzIGZpcnN0LCBwcmVzZXJ2aW5nIG9yaWdpbmFsIG9yZGVyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS5wYXJlbnRJZCA9PSBudWxsKSB7XG4gICAgICAgIHZpc2l0KGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBpdGVtc1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhpdGVtLmlkKSkge1xuICAgICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlcmVkO1xuICB9XG5cbiAgcHVibGljIGlzVHJlZUl0ZW1WaXNpYmxlKGRzSXRlbTogRGF0YVNvdXJjZSk6IGJvb2xlYW4ge1xuICAgIGlmIChkc0l0ZW0ucGFyZW50SWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3RyZWVNYXAuZ2V0KGRzSXRlbS5wYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50LmlzT3BlbiAmJiB0aGlzLmlzVHJlZUl0ZW1WaXNpYmxlKHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlVHJlZU5vZGUoZHNJdGVtOiBEYXRhU291cmNlKTogdm9pZCB7XG4gICAgZHNJdGVtLmlzT3BlbiA9ICFkc0l0ZW0uaXNPcGVuO1xuICB9XG5cbiAgcHVibGljIGdldENoaWxkQ291bnQoZHNJdGVtOiBEYXRhU291cmNlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRDb3VudENhY2hlLmdldChkc0l0ZW0uaWQpIHx8IDA7XG4gIH1cblxuICBwdWJsaWMgaXNUcmVlSXRlbUluZGV0ZXJtaW5hdGUoZHNJdGVtOiBEYXRhU291cmNlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkc0l0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFsbERlc2NlbmRhbnRzID0gdGhpcy5nZXRBbGxEZXNjZW5kYW50cyhkc0l0ZW0pO1xuICAgIGlmICghYWxsRGVzY2VuZGFudHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY2hlY2tlZENvdW50ID0gYWxsRGVzY2VuZGFudHMuZmlsdGVyKGQgPT4gZC5jaGVja2VkKS5sZW5ndGg7XG4gICAgcmV0dXJuIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgYWxsRGVzY2VuZGFudHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxEZXNjZW5kYW50cyhkc0l0ZW06IERhdGFTb3VyY2UpOiBEYXRhU291cmNlW10ge1xuICAgIGNvbnN0IHJlc3VsdDogRGF0YVNvdXJjZVtdID0gW107XG4gICAgaWYgKCFkc0l0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2YgZHNJdGVtLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMuX3RyZWVNYXAuZ2V0KGNoaWxkSWQpO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5nZXRBbGxEZXNjZW5kYW50cyhjaGlsZCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXJlbnRDaGVja2VkU3RhdGUoZHNJdGVtOiBEYXRhU291cmNlKTogdm9pZCB7XG4gICAgaWYgKGRzSXRlbS5wYXJlbnRJZCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fdHJlZU1hcC5nZXQoZHNJdGVtLnBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LmNoaWxkcmVuPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBhbGxEZXNjZW5kYW50cyA9IHRoaXMuZ2V0QWxsRGVzY2VuZGFudHMocGFyZW50KTtcbiAgICBjb25zdCBhbGxDaGVja2VkID0gYWxsRGVzY2VuZGFudHMuZXZlcnkoZCA9PiBkLmNoZWNrZWQpO1xuICAgIHBhcmVudC5jaGVja2VkID0gYWxsQ2hlY2tlZDtcbiAgICB0aGlzLnVwZGF0ZVBhcmVudENoZWNrZWRTdGF0ZShwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIGhhc1RyZWVEYXRhKGNvbmZpZ0l0ZW06IEZpbHRlcnNDb25maWdJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZT8uc29tZShkID0+IGQuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHx8IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURhdGVSYW5nZU9wdGlvbkNsaWNrKGl0ZW0sIG9wdGlvbikge1xuICAgIGl0ZW0uZGF0ZVJhbmdlID0gb3B0aW9uLmRhdGVSYW5nZTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPSBvcHRpb24ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXN0b21EYXRlUmFuZ2VDbGljayhpdGVtKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID0gJ0N1c3RvbSc7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5kRGF0ZUNoYW5nZShpdGVtKSB7XG4gICAgaWYgKCFpdGVtLnNob3dUaW1lKSB7XG4gICAgICBpdGVtLmRhdGVSYW5nZS5lbmQgPSBtb21lbnQoaXRlbS5kYXRlUmFuZ2UuZW5kKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBoYXNNdWx0aXNlbGVjdEl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pdGVtcy5zb21lKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBpdGVtLmRhdGFTb3VyY2U/Lmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcgJiYgaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGNvdW50ICs9IGl0ZW0uZGF0YVNvdXJjZS5maWx0ZXIoKGQpID0+IGQuY2hlY2tlZCkubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXJzLWNvbXBvbmVudFwiXG4gICAgICNtYWluQ29tcG9uZW50XG4gICAgIGNsaWNrLW91dD1cImlzVmlzaWJsZSAmJiBoaWRlKClcIj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVHJpZ2dlclwiPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmaWx0ZXIge3tpc0FwcGxpZWQgPyAnYXBwbGllZCcgOiAnJ319XCI+XG4gICAgICAgICAgICA8emVuLWljb24gW3NyY109XCJpbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbWFnZVVybFwiPjwvemVuLWljb24+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZpbHRlci1pY29uIG1hdGVyaWFsLWljb25zXCJcbiAgICAgICAgICAgICAgICpuZ0lmPVwiIWltYWdlVXJsXCI+ZmlsdGVyX2xpc3Q8L2k+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxhYmVsXCI+e3sgbGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjdXN0b21UcmlnZ2VyXCI+PC9uZy1jb250ZW50PlxuXG4gICAgPGRpdiBbaGlkZGVuXT1cIiFpc1Zpc2libGVcIlxuICAgICAgICAgY2xhc3M9XCJhY3Rpb24tbWVudSBtZW51LWNvbnRlbnRcIlxuICAgICAgICAgW2NsYXNzLmN1c3RvbVRyaWdnZXJdPVwiY3VzdG9tVHJpZ2dlclwiXG4gICAgICAgICBbbmdTdHlsZV09XCJ7ICdsZWZ0JzogbWVudUxlZnQsICdyaWdodCc6IG1lbnVSaWdodCwgJ3RvcCc6IG1lbnVUb3AsICdib3R0b20nOiBtZW51Qm90dG9tICB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDx6ZW4tc2VhcmNoLWJveCBbKHRleHQpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZWFyY2hCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGV4dENoYW5nZSk9XCJzZWFyY2hUZXh0Q2hhbmdlZCgpXCI+PC96ZW4tc2VhcmNoLWJveD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWJvZHkgaXRlbXMtd3JhcHBlclwiXG4gICAgICAgICAgICAgbmdDbGFzcz1cInt7d3JhcHBlckJvZHlDbGFzc319XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3JNZXNzYWdlLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBlcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVycm9yLW1zZ1wiPnt7aXRlbSB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25maWcuaXRlbXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNZW51SXNWaXNpYmxlKGl0ZW0pXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXZpZGVyIGJldHdlZW4gdHdvIGZpbHRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RpdmlkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZpbHRlci1kaXZpZGVyXCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gdG9nZ2xlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndG9nZ2xlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbSB0b2dnbGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLXRvZ2dsZS1zbGlkZSBbKGVuYWJsZWQpXT1cIml0ZW0uZW5hYmxlZFwiPjwvemVuLXRvZ2dsZS1zbGlkZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1pdGVtIGV4cGFuZGVyLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlICE9ICd0b2dnbGUnICYmIGl0ZW0udHlwZSAhPSAnZGl2aWRlcicgJiYgIWl0ZW0uZGlzYWJsZUNvbGxhcHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBhbmRlci10aXRsZVwiPnt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBleHBhbmQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGl0ZW0uZXhwYW5kZWR9XCI+ZXhwYW5kX21vcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbSBzZWN0aW9uLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSAhPSAndG9nZ2xlJyAmJiBpdGVtLnR5cGUgIT0gJ2RpdmlkZXInICYmIGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udGl0bGUgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZCB8fCBpdGVtLmRpc2FibGVDb2xsYXBzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiaXRlbS50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbXVsdGlzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGF6eSBsb2FkaW5nIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTGF6eUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYmFkZ2VdPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZHNJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yID8gJycgOiAoZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUpXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pdGVtLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBkc0l0ZW0uYmFkZ2VCZ0NvbG9yLCAnY29sb3InOiBkc0l0ZW0uYmFkZ2VDb2xvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmNhbkxvYWRNb3JlICYmICFpdGVtLmlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZShpdGVtLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0xvYWQgTW9yZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5pc0xvYWRpbmdOb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci1tb3JlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCI+PC96ZW4tc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uaXNMYXp5TG9hZGluZyAmJiAhaGFzVHJlZURhdGEoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtIHNlbGVjdC1hbGxcIiAqbmdJZj1cIiFpdGVtLmhpZGVTZWxlY3RBbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94ICpuZ0lmPVwiaXRlbS5kYXRhU291cmNlLmxlbmd0aCA9PT0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2hlY2tlZCldPVwiaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzSXRlbUFjdGl2ZShpdGVtKSAmJiAhaXRlbS5pc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IEFsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25TZWxlY3RBbGwoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkc0l0ZW0gb2YgaXRlbS5maWx0ZXJlZERhdGFTb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJhZGdlXT1cImRzSXRlbS5iYWRnZUJnQ29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94IFsoY2hlY2tlZCldPVwiZHNJdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cImRzSXRlbS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJjaGVja0NoYW5nZWQoZHNJdGVtLCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZHNJdGVtLmJhZGdlQmdDb2xvciA/ICcnIDogKGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlKVwiPjwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItaXRlbS1iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogZHNJdGVtLmJhZGdlQmdDb2xvciwgJ2NvbG9yJzogZHNJdGVtLmJhZGdlQ29sb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVHJlZSB2aWV3IG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pc0xhenlMb2FkaW5nICYmIGhhc1RyZWVEYXRhKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbSBzZWxlY3QtYWxsXCIgKm5nSWY9XCIhaXRlbS5oaWRlU2VsZWN0QWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1jaGVja2JveCAqbmdJZj1cIml0ZW0uZGF0YVNvdXJjZS5sZW5ndGggPT09IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNoZWNrZWQpXT1cIml0ZW0uaXNTZWxlY3RlZEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJpc0l0ZW1BY3RpdmUoaXRlbSkgJiYgIWl0ZW0uaXNTZWxlY3RlZEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBBbGwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uU2VsZWN0QWxsKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZHNJdGVtIG9mIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzVHJlZUl0ZW1WaXNpYmxlKGRzSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtIHRyZWUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1sZWZ0LnB4XT1cIjQ4ICsgKGRzSXRlbS5sZXZlbCB8fCAwKSAqIDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmVlLWl0ZW0tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWNoZWNrYm94IFsoY2hlY2tlZCldPVwiZHNJdGVtLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJpc1RyZWVJdGVtSW5kZXRlcm1pbmF0ZShkc0l0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cImRzSXRlbS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImRzSXRlbS5uYW1lPy50b1N0cmluZygpIHwgdHJhbnNsYXRlXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRzSXRlbS5jaGlsZHJlbj8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1pdGVtLWJhZGdlXCI+e3sgZ2V0Q2hpbGRDb3VudChkc0l0ZW0pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImRzSXRlbS5jaGlsZHJlbj8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtaXRlbS10b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVUcmVlTm9kZShkc0l0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIHRyZWUtdG9nZ2xlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wZW5dPVwiZHNJdGVtLmlzT3BlblwiPmV4cGFuZF9tb3JlPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSByYW5nZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVSYW5nZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgT3B0aW9ucyBkYXRlIHJhbmdlIHZpZXcgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5kYXRlUmFuZ2VPcHRpb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBpdGVtLmRhdGVSYW5nZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXJhZGlvIFt2YWx1ZV09XCJvcHRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPT09IG9wdGlvbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFkaW9DaGFuZ2UpPVwiaGFuZGxlRGF0ZVJhbmdlT3B0aW9uQ2xpY2soaXRlbSwgb3B0aW9uKVwiPjwvemVuLXJhZGlvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tcmFkaW8gW3ZhbHVlXT1cIidDdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ3VzdG9tJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9PT0gJ0N1c3RvbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlvQ2hhbmdlKT1cImhhbmRsZUN1c3RvbURhdGVSYW5nZUNsaWNrKGl0ZW0pXCI+PC96ZW4tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID09PSAnQ3VzdG9tJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J0Zyb20nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVSYW5nZS5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snVG8nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVSYW5nZS5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImhhbmRsZUVuZERhdGVDaGFuZ2UoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgRGVmYXVsdCBkYXRlIHJhbmdlIHZpZXcgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J0Zyb20nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2Uuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5UG9zaXRpb25dPVwiaXRlbS5jb25maWc/LnlQb3NpdGlvbiA/PyBkYXRlcGlja2VyUG9zaXRpb24uQVVUT1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snVG8nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC96ZW4tZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydEYXRlJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50Q29udGFpbmVyXT1cIm1haW5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgcmFuZ2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlclJhbmdlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1yb3cgbnVtYmVyLXJhbmdlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J01pbicgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubnVtYmVyUmFuZ2UuZnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J01heCcgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubnVtYmVyUmFuZ2UudG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmFkaW8gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5yYWRpb09wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1yYWRpbyBbdmFsdWVdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwib3B0aW9uLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYWRpb0NoYW5nZSk9XCJyYWRpb0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIj48L3plbi1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Tm9GaWx0ZXJSZXN1bHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuby1pdGVtXCI+e3snTm8gUmVzdWx0cyBGb3VuZCcgfCB0cmFuc2xhdGV9fS4uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtZm9vdGVyIGZpbHRlci1mb290ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtY291bnRcIiAqbmdJZj1cImhhc011bHRpc2VsZWN0SXRlbXNcIj57eyBzZWxlY3RlZENvdW50IH19IHt7J1NlbGVjdGVkJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlc2V0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnRuLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtc2VsZWN0aW9uXT1cInNlbGVjdGVkQ291bnQgPiAwICYmIGhhc011bHRpc2VsZWN0SXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgRmlsdGVyJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBwbHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1idG4tYXBwbHlcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQXBwbHknIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
793
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9maWx0ZXIvemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFTL0QsTUFBTSxPQUFPLG9CQUFvQjtJQXlEL0IsWUFBbUIsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXhEN0IsV0FBTSxHQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUl0QyxhQUFRLEdBQUcsT0FBTyxDQUFDO1FBRW5CLGtCQUFhLEdBQXdCLE9BQU8sQ0FBQztRQUU1QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFM0MsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVqQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFL0Msa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFZdEIsbUJBQWMsR0FBeUIsT0FBTyxDQUFDO1FBRWpELGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVqQixzQkFBaUIsR0FB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YUFDMUQ7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7a0hBdjJCVSxvQkFBb0I7c0dBQXBCLG9CQUFvQix3M0JDOUJqQyx3bGhCQTJRQTs0RkQ3T2Esb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLFlBQVk7Z0dBS2IsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUUsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBMEJxQyxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR3pDLGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWdEN0MsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXVCNUMsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVekMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVekMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0YVNvdXJjZSxcbiAgRmlsdGVyc0NvbmZpZyxcbiAgRmlsdGVyc0NvbmZpZ0l0ZW0sXG4gIE11bHRpU2VsZWN0SXRlbSxcbn0gZnJvbSAnLi9maWx0ZXJzQ29uZmlnJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoLnVuaXFieSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC9tb21lbnQnO1xuaW1wb3J0IHsgWmVuZHVTZWFyY2hCb3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtYm94L3plbmR1LXNlYXJjaC1ib3guY29tcG9uZW50JztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IERBVEVQSUNLRVJfUE9TSVRJT04gfSBmcm9tICcuLi9kYXRlcGlja2VyL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi9kYXRlUmFuZ2UnO1xuaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3plbi1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vemVuZHUtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFplbmR1RmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnOiBGaWx0ZXJzQ29uZmlnID0geyBpdGVtczogW10gfTtcblxuICBASW5wdXQoKSBmaWx0ZXI6IG9iamVjdDtcblxuICBASW5wdXQoKSBwb3NpdGlvbiA9ICdyaWdodCc7XG5cbiAgQElucHV0KCkgcmVzZXRCZWhhdmlvcjogJ3NldF9hbGwnIHwgJ2NsZWFyJyA9ICdjbGVhcic7XG5cbiAgQE91dHB1dCgpIGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuXG4gIEBJbnB1dCgpIGlzVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBpc1Zpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQElucHV0KCkgY3VzdG9tVHJpZ2dlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGltYWdlVXJsOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKSBzaG93T3B0aW9uczogYm9vbGVhbjtcblxuICBASW5wdXQoKSBjdXN0b21PcHRpb25zOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgd3JhcHBlckJvZHlDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGN1c3RvbVBvc2l0aW9uOiAnZml4ZWQnIHwgJ2Fic29sdXRlJyA9ICdmaXhlZCc7XG5cbiAgcHVibGljIHNlYXJjaFRleHQgPSAnJztcblxuICBwdWJsaWMgaXNBcHBsaWVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsYXN0QXBwbGllZEZpbHRlcjogYW55ID0ge307XG5cbiAgcHJpdmF0ZSByZXNldGVkRmlsdGVyOiBhbnk7XG5cbiAgcHVibGljIG1lbnVMZWZ0ID0gJzBweCc7XG5cbiAgcHVibGljIG1lbnVSaWdodCA9ICcwcHgnO1xuXG4gIHB1YmxpYyBtZW51VG9wID0gJzBweCc7XG5cbiAgcHVibGljIG1lbnVCb3R0b20gPSAnMHB4JztcblxuICBwdWJsaWMgc2hvd05vRmlsdGVyUmVzdWx0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBlcnJvck1lc3NhZ2U6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIGRhdGVwaWNrZXJQb3NpdGlvbiA9IERBVEVQSUNLRVJfUE9TSVRJT047XG5cbiAgcHVibGljIHNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KSBzZWFyY2hCb3g6IFplbmR1U2VhcmNoQm94Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ21haW5Db21wb25lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgX2NvbXBvbmVudEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlnICYmIGNoYW5nZXMuY29uZmlnLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgLy8gaW5pdCB2YWx1ZXNcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgICAgaXRlbS5kYXRhU291cmNlID0gaXRlbS5kYXRhU291cmNlXG4gICAgICAgICAgICA/IHRoaXMuZXh0cmFjdFVuaXF1ZURhdGFTb3VyY2UoaXRlbS5kYXRhU291cmNlKVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnICYmICFpdGVtLmRhdGVSYW5nZSkge1xuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG5cbiAgICAgICAgICAvLyBpbml0IGRhdGUgcmFuZ2Ugb3B0aW9uc1xuICAgICAgICAgIGlmIChpdGVtLnNob3dEYXRlUmFuZ2VPcHRpb25zICYmICFpdGVtLmRhdGVSYW5nZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbS5kYXRlUmFuZ2VPcHRpb25zID0gdGhpcy5nZXREZWZhdWx0RGF0ZVJhbmdlT3B0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScgJiYgIWl0ZW0ubnVtYmVyUmFuZ2UpIHtcbiAgICAgICAgICBpdGVtLm51bWJlclJhbmdlID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGl0ZW0uc2hvd1RpbWUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIGl0ZW0uc2hvd1RpbWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcblxuICAgICAgdGhpcy5yZXNldGVkRmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICAgIHRoaXMuZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICAgIHRoaXMubGFzdEFwcGxpZWRGaWx0ZXIgPSBVdGlsLmNsb25lKHRoaXMuZmlsdGVyKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5maWx0ZXIgJiYgY2hhbmdlcy5maWx0ZXIuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyID0gVXRpbC5jbG9uZShjaGFuZ2VzLmZpbHRlci5jdXJyZW50VmFsdWUpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUFwcGxpZWRTdGF0ZSgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmlzVmlzaWJsZSAmJiBjaGFuZ2VzLmlzVmlzaWJsZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KHRoaXMuY3VzdG9tUG9zaXRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaEJveCgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvdXRzaWRlSGFuZGxpbmcoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAvLyBlbGVtZW50IG5vdCBpbiB0aGUgRE9NXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGhpZGUgdGhlIG1lbnUgZm9yIG91dHNpZGUgY2xpY2tcbiAgICB0aGlzLmhpZGUoKTtcblxuICAgIC8vIHJlc3RvcmUgdmFsdWVzXG4gICAgdGhpcy5yZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgd2luZG93U2l6ZUhhbmRsaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICB3aW5kb3dTY3JvbGwoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KHRoaXMuY3VzdG9tUG9zaXRpb24pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICBvbldpbmRvd0tleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ1BhZ2VVcCcgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ1BhZ2VEb3duJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnSG9tZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0VuZCdcbiAgICApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJlxuICAgICAgICAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYnV0dG9uLXN0cm9rZWQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5yZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzU2VhcmNoQm94KCkge1xuICAgIHRoaXMuc2VhcmNoQm94LmRvRm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc01lbnVJc1Zpc2libGUoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpZiAoaXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICBpZiAoaXRlbS5pc0xvYWRpbmdOb3cgfHwgaXRlbS5jYW5Mb2FkTW9yZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICAgIHJldHVybiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSAmJiB0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgIGlmICghaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFVuaXF1ZURhdGFTb3VyY2UoXG4gICAgYXJyYXk6IHtcbiAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVtdXG4gICk6IE11bHRpU2VsZWN0SXRlbVtdIHtcbiAgICBjb25zdCBpdGVtcyA9IGFycmF5LmZpbHRlcigoZWwpID0+IHtcbiAgICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICB0eXBlb2YgZWwuaWQgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB0eXBlb2YgZWwuaWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWwuaWQgJiYgdHlwZW9mIGVsLm5hbWUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB0eXBlb2YgZWwubmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgOiBlbC5uYW1lXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuaXFJdGVtcyA9IHVuaXFCeShpdGVtcywgKGVsKSA9PiBlbC5pZCk7XG4gICAgLy8gYWRkIGluZGV4IHRvIGVhY2ggdW5pcUl0ZW1zXG4gICAgdW5pcUl0ZW1zLmZvckVhY2goXG4gICAgICAoZWw6IE11bHRpU2VsZWN0SXRlbSwgaW5kZXg6IG51bWJlcikgPT4gKGVsLmluZGV4ID0gaW5kZXgpXG4gICAgKTtcbiAgICByZXR1cm4gdW5pcUl0ZW1zO1xuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0QWxsKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtKSB7XG4gICAgaXRlbS5kYXRhU291cmNlLmZvckVhY2goKGQpID0+IChkLmNoZWNrZWQgPSBpdGVtLmlzU2VsZWN0ZWRBbGwpKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0l0ZW1BY3RpdmUoaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICBjb25zdCBjaGVja2VkSXRlbXMgPSBpdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChlbCkgPT4gZWwuY2hlY2tlZCk7XG4gICAgICBpdGVtLmlzU2VsZWN0ZWRBbGwgPSBjaGVja2VkSXRlbXMubGVuZ3RoID09PSBpdGVtLmRhdGFTb3VyY2UubGVuZ3RoO1xuICAgICAgcmV0dXJuIGNoZWNrZWRJdGVtcy5sZW5ndGggPiAwO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gaXRlbS5yYWRpb09wdGlvbnMuc29tZSgocm8pID0+IHJvLnNlbGVjdGVkKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ251bWJlclJhbmdlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5udW1iZXJSYW5nZS5mcm9tIHx8IGl0ZW0ubnVtYmVyUmFuZ2UudG8pO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZGF0ZVJhbmdlJykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgfHwgaXRlbS5kYXRlUmFuZ2UuZW5kKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihpdGVtLmRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlYXJjaFRleHRDaGFuZ2VkKCkge1xuICAgIC8vIHJ1biB0aGUgbGF6eSBsb2FkaW5nXG4gICAgLy8gdGhlIGZpbHRlckl0ZW1zIGNhbGxlZCBmcm9tIG9uQ2hhbmdlcywgc28gY2FsbCBsYXp5IGxvYWRpbmcgb25seSBvbiBzZWFyY2ggY2hhbmdlXG4gICAgdGhpcy5yZXNldExhenlMb2FkaW5nU291cmNlcyhmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0TGF6eUxvYWRpbmdTb3VyY2VzKHNob3dTZWxlY3RlZE9uVG9wOiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZ0l0ZW0gb2YgdGhpcy5jb25maWcuaXRlbXMpIHtcbiAgICAgIGlmIChjb25maWdJdGVtLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgICAgY29uZmlnSXRlbS5jYW5Mb2FkTW9yZSA9IHRydWU7XG4gICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIHJlcXVlc3RzLnB1c2godGhpcy5sb2FkTW9yZShjb25maWdJdGVtLCBzaG93U2VsZWN0ZWRPblRvcCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcblxuICAgIC8vIGZpbHRlciBub24tbGF6eSBsb2FkaW5nIGl0ZW1zXG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcbiAgICBsZXQgaGFzRGF0YSA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBjb25maWdJdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgIGlmIChjb25maWdJdGVtLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgICAgICBpZiAoY29uZmlnSXRlbS5pc0xvYWRpbmdOb3cpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgYXMgZGF0YSBhdmFpbGFibGUgaW4gbG9hZGluZyBzdGF0ZVxuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXNUcmVlID0gdGhpcy5oYXNUcmVlRGF0YShjb25maWdJdGVtKTtcbiAgICAgICAgICBpZiAoaXNUcmVlICYmIHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgLy8gQnVpbGQgYSBsb2NhbCBsb29rdXAgbWFwIGZvciBhbmNlc3RvciB0cmF2ZXJzYWxcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGNvbmZpZ0l0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBsb2NhbE1hcC5zZXQoZWwuaWQsIGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIHRyZWUgZGF0YSwgaW5jbHVkZSBtYXRjaGluZyBpdGVtcyBhbmQgdGhlaXIgYW5jZXN0b3JzXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0lkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWROYW1lID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZWwubmFtZSA9PT0gJ251bWJlcicgPyBlbC5uYW1lLnRvU3RyaW5nKCkgOiBlbC5uYW1lO1xuICAgICAgICAgICAgICBpZiAocHJlcGFyZWROYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdJZHMuYWRkKGVsLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIGFuY2VzdG9yc1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50ID0gZWw7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQucGFyZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoaW5nSWRzLmFkZChjdXJyZW50LnBhcmVudElkKTtcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBsb2NhbE1hcC5nZXQoY3VycmVudC5wYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWwpID0+IG1hdGNoaW5nSWRzLmhhcyhlbC5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBBdXRvLWV4cGFuZCBwYXJlbnRzIHdoZW4gc2VhcmNoaW5nXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgIGlmIChlbC5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWwuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSB0aGlzLnNvcnRUcmVlT3JkZXIoY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UsIGxvY2FsTWFwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChlbCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZE5hbWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbC5uYW1lID09PSAnbnVtYmVyJyA/IGVsLm5hbWUudG9TdHJpbmcoKSA6IGVsLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBwcmVwYXJlZE5hbWVcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1RyZWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbG9jYWxNYXAgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgRGF0YVNvdXJjZT4oKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb25maWdJdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsb2NhbE1hcC5zZXQoZWwuaWQsIGVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IHRoaXMuc29ydFRyZWVPcmRlcihjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSwgbG9jYWxNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb25maWdJdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb25maWdJdGVtLnR5cGUgPT09ICdkYXRlUmFuZ2UnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgJiZcbiAgICAgICAgICAhQm9vbGVhbihjb25maWdJdGVtLmRhdGVSYW5nZS5zdGFydCB8fCBjb25maWdJdGVtLmRhdGVSYW5nZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmZpZ0l0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnSXRlbS50eXBlID09PSAnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgJiZcbiAgICAgICAgICAhQm9vbGVhbihjb25maWdJdGVtLm51bWJlclJhbmdlLmZyb20gfHwgY29uZmlnSXRlbS5udW1iZXJSYW5nZS50bylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uZmlnSXRlbS5maWx0ZXJlZERhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2hvd05vRmlsdGVyUmVzdWx0ID0gdGhpcy5zZWFyY2hUZXh0ICYmICFoYXNEYXRhO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRNb3JlKGl0ZW06IEZpbHRlcnNDb25maWdJdGVtLCBzaG93U2VsZWN0ZWRPblRvcDogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBpdGVtLmlzTG9hZGluZ05vdyA9IHRydWU7XG4gICAgICBpZiAoIWl0ZW0ubGF6eUxvYWRlcikge1xuICAgICAgICB0aHJvdyBgbG9hZGVyIGlzIG5vdCBhdmFpbGFibGVgO1xuICAgICAgfVxuICAgICAgaWYgKCFpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2FkIGZpcnN0IDEwIHJlY29yZHMgZm9yIHRoZSB0aGUgZmlyc3QgdGltZVxuICAgICAgY29uc3QgbGltaXQgPSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGggPT0gMCA/IDEwIDogMTAwO1xuICAgICAgY29uc3QgbmV3SXRlbXMgPSBhd2FpdCBpdGVtLmxhenlMb2FkZXIoXG4gICAgICAgIHsgdGV4dDogdGhpcy5zZWFyY2hUZXh0IHx8ICcnIH0sXG4gICAgICAgIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmxlbmd0aCxcbiAgICAgICAgbGltaXRcbiAgICAgICk7XG5cbiAgICAgIGl0ZW0uY2FuTG9hZE1vcmUgPSBuZXdJdGVtcy5sZW5ndGggPT0gbGltaXQ7XG5cbiAgICAgIC8vIHRoZSBmaWx0ZXJlZERhdGFTb3VyY2UgY29udGFpbnMgdGhlIGl0ZW1zIHRoYXQgaXMgdmlzaWxpYmxlIHRvIHVzZXIgYXQgdGhlIGN1cnJlbnQgbW9tZW50XG4gICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGl0ZW0uZmlsdGVyZWREYXRhU291cmNlLmNvbmNhdChuZXdJdGVtcyk7XG5cbiAgICAgIC8vIHRoZSBkYXRhU291cmNlIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgY29uc3QgY2hlY2tlZElkcyA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpXG4gICAgICAgIC5tYXAoKGkpID0+IGkuaWQpO1xuXG4gICAgICBpZiAoc2hvd1NlbGVjdGVkT25Ub3ApIHtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjaGVja2VkIGl0ZW1zIGZpcnN0XG4gICAgICAgIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlID0gaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UuZmlsdGVyKFxuICAgICAgICAgIChpKSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhpLmlkKVxuICAgICAgICApO1xuICAgICAgICAvLyBhZGQgYWxsIGNoZWNrZWQgaXRlbXMgdG8gdGhlIHRvcFxuICAgICAgICBjb25zdCBjaGVja2VkSXRlbXMgPSBpdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpO1xuICAgICAgICBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSA9IGNoZWNrZWRJdGVtcy5jb25jYXQoaXRlbS5maWx0ZXJlZERhdGFTb3VyY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbWFyayBhcyBjaGVja2VkIGJhc2VkIG9uIHRoZSBkYXRhU291cmNlXG4gICAgICAgIGZvciAobGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZSkge1xuICAgICAgICAgIGRzSXRlbS5jaGVja2VkID0gY2hlY2tlZElkcy5pbmNsdWRlcyhkc0l0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGl0ZW0uaXNMb2FkaW5nTm93ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZUl0ZW0oaXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pIHtcbiAgICBpdGVtLmV4cGFuZGVkID0gIWl0ZW0uZXhwYW5kZWQ7XG5cbiAgICBpZiAoaXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCkge1xuICAgICAgICBpZiAoaXRlbS5jYW5Mb2FkTW9yZSAhPT0gZmFsc2UgJiYgIWl0ZW0uZmlsdGVyZWREYXRhU291cmNlPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmxvYWRNb3JlKGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWx0ZXJzKCkge1xuICAgIGxldCBzZWxlY3RBbGwgPSB0aGlzLnJlc2V0QmVoYXZpb3IgPT09ICdzZXRfYWxsJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9ucyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS5kYXRhU291cmNlKSB7XG4gICAgICAgIGl0ZW0uaXNTZWxlY3RlZEFsbCA9IHNlbGVjdEFsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGRzSXRlbSBvZiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICBkc0l0ZW0uY2hlY2tlZCA9IHNlbGVjdEFsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5kYXRlUmFuZ2UpIHtcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0ubnVtYmVyUmFuZ2UpIHtcbiAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHsgZnJvbTogbnVsbCwgdG86IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uZGF0ZSkge1xuICAgICAgICBpdGVtLmRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgaXRlbS5lbmFibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5pZCA9PT0gaXRlbS5zZWxlY3RlZFJhZGlvKSB7XG4gICAgICAgICAgICBlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUHJldmlvdXNBcHBsaWVkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFJdGVtIG9mIGl0ZW0uZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBkYXRhSXRlbS5jaGVja2VkID0gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgPyBzZWxlY3Rpb24uaW5jbHVkZXMoZGF0YUl0ZW0uaWQpXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgICAgaXRlbS5kYXRlUmFuZ2UgPSB0aGlzLmxhc3RBcHBsaWVkRmlsdGVyW2l0ZW0ua2V5XSB8fCB7XG4gICAgICAgICAgICBzdGFydDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgICAgaXRlbS5udW1iZXJSYW5nZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldIHx8IHt9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgIGl0ZW0uZGF0ZVJhbmdlID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGl0ZW0uZGF0ZSA9IHRoaXMubGFzdEFwcGxpZWRGaWx0ZXJbaXRlbS5rZXldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgaXRlbS5zZWxlY3RlZFJhZGlvID0gdGhpcy5sYXN0QXBwbGllZEZpbHRlcltpdGVtLmtleV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XG5cbiAgICB0aGlzLmZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyT2JqZWN0KCk7XG4gICAgdGhpcy5yZXNldGVkRmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcblxuICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5KCkge1xuICAgIHRoaXMuZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJPYmplY3QoKTtcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBjb25zdCBpdGVtRmxhZyA9IHRoaXMub25DaGVja1ZhbGlkaXR5KGl0ZXJhdG9yKTtcbiAgICAgIGlmICghaXRlbUZsYWcpIHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZXJyb3JNZXNzYWdlID0gW10pLCA1MDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5sYXN0QXBwbGllZEZpbHRlciA9IFV0aWwuY2xvbmUodGhpcy5maWx0ZXIpO1xuXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcik7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGFwcGx5IHN0YXRlXG4gICAgdGhpcy51cGRhdGVBcHBsaWVkU3RhdGUoKTtcblxuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBcHBsaWVkU3RhdGUoKSB7XG4gICAgdGhpcy5pc0FwcGxpZWQgPSBmYWxzZTtcbiAgICAvLyBzaG93aW5nIGNoZWNrZWQgaXRlbXMgb24gdG9wIG9mIHRoZSBsaXN0XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgIC8vIHJlc29ydCBmaXJzdCBiYXNlZCBvbiBpbmRleFxuICAgICAgICBpdGVtLmRhdGFTb3VyY2Uuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICAgIC8vIHRoZW4gc29ydCBiYXNlZCBvbiBjaGVja2VkIGl0ZW1zIGFnYWluXG4gICAgICAgIGl0ZW0uZGF0YVNvdXJjZS5zb3J0KFxuICAgICAgICAgIChhOiBEYXRhU291cmNlLCBiOiBEYXRhU291cmNlKSA9PlxuICAgICAgICAgICAgTnVtYmVyKGIuY2hlY2tlZCB8fCAwKSAtIE51bWJlcihhLmNoZWNrZWQgfHwgMClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLnJlc2V0ZWRGaWx0ZXIpIHtcbiAgICAgICAgLy8gRmlsdGVyIHdhcyByZXNldCwgc28gY29tcGFyZSB0aGUgcmVzZXQgZmlsdGVyIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IGZpbHRlclxuICAgICAgICAvLyBXaGVuIHVzZXIgY2xpY2sgb24gUmVzZXQgYW5kIFRoZW4gQXBwbHksIGZpbHRlciBtdXN0IHVuaGlnaGxpZ2h0ZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucmVzZXRlZEZpbHRlcikgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmlzQXBwbGllZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNBcHBsaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlckNsYXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGlvbi1tZW51LWJvZHknKTtcbiAgICBpZiAodGhpcy53cmFwcGVyQm9keUNsYXNzKSB7XG4gICAgICB3cmFwcGVyQ2xhc3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLndyYXBwZXJCb2R5Q2xhc3N9YCk7XG4gICAgfVxuICAgIGlmICh3cmFwcGVyQ2xhc3MpIHtcbiAgICAgIHdyYXBwZXJDbGFzcy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdhdXRvJyB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZpbHRlck9iamVjdCgpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGFTb3VyY2UgJiYgaXRlbS5kYXRhU291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZElkcyA9IGl0ZW0uZGF0YVNvdXJjZVxuICAgICAgICAgICAgICAuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQpXG4gICAgICAgICAgICAgIC5tYXAoKGkpID0+IGkuaWQpO1xuXG4gICAgICAgICAgICBpZiAoY2hlY2tlZElkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGNoZWNrZWRJZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGVSYW5nZSAmJiBpdGVtLmRhdGVSYW5nZS5zdGFydCAmJiBpdGVtLmRhdGVSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGVSYW5nZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpdGVtLm51bWJlclJhbmdlICYmXG4gICAgICAgICAgICB0eXBlb2YgaXRlbT8ubnVtYmVyUmFuZ2U/LmZyb20gPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgaXRlbT8ubnVtYmVyUmFuZ2U/LnRvID09PSAnbnVtYmVyJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ubnVtYmVyUmFuZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGlmIChpdGVtLmRhdGUpIHtcbiAgICAgICAgICAgIGZpbHRlcltpdGVtLmtleV0gPSBpdGVtLmRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgZmlsdGVyW2l0ZW0ua2V5XSA9IGl0ZW0ucmFkaW9PcHRpb25zLmZpbmQoKHJvKSA9PiByby5zZWxlY3RlZCk/LmlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcblxuICAgIHRoaXMuaXNWaXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHJhZGlvQ2hhbmdlZCh2YWx1ZTogc3RyaW5nLCBpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSk6IHZvaWQge1xuICAgIGl0ZW0ucmFkaW9PcHRpb25zLmZvckVhY2goKG9wdCkgPT4gKG9wdC5zZWxlY3RlZCA9IG9wdC5pZCA9PT0gdmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0NoYW5nZWQoaXRlbTogRGF0YVNvdXJjZSwgY29uZmlnSXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnSXRlbS5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAvLyBzdG9yZSB0aGUgY2hlY2sgaXRlbXMgaW4gdGhlIGRhdGEgc291cmNlXG4gICAgICBjb25zdCBleGlzdEl0ZW0gPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmluZCgoaSkgPT4gaS5pZCA9PSBpdGVtLmlkKTtcbiAgICAgIGlmIChleGlzdEl0ZW0pIHtcbiAgICAgICAgZXhpc3RJdGVtLmNoZWNrZWQgPSBpdGVtLmNoZWNrZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIC8vIGtlZXAgb25seSBjaGVja2VkXG4gICAgICBjb25maWdJdGVtLmRhdGFTb3VyY2UgPSBjb25maWdJdGVtLmRhdGFTb3VyY2UuZmlsdGVyKChkKSA9PiBkLmNoZWNrZWQpO1xuICAgIH1cbiAgICAvLyBGb3IgdHJlZSBpdGVtcywgemVuLWdyb3VwcyBoYW5kbGVzIGNhc2NhZGUgaW50ZXJuYWxseVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9ICF0aGlzLmlzVmlzaWJsZTtcbiAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCh0aGlzLmN1c3RvbVBvc2l0aW9uKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoQm94KCk7XG5cbiAgICBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMucmVzZXRMYXp5TG9hZGluZ1NvdXJjZXModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2hlY2tWYWxpZGl0eShpdGVtOiBGaWx0ZXJzQ29uZmlnSXRlbSkge1xuICAgIGlmIChpdGVtLnR5cGUgPT09ICdudW1iZXJSYW5nZScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0ubnVtYmVyUmFuZ2UudG8gPT09ICdudW1iZXInICYmXG4gICAgICAgIGl0ZW0ubnVtYmVyUmFuZ2UuZnJvbSA+IGl0ZW0ubnVtYmVyUmFuZ2UudG9cbiAgICAgICkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5wdXNoKFxuICAgICAgICAgIGBJbnZhbGlkIE51bWJlciByYW5nZTogVGhlIE1pbiBudW1iZXIgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgTWF4IG51bWJlci5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgaXRlbS5kYXRlUmFuZ2UuZW5kICYmXG4gICAgICAgIG5ldyBEYXRlKGl0ZW0uZGF0ZVJhbmdlLnN0YXJ0KSA+IG5ldyBEYXRlKGl0ZW0uZGF0ZVJhbmdlLmVuZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5wdXNoKFxuICAgICAgICAgIGBJbnZhbGlkIERhdGUgcmFuZ2U6IFRoZSBTdGFydCBkYXRlIGNhbm5vdCBiZSBhZnRlciB0aGUgRW5kIGRhdGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVBsYWNlbWVudChwb3M6ICdmaXhlZCcgfCAnYWJzb2x1dGUnID0gJ2ZpeGVkJykge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY29udGFpbmVyID0gaG9zdC5xdWVyeVNlbGVjdG9yKCcubWVudS1jb250ZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPVxuICAgICAgcG9zID09PSAnZml4ZWQnXG4gICAgICAgID8gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHJpZ2h0ID0gcmVjdC5yaWdodDtcbiAgICBjb25zdCB0b3AgPSByZWN0LnRvcDtcbiAgICBjb25zdCBib3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3A7XG5cbiAgICBpZiAocG9zID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNvbnRhaW5lciwgJ2Fic29sdXRlJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGNvbnRhaW5lciwgJ2luc2V0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY29udGFpbmVyLCAnYWJzb2x1dGUnKTtcbiAgICB9XG5cbiAgICBpZiAocG9zID09PSAnZml4ZWQnKSB7XG4gICAgICBpZiAodGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnYXV0bycpKSB7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxQb3NpdGlvbiA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID1cbiAgICAgICAgICBob3Jpem9udGFsUG9zaXRpb24gPT09ICdsZWZ0J1xuICAgICAgICAgICAgPyBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJpZ2h0fXB4YFxuICAgICAgICAgICAgOiAndW5zZXQnO1xuICAgICAgICB0aGlzLm1lbnVMZWZ0ID0gaG9yaXpvbnRhbFBvc2l0aW9uID09PSAncmlnaHQnID8gYCR7bGVmdH1weGAgOiAndW5zZXQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdsZWZ0JykpIHtcbiAgICAgICAgdGhpcy5tZW51UmlnaHQgPSBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJpZ2h0fXB4YDtcbiAgICAgICAgdGhpcy5tZW51TGVmdCA9ICd1bnNldCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lbnVMZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICAgIHRoaXMubWVudVJpZ2h0ID0gJ3Vuc2V0JztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2F1dG8nKSkge1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMubWVudVRvcCA9XG4gICAgICAgICAgdmVydGljYWxQb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyBgJHt0b3AgKyA0Mn1weGAgOiAndW5zZXQnO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSB2ZXJ0aWNhbFBvc2l0aW9uID09PSAndG9wJyA/IGAke2JvdHRvbX1weGAgOiAndW5zZXQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgICB0aGlzLm1lbnVUb3AgPSAndW5zZXQnO1xuICAgICAgICB0aGlzLm1lbnVCb3R0b20gPSBgJHtib3R0b20gKyAxMH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lbnVUb3AgPSBgJHt0b3AgKyA1NX1weGA7XG4gICAgICAgIHRoaXMubWVudUJvdHRvbSA9ICd1bnNldCc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB2ZXJ0aWNhbENsYXNzID0gJyc7XG4gICAgICBsZXQgaG9yaXpvbnRhbENsYXNzID0gJyc7XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uLmluY2x1ZGVzKCdhdXRvJykpIHtcbiAgICAgICAgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5nZXRIb3Jpem9udGFsUG9zaXRpb24oKTtcbiAgICAgICAgdmVydGljYWxDbGFzcyA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnbGVmdCcpID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgICAgdmVydGljYWxDbGFzcyA9IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgICAgIH1cbiAgICAgIFtcbiAgICAgICAgJ2Ryb3Bkb3duLWxlZnQnLFxuICAgICAgICAnZHJvcGRvd24tcmlnaHQnLFxuICAgICAgICAnZHJvcGRvd24tdG9wJyxcbiAgICAgICAgJ2Ryb3Bkb3duLWJvdHRvbScsXG4gICAgICBdLmZvckVhY2goKGMpID0+IHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY29udGFpbmVyLCBjKSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNvbnRhaW5lciwgYGRyb3Bkb3duLSR7aG9yaXpvbnRhbENsYXNzfWApO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGBkcm9wZG93bi0ke3ZlcnRpY2FsQ2xhc3N9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbFBvc2l0aW9uKCk6ICdib3R0b20nIHwgJ3RvcCcge1xuICAgIGNvbnN0IHRvcCA9XG4gICAgICB0aGlzLl9jb21wb25lbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIHJldHVybiB0b3AgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SG9yaXpvbnRhbFBvc2l0aW9uKCk6ICdyaWdodCcgfCAnbGVmdCcge1xuICAgIGNvbnN0IGxlZnQgPVxuICAgICAgdGhpcy5fY29tcG9uZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgcmV0dXJuIGxlZnQgPiB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgPyAnbGVmdCcgOiAncmlnaHQnO1xuICB9XG5cbiAgcHVibGljIGdldERlZmF1bHREYXRlUmFuZ2VPcHRpb25zKCk6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGF0ZVJhbmdlOiBEYXRlUmFuZ2U7XG4gIH1bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RvZGF5JyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1llc3RlcmRheScsXG4gICAgICAgIGRhdGVSYW5nZToge1xuICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5lbmRPZignZGF5JykudG9EYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnVGhpcyBXZWVrJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ3dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykudG9EYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnTGFzdCBXZWVrJyxcbiAgICAgICAgZGF0ZVJhbmdlOiB7XG4gICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJykuc3RhcnRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoNywgJ2RheXMnKS5lbmRPZignd2VlaycpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1RoaXMgTW9udGgnLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0xhc3QgTW9udGgnLFxuICAgICAgICBkYXRlUmFuZ2U6IHtcbiAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0VHJlZU9yZGVyKGl0ZW1zOiBEYXRhU291cmNlW10sIHRyZWVNYXA6IE1hcDxzdHJpbmcgfCBudW1iZXIsIERhdGFTb3VyY2U+KTogRGF0YVNvdXJjZVtdIHtcbiAgICBjb25zdCBpdGVtU2V0ID0gbmV3IFNldChpdGVtcy5tYXAoaSA9PiBpLmlkKSk7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgIGNvbnN0IG9yZGVyZWQ6IERhdGFTb3VyY2VbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ID0gKGl0ZW06IERhdGFTb3VyY2UpID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhpdGVtLmlkKSkgcmV0dXJuO1xuICAgICAgaWYgKCFpdGVtU2V0LmhhcyhpdGVtLmlkKSkgcmV0dXJuO1xuICAgICAgdmlzaXRlZC5hZGQoaXRlbS5pZCk7XG4gICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSB0cmVlTWFwLmdldChjaGlsZElkKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZpc2l0KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKGl0ZW0ucGFyZW50SWQgPT0gbnVsbCkge1xuICAgICAgICB2aXNpdChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGl0ZW0uaWQpKSB7XG4gICAgICAgIG9yZGVyZWQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyZWQ7XG4gIH1cblxuICBwdWJsaWMgaGFzVHJlZURhdGEoY29uZmlnSXRlbTogRmlsdGVyc0NvbmZpZ0l0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlnSXRlbS5kYXRhU291cmNlPy5zb21lKGQgPT4gZC5jaGlsZHJlbj8ubGVuZ3RoID4gMCkgfHwgZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRGF0ZVJhbmdlT3B0aW9uQ2xpY2soaXRlbSwgb3B0aW9uKSB7XG4gICAgaXRlbS5kYXRlUmFuZ2UgPSBvcHRpb24uZGF0ZVJhbmdlO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9IG9wdGlvbi5uYW1lO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUN1c3RvbURhdGVSYW5nZUNsaWNrKGl0ZW0pIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPSAnQ3VzdG9tJztcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pIHtcbiAgICBpZiAoIWl0ZW0uc2hvd1RpbWUpIHtcbiAgICAgIGl0ZW0uZGF0ZVJhbmdlLmVuZCA9IG1vbWVudChpdGVtLmRhdGVSYW5nZS5lbmQpLmVuZE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc011bHRpc2VsZWN0SXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLml0ZW1zLnNvbWUoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnbXVsdGlzZWxlY3QnICYmIGl0ZW0uZGF0YVNvdXJjZT8ubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ211bHRpc2VsZWN0JyAmJiBpdGVtLmRhdGFTb3VyY2UpIHtcbiAgICAgICAgY291bnQgKz0gaXRlbS5kYXRhU291cmNlLmZpbHRlcigoZCkgPT4gZC5jaGVja2VkKS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZpbHRlcnMtY29tcG9uZW50XCJcbiAgICAgI21haW5Db21wb25lbnRcbiAgICAgY2xpY2stb3V0PVwiaXNWaXNpYmxlICYmIGhpZGUoKVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21UcmlnZ2VyXCI+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1zdHJva2VkIGZpbHRlciB7e2lzQXBwbGllZCA/ICdhcHBsaWVkJyA6ICcnfX1cIj5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBbc3JjXT1cImltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImltYWdlVXJsXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmlsdGVyLWljb24gbWF0ZXJpYWwtaWNvbnNcIlxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaW1hZ2VVcmxcIj5maWx0ZXJfbGlzdDwvaT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGVudCAqbmdJZj1cImN1c3RvbVRyaWdnZXJcIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2IFtoaWRkZW5dPVwiIWlzVmlzaWJsZVwiXG4gICAgICAgICBjbGFzcz1cImFjdGlvbi1tZW51IG1lbnUtY29udGVudFwiXG4gICAgICAgICBbY2xhc3MuY3VzdG9tVHJpZ2dlcl09XCJjdXN0b21UcmlnZ2VyXCJcbiAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2xlZnQnOiBtZW51TGVmdCwgJ3JpZ2h0JzogbWVudVJpZ2h0LCAndG9wJzogbWVudVRvcCwgJ2JvdHRvbSc6IG1lbnVCb3R0b20gIH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWhlYWRlclwiPlxuICAgICAgICAgICAgPHplbi1zZWFyY2gtYm94IFsodGV4dCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlYXJjaEJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0Q2hhbmdlKT1cInNlYXJjaFRleHRDaGFuZ2VkKClcIj48L3plbi1zZWFyY2gtYm94PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtYm9keSBpdGVtcy13cmFwcGVyXCJcbiAgICAgICAgICAgICBuZ0NsYXNzPVwie3t3cmFwcGVyQm9keUNsYXNzfX1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlcnJvck1lc3NhZ2UubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXJyb3ItbXNnXCI+e3tpdGVtIHwgdHJhbnNsYXRlIH19PC9saT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbmZpZy5pdGVtc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01lbnVJc1Zpc2libGUoaXRlbSlcIj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIERpdmlkZXIgYmV0d2VlbiB0d28gZmlsdGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGl2aWRlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmlsdGVyLWRpdmlkZXJcIj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm9vbGVhbiB0b2dnbGUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICd0b2dnbGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtIHRvZ2dsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tpdGVtLnRpdGxlIHwgdHJhbnNsYXRlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tdG9nZ2xlLXNsaWRlIFsoZW5hYmxlZCldPVwiaXRlbS5lbmFibGVkXCI+PC96ZW4tdG9nZ2xlLXNsaWRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWl0ZW0gZXhwYW5kZXItaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgIT0gJ3RvZ2dsZScgJiYgaXRlbS50eXBlICE9ICdkaXZpZGVyJyAmJiAhaXRlbS5kaXNhYmxlQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVJdGVtKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cGFuZGVyLXRpdGxlXCI+e3tpdGVtLnRpdGxlIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGV4cGFuZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXRlbS5leHBhbmRlZH1cIj5leHBhbmRfbW9yZTwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtIHNlY3Rpb24tdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlICE9ICd0b2dnbGUnICYmIGl0ZW0udHlwZSAhPSAnZGl2aWRlcicgJiYgaXRlbS5kaXNhYmxlQ29sbGFwc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS50aXRsZSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkIHx8IGl0ZW0uZGlzYWJsZUNvbGxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJpdGVtLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpc2VsZWN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXNlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMYXp5IGxvYWRpbmcgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaXNMYXp5TG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZHNJdGVtIG9mIGl0ZW0uZmlsdGVyZWREYXRhU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBkcy1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1iYWRnZV09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1jaGVja2JveCBbKGNoZWNrZWQpXT1cImRzSXRlbS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZVVybF09XCJkc0l0ZW0uaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiY2hlY2tDaGFuZ2VkKGRzSXRlbSwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImRzSXRlbS5iYWRnZUJnQ29sb3IgPyAnJyA6IChkc0l0ZW0ubmFtZT8udG9TdHJpbmcoKSB8IHRyYW5zbGF0ZSlcIj48L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRzSXRlbS5iYWRnZUJnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWl0ZW0tYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6IGRzSXRlbS5iYWRnZUJnQ29sb3IsICdjb2xvcic6IGRzSXRlbS5iYWRnZUNvbG9yfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkc0l0ZW0ubmFtZT8udG9TdHJpbmcoKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uY2FuTG9hZE1vcmUgJiYgIWl0ZW0uaXNMb2FkaW5nTm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKGl0ZW0sIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1zdHJva2VkIGZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snTG9hZCBNb3JlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9hZGVyLW1vcmUtc3Bpbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tc3Bpbm5lciBzaXplPVwic21hbGxcIj48L3plbi1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pc0xhenlMb2FkaW5nICYmICFoYXNUcmVlRGF0YShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94IGRzLWl0ZW0gc2VsZWN0LWFsbFwiICpuZ0lmPVwiIWl0ZW0uaGlkZVNlbGVjdEFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggKm5nSWY9XCJpdGVtLmRhdGFTb3VyY2UubGVuZ3RoID09PSBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhjaGVja2VkKV09XCJpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaXNJdGVtQWN0aXZlKGl0ZW0pICYmICFpdGVtLmlzU2VsZWN0ZWRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidTZWxlY3QgQWxsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblNlbGVjdEFsbChpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRzSXRlbSBvZiBpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggZHMtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYmFkZ2VdPVwiZHNJdGVtLmJhZGdlQmdDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggWyhjaGVja2VkKV09XCJkc0l0ZW0uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZHNJdGVtLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZChkc0l0ZW0sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yID8gJycgOiAoZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUpXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkc0l0ZW0uYmFkZ2VCZ0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pdGVtLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBkc0l0ZW0uYmFkZ2VCZ0NvbG9yLCAnY29sb3InOiBkc0l0ZW0uYmFkZ2VDb2xvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZHNJdGVtLm5hbWU/LnRvU3RyaW5nKCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUcmVlIHZpZXcgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1ncm91cHMgKm5nSWY9XCIhaXRlbS5pc0xhenlMb2FkaW5nICYmIGhhc1RyZWVEYXRhKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiaXRlbS5kYXRhU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmVkRGF0YVNvdXJjZV09XCJpdGVtLmZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0QWxsXT1cIml0ZW0uaGlkZVNlbGVjdEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGlzU2VsZWN0ZWRBbGwpXT1cIml0ZW0uaXNTZWxlY3RlZEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImNoZWNrQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWdyb3Vwcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSByYW5nZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVSYW5nZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgT3B0aW9ucyBkYXRlIHJhbmdlIHZpZXcgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5kYXRlUmFuZ2VPcHRpb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBpdGVtLmRhdGVSYW5nZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLXJhZGlvIFt2YWx1ZV09XCJvcHRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkRGF0ZVJhbmdlT3B0aW9uc1tpdGVtLmtleV0gPT09IG9wdGlvbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFkaW9DaGFuZ2UpPVwiaGFuZGxlRGF0ZVJhbmdlT3B0aW9uQ2xpY2soaXRlbSwgb3B0aW9uKVwiPjwvemVuLXJhZGlvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tcmFkaW8gW3ZhbHVlXT1cIidDdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ3VzdG9tJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWREYXRlUmFuZ2VPcHRpb25zW2l0ZW0ua2V5XSA9PT0gJ0N1c3RvbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlvQ2hhbmdlKT1cImhhbmRsZUN1c3RvbURhdGVSYW5nZUNsaWNrKGl0ZW0pXCI+PC96ZW4tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZERhdGVSYW5nZU9wdGlvbnNbaXRlbS5rZXldID09PSAnQ3VzdG9tJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J0Zyb20nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVSYW5nZS5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRzLWl0ZW0gZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snVG8nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tZGF0ZXBpY2tlciBjbGFzcz1cIndpZHRoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVSYW5nZS5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJpdGVtLmNvbmZpZz8ueVBvc2l0aW9uID8/IGRhdGVwaWNrZXJQb3NpdGlvbi5BVVRPXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImhhbmRsZUVuZERhdGVDaGFuZ2UoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgRGVmYXVsdCBkYXRlIHJhbmdlIHZpZXcgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uZGF0ZVJhbmdlT3B0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHMtaXRlbSBmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J0Zyb20nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2Uuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiaXRlbS5zaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5UG9zaXRpb25dPVwiaXRlbS5jb25maWc/LnlQb3NpdGlvbiA/PyBkYXRlcGlja2VyUG9zaXRpb24uQVVUT1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRDb250YWluZXJdPVwibWFpbkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGJsXCI+e3snVG8nIHwgdHJhbnNsYXRlfX06PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZGF0ZSldPVwiaXRlbS5kYXRlUmFuZ2UuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cIml0ZW0uY29uZmlnPy55UG9zaXRpb24gPz8gZGF0ZXBpY2tlclBvc2l0aW9uLkFVVE9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVFbmREYXRlQ2hhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudENvbnRhaW5lcl09XCJtYWluQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC96ZW4tZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcy1pdGVtIGZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYmxcIj57eydEYXRlJyB8IHRyYW5zbGF0ZX19OjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1kYXRlcGlja2VyIGNsYXNzPVwid2lkdGgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhkYXRlKV09XCJpdGVtLmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJpdGVtLnNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50Q29udGFpbmVyXT1cIm1haW5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvemVuLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgcmFuZ2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlclJhbmdlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1yb3cgbnVtYmVyLXJhbmdlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J01pbicgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubnVtYmVyUmFuZ2UuZnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxibFwiPnt7J01heCcgfCB0cmFuc2xhdGV9fTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm1hdGVyaWFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubnVtYmVyUmFuZ2UudG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmFkaW8gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaXRlbS5yYWRpb09wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWl0ZW0tcmFkaW8gZHMtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1yYWRpbyBbdmFsdWVdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwib3B0aW9uLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYWRpb0NoYW5nZSk9XCJyYWRpb0NoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIj48L3plbi1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Tm9GaWx0ZXJSZXN1bHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuby1pdGVtXCI+e3snTm8gUmVzdWx0cyBGb3VuZCcgfCB0cmFuc2xhdGV9fS4uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtZm9vdGVyIGZpbHRlci1mb290ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtY291bnRcIiAqbmdJZj1cImhhc011bHRpc2VsZWN0SXRlbXNcIj57eyBzZWxlY3RlZENvdW50IH19IHt7J1NlbGVjdGVkJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlc2V0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnRuLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtc2VsZWN0aW9uXT1cInNlbGVjdGVkQ291bnQgPiAwICYmIGhhc011bHRpc2VsZWN0SXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgRmlsdGVyJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBwbHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1idG4tYXBwbHlcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQXBwbHknIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|