UNPKG

ngx-pluto

Version:
367 lines 27.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter, ChangeDetectorRef } from "@angular/core"; import { NpDatePickerService } from "./date-picker.service"; import * as moment_ from 'moment'; /** @type {?} */ const moment = moment_; import { NpDatePickerPopup } from "./components/date-picker-popup"; import { ComponentPortal } from "@angular/cdk/portal"; import { DATE_FORMAT, DATE_TIME_FORMAT } from "./date-picker-const"; import { NpInput } from "../input"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; /** * Date picker组件 */ export class NpDatePicker { /** * @param {?} datePickerService * @param {?} cdf */ constructor(datePickerService, cdf) { this.datePickerService = datePickerService; this.cdf = cdf; /** * Placeholder */ this.placeholder = ''; /** * 已选时间 */ this.date = null; /** * 日期时间展示格式,默认只展示日期 */ this.format = DATE_FORMAT; /** * 是否展示时间,默认不展示 */ this.isShowTime = false; /** * 显示在footer左侧的自定义时间标签数组,如“昨天”等 */ this.footerItems = []; /** * 当为datetime-picker时,底部面板最右侧展示的确认按钮名称 */ this.confirmButtonText = '确认'; this.onDateChanged = new EventEmitter(); this.isHover = false; this.emitChange = (/** * @param {?} _ * @return {?} */ (_) => { }); } /** * @return {?} */ ngOnInit() { this.overlayRef = this.datePickerService.getOverlayRef(this.datePickerInput.npInput); if (this.isShowTime) { this.format = DATE_TIME_FORMAT; } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { } /** * @return {?} */ onToggleDatePickerPopup() { if (this.isDisabled) { return; } if (this.overlayRef.hasAttached()) { this.closePopup(); return; } this.datePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDatePickerPopup)); this.datePickerPopupRef.instance.date = moment(this.date); this.datePickerPopupRef.instance.datePickerType = this.isShowTime ? 'datetime-picker' : 'date-picker'; this.datePickerPopupRef.instance.footerItems = this.footerItems; this.datePickerPopupRef.instance.isShowTime = this.isShowTime; this.datePickerPopupRef.instance.confirmButtonText = this.confirmButtonText; this.subscribeNotifyEvents(); this.overlayRef.backdropClick().subscribe((/** * @return {?} */ () => { this.closePopup(); })); } /** * @param {?} data * @return {?} */ onBlur(data) { if (this.datePickerService.isValid(data.value)) { this.date = moment(data.value, this.format).clone(); } else { // 如果输入日期不合法,默认当前时间 this.date = moment().clone(); } this.syncValue(); this.emitChange(this.date); this.onDateChanged.emit(this.date); } /** * @return {?} */ onClear() { if (this.isDisabled) { return; } this.date = null; this.syncValue(); this.emitChange(this.date); this.onDateChanged.emit(this.date); } /** * @return {?} */ onMouseenter() { this.isHover = true; } /** * @return {?} */ onMouseleave() { this.isHover = false; } //#region Private methods /** * 每次this.date改变时,这个方法都必须要调用 * @private * @return {?} */ syncValue() { if (this.date && this.datePickerService.isValid(this.date)) { this.value = moment(this.date, this.format).format(this.format); } else { this.value = ''; } } /** * @private * @return {?} */ closePopup() { if (this.overlayRef.hasAttached()) { this.overlayRef.detach(); } } /** * @private * @return {?} */ subscribeNotifyEvents() { this.datePickerPopupRef.instance.onDayClicked.subscribe((/** * @param {?} res * @return {?} */ (res) => { this.emitDataAndClosePopup(res.date); })); this.datePickerPopupRef.instance.onItemLabelClicked.subscribe((/** * @param {?} res * @return {?} */ (res) => { if (res.value instanceof Function) { this.emitDataAndClosePopup(res.value()); } else { this.emitDataAndClosePopup(moment(res.value)); } this.closePopup(); })); if (this.isShowTime) { this.datePickerPopupRef.instance.onTimeClicked.subscribe((/** * @param {?} res * @return {?} */ (res) => { /** @type {?} */ let date = moment(moment(this.date).format(DATE_FORMAT) + ' ' + res); this.emitDataAndClosePopup(date); })); this.datePickerPopupRef.instance.onConfirmClicked.subscribe((/** * @param {?} res * @return {?} */ (res) => { /** @type {?} */ let date = moment(moment(this.date).format(DATE_FORMAT) + ' ' + res); this.emitDataAndClosePopup(date); this.closePopup(); })); } } /** * @private * @param {?} date * @return {?} */ emitDataAndClosePopup(date) { this.date = date; this.syncValue(); this.emitChange(moment(this.date)); this.onDateChanged.emit(moment(this.date)); this.datePickerInput.focus(); if (!this.isShowTime) { this.closePopup(); } } //#endregion //#region Implement for ControlValueAccessor /** * @param {?} obj * @return {?} */ writeValue(obj) { this.date = obj; this.syncValue(); } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.emitChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { } } NpDatePicker.decorators = [ { type: Component, args: [{ selector: `np-date-picker`, template: "<div class=\"np-date-picker-wrapper flex-wrap col-flex\" (mouseenter)=\"onMouseenter()\" (mouseleave)=\"onMouseleave()\">\r\n <i *ngIf=\"!isHover\" class=\"far fa-calendar\"></i>\r\n <i *ngIf=\"isHover\" class=\"fas fa-times-circle\" (click)=\"onClear()\"></i>\r\n <np-input #datePickerInput [label]=\"label\" [isRequired]=\"isRequired\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\" [errorMessage]=\"errorMessage\" [(ngModel)]=\"value\" (click)=\"onToggleDatePickerPopup()\"\r\n (onBlur)=\"onBlur($event)\">\r\n </np-input>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => NpDatePicker)), multi: true, } ], styles: [".np-date-picker-wrapper{position:relative}.np-date-picker-wrapper>.far.fa-calendar,.np-date-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-date-picker-wrapper .np-input-wrapper .np-input{width:220px}"] }] } ]; /** @nocollapse */ NpDatePicker.ctorParameters = () => [ { type: NpDatePickerService }, { type: ChangeDetectorRef } ]; NpDatePicker.propDecorators = { label: [{ type: Input }], isRequired: [{ type: Input }], placeholder: [{ type: Input }], errorMessage: [{ type: Input }], isDisabled: [{ type: Input }], date: [{ type: Input }], format: [{ type: Input }], isShowTime: [{ type: Input }], footerItems: [{ type: Input }], confirmButtonText: [{ type: Input }], onDateChanged: [{ type: Output }], datePickerInput: [{ type: ViewChild, args: ['datePickerInput',] }] }; if (false) { /** * 标签 * @type {?} */ NpDatePicker.prototype.label; /** * 是否必填,true仅在标签前面添加红色*号, false不加 * @type {?} */ NpDatePicker.prototype.isRequired; /** * Placeholder * @type {?} */ NpDatePicker.prototype.placeholder; /** * 校验错误时显示错误信息 * @type {?} */ NpDatePicker.prototype.errorMessage; /** * 是否禁用 * @type {?} */ NpDatePicker.prototype.isDisabled; /** * 已选时间 * @type {?} */ NpDatePicker.prototype.date; /** * 日期时间展示格式,默认只展示日期 * @type {?} */ NpDatePicker.prototype.format; /** * 是否展示时间,默认不展示 * @type {?} */ NpDatePicker.prototype.isShowTime; /** * 显示在footer左侧的自定义时间标签数组,如“昨天”等 * @type {?} */ NpDatePicker.prototype.footerItems; /** * 当为datetime-picker时,底部面板最右侧展示的确认按钮名称 * @type {?} */ NpDatePicker.prototype.confirmButtonText; /** @type {?} */ NpDatePicker.prototype.onDateChanged; /** @type {?} */ NpDatePicker.prototype.datePickerInput; /** @type {?} */ NpDatePicker.prototype.datePickerPopupRef; /** * @type {?} * @private */ NpDatePicker.prototype.overlayRef; /** @type {?} */ NpDatePicker.prototype.isHover; /** * @type {?} * @private */ NpDatePicker.prototype.emitChange; /** * 日期输入框文本值,每当this.date改变时此值会同步改变 * @type {?} */ NpDatePicker.prototype.value; /** * @type {?} * @private */ NpDatePicker.prototype.datePickerService; /** * @type {?} * @private */ NpDatePicker.prototype.cdf; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLGlCQUFpQixFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUM3TSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7O01BQU8sTUFBTSxHQUFHLE9BQU87QUFFekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQW9CekUsTUFBTSxPQUFPLFlBQVk7Ozs7O0lBcUN2QixZQUFvQixpQkFBc0MsRUFBVSxHQUFzQjtRQUF0RSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXFCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7Ozs7UUE5QmpGLGdCQUFXLEdBQVcsRUFBRSxDQUFDOzs7O1FBT3pCLFNBQUksR0FBNEIsSUFBSSxDQUFDOzs7O1FBRXJDLFdBQU0sR0FBVyxXQUFXLENBQUM7Ozs7UUFFN0IsZUFBVSxHQUFZLEtBQUssQ0FBQzs7OztRQUU1QixnQkFBVyxHQUEyQixFQUFFLENBQUM7Ozs7UUFFekMsc0JBQWlCLEdBQVcsSUFBSSxDQUFDO1FBRWhDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQU1sRCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBRWpCLGVBQVU7Ozs7UUFBRyxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFDO0lBS3lELENBQUM7Ozs7SUFFL0YsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJGLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDO1NBQ2hDO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxXQUFXLENBQUMsT0FBc0IsSUFBVSxDQUFDOzs7O0lBRTdDLHVCQUF1QjtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUN0RyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDNUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTOzs7UUFBQyxHQUFHLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsSUFBZ0M7UUFDckMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNyRDthQUFNO1lBQ0wsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDOUI7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQzs7OztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDOzs7O0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7Ozs7Ozs7SUFLTyxTQUFTO1FBQ2YsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakU7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUzs7OztRQUFDLENBQUMsR0FBb0IsRUFBRSxFQUFFO1lBQy9FLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxFQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLEdBQXlCLEVBQUUsRUFBRTtZQUMxRixJQUFJLEdBQUcsQ0FBQyxLQUFLLFlBQVksUUFBUSxFQUFFO2dCQUNqQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDekM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUMvQztZQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLEVBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTs7b0JBQ25FLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUMsRUFBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTs7b0JBQ3RFLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsQ0FBQyxFQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Ozs7OztJQUVPLHFCQUFxQixDQUFDLElBQW9CO1FBQ2hELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDOzs7Ozs7O0lBSUQsVUFBVSxDQUFDLEdBQVE7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDOzs7OztJQUVELGlCQUFpQixDQUFDLEVBQU8sSUFBVSxDQUFDOzs7WUExTHJDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixna0JBQStCO2dCQUUvQixhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtnQkFDckMsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVOzs7d0JBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFDO3dCQUMzQyxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjs7YUFDRjs7OztZQXpCUSxtQkFBbUI7WUFEK0csaUJBQWlCOzs7b0JBK0J6SixLQUFLO3lCQUVMLEtBQUs7MEJBRUwsS0FBSzsyQkFFTCxLQUFLO3lCQUVMLEtBQUs7bUJBR0wsS0FBSztxQkFFTCxLQUFLO3lCQUVMLEtBQUs7MEJBRUwsS0FBSztnQ0FFTCxLQUFLOzRCQUVMLE1BQU07OEJBRU4sU0FBUyxTQUFDLGlCQUFpQjs7Ozs7OztJQXZCNUIsNkJBQXVCOzs7OztJQUV2QixrQ0FBNkI7Ozs7O0lBRTdCLG1DQUFrQzs7Ozs7SUFFbEMsb0NBQThCOzs7OztJQUU5QixrQ0FBNkI7Ozs7O0lBRzdCLDRCQUE4Qzs7Ozs7SUFFOUMsOEJBQXNDOzs7OztJQUV0QyxrQ0FBcUM7Ozs7O0lBRXJDLG1DQUFrRDs7Ozs7SUFFbEQseUNBQTBDOztJQUUxQyxxQ0FBa0Q7O0lBRWxELHVDQUF1RDs7SUFDdkQsMENBQW9EOzs7OztJQUVwRCxrQ0FBK0I7O0lBQy9CLCtCQUF5Qjs7Ozs7SUFFekIsa0NBQXFDOzs7OztJQUdyQyw2QkFBYzs7Ozs7SUFFRix5Q0FBOEM7Ozs7O0lBQUUsMkJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb21wb25lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5wRGF0ZVBpY2tlclNlcnZpY2UsIERheURhdGFQZXJNb250aCB9IGZyb20gXCIuL2RhdGUtcGlja2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHsgTnBEYXRlUGlja2VyUG9wdXAgfSBmcm9tIFwiLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLXBvcHVwXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XHJcbmltcG9ydCB7IERBVEVfRk9STUFULCBEQVRFX1RJTUVfRk9STUFUIH0gZnJvbSBcIi4vZGF0ZS1waWNrZXItY29uc3RcIjtcclxuaW1wb3J0IHsgTnBJbnB1dCB9IGZyb20gXCIuLi9pbnB1dFwiO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRGF0ZVBpY2tlckZvb3Rlckl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLWZvb3RlclwiO1xyXG5cclxuLyoqXHJcbiAqIERhdGUgcGlja2Vy57uE5Lu2XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogYG5wLWRhdGUtcGlja2VyYCxcclxuICB0ZW1wbGF0ZVVybDogJ2RhdGUtcGlja2VyLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydkYXRlLXBpY2tlci5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5wRGF0ZVBpY2tlciksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcERhdGVQaWNrZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKirmoIfnrb4gKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuW/heWhq++8jHRydWXku4XlnKjmoIfnrb7liY3pnaLmt7vliqDnuqLoibIq5Y+377yMIGZhbHNl5LiN5YqgKi9cclxuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gIC8qKlBsYWNlaG9sZGVyICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKuagoemqjOmUmeivr+aXtuaYvuekuumUmeivr+S/oeaBryAqL1xyXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuemgeeUqCAqL1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qKuW3sumAieaXtumXtCAqL1xyXG4gIEBJbnB1dCgpIGRhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nID0gbnVsbDtcclxuICAvKirml6XmnJ/ml7bpl7TlsZXnpLrmoLzlvI/vvIzpu5jorqTlj6rlsZXnpLrml6XmnJ8gKi9cclxuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyA9IERBVEVfRk9STUFUO1xyXG4gIC8qKuaYr+WQpuWxleekuuaXtumXtO+8jOm7mOiupOS4jeWxleekuiAqL1xyXG4gIEBJbnB1dCgpIGlzU2hvd1RpbWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKirmmL7npLrlnKhmb290ZXLlt6bkvqfnmoToh6rlrprkuYnml7bpl7TmoIfnrb7mlbDnu4TvvIzlpoLigJzmmKjlpKnigJ3nrYkgKi9cclxuICBASW5wdXQoKSBmb290ZXJJdGVtczogRGF0ZVBpY2tlckZvb3Rlckl0ZW1bXSA9IFtdO1xyXG4gIC8qKuW9k+S4umRhdGV0aW1lLXBpY2tlcuaXtu+8jOW6lemDqOmdouadv+acgOWPs+S+p+WxleekuueahOehruiupOaMiemSruWQjeensCAqL1xyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdXR0b25UZXh0OiBzdHJpbmcgPSAn56Gu6K6kJztcclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcklucHV0JykgZGF0ZVBpY2tlcklucHV0OiBOcElucHV0O1xyXG4gIGRhdGVQaWNrZXJQb3B1cFJlZjogQ29tcG9uZW50UmVmPE5wRGF0ZVBpY2tlclBvcHVwPjtcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xyXG4gIGlzSG92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLmRhdGXmlLnlj5jml7bmraTlgLzkvJrlkIzmraXmlLnlj5gqL1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZVBpY2tlclNlcnZpY2U6IE5wRGF0ZVBpY2tlclNlcnZpY2UsIHByaXZhdGUgY2RmOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRPdmVybGF5UmVmKHRoaXMuZGF0ZVBpY2tlcklucHV0Lm5wSW5wdXQpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQgeyB9XHJcblxyXG4gIG9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBEYXRlUGlja2VyUG9wdXApKTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmRhdGUgPSBtb21lbnQodGhpcy5kYXRlKTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmRhdGVQaWNrZXJUeXBlID0gdGhpcy5pc1Nob3dUaW1lID8gJ2RhdGV0aW1lLXBpY2tlcicgOiAnZGF0ZS1waWNrZXInO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZm9vdGVySXRlbXMgPSB0aGlzLmZvb3Rlckl0ZW1zO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuaXNTaG93VGltZSA9IHRoaXMuaXNTaG93VGltZTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmNvbmZpcm1CdXR0b25UZXh0ID0gdGhpcy5jb25maXJtQnV0dG9uVGV4dDtcclxuICAgIHRoaXMuc3Vic2NyaWJlTm90aWZ5RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKGRhdGE6IHsgdmFsdWU6IGFueSwgZXZlbnQ6IGFueSB9KSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKGRhdGEudmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG1vbWVudChkYXRhLnZhbHVlLCB0aGlzLmZvcm1hdCkuY2xvbmUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWmguaenOi+k+WFpeaXpeacn+S4jeWQiOazle+8jOm7mOiupOW9k+WJjeaXtumXtFxyXG4gICAgICB0aGlzLmRhdGUgPSBtb21lbnQoKS5jbG9uZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5kYXRlKTtcclxuICAgIHRoaXMub25EYXRlQ2hhbmdlZC5lbWl0KHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRlID0gbnVsbDtcclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5kYXRlKTtcclxuICAgIHRoaXMub25EYXRlQ2hhbmdlZC5lbWl0KHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlZW50ZXIoKSB7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZWxlYXZlKCkge1xyXG4gICAgdGhpcy5pc0hvdmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gUHJpdmF0ZSBtZXRob2RzXHJcblxyXG4gIC8qKuavj+asoXRoaXMuZGF0ZeaUueWPmOaXtu+8jOi/meS4quaWueazlemDveW/hemhu+imgeiwg+eUqCAqL1xyXG4gIHByaXZhdGUgc3luY1ZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZSAmJiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmlzVmFsaWQodGhpcy5kYXRlKSkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gbW9tZW50KHRoaXMuZGF0ZSwgdGhpcy5mb3JtYXQpLmZvcm1hdCh0aGlzLmZvcm1hdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlUG9wdXAoKSB7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVOb3RpZnlFdmVudHMoKSB7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkRheUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERheURhdGFQZXJNb250aCkgPT4ge1xyXG4gICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChyZXMuZGF0ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkl0ZW1MYWJlbENsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERhdGVQaWNrZXJGb290ZXJJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChyZXMudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKHJlcy52YWx1ZSgpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChtb21lbnQocmVzLnZhbHVlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93VGltZSkge1xyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vblRpbWVDbGlja2VkLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgZGF0ZSA9IG1vbWVudChtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgcmVzKTtcclxuICAgICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChkYXRlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgZGF0ZSA9IG1vbWVudChtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgcmVzKTtcclxuICAgICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChkYXRlKTtcclxuICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXREYXRhQW5kQ2xvc2VQb3B1cChkYXRlOiBtb21lbnRfLk1vbWVudCkge1xyXG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UobW9tZW50KHRoaXMuZGF0ZSkpO1xyXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2VkLmVtaXQobW9tZW50KHRoaXMuZGF0ZSkpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VySW5wdXQuZm9jdXMoKTtcclxuICAgIGlmICghdGhpcy5pc1Nob3dUaW1lKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGUgPSBvYmo7XHJcbiAgICB0aGlzLnN5bmNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59Il19