UNPKG

@hxui/angular

Version:

* * *

424 lines 37.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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'; var DropdownDirective = /** @class */ (function () { function DropdownDirective(_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; } Object.defineProperty(DropdownDirective.prototype, "autoClose", { get: /** * @return {?} */ function () { return this._autoClose; }, set: /** * @param {?} value * @return {?} */ function (value) { this._autoClose = value; }, enumerable: true, configurable: true }); /** * @return {?} */ DropdownDirective.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ DropdownDirective.prototype.ngAfterContentInit = /** * @return {?} */ function () { }; /** * @return {?} */ DropdownDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { 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. */ /** * Toggles an element’s popover. This is considered a “manual” triggering of * the popover. * @param {?=} value * @return {?} */ DropdownDirective.prototype.toggle = /** * Toggles an element’s popover. This is considered a “manual” triggering of * the popover. * @param {?=} value * @return {?} */ function (value) { if (this.isOpen || value === false) { return this.hide(); } return this.show(); }; /** * @param {?=} delay * @return {?} */ DropdownDirective.prototype.show = /** * @param {?=} delay * @return {?} */ function (delay) { if (delay === void 0) { delay = this.showDelay; } if (this.isDisabled || this.isOpen) { return; } /** @type {?} */ var 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 {?} */ DropdownDirective.prototype.hide = /** * @param {?=} delay * @return {?} */ function (delay) { if (delay === void 0) { delay = this.hideDelay; } this._detach(); this.isOpen = false; this.isOpenChange.emit(this.isOpen); this.onHidden.emit(); }; /** * @return {?} */ DropdownDirective.prototype._createOverlay = /** * @return {?} */ function () { var _this = this; if (this._overlayRef) { return this._overlayRef; } this._portal = new TemplatePortal(this.menu.templateRef, this._viewContainerRef); /** @type {?} */ var 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(function () { return _this._detach(); }); this._overlayRef.backdropClick().subscribe(function () { return _this.hide(); }); /** @type {?} */ var position = (/** @type {?} */ (this._overlayRef.getConfig() .positionStrategy)); position.positionChanges.pipe(takeUntil(this._destroyed)).subscribe(function (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 {?} */ DropdownDirective.prototype._detach = /** * @return {?} */ function () { if (this._overlayRef && this._overlayRef.hasAttached()) { this._overlayRef.detach(); } }; /** * @param {?} overlayRef * @return {?} */ DropdownDirective.prototype._setWidthsRelativeTo = /** * @param {?} overlayRef * @return {?} */ function (overlayRef) { if (this.maxWidthRelativeTo && this.minWidthRelativeTo) { /** @type {?} */ var elem = document.getElementById(this.maxWidthRelativeTo); overlayRef.updateSize({ minWidth: elem.clientWidth, maxWidth: elem.clientWidth }); } else if (this.maxWidthRelativeTo) { /** @type {?} */ var elem = document.getElementById(this.maxWidthRelativeTo); overlayRef.updateSize({ maxWidth: elem.clientWidth }); } else if (this.minWidthRelativeTo) { /** @type {?} */ var elem = document.getElementById(this.minWidthRelativeTo); console.log(this.menu.templateRef); overlayRef.updateSize({ minWidth: elem.clientWidth }); } }; /** * @return {?} */ DropdownDirective.prototype._updatePosition = /** * @return {?} */ function () { /** @type {?} */ var position = (/** @type {?} */ ((/** @type {?} */ (this._overlayRef)).getConfig() .positionStrategy)); /** @type {?} */ var origin = this._getOrigin(); /** @type {?} */ var overlay = this._getOverlayPosition(); position.withPositions([ tslib_1.__assign({}, origin.main, overlay.main), tslib_1.__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'`). */ /** * 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 {?} */ DropdownDirective.prototype._getOrigin = /** * 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 {?} */ function () { /** @type {?} */ var placement = this.placement; /** @type {?} */ var 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); } var _a = this._invertPosition(originPlacement.originX, originPlacement.originY), x = _a.x, y = _a.y; return { main: originPlacement, fallback: { originX: x, originY: y } }; }; /** Returns the overlay position and a fallback position based on the user's preference */ /** * Returns the overlay position and a fallback position based on the user's preference * @return {?} */ DropdownDirective.prototype._getOverlayPosition = /** * Returns the overlay position and a fallback position based on the user's preference * @return {?} */ function () { /** @type {?} */ var placement = this.placement; /** @type {?} */ var 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); } var _a = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY), x = _a.x, y = _a.y; return { main: overlayPlacement, fallback: { overlayX: x, overlayY: y } }; }; /** * @param {?} x * @param {?} y * @return {?} */ DropdownDirective.prototype._invertPosition = /** * @param {?} x * @param {?} y * @return {?} */ function (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: x, y: y }; }; DropdownDirective.decorators = [ { type: Directive, args: [{ selector: '[hxaDropdown],[hxDropdown]', exportAs: 'hx-dropdown, hxa-dropdown' },] }, ]; /** @nocollapse */ DropdownDirective.ctorParameters = function () { return [ { 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 }] }; return DropdownDirective; }()); export { DropdownDirective }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kcm9wZG93bi9kcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBSUwsWUFBWSxFQUVaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLEtBQUssRUFLTCxNQUFNLEVBR04sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUVMLE9BQU8sRUFRUixNQUFNLHNCQUFzQixDQUFDO0FBSzlCO0lBOENFLDJCQUNVLFdBQXVCLEVBQ3ZCLGlCQUFtQyxFQUNwQyxPQUFnQixFQUNoQixPQUF1QjtRQUh0QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ3BDLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUF6Q2YsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDckMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUd0QixjQUFTLEdBQXdDLFFBQVEsQ0FBQztRQUVsRCxlQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFVbEMsaUJBQVksR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVsRSxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFckQsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR2hFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFHbkIsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBR25DLGNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQWFoQyxDQUFDO0lBbkNKLHNCQUNJLHdDQUFTOzs7O1FBSWI7WUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQzs7Ozs7UUFQRCxVQUNjLEtBQWM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUIsQ0FBQzs7O09BQUE7Ozs7SUFrQ0Qsb0NBQVE7OztJQUFSLGNBQWtCLENBQUM7Ozs7SUFFbkIsOENBQWtCOzs7SUFBbEIsY0FBc0IsQ0FBQzs7OztJQUV2Qix1Q0FBVzs7O0lBQVg7UUFDRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0gsa0NBQU07Ozs7OztJQUFOLFVBQU8sS0FBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLEtBQUssRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwQjtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRUQsZ0NBQUk7Ozs7SUFBSixVQUFLLEtBQThCO1FBQTlCLHNCQUFBLEVBQUEsUUFBZ0IsSUFBSSxDQUFDLFNBQVM7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbEMsT0FBTztTQUNSOztZQUVLLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7OztJQUVELGdDQUFJOzs7O0lBQUosVUFBSyxLQUE4QjtRQUE5QixzQkFBQSxFQUFBLFFBQWdCLElBQUksQ0FBQyxTQUFTO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7SUFFTywwQ0FBYzs7O0lBQXRCO1FBQUEsaUJBd0RDO1FBdkRDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDekI7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksY0FBYyxDQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDOztZQUVLLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ25DLFFBQVEsRUFBRTthQUNWLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDckMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO2FBQzdCLGtCQUFrQixDQUFDLENBQUMsQ0FBQzthQUNyQixhQUFhLENBQUM7WUFDYixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7U0FDekUsQ0FBQzthQUNELHFCQUFxQixDQUFDLHVCQUF1QixDQUFDO1FBRWpELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDckMsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLFVBQVUsRUFBRTtnQkFDVixZQUFZO2dCQUNaLG9CQUFvQjtnQkFDcEIsU0FBUztnQkFDVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxxQkFBcUI7YUFDdkU7WUFDRCxXQUFXLEVBQUUsSUFBSTtZQUNqQixhQUFhLEVBQUUsa0NBQWtDO1NBQ2xELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsV0FBVzthQUNiLFdBQVcsRUFBRTthQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLE9BQU8sRUFBRSxFQUFkLENBQWMsQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsSUFBSSxFQUFFLEVBQVgsQ0FBVyxDQUFDLENBQUM7O1lBRXhELFFBQVEsR0FBRyxtQkFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTthQUMxQyxnQkFBZ0IsRUFBcUM7UUFDeEQsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLEdBQUc7WUFDckUsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7Z0JBQzFDLEtBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2FBQ3pCO2lCQUFNLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO2dCQUMvQyxLQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtnQkFDL0MsS0FBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7YUFDeEI7aUJBQU0sSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQ2xELEtBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7OztJQUVPLG1DQUFPOzs7SUFBZjtRQUNFLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDOzs7OztJQUVPLGdEQUFvQjs7OztJQUE1QixVQUE2QixVQUFzQjtRQUNqRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7O2dCQUNoRCxJQUFJLEdBQVksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDdEUsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDM0IsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTs7Z0JBQzVCLElBQUksR0FBWSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN0RSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7O2dCQUM1QixJQUFJLEdBQVksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25DLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDOzs7O0lBRU8sMkNBQWU7OztJQUF2Qjs7WUFDUSxRQUFRLEdBQUcsbUJBQUEsbUJBQUEsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLFNBQVMsRUFBRTthQUMzQyxnQkFBZ0IsRUFBcUM7O1lBQ2xELE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFOztZQUMxQixPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1FBRTFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7aUNBQ2hCLE1BQU0sQ0FBQyxJQUFJLEVBQUssT0FBTyxDQUFDLElBQUk7aUNBQzVCLE1BQU0sQ0FBQyxRQUFRLEVBQUssT0FBTyxDQUFDLFFBQVE7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0ssc0NBQVU7Ozs7O0lBQWxCOztZQUlRLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUzs7WUFDNUIsZUFBeUM7UUFFN0MsSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDakQsZUFBZSxHQUFHO2dCQUNoQixPQUFPLEVBQUUsT0FBTztnQkFDaEIsT0FBTyxFQUFFLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUTthQUNoRCxDQUFDO1NBQ0g7YUFBTSxJQUFJLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDL0IsZUFBZSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDM0Q7YUFBTSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7WUFDaEMsZUFBZSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDekQ7YUFBTTtZQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDNUM7UUFFSyxJQUFBLDJFQUdMLEVBSE8sUUFBQyxFQUFFLFFBR1Y7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLGVBQWU7WUFDckIsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQsMEZBQTBGOzs7OztJQUNsRiwrQ0FBbUI7Ozs7SUFBM0I7O1lBSVEsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTOztZQUM1QixnQkFBMkM7UUFFL0MsSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQ3ZCLGdCQUFnQixHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDOUQ7YUFBTSxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDakMsZ0JBQWdCLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMzRDthQUFNLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUMvQixnQkFBZ0IsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO1NBQzVEO2FBQU0sSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ2hDLGdCQUFnQixHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDOUQ7YUFBTTtZQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDdkQ7UUFFSyxJQUFBLCtFQUdMLEVBSE8sUUFBQyxFQUFFLFFBR1Y7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUU7U0FDdkMsQ0FBQztJQUNKLENBQUM7Ozs7OztJQUVPLDJDQUFlOzs7OztJQUF2QixVQUNFLENBQTBCLEVBQzFCLENBQXdCO1FBRXhCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDM0QsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNmLENBQUMsR0FBRyxRQUFRLENBQUM7YUFDZDtpQkFBTSxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUU7Z0JBQ3pCLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDWDtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ2YsQ0FBQyxHQUFHLE9BQU8sQ0FBQzthQUNiO2lCQUFNLElBQUksQ0FBQyxLQUFLLE9BQU8sRUFBRTtnQkFDeEIsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNYO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxHQUFBLEVBQUUsQ0FBQztJQUNsQixDQUFDOztnQkFyUkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDOzs7O2dCQXJDQyxVQUFVO2dCQVdWLGdCQUFnQjtnQkFVaEIsT0FBTztnQkFOQSxjQUFjOzs7dUJBd0JwQixZQUFZLFNBQUMscUJBQXFCOzRCQU9sQyxLQUFLOzRCQUlMLEtBQUs7K0JBU0wsTUFBTTswQkFFTixNQUFNOzJCQUVOLE1BQU07NkJBRU4sS0FBSzs0QkFHTCxLQUFLOzRCQUdMLEtBQUs7cUNBR0wsS0FBSztxQ0FHTCxLQUFLOztJQTJPUix3QkFBQztDQUFBLEFBdFJELElBc1JDO1NBbFJZLGlCQUFpQjs7O0lBQzVCLGlDQUFpRTs7SUFFakUsd0NBQStCOztJQUMvQixvQ0FBZ0M7O0lBQ2hDLHVDQUE0Qzs7SUFDNUMsbUNBQXNCOztJQUV0QixzQ0FDMEQ7O0lBRTFELHVDQUE0Qzs7SUFVNUMseUNBQTRFOztJQUU1RSxvQ0FBK0Q7O0lBRS9ELHFDQUFnRTs7SUFFaEUsdUNBQ21COztJQUVuQixzQ0FDbUM7O0lBRW5DLHNDQUNtQzs7SUFFbkMsK0NBQzJCOztJQUUzQiwrQ0FDMkI7O0lBR3pCLHdDQUErQjs7SUFDL0IsOENBQTJDOztJQUMzQyxvQ0FBdUI7O0lBQ3ZCLG9DQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgTmdab25lLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkNvbmZpZyB9IGZyb20gJy4vZHJvcGRvd24uY29uZmlnJztcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51RGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi1tZW51LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHtcclxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5UmVmLFxyXG4gIE92ZXJsYXlTaXplQ29uZmlnLFxyXG4gIFNjcm9sbERpc3BhdGNoZXIsXHJcbiAgT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uLFxyXG4gIE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb24sXHJcbiAgSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXHJcbiAgVmVydGljYWxDb25uZWN0aW9uUG9zXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcclxuaW1wb3J0IHsgRHJvcGRvd25Ub2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLXRvZ2dsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLWl0ZW0uZGlyZWN0aXZlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2h4YURyb3Bkb3duXSxbaHhEcm9wZG93bl0nLFxyXG4gIGV4cG9ydEFzOiAnaHgtZHJvcGRvd24sIGh4YS1kcm9wZG93bidcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBDb250ZW50Q2hpbGQoRHJvcGRvd25NZW51RGlyZWN0aXZlKSBtZW51OiBEcm9wZG93bk1lbnVEaXJlY3RpdmU7XHJcblxyXG4gIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbDtcclxuICBwcml2YXRlIF9wb3J0YWw6IFRlbXBsYXRlUG9ydGFsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCcgPSAnYm90dG9tJztcclxuXHJcbiAgcHJpdmF0ZSBfYXV0b0Nsb3NlID0gdGhpcy5fY29uZmlnLmF1dG9DbG9zZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBhdXRvQ2xvc2UodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2F1dG9DbG9zZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dG9DbG9zZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hdXRvQ2xvc2U7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgaXNPcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblNob3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25IaWRkZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNob3dEZWxheSA9IHRoaXMuX2NvbmZpZy5zaG93RGVsYXk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGlkZURlbGF5ID0gdGhpcy5fY29uZmlnLmhpZGVEZWxheTtcclxuXHJcbiAgQElucHV0KClcclxuICBtYXhXaWR0aFJlbGF0aXZlVG86IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBtaW5XaWR0aFJlbGF0aXZlVG86IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHVibGljIF9jb25maWc6IERyb3Bkb3duQ29uZmlnXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHt9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlcyBhbiBlbGVtZW504oCZcyBwb3BvdmVyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDigJxtYW51YWzigJ0gdHJpZ2dlcmluZyBvZlxyXG4gICAqIHRoZSBwb3BvdmVyLlxyXG4gICAqL1xyXG4gIHRvZ2dsZSh2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzT3BlbiB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNob3coKTtcclxuICB9XHJcblxyXG4gIHNob3coZGVsYXk6IG51bWJlciA9IHRoaXMuc2hvd0RlbGF5KSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkIHx8IHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xyXG4gICAgdGhpcy5fZGV0YWNoKCk7XHJcbiAgICBvdmVybGF5UmVmLmF0dGFjaCh0aGlzLl9wb3J0YWwpO1xyXG4gICAgdGhpcy5fc2V0V2lkdGhzUmVsYXRpdmVUbyhvdmVybGF5UmVmKTtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xyXG4gICAgdGhpcy5vblNob3duLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGhpZGUoZGVsYXk6IG51bWJlciA9IHRoaXMuaGlkZURlbGF5KSB7XHJcbiAgICB0aGlzLl9kZXRhY2goKTtcclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNPcGVuKTtcclxuICAgIHRoaXMub25IaWRkZW4uZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheSgpOiBPdmVybGF5UmVmIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3BvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcclxuICAgICAgdGhpcy5tZW51LnRlbXBsYXRlUmVmLFxyXG4gICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmXHJcbiAgICApO1xyXG5cclxuICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XHJcbiAgICAgIC5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2VsZW1lbnRSZWYpXHJcbiAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxyXG4gICAgICAud2l0aERlZmF1bHRPZmZzZXRYKDApXHJcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcclxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnIH1cclxuICAgICAgXSlcclxuICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLmh4YS1kcm9wZG93bi1jb250cm9sJyk7XHJcblxyXG4gICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBwYW5lbENsYXNzOiBbXHJcbiAgICAgICAgJ2h4dWktcmVzZXQnLFxyXG4gICAgICAgICdoeGEtZHJvcGRvd24tcGFuZWwnLFxyXG4gICAgICAgICdpcy1vcGVuJyxcclxuICAgICAgICB0aGlzLm1pbldpZHRoUmVsYXRpdmVUbyA/ICdpcy1mbHVpZC1taW4td2lkdGgnIDogJ25vdC1mdWlsZC1taW4td2lkdGgnXHJcbiAgICAgIF0sXHJcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWZcclxuICAgICAgLmRldGFjaG1lbnRzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZGV0YWNoKCkpO1xyXG5cclxuICAgIHRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpXHJcbiAgICAgIC5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICAgIHBvc2l0aW9uLnBvc2l0aW9uQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUocG9zID0+IHtcclxuICAgICAgaWYgKHBvcy5jb25uZWN0aW9uUGFpci5vcmlnaW5YID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnbGVmdCc7XHJcbiAgICAgIH0gZWxzZSBpZiAocG9zLmNvbm5lY3Rpb25QYWlyLm9yaWdpblggPT09ICdlbmQnKSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAncmlnaHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHBvcy5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAndG9wJykge1xyXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gJ3RvcCc7XHJcbiAgICAgIH0gZWxzZSBpZiAocG9zLmNvbm5lY3Rpb25QYWlyLm9yaWdpblkgPT09ICdib3R0b20nKSB7XHJcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnYm90dG9tJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXRhY2goKSB7XHJcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZiAmJiB0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFdpZHRoc1JlbGF0aXZlVG8ob3ZlcmxheVJlZjogT3ZlcmxheVJlZikge1xyXG4gICAgaWYgKHRoaXMubWF4V2lkdGhSZWxhdGl2ZVRvICYmIHRoaXMubWluV2lkdGhSZWxhdGl2ZVRvKSB7XHJcbiAgICAgIGNvbnN0IGVsZW06IEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1heFdpZHRoUmVsYXRpdmVUbyk7XHJcbiAgICAgIG92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7XHJcbiAgICAgICAgbWluV2lkdGg6IGVsZW0uY2xpZW50V2lkdGgsXHJcbiAgICAgICAgbWF4V2lkdGg6IGVsZW0uY2xpZW50V2lkdGhcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF4V2lkdGhSZWxhdGl2ZVRvKSB7XHJcbiAgICAgIGNvbnN0IGVsZW06IEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1heFdpZHRoUmVsYXRpdmVUbyk7XHJcbiAgICAgIG92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7IG1heFdpZHRoOiBlbGVtLmNsaWVudFdpZHRoIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbldpZHRoUmVsYXRpdmVUbykge1xyXG4gICAgICBjb25zdCBlbGVtOiBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5taW5XaWR0aFJlbGF0aXZlVG8pO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLm1lbnUudGVtcGxhdGVSZWYpO1xyXG4gICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoeyBtaW5XaWR0aDogZWxlbS5jbGllbnRXaWR0aCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9vdmVybGF5UmVmIS5nZXRDb25maWcoKVxyXG4gICAgICAucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgICBjb25zdCBvcmlnaW4gPSB0aGlzLl9nZXRPcmlnaW4oKTtcclxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLl9nZXRPdmVybGF5UG9zaXRpb24oKTtcclxuXHJcbiAgICBwb3NpdGlvbi53aXRoUG9zaXRpb25zKFtcclxuICAgICAgeyAuLi5vcmlnaW4ubWFpbiwgLi4ub3ZlcmxheS5tYWluIH0sXHJcbiAgICAgIHsgLi4ub3JpZ2luLmZhbGxiYWNrLCAuLi5vdmVybGF5LmZhbGxiYWNrIH1cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luIHBvc2l0aW9uIGFuZCBhIGZhbGxiYWNrIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcG9zaXRpb24gcHJlZmVyZW5jZS5cclxuICAgKiBUaGUgZmFsbGJhY2sgcG9zaXRpb24gaXMgdGhlIGludmVyc2Ugb2YgdGhlIG9yaWdpbiAoZS5nLiBgJ2JvdHRvbScgLT4gJ3RvcCdgKS5cclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRPcmlnaW4oKToge1xyXG4gICAgbWFpbjogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xyXG4gICAgZmFsbGJhY2s6IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuICB9IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG9yaWdpblBsYWNlbWVudDogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0ge1xyXG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgb3JpZ2luWTogcGxhY2VtZW50ID09PSAndG9wJyA/ICd0b3AnIDogJ2JvdHRvbSdcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc2l0aW9uIGVycm9yJywgcGxhY2VtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKFxyXG4gICAgICBvcmlnaW5QbGFjZW1lbnQub3JpZ2luWCxcclxuICAgICAgb3JpZ2luUGxhY2VtZW50Lm9yaWdpbllcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWFpbjogb3JpZ2luUGxhY2VtZW50LFxyXG4gICAgICBmYWxsYmFjazogeyBvcmlnaW5YOiB4LCBvcmlnaW5ZOiB5IH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB0aGUgb3ZlcmxheSBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHByZWZlcmVuY2UgKi9cclxuICBwcml2YXRlIF9nZXRPdmVybGF5UG9zaXRpb24oKToge1xyXG4gICAgbWFpbjogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuICAgIGZhbGxiYWNrOiBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uO1xyXG4gIH0ge1xyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnQ7XHJcbiAgICBsZXQgb3ZlcmxheVBsYWNlbWVudDogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcclxuXHJcbiAgICBpZiAocGxhY2VtZW50ID09PSAndG9wJykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0geyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nIH07XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xyXG4gICAgICBvdmVybGF5UGxhY2VtZW50ID0geyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGZpbmQgYSBwb3NpdGlvbicsIHBsYWNlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLl9pbnZlcnRQb3NpdGlvbihcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudC5vdmVybGF5WCxcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudC5vdmVybGF5WVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtYWluOiBvdmVybGF5UGxhY2VtZW50LFxyXG4gICAgICBmYWxsYmFjazogeyBvdmVybGF5WDogeCwgb3ZlcmxheVk6IHkgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ludmVydFBvc2l0aW9uKFxyXG4gICAgeDogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXHJcbiAgICB5OiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3NcclxuICApIHtcclxuICAgIGlmICh0aGlzLnBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgdGhpcy5wbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XHJcbiAgICAgIGlmICh5ID09PSAndG9wJykge1xyXG4gICAgICAgIHkgPSAnYm90dG9tJztcclxuICAgICAgfSBlbHNlIGlmICh5ID09PSAnYm90dG9tJykge1xyXG4gICAgICAgIHkgPSAndG9wJztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHggPT09ICdlbmQnKSB7XHJcbiAgICAgICAgeCA9ICdzdGFydCc7XHJcbiAgICAgIH0gZWxzZSBpZiAoeCA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgIHggPSAnZW5kJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHgsIHkgfTtcclxuICB9XHJcbn1cclxuIl19