UNPKG

ngx-bootstrap-treeview

Version:

Ngx Bootstrap Treeview - Simple library to visualize, search and interact with tree data

204 lines 18.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ElementRef, Renderer2, ViewChild, NgZone, Output, EventEmitter } from '@angular/core'; import { ContextMenuService } from '../../services/context-menu.service'; var NgxBootstrapTreeviewContextMenuComponent = /** @class */ (function () { function NgxBootstrapTreeviewContextMenuComponent(_renderer, _zone, _contextMenuService) { this._renderer = _renderer; this._zone = _zone; this._contextMenuService = _contextMenuService; this._defaultConfig = { containerClass: '', hoveredItemClass: '', itemsClass: '' }; this.config = {}; this.rootContextMenu = null; this.branchContextMenu = null; this.leafContextMenu = null; this.hidden = new EventEmitter(); this.shown = new EventEmitter(); this._activeMenu = null; } /** * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.config = tslib_1.__assign({}, this._defaultConfig, this.config); this._contextMenuService.lastContextMenuEvent.subscribe(function (lastContextMenuEvent) { if (lastContextMenuEvent) { _this.show(lastContextMenuEvent); } else { _this.hide(); } }); this._renderer.listen(document, 'click.out-zone', this.onDocumentClicked.bind(this)); this._renderer.listen(document, 'keyup.out-zone', this.onKeyPressed.bind(this)); }; /** * @param {?} changes * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if ('config' in changes) { this.config = tslib_1.__assign({}, this._defaultConfig, changes.config.currentValue); } }; /** * @param {?} event * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.onDocumentClicked = /** * @param {?} event * @return {?} */ function (event) { if (this.lastContextMenuEvent) { event.preventDefault(); event.stopPropagation(); this.hide(); } }; /** * @param {?} event * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.onKeyPressed = /** * @param {?} event * @return {?} */ function (event) { if (this.lastContextMenuEvent && event.key.toLowerCase() === 'escape') { this.hide(); } }; /** * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.getLabels = /** * @return {?} */ function () { return this._activeMenu ? Object.keys(this._activeMenu) : []; }; /** * @param {?} label * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.onItemClicked = /** * @param {?} label * @return {?} */ function (label) { this._activeMenu[label](this.lastContextMenuEvent.target); }; /** * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.hide = /** * @return {?} */ function () { var _this = this; this._zone.run(function () { _this._activeMenu = null; _this.lastContextMenuEvent = null; _this.hidden.emit(); }); }; /** * @param {?} contextMenuEvent * @return {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.show = /** * @param {?} contextMenuEvent * @return {?} */ function (contextMenuEvent) { this.lastContextMenuEvent = contextMenuEvent; if (!contextMenuEvent.target) { this._activeMenu = this.rootContextMenu; } else if (contextMenuEvent.target.children) { this._activeMenu = this.branchContextMenu; } else { this._activeMenu = this.leafContextMenu; } /** @type {?} */ var nativeElement = this.container.nativeElement; /** @type {?} */ var x = this.lastContextMenuEvent.event.pageX.toString(); /** @type {?} */ var y = this.lastContextMenuEvent.event.pageY.toString(); this._renderer.setStyle(nativeElement, 'top', y + 'px'); this._renderer.setStyle(nativeElement, 'left', x + 'px'); this.shown.emit(); }; NgxBootstrapTreeviewContextMenuComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line: component-selector selector: 'ngx-bootstrap-treeview-context-menu', template: "<div\r\n class=\"context-menu list-group\"\r\n [ngClass]=\"{ 'd-none': !lastContextMenuEvent, 'd-block': lastContextMenuEvent }\"\r\n #container\r\n>\r\n <button\r\n class=\"context-menu-item {{ config.itemsClass }}\"\r\n *ngFor=\"let label of getLabels()\"\r\n (click)=\"onItemClicked(label)\"\r\n [ngClass]=\"{ 'list-group-item list-group-item-action px-3': !config.itemsClass }\"\r\n >\r\n {{ label }}\r\n </button>\r\n</div>\r\n", styles: [".context-menu{background-color:#fff;border-radius:.25rem;left:0;position:fixed;top:0;z-index:100}.context-menu .context-menu-item{border-top-width:0;border-bottom-width:0;padding-top:.0625rem;padding-bottom:.0625rem;transition:background-color .3s}.context-menu .context-menu-item:first-of-type{padding-top:.125rem;border-top-width:1px}.context-menu .context-menu-item:last-of-type{padding-bottom:.125rem;border-bottom-width:1px}.context-menu .context-menu-item:hover{background:rgba(0,0,0,.8);color:#fff}"] }] } ]; /** @nocollapse */ NgxBootstrapTreeviewContextMenuComponent.ctorParameters = function () { return [ { type: Renderer2 }, { type: NgZone }, { type: ContextMenuService } ]; }; NgxBootstrapTreeviewContextMenuComponent.propDecorators = { config: [{ type: Input }], rootContextMenu: [{ type: Input }], branchContextMenu: [{ type: Input }], leafContextMenu: [{ type: Input }], hidden: [{ type: Output }], shown: [{ type: Output }], container: [{ type: ViewChild, args: ['container',] }] }; return NgxBootstrapTreeviewContextMenuComponent; }()); export { NgxBootstrapTreeviewContextMenuComponent }; if (false) { /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._defaultConfig; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.config; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.rootContextMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.branchContextMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.leafContextMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.hidden; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.shown; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.container; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._activeMenu; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype.lastContextMenuEvent; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._renderer; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._zone; /** @type {?} */ NgxBootstrapTreeviewContextMenuComponent.prototype._contextMenuService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJvb3RzdHJhcC10cmVldmlldy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFHVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHekU7SUFzQ0ksa0RBQW9CLFNBQW9CLEVBQVUsS0FBYSxFQUFVLG1CQUF1QztRQUE1RixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUEvQnpHLG1CQUFjLEdBQTBDO1lBQzNELGNBQWMsRUFBRSxFQUFFO1lBQ2xCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsVUFBVSxFQUFFLEVBQUU7U0FDakIsQ0FBQztRQUdLLFdBQU0sR0FBMEMsRUFBRSxDQUFDO1FBR25ELG9CQUFlLEdBQTJDLElBQUksQ0FBQztRQUcvRCxzQkFBaUIsR0FBMkMsSUFBSSxDQUFDO1FBR2pFLG9CQUFlLEdBQTJDLElBQUksQ0FBQztRQUcvRCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUdsQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUtoQyxnQkFBVyxHQUEyQyxJQUFJLENBQUM7SUFJZ0QsQ0FBQzs7OztJQUVwSCwyREFBUTs7O0lBQVI7UUFBQSxpQkFhQztRQVpHLElBQUksQ0FBQyxNQUFNLHdCQUFRLElBQUksQ0FBQyxjQUFjLEVBQUssSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsVUFBQyxvQkFBc0M7WUFDM0YsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsS0FBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNO2dCQUNILEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNmO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Ozs7O0lBRUQsOERBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQzlCLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSx3QkFBUSxJQUFJLENBQUMsY0FBYyxFQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFFLENBQUM7U0FDNUU7SUFDTCxDQUFDOzs7OztJQUVNLG9FQUFpQjs7OztJQUF4QixVQUF5QixLQUFZO1FBQ2pDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFeEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7SUFDTCxDQUFDOzs7OztJQUVNLCtEQUFZOzs7O0lBQW5CLFVBQW9CLEtBQW9CO1FBQ3BDLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFO1lBQ25FLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO0lBQ0wsQ0FBQzs7OztJQUVNLDREQUFTOzs7SUFBaEI7UUFDSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakUsQ0FBQzs7Ozs7SUFFTSxnRUFBYTs7OztJQUFwQixVQUFxQixLQUFhO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7Ozs7SUFFTSx1REFBSTs7O0lBQVg7UUFBQSxpQkFPQztRQU5HLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ1gsS0FBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsS0FBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUVqQyxLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7SUFFTSx1REFBSTs7OztJQUFYLFVBQVksZ0JBQWtDO1FBQzFDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUU3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUMzQzthQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUM3QzthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQzNDOztZQUVLLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWE7O1lBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7O1lBQ3BELENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7UUFFMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDOztnQkFoSEosU0FBUyxTQUFDOztvQkFFUCxRQUFRLEVBQUUscUNBQXFDO29CQUMvQyxpZkFBbUU7O2lCQUV0RTs7OztnQkFsQkcsU0FBUztnQkFJVCxNQUFNO2dCQU1ELGtCQUFrQjs7O3lCQWdCdEIsS0FBSztrQ0FHTCxLQUFLO29DQUdMLEtBQUs7a0NBR0wsS0FBSzt5QkFHTCxNQUFNO3dCQUdOLE1BQU07NEJBR04sU0FBUyxTQUFDLFdBQVc7O0lBa0YxQiwrQ0FBQztDQUFBLEFBakhELElBaUhDO1NBM0dZLHdDQUF3Qzs7O0lBQ2pELGtFQUlFOztJQUVGLDBEQUMwRDs7SUFFMUQsbUVBQ3NFOztJQUV0RSxxRUFDd0U7O0lBRXhFLG1FQUNzRTs7SUFFdEUsMERBQ3lDOztJQUV6Qyx5REFDd0M7O0lBRXhDLDZEQUM2Qzs7SUFFN0MsK0RBQW1FOztJQUVuRSx3RUFBOEM7O0lBRWxDLDZEQUE0Qjs7SUFBRSx5REFBcUI7O0lBQUUsdUVBQStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIE9uSW5pdCxcclxuICAgIElucHV0LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LWNvbnRleHQtbWVudS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51QWN0aW9ucyB9IGZyb20gJy4uLy4uL21vZGVscy9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LWNvbnRleHQtbWVudS1hY3Rpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29udGV4dC1tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb250ZXh0TWVudUV2ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbnRleHQtbWVudS1ldmVudC5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ25neC1ib290c3RyYXAtdHJlZXZpZXctY29udGV4dC1tZW51JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LWNvbnRleHQtbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LWNvbnRleHQtbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gICAgcHVibGljIF9kZWZhdWx0Q29uZmlnOiBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51Q29uZmlnID0ge1xyXG4gICAgICAgIGNvbnRhaW5lckNsYXNzOiAnJyxcclxuICAgICAgICBob3ZlcmVkSXRlbUNsYXNzOiAnJyxcclxuICAgICAgICBpdGVtc0NsYXNzOiAnJ1xyXG4gICAgfTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNvbmZpZzogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUNvbmZpZyA9IHt9O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcm9vdENvbnRleHRNZW51OiBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51QWN0aW9ucyA9IG51bGw7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBicmFuY2hDb250ZXh0TWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbGVhZkNvbnRleHRNZW51OiBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51QWN0aW9ucyA9IG51bGw7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgaGlkZGVuID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHNob3duID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpXHJcbiAgICBwdWJsaWMgY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgICBwcml2YXRlIF9hY3RpdmVNZW51OiBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51QWN0aW9ucyA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGxhc3RDb250ZXh0TWVudUV2ZW50OiBDb250ZXh0TWVudUV2ZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgX3pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBfY29udGV4dE1lbnVTZXJ2aWNlOiBDb250ZXh0TWVudVNlcnZpY2UpIHt9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuX2RlZmF1bHRDb25maWcsIC4uLnRoaXMuY29uZmlnIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRleHRNZW51U2VydmljZS5sYXN0Q29udGV4dE1lbnVFdmVudC5zdWJzY3JpYmUoKGxhc3RDb250ZXh0TWVudUV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXN0Q29udGV4dE1lbnVFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KGxhc3RDb250ZXh0TWVudUV2ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbihkb2N1bWVudCwgJ2NsaWNrLm91dC16b25lJywgdGhpcy5vbkRvY3VtZW50Q2xpY2tlZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5saXN0ZW4oZG9jdW1lbnQsICdrZXl1cC5vdXQtem9uZScsIHRoaXMub25LZXlQcmVzc2VkLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoJ2NvbmZpZycgaW4gY2hhbmdlcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5fZGVmYXVsdENvbmZpZywgLi4uY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRvY3VtZW50Q2xpY2tlZChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5sYXN0Q29udGV4dE1lbnVFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25LZXlQcmVzc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQgJiYgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICdlc2NhcGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TGFiZWxzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlTWVudSA/IE9iamVjdC5rZXlzKHRoaXMuX2FjdGl2ZU1lbnUpIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSXRlbUNsaWNrZWQobGFiZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZU1lbnVbbGFiZWxdKHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQudGFyZ2V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGlkZGVuLmVtaXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvdyhjb250ZXh0TWVudUV2ZW50OiBDb250ZXh0TWVudUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnVFdmVudCA9IGNvbnRleHRNZW51RXZlbnQ7XHJcblxyXG4gICAgICAgIGlmICghY29udGV4dE1lbnVFdmVudC50YXJnZXQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTWVudSA9IHRoaXMucm9vdENvbnRleHRNZW51O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dE1lbnVFdmVudC50YXJnZXQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTWVudSA9IHRoaXMuYnJhbmNoQ29udGV4dE1lbnU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlTWVudSA9IHRoaXMubGVhZkNvbnRleHRNZW51O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgeCA9IHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQuZXZlbnQucGFnZVgudG9TdHJpbmcoKTtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy5sYXN0Q29udGV4dE1lbnVFdmVudC5ldmVudC5wYWdlWS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAndG9wJywgeSArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgeCArICdweCcpO1xyXG5cclxuICAgICAgICB0aGlzLnNob3duLmVtaXQoKTtcclxuICAgIH1cclxufVxyXG4iXX0=