UNPKG

ngx-animating-datepicker

Version:

An Animating Datepicker for Angular 2+, for some smooth date picking :).

498 lines 35.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ApplicationRef, ComponentFactoryResolver, Directive, EventEmitter, HostListener, Injector, Input, Optional, Output, Renderer2, ViewContainerRef } from '@angular/core'; import { NgControl } from '@angular/forms'; import { UtilitiesService } from '../../services/utilities.service'; import { AnimatepickerComponent } from '../animatepicker/animatepicker.component'; import { DatepickerComponent } from './datepicker.component'; import { DefaultDirectiveOptions } from './datepicker.options'; var DatepickerDirective = /** @class */ (function () { function DatepickerDirective(viewContainerRef, componentFactoryResolver, appRef, injector, renderer, formControl) { this.viewContainerRef = viewContainerRef; this.componentFactoryResolver = componentFactoryResolver; this.appRef = appRef; this.injector = injector; this.renderer = renderer; this.formControl = formControl; this.datepicker = null; // TODO: fix types: DatepickerComponent | AnimatepickerComponent this._options = DefaultDirectiveOptions; /** * Selected Dates: handles the selected dates array. Can be set both internally and externally */ this._selectedDates = []; this.selectedDatesChange = new EventEmitter(); } Object.defineProperty(DatepickerDirective.prototype, "options", { get: /** * @return {?} */ function () { return this._options; }, set: /** * @param {?} options * @return {?} */ function (options) { if (options === undefined || !options) { return; } // TODO: could be improved this._options = tslib_1.__assign({}, this._options, options); }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "datepickerOptions", { get: /** * @return {?} */ function () { return this._datepickerOptions; }, set: /** * @param {?} options * @return {?} */ function (options) { this._datepickerOptions = options; if (this.datepicker) { this.datepicker.options = options; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "language", { get: /** * @return {?} */ function () { return this._language; }, set: /** * @param {?} value * @return {?} */ function (value) { this._language = value; if (this.datepicker) { this.datepicker.language = value; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "minDate", { get: /** * @return {?} */ function () { return this._minDate; }, set: /** * @param {?} value * @return {?} */ function (value) { this._minDate = value; if (this.datepicker) { this.datepicker.minDate = value; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "maxDate", { get: /** * @return {?} */ function () { return this._minDate; }, set: /** * @param {?} value * @return {?} */ function (value) { this._maxDate = value; if (this.datepicker) { this.datepicker.maxDate = value; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "numberOfMonths", { get: /** * @return {?} */ function () { return this._numberOfMonths; }, set: /** * @param {?} value * @return {?} */ function (value) { this._numberOfMonths = value; if (this.datepicker) { this.datepicker.numberOfMonths = value; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "theme", { get: /** * @return {?} */ function () { return this._theme; }, set: /** * @param {?} value * @return {?} */ function (value) { if (this.datepicker) { this.datepicker.theme = value; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "isOpen", { get: /** * @return {?} */ function () { return this._isOpen; }, set: /** * @param {?} value * @return {?} */ function (value) { this._isOpen = value; if (this.datepicker) { this.datepicker.isOpen = value; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "selectedDates", { get: /** * @return {?} */ function () { return this._selectedDates; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value === undefined || this._selectedDates === value) { return; } this._selectedDates = value; this.selectedDatesChange.emit(this._selectedDates); }, enumerable: true, configurable: true }); /** * @return {?} */ DatepickerDirective.prototype.onClick = /** * @return {?} */ function () { var _this = this; if (!this.datepicker) { this.datepicker = this.createDatepicker(); this.setDatepickerOptionsAndInputs(); this.subscribeToSelectedChanges(); } if (!this.datepicker.isOpen) { if (this.options.appendToBody) { this.setPosition(); } this.datepicker.open(); if (this.options.closeOnBlur) { setTimeout(function () { return (_this.clickListener = _this.renderer.listen('document', 'click', _this.onBlurHandler.bind(_this))); }); } } }; /** * Add selected changes */ /** * Add selected changes * @return {?} */ DatepickerDirective.prototype.subscribeToSelectedChanges = /** * Add selected changes * @return {?} */ function () { var _this = this; this.datepicker.selectedDatesChange.subscribe(function (date) { if (_this.formControl) { _this.formControl.control.setValue(date); } else { _this.selectedDates = date; } }); }; /** * Set all the options and inputs of the datepicker */ /** * Set all the options and inputs of the datepicker * @return {?} */ DatepickerDirective.prototype.setDatepickerOptionsAndInputs = /** * Set all the options and inputs of the datepicker * @return {?} */ function () { this.datepicker.options = this.datepickerOptions; this.datepicker.isOpen = this.isOpen || false; this.datepicker.asDirective = true; this.datepicker.numberOfMonths = this.numberOfMonths; this.datepicker.theme = this.theme; this.datepicker._selectedDates = this.selectedDates; this.datepicker.language = this.language; this.datepicker.minDate = this.minDate; this.datepicker.minDate = this.maxDate; }; /** * Handles the (faked) blur event * * @param event */ /** * Handles the (faked) blur event * * @param {?} event * @return {?} */ DatepickerDirective.prototype.onBlurHandler = /** * Handles the (faked) blur event * * @param {?} event * @return {?} */ function (event) { if (event.target !== this.datepicker.element.nativeElement && !this.datepicker.element.nativeElement.contains(event.target)) { // check click origin this.clickListener(); this.datepicker.close(true); } }; /** * Returns a create DatepickerComponent method */ /** * Returns a create DatepickerComponent method * @return {?} */ DatepickerDirective.prototype.createDatepicker = /** * Returns a create DatepickerComponent method * @return {?} */ function () { return this.options.appendToBody ? this.appendToBody() : this.appendToContainer(); }; /** * Sets the position of the datepicker */ /** * Sets the position of the datepicker * @return {?} */ DatepickerDirective.prototype.setPosition = /** * Sets the position of the datepicker * @return {?} */ function () { /** @type {?} */ var position = UtilitiesService.getPageOffset(this.viewContainerRef.element.nativeElement); if (this.options.openDirection === 'bottom') { this.datepicker.topPosition = position.bottom; this.datepicker.leftPosition = position.left; } if (this.options.openDirection === 'left') { this.datepicker.topPosition = position.top; this.datepicker.rightPosition = position.forRight; } if (this.options.openDirection === 'right') { this.datepicker.topPosition = position.top; this.datepicker.leftPosition = position.right; } if (this.options.openDirection === 'top') { this.datepicker.bottomPosition = position.forBottom; this.datepicker.leftPosition = position.left; } }; /** * Appends the DatepickerComponent to the body and returns the instance */ /** * Appends the DatepickerComponent to the body and returns the instance * @return {?} */ DatepickerDirective.prototype.appendToBody = /** * Appends the DatepickerComponent to the body and returns the instance * @return {?} */ function () { /** @type {?} */ var datepickerComponent = this.options.useAnimatePicker ? AnimatepickerComponent : DatepickerComponent; /** @type {?} */ var componentRef = this.componentFactoryResolver .resolveComponentFactory(datepickerComponent) .create(this.injector); this.appRef.attachView(componentRef.hostView); /** @type {?} */ var domElem = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0])); document.body.appendChild(domElem); return componentRef.instance; }; /** * Appends the DatepickerComponent to the container and returns the instance */ /** * Appends the DatepickerComponent to the container and returns the instance * @return {?} */ DatepickerDirective.prototype.appendToContainer = /** * Appends the DatepickerComponent to the container and returns the instance * @return {?} */ function () { /** @type {?} */ var datepickerComponent = this.options.useAnimatePicker ? AnimatepickerComponent : DatepickerComponent; /** @type {?} */ var componentRef = this.componentFactoryResolver.resolveComponentFactory(datepickerComponent); return this.viewContainerRef.createComponent(componentRef).instance; }; DatepickerDirective.decorators = [ { type: Directive, args: [{ selector: '[aaDatepicker]' },] }, ]; DatepickerDirective.ctorParameters = function () { return [ { type: ViewContainerRef }, { type: ComponentFactoryResolver }, { type: ApplicationRef }, { type: Injector }, { type: Renderer2 }, { type: NgControl, decorators: [{ type: Optional }] } ]; }; DatepickerDirective.propDecorators = { options: [{ type: Input, args: ['aaDatepicker',] }], datepickerOptions: [{ type: Input, args: ['options',] }], language: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], numberOfMonths: [{ type: Input }], theme: [{ type: Input }], isOpen: [{ type: Input }], selectedDatesChange: [{ type: Output }], selectedDates: [{ type: Input }], onClick: [{ type: HostListener, args: ['click', ['$event.target'],] }] }; return DatepickerDirective; }()); export { DatepickerDirective }; if (false) { /** @type {?} */ DatepickerDirective.prototype.datepicker; /** @type {?} */ DatepickerDirective.prototype.clickListener; /** @type {?} */ DatepickerDirective.prototype._options; /** * @type {?} * @private */ DatepickerDirective.prototype._datepickerOptions; /** * Set the the language manualy. A string with a BCP 47 language tag * \@example nl-NL * @type {?} * @private */ DatepickerDirective.prototype._language; /** * Minimal Date: If set the dates before it will be disabled * @type {?} * @private */ DatepickerDirective.prototype._minDate; /** * Maximal Date: If set the dates after it will be disabled * @type {?} * @private */ DatepickerDirective.prototype._maxDate; /** * Number of months: the number of months displayed * @type {?} * @private */ DatepickerDirective.prototype._numberOfMonths; /** * Theme string is added to the host * @type {?} * @private */ DatepickerDirective.prototype._theme; /** * The open state * @type {?} * @private */ DatepickerDirective.prototype._isOpen; /** * Selected Dates: handles the selected dates array. Can be set both internally and externally * @type {?} * @private */ DatepickerDirective.prototype._selectedDates; /** @type {?} */ DatepickerDirective.prototype.selectedDatesChange; /** @type {?} */ DatepickerDirective.prototype.viewContainerRef; /** @type {?} */ DatepickerDirective.prototype.componentFactoryResolver; /** * @type {?} * @private */ DatepickerDirective.prototype.appRef; /** * @type {?} * @private */ DatepickerDirective.prototype.injector; /** * @type {?} * @private */ DatepickerDirective.prototype.renderer; /** @type {?} */ DatepickerDirective.prototype.formControl; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW5pbWF0aW5nLWRhdGVwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNOLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTdEO0lBb0xDLDZCQUNRLGdCQUFrQyxFQUNsQyx3QkFBa0QsRUFDakQsTUFBc0IsRUFDdEIsUUFBa0IsRUFDbEIsUUFBbUIsRUFDUixXQUFzQjtRQUxsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ1IsZ0JBQVcsR0FBWCxXQUFXLENBQVc7UUF0TDFDLGVBQVUsR0FBUSxJQUFJLENBQUMsQ0FBQyxnRUFBZ0U7UUFHeEYsYUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBa0luQzs7V0FFRztRQUNLLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzFCLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUErQ25ELENBQUM7SUFuTEQsc0JBQ0ksd0NBQU87Ozs7UUFRWDtZQUNDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QixDQUFDOzs7OztRQVhELFVBQ1ksT0FBeUI7WUFDcEMsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxPQUFPO2FBQ1A7WUFDRCwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFFBQVEsd0JBQU8sSUFBSSxDQUFDLFFBQVEsRUFBSyxPQUFPLENBQUMsQ0FBQztRQUNoRCxDQUFDOzs7T0FBQTtJQU9ELHNCQUNJLGtEQUFpQjs7OztRQVFyQjtZQUNDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2hDLENBQUM7Ozs7O1FBWEQsVUFDc0IsT0FBZ0I7WUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzthQUNsQztRQUNGLENBQUM7OztPQUFBO0lBV0Qsc0JBQ0kseUNBQVE7Ozs7UUFRWjtZQUNDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2QixDQUFDOzs7OztRQVhELFVBQ2EsS0FBYTtZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUV2QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzthQUNqQztRQUNGLENBQUM7OztPQUFBO0lBVUQsc0JBQ0ksd0NBQU87Ozs7UUFRWDtZQUNDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QixDQUFDOzs7OztRQVhELFVBQ1ksS0FBVztZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUV0QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUNoQztRQUNGLENBQUM7OztPQUFBO0lBVUQsc0JBQ0ksd0NBQU87Ozs7UUFRWDtZQUNDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QixDQUFDOzs7OztRQVhELFVBQ1ksS0FBVztZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUV0QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUNoQztRQUNGLENBQUM7OztPQUFBO0lBVUQsc0JBQ0ksK0NBQWM7Ozs7UUFRbEI7WUFDQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0IsQ0FBQzs7Ozs7UUFYRCxVQUNtQixLQUFLO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBRTdCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO2FBQ3ZDO1FBQ0YsQ0FBQzs7O09BQUE7SUFVRCxzQkFDSSxzQ0FBSzs7OztRQU1UO1lBQ0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BCLENBQUM7Ozs7O1FBVEQsVUFDVSxLQUFLO1lBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7YUFDOUI7UUFDRixDQUFDOzs7T0FBQTtJQVVELHNCQUNJLHVDQUFNOzs7O1FBUVY7WUFDQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQzs7Ozs7UUFYRCxVQUNXLEtBQUs7WUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUVyQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUMvQjtRQUNGLENBQUM7OztPQUFBO0lBWUQsc0JBQ0ksOENBQWE7Ozs7UUFRakI7WUFDQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDNUIsQ0FBQzs7Ozs7UUFYRCxVQUNrQixLQUFhO1lBQzlCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtnQkFDekQsT0FBTzthQUNQO1lBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsQ0FBQzs7O09BQUE7Ozs7SUFPRCxxQ0FBTzs7O0lBRFA7UUFBQSxpQkFzQkM7UUFwQkEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUUxQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDbkI7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQzdCLFVBQVUsQ0FDVDtvQkFDQyxPQUFBLENBQUMsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQS9GLENBQStGLENBQ2hHLENBQUM7YUFDRjtTQUNEO0lBQ0YsQ0FBQztJQVlEOztPQUVHOzs7OztJQUNILHdEQUEwQjs7OztJQUExQjtRQUFBLGlCQVFDO1FBUEEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQ2pELElBQUksS0FBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsS0FBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNOLEtBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsMkRBQTZCOzs7O0lBQTdCO1FBQ0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNILDJDQUFhOzs7Ozs7SUFBYixVQUFjLEtBQVk7UUFDekIsSUFDQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDdEQsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFDNUQ7WUFDRCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO0lBQ0YsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNILDhDQUFnQjs7OztJQUFoQjtRQUNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkYsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNILHlDQUFXOzs7O0lBQVg7O1lBQ08sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUU1RixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLFFBQVEsRUFBRTtZQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDN0M7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLE1BQU0sRUFBRTtZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDbEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLE9BQU8sRUFBRTtZQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDOUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBRTtZQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDN0M7SUFDRixDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsMENBQVk7Ozs7SUFBWjs7WUFDTyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsbUJBQW1COztZQUNsRyxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QjthQUNoRCx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQzthQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUV2QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBRXhDLE9BQU8sR0FBRyxtQkFBQSxDQUFDLG1CQUFBLFlBQVksQ0FBQyxRQUFRLEVBQXdCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQWU7UUFFM0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkMsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCwrQ0FBaUI7Ozs7SUFBakI7O1lBQ08sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjs7WUFDbEcsWUFBWSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3JFLENBQUM7O2dCQXJTRCxTQUFTLFNBQUM7b0JBQ1YsUUFBUSxFQUFFLGdCQUFnQjtpQkFDMUI7OztnQkFaQSxnQkFBZ0I7Z0JBVmhCLHdCQUF3QjtnQkFEeEIsY0FBYztnQkFNZCxRQUFRO2dCQUlSLFNBQVM7Z0JBR0YsU0FBUyx1QkFrTWQsUUFBUTs7OzBCQWpMVCxLQUFLLFNBQUMsY0FBYztvQ0FjcEIsS0FBSyxTQUFDLFNBQVM7MkJBa0JmLEtBQUs7MEJBaUJMLEtBQUs7MEJBaUJMLEtBQUs7aUNBaUJMLEtBQUs7d0JBaUJMLEtBQUs7eUJBZUwsS0FBSztzQ0FpQkwsTUFBTTtnQ0FFTixLQUFLOzBCQWFMLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7O0lBMEl6QywwQkFBQztDQUFBLEFBdFNELElBc1NDO1NBblNZLG1CQUFtQjs7O0lBQy9CLHlDQUF1Qjs7SUFDdkIsNENBQWM7O0lBRWQsdUNBQW1DOzs7OztJQWVuQyxpREFBMkI7Ozs7Ozs7SUFrQjNCLHdDQUFrQjs7Ozs7O0lBaUJsQix1Q0FBaUI7Ozs7OztJQWlCakIsdUNBQWlCOzs7Ozs7SUFpQmpCLDhDQUF3Qjs7Ozs7O0lBaUJ4QixxQ0FBZTs7Ozs7O0lBZWYsc0NBQWdCOzs7Ozs7SUFpQmhCLDZDQUFvQzs7SUFDcEMsa0RBQW1EOztJQXdDbEQsK0NBQXlDOztJQUN6Qyx1REFBeUQ7Ozs7O0lBQ3pELHFDQUE4Qjs7Ozs7SUFDOUIsdUNBQTBCOzs7OztJQUMxQix1Q0FBMkI7O0lBQzNCLDBDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFwcGxpY2F0aW9uUmVmLFxuXHRDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG5cdERpcmVjdGl2ZSxcblx0RW1iZWRkZWRWaWV3UmVmLFxuXHRFdmVudEVtaXR0ZXIsXG5cdEhvc3RMaXN0ZW5lcixcblx0SW5qZWN0b3IsXG5cdElucHV0LFxuXHRPcHRpb25hbCxcblx0T3V0cHV0LFxuXHRSZW5kZXJlcjIsXG5cdFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtPcHRpb25zfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZXBpY2tlci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7RGlyZWN0aXZlT3B0aW9uc30gZnJvbSAnLi4vLi4vbW9kZWxzL2RpcmVjdGl2ZS1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7VXRpbGl0aWVzU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHtBbmltYXRlcGlja2VyQ29tcG9uZW50fSBmcm9tICcuLi9hbmltYXRlcGlja2VyL2FuaW1hdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7RGF0ZXBpY2tlckNvbXBvbmVudH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQge0RlZmF1bHREaXJlY3RpdmVPcHRpb25zfSBmcm9tICcuL2RhdGVwaWNrZXIub3B0aW9ucyc7XG5cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ1thYURhdGVwaWNrZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyRGlyZWN0aXZlIHtcblx0ZGF0ZXBpY2tlcjogYW55ID0gbnVsbDsgLy8gVE9ETzogZml4IHR5cGVzOiBEYXRlcGlja2VyQ29tcG9uZW50IHwgQW5pbWF0ZXBpY2tlckNvbXBvbmVudFxuXHRjbGlja0xpc3RlbmVyO1xuXG5cdF9vcHRpb25zID0gRGVmYXVsdERpcmVjdGl2ZU9wdGlvbnM7XG5cblx0QElucHV0KCdhYURhdGVwaWNrZXInKVxuXHRzZXQgb3B0aW9ucyhvcHRpb25zOiBEaXJlY3RpdmVPcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCAhb3B0aW9ucykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBUT0RPOiBjb3VsZCBiZSBpbXByb3ZlZFxuXHRcdHRoaXMuX29wdGlvbnMgPSB7Li4udGhpcy5fb3B0aW9ucywgLi4ub3B0aW9uc307XG5cdH1cblxuXHRnZXQgb3B0aW9ucygpOiBEaXJlY3RpdmVPcHRpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucztcblx0fVxuXG5cdHByaXZhdGUgX2RhdGVwaWNrZXJPcHRpb25zO1xuXHRASW5wdXQoJ29wdGlvbnMnKVxuXHRzZXQgZGF0ZXBpY2tlck9wdGlvbnMob3B0aW9uczogT3B0aW9ucykge1xuXHRcdHRoaXMuX2RhdGVwaWNrZXJPcHRpb25zID0gb3B0aW9ucztcblxuXHRcdGlmICh0aGlzLmRhdGVwaWNrZXIpIHtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci5vcHRpb25zID0gb3B0aW9ucztcblx0XHR9XG5cdH1cblxuXHRnZXQgZGF0ZXBpY2tlck9wdGlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGVwaWNrZXJPcHRpb25zO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgdGhlIGxhbmd1YWdlIG1hbnVhbHkuIEEgc3RyaW5nIHdpdGggYSBCQ1AgNDcgbGFuZ3VhZ2UgdGFnXG5cdCAqIEBleGFtcGxlIG5sLU5MXG5cdCAqL1xuXHRwcml2YXRlIF9sYW5ndWFnZTtcblx0QElucHV0KClcblx0c2V0IGxhbmd1YWdlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9sYW5ndWFnZSA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuZGF0ZXBpY2tlcikge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLmxhbmd1YWdlID0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGxhbmd1YWdlKCkge1xuXHRcdHJldHVybiB0aGlzLl9sYW5ndWFnZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNaW5pbWFsIERhdGU6IElmIHNldCB0aGUgZGF0ZXMgYmVmb3JlIGl0IHdpbGwgYmUgZGlzYWJsZWRcblx0ICovXG5cdHByaXZhdGUgX21pbkRhdGU7XG5cdEBJbnB1dCgpXG5cdHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlKSB7XG5cdFx0dGhpcy5fbWluRGF0ZSA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuZGF0ZXBpY2tlcikge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLm1pbkRhdGUgPSB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRnZXQgbWluRGF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fbWluRGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXhpbWFsIERhdGU6IElmIHNldCB0aGUgZGF0ZXMgYWZ0ZXIgaXQgd2lsbCBiZSBkaXNhYmxlZFxuXHQgKi9cblx0cHJpdmF0ZSBfbWF4RGF0ZTtcblx0QElucHV0KClcblx0c2V0IG1heERhdGUodmFsdWU6IERhdGUpIHtcblx0XHR0aGlzLl9tYXhEYXRlID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5kYXRlcGlja2VyKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubWF4RGF0ZSA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCBtYXhEYXRlKCkge1xuXHRcdHJldHVybiB0aGlzLl9taW5EYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE51bWJlciBvZiBtb250aHM6IHRoZSBudW1iZXIgb2YgbW9udGhzIGRpc3BsYXllZFxuXHQgKi9cblx0cHJpdmF0ZSBfbnVtYmVyT2ZNb250aHM7XG5cdEBJbnB1dCgpXG5cdHNldCBudW1iZXJPZk1vbnRocyh2YWx1ZSkge1xuXHRcdHRoaXMuX251bWJlck9mTW9udGhzID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5kYXRlcGlja2VyKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubnVtYmVyT2ZNb250aHMgPSB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRnZXQgbnVtYmVyT2ZNb250aHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX251bWJlck9mTW9udGhzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZW1lIHN0cmluZyBpcyBhZGRlZCB0byB0aGUgaG9zdFxuXHQgKi9cblx0cHJpdmF0ZSBfdGhlbWU7XG5cdEBJbnB1dCgpXG5cdHNldCB0aGVtZSh2YWx1ZSkge1xuXHRcdGlmICh0aGlzLmRhdGVwaWNrZXIpIHtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci50aGVtZSA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCB0aGVtZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fdGhlbWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG9wZW4gc3RhdGVcblx0ICovXG5cdHByaXZhdGUgX2lzT3Blbjtcblx0QElucHV0KClcblx0c2V0IGlzT3Blbih2YWx1ZSkge1xuXHRcdHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuZGF0ZXBpY2tlcikge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLmlzT3BlbiA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCBpc09wZW4oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzT3Blbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWxlY3RlZCBEYXRlczogaGFuZGxlcyB0aGUgc2VsZWN0ZWQgZGF0ZXMgYXJyYXkuIENhbiBiZSBzZXQgYm90aCBpbnRlcm5hbGx5IGFuZCBleHRlcm5hbGx5XG5cdCAqL1xuXHRwcml2YXRlIF9zZWxlY3RlZERhdGVzOiBEYXRlW10gPSBbXTtcblx0QE91dHB1dCgpIHNlbGVjdGVkRGF0ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0QElucHV0KClcblx0c2V0IHNlbGVjdGVkRGF0ZXModmFsdWU6IERhdGVbXSkge1xuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3NlbGVjdGVkRGF0ZXMgPT09IHZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX3NlbGVjdGVkRGF0ZXMgPSB2YWx1ZTtcblx0XHR0aGlzLnNlbGVjdGVkRGF0ZXNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZERhdGVzKTtcblx0fVxuXG5cdGdldCBzZWxlY3RlZERhdGVzKCk6IERhdGVbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZXM7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuXHRvbkNsaWNrKCkge1xuXHRcdGlmICghdGhpcy5kYXRlcGlja2VyKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIgPSB0aGlzLmNyZWF0ZURhdGVwaWNrZXIoKTtcblxuXHRcdFx0dGhpcy5zZXREYXRlcGlja2VyT3B0aW9uc0FuZElucHV0cygpO1xuXHRcdFx0dGhpcy5zdWJzY3JpYmVUb1NlbGVjdGVkQ2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5kYXRlcGlja2VyLmlzT3Blbikge1xuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5hcHBlbmRUb0JvZHkpIHtcblx0XHRcdFx0dGhpcy5zZXRQb3NpdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5kYXRlcGlja2VyLm9wZW4oKTtcblxuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uQmx1cikge1xuXHRcdFx0XHRzZXRUaW1lb3V0KFxuXHRcdFx0XHRcdCgpID0+XG5cdFx0XHRcdFx0XHQodGhpcy5jbGlja0xpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2NsaWNrJywgdGhpcy5vbkJsdXJIYW5kbGVyLmJpbmQodGhpcykpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuXHRcdHB1YmxpYyBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcblx0XHRwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG5cdFx0cHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG5cdFx0cHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXHRcdEBPcHRpb25hbCgpIHB1YmxpYyBmb3JtQ29udHJvbDogTmdDb250cm9sXG5cdCkge1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBzZWxlY3RlZCBjaGFuZ2VzXG5cdCAqL1xuXHRzdWJzY3JpYmVUb1NlbGVjdGVkQ2hhbmdlcygpOiB2b2lkIHtcblx0XHR0aGlzLmRhdGVwaWNrZXIuc2VsZWN0ZWREYXRlc0NoYW5nZS5zdWJzY3JpYmUoZGF0ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5mb3JtQ29udHJvbCkge1xuXHRcdFx0XHR0aGlzLmZvcm1Db250cm9sLmNvbnRyb2wuc2V0VmFsdWUoZGF0ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkRGF0ZXMgPSBkYXRlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbGwgdGhlIG9wdGlvbnMgYW5kIGlucHV0cyBvZiB0aGUgZGF0ZXBpY2tlclxuXHQgKi9cblx0c2V0RGF0ZXBpY2tlck9wdGlvbnNBbmRJbnB1dHMoKTogdm9pZCB7XG5cdFx0dGhpcy5kYXRlcGlja2VyLm9wdGlvbnMgPSB0aGlzLmRhdGVwaWNrZXJPcHRpb25zO1xuXHRcdHRoaXMuZGF0ZXBpY2tlci5pc09wZW4gPSB0aGlzLmlzT3BlbiB8fCBmYWxzZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIuYXNEaXJlY3RpdmUgPSB0cnVlO1xuXHRcdHRoaXMuZGF0ZXBpY2tlci5udW1iZXJPZk1vbnRocyA9IHRoaXMubnVtYmVyT2ZNb250aHM7XG5cdFx0dGhpcy5kYXRlcGlja2VyLnRoZW1lID0gdGhpcy50aGVtZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkRGF0ZXMgPSB0aGlzLnNlbGVjdGVkRGF0ZXM7XG5cdFx0dGhpcy5kYXRlcGlja2VyLmxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIubWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIubWluRGF0ZSA9IHRoaXMubWF4RGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSAoZmFrZWQpIGJsdXIgZXZlbnRcblx0ICpcblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRvbkJsdXJIYW5kbGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuXHRcdGlmIChcblx0XHRcdGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kYXRlcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxuXHRcdFx0IXRoaXMuZGF0ZXBpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuXHRcdCkge1xuXHRcdFx0Ly8gY2hlY2sgY2xpY2sgb3JpZ2luXG5cdFx0XHR0aGlzLmNsaWNrTGlzdGVuZXIoKTtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci5jbG9zZSh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNyZWF0ZSBEYXRlcGlja2VyQ29tcG9uZW50IG1ldGhvZFxuXHQgKi9cblx0Y3JlYXRlRGF0ZXBpY2tlcigpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMuYXBwZW5kVG9Cb2R5ID8gdGhpcy5hcHBlbmRUb0JvZHkoKSA6IHRoaXMuYXBwZW5kVG9Db250YWluZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGF0ZXBpY2tlclxuXHQgKi9cblx0c2V0UG9zaXRpb24oKSB7XG5cdFx0Y29uc3QgcG9zaXRpb24gPSBVdGlsaXRpZXNTZXJ2aWNlLmdldFBhZ2VPZmZzZXQodGhpcy52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICdib3R0b20nKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIudG9wUG9zaXRpb24gPSBwb3NpdGlvbi5ib3R0b207XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubGVmdFBvc2l0aW9uID0gcG9zaXRpb24ubGVmdDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLnRvcFBvc2l0aW9uID0gcG9zaXRpb24udG9wO1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLnJpZ2h0UG9zaXRpb24gPSBwb3NpdGlvbi5mb3JSaWdodDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci50b3BQb3NpdGlvbiA9IHBvc2l0aW9uLnRvcDtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci5sZWZ0UG9zaXRpb24gPSBwb3NpdGlvbi5yaWdodDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICd0b3AnKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIuYm90dG9tUG9zaXRpb24gPSBwb3NpdGlvbi5mb3JCb3R0b207XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubGVmdFBvc2l0aW9uID0gcG9zaXRpb24ubGVmdDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kcyB0aGUgRGF0ZXBpY2tlckNvbXBvbmVudCB0byB0aGUgYm9keSBhbmQgcmV0dXJucyB0aGUgaW5zdGFuY2Vcblx0ICovXG5cdGFwcGVuZFRvQm9keSgpOiBhbnkge1xuXHRcdGNvbnN0IGRhdGVwaWNrZXJDb21wb25lbnQgPSB0aGlzLm9wdGlvbnMudXNlQW5pbWF0ZVBpY2tlciA/IEFuaW1hdGVwaWNrZXJDb21wb25lbnQgOiBEYXRlcGlja2VyQ29tcG9uZW50O1xuXHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG5cdFx0XHQucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZGF0ZXBpY2tlckNvbXBvbmVudClcblx0XHRcdC5jcmVhdGUodGhpcy5pbmplY3Rvcik7XG5cblx0XHR0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG5cblx0XHRjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb21FbGVtKTtcblxuXHRcdHJldHVybiBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kcyB0aGUgRGF0ZXBpY2tlckNvbXBvbmVudCB0byB0aGUgY29udGFpbmVyIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZVxuXHQgKi9cblx0YXBwZW5kVG9Db250YWluZXIoKTogYW55IHtcblx0XHRjb25zdCBkYXRlcGlja2VyQ29tcG9uZW50ID0gdGhpcy5vcHRpb25zLnVzZUFuaW1hdGVQaWNrZXIgPyBBbmltYXRlcGlja2VyQ29tcG9uZW50IDogRGF0ZXBpY2tlckNvbXBvbmVudDtcblx0XHRjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShkYXRlcGlja2VyQ29tcG9uZW50KTtcblx0XHRyZXR1cm4gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRSZWYpLmluc3RhbmNlO1xuXHR9XG59XG4iXX0=