ng-prime-tools 1.0.34 → 1.0.36

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.
@@ -3,111 +3,84 @@ import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  import * as i2 from "primeng/dialog";
5
5
  import * as i3 from "primeng/api";
6
+ const DEFAULT_DIALOG_CONFIG = {
7
+ modal: true,
8
+ closable: true,
9
+ draggable: true,
10
+ resizable: true,
11
+ maximizable: false,
12
+ dismissableMask: false,
13
+ closeOnEscape: true,
14
+ blockScroll: true,
15
+ bodyScrollable: true,
16
+ showFooter: true,
17
+ position: 'center',
18
+ };
6
19
  export class PTDialogComponent {
7
20
  constructor() {
8
- /** Enable scroll when body exceeds given height/width */
9
- this.bodyScrollable = true;
10
- /** Control footer visibility (default: true) */
11
- this.showFooter = true;
12
- this.modal = true;
13
- this.closable = true;
14
- this.draggable = true;
15
- this.resizable = true;
16
- this.maximizable = false;
17
- this.dismissableMask = false;
18
- this.closeOnEscape = true;
19
- this.blockScroll = true;
20
- this.position = 'center';
21
- /** internal visible flag used by p-dialog */
22
- this._visible = false;
21
+ /** Single configuration object */
22
+ this._config = { ...DEFAULT_DIALOG_CONFIG };
23
+ // ---- Internal visible state (PUBLIC so template can read it) ----
24
+ this._internalVisible = false;
23
25
  this.visibleChange = new EventEmitter();
24
26
  }
27
+ set config(value) {
28
+ this._config = { ...DEFAULT_DIALOG_CONFIG, ...(value || {}) };
29
+ }
30
+ get config() {
31
+ return this._config;
32
+ }
33
+ /** Input visible from parent */
25
34
  get visible() {
26
- return this._visible;
35
+ return this._internalVisible;
27
36
  }
28
37
  set visible(v) {
29
- this._visible = v;
38
+ this._internalVisible = v;
30
39
  }
31
- /** Final class applied to p-dialog */
32
40
  get dialogStyleClass() {
33
41
  return [
34
42
  'border-round-3xl',
35
43
  'shadow-6',
36
44
  'overflow-hidden',
37
- 'pt-dialog-header-blue', // for header/footer colors
38
- this.styleClass,
45
+ 'pt-dialog-header-blue',
46
+ this.config.styleClass,
39
47
  ]
40
48
  .filter(Boolean)
41
49
  .join(' ');
42
50
  }
43
- /** Style applied to the body wrapper */
51
+ get primePosition() {
52
+ return (this.config.position ?? 'center');
53
+ }
44
54
  get bodyStyle() {
45
55
  const style = {};
46
- if (this.bodyWidth) {
47
- style['max-width'] = this.bodyWidth;
56
+ if (this.config.bodyWidth) {
57
+ style['max-width'] = this.config.bodyWidth;
48
58
  }
49
- if (this.bodyHeight) {
50
- style['max-height'] = this.bodyHeight;
51
- if (this.bodyScrollable) {
59
+ if (this.config.bodyHeight) {
60
+ style['max-height'] = this.config.bodyHeight;
61
+ if (this.config.bodyScrollable !== false) {
52
62
  style['overflow-y'] = 'auto';
53
63
  style['overflow-x'] = 'auto';
54
64
  }
55
65
  }
56
66
  return style;
57
67
  }
58
- onShow() {
59
- this.visibleChange.emit(true);
60
- }
61
- onHide() {
62
- this.visibleChange.emit(false);
68
+ /** Sync <p-dialog> → parent */
69
+ onInternalVisibleChange(v) {
70
+ this._internalVisible = v;
71
+ this.visibleChange.emit(v);
63
72
  }
64
73
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDialogComponent, selector: "pt-dialog", inputs: { header: "header", style: "style", styleClass: "styleClass", headerIconClass: "headerIconClass", bodyWidth: "bodyWidth", bodyHeight: "bodyHeight", bodyScrollable: "bodyScrollable", showFooter: "showFooter", modal: "modal", closable: "closable", draggable: "draggable", resizable: "resizable", maximizable: "maximizable", dismissableMask: "dismissableMask", closeOnEscape: "closeOnEscape", blockScroll: "blockScroll", breakpoints: "breakpoints", position: "position", contentStyle: "contentStyle", visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<p-dialog\n [(visible)]=\"_visible\"\n [header]=\"header\"\n [modal]=\"modal\"\n [style]=\"style\"\n [breakpoints]=\"breakpoints\"\n [closable]=\"closable\"\n [draggable]=\"draggable\"\n [resizable]=\"resizable\"\n [maximizable]=\"maximizable\"\n [dismissableMask]=\"dismissableMask\"\n [closeOnEscape]=\"closeOnEscape\"\n [blockScroll]=\"blockScroll\"\n [position]=\"position\"\n [contentStyle]=\"contentStyle\"\n [styleClass]=\"dialogStyleClass\"\n (onShow)=\"onShow()\"\n (onHide)=\"onHide()\"\n>\n <!-- HEADER -->\n <ng-template pTemplate=\"header\">\n <div\n class=\"flex align-items-center justify-content-between w-full px-4 pt-3 pb-2\"\n >\n <div class=\"flex align-items-center gap-2\">\n <!-- optional icon -->\n <i *ngIf=\"headerIconClass\" [ngClass]=\"headerIconClass\"></i>\n\n <!-- projected custom header -->\n <ng-content select=\"[ptDialogHeader]\"></ng-content>\n\n <!-- fallback header text -->\n <span *ngIf=\"header\" class=\"font-bold text-lg\">\n {{ header }}\n </span>\n </div>\n <!-- close icon from PrimeNG (X) is rendered automatically -->\n </div>\n </ng-template>\n\n <!-- BODY -->\n <div\n class=\"surface-50 px-4 py-4 flex flex-column gap-3\"\n [ngStyle]=\"bodyStyle\"\n >\n <ng-content select=\"[ptDialogContent]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <!-- FOOTER (optional) -->\n <ng-template pTemplate=\"footer\" *ngIf=\"showFooter\">\n <div class=\"surface-100 px-4 py-2 flex justify-content-end gap-2\">\n <ng-content select=\"[ptDialogFooter]\"></ng-content>\n </div>\n </ng-template>\n</p-dialog>\n", styles: [":host ::ng-deep .pt-dialog-header-blue .p-dialog-header{background-color:#e0f2ff;border-bottom:0}:host ::ng-deep .pt-dialog-header-blue .p-dialog-footer{background-color:#f5f6f8!important;border-top:0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }] }); }
74
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDialogComponent, selector: "pt-dialog", inputs: { config: "config", visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<p-dialog\n [visible]=\"_internalVisible\"\n (visibleChange)=\"onInternalVisibleChange($event)\"\n [header]=\"config.header\"\n [modal]=\"config.modal\"\n [style]=\"config.style\"\n [breakpoints]=\"config.breakpoints\"\n [closable]=\"config.closable\"\n [draggable]=\"config.draggable\"\n [resizable]=\"config.resizable\"\n [maximizable]=\"config.maximizable\"\n [dismissableMask]=\"config.dismissableMask\"\n [closeOnEscape]=\"config.closeOnEscape\"\n [blockScroll]=\"config.blockScroll\"\n [position]=\"primePosition\"\n [contentStyle]=\"config.contentStyle\"\n [styleClass]=\"dialogStyleClass\"\n>\n <!-- HEADER -->\n <ng-template pTemplate=\"header\">\n <div\n class=\"flex align-items-center justify-content-between w-full px-4 pt-3 pb-2\"\n >\n <div class=\"flex align-items-center gap-2\">\n <i\n *ngIf=\"config.headerIconClass\"\n [ngClass]=\"config.headerIconClass\"\n ></i>\n <ng-content select=\"[ptDialogHeader]\"></ng-content>\n <span *ngIf=\"config.header\" class=\"font-bold text-lg\">\n {{ config.header }}\n </span>\n </div>\n </div>\n </ng-template>\n\n <!-- BODY -->\n <div\n class=\"surface-50 px-4 py-4 flex flex-column gap-3\"\n [ngStyle]=\"bodyStyle\"\n >\n <ng-content select=\"[ptDialogContent]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <!-- FOOTER -->\n <ng-template pTemplate=\"footer\" *ngIf=\"config.showFooter !== false\">\n <div class=\"surface-100 px-4 py-2 flex justify-content-end gap-2\">\n <ng-content select=\"[ptDialogFooter]\"></ng-content>\n </div>\n </ng-template>\n</p-dialog>\n", styles: [":host ::ng-deep .pt-dialog-header-blue .p-dialog-header{background-color:#e0f2ff;border-bottom:0}:host ::ng-deep .pt-dialog-header-blue .p-dialog-footer{background-color:#f5f6f8!important;border-top:0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }] }); }
66
75
  }
67
76
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDialogComponent, decorators: [{
68
77
  type: Component,
69
- args: [{ selector: 'pt-dialog', template: "<p-dialog\n [(visible)]=\"_visible\"\n [header]=\"header\"\n [modal]=\"modal\"\n [style]=\"style\"\n [breakpoints]=\"breakpoints\"\n [closable]=\"closable\"\n [draggable]=\"draggable\"\n [resizable]=\"resizable\"\n [maximizable]=\"maximizable\"\n [dismissableMask]=\"dismissableMask\"\n [closeOnEscape]=\"closeOnEscape\"\n [blockScroll]=\"blockScroll\"\n [position]=\"position\"\n [contentStyle]=\"contentStyle\"\n [styleClass]=\"dialogStyleClass\"\n (onShow)=\"onShow()\"\n (onHide)=\"onHide()\"\n>\n <!-- HEADER -->\n <ng-template pTemplate=\"header\">\n <div\n class=\"flex align-items-center justify-content-between w-full px-4 pt-3 pb-2\"\n >\n <div class=\"flex align-items-center gap-2\">\n <!-- optional icon -->\n <i *ngIf=\"headerIconClass\" [ngClass]=\"headerIconClass\"></i>\n\n <!-- projected custom header -->\n <ng-content select=\"[ptDialogHeader]\"></ng-content>\n\n <!-- fallback header text -->\n <span *ngIf=\"header\" class=\"font-bold text-lg\">\n {{ header }}\n </span>\n </div>\n <!-- close icon from PrimeNG (X) is rendered automatically -->\n </div>\n </ng-template>\n\n <!-- BODY -->\n <div\n class=\"surface-50 px-4 py-4 flex flex-column gap-3\"\n [ngStyle]=\"bodyStyle\"\n >\n <ng-content select=\"[ptDialogContent]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <!-- FOOTER (optional) -->\n <ng-template pTemplate=\"footer\" *ngIf=\"showFooter\">\n <div class=\"surface-100 px-4 py-2 flex justify-content-end gap-2\">\n <ng-content select=\"[ptDialogFooter]\"></ng-content>\n </div>\n </ng-template>\n</p-dialog>\n", styles: [":host ::ng-deep .pt-dialog-header-blue .p-dialog-header{background-color:#e0f2ff;border-bottom:0}:host ::ng-deep .pt-dialog-header-blue .p-dialog-footer{background-color:#f5f6f8!important;border-top:0!important}\n"] }]
70
- }], propDecorators: { header: [{
71
- type: Input
72
- }], style: [{
73
- type: Input
74
- }], styleClass: [{
75
- type: Input
76
- }], headerIconClass: [{
77
- type: Input
78
- }], bodyWidth: [{
79
- type: Input
80
- }], bodyHeight: [{
81
- type: Input
82
- }], bodyScrollable: [{
83
- type: Input
84
- }], showFooter: [{
85
- type: Input
86
- }], modal: [{
87
- type: Input
88
- }], closable: [{
89
- type: Input
90
- }], draggable: [{
91
- type: Input
92
- }], resizable: [{
93
- type: Input
94
- }], maximizable: [{
95
- type: Input
96
- }], dismissableMask: [{
97
- type: Input
98
- }], closeOnEscape: [{
99
- type: Input
100
- }], blockScroll: [{
101
- type: Input
102
- }], breakpoints: [{
103
- type: Input
104
- }], position: [{
105
- type: Input
106
- }], contentStyle: [{
78
+ args: [{ selector: 'pt-dialog', template: "<p-dialog\n [visible]=\"_internalVisible\"\n (visibleChange)=\"onInternalVisibleChange($event)\"\n [header]=\"config.header\"\n [modal]=\"config.modal\"\n [style]=\"config.style\"\n [breakpoints]=\"config.breakpoints\"\n [closable]=\"config.closable\"\n [draggable]=\"config.draggable\"\n [resizable]=\"config.resizable\"\n [maximizable]=\"config.maximizable\"\n [dismissableMask]=\"config.dismissableMask\"\n [closeOnEscape]=\"config.closeOnEscape\"\n [blockScroll]=\"config.blockScroll\"\n [position]=\"primePosition\"\n [contentStyle]=\"config.contentStyle\"\n [styleClass]=\"dialogStyleClass\"\n>\n <!-- HEADER -->\n <ng-template pTemplate=\"header\">\n <div\n class=\"flex align-items-center justify-content-between w-full px-4 pt-3 pb-2\"\n >\n <div class=\"flex align-items-center gap-2\">\n <i\n *ngIf=\"config.headerIconClass\"\n [ngClass]=\"config.headerIconClass\"\n ></i>\n <ng-content select=\"[ptDialogHeader]\"></ng-content>\n <span *ngIf=\"config.header\" class=\"font-bold text-lg\">\n {{ config.header }}\n </span>\n </div>\n </div>\n </ng-template>\n\n <!-- BODY -->\n <div\n class=\"surface-50 px-4 py-4 flex flex-column gap-3\"\n [ngStyle]=\"bodyStyle\"\n >\n <ng-content select=\"[ptDialogContent]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <!-- FOOTER -->\n <ng-template pTemplate=\"footer\" *ngIf=\"config.showFooter !== false\">\n <div class=\"surface-100 px-4 py-2 flex justify-content-end gap-2\">\n <ng-content select=\"[ptDialogFooter]\"></ng-content>\n </div>\n </ng-template>\n</p-dialog>\n", styles: [":host ::ng-deep .pt-dialog-header-blue .p-dialog-header{background-color:#e0f2ff;border-bottom:0}:host ::ng-deep .pt-dialog-header-blue .p-dialog-footer{background-color:#f5f6f8!important;border-top:0!important}\n"] }]
79
+ }], propDecorators: { config: [{
107
80
  type: Input
108
81
  }], visible: [{
109
82
  type: Input
110
83
  }], visibleChange: [{
111
84
  type: Output
112
85
  }] } });
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtZGlhbG9nL3B0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRpYWxvZy9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFrQnZFLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFpQkUseURBQXlEO1FBQ2hELG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBRS9CLGdEQUFnRDtRQUN2QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLFVBQUssR0FBRyxJQUFJLENBQUM7UUFDYixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixhQUFRLEdBQW1CLFFBQVEsQ0FBQztRQUc3Qyw2Q0FBNkM7UUFDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQVVQLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztLQXlDdkQ7SUFqREMsSUFDSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxDQUFVO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFJRCxzQ0FBc0M7SUFDdEMsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMLGtCQUFrQjtZQUNsQixVQUFVO1lBQ1YsaUJBQWlCO1lBQ2pCLHVCQUF1QixFQUFFLDJCQUEyQjtZQUNwRCxJQUFJLENBQUMsVUFBVTtTQUNoQjthQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLElBQUksU0FBUztRQUNYLE1BQU0sS0FBSyxHQUEyQixFQUFFLENBQUM7UUFFekMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUM3QixLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQzsrR0FqRlUsaUJBQWlCO21HQUFqQixpQkFBaUIsOG1CQ2xCOUIsNnBEQXdEQTs7NEZEdENhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxXQUFXOzhCQUtaLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBTUYsT0FBTztzQkFEVixLQUFLO2dCQVFJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG50eXBlIERpYWxvZ1Bvc2l0aW9uID1cbiAgfCAncmlnaHQnXG4gIHwgJ2xlZnQnXG4gIHwgJ2NlbnRlcidcbiAgfCAndG9wJ1xuICB8ICdib3R0b20nXG4gIHwgJ3RvcGxlZnQnXG4gIHwgJ3RvcHJpZ2h0J1xuICB8ICdib3R0b21sZWZ0J1xuICB8ICdib3R0b21yaWdodCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wdC1kaWFsb2cuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVERpYWxvZ0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGhlYWRlcj86IHN0cmluZztcbiAgQElucHV0KCkgc3R5bGU/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICBASW5wdXQoKSBzdHlsZUNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKiBPcHRpb25hbCBpY29uIGluIHRoZSBoZWFkZXIgKGUuZy4gXCJwaSBwaS1pbmZvLWNpcmNsZSB0ZXh0LWJsdWUtNTAwXCIpICovXG4gIEBJbnB1dCgpIGhlYWRlckljb25DbGFzcz86IHN0cmluZztcblxuICAvKiogT3B0aW9uYWwgYm9keSBtYXggd2lkdGggLyBoZWlnaHQgKGUuZy4gXCI1MDBweFwiLCBcIjYwdmhcIikgKi9cbiAgQElucHV0KCkgYm9keVdpZHRoPzogc3RyaW5nO1xuICBASW5wdXQoKSBib2R5SGVpZ2h0Pzogc3RyaW5nO1xuXG4gIC8qKiBFbmFibGUgc2Nyb2xsIHdoZW4gYm9keSBleGNlZWRzIGdpdmVuIGhlaWdodC93aWR0aCAqL1xuICBASW5wdXQoKSBib2R5U2Nyb2xsYWJsZSA9IHRydWU7XG5cbiAgLyoqIENvbnRyb2wgZm9vdGVyIHZpc2liaWxpdHkgKGRlZmF1bHQ6IHRydWUpICovXG4gIEBJbnB1dCgpIHNob3dGb290ZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIG1vZGFsID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xvc2FibGUgPSB0cnVlO1xuICBASW5wdXQoKSBkcmFnZ2FibGUgPSB0cnVlO1xuICBASW5wdXQoKSByZXNpemFibGUgPSB0cnVlO1xuICBASW5wdXQoKSBtYXhpbWl6YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNtaXNzYWJsZU1hc2sgPSBmYWxzZTtcbiAgQElucHV0KCkgY2xvc2VPbkVzY2FwZSA9IHRydWU7XG4gIEBJbnB1dCgpIGJsb2NrU2Nyb2xsID0gdHJ1ZTtcbiAgQElucHV0KCkgYnJlYWtwb2ludHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBASW5wdXQoKSBwb3NpdGlvbjogRGlhbG9nUG9zaXRpb24gPSAnY2VudGVyJztcbiAgQElucHV0KCkgY29udGVudFN0eWxlPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKiogaW50ZXJuYWwgdmlzaWJsZSBmbGFnIHVzZWQgYnkgcC1kaWFsb2cgKi9cbiAgX3Zpc2libGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgfVxuICBzZXQgdmlzaWJsZSh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fdmlzaWJsZSA9IHY7XG4gIH1cblxuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKiogRmluYWwgY2xhc3MgYXBwbGllZCB0byBwLWRpYWxvZyAqL1xuICBnZXQgZGlhbG9nU3R5bGVDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAnYm9yZGVyLXJvdW5kLTN4bCcsXG4gICAgICAnc2hhZG93LTYnLFxuICAgICAgJ292ZXJmbG93LWhpZGRlbicsXG4gICAgICAncHQtZGlhbG9nLWhlYWRlci1ibHVlJywgLy8gZm9yIGhlYWRlci9mb290ZXIgY29sb3JzXG4gICAgICB0aGlzLnN0eWxlQ2xhc3MsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKiBTdHlsZSBhcHBsaWVkIHRvIHRoZSBib2R5IHdyYXBwZXIgKi9cbiAgZ2V0IGJvZHlTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBzdHlsZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gICAgaWYgKHRoaXMuYm9keVdpZHRoKSB7XG4gICAgICBzdHlsZVsnbWF4LXdpZHRoJ10gPSB0aGlzLmJvZHlXaWR0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ib2R5SGVpZ2h0KSB7XG4gICAgICBzdHlsZVsnbWF4LWhlaWdodCddID0gdGhpcy5ib2R5SGVpZ2h0O1xuICAgICAgaWYgKHRoaXMuYm9keVNjcm9sbGFibGUpIHtcbiAgICAgICAgc3R5bGVbJ292ZXJmbG93LXknXSA9ICdhdXRvJztcbiAgICAgICAgc3R5bGVbJ292ZXJmbG93LXgnXSA9ICdhdXRvJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBvblNob3coKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBvbkhpZGUoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJfdmlzaWJsZVwiXG4gIFtoZWFkZXJdPVwiaGVhZGVyXCJcbiAgW21vZGFsXT1cIm1vZGFsXCJcbiAgW3N0eWxlXT1cInN0eWxlXCJcbiAgW2JyZWFrcG9pbnRzXT1cImJyZWFrcG9pbnRzXCJcbiAgW2Nsb3NhYmxlXT1cImNsb3NhYmxlXCJcbiAgW2RyYWdnYWJsZV09XCJkcmFnZ2FibGVcIlxuICBbcmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXG4gIFttYXhpbWl6YWJsZV09XCJtYXhpbWl6YWJsZVwiXG4gIFtkaXNtaXNzYWJsZU1hc2tdPVwiZGlzbWlzc2FibGVNYXNrXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwiY2xvc2VPbkVzY2FwZVwiXG4gIFtibG9ja1Njcm9sbF09XCJibG9ja1Njcm9sbFwiXG4gIFtwb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gIFtjb250ZW50U3R5bGVdPVwiY29udGVudFN0eWxlXCJcbiAgW3N0eWxlQ2xhc3NdPVwiZGlhbG9nU3R5bGVDbGFzc1wiXG4gIChvblNob3cpPVwib25TaG93KClcIlxuICAob25IaWRlKT1cIm9uSGlkZSgpXCJcbj5cbiAgPCEtLSBIRUFERVIgLS0+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctZnVsbCBweC00IHB0LTMgcGItMlwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDwhLS0gb3B0aW9uYWwgaWNvbiAtLT5cbiAgICAgICAgPGkgKm5nSWY9XCJoZWFkZXJJY29uQ2xhc3NcIiBbbmdDbGFzc109XCJoZWFkZXJJY29uQ2xhc3NcIj48L2k+XG5cbiAgICAgICAgPCEtLSBwcm9qZWN0ZWQgY3VzdG9tIGhlYWRlciAtLT5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3B0RGlhbG9nSGVhZGVyXVwiPjwvbmctY29udGVudD5cblxuICAgICAgICA8IS0tIGZhbGxiYWNrIGhlYWRlciB0ZXh0IC0tPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlclwiIGNsYXNzPVwiZm9udC1ib2xkIHRleHQtbGdcIj5cbiAgICAgICAgICB7eyBoZWFkZXIgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGNsb3NlIGljb24gZnJvbSBQcmltZU5HIChYKSBpcyByZW5kZXJlZCBhdXRvbWF0aWNhbGx5IC0tPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gQk9EWSAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwic3VyZmFjZS01MCBweC00IHB5LTQgZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiXG4gICAgW25nU3R5bGVdPVwiYm9keVN0eWxlXCJcbiAgPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwdERpYWxvZ0NvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBGT09URVIgKG9wdGlvbmFsKSAtLT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiICpuZ0lmPVwic2hvd0Zvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJzdXJmYWNlLTEwMCBweC00IHB5LTIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0yXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHREaWFsb2dGb290ZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtZGlhbG9nL3B0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRpYWxvZy9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFNdkUsTUFBTSxxQkFBcUIsR0FBbUI7SUFDNUMsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixlQUFlLEVBQUUsS0FBSztJQUN0QixhQUFhLEVBQUUsSUFBSTtJQUNuQixXQUFXLEVBQUUsSUFBSTtJQUNqQixjQUFjLEVBQUUsSUFBSTtJQUNwQixVQUFVLEVBQUUsSUFBSTtJQUNoQixRQUFRLEVBQUUsUUFBUTtDQUNuQixDQUFDO0FBT0YsTUFBTSxPQUFPLGlCQUFpQjtJQUw5QjtRQU1FLGtDQUFrQztRQUMxQixZQUFPLEdBQW1CLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1FBVS9ELG9FQUFvRTtRQUNwRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFXZixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7S0F5Q3ZEO0lBN0RDLElBQ0ksTUFBTSxDQUFDLEtBQWlDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFLRCxnQ0FBZ0M7SUFDaEMsSUFDSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLENBQVU7UUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBSUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMLGtCQUFrQjtZQUNsQixVQUFVO1lBQ1YsaUJBQWlCO1lBQ2pCLHVCQUF1QjtZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7U0FDdkI7YUFDRSxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQW1CLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3pDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsdUJBQXVCLENBQUMsQ0FBVTtRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7K0dBaEVVLGlCQUFpQjttR0FBakIsaUJBQWlCLGdKQ3pCOUIsd29EQW9EQTs7NEZEM0JhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxXQUFXOzhCQVNqQixNQUFNO3NCQURULEtBQUs7Z0JBYUYsT0FBTztzQkFEVixLQUFLO2dCQVFJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGlhbG9nUG9zaXRpb24sXG4gIFBURGlhbG9nQ29uZmlnLFxufSBmcm9tICcuLi9tb2RlbHMvcHQtZGlhbG9nLWNvbmZpZy5tb2RlbCc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0NPTkZJRzogUFREaWFsb2dDb25maWcgPSB7XG4gIG1vZGFsOiB0cnVlLFxuICBjbG9zYWJsZTogdHJ1ZSxcbiAgZHJhZ2dhYmxlOiB0cnVlLFxuICByZXNpemFibGU6IHRydWUsXG4gIG1heGltaXphYmxlOiBmYWxzZSxcbiAgZGlzbWlzc2FibGVNYXNrOiBmYWxzZSxcbiAgY2xvc2VPbkVzY2FwZTogdHJ1ZSxcbiAgYmxvY2tTY3JvbGw6IHRydWUsXG4gIGJvZHlTY3JvbGxhYmxlOiB0cnVlLFxuICBzaG93Rm9vdGVyOiB0cnVlLFxuICBwb3NpdGlvbjogJ2NlbnRlcicsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwdC1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtZGlhbG9nLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUFREaWFsb2dDb21wb25lbnQge1xuICAvKiogU2luZ2xlIGNvbmZpZ3VyYXRpb24gb2JqZWN0ICovXG4gIHByaXZhdGUgX2NvbmZpZzogUFREaWFsb2dDb25maWcgPSB7IC4uLkRFRkFVTFRfRElBTE9HX0NPTkZJRyB9O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjb25maWcodmFsdWU6IFBURGlhbG9nQ29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29uZmlnID0geyAuLi5ERUZBVUxUX0RJQUxPR19DT05GSUcsIC4uLih2YWx1ZSB8fCB7fSkgfTtcbiAgfVxuICBnZXQgY29uZmlnKCk6IFBURGlhbG9nQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgLy8gLS0tLSBJbnRlcm5hbCB2aXNpYmxlIHN0YXRlIChQVUJMSUMgc28gdGVtcGxhdGUgY2FuIHJlYWQgaXQpIC0tLS1cbiAgX2ludGVybmFsVmlzaWJsZSA9IGZhbHNlO1xuXG4gIC8qKiBJbnB1dCB2aXNpYmxlIGZyb20gcGFyZW50ICovXG4gIEBJbnB1dCgpXG4gIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbFZpc2libGU7XG4gIH1cbiAgc2V0IHZpc2libGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuX2ludGVybmFsVmlzaWJsZSA9IHY7XG4gIH1cblxuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBnZXQgZGlhbG9nU3R5bGVDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAnYm9yZGVyLXJvdW5kLTN4bCcsXG4gICAgICAnc2hhZG93LTYnLFxuICAgICAgJ292ZXJmbG93LWhpZGRlbicsXG4gICAgICAncHQtZGlhbG9nLWhlYWRlci1ibHVlJyxcbiAgICAgIHRoaXMuY29uZmlnLnN0eWxlQ2xhc3MsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBwcmltZVBvc2l0aW9uKCk6IERpYWxvZ1Bvc2l0aW9uIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLnBvc2l0aW9uID8/ICdjZW50ZXInKSBhcyBEaWFsb2dQb3NpdGlvbjtcbiAgfVxuXG4gIGdldCBib2R5U3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3Qgc3R5bGU6IGFueSA9IHt9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmJvZHlXaWR0aCkge1xuICAgICAgc3R5bGVbJ21heC13aWR0aCddID0gdGhpcy5jb25maWcuYm9keVdpZHRoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5ib2R5SGVpZ2h0KSB7XG4gICAgICBzdHlsZVsnbWF4LWhlaWdodCddID0gdGhpcy5jb25maWcuYm9keUhlaWdodDtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5ib2R5U2Nyb2xsYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgc3R5bGVbJ292ZXJmbG93LXknXSA9ICdhdXRvJztcbiAgICAgICAgc3R5bGVbJ292ZXJmbG93LXgnXSA9ICdhdXRvJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICAvKiogU3luYyA8cC1kaWFsb2c+IOKGkiBwYXJlbnQgKi9cbiAgb25JbnRlcm5hbFZpc2libGVDaGFuZ2UodjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2ludGVybmFsVmlzaWJsZSA9IHY7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodik7XG4gIH1cbn1cbiIsIjxwLWRpYWxvZ1xuICBbdmlzaWJsZV09XCJfaW50ZXJuYWxWaXNpYmxlXCJcbiAgKHZpc2libGVDaGFuZ2UpPVwib25JbnRlcm5hbFZpc2libGVDaGFuZ2UoJGV2ZW50KVwiXG4gIFtoZWFkZXJdPVwiY29uZmlnLmhlYWRlclwiXG4gIFttb2RhbF09XCJjb25maWcubW9kYWxcIlxuICBbc3R5bGVdPVwiY29uZmlnLnN0eWxlXCJcbiAgW2JyZWFrcG9pbnRzXT1cImNvbmZpZy5icmVha3BvaW50c1wiXG4gIFtjbG9zYWJsZV09XCJjb25maWcuY2xvc2FibGVcIlxuICBbZHJhZ2dhYmxlXT1cImNvbmZpZy5kcmFnZ2FibGVcIlxuICBbcmVzaXphYmxlXT1cImNvbmZpZy5yZXNpemFibGVcIlxuICBbbWF4aW1pemFibGVdPVwiY29uZmlnLm1heGltaXphYmxlXCJcbiAgW2Rpc21pc3NhYmxlTWFza109XCJjb25maWcuZGlzbWlzc2FibGVNYXNrXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwiY29uZmlnLmNsb3NlT25Fc2NhcGVcIlxuICBbYmxvY2tTY3JvbGxdPVwiY29uZmlnLmJsb2NrU2Nyb2xsXCJcbiAgW3Bvc2l0aW9uXT1cInByaW1lUG9zaXRpb25cIlxuICBbY29udGVudFN0eWxlXT1cImNvbmZpZy5jb250ZW50U3R5bGVcIlxuICBbc3R5bGVDbGFzc109XCJkaWFsb2dTdHlsZUNsYXNzXCJcbj5cbiAgPCEtLSBIRUFERVIgLS0+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctZnVsbCBweC00IHB0LTMgcGItMlwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcuaGVhZGVySWNvbkNsYXNzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJjb25maWcuaGVhZGVySWNvbkNsYXNzXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3B0RGlhbG9nSGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuaGVhZGVyXCIgY2xhc3M9XCJmb250LWJvbGQgdGV4dC1sZ1wiPlxuICAgICAgICAgIHt7IGNvbmZpZy5oZWFkZXIgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBCT0RZIC0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzdXJmYWNlLTUwIHB4LTQgcHktNCBmbGV4IGZsZXgtY29sdW1uIGdhcC0zXCJcbiAgICBbbmdTdHlsZV09XCJib2R5U3R5bGVcIlxuICA+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3B0RGlhbG9nQ29udGVudF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cblxuICA8IS0tIEZPT1RFUiAtLT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiICpuZ0lmPVwiY29uZmlnLnNob3dGb290ZXIgIT09IGZhbHNlXCI+XG4gICAgPGRpdiBjbGFzcz1cInN1cmZhY2UtMTAwIHB4LTQgcHktMiBmbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTJcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwdERpYWxvZ0Zvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuIl19