UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

344 lines 32.4 kB
/** * @fileoverview added by tsickle * Generated from: resizeable.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Renderer, Renderer2, Directive, ElementRef, HostListener, Input, Output, EventEmitter, HostBinding, NgZone } from '@angular/core'; import { fromEvent } from 'rxjs'; var ResizeableDirective = /** @class */ (function () { function ResizeableDirective(element, renderer, renderer2, zone) { var _this = this; this.renderer = renderer; this.renderer2 = renderer2; this.zone = zone; this.resizeEnabledClass = 'resizeEnabled'; this.resizeEnabled = true; this.resize = new EventEmitter(); this.beginResize = new EventEmitter(); this.resizingEvent = new EventEmitter(); this.resizing = false; this.bindMousemove = (/** * @param {?} e * @return {?} */ function (e) { _this.move(e); }); this.element = element.nativeElement; } /** * @return {?} */ ResizeableDirective.prototype.ngAfterViewInit = /** * @return {?} */ function () { if (this.resizeEnabled && !this.unresizable) { /** @type {?} */ var node = this.renderer.createElement(this.element, 'span'); this.renderer.setElementClass(node, 'resize-handle', true); this.renderer.attachViewAfter(this.element, node); this.resizeNodeEvent = this.renderer.listen(node, 'click', (/** * @param {?} event * @return {?} */ function (event) { return event.stopPropagation(); })); } }; /** * @return {?} */ ResizeableDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this._destroySubscription(); if (this.resizeNodeEvent) { this.resizeNodeEvent(); } }; /** * @param {?} event * @return {?} */ ResizeableDirective.prototype.onMouseup = /** * @param {?} event * @return {?} */ function (event) { var _this = this; this.zone.run((/** * @return {?} */ function () { /** @type {?} */ var movementX = event.clientX - _this.mouseDownScreenX; /** @type {?} */ var newWidth = _this.initialWidth + movementX; /** @type {?} */ var finalWidth = _this.getFinalWidth(newWidth); _this.setElementWidth(finalWidth); _this.resizing = false; // destroy overlay _this.renderer.detachView([_this.resizeOverlay]); // this.renderer.destroyView(this.element, [this.resizeOverlay]); _this.renderer2.removeChild(_this.element, _this.resizeOverlay); _this.renderer.setElementClass(_this.tableViewRefElement.nativeElement, 'table-view-selector', false); _this.renderer.setElementClass(_this.element, 'hover-bg', false); _this.renderer.setElementStyle(_this.resizeBarRefElement.nativeElement, 'display', 'none'); _this.resize.emit({ width: finalWidth, nextElementWidth: _this.nextElementWidth }); })); if (this.subscription && !this.subscription.closed) { this._destroySubscription(); } window.document.removeEventListener('mousemove', this.bindMousemove); }; /** * @param {?} event * @return {?} */ ResizeableDirective.prototype.onMousedown = /** * @param {?} event * @return {?} */ function (event) { var _this = this; this.moveCount = 0; /** @type {?} */ var isHandle = ((/** @type {?} */ ((event.target)))).classList.contains('resize-handle'); if (isHandle && !this.unresizable) { this.beginResize.emit(event); // emit begin resize event this.initialWidth = this.element.clientWidth; /** @type {?} */ var initialOffset = this.element.offsetLeft; this.mouseDownScreenX = event.clientX; event.stopPropagation(); this.nextElement = this.element.nextElementSibling; this.resizing = true; this.totalWidth = this.nextElement ? this.initialWidth + this.nextElement.clientWidth : this.initialWidth; // create resizeOverlay this.resizeOverlay = this.renderer.createElement(this.element, 'div'); this.renderer.setElementClass(this.resizeOverlay, 'resize-overlay', true); this.renderer.listen(this.resizeOverlay, 'click', (/** * @param {?} clickEvent * @return {?} */ function (clickEvent) { return clickEvent.stopPropagation(); })); this.renderer.setElementClass(this.tableViewRefElement.nativeElement, 'table-view-selector', true); this.renderer.setElementStyle(this.resizeBarRefElement.nativeElement, 'display', 'block'); this.renderer.setElementStyle(this.resizeBarRefElement.nativeElement, 'left', (initialOffset + this.initialWidth) + 'px'); this.renderer.setElementClass(this.element, 'hover-bg', true); /** @type {?} */ var mouseup = fromEvent(document, 'mouseup'); this.subscription = mouseup .subscribe((/** * @param {?} ev * @return {?} */ function (ev) { return _this.onMouseup(ev); })); this.zone.runOutsideAngular((/** * @return {?} */ function () { window.document.addEventListener('mousemove', _this.bindMousemove); })); } }; /** * @param {?} event * @return {?} */ ResizeableDirective.prototype.move = /** * @param {?} event * @return {?} */ function (event) { this.moveCount++; if (this.moveCount % 2 === 0) { return; } /** @type {?} */ var movementX = event.clientX - this.mouseDownScreenX; /** @type {?} */ var newWidth = this.initialWidth + movementX; /** @type {?} */ var finalWidth = this.getFinalWidth(newWidth); this.setElementWidth(finalWidth); this.renderer.setElementStyle(this.resizeBarRefElement.nativeElement, 'left', finalWidth + this.element.offsetLeft + "px"); this.resizingEvent.emit({ width: finalWidth, nextElementWidth: this.nextElementWidth }); }; /** * @private * @param {?} finalWidth * @return {?} */ ResizeableDirective.prototype.setElementWidth = /** * @private * @param {?} finalWidth * @return {?} */ function (finalWidth) { if (this.nextElement) { this.renderer.setElementStyle(this.nextElement, 'width', this.nextElementWidth + "px"); } this.renderer.setElementStyle(this.element, 'width', finalWidth + "px"); }; /** * @private * @param {?} newWidth * @return {?} */ ResizeableDirective.prototype.getFinalWidth = /** * @private * @param {?} newWidth * @return {?} */ function (newWidth) { /** @type {?} */ var minWidth = this.handleWidth(this.minWidth); /** @type {?} */ var maxWidth = this.handleWidth(this.maxWidth); /** @type {?} */ var overMinWidth = !this.minWidth || newWidth >= minWidth; /** @type {?} */ var underMaxWidth = !this.maxWidth || newWidth <= maxWidth; /** @type {?} */ var finalWidth = !overMinWidth ? minWidth : (!underMaxWidth ? maxWidth : newWidth); if (this.nextElement) { /** @type {?} */ var nextWidth = this.totalWidth - finalWidth; /** @type {?} */ var nMinWidth = this.handleWidth(this.nextElement.getAttribute('minWidth')); this.nextElementWidth = (!nMinWidth || nextWidth >= nMinWidth) ? nextWidth : nMinWidth; finalWidth = this.totalWidth - this.nextElementWidth; } return finalWidth; }; /** * @private * @param {?} width * @return {?} */ ResizeableDirective.prototype.handleWidth = /** * @private * @param {?} width * @return {?} */ function (width) { if (!width) { return; } if (typeof width === 'number') { return width; } if (width.includes('%')) { /** @type {?} */ var tableWidth = this.tableViewRefElement.nativeElement.clientWidth; return tableWidth * parseInt(width, 10) / 100; } return parseInt(width.replace(/[^\d]+/, ''), 10); }; /** * @private * @return {?} */ ResizeableDirective.prototype._destroySubscription = /** * @private * @return {?} */ function () { if (this.subscription) { this.subscription.unsubscribe(); this.subscription = undefined; } }; ResizeableDirective.decorators = [ { type: Directive, args: [{ selector: '[dResizeable]' },] } ]; /** @nocollapse */ ResizeableDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer }, { type: Renderer2 }, { type: NgZone } ]; }; ResizeableDirective.propDecorators = { resizeEnabledClass: [{ type: HostBinding, args: ['class.resizeable',] }], resizeEnabled: [{ type: Input }], unresizable: [{ type: Input }], minWidth: [{ type: HostBinding, args: ['attr.minWidth',] }, { type: Input }], maxWidth: [{ type: HostBinding, args: ['attr.maxWidth',] }, { type: Input }], resizeBarRefElement: [{ type: Input }], tableViewRefElement: [{ type: Input }], resize: [{ type: Output }], beginResize: [{ type: Output }], resizingEvent: [{ type: Output }], onMousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }] }; return ResizeableDirective; }()); export { ResizeableDirective }; if (false) { /** @type {?} */ ResizeableDirective.prototype.resizeEnabledClass; /** @type {?} */ ResizeableDirective.prototype.resizeEnabled; /** @type {?} */ ResizeableDirective.prototype.unresizable; /** @type {?} */ ResizeableDirective.prototype.minWidth; /** @type {?} */ ResizeableDirective.prototype.maxWidth; /** @type {?} */ ResizeableDirective.prototype.resizeBarRefElement; /** @type {?} */ ResizeableDirective.prototype.tableViewRefElement; /** @type {?} */ ResizeableDirective.prototype.resize; /** @type {?} */ ResizeableDirective.prototype.beginResize; /** @type {?} */ ResizeableDirective.prototype.resizingEvent; /** @type {?} */ ResizeableDirective.prototype.element; /** @type {?} */ ResizeableDirective.prototype.subscription; /** @type {?} */ ResizeableDirective.prototype.resizing; /** @type {?} */ ResizeableDirective.prototype.resizeNodeEvent; /** @type {?} */ ResizeableDirective.prototype.resizeOverlay; /** @type {?} */ ResizeableDirective.prototype.nextElement; /** @type {?} */ ResizeableDirective.prototype.moveCount; /** @type {?} */ ResizeableDirective.prototype.initialWidth; /** @type {?} */ ResizeableDirective.prototype.totalWidth; /** @type {?} */ ResizeableDirective.prototype.nextElementWidth; /** @type {?} */ ResizeableDirective.prototype.mouseDownScreenX; /** @type {?} */ ResizeableDirective.prototype.bindMousemove; /** * @type {?} * @private */ ResizeableDirective.prototype.renderer; /** * @type {?} * @private */ ResizeableDirective.prototype.renderer2; /** * @type {?} * @private */ ResizeableDirective.prototype.zone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRhLXRhYmxlLyIsInNvdXJjZXMiOlsicmVzaXplYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsV0FBVyxFQUFFLE1BQU0sRUFDdkksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0M7SUFnQ0ksNkJBQVksT0FBbUIsRUFBVSxRQUFrQixFQUFVLFNBQW9CLEVBQVUsSUFBWTtRQUEvRyxpQkFFQztRQUZ3QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUE1QjlFLHVCQUFrQixHQUFHLGVBQWUsQ0FBQztRQUM3RCxrQkFBYSxHQUFHLElBQUksQ0FBQztRQVlwQixXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0MsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwRCxrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hFLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFpR2pCLGtCQUFhOzs7O1FBQUcsVUFBQyxDQUFDO1lBQ2QsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLEVBQUE7UUF4RkcsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7Ozs7SUFFRCw2Q0FBZTs7O0lBQWY7UUFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFOztnQkFDbkMsSUFBSSxH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LEdBQUcsU0FBUyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQzs7Z0JBbkxKLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtpQkFDMUI7Ozs7Z0JBTG1DLFVBQVU7Z0JBQTFDLFFBQVE7Z0JBQUUsU0FBUztnQkFBMkcsTUFBTTs7O3FDQU9uSSxXQUFXLFNBQUMsa0JBQWtCO2dDQUM5QixLQUFLOzhCQUVMLEtBQUs7MkJBRUwsV0FBVyxTQUFDLGVBQWUsY0FDM0IsS0FBSzsyQkFFTCxXQUFXLFNBQUMsZUFBZSxjQUMzQixLQUFLO3NDQUNMLEtBQUs7c0NBQ0wsS0FBSzt5QkFFTCxNQUFNOzhCQUNOLE1BQU07Z0NBQ04sTUFBTTs4QkE2RE4sWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7SUFvR3pDLDBCQUFDO0NBQUEsQUFwTEQsSUFvTEM7U0FqTFksbUJBQW1COzs7SUFDNUIsaURBQXNFOztJQUN0RSw0Q0FBOEI7O0lBRTlCLDBDQUE4Qjs7SUFFOUIsdUNBQ21DOztJQUVuQyx1Q0FDbUM7O0lBQ25DLGtEQUF5Qzs7SUFDekMsa0RBQXlDOztJQUV6QyxxQ0FBeUQ7O0lBQ3pELDBDQUE4RDs7SUFDOUQsNENBQWdFOztJQUNoRSxzQ0FBcUI7O0lBQ3JCLDJDQUEyQjs7SUFDM0IsdUNBQWlCOztJQUNqQiw4Q0FBcUI7O0lBQ3JCLDRDQUEyQjs7SUFFM0IsMENBQWlCOztJQUNqQix3Q0FBa0I7O0lBQ2xCLDJDQUFxQjs7SUFDckIseUNBQW1COztJQUNuQiwrQ0FBeUI7O0lBQ3pCLCtDQUF5Qjs7SUF3RnpCLDRDQUVDOzs7OztJQXpGZ0MsdUNBQTBCOzs7OztJQUFFLHdDQUE0Qjs7Ozs7SUFBRSxtQ0FBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgUmVuZGVyZXIsIFJlbmRlcmVyMiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBIb3N0QmluZGluZywgTmdab25lXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2RSZXNpemVhYmxlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlc2l6ZWFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5yZXNpemVhYmxlJykgcmVzaXplRW5hYmxlZENsYXNzID0gJ3Jlc2l6ZUVuYWJsZWQnO1xyXG4gICAgQElucHV0KCkgcmVzaXplRW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgdW5yZXNpemFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLm1pbldpZHRoJylcclxuICAgIEBJbnB1dCgpIG1pbldpZHRoOiBzdHJpbmcgfCBudW1iZXI7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLm1heFdpZHRoJylcclxuICAgIEBJbnB1dCgpIG1heFdpZHRoOiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgICBASW5wdXQoKSByZXNpemVCYXJSZWZFbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gICAgQElucHV0KCkgdGFibGVWaWV3UmVmRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAT3V0cHV0KCkgcmVzaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBiZWdpblJlc2l6ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVzaXppbmdFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgcmVzaXppbmcgPSBmYWxzZTtcclxuICAgIHJlc2l6ZU5vZGVFdmVudDogYW55O1xyXG4gICAgcmVzaXplT3ZlcmxheTogSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyByZXNpemVCYXJOb2RlOiBIVE1MU3BhbkVsZW1lbnQ7XHJcbiAgICBuZXh0RWxlbWVudDogYW55O1xyXG4gICAgbW92ZUNvdW50OiBudW1iZXI7XHJcbiAgICBpbml0aWFsV2lkdGg6IG51bWJlcjtcclxuICAgIHRvdGFsV2lkdGg6IG51bWJlcjtcclxuICAgIG5leHRFbGVtZW50V2lkdGg6IG51bWJlcjtcclxuICAgIG1vdXNlRG93blNjcmVlblg6IG51bWJlcjtcclxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyLCBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplRW5hYmxlZCAmJiAhdGhpcy51bnJlc2l6YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRoaXMuZWxlbWVudCwgJ3NwYW4nKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3Mobm9kZSwgJ3Jlc2l6ZS1oYW5kbGUnLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hdHRhY2hWaWV3QWZ0ZXIodGhpcy5lbGVtZW50LCBub2RlKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVOb2RlRXZlbnQgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbihub2RlLCAnY2xpY2snLCAoZXZlbnQpID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGVzdHJveVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZU5vZGVFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU5vZGVFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk1vdXNldXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbW92ZW1lbnRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMubW91c2VEb3duU2NyZWVuWDtcclxuICAgICAgICAgICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLmluaXRpYWxXaWR0aCArIG1vdmVtZW50WDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsV2lkdGggPSB0aGlzLmdldEZpbmFsV2lkdGgobmV3V2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEVsZW1lbnRXaWR0aChmaW5hbFdpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gZGVzdHJveSBvdmVybGF5XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGV0YWNoVmlldyhbdGhpcy5yZXNpemVPdmVybGF5XSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMucmVuZGVyZXIuZGVzdHJveVZpZXcodGhpcy5lbGVtZW50LCBbdGhpcy5yZXNpemVPdmVybGF5XSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCwgdGhpcy5yZXNpemVPdmVybGF5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMudGFibGVWaWV3UmVmRWxlbWVudC5uYXRpdmVFbGVtZW50LCAndGFibGUtdmlldy1zZWxlY3RvcicsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMuZWxlbWVudCwgJ2hvdmVyLWJnJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLnJlc2l6ZUJhclJlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXNpemUuZW1pdCh7d2lkdGg6IGZpbmFsV2lkdGgsIG5leHRFbGVtZW50V2lkdGg6IHRoaXMubmV4dEVsZW1lbnRXaWR0aH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbiAmJiAhdGhpcy5zdWJzY3JpcHRpb24uY2xvc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRNb3VzZW1vdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlZG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubW92ZUNvdW50ID0gMDtcclxuICAgICAgICBjb25zdCBpc0hhbmRsZSA9ICg8SFRNTEVsZW1lbnQ+KGV2ZW50LnRhcmdldCkpLmNsYXNzTGlzdC5jb250YWlucygncmVzaXplLWhhbmRsZScpO1xyXG5cclxuICAgICAgICBpZiAoaXNIYW5kbGUgJiYgIXRoaXMudW5yZXNpemFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5iZWdpblJlc2l6ZS5lbWl0KGV2ZW50KTsgLy8gZW1pdCBiZWdpbiByZXNpemUgZXZlbnRcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFdpZHRoID0gdGhpcy5lbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsT2Zmc2V0ID0gdGhpcy5lbGVtZW50Lm9mZnNldExlZnQ7XHJcbiAgICAgICAgICAgIHRoaXMubW91c2VEb3duU2NyZWVuWCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLm5leHRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcclxuICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxXaWR0aCA9IHRoaXMubmV4dEVsZW1lbnQgPyB0aGlzLmluaXRpYWxXaWR0aCArIHRoaXMubmV4dEVsZW1lbnQuY2xpZW50V2lkdGggOiB0aGlzLmluaXRpYWxXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSByZXNpemVPdmVybGF5XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplT3ZlcmxheSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0aGlzLmVsZW1lbnQsICdkaXYnKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5yZXNpemVPdmVybGF5LCAncmVzaXplLW92ZXJsYXknLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5yZXNpemVPdmVybGF5LCAnY2xpY2snLCAoY2xpY2tFdmVudDogRXZlbnQpID0+IGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy50YWJsZVZpZXdSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0YWJsZS12aWV3LXNlbGVjdG9yJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLnJlc2l6ZUJhclJlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUodGhpcy5yZXNpemVCYXJSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JyxcclxuICAgICAgICAgICAgICAgIChpbml0aWFsT2Zmc2V0ICsgdGhpcy5pbml0aWFsV2lkdGgpICsgJ3B4Jyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmVsZW1lbnQsICdob3Zlci1iZycsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbW91c2V1cCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBtb3VzZXVwXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbk1vdXNldXAoZXYpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5iaW5kTW91c2Vtb3ZlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJpbmRNb3VzZW1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubW92ZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tb3ZlQ291bnQrKztcclxuICAgICAgICBpZiAodGhpcy5tb3ZlQ291bnQgJSAyID09PSAwICkgeyAgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vdmVtZW50WCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLm1vdXNlRG93blNjcmVlblg7XHJcbiAgICAgICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLmluaXRpYWxXaWR0aCArIG1vdmVtZW50WDtcclxuXHJcbiAgICAgICAgY29uc3QgZmluYWxXaWR0aCA9IHRoaXMuZ2V0RmluYWxXaWR0aChuZXdXaWR0aCk7XHJcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50V2lkdGgoZmluYWxXaWR0aCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUodGhpcy5yZXNpemVCYXJSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7ZmluYWxXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRMZWZ0fXB4YCk7XHJcbiAgICAgICAgdGhpcy5yZXNpemluZ0V2ZW50LmVtaXQoeyB3aWR0aDogZmluYWxXaWR0aCwgbmV4dEVsZW1lbnRXaWR0aDogdGhpcy5uZXh0RWxlbWVudFdpZHRoIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RWxlbWVudFdpZHRoKGZpbmFsV2lkdGg6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLm5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudFN0eWxlKHRoaXMubmV4dEVsZW1lbnQsICd3aWR0aCcsIGAke3RoaXMubmV4dEVsZW1lbnRXaWR0aH1weGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLmVsZW1lbnQsICd3aWR0aCcsIGAke2ZpbmFsV2lkdGh9cHhgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZpbmFsV2lkdGgobmV3V2lkdGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB0aGlzLmhhbmRsZVdpZHRoKHRoaXMubWluV2lkdGgpO1xyXG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5oYW5kbGVXaWR0aCh0aGlzLm1heFdpZHRoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3Zlck1pbldpZHRoID0gIXRoaXMubWluV2lkdGggfHwgbmV3V2lkdGggPj0gbWluV2lkdGg7XHJcbiAgICAgICAgY29uc3QgdW5kZXJNYXhXaWR0aCA9ICF0aGlzLm1heFdpZHRoIHx8IG5ld1dpZHRoIDw9IG1heFdpZHRoO1xyXG5cclxuICAgICAgICBsZXQgZmluYWxXaWR0aCA9ICFvdmVyTWluV2lkdGggPyBtaW5XaWR0aCA6ICghdW5kZXJNYXhXaWR0aCA/IG1heFdpZHRoIDogbmV3V2lkdGgpO1xyXG4gICAgICAgIGlmICh0aGlzLm5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRXaWR0aCA9IHRoaXMudG90YWxXaWR0aCAtIGZpbmFsV2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IG5NaW5XaWR0aCA9IHRoaXMuaGFuZGxlV2lkdGgodGhpcy5uZXh0RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbldpZHRoJykpO1xyXG4gICAgICAgICAgICB0aGlzLm5leHRFbGVtZW50V2lkdGggPSAoIW5NaW5XaWR0aCB8fCBuZXh0V2lkdGggPj0gbk1pbldpZHRoKSA/IG5leHRXaWR0aCA6IG5NaW5XaWR0aDtcclxuICAgICAgICAgICAgZmluYWxXaWR0aCA9ICB0aGlzLnRvdGFsV2lkdGggLSB0aGlzLm5leHRFbGVtZW50V2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5hbFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlV2lkdGgod2lkdGg6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmICghd2lkdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICByZXR1cm4gd2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3aWR0aC5pbmNsdWRlcygnJScpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV2lkdGggPSB0aGlzLnRhYmxlVmlld1JlZkVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlV2lkdGggKiBwYXJzZUludCh3aWR0aCwgMTApIC8gMTAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQod2lkdGgucmVwbGFjZSgvW15cXGRdKy8sICcnKSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=