UNPKG

@hxui/angular

Version:

* * *

361 lines 34.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { ContentChild, Directive, ElementRef, EventEmitter, Input, Output, ViewContainerRef } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { DropdownConfig } from './dropdown.config'; import { DropdownMenuDirective } from './dropdown-menu.directive'; import { Subject } from 'rxjs/index'; import { TemplatePortal } from '@angular/cdk/portal'; import { Overlay } from '@angular/cdk/overlay'; export class DropdownDirective { /** * @param {?} _elementRef * @param {?} _viewContainerRef * @param {?} overlay * @param {?} _config */ constructor(_elementRef, _viewContainerRef, overlay, _config) { this._elementRef = _elementRef; this._viewContainerRef = _viewContainerRef; this.overlay = overlay; this._config = _config; this._destroyed = new Subject(); this.isOpen = false; this.placement = 'bottom'; this._autoClose = this._config.autoClose; this.isOpenChange = new EventEmitter(); this.onShown = new EventEmitter(); this.onHidden = new EventEmitter(); this.isDisabled = false; this.showDelay = this._config.showDelay; this.hideDelay = this._config.hideDelay; } /** * @param {?} value * @return {?} */ set autoClose(value) { this._autoClose = value; } /** * @return {?} */ get autoClose() { return this._autoClose; } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterContentInit() { } /** * @return {?} */ ngOnDestroy() { if (this._overlayRef) { this._overlayRef.dispose(); this._overlayRef = null; } this._destroyed.next(); this._destroyed.complete(); } /** * Toggles an element’s popover. This is considered a “manual” triggering of * the popover. * @param {?=} value * @return {?} */ toggle(value) { if (this.isOpen || value === false) { return this.hide(); } return this.show(); } /** * @param {?=} delay * @return {?} */ show(delay = this.showDelay) { if (this.isDisabled || this.isOpen) { return; } /** @type {?} */ const overlayRef = this._createOverlay(); this._detach(); overlayRef.attach(this._portal); this._setWidthsRelativeTo(overlayRef); this.isOpen = true; this.isOpenChange.emit(this.isOpen); this.onShown.emit(); } /** * @param {?=} delay * @return {?} */ hide(delay = this.hideDelay) { this._detach(); this.isOpen = false; this.isOpenChange.emit(this.isOpen); this.onHidden.emit(); } /** * @return {?} */ _createOverlay() { if (this._overlayRef) { return this._overlayRef; } this._portal = new TemplatePortal(this.menu.templateRef, this._viewContainerRef); /** @type {?} */ const positionStrategy = this.overlay .position() .flexibleConnectedTo(this._elementRef) .withFlexibleDimensions(false) .withDefaultOffsetX(0) .withPositions([ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' } ]) .withTransformOriginOn('.hxa-dropdown-control'); this._overlayRef = this.overlay.create({ positionStrategy: positionStrategy, panelClass: [ 'hxui-reset', 'hxa-dropdown-panel', 'is-open', this.minWidthRelativeTo ? 'is-fluid-min-width' : 'not-fuild-min-width' ], hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop' }); this._updatePosition(); this._overlayRef .detachments() .pipe(takeUntil(this._destroyed)) .subscribe(() => this._detach()); this._overlayRef.backdropClick().subscribe(() => this.hide()); /** @type {?} */ const position = (/** @type {?} */ (this._overlayRef.getConfig() .positionStrategy)); position.positionChanges.pipe(takeUntil(this._destroyed)).subscribe(pos => { if (pos.connectionPair.originX === 'start') { this.placement = 'left'; } else if (pos.connectionPair.originX === 'end') { this.placement = 'right'; } else if (pos.connectionPair.originY === 'top') { this.placement = 'top'; } else if (pos.connectionPair.originY === 'bottom') { this.placement = 'bottom'; } }); return this._overlayRef; } /** * @return {?} */ _detach() { if (this._overlayRef && this._overlayRef.hasAttached()) { this._overlayRef.detach(); } } /** * @param {?} overlayRef * @return {?} */ _setWidthsRelativeTo(overlayRef) { if (this.maxWidthRelativeTo && this.minWidthRelativeTo) { /** @type {?} */ const elem = document.getElementById(this.maxWidthRelativeTo); overlayRef.updateSize({ minWidth: elem.clientWidth, maxWidth: elem.clientWidth }); } else if (this.maxWidthRelativeTo) { /** @type {?} */ const elem = document.getElementById(this.maxWidthRelativeTo); overlayRef.updateSize({ maxWidth: elem.clientWidth }); } else if (this.minWidthRelativeTo) { /** @type {?} */ const elem = document.getElementById(this.minWidthRelativeTo); console.log(this.menu.templateRef); overlayRef.updateSize({ minWidth: elem.clientWidth }); } } /** * @return {?} */ _updatePosition() { /** @type {?} */ const position = (/** @type {?} */ ((/** @type {?} */ (this._overlayRef)).getConfig() .positionStrategy)); /** @type {?} */ const origin = this._getOrigin(); /** @type {?} */ const overlay = this._getOverlayPosition(); position.withPositions([ Object.assign({}, origin.main, overlay.main), Object.assign({}, origin.fallback, overlay.fallback) ]); } /** * Returns the origin position and a fallback position based on the user's position preference. * The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`). * @return {?} */ _getOrigin() { /** @type {?} */ const placement = this.placement; /** @type {?} */ let originPlacement; if (placement === 'top' || placement === 'bottom') { originPlacement = { originX: 'start', originY: placement === 'top' ? 'top' : 'bottom' }; } else if (placement === 'left') { originPlacement = { originX: 'start', originY: 'center' }; } else if (placement === 'right') { originPlacement = { originX: 'end', originY: 'center' }; } else { console.error('Position error', placement); } const { x, y } = this._invertPosition(originPlacement.originX, originPlacement.originY); return { main: originPlacement, fallback: { originX: x, originY: y } }; } /** * Returns the overlay position and a fallback position based on the user's preference * @return {?} */ _getOverlayPosition() { /** @type {?} */ const placement = this.placement; /** @type {?} */ let overlayPlacement; if (placement === 'top') { overlayPlacement = { overlayX: 'start', overlayY: 'bottom' }; } else if (placement === 'bottom') { overlayPlacement = { overlayX: 'start', overlayY: 'top' }; } else if (placement === 'left') { overlayPlacement = { overlayX: 'end', overlayY: 'center' }; } else if (placement === 'right') { overlayPlacement = { overlayX: 'start', overlayY: 'center' }; } else { console.error('Could not find a position', placement); } const { x, y } = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY); return { main: overlayPlacement, fallback: { overlayX: x, overlayY: y } }; } /** * @param {?} x * @param {?} y * @return {?} */ _invertPosition(x, y) { if (this.placement === 'top' || this.placement === 'bottom') { if (y === 'top') { y = 'bottom'; } else if (y === 'bottom') { y = 'top'; } } else { if (x === 'end') { x = 'start'; } else if (x === 'start') { x = 'end'; } } return { x, y }; } } DropdownDirective.decorators = [ { type: Directive, args: [{ selector: '[hxaDropdown],[hxDropdown]', exportAs: 'hx-dropdown, hxa-dropdown' },] }, ]; /** @nocollapse */ DropdownDirective.ctorParameters = () => [ { type: ElementRef }, { type: ViewContainerRef }, { type: Overlay }, { type: DropdownConfig } ]; DropdownDirective.propDecorators = { menu: [{ type: ContentChild, args: [DropdownMenuDirective,] }], placement: [{ type: Input }], autoClose: [{ type: Input }], isOpenChange: [{ type: Output }], onShown: [{ type: Output }], onHidden: [{ type: Output }], isDisabled: [{ type: Input }], showDelay: [{ type: Input }], hideDelay: [{ type: Input }], maxWidthRelativeTo: [{ type: Input }], minWidthRelativeTo: [{ type: Input }] }; if (false) { /** @type {?} */ DropdownDirective.prototype.menu; /** @type {?} */ DropdownDirective.prototype._overlayRef; /** @type {?} */ DropdownDirective.prototype._portal; /** @type {?} */ DropdownDirective.prototype._destroyed; /** @type {?} */ DropdownDirective.prototype.isOpen; /** @type {?} */ DropdownDirective.prototype.placement; /** @type {?} */ DropdownDirective.prototype._autoClose; /** @type {?} */ DropdownDirective.prototype.isOpenChange; /** @type {?} */ DropdownDirective.prototype.onShown; /** @type {?} */ DropdownDirective.prototype.onHidden; /** @type {?} */ DropdownDirective.prototype.isDisabled; /** @type {?} */ DropdownDirective.prototype.showDelay; /** @type {?} */ DropdownDirective.prototype.hideDelay; /** @type {?} */ DropdownDirective.prototype.maxWidthRelativeTo; /** @type {?} */ DropdownDirective.prototype.minWidthRelativeTo; /** @type {?} */ DropdownDirective.prototype._elementRef; /** @type {?} */ DropdownDirective.prototype._viewContainerRef; /** @type {?} */ DropdownDirective.prototype.overlay; /** @type {?} */ DropdownDirective.prototype._config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kcm9wZG93bi9kcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFJTCxZQUFZLEVBRVosU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBRVosS0FBSyxFQUtMLE1BQU0sRUFHTixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBRUwsT0FBTyxFQVFSLE1BQU0sc0JBQXNCLENBQUM7QUFTOUIsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7OztJQTBDNUIsWUFDVSxXQUF1QixFQUN2QixpQkFBbUMsRUFDcEMsT0FBZ0IsRUFDaEIsT0FBdUI7UUFIdEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBekNmLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFHdEIsY0FBUyxHQUF3QyxRQUFRLENBQUM7UUFFbEQsZUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBVWxDLGlCQUFZLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFbEUsWUFBTyxHQUFz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L0Isb0NBQWdDOztJQUNoQyx1Q0FBNEM7O0lBQzVDLG1DQUFzQjs7SUFFdEIsc0NBQzBEOztJQUUxRCx1Q0FBNEM7O0lBVTVDLHlDQUE0RTs7SUFFNUUsb0NBQStEOztJQUUvRCxxQ0FBZ0U7O0lBRWhFLHVDQUNtQjs7SUFFbkIsc0NBQ21DOztJQUVuQyxzQ0FDbUM7O0lBRW5DLCtDQUMyQjs7SUFFM0IsK0NBQzJCOztJQUd6Qix3Q0FBK0I7O0lBQy9CLDhDQUEyQzs7SUFDM0Msb0NBQXVCOztJQUN2QixvQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE5nWm9uZSxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRHJvcGRvd25Db25maWcgfSBmcm9tICcuL2Ryb3Bkb3duLmNvbmZpZyc7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudURpcmVjdGl2ZSB9IGZyb20gJy4vZHJvcGRvd24tbWVudS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9pbmRleCc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7XHJcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE92ZXJsYXksXHJcbiAgT3ZlcmxheVJlZixcclxuICBPdmVybGF5U2l6ZUNvbmZpZyxcclxuICBTY3JvbGxEaXNwYXRjaGVyLFxyXG4gIE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbixcclxuICBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uLFxyXG4gIEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxyXG4gIFZlcnRpY2FsQ29ubmVjdGlvblBvc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcbmltcG9ydCB7IERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi10b2dnbGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRHJvcGRvd25JdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi1pdGVtLmRpcmVjdGl2ZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1toeGFEcm9wZG93bl0sW2h4RHJvcGRvd25dJyxcclxuICBleHBvcnRBczogJ2h4LWRyb3Bkb3duLCBoeGEtZHJvcGRvd24nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBAQ29udGVudENoaWxkKERyb3Bkb3duTWVudURpcmVjdGl2ZSkgbWVudTogRHJvcGRvd25NZW51RGlyZWN0aXZlO1xyXG5cclxuICBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGw7XHJcbiAgcHJpdmF0ZSBfcG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwbGFjZW1lbnQ6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JvdHRvbSc7XHJcblxyXG4gIHByaXZhdGUgX2F1dG9DbG9zZSA9IHRoaXMuX2NvbmZpZy5hdXRvQ2xvc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgYXV0b0Nsb3NlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9hdXRvQ2xvc2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBhdXRvQ2xvc2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXV0b0Nsb3NlO1xyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIGlzT3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25TaG93bjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uSGlkZGVuOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzaG93RGVsYXkgPSB0aGlzLl9jb25maWcuc2hvd0RlbGF5O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhpZGVEZWxheSA9IHRoaXMuX2NvbmZpZy5oaWRlRGVsYXk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgbWF4V2lkdGhSZWxhdGl2ZVRvOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgbWluV2lkdGhSZWxhdGl2ZVRvOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwdWJsaWMgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHB1YmxpYyBfY29uZmlnOiBEcm9wZG93bkNvbmZpZ1xyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZXMgYW4gZWxlbWVudOKAmXMgcG9wb3Zlci4gVGhpcyBpcyBjb25zaWRlcmVkIGEg4oCcbWFudWFs4oCdIHRyaWdnZXJpbmcgb2ZcclxuICAgKiB0aGUgcG9wb3Zlci5cclxuICAgKi9cclxuICB0b2dnbGUodmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc09wZW4gfHwgdmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBzaG93KGRlbGF5OiBudW1iZXIgPSB0aGlzLnNob3dEZWxheSkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCB8fCB0aGlzLmlzT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoKTtcclxuICAgIHRoaXMuX2RldGFjaCgpO1xyXG4gICAgb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fcG9ydGFsKTtcclxuICAgIHRoaXMuX3NldFdpZHRoc1JlbGF0aXZlVG8ob3ZlcmxheVJlZik7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNPcGVuKTtcclxuICAgIHRoaXMub25TaG93bi5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBoaWRlKGRlbGF5OiBudW1iZXIgPSB0aGlzLmhpZGVEZWxheSkge1xyXG4gICAgdGhpcy5fZGV0YWNoKCk7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XHJcbiAgICB0aGlzLm9uSGlkZGVuLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXkoKTogT3ZlcmxheVJlZiB7XHJcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9wb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwoXHJcbiAgICAgIHRoaXMubWVudS50ZW1wbGF0ZVJlZixcclxuICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZlxyXG4gICAgKTtcclxuXHJcbiAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxyXG4gICAgICAucG9zaXRpb24oKVxyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9lbGVtZW50UmVmKVxyXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcclxuICAgICAgLndpdGhEZWZhdWx0T2Zmc2V0WCgwKVxyXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXHJcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9XHJcbiAgICAgIF0pXHJcbiAgICAgIC53aXRoVHJhbnNmb3JtT3JpZ2luT24oJy5oeGEtZHJvcGRvd24tY29udHJvbCcpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneTogcG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgcGFuZWxDbGFzczogW1xyXG4gICAgICAgICdoeHVpLXJlc2V0JyxcclxuICAgICAgICAnaHhhLWRyb3Bkb3duLXBhbmVsJyxcclxuICAgICAgICAnaXMtb3BlbicsXHJcbiAgICAgICAgdGhpcy5taW5XaWR0aFJlbGF0aXZlVG8gPyAnaXMtZmx1aWQtbWluLXdpZHRoJyA6ICdub3QtZnVpbGQtbWluLXdpZHRoJ1xyXG4gICAgICBdLFxyXG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLl9vdmVybGF5UmVmXHJcbiAgICAgIC5kZXRhY2htZW50cygpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2RldGFjaCgpKTtcclxuXHJcbiAgICB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlKCkpO1xyXG5cclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKVxyXG4gICAgICAucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgICBwb3NpdGlvbi5wb3NpdGlvbkNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKHBvcyA9PiB7XHJcbiAgICAgIGlmIChwb3MuY29ubmVjdGlvblBhaXIub3JpZ2luWCA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ2xlZnQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHBvcy5jb25uZWN0aW9uUGFpci5vcmlnaW5YID09PSAnZW5kJykge1xyXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ3JpZ2h0JztcclxuICAgICAgfSBlbHNlIGlmIChwb3MuY29ubmVjdGlvblBhaXIub3JpZ2luWSA9PT0gJ3RvcCcpIHtcclxuICAgICAgICB0aGlzLnBsYWNlbWVudCA9ICd0b3AnO1xyXG4gICAgICB9IGVsc2UgaWYgKHBvcy5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAnYm90dG9tJykge1xyXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ2JvdHRvbSc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGV0YWNoKCkge1xyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRXaWR0aHNSZWxhdGl2ZVRvKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYpIHtcclxuICAgIGlmICh0aGlzLm1heFdpZHRoUmVsYXRpdmVUbyAmJiB0aGlzLm1pbldpZHRoUmVsYXRpdmVUbykge1xyXG4gICAgICBjb25zdCBlbGVtOiBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tYXhXaWR0aFJlbGF0aXZlVG8pO1xyXG4gICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoe1xyXG4gICAgICAgIG1pbldpZHRoOiBlbGVtLmNsaWVudFdpZHRoLFxyXG4gICAgICAgIG1heFdpZHRoOiBlbGVtLmNsaWVudFdpZHRoXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1heFdpZHRoUmVsYXRpdmVUbykge1xyXG4gICAgICBjb25zdCBlbGVtOiBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tYXhXaWR0aFJlbGF0aXZlVG8pO1xyXG4gICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoeyBtYXhXaWR0aDogZWxlbS5jbGllbnRXaWR0aCB9KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5taW5XaWR0aFJlbGF0aXZlVG8pIHtcclxuICAgICAgY29uc3QgZWxlbTogRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWluV2lkdGhSZWxhdGl2ZVRvKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5tZW51LnRlbXBsYXRlUmVmKTtcclxuICAgICAgb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgbWluV2lkdGg6IGVsZW0uY2xpZW50V2lkdGggfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVQb3NpdGlvbigpIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fb3ZlcmxheVJlZiEuZ2V0Q29uZmlnKClcclxuICAgICAgLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5O1xyXG4gICAgY29uc3Qgb3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luKCk7XHJcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCk7XHJcblxyXG4gICAgcG9zaXRpb24ud2l0aFBvc2l0aW9ucyhbXHJcbiAgICAgIHsgLi4ub3JpZ2luLm1haW4sIC4uLm92ZXJsYXkubWFpbiB9LFxyXG4gICAgICB7IC4uLm9yaWdpbi5mYWxsYmFjaywgLi4ub3ZlcmxheS5mYWxsYmFjayB9XHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbiBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHBvc2l0aW9uIHByZWZlcmVuY2UuXHJcbiAgICogVGhlIGZhbGxiYWNrIHBvc2l0aW9uIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvcmlnaW4gKGUuZy4gYCdib3R0b20nIC0+ICd0b3AnYCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0T3JpZ2luKCk6IHtcclxuICAgIG1haW46IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuICAgIGZhbGxiYWNrOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb247XHJcbiAgfSB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudDtcclxuICAgIGxldCBvcmlnaW5QbGFjZW1lbnQ6IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuXHJcbiAgICBpZiAocGxhY2VtZW50ID09PSAndG9wJyB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XHJcbiAgICAgIG9yaWdpblBsYWNlbWVudCA9IHtcclxuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgIG9yaWdpblk6IHBsYWNlbWVudCA9PT0gJ3RvcCcgPyAndG9wJyA6ICdib3R0b20nXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIG9yaWdpblBsYWNlbWVudCA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicgfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAncmlnaHQnKSB7XHJcbiAgICAgIG9yaWdpblBsYWNlbWVudCA9IHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdQb3NpdGlvbiBlcnJvcicsIHBsYWNlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLl9pbnZlcnRQb3NpdGlvbihcclxuICAgICAgb3JpZ2luUGxhY2VtZW50Lm9yaWdpblgsXHJcbiAgICAgIG9yaWdpblBsYWNlbWVudC5vcmlnaW5ZXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1haW46IG9yaWdpblBsYWNlbWVudCxcclxuICAgICAgZmFsbGJhY2s6IHsgb3JpZ2luWDogeCwgb3JpZ2luWTogeSB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIG92ZXJsYXkgcG9zaXRpb24gYW5kIGEgZmFsbGJhY2sgcG9zaXRpb24gYmFzZWQgb24gdGhlIHVzZXIncyBwcmVmZXJlbmNlICovXHJcbiAgcHJpdmF0ZSBfZ2V0T3ZlcmxheVBvc2l0aW9uKCk6IHtcclxuICAgIG1haW46IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XHJcbiAgICBmYWxsYmFjazogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuICB9IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG92ZXJsYXlQbGFjZW1lbnQ6IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XHJcblxyXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XHJcbiAgICAgIG92ZXJsYXlQbGFjZW1lbnQgPSB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHsgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicgfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAncmlnaHQnKSB7XHJcbiAgICAgIG92ZXJsYXlQbGFjZW1lbnQgPSB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGEgcG9zaXRpb24nLCBwbGFjZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5faW52ZXJ0UG9zaXRpb24oXHJcbiAgICAgIG92ZXJsYXlQbGFjZW1lbnQub3ZlcmxheVgsXHJcbiAgICAgIG92ZXJsYXlQbGFjZW1lbnQub3ZlcmxheVlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWFpbjogb3ZlcmxheVBsYWNlbWVudCxcclxuICAgICAgZmFsbGJhY2s6IHsgb3ZlcmxheVg6IHgsIG92ZXJsYXlZOiB5IH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbnZlcnRQb3NpdGlvbihcclxuICAgIHg6IEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxyXG4gICAgeTogVmVydGljYWxDb25uZWN0aW9uUG9zXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5wbGFjZW1lbnQgPT09ICd0b3AnIHx8IHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xyXG4gICAgICBpZiAoeSA9PT0gJ3RvcCcpIHtcclxuICAgICAgICB5ID0gJ2JvdHRvbSc7XHJcbiAgICAgIH0gZWxzZSBpZiAoeSA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgICB5ID0gJ3RvcCc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh4ID09PSAnZW5kJykge1xyXG4gICAgICAgIHggPSAnc3RhcnQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHggPT09ICdzdGFydCcpIHtcclxuICAgICAgICB4ID0gJ2VuZCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB4LCB5IH07XHJcbiAgfVxyXG59XHJcbiJdfQ==