@hxui/angular
Version:
* * *
361 lines • 34.7 kB
JavaScript
/**
* @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==