ngx-bootstrap-treeview
Version:
Ngx Bootstrap Treeview - Simple library to visualize, search and interact with tree data
175 lines • 17.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, Input, ElementRef, Renderer2, ViewChild, NgZone, Output, EventEmitter } from '@angular/core';
import { ContextMenuService } from '../../services/context-menu.service';
export class NgxBootstrapTreeviewContextMenuComponent {
/**
* @param {?} _renderer
* @param {?} _zone
* @param {?} _contextMenuService
*/
constructor(_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 {?}
*/
ngOnInit() {
this.config = Object.assign({}, this._defaultConfig, this.config);
this._contextMenuService.lastContextMenuEvent.subscribe((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 {?}
*/
ngOnChanges(changes) {
if ('config' in changes) {
this.config = Object.assign({}, this._defaultConfig, changes.config.currentValue);
}
}
/**
* @param {?} event
* @return {?}
*/
onDocumentClicked(event) {
if (this.lastContextMenuEvent) {
event.preventDefault();
event.stopPropagation();
this.hide();
}
}
/**
* @param {?} event
* @return {?}
*/
onKeyPressed(event) {
if (this.lastContextMenuEvent && event.key.toLowerCase() === 'escape') {
this.hide();
}
}
/**
* @return {?}
*/
getLabels() {
return this._activeMenu ? Object.keys(this._activeMenu) : [];
}
/**
* @param {?} label
* @return {?}
*/
onItemClicked(label) {
this._activeMenu[label](this.lastContextMenuEvent.target);
}
/**
* @return {?}
*/
hide() {
this._zone.run(() => {
this._activeMenu = null;
this.lastContextMenuEvent = null;
this.hidden.emit();
});
}
/**
* @param {?} contextMenuEvent
* @return {?}
*/
show(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 {?} */
const nativeElement = this.container.nativeElement;
/** @type {?} */
const x = this.lastContextMenuEvent.event.pageX.toString();
/** @type {?} */
const 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 = () => [
{ 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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJvb3RzdHJhcC10cmVldmlldy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULEtBQUssRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUdULFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVN6RSxNQUFNLE9BQU8sd0NBQXdDOzs7Ozs7SUFnQ2pELFlBQW9CLFNBQW9CLEVBQVUsS0FBYSxFQUFVLG1CQUF1QztRQUE1RixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUEvQnpHLG1CQUFjLEdBQTBDO1lBQzNELGNBQWMsRUFBRSxFQUFFO1lBQ2xCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsVUFBVSxFQUFFLEVBQUU7U0FDakIsQ0FBQztRQUdLLFdBQU0sR0FBMEMsRUFBRSxDQUFDO1FBR25ELG9CQUFlLEdBQTJDLElBQUksQ0FBQztRQUcvRCxzQkFBaUIsR0FBMkMsSUFBSSxDQUFDO1FBR2pFLG9CQUFlLEdBQTJDLElBQUksQ0FBQztRQUcvRCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUdsQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUtoQyxnQkFBVyxHQUEyQyxJQUFJLENBQUM7SUFJZ0QsQ0FBQzs7OztJQUVwSCxRQUFRO1FBQ0osSUFBSSxD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QUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTs7Y0FDcEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUUxRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7OztZQWhISixTQUFTLFNBQUM7O2dCQUVQLFFBQVEsRUFBRSxxQ0FBcUM7Z0JBQy9DLGlmQUFtRTs7YUFFdEU7Ozs7WUFsQkcsU0FBUztZQUlULE1BQU07WUFNRCxrQkFBa0I7OztxQkFnQnRCLEtBQUs7OEJBR0wsS0FBSztnQ0FHTCxLQUFLOzhCQUdMLEtBQUs7cUJBR0wsTUFBTTtvQkFHTixNQUFNO3dCQUdOLFNBQVMsU0FBQyxXQUFXOzs7O0lBeEJ0QixrRUFJRTs7SUFFRiwwREFDMEQ7O0lBRTFELG1FQUNzRTs7SUFFdEUscUVBQ3dFOztJQUV4RSxtRUFDc0U7O0lBRXRFLDBEQUN5Qzs7SUFFekMseURBQ3dDOztJQUV4Qyw2REFDNkM7O0lBRTdDLCtEQUFtRTs7SUFFbkUsd0VBQThDOztJQUVsQyw2REFBNEI7O0lBQUUseURBQXFCOztJQUFFLHVFQUErQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBPbkluaXQsXHJcbiAgICBJbnB1dCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgTmdab25lLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5neEJvb3RzdHJhcFRyZWV2aWV3Q29udGV4dE1lbnVDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUtYWN0aW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbnRleHQtbWVudS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9jb250ZXh0LW1lbnUtZXZlbnQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICduZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LWNvbnRleHQtbWVudScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIHB1YmxpYyBfZGVmYXVsdENvbmZpZzogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUNvbmZpZyA9IHtcclxuICAgICAgICBjb250YWluZXJDbGFzczogJycsXHJcbiAgICAgICAgaG92ZXJlZEl0ZW1DbGFzczogJycsXHJcbiAgICAgICAgaXRlbXNDbGFzczogJydcclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjb25maWc6IE5neEJvb3RzdHJhcFRyZWV2aWV3Q29udGV4dE1lbnVDb25maWcgPSB7fTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJvb3RDb250ZXh0TWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYnJhbmNoQ29udGV4dE1lbnU6IE5neEJvb3RzdHJhcFRyZWV2aWV3Q29udGV4dE1lbnVBY3Rpb25zID0gbnVsbDtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxlYWZDb250ZXh0TWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBzaG93biA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKVxyXG4gICAgcHVibGljIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gICAgcHJpdmF0ZSBfYWN0aXZlTWVudTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudUFjdGlvbnMgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBsYXN0Q29udGV4dE1lbnVFdmVudDogQ29udGV4dE1lbnVFdmVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIF96b25lOiBOZ1pvbmUsIHByaXZhdGUgX2NvbnRleHRNZW51U2VydmljZTogQ29udGV4dE1lbnVTZXJ2aWNlKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLl9kZWZhdWx0Q29uZmlnLCAuLi50aGlzLmNvbmZpZyB9O1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZXh0TWVudVNlcnZpY2UubGFzdENvbnRleHRNZW51RXZlbnQuc3Vic2NyaWJlKChsYXN0Q29udGV4dE1lbnVFdmVudDogQ29udGV4dE1lbnVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobGFzdENvbnRleHRNZW51RXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdyhsYXN0Q29udGV4dE1lbnVFdmVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5saXN0ZW4oZG9jdW1lbnQsICdjbGljay5vdXQtem9uZScsIHRoaXMub25Eb2N1bWVudENsaWNrZWQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIubGlzdGVuKGRvY3VtZW50LCAna2V5dXAub3V0LXpvbmUnLCB0aGlzLm9uS2V5UHJlc3NlZC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuX2RlZmF1bHRDb25maWcsIC4uLmNoYW5nZXMuY29uZmlnLmN1cnJlbnRWYWx1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Eb2N1bWVudENsaWNrZWQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uS2V5UHJlc3NlZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50ICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnZXNjYXBlJykge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVscygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZU1lbnUgPyBPYmplY3Qua2V5cyh0aGlzLl9hY3RpdmVNZW51KSA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkl0ZW1DbGlja2VkKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY3RpdmVNZW51W2xhYmVsXSh0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50LnRhcmdldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVNZW51ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnVFdmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZGRlbi5lbWl0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3coY29udGV4dE1lbnVFdmVudDogQ29udGV4dE1lbnVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQgPSBjb250ZXh0TWVudUV2ZW50O1xyXG5cclxuICAgICAgICBpZiAoIWNvbnRleHRNZW51RXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSB0aGlzLnJvb3RDb250ZXh0TWVudTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRNZW51RXZlbnQudGFyZ2V0LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSB0aGlzLmJyYW5jaENvbnRleHRNZW51O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZU1lbnUgPSB0aGlzLmxlYWZDb250ZXh0TWVudTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmxhc3RDb250ZXh0TWVudUV2ZW50LmV2ZW50LnBhZ2VYLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgeSA9IHRoaXMubGFzdENvbnRleHRNZW51RXZlbnQuZXZlbnQucGFnZVkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsIHkgKyAncHgnKTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIHggKyAncHgnKTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93bi5lbWl0KCk7XHJcbiAgICB9XHJcbn1cclxuIl19