UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

91 lines 18.2 kB
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, inject, Input, Output, TemplateRef } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { HierarchyBarNodeIconDirective } from './hierarchy-bar-node/hierarchy-bar-node-icon.directive'; import { HierarchyBarService } from './hierarchy-bar.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "./hierarchy-bar-standard/hierarchy-bar-standard.component"; import * as i3 from "./hierarchy-bar-collapsed/hierarchy-bar-collapsed.component"; export class HierarchyBarComponent { /** Define the root node of the hierarchy bar */ set root(node) { this._hierarchyBar.setRootNode(node); } /** Define the selected node in the hierarchy bar */ set selected(node) { this._hierarchyBar.selectNode(node); } /** Provide a custom loading indicator */ set loadingIndicator(loadingIndicator) { this._hierarchyBar.loadingIndicator = loadingIndicator; } /** Provide a custom overflow template */ set overflowTemplate(overflowTemplate) { this._hierarchyBar.overflowTemplate = overflowTemplate; } /** Define the events that show the popover when interacting with the arrows */ set popoverShowTriggers(popoverShowTriggers) { this._hierarchyBar.popoverShowTriggers = popoverShowTriggers; } /** Define the events that hide the popover when interacting with the arrows */ set popoverHideTriggers(popoverHideTriggers) { this._hierarchyBar.popoverHideTriggers = popoverHideTriggers; } /** Define the aria label for the show siblings popover button */ set showSiblingsAriaLabel(label) { this._hierarchyBar.showSiblingsAriaLabel = label; } /** Allow a custom icon to be specified */ set icon(icon) { this._hierarchyBar.icon = icon; } constructor() { this._hierarchyBar = inject(HierarchyBarService); /** Define which presentational mode we should display */ this.mode = 'standard'; /** hierarchy bar as being readonly - default false */ this.readonly = false; /** Emit when the selected node changes */ this.selectedChange = new EventEmitter(); /** Unsubscribe from all subscriptions when component is destroyed */ this._onDestroy = new Subject(); // emit the latest selection value this._hierarchyBar.selection$.pipe(takeUntil(this._onDestroy)) .subscribe(selection => this.selectedChange.next(selection)); } ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: HierarchyBarComponent, selector: "ux-hierarchy-bar", inputs: { mode: "mode", readonly: "readonly", root: "root", selected: "selected", loadingIndicator: "loadingIndicator", overflowTemplate: "overflowTemplate", popoverShowTriggers: "popoverShowTriggers", popoverHideTriggers: "popoverHideTriggers", showSiblingsAriaLabel: "showSiblingsAriaLabel" }, outputs: { selectedChange: "selectedChange" }, queries: [{ propertyName: "icon", first: true, predicate: HierarchyBarNodeIconDirective, descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- Hierarchy Bar - Standard Layout -->\n@if (mode !== 'collapsed') {\n <ux-hierarchy-bar-standard [readonly]=\"readonly\" [mode]=\"mode\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-standard>\n}\n\n<!-- Hierarchy Bar - Collapsed Layout -->\n@if (mode === 'collapsed') {\n <ux-hierarchy-bar-collapsed [readonly]=\"readonly\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-collapsed>\n}\n\n<!-- We can only have one ng-content so this allows us to use it more than once -->\n<ng-template #leftAddons>\n <ng-content select=\"[uxHierarchyBarLeftAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #trailingAddons>\n <ng-content select=\"[uxHierarchyBarTrailingAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #rightAddons>\n <ng-content select=\"[uxHierarchyBarRightAddon]\"></ng-content>\n</ng-template>", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.HierarchyBarStandardComponent, selector: "ux-hierarchy-bar-standard", inputs: ["mode", "readonly"] }, { kind: "component", type: i3.HierarchyBarCollapsedComponent, selector: "ux-hierarchy-bar-collapsed", inputs: ["readonly"] }], viewProviders: [HierarchyBarService], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarComponent, decorators: [{ type: Component, args: [{ selector: 'ux-hierarchy-bar', changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [HierarchyBarService], template: "<!-- Hierarchy Bar - Standard Layout -->\n@if (mode !== 'collapsed') {\n <ux-hierarchy-bar-standard [readonly]=\"readonly\" [mode]=\"mode\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-standard>\n}\n\n<!-- Hierarchy Bar - Collapsed Layout -->\n@if (mode === 'collapsed') {\n <ux-hierarchy-bar-collapsed [readonly]=\"readonly\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-collapsed>\n}\n\n<!-- We can only have one ng-content so this allows us to use it more than once -->\n<ng-template #leftAddons>\n <ng-content select=\"[uxHierarchyBarLeftAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #trailingAddons>\n <ng-content select=\"[uxHierarchyBarTrailingAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #rightAddons>\n <ng-content select=\"[uxHierarchyBarRightAddon]\"></ng-content>\n</ng-template>" }] }], ctorParameters: () => [], propDecorators: { mode: [{ type: Input }], readonly: [{ type: Input }], root: [{ type: Input }], selected: [{ type: Input }], loadingIndicator: [{ type: Input }], overflowTemplate: [{ type: Input }], popoverShowTriggers: [{ type: Input }], popoverHideTriggers: [{ type: Input }], showSiblingsAriaLabel: [{ type: Input }], selectedChange: [{ type: Output }], icon: [{ type: ContentChild, args: [HierarchyBarNodeIconDirective, { read: TemplateRef, static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2h5LWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9oaWVyYXJjaHktYmFyL2hpZXJhcmNoeS1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaGllcmFyY2h5LWJhci9oaWVyYXJjaHktYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUksT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDdkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBVzlELE1BQU0sT0FBTyxxQkFBcUI7SUFTOUIsZ0RBQWdEO0lBQ2hELElBQWEsSUFBSSxDQUFDLElBQXNCO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsSUFBYSxRQUFRLENBQUMsSUFBc0I7UUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxJQUFhLGdCQUFnQixDQUFDLGdCQUFtQztRQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNELENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsSUFBYSxnQkFBZ0IsQ0FBQyxnQkFBbUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzRCxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLElBQWEsbUJBQW1CLENBQUMsbUJBQXFDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDakUsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxJQUFhLG1CQUFtQixDQUFDLG1CQUFxQztRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO0lBQ2pFLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsSUFBYSxxQkFBcUIsQ0FBQyxLQUFhO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFLRCwwQ0FBMEM7SUFDMUMsSUFDSSxJQUFJLENBQUMsSUFBMEM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFLRDtRQXZEaUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUU3RCx5REFBeUQ7UUFDaEQsU0FBSSxHQUFxQixVQUFVLENBQUM7UUFFN0Msc0RBQXNEO1FBQzdDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFxQ25DLDBDQUEwQztRQUNoQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBUWhFLHFFQUFxRTtRQUNwRCxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUk5QyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQWxFUSxxQkFBcUI7bUdBQXJCLHFCQUFxQixpYkFnRGhCLDZCQUE2QiwyQkFBVSxXQUFXLDZCQ2hFcEUsKzhDQStCYywwY0RqQkssQ0FBQyxtQkFBbUIsQ0FBQzs7NEZBRTNCLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFDSSxrQkFBa0IsbUJBRVgsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsQ0FBQyxtQkFBbUIsQ0FBQzt3REFNM0IsSUFBSTtzQkFBWixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSztnQkFLTyxRQUFRO3NCQUFwQixLQUFLO2dCQUtPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFLTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBS08sbUJBQW1CO3NCQUEvQixLQUFLO2dCQUtPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFLTyxxQkFBcUI7c0JBQWpDLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFJSCxJQUFJO3NCQURQLFlBQVk7dUJBQUMsNkJBQTZCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPdmVybGF5VHJpZ2dlciB9IGZyb20gJy4uL3Rvb2x0aXAvaW5kZXgnO1xuaW1wb3J0IHsgSGllcmFyY2h5QmFyTm9kZUljb25EaXJlY3RpdmUgfSBmcm9tICcuL2hpZXJhcmNoeS1iYXItbm9kZS9oaWVyYXJjaHktYmFyLW5vZGUtaWNvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGllcmFyY2h5QmFyU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2h5LWJhci5zZXJ2aWNlJztcbmltcG9ydCB7IEhpZXJhcmNoeUJhckljb25Db250ZXh0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2hpZXJhcmNoeS1iYXItbm9kZS1pY29uLWNvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEhpZXJhcmNoeUJhck5vZGUgfSBmcm9tICcuL2ludGVyZmFjZXMvaGllcmFyY2h5LWJhci1ub2RlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIaWVyYXJjaHlCYXJNb2RlLCBJSGllcmFjaHlCYXJDb21wb25lbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvaGllcmFyY2h5LWJhci5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3V4LWhpZXJhcmNoeS1iYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oaWVyYXJjaHktYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICB2aWV3UHJvdmlkZXJzOiBbSGllcmFyY2h5QmFyU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgSGllcmFyY2h5QmFyQ29tcG9uZW50IGltcGxlbWVudHMgSUhpZXJhY2h5QmFyQ29tcG9uZW50LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hpZXJhcmNoeUJhciA9IGluamVjdChIaWVyYXJjaHlCYXJTZXJ2aWNlKTtcblxuICAgIC8qKiBEZWZpbmUgd2hpY2ggcHJlc2VudGF0aW9uYWwgbW9kZSB3ZSBzaG91bGQgZGlzcGxheSAqL1xuICAgIEBJbnB1dCgpIG1vZGU6IEhpZXJhcmNoeUJhck1vZGUgPSAnc3RhbmRhcmQnO1xuXG4gICAgLyoqIGhpZXJhcmNoeSBiYXIgYXMgYmVpbmcgcmVhZG9ubHkgLSBkZWZhdWx0IGZhbHNlICovXG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBEZWZpbmUgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgaGllcmFyY2h5IGJhciAqL1xuICAgIEBJbnB1dCgpIHNldCByb290KG5vZGU6IEhpZXJhcmNoeUJhck5vZGUpIHtcbiAgICAgICAgdGhpcy5faGllcmFyY2h5QmFyLnNldFJvb3ROb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIC8qKiBEZWZpbmUgdGhlIHNlbGVjdGVkIG5vZGUgaW4gdGhlIGhpZXJhcmNoeSBiYXIgKi9cbiAgICBASW5wdXQoKSBzZXQgc2VsZWN0ZWQobm9kZTogSGllcmFyY2h5QmFyTm9kZSkge1xuICAgICAgICB0aGlzLl9oaWVyYXJjaHlCYXIuc2VsZWN0Tm9kZShub2RlKTtcbiAgICB9XG5cbiAgICAvKiogUHJvdmlkZSBhIGN1c3RvbSBsb2FkaW5nIGluZGljYXRvciAqL1xuICAgIEBJbnB1dCgpIHNldCBsb2FkaW5nSW5kaWNhdG9yKGxvYWRpbmdJbmRpY2F0b3I6IFRlbXBsYXRlUmVmPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5sb2FkaW5nSW5kaWNhdG9yID0gbG9hZGluZ0luZGljYXRvcjtcbiAgICB9XG5cbiAgICAvKiogUHJvdmlkZSBhIGN1c3RvbSBvdmVyZmxvdyB0ZW1wbGF0ZSAqL1xuICAgIEBJbnB1dCgpIHNldCBvdmVyZmxvd1RlbXBsYXRlKG92ZXJmbG93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5vdmVyZmxvd1RlbXBsYXRlID0gb3ZlcmZsb3dUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogRGVmaW5lIHRoZSBldmVudHMgdGhhdCBzaG93IHRoZSBwb3BvdmVyIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYXJyb3dzICovXG4gICAgQElucHV0KCkgc2V0IHBvcG92ZXJTaG93VHJpZ2dlcnMocG9wb3ZlclNob3dUcmlnZ2VyczogT3ZlcmxheVRyaWdnZXJbXSkge1xuICAgICAgICB0aGlzLl9oaWVyYXJjaHlCYXIucG9wb3ZlclNob3dUcmlnZ2VycyA9IHBvcG92ZXJTaG93VHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLyoqIERlZmluZSB0aGUgZXZlbnRzIHRoYXQgaGlkZSB0aGUgcG9wb3ZlciB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGFycm93cyAqL1xuICAgIEBJbnB1dCgpIHNldCBwb3BvdmVySGlkZVRyaWdnZXJzKHBvcG92ZXJIaWRlVHJpZ2dlcnM6IE92ZXJsYXlUcmlnZ2VyW10pIHtcbiAgICAgICAgdGhpcy5faGllcmFyY2h5QmFyLnBvcG92ZXJIaWRlVHJpZ2dlcnMgPSBwb3BvdmVySGlkZVRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8qKiBEZWZpbmUgdGhlIGFyaWEgbGFiZWwgZm9yIHRoZSBzaG93IHNpYmxpbmdzIHBvcG92ZXIgYnV0dG9uICovXG4gICAgQElucHV0KCkgc2V0IHNob3dTaWJsaW5nc0FyaWFMYWJlbChsYWJlbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5zaG93U2libGluZ3NBcmlhTGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICAvKiogRW1pdCB3aGVuIHRoZSBzZWxlY3RlZCBub2RlIGNoYW5nZXMgKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEhpZXJhcmNoeUJhck5vZGU+KCk7XG5cbiAgICAvKiogQWxsb3cgYSBjdXN0b20gaWNvbiB0byBiZSBzcGVjaWZpZWQgKi9cbiAgICBAQ29udGVudENoaWxkKEhpZXJhcmNoeUJhck5vZGVJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgc2V0IGljb24oaWNvbjogVGVtcGxhdGVSZWY8SGllcmFyY2h5QmFySWNvbkNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5pY29uID0gaWNvbjtcbiAgICB9XG5cbiAgICAvKiogVW5zdWJzY3JpYmUgZnJvbSBhbGwgc3Vic2NyaXB0aW9ucyB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgbGF0ZXN0IHNlbGVjdGlvbiB2YWx1ZVxuICAgICAgICB0aGlzLl9oaWVyYXJjaHlCYXIuc2VsZWN0aW9uJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShzZWxlY3Rpb24gPT4gdGhpcy5zZWxlY3RlZENoYW5nZS5uZXh0KHNlbGVjdGlvbikpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8IS0tIEhpZXJhcmNoeSBCYXIgLSBTdGFuZGFyZCBMYXlvdXQgLS0+XG5AaWYgKG1vZGUgIT09ICdjb2xsYXBzZWQnKSB7XG4gIDx1eC1oaWVyYXJjaHktYmFyLXN0YW5kYXJkIFtyZWFkb25seV09XCJyZWFkb25seVwiIFttb2RlXT1cIm1vZGVcIj5cbiAgICA8IS0tIEZvcndhcmQgdGhlIGNvbnRlbnQgdG8gdGhlIGNvcnJlY3QgbGF5b3V0IC0tPlxuICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJsZWZ0LWFkZG9uc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxlZnRBZGRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwidHJhaWxpbmctYWRkb25zXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidHJhaWxpbmdBZGRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwicmlnaHQtYWRkb25zXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmlnaHRBZGRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC91eC1oaWVyYXJjaHktYmFyLXN0YW5kYXJkPlxufVxuXG48IS0tIEhpZXJhcmNoeSBCYXIgLSBDb2xsYXBzZWQgTGF5b3V0IC0tPlxuQGlmIChtb2RlID09PSAnY29sbGFwc2VkJykge1xuICA8dXgtaGllcmFyY2h5LWJhci1jb2xsYXBzZWQgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCI+XG4gICAgPCEtLSBGb3J3YXJkIHRoZSBjb250ZW50IHRvIHRoZSBjb3JyZWN0IGxheW91dCAtLT5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwibGVmdC1hZGRvbnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWZ0QWRkb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cInRyYWlsaW5nLWFkZG9uc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRyYWlsaW5nQWRkb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cInJpZ2h0LWFkZG9uc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJpZ2h0QWRkb25zXCI+PC9uZy1jb250YWluZXI+XG4gIDwvdXgtaGllcmFyY2h5LWJhci1jb2xsYXBzZWQ+XG59XG5cbjwhLS0gV2UgY2FuIG9ubHkgaGF2ZSBvbmUgbmctY29udGVudCBzbyB0aGlzIGFsbG93cyB1cyB0byB1c2UgaXQgbW9yZSB0aGFuIG9uY2UgLS0+XG48bmctdGVtcGxhdGUgI2xlZnRBZGRvbnM+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlt1eEhpZXJhcmNoeUJhckxlZnRBZGRvbl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RyYWlsaW5nQWRkb25zPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbdXhIaWVyYXJjaHlCYXJUcmFpbGluZ0FkZG9uXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmlnaHRBZGRvbnM+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlt1eEhpZXJhcmNoeUJhclJpZ2h0QWRkb25dXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT4iXX0=