ngx-pluto
Version:
527 lines • 43.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter, ElementRef } from "@angular/core";
import * as moment_ from 'moment';
/** @type {?} */
var moment = moment_;
import { ComponentPortal } from "@angular/cdk/portal";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { NpDateRangePickerPopup } from "../components/date-range-picker-popup";
import { DATE_FORMAT, DATE_TIME_FORMAT } from "../date-picker-const";
import { NpInput } from "../../input";
import { NpDatePickerService } from "../date-picker.service";
/**
* Date range picker组件
*/
var NpDateRangePicker = /** @class */ (function () {
function NpDateRangePicker(datePickerService) {
this.datePickerService = datePickerService;
/**
* 展示开始时间占位符
*/
this.startPlaceholder = '';
/**
* 展示结束时间占位符
*/
this.endPlaceholder = '';
/**
* 已选时间
*/
this.dates = [];
/**
* 日期时间展示格式,默认只展示日期
*/
this.format = DATE_FORMAT;
/**
* 是否展示时间,默认不展示
*/
this.isShowTime = false;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
*/
this.footerItems = [];
this.onDateRangeChanged = new EventEmitter();
this.isHover = false;
this.emitChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
}
/**
* @return {?}
*/
NpDateRangePicker.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.dates && this.dates.length === 2) {
/** @type {?} */
var dates = this.datePickerService.buildStartAndEndDates(moment(this.dates[0]).clone(), moment(this.dates[1]).clone());
this.startDate = dates[0];
this.endDate = dates[1];
this.syncSValue();
this.syncEValue();
}
this.overlayRef = this.datePickerService.getOverlayRef(this.dateRangeStartPicker.npInput);
if (this.isShowTime) {
this.format = DATE_TIME_FORMAT;
}
};
/**
* @param {?} changes
* @return {?}
*/
NpDateRangePicker.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
};
/**
* @return {?}
*/
NpDateRangePicker.prototype.onStartPickerClicked = /**
* @return {?}
*/
function () {
this.onToggleDatePickerPopup();
};
/**
* @return {?}
*/
NpDateRangePicker.prototype.onEndPickerClicked = /**
* @return {?}
*/
function () {
this.onToggleDatePickerPopup();
};
/**
* @return {?}
*/
NpDateRangePicker.prototype.onToggleDatePickerPopup = /**
* @return {?}
*/
function () {
var _this = this;
if (this.isDisabled) {
return;
}
if (this.overlayRef.hasAttached()) {
this.closePopup();
return;
}
this.daterangePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDateRangePickerPopup));
this.daterangePickerPopupRef.instance.datePickerType = 'date-range-picker';
this.daterangePickerPopupRef.instance.footerItems = this.footerItems;
this.daterangePickerPopupRef.instance.startDate = moment(this.startDate);
this.daterangePickerPopupRef.instance.endDate = moment(this.endDate);
this.subscribeNotifyEvents();
this.overlayRef.backdropClick().subscribe((/**
* @return {?}
*/
function () {
_this.closePopup();
}));
if (this.dateRangeWrapper && this.dateRangeWrapper.nativeElement) {
this.dateRangeWrapper.nativeElement.focus();
}
};
/**
* @param {?} data
* @return {?}
*/
NpDateRangePicker.prototype.onStartDateBlur = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (this.datePickerService.isValid(data.value)) {
this.startDate = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.startDate = moment().clone();
}
/** @type {?} */
var dates = this.datePickerService.buildStartAndEndDates(moment(this.startDate).clone(), moment(this.endDate).clone());
this.startDate = dates[0];
this.endDate = dates[1];
this.syncSValue();
this.syncEValue();
this.emitChange([this.startDate, this.endDate]);
this.onDateRangeChanged.emit([this.startDate, this.endDate]);
};
/**
* @param {?} data
* @return {?}
*/
NpDateRangePicker.prototype.onEndDateBlur = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (this.datePickerService.isValid(data.value)) {
this.endDate = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.endDate = moment().clone();
}
/** @type {?} */
var dates = this.datePickerService.buildStartAndEndDates(moment(this.startDate).clone(), moment(this.endDate).clone());
this.startDate = dates[0];
this.endDate = dates[1];
this.syncSValue();
this.syncEValue();
this.emitChange([this.startDate, this.endDate]);
this.onDateRangeChanged.emit([this.startDate, this.endDate]);
};
/**
* @return {?}
*/
NpDateRangePicker.prototype.onClear = /**
* @return {?}
*/
function () {
if (this.isDisabled) {
return;
}
this.startDate = null;
this.endDate = null;
this.syncSValue();
this.syncEValue();
this.emitChange([]);
this.onDateRangeChanged.emit([]);
};
/**
* @return {?}
*/
NpDateRangePicker.prototype.onMouseenter = /**
* @return {?}
*/
function () {
this.isHover = true;
};
/**
* @return {?}
*/
NpDateRangePicker.prototype.onMouseleave = /**
* @return {?}
*/
function () {
this.isHover = false;
};
//#region Private methods
/**每次this.startDate改变时,这个方法都必须要调用 */
//#region Private methods
/**
* 每次this.startDate改变时,这个方法都必须要调用
* @private
* @return {?}
*/
NpDateRangePicker.prototype.syncSValue =
//#region Private methods
/**
* 每次this.startDate改变时,这个方法都必须要调用
* @private
* @return {?}
*/
function () {
if (this.startDate && this.datePickerService.isValid(this.startDate)) {
this.sValue = moment(this.startDate, this.format).format(this.format);
}
else {
this.sValue = '';
}
};
/**每次this.endDate改变时,这个方法都必须要调用 */
/**
* 每次this.endDate改变时,这个方法都必须要调用
* @private
* @return {?}
*/
NpDateRangePicker.prototype.syncEValue = /**
* 每次this.endDate改变时,这个方法都必须要调用
* @private
* @return {?}
*/
function () {
if (this.endDate && this.datePickerService.isValid(this.endDate)) {
this.eValue = moment(this.endDate, this.format).format(this.format);
}
else {
this.eValue = '';
}
};
/**
* @private
* @return {?}
*/
NpDateRangePicker.prototype.closePopup = /**
* @private
* @return {?}
*/
function () {
if (this.overlayRef.hasAttached()) {
this.overlayRef.detach();
}
};
/**
* @private
* @return {?}
*/
NpDateRangePicker.prototype.subscribeNotifyEvents = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.daterangePickerPopupRef.instance.onStartDayClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
if (_this.datePickerService.isValid(_this.endDate)) {
_this.emitDataAndClosePopup([res.day.date, moment(_this.endDate).clone()]);
}
else {
_this.startDate = res.day.date;
_this.syncSValue();
}
}));
this.daterangePickerPopupRef.instance.onEndDayClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
if (_this.datePickerService.isValid(_this.startDate)) {
_this.emitDataAndClosePopup([res.day.date, moment(_this.startDate).clone()]);
}
else {
_this.endDate = res.day.date;
_this.syncEValue();
}
}));
this.daterangePickerPopupRef.instance.onItemLabelClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
if (res && res.values && res.values.length === 2) {
if (((res.values[0]) instanceof Function) && ((res.values[1]) instanceof Function)) {
_this.emitDataAndClosePopup([((/** @type {?} */ (res.values[0])))(), ((/** @type {?} */ (res.values[1])))()]);
}
else {
_this.emitDataAndClosePopup([moment((/** @type {?} */ (res.values[0]))), moment((/** @type {?} */ (res.values[1])))]);
}
}
}));
};
/**
* @private
* @param {?} dates
* @return {?}
*/
NpDateRangePicker.prototype.emitDataAndClosePopup = /**
* @private
* @param {?} dates
* @return {?}
*/
function (dates) {
/** @type {?} */
var sortedDates = this.datePickerService.sortDates(dates);
this.startDate = sortedDates[0].clone();
this.endDate = sortedDates[sortedDates.length - 1].clone();
this.syncSValue();
this.syncEValue();
this.emitChange([this.startDate, this.endDate]);
this.onDateRangeChanged.emit([this.startDate, this.endDate]);
this.closePopup();
};
//#endregion
//#region Implement for ControlValueAccessor
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
NpDateRangePicker.prototype.writeValue =
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
function (obj) {
if (obj && obj.length === 2 && this.datePickerService.isValid(obj[0]) && this.datePickerService.isValid(obj[1])) {
/** @type {?} */
var sortedDates = this.datePickerService.sortDates(obj);
this.startDate = sortedDates[0].clone();
this.endDate = sortedDates[sortedDates.length - 1].clone();
}
else {
this.startDate = null;
this.endDate = null;
}
this.syncSValue();
this.syncEValue();
};
/**
* @param {?} fn
* @return {?}
*/
NpDateRangePicker.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.emitChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
NpDateRangePicker.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) { };
NpDateRangePicker.decorators = [
{ type: Component, args: [{
selector: "np-date-range-picker",
template: "<div class=\"np-date-range-picker-wrapper flex-wrap row-flex\" (mouseenter)=\"onMouseenter()\"\r\n (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 <div class=\"flex-wrap col-flex\" *ngIf=\"label\">\r\n <label class=\"np-date-lbl\">\r\n <span class=\"form-required\" *ngIf=\"isRequired\">*</span>\r\n {{ label }}\r\n </label>\r\n </div>\r\n <div>\r\n <div #dateRangeWrapper class=\"date-range-wrapper flex-wrap row-flex\">\r\n <np-input #dateRangeStartPicker class=\"date-range-start-picker\" [(ngModel)]=\"sValue\" [isRequired]=\"isRequired\"\r\n [isDisabled]=\"isDisabled\" [placeholder]=\"startPlaceholder\" (click)=\"onStartPickerClicked()\" (onBlur)=\"onStartDateBlur($event)\">\r\n </np-input>\r\n <span class=\"range-picker-divider\" [ngClass]=\"{'disabled': isDisabled}\"> ~ </span>\r\n <np-input #dateRangeEndPicker class=\"date-range-end-picker\" [(ngModel)]=\"eValue\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"endPlaceholder\" (click)=\"onEndPickerClicked()\" (onBlur)=\"onEndDateBlur($event)\">\r\n </np-input>\r\n </div>\r\n <span class=\"error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return NpDateRangePicker; })),
multi: true,
}
],
styles: [".np-date-range-picker-wrapper{position:relative;align-items:baseline}.np-date-range-picker-wrapper>.far.fa-calendar,.np-date-range-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-date-range-picker-wrapper .np-date-lbl{width:80px;margin-right:20px;text-align:right;font-size:13px;font-weight:700;height:34px;line-height:34px}.np-date-range-picker-wrapper .date-range-wrapper .np-input-wrapper .np-input{height:32px}.np-date-range-picker-wrapper .date-range-wrapper .date-range-start-picker .np-input{width:160px}.np-date-range-picker-wrapper .date-range-wrapper .date-range-end-picker .np-input{width:190px}.np-date-range-picker-wrapper .error-message{display:block;font-size:10px;margin:5px}"]
}] }
];
/** @nocollapse */
NpDateRangePicker.ctorParameters = function () { return [
{ type: NpDatePickerService }
]; };
NpDateRangePicker.propDecorators = {
label: [{ type: Input }],
isRequired: [{ type: Input }],
startPlaceholder: [{ type: Input }],
endPlaceholder: [{ type: Input }],
errorMessage: [{ type: Input }],
isDisabled: [{ type: Input }],
dates: [{ type: Input }],
format: [{ type: Input }],
isShowTime: [{ type: Input }],
footerItems: [{ type: Input }],
onDateRangeChanged: [{ type: Output }],
dateRangeWrapper: [{ type: ViewChild, args: ['dateRangeWrapper',] }],
dateRangeStartPicker: [{ type: ViewChild, args: ['dateRangeStartPicker',] }],
dateRangeEndPicker: [{ type: ViewChild, args: ['dateRangeEndPicker',] }]
};
return NpDateRangePicker;
}());
export { NpDateRangePicker };
if (false) {
/**
* 标签
* @type {?}
*/
NpDateRangePicker.prototype.label;
/**
* 是否必填,true仅在标签前面添加红色*号, false不加
* @type {?}
*/
NpDateRangePicker.prototype.isRequired;
/**
* 展示开始时间占位符
* @type {?}
*/
NpDateRangePicker.prototype.startPlaceholder;
/**
* 展示结束时间占位符
* @type {?}
*/
NpDateRangePicker.prototype.endPlaceholder;
/**
* 校验错误时显示错误信息
* @type {?}
*/
NpDateRangePicker.prototype.errorMessage;
/**
* 是否禁用
* @type {?}
*/
NpDateRangePicker.prototype.isDisabled;
/**
* 已选时间
* @type {?}
*/
NpDateRangePicker.prototype.dates;
/**
* 日期时间展示格式,默认只展示日期
* @type {?}
*/
NpDateRangePicker.prototype.format;
/**
* 是否展示时间,默认不展示
* @type {?}
*/
NpDateRangePicker.prototype.isShowTime;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
* @type {?}
*/
NpDateRangePicker.prototype.footerItems;
/** @type {?} */
NpDateRangePicker.prototype.onDateRangeChanged;
/** @type {?} */
NpDateRangePicker.prototype.dateRangeWrapper;
/** @type {?} */
NpDateRangePicker.prototype.dateRangeStartPicker;
/** @type {?} */
NpDateRangePicker.prototype.dateRangeEndPicker;
/** @type {?} */
NpDateRangePicker.prototype.daterangePickerPopupRef;
/** @type {?} */
NpDateRangePicker.prototype.startDate;
/** @type {?} */
NpDateRangePicker.prototype.endDate;
/**
* @type {?}
* @private
*/
NpDateRangePicker.prototype.overlayRef;
/** @type {?} */
NpDateRangePicker.prototype.isHover;
/**
* @type {?}
* @private
*/
NpDateRangePicker.prototype.emitChange;
/**
* 日期输入框文本值,每当this.startDate改变时此值会同步改变
* @type {?}
*/
NpDateRangePicker.prototype.sValue;
/**
* 日期输入框文本值,每当this.endDate改变时此值会同步改变
* @type {?}
*/
NpDateRangePicker.prototype.eValue;
/**
* @type {?}
* @private
*/
NpDateRangePicker.prototype.datePickerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SyxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7SUFBTyxNQUFNLEdBQUcsT0FBTztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBbUIsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUs5RTtJQStERSwyQkFBb0IsaUJBQXNDO1FBQXRDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBcUI7Ozs7UUExQ2pELHFCQUFnQixHQUFXLEVBQUUsQ0FBQzs7OztRQUU5QixtQkFBYyxHQUFXLEVBQUUsQ0FBQzs7OztRQU81QixVQUFLLEdBQW1DLEVBQUUsQ0FBQzs7OztRQUUzQyxXQUFNLEdBQVcsV0FBVyxDQUFDOzs7O1FBRTdCLGVBQVUsR0FBWSxLQUFLLENBQUM7Ozs7UUFFNUIsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDO1FBRXhDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFh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ZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5wRGF0ZVJhbmdlUGlja2VyUG9wdXAgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRlLXJhbmdlLXBpY2tlci1wb3B1cFwiO1xyXG5pbXBvcnQgeyBEQVRFX0ZPUk1BVCwgREFURV9USU1FX0ZPUk1BVCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci1jb25zdFwiO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyRm9vdGVySXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLWZvb3RlclwiO1xyXG5pbXBvcnQgeyBOcElucHV0IH0gZnJvbSBcIi4uLy4uL2lucHV0XCI7XHJcbmltcG9ydCB7IE5wRGF0ZVBpY2tlclNlcnZpY2UsIERheURhdGFQZXJNb250aCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogRGF0ZSByYW5nZSBwaWNrZXLnu4Tku7ZcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZGF0ZS1yYW5nZS1waWNrZXJgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZS1yYW5nZS1waWNrZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RhdGUtcmFuZ2UtcGlja2VyLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBEYXRlUmFuZ2VQaWNrZXIpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH1cclxuICBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnBEYXRlUmFuZ2VQaWNrZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKirmoIfnrb4gKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuW/heWhq++8jHRydWXku4XlnKjmoIfnrb7liY3pnaLmt7vliqDnuqLoibIq5Y+377yMIGZhbHNl5LiN5YqgKi9cclxuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gIC8qKuWxleekuuW8gOWni+aXtumXtOWNoOS9jeespiAqL1xyXG4gIEBJbnB1dCgpIHN0YXJ0UGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKuWxleekuue7k+adn+aXtumXtOWNoOS9jeespiAqL1xyXG4gIEBJbnB1dCgpIGVuZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICAvKirmoKHpqozplJnor6/ml7bmmL7npLrplJnor6/kv6Hmga8gKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICAvKirmmK/lkKbnpoHnlKggKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvKirlt7LpgInml7bpl7QgKi9cclxuICBASW5wdXQoKSBkYXRlczogQXJyYXk8bW9tZW50Xy5Nb21lbnQgfCBzdHJpbmc+ID0gW107XHJcbiAgLyoq5pel5pyf5pe26Ze05bGV56S65qC85byP77yM6buY6K6k5Y+q5bGV56S65pel5pyfICovXHJcbiAgQElucHV0KCkgZm9ybWF0OiBzdHJpbmcgPSBEQVRFX0ZPUk1BVDtcclxuICAvKirmmK/lkKblsZXnpLrml7bpl7TvvIzpu5jorqTkuI3lsZXnpLogKi9cclxuICBASW5wdXQoKSBpc1Nob3dUaW1lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoq5pi+56S65ZyoZm9vdGVy5bem5L6n55qE6Ieq5a6a5LmJ5pe26Ze05qCH562+5pWw57uE77yM5aaC4oCc5pio5aSp4oCd562JICovXHJcbiAgQElucHV0KCkgZm9vdGVySXRlbXM6IERhdGVQaWNrZXJGb290ZXJJdGVtW10gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VXcmFwcGVyJykgZGF0ZVJhbmdlV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVJhbmdlU3RhcnRQaWNrZXInKSBkYXRlUmFuZ2VTdGFydFBpY2tlcjogTnBJbnB1dDtcclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VFbmRQaWNrZXInKSBkYXRlUmFuZ2VFbmRQaWNrZXI6IE5wSW5wdXQ7XHJcblxyXG4gIGRhdGVyYW5nZVBpY2tlclBvcHVwUmVmOiBDb21wb25lbnRSZWY8TnBEYXRlUmFuZ2VQaWNrZXJQb3B1cD47XHJcblxyXG5cclxuICBzdGFydERhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nO1xyXG4gIGVuZERhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XHJcbiAgaXNIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLnN0YXJ0RGF0ZeaUueWPmOaXtuatpOWAvOS8muWQjOatpeaUueWPmCovXHJcbiAgc1ZhbHVlOiBzdHJpbmc7XHJcblxyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLmVuZERhdGXmlLnlj5jml7bmraTlgLzkvJrlkIzmraXmlLnlj5gqL1xyXG4gIGVWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBOcERhdGVQaWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlcyAmJiB0aGlzLmRhdGVzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5kYXRlc1swXSkuY2xvbmUoKSwgbW9tZW50KHRoaXMuZGF0ZXNbMV0pLmNsb25lKCkpO1xyXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGRhdGVzWzBdO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBkYXRlc1sxXTtcclxuICAgICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICAgIHRoaXMuc3luY0VWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0T3ZlcmxheVJlZih0aGlzLmRhdGVSYW5nZVN0YXJ0UGlja2VyLm5wSW5wdXQpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgb25TdGFydFBpY2tlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBvbkVuZFBpY2tlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBvblRvZ2dsZURhdGVQaWNrZXJQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBEYXRlUmFuZ2VQaWNrZXJQb3B1cCkpO1xyXG4gICAgdGhpcy5kYXRlcmFuZ2VQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5kYXRlUGlja2VyVHlwZSA9ICdkYXRlLXJhbmdlLXBpY2tlcic7XHJcbiAgICB0aGlzLmRhdGVyYW5nZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmZvb3Rlckl0ZW1zID0gdGhpcy5mb290ZXJJdGVtcztcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2Uuc3RhcnREYXRlID0gbW9tZW50KHRoaXMuc3RhcnREYXRlKTtcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZW5kRGF0ZSA9IG1vbWVudCh0aGlzLmVuZERhdGUpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVOb3RpZnlFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlV3JhcHBlciAmJiB0aGlzLmRhdGVSYW5nZVdyYXBwZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmRhdGVSYW5nZVdyYXBwZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdGFydERhdGVCbHVyKGRhdGE6IHsgdmFsdWU6IGFueSwgZXZlbnQ6IGFueSB9KSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKGRhdGEudmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KGRhdGEudmFsdWUsIHRoaXMuZm9ybWF0KS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aaC5p6c6L6T5YWl5pel5pyf5LiN5ZCI5rOV77yM6buY6K6k5b2T5YmN5pe26Ze0XHJcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5zdGFydERhdGUpLmNsb25lKCksIG1vbWVudCh0aGlzLmVuZERhdGUpLmNsb25lKCkpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGVzWzFdO1xyXG4gICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gICAgdGhpcy5vbkRhdGVSYW5nZUNoYW5nZWQuZW1pdChbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gIH1cclxuXHJcbiAgb25FbmREYXRlQmx1cihkYXRhOiB7IHZhbHVlOiBhbnksIGV2ZW50OiBhbnkgfSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZChkYXRhLnZhbHVlKSkge1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZGF0YS52YWx1ZSwgdGhpcy5mb3JtYXQpLmNsb25lKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlpoLmnpzovpPlhaXml6XmnJ/kuI3lkIjms5XvvIzpu5jorqTlvZPliY3ml7bpl7RcclxuICAgICAgdGhpcy5lbmREYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5zdGFydERhdGUpLmNsb25lKCksIG1vbWVudCh0aGlzLmVuZERhdGUpLmNsb25lKCkpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGVzWzFdO1xyXG4gICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gICAgdGhpcy5vbkRhdGVSYW5nZUNoYW5nZWQuZW1pdChbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnREYXRlID0gbnVsbDtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLnN5bmNTVmFsdWUoKTtcclxuICAgIHRoaXMuc3luY0VWYWx1ZSgpO1xyXG5cclxuICAgIHRoaXMuZW1pdENoYW5nZShbXSk7XHJcbiAgICB0aGlzLm9uRGF0ZVJhbmdlQ2hhbmdlZC5lbWl0KFtdKTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VlbnRlcigpIHtcclxuICAgIHRoaXMuaXNIb3ZlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlbGVhdmUoKSB7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBQcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5zdGFydERhdGXmlLnlj5jml7bvvIzov5nkuKrmlrnms5Xpg73lv4XpobvopoHosIPnlKggKi9cclxuICBwcml2YXRlIHN5bmNTVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuc3RhcnREYXRlKSkge1xyXG4gICAgICB0aGlzLnNWYWx1ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5mb3JtYXQpLmZvcm1hdCh0aGlzLmZvcm1hdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5lbmREYXRl5pS55Y+Y5pe277yM6L+Z5Liq5pa55rOV6YO95b+F6aG76KaB6LCD55SoICovXHJcbiAgcHJpdmF0ZSBzeW5jRVZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuZW5kRGF0ZSAmJiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmlzVmFsaWQodGhpcy5lbmREYXRlKSkge1xyXG4gICAgICB0aGlzLmVWYWx1ZSA9IG1vbWVudCh0aGlzLmVuZERhdGUsIHRoaXMuZm9ybWF0KS5mb3JtYXQodGhpcy5mb3JtYXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lVmFsdWUgPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU5vdGlmeUV2ZW50cygpIHtcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2Uub25TdGFydERheUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IHsgZGF5OiBEYXlEYXRhUGVyTW9udGgsIGRhdGVzOiBBcnJheTxhbnk+IH0pID0+IHtcclxuICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZCh0aGlzLmVuZERhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0RGF0YUFuZENsb3NlUG9wdXAoW3Jlcy5kYXkuZGF0ZSwgbW9tZW50KHRoaXMuZW5kRGF0ZSkuY2xvbmUoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gcmVzLmRheS5kYXRlO1xyXG4gICAgICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGVyYW5nZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uRW5kRGF5Q2xpY2tlZC5zdWJzY3JpYmUoKHJlczogeyBkYXk6IERheURhdGFQZXJNb250aCwgZGF0ZXM6IEFycmF5PGFueT4gfSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuc3RhcnREYXRlKSkge1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFtyZXMuZGF5LmRhdGUsIG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSkuY2xvbmUoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IHJlcy5kYXkuZGF0ZTtcclxuICAgICAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXRlcmFuZ2VQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkl0ZW1MYWJlbENsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERhdGVQaWNrZXJGb290ZXJJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLnZhbHVlcyAmJiByZXMudmFsdWVzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgIGlmICgoKHJlcy52YWx1ZXNbMF0pIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICgocmVzLnZhbHVlc1sxXSkgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFsoPGFueT5yZXMudmFsdWVzWzBdKSgpLCAoPGFueT5yZXMudmFsdWVzWzFdKSgpXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFttb21lbnQoPGFueT5yZXMudmFsdWVzWzBdKSwgbW9tZW50KDxhbnk+cmVzLnZhbHVlc1sxXSldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0RGF0YUFuZENsb3NlUG9wdXAoZGF0ZXM6IEFycmF5PG1vbWVudF8uTW9tZW50Pikge1xyXG4gICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5zb3J0RGF0ZXMoZGF0ZXMpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBzb3J0ZWREYXRlc1swXS5jbG9uZSgpO1xyXG4gICAgdGhpcy5lbmREYXRlID0gc29ydGVkRGF0ZXNbc29ydGVkRGF0ZXMubGVuZ3RoIC0gMV0uY2xvbmUoKTtcclxuICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgdGhpcy5zeW5jRVZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UoW3RoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGVdKTtcclxuICAgIHRoaXMub25EYXRlUmFuZ2VDaGFuZ2VkLmVtaXQoW3RoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGVdKTtcclxuICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAob2JqICYmIG9iai5sZW5ndGggPT09IDIgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKG9ialswXSkgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKG9ialsxXSkpIHtcclxuICAgICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5zb3J0RGF0ZXMob2JqKTtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSBzb3J0ZWREYXRlc1swXS5jbG9uZSgpO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBzb3J0ZWREYXRlc1tzb3J0ZWREYXRlcy5sZW5ndGggLSAxXS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgdGhpcy5zeW5jRVZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZW1pdENoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn0iXX0=