@kre-form/ant
Version:
361 lines • 48.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component } from "@angular/core";
import * as differenceInCalendarDays_ from "date-fns/difference_in_calendar_days";
import { FieldType, KreFormCommonService } from "@kre-form/core";
import * as moment_ from "moment";
import { FormGlobalService } from "@kre-form/core";
/** @type {?} */
var moment = moment_;
/** @type {?} */
var differenceInCalendarDays = differenceInCalendarDays_;
var KreFormFieldDateTime = /** @class */ (function (_super) {
tslib_1.__extends(KreFormFieldDateTime, _super);
function KreFormFieldDateTime(globalService, commonService) {
var _this = _super.call(this) || this;
_this.globalService = globalService;
_this.commonService = commonService;
_this.disabledDate = (/**
* @param {?} current
* @return {?}
*/
function (current) {
if (!!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
return (differenceInCalendarDays(current, new Date((/** @type {?} */ (_this.to)).maxDate)) > 0 ||
differenceInCalendarDays(current, new Date((/** @type {?} */ ((/** @type {?} */ (_this.to)).minDate)))) < 0);
}
else if (!!(/** @type {?} */ (_this.to)).maxDate && !(/** @type {?} */ (_this.to)).minDate) {
return differenceInCalendarDays(current, new Date((/** @type {?} */ (_this.to)).maxDate)) > 0;
}
else if (!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
return differenceInCalendarDays(current, new Date((/** @type {?} */ (_this.to)).minDate)) < 0;
}
else {
return false;
}
});
_this.disabledDateTime = (/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var nzDisabledHours = [];
/** @type {?} */
var nzDisabledMinutes = [];
if (!!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
if (differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).minDate)) === 0) {
nzDisabledHours = _this.range(-1, new Date((/** @type {?} */ (_this.to)).minDate).getHours());
if (!!e && new Date((/** @type {?} */ (_this.to)).minDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(-1, new Date((/** @type {?} */ (_this.to)).minDate).getMinutes());
}
}
if (differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).maxDate)) === 0) {
nzDisabledHours = tslib_1.__spread(nzDisabledHours, _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getHours() + 1, 24));
if (!!e && new Date((/** @type {?} */ (_this.to)).maxDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = tslib_1.__spread(nzDisabledMinutes, _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getMinutes(), 60));
}
}
}
else if (!!(/** @type {?} */ (_this.to)).maxDate && !(/** @type {?} */ (_this.to)).minDate) {
if (!!e &&
differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).maxDate)) === 0) {
nzDisabledHours = _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getHours() + 1, 24);
if (!!e && new Date((/** @type {?} */ (_this.to)).maxDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getMinutes(), 60);
}
}
}
else if (!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
if (!!e &&
differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).minDate)) === 0) {
nzDisabledHours = _this.range(0, new Date((/** @type {?} */ (_this.to)).minDate).getHours());
if (!!e && new Date((/** @type {?} */ (_this.to)).minDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(-1, new Date((/** @type {?} */ (_this.to)).minDate).getMinutes());
}
}
}
return {
nzDisabledHours: (/**
* @return {?}
*/
function () { return nzDisabledHours; }),
nzDisabledMinutes: (/**
* @return {?}
*/
function () { return nzDisabledMinutes; }),
nzDisabledSeconds: (/**
* @return {?}
*/
function () { return []; }),
};
});
_this.disabledHours = (/**
* @return {?}
*/
function () {
/** @type {?} */
var nzDisabledHours = [];
if (!!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
nzDisabledHours = _this.range(-1, new Date((/** @type {?} */ (_this.to)).minDate).getHours());
nzDisabledHours = nzDisabledHours.concat(_this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getHours() + 1, 24));
}
else if (!!(/** @type {?} */ (_this.to)).maxDate && !(/** @type {?} */ (_this.to)).minDate) {
nzDisabledHours = _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getHours() + 1, 24);
}
else if (!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
nzDisabledHours = _this.range(0, new Date((/** @type {?} */ (_this.to)).minDate).getHours());
}
return nzDisabledHours;
});
_this.disabledMinutes = (/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var nzDisabledMinutes = [];
if (!!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
if (differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).minDate)) === 0) {
if (!!e && new Date((/** @type {?} */ (_this.to)).minDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(-1, new Date((/** @type {?} */ (_this.to)).minDate).getMinutes());
}
}
if (differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).maxDate)) === 0) {
if (!!e && new Date((/** @type {?} */ (_this.to)).maxDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getMinutes(), 60);
}
}
}
else if (!!(/** @type {?} */ (_this.to)).maxDate && !(/** @type {?} */ (_this.to)).minDate) {
if (!!e &&
differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).maxDate)) === 0) {
if (!!e && new Date((/** @type {?} */ (_this.to)).maxDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(new Date((/** @type {?} */ (_this.to)).maxDate).getMinutes(), 60);
}
}
}
else if (!(/** @type {?} */ (_this.to)).maxDate && !!(/** @type {?} */ (_this.to)).minDate) {
if (!!e &&
differenceInCalendarDays(e, new Date((/** @type {?} */ (_this.to)).minDate)) === 0) {
if (!!e && new Date((/** @type {?} */ (_this.to)).minDate).getHours() - e.getHours() === 0) {
nzDisabledMinutes = _this.range(-1, new Date((/** @type {?} */ (_this.to)).minDate).getMinutes());
}
}
}
return nzDisabledMinutes;
});
return _this;
}
/**
*
* @param e
* @param global 该变量是用来做之前的兼容,具体用来干什么 需要看外部的调用
*/
/**
*
* @param {?} e
* @param {?} global 该变量是用来做之前的兼容,具体用来干什么 需要看外部的调用
* @return {?}
*/
KreFormFieldDateTime.prototype.nzOnOpenChange = /**
*
* @param {?} e
* @param {?} global 该变量是用来做之前的兼容,具体用来干什么 需要看外部的调用
* @return {?}
*/
function (e, global) {
if (global == true) {
if (!!this.field &&
!!this.field.templateOptions &&
this.field.templateOptions.enableInterface) {
this.globalService.notifyDataChanged("DateTimeClick", {
rdm: Math.random(),
config: this.field,
state: e,
});
}
}
if (e == false &&
this.to != undefined &&
this.to != null &&
this.to.blur != undefined &&
this.to.blur != null) {
this.to.blur(this.field, null);
}
};
Object.defineProperty(KreFormFieldDateTime.prototype, "format", {
//datetime date month year time
get:
//datetime date month year time
/**
* @return {?}
*/
function () {
/** @type {?} */
var result = "yyyy/MM/dd HH:mm";
if ((/** @type {?} */ (this.to))["format"] != undefined &&
(/** @type {?} */ (this.to))["format"] != null &&
(/** @type {?} */ (this.to))["format"] != "") {
result = (/** @type {?} */ (this.to))["format"];
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(KreFormFieldDateTime.prototype, "showType", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var result = "datetime";
if ((/** @type {?} */ (this.to))["type"] != undefined &&
(/** @type {?} */ (this.to))["type"] != null &&
(/** @type {?} */ (this.to))["type"] != "") {
result = (/** @type {?} */ (this.to))["type"].toLowerCase();
}
return result;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
KreFormFieldDateTime.prototype.getText = /**
* @return {?}
*/
function () {
/** @type {?} */
var result = "";
if ((/** @type {?} */ (this.to)).type === undefined ||
(/** @type {?} */ (this.to)).type === null ||
(/** @type {?} */ (this.to)).type === "") {
(/** @type {?} */ (this.to)).type = "datetime";
}
if (this.model != undefined &&
this.model != null &&
this.field != undefined &&
this.field != null &&
this.field.key != undefined &&
this.field.key != null &&
this.model[this.field.key] != undefined &&
this.model[this.field.key] != null &&
this.model[this.field.key] != "") {
if (moment(this.model[this.field.key]).isValid()) {
/** @type {?} */
var date = this.model[this.field.key];
switch ((/** @type {?} */ (this.to)).type) {
case "datetime":
result = moment(date).format("YYYY/MM/DD HH:mm");
break;
case "date":
result = moment(date).format("YYYY/MM/DD");
break;
case "year":
result = moment(date).format("YYYY");
break;
case "month":
result = moment(date).format("YYYY/MM");
break;
case "time":
result = moment(date).format("HH:mm");
break;
}
}
}
return result;
};
// differenceInCalendarDays(e: Date | null, date: Date): number {
// if (!!e) {
// return e.getDate() - date.getDate();
// } else {
// return 0;
// }
// }
// differenceInCalendarDays(e: Date | null, date: Date): number {
// if (!!e) {
// return e.getDate() - date.getDate();
// } else {
// return 0;
// }
// }
/**
* @param {?} start
* @param {?} end
* @return {?}
*/
KreFormFieldDateTime.prototype.range =
// differenceInCalendarDays(e: Date | null, date: Date): number {
// if (!!e) {
// return e.getDate() - date.getDate();
// } else {
// return 0;
// }
// }
/**
* @param {?} start
* @param {?} end
* @return {?}
*/
function (start, end) {
/** @type {?} */
var result = [];
for (var i = start; i < end; i++) {
result.push(i);
}
return result;
};
Object.defineProperty(KreFormFieldDateTime.prototype, "showToday", {
get: /**
* @return {?}
*/
function () {
if (typeof this.to.today === "undefined") {
return true;
}
return !!this.to.today;
},
enumerable: true,
configurable: true
});
KreFormFieldDateTime.decorators = [
{ type: Component, args: [{
selector: "krefield-datetime",
template: "\n <ng-container *ngIf=\"formStatus !== 0; else other\">\n <div class=\"control-design\">\n <input nz-input disabled />\n </div>\n </ng-container>\n\n <ng-template #other>\n <ng-container *ngIf=\"editor === true\">\n <ng-container [ngSwitch]=\"showType\">\n <ng-container *ngSwitchCase=\"'datetime'\">\n <nz-date-picker\n nzShowTime\n [nzShowTime]=\"{ nzFormat: 'HH:mm' }\"\n nzFormat=\"yyyy/MM/dd HH:mm\"\n [formControl]=\"formControl\"\n [kreFormAttributes]=\"field\"\n [class.is-invalid]=\"showError\"\n [nzDisabledDate]=\"disabledDate\"\n [nzDisabledTime]=\"disabledDateTime\"\n [nzPlaceHolder]=\"to.placeholder || undefined\"\n (nzOnOpenChange)=\"nzOnOpenChange($event, true)\"\n ></nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <nz-date-picker\n nzFormat=\"yyyy/MM/dd\"\n [formControl]=\"formControl\"\n [kreFormAttributes]=\"field\"\n [nzDisabledDate]=\"disabledDate\"\n [class.is-invalid]=\"showError\"\n [nzShowToday]=\"showToday\"\n [nzPlaceHolder]=\"to.placeholder || undefined\"\n (nzOnOpenChange)=\"nzOnOpenChange($event, false)\"\n ></nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <nz-year-picker\n nzFormat=\"yyyy\"\n [formControl]=\"formControl\"\n [kreFormAttributes]=\"field\"\n [class.is-invalid]=\"showError\"\n [nzPlaceHolder]=\"to.placeholder || undefined\"\n (nzOnOpenChange)=\"nzOnOpenChange($event, false)\"\n ></nz-year-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'month'\">\n <nz-month-picker\n nzFormat=\"yyyy/MM\"\n [formControl]=\"formControl\"\n [kreFormAttributes]=\"field\"\n [class.is-invalid]=\"showError\"\n [nzPlaceHolder]=\"to.placeholder || undefined\"\n (nzOnOpenChange)=\"nzOnOpenChange($event, false)\"\n ></nz-month-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'time'\">\n <nz-time-picker\n nzFormat=\"HH:mm\"\n [formControl]=\"formControl\"\n [kreFormAttributes]=\"field\"\n [class.is-invalid]=\"showError\"\n [nzDisabledHours]=\"disabledHours\"\n [nzDisabledMinutes]=\"disabledMinutes\"\n (nzOpenChange)=\"nzOnOpenChange($event, true)\"\n [nzPlaceHolder]=\"to.placeholder || undefined\"\n nzClearText=\"\"\n [nzPopupClassName]=\"field.className\"\n ></nz-time-picker>\n </ng-container>\n <ng-container *ngSwitchDefault></ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"fieldtext\" *ngIf=\"editor === false\">\n {{ getText() }}\n </div>\n </ng-template>\n "
}] }
];
/** @nocollapse */
KreFormFieldDateTime.ctorParameters = function () { return [
{ type: FormGlobalService },
{ type: KreFormCommonService }
]; };
return KreFormFieldDateTime;
}(FieldType));
export { KreFormFieldDateTime };
if (false) {
/** @type {?} */
KreFormFieldDateTime.prototype.disabledDate;
/** @type {?} */
KreFormFieldDateTime.prototype.disabledDateTime;
/** @type {?} */
KreFormFieldDateTime.prototype.disabledHours;
/** @type {?} */
KreFormFieldDateTime.prototype.disabledMinutes;
/**
* @type {?}
* @private
*/
KreFormFieldDateTime.prototype.globalService;
/**
* @type {?}
* @private
*/
KreFormFieldDateTime.prototype.commonService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3JlLWZvcm0vYW50LyIsInNvdXJjZXMiOlsibGliL3R5cGVzL2RhdGV0aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEtBQUsseUJBQXlCLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFFM0QsTUFBTSxHQUFHLE9BQU87O0lBQ2hCLHdCQUF3QixHQUFHLHlCQUF5QjtBQUUxRDtJQWtGMEMsZ0RBQVM7SUFDakQsOEJBQ1UsYUFBZ0MsRUFDaEMsYUFBbUM7UUFGN0MsWUFJRSxpQkFBTyxTQUNSO1FBSlMsbUJBQWEsR0FBYixhQUFhLENBQW1CO1FBQ2hDLG1CQUFhLEdBQWIsYUFBYSxDQUFzQjtRQXVHN0Msa0JBQVk7Ozs7UUFBRyxVQUFDLE9BQWE7WUFDM0IsSUFBSSxDQUFDLENBQUMsbUJBQUEsS0FBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsbUJBQUEsS0FBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLE9BQU8sRUFBRTtnQkFDNUMsT0FBTyxDQUNMLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBQSxLQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUNqRSx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsbUJBQUEsbUJBQUEsS0FBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQ25FLENBQUM7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Q0UsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFBLEtBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDN0Q7b0JBQ0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLG1CQUFBLEtBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUNyRSxpQkFBaUIsR0FBRyxLQUFJLENBQUMsS0FBSyxDQUM1QixJQUFJLElBQUksQ0FBQyxtQkFBQSxLQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQ3ZDLEVBQUUsQ0FDSCxDQUFDO3FCQUNIO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxDQUFDLG1CQUFBLEtBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLG1CQUFBLEtBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xELElBQ0UsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFBLEtBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDN0Q7b0JBQ0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLG1CQUFBLEtBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUNyRSxpQkFBaUIsR0FBRyxLQUFJLENBQUMsS0FBSyxDQUM1QixDQUFDLENBQUMsRUFDRixJQUFJLElBQUksQ0FBQyxtQkFBQSxLQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCAqIGFzIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c18gZnJvbSBcImRhdGUtZm5zL2RpZmZlcmVuY2VfaW5fY2FsZW5kYXJfZGF5c1wiO1xuaW1wb3J0IHsgRmllbGRUeXBlLCBLcmVGb3JtQ29tbW9uU2VydmljZSB9IGZyb20gXCJAa3JlLWZvcm0vY29yZVwiO1xuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tIFwibW9tZW50XCI7XG5pbXBvcnQgeyBGaWVsZFdyYXBwZXIsIEZvcm1HbG9iYWxTZXJ2aWNlIH0gZnJvbSBcIkBrcmUtZm9ybS9jb3JlXCI7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XG5jb25zdCBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNfO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3JlZmllbGQtZGF0ZXRpbWVcIixcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybVN0YXR1cyAhPT0gMDsgZWxzZSBvdGhlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtZGVzaWduXCI+XG4gICAgICAgIDxpbnB1dCBuei1pbnB1dCBkaXNhYmxlZCAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI290aGVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRvciA9PT0gdHJ1ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzaG93VHlwZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cbiAgICAgICAgICAgIDxuei1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICBuelNob3dUaW1lXG4gICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cInsgbnpGb3JtYXQ6ICdISDptbScgfVwiXG4gICAgICAgICAgICAgIG56Rm9ybWF0PVwieXl5eS9NTS9kZCBISDptbVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtrcmVGb3JtQXR0cmlidXRlc109XCJmaWVsZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZFRpbWVdPVwiZGlzYWJsZWREYXRlVGltZVwiXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInRvLnBsYWNlaG9sZGVyIHx8IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIChuek9uT3BlbkNoYW5nZSk9XCJuek9uT3BlbkNoYW5nZSgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgICAgID48L256LWRhdGUtcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgPG56LWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgIG56Rm9ybWF0PVwieXl5eS9NTS9kZFwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtrcmVGb3JtQXR0cmlidXRlc109XCJmaWVsZFwiXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJzaG93RXJyb3JcIlxuICAgICAgICAgICAgICBbbnpTaG93VG9kYXldPVwic2hvd1RvZGF5XCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgICAgID48L256LWRhdGUtcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid5ZWFyJ1wiPlxuICAgICAgICAgICAgPG56LXllYXItcGlja2VyXG4gICAgICAgICAgICAgIG56Rm9ybWF0PVwieXl5eVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtrcmVGb3JtQXR0cmlidXRlc109XCJmaWVsZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInRvLnBsYWNlaG9sZGVyIHx8IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIChuek9uT3BlbkNoYW5nZSk9XCJuek9uT3BlbkNoYW5nZSgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgICAgICA+PC9uei15ZWFyLXBpY2tlcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbW9udGgnXCI+XG4gICAgICAgICAgICA8bnotbW9udGgtcGlja2VyXG4gICAgICAgICAgICAgIG56Rm9ybWF0PVwieXl5eS9NTVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtrcmVGb3JtQXR0cmlidXRlc109XCJmaWVsZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInRvLnBsYWNlaG9sZGVyIHx8IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIChuek9uT3BlbkNoYW5nZSk9XCJuek9uT3BlbkNoYW5nZSgkZXZlbnQsIGZhbHNlKVwiXG4gICAgICAgICAgICA+PC9uei1tb250aC1waWNrZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RpbWUnXCI+XG4gICAgICAgICAgICA8bnotdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJISDptbVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtrcmVGb3JtQXR0cmlidXRlc109XCJmaWVsZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkSG91cnNdPVwiZGlzYWJsZWRIb3Vyc1wiXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkTWludXRlc109XCJkaXNhYmxlZE1pbnV0ZXNcIlxuICAgICAgICAgICAgICAobnpPcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJ0by5wbGFjZWhvbGRlciB8fCB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICBuekNsZWFyVGV4dD1cIlwiXG4gICAgICAgICAgICAgIFtuelBvcHVwQ2xhc3NOYW1lXT1cImZpZWxkLmNsYXNzTmFtZVwiXG4gICAgICAgICAgICA+PC9uei10aW1lLXBpY2tlcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZHRleHRcIiAqbmdJZj1cImVkaXRvciA9PT0gZmFsc2VcIj5cbiAgICAgICAge3sgZ2V0VGV4dCgpIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBLcmVGb3JtRmllbGREYXRlVGltZSBleHRlbmRzIEZpZWxkVHlwZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZ2xvYmFsU2VydmljZTogRm9ybUdsb2JhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21tb25TZXJ2aWNlOiBLcmVGb3JtQ29tbW9uU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlXG4gICAqIEBwYXJhbSBnbG9iYWwg6K+l5Y+Y6YeP5piv55So5p2l5YGa5LmL5YmN55qE5YW85a6577yM5YW35L2T55So5p2l5bmy5LuA5LmIIOmcgOimgeeci+WklumDqOeahOiwg+eUqFxuICAgKi9cbiAgbnpPbk9wZW5DaGFuZ2UoZTogYW55LCBnbG9iYWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoZ2xvYmFsID09IHRydWUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISF0aGlzLmZpZWxkICYmXG4gICAgICAgICEhdGhpcy5maWVsZC50ZW1wbGF0ZU9wdGlvbnMgJiZcbiAgICAgICAgdGhpcy5maWVsZC50ZW1wbGF0ZU9wdGlvbnMuZW5hYmxlSW50ZXJmYWNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5nbG9iYWxTZXJ2aWNlLm5vdGlmeURhdGFDaGFuZ2VkKFwiRGF0ZVRpbWVDbGlja1wiLCB7XG4gICAgICAgICAgcmRtOiBNYXRoLnJhbmRvbSgpLFxuICAgICAgICAgIGNvbmZpZzogdGhpcy5maWVsZCxcbiAgICAgICAgICBzdGF0ZTogZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZSA9PSBmYWxzZSAmJlxuICAgICAgdGhpcy50byAhPSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMudG8gIT0gbnVsbCAmJlxuICAgICAgdGhpcy50by5ibHVyICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy50by5ibHVyICE9IG51bGxcbiAgICApIHtcbiAgICAgIHRoaXMudG8uYmx1cih0aGlzLmZpZWxkLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICAvL2RhdGV0aW1lIGRhdGUgbW9udGggeWVhciB0aW1lXG4gIGdldCBmb3JtYXQoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwieXl5eS9NTS9kZCBISDptbVwiO1xuICAgIGlmIChcbiAgICAgIHRoaXMudG8hW1wiZm9ybWF0XCJdICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy50byFbXCJmb3JtYXRcIl0gIT0gbnVsbCAmJlxuICAgICAgdGhpcy50byFbXCJmb3JtYXRcIl0gIT0gXCJcIlxuICAgICkge1xuICAgICAgcmVzdWx0ID0gdGhpcy50byFbXCJmb3JtYXRcIl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0IHNob3dUeXBlKCkge1xuICAgIGxldCByZXN1bHQgPSBcImRhdGV0aW1lXCI7XG4gICAgaWYgKFxuICAgICAgdGhpcy50byFbXCJ0eXBlXCJdICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy50byFbXCJ0eXBlXCJdICE9IG51bGwgJiZcbiAgICAgIHRoaXMudG8hW1widHlwZVwiXSAhPSBcIlwiXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnRvIVtcInR5cGVcIl0udG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldFRleHQoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgaWYgKFxuICAgICAgdGhpcy50byEudHlwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLnRvIS50eXBlID09PSBudWxsIHx8XG4gICAgICB0aGlzLnRvIS50eXBlID09PSBcIlwiXG4gICAgKSB7XG4gICAgICB0aGlzLnRvIS50eXBlID0gXCJkYXRldGltZVwiO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5tb2RlbCAhPSBudWxsICYmXG4gICAgICB0aGlzLmZpZWxkICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5maWVsZCAhPSBudWxsICYmXG4gICAgICB0aGlzLmZpZWxkLmtleSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuZmllbGQua2V5ICE9IG51bGwgJiZcbiAgICAgIHRoaXMubW9kZWxbdGhpcy5maWVsZC5rZXldICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkLmtleV0gIT0gbnVsbCAmJlxuICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkLmtleV0gIT0gXCJcIlxuICAgICkge1xuICAgICAgaWYgKG1vbWVudCh0aGlzLm1vZGVsW3RoaXMuZmllbGQua2V5XSkuaXNWYWxpZCgpKSB7XG4gICAgICAgIGNvbnN0IGRhdGU6IGFueSA9IHRoaXMubW9kZWxbdGhpcy5maWVsZC5rZXldO1xuICAgICAgICBzd2l0Y2ggKHRoaXMudG8hLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZL01NL0REIEhIOm1tXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZL01NL0REXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInllYXJcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XG4gICAgICAgICAgICByZXN1bHQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KFwiWVlZWS9NTVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ0aW1lXCI6XG4gICAgICAgICAgICByZXN1bHQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KFwiSEg6bW1cIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRpc2FibGVkRGF0ZSA9IChjdXJyZW50OiBEYXRlKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhjdXJyZW50LCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPiAwIHx8XG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhjdXJyZW50LCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlISkpIDwgMFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhjdXJyZW50LCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPiAwO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpKSA8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZGlzYWJsZWREYXRlVGltZSA9IChlOiBEYXRlKSA9PiB7XG4gICAgbGV0IG56RGlzYWJsZWRIb3VyczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgbnpEaXNhYmxlZE1pbnV0ZXM6IG51bWJlcltdID0gW107XG5cbiAgICBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICEhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgaWYgKGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKSkgPT09IDApIHtcbiAgICAgICAgbnpEaXNhYmxlZEhvdXJzID0gdGhpcy5yYW5nZSgtMSwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSk7XG5cbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRNaW51dGVzKClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA9PT0gMCkge1xuICAgICAgICBuekRpc2FibGVkSG91cnMgPSBbXG4gICAgICAgICAgLi4ubnpEaXNhYmxlZEhvdXJzLFxuICAgICAgICAgIC4uLnRoaXMucmFuZ2UobmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSArIDEsIDI0KSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IFtcbiAgICAgICAgICAgIC4uLm56RGlzYWJsZWRNaW51dGVzLFxuICAgICAgICAgICAgLi4udGhpcy5yYW5nZShuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRNaW51dGVzKCksIDYwKSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFlICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPT09IDBcbiAgICAgICkge1xuICAgICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldEhvdXJzKCkgKyAxLFxuICAgICAgICAgIDI0XG4gICAgICAgICk7XG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gdGhpcy5yYW5nZShcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldE1pbnV0ZXMoKSxcbiAgICAgICAgICAgIDYwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZSAmJlxuICAgICAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkpID09PSAwXG4gICAgICApIHtcbiAgICAgICAgbnpEaXNhYmxlZEhvdXJzID0gdGhpcy5yYW5nZSgwLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRIb3VycygpKTtcbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRNaW51dGVzKClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuekRpc2FibGVkSG91cnM6ICgpID0+IG56RGlzYWJsZWRIb3VycyxcbiAgICAgIG56RGlzYWJsZWRNaW51dGVzOiAoKSA9PiBuekRpc2FibGVkTWludXRlcyxcbiAgICAgIG56RGlzYWJsZWRTZWNvbmRzOiAoKSA9PiBbXSxcbiAgICB9O1xuICB9O1xuXG4gIGRpc2FibGVkSG91cnMgPSAoKSA9PiB7XG4gICAgbGV0IG56RGlzYWJsZWRIb3VyczogbnVtYmVyW10gPSBbXTtcblxuICAgIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKC0xLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRIb3VycygpKTtcbiAgICAgIG56RGlzYWJsZWRIb3VycyA9IG56RGlzYWJsZWRIb3Vycy5jb25jYXQoXG4gICAgICAgIHRoaXMucmFuZ2UobmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSArIDEsIDI0KVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgbnpEaXNhYmxlZEhvdXJzID0gdGhpcy5yYW5nZShcbiAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSArIDEsXG4gICAgICAgIDI0XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKDAsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnpEaXNhYmxlZEhvdXJzO1xuICB9O1xuXG4gIGRpc2FibGVkTWludXRlcyA9IChlOiBEYXRlKSA9PiB7XG4gICAgbGV0IG56RGlzYWJsZWRNaW51dGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBpZiAoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpKSA9PT0gMCkge1xuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldE1pbnV0ZXMoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkpID09PSAwKSB7XG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gdGhpcy5yYW5nZShcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldE1pbnV0ZXMoKSxcbiAgICAgICAgICAgIDYwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZSAmJlxuICAgICAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkpID09PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgNjBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFlICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKSkgPT09IDBcbiAgICAgICkge1xuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldE1pbnV0ZXMoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnpEaXNhYmxlZE1pbnV0ZXM7XG4gIH07XG4gIC8vIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlOiBEYXRlIHwgbnVsbCwgZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gIC8vICAgaWYgKCEhZSkge1xuICAvLyAgICAgcmV0dXJuIGUuZ2V0RGF0ZSgpIC0gZGF0ZS5nZXREYXRlKCk7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHJldHVybiAwO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHJhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXQgc2hvd1RvZGF5KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy50by50b2RheSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMudG8udG9kYXk7XG4gIH1cbn1cbiJdfQ==