@kre-form/ant
Version:
396 lines (394 loc) • 46.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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 {?} */
const moment = moment_;
/** @type {?} */
const differenceInCalendarDays = differenceInCalendarDays_;
export class KreFormFieldDateTime extends FieldType {
/**
* @param {?} globalService
* @param {?} commonService
*/
constructor(globalService, commonService) {
super();
this.globalService = globalService;
this.commonService = commonService;
this.disabledDate = (/**
* @param {?} current
* @return {?}
*/
(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 {?}
*/
(e) => {
/** @type {?} */
let nzDisabledHours = [];
/** @type {?} */
let 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 = [
...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 = [
...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 {?}
*/
() => nzDisabledHours),
nzDisabledMinutes: (/**
* @return {?}
*/
() => nzDisabledMinutes),
nzDisabledSeconds: (/**
* @return {?}
*/
() => []),
};
});
this.disabledHours = (/**
* @return {?}
*/
() => {
/** @type {?} */
let 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 {?}
*/
(e) => {
/** @type {?} */
let 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;
});
}
/**
*
* @param {?} e
* @param {?} global 该变量是用来做之前的兼容,具体用来干什么 需要看外部的调用
* @return {?}
*/
nzOnOpenChange(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);
}
}
//datetime date month year time
/**
* @return {?}
*/
get format() {
/** @type {?} */
let 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;
}
/**
* @return {?}
*/
get showType() {
/** @type {?} */
let 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;
}
/**
* @return {?}
*/
getText() {
/** @type {?} */
let 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 {?} */
const 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;
// }
// }
/**
* @param {?} start
* @param {?} end
* @return {?}
*/
range(start, end) {
/** @type {?} */
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
/**
* @return {?}
*/
get showToday() {
if (typeof this.to.today === "undefined") {
return true;
}
return !!this.to.today;
}
}
KreFormFieldDateTime.decorators = [
{ type: Component, args: [{
selector: "krefield-datetime",
template: `
<ng-container *ngIf="formStatus !== 0; else other">
<div class="control-design">
<input nz-input disabled />
</div>
</ng-container>
<ng-template #other>
<ng-container *ngIf="editor === true">
<ng-container [ngSwitch]="showType">
<ng-container *ngSwitchCase="'datetime'">
<nz-date-picker
nzShowTime
[nzShowTime]="{ nzFormat: 'HH:mm' }"
nzFormat="yyyy/MM/dd HH:mm"
[formControl]="formControl"
[kreFormAttributes]="field"
[class.is-invalid]="showError"
[nzDisabledDate]="disabledDate"
[nzDisabledTime]="disabledDateTime"
[nzPlaceHolder]="to.placeholder || undefined"
(nzOnOpenChange)="nzOnOpenChange($event, true)"
></nz-date-picker>
</ng-container>
<ng-container *ngSwitchCase="'date'">
<nz-date-picker
nzFormat="yyyy/MM/dd"
[formControl]="formControl"
[kreFormAttributes]="field"
[nzDisabledDate]="disabledDate"
[class.is-invalid]="showError"
[nzShowToday]="showToday"
[nzPlaceHolder]="to.placeholder || undefined"
(nzOnOpenChange)="nzOnOpenChange($event, false)"
></nz-date-picker>
</ng-container>
<ng-container *ngSwitchCase="'year'">
<nz-year-picker
nzFormat="yyyy"
[formControl]="formControl"
[kreFormAttributes]="field"
[class.is-invalid]="showError"
[nzPlaceHolder]="to.placeholder || undefined"
(nzOnOpenChange)="nzOnOpenChange($event, false)"
></nz-year-picker>
</ng-container>
<ng-container *ngSwitchCase="'month'">
<nz-month-picker
nzFormat="yyyy/MM"
[formControl]="formControl"
[kreFormAttributes]="field"
[class.is-invalid]="showError"
[nzPlaceHolder]="to.placeholder || undefined"
(nzOnOpenChange)="nzOnOpenChange($event, false)"
></nz-month-picker>
</ng-container>
<ng-container *ngSwitchCase="'time'">
<nz-time-picker
nzFormat="HH:mm"
[formControl]="formControl"
[kreFormAttributes]="field"
[class.is-invalid]="showError"
[nzDisabledHours]="disabledHours"
[nzDisabledMinutes]="disabledMinutes"
(nzOpenChange)="nzOnOpenChange($event, true)"
[nzPlaceHolder]="to.placeholder || undefined"
nzClearText=""
[nzPopupClassName]="field.className"
></nz-time-picker>
</ng-container>
<ng-container *ngSwitchDefault></ng-container>
</ng-container>
</ng-container>
<div class="fieldtext" *ngIf="editor === false">
{{ getText() }}
</div>
</ng-template>
`
}] }
];
/** @nocollapse */
KreFormFieldDateTime.ctorParameters = () => [
{ type: FormGlobalService },
{ type: KreFormCommonService }
];
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3JlLWZvcm0vYW50LyIsInNvdXJjZXMiOlsibGliL3R5cGVzL2RhdGV0aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sS0FBSyx5QkFBeUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFnQixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUUzRCxNQUFNLEdBQUcsT0FBTzs7TUFDaEIsd0JBQXdCLEdBQUcseUJBQXlCO0FBb0YxRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsU0FBUzs7Ozs7SUFDakQsWUFDVSxhQUFnQyxFQUNoQyxhQUFtQztRQUUzQyxLQUFLLEVBQUUsQ0FBQztRQUhBLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUF1RzdDLGlCQUFZOzs7O1FBQUcsQ0FBQyxPQUFhLEVBQVcsRUFBRTtZQUN4QyxJQUFJLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxFQUFFO2dCQUM1QyxPQUFPLENBQ0wsd0JBQXdCLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFBLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQ2pFLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBQSxtQkFBQSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsT0FBTyxFQUFDLENBQUMs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LENBQUM7d0JBQ3hDLE1BQU07b0JBQ1IsS0FBSyxNQUFNO3dCQUNULE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QyxNQUFNO2lCQUNUO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7SUEySkQsS0FBSyxDQUFDLEtBQWEsRUFBRSxHQUFXOztjQUN4QixNQUFNLEdBQWEsRUFBRTtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs7O0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUN4QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQzs7O1lBbldGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThFVDthQUNGOzs7O1lBdEZzQixpQkFBaUI7WUFGcEIsb0JBQW9COzs7O0lBbU10Qyw0Q0FhRTs7SUFFRixnREErREU7O0lBRUYsNkNBaUJFOztJQUVGLCtDQThDRTs7Ozs7SUF6UEEsNkNBQXdDOzs7OztJQUN4Qyw2Q0FBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0ICogYXMgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXyBmcm9tIFwiZGF0ZS1mbnMvZGlmZmVyZW5jZV9pbl9jYWxlbmRhcl9kYXlzXCI7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEtyZUZvcm1Db21tb25TZXJ2aWNlIH0gZnJvbSBcIkBrcmUtZm9ybS9jb3JlXCI7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCB7IEZpZWxkV3JhcHBlciwgRm9ybUdsb2JhbFNlcnZpY2UgfSBmcm9tIFwiQGtyZS1mb3JtL2NvcmVcIjtcblxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcbmNvbnN0IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c187XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrcmVmaWVsZC1kYXRldGltZVwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtU3RhdHVzICE9PSAwOyBlbHNlIG90aGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC1kZXNpZ25cIj5cbiAgICAgICAgPGlucHV0IG56LWlucHV0IGRpc2FibGVkIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjb3RoZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdG9yID09PSB0cnVlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInNob3dUeXBlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxuICAgICAgICAgICAgPG56LWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgIG56U2hvd1RpbWVcbiAgICAgICAgICAgICAgW256U2hvd1RpbWVdPVwieyBuekZvcm1hdDogJ0hIOm1tJyB9XCJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5L01NL2RkIEhIOm1tXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWREYXRlXT1cImRpc2FibGVkRGF0ZVwiXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkVGltZV09XCJkaXNhYmxlZERhdGVUaW1lXCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAgICAgPjwvbnotZGF0ZS1waWNrZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICA8bnotZGF0ZS1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5L01NL2RkXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWREYXRlXT1cImRpc2FibGVkRGF0ZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInNob3dFcnJvclwiXG4gICAgICAgICAgICAgIFtuelNob3dUb2RheV09XCJzaG93VG9kYXlcIlxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJ0by5wbGFjZWhvbGRlciB8fCB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAobnpPbk9wZW5DaGFuZ2UpPVwibnpPbk9wZW5DaGFuZ2UoJGV2ZW50LCBmYWxzZSlcIlxuICAgICAgICAgICAgPjwvbnotZGF0ZS1waWNrZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3llYXInXCI+XG4gICAgICAgICAgICA8bnoteWVhci1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgICAgID48L256LXllYXItcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb250aCdcIj5cbiAgICAgICAgICAgIDxuei1tb250aC1waWNrZXJcbiAgICAgICAgICAgICAgbnpGb3JtYXQ9XCJ5eXl5L01NXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwidG8ucGxhY2Vob2xkZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgKG56T25PcGVuQ2hhbmdlKT1cIm56T25PcGVuQ2hhbmdlKCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgICAgID48L256LW1vbnRoLXBpY2tlcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGltZSdcIj5cbiAgICAgICAgICAgIDxuei10aW1lLXBpY2tlclxuICAgICAgICAgICAgICBuekZvcm1hdD1cIkhIOm1tXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2tyZUZvcm1BdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwic2hvd0Vycm9yXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRIb3Vyc109XCJkaXNhYmxlZEhvdXJzXCJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRNaW51dGVzXT1cImRpc2FibGVkTWludXRlc1wiXG4gICAgICAgICAgICAgIChuek9wZW5DaGFuZ2UpPVwibnpPbk9wZW5DaGFuZ2UoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInRvLnBsYWNlaG9sZGVyIHx8IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgIG56Q2xlYXJUZXh0PVwiXCJcbiAgICAgICAgICAgICAgW256UG9wdXBDbGFzc05hbWVdPVwiZmllbGQuY2xhc3NOYW1lXCJcbiAgICAgICAgICAgID48L256LXRpbWUtcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkdGV4dFwiICpuZ0lmPVwiZWRpdG9yID09PSBmYWxzZVwiPlxuICAgICAgICB7eyBnZXRUZXh0KCkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEtyZUZvcm1GaWVsZERhdGVUaW1lIGV4dGVuZHMgRmllbGRUeXBlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBnbG9iYWxTZXJ2aWNlOiBGb3JtR2xvYmFsU2VydmljZSxcbiAgICBwcml2YXRlIGNvbW1vblNlcnZpY2U6IEtyZUZvcm1Db21tb25TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVcbiAgICogQHBhcmFtIGdsb2JhbCDor6Xlj5jph4/mmK/nlKjmnaXlgZrkuYvliY3nmoTlhbzlrrnvvIzlhbfkvZPnlKjmnaXlubLku4DkuYgg6ZyA6KaB55yL5aSW6YOo55qE6LCD55SoXG4gICAqL1xuICBuek9uT3BlbkNoYW5nZShlOiBhbnksIGdsb2JhbDogYm9vbGVhbikge1xuICAgIGlmIChnbG9iYWwgPT0gdHJ1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIXRoaXMuZmllbGQgJiZcbiAgICAgICAgISF0aGlzLmZpZWxkLnRlbXBsYXRlT3B0aW9ucyAmJlxuICAgICAgICB0aGlzLmZpZWxkLnRlbXBsYXRlT3B0aW9ucy5lbmFibGVJbnRlcmZhY2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmdsb2JhbFNlcnZpY2Uubm90aWZ5RGF0YUNoYW5nZWQoXCJEYXRlVGltZUNsaWNrXCIsIHtcbiAgICAgICAgICByZG06IE1hdGgucmFuZG9tKCksXG4gICAgICAgICAgY29uZmlnOiB0aGlzLmZpZWxkLFxuICAgICAgICAgIHN0YXRlOiBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlID09IGZhbHNlICYmXG4gICAgICB0aGlzLnRvICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy50byAhPSBudWxsICYmXG4gICAgICB0aGlzLnRvLmJsdXIgIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRvLmJsdXIgIT0gbnVsbFxuICAgICkge1xuICAgICAgdGhpcy50by5ibHVyKHRoaXMuZmllbGQsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8vZGF0ZXRpbWUgZGF0ZSBtb250aCB5ZWFyIHRpbWVcbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJ5eXl5L01NL2RkIEhIOm1tXCI7XG4gICAgaWYgKFxuICAgICAgdGhpcy50byFbXCJmb3JtYXRcIl0gIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRvIVtcImZvcm1hdFwiXSAhPSBudWxsICYmXG4gICAgICB0aGlzLnRvIVtcImZvcm1hdFwiXSAhPSBcIlwiXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnRvIVtcImZvcm1hdFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBnZXQgc2hvd1R5cGUoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiZGF0ZXRpbWVcIjtcbiAgICBpZiAoXG4gICAgICB0aGlzLnRvIVtcInR5cGVcIl0gIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRvIVtcInR5cGVcIl0gIT0gbnVsbCAmJlxuICAgICAgdGhpcy50byFbXCJ0eXBlXCJdICE9IFwiXCJcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMudG8hW1widHlwZVwiXS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0VGV4dCgpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoXG4gICAgICB0aGlzLnRvIS50eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMudG8hLnR5cGUgPT09IG51bGwgfHxcbiAgICAgIHRoaXMudG8hLnR5cGUgPT09IFwiXCJcbiAgICApIHtcbiAgICAgIHRoaXMudG8hLnR5cGUgPSBcImRhdGV0aW1lXCI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm1vZGVsICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmllbGQgIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmZpZWxkICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmllbGQua2V5ICE9IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5maWVsZC5rZXkgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkLmtleV0gIT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGQua2V5XSAhPSBudWxsICYmXG4gICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGQua2V5XSAhPSBcIlwiXG4gICAgKSB7XG4gICAgICBpZiAobW9tZW50KHRoaXMubW9kZWxbdGhpcy5maWVsZC5rZXldKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgY29uc3QgZGF0ZTogYW55ID0gdGhpcy5tb2RlbFt0aGlzLmZpZWxkLmtleV07XG4gICAgICAgIHN3aXRjaCAodGhpcy50byEudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICAgICAgcmVzdWx0ID0gbW9tZW50KGRhdGUpLmZvcm1hdChcIllZWVkvTU0vREQgSEg6bW1cIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgcmVzdWx0ID0gbW9tZW50KGRhdGUpLmZvcm1hdChcIllZWVkvTU0vRERcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwieWVhclwiOlxuICAgICAgICAgICAgcmVzdWx0ID0gbW9tZW50KGRhdGUpLmZvcm1hdChcIllZWVlcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZL01NXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRpbWVcIjpcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudChkYXRlKS5mb3JtYXQoXCJISDptbVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGlzYWJsZWREYXRlID0gKGN1cnJlbnQ6IERhdGUpOiBib29sZWFuID0+IHtcbiAgICBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICEhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA+IDAgfHxcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUhKSkgPCAwXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGN1cnJlbnQsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA+IDA7XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIHJldHVybiBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoY3VycmVudCwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkpIDwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBkaXNhYmxlZERhdGVUaW1lID0gKGU6IERhdGUpID0+IHtcbiAgICBsZXQgbnpEaXNhYmxlZEhvdXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGxldCBuekRpc2FibGVkTWludXRlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgISF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBpZiAoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpKSA9PT0gMCkge1xuICAgICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKC0xLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKS5nZXRIb3VycygpKTtcblxuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldE1pbnV0ZXMoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkpID09PSAwKSB7XG4gICAgICAgIG56RGlzYWJsZWRIb3VycyA9IFtcbiAgICAgICAgICAuLi5uekRpc2FibGVkSG91cnMsXG4gICAgICAgICAgLi4udGhpcy5yYW5nZShuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpICsgMSwgMjQpLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gW1xuICAgICAgICAgICAgLi4ubnpEaXNhYmxlZE1pbnV0ZXMsXG4gICAgICAgICAgICAuLi50aGlzLnJhbmdlKG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldE1pbnV0ZXMoKSwgNjApLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIWUgJiZcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpKSA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIG56RGlzYWJsZWRIb3VycyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0SG91cnMoKSArIDEsXG4gICAgICAgICAgMjRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgNjBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFlICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5taW5EYXRlKSkgPT09IDBcbiAgICAgICkge1xuICAgICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKDAsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkpO1xuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldE1pbnV0ZXMoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG56RGlzYWJsZWRIb3VyczogKCkgPT4gbnpEaXNhYmxlZEhvdXJzLFxuICAgICAgbnpEaXNhYmxlZE1pbnV0ZXM6ICgpID0+IG56RGlzYWJsZWRNaW51dGVzLFxuICAgICAgbnpEaXNhYmxlZFNlY29uZHM6ICgpID0+IFtdLFxuICAgIH07XG4gIH07XG5cbiAgZGlzYWJsZWRIb3VycyA9ICgpID0+IHtcbiAgICBsZXQgbnpEaXNhYmxlZEhvdXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIG56RGlzYWJsZWRIb3VycyA9IHRoaXMucmFuZ2UoLTEsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpLmdldEhvdXJzKCkpO1xuICAgICAgbnpEaXNhYmxlZEhvdXJzID0gbnpEaXNhYmxlZEhvdXJzLmNvbmNhdChcbiAgICAgICAgdGhpcy5yYW5nZShuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpICsgMSwgMjQpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoISF0aGlzLnRvIS5tYXhEYXRlICYmICF0aGlzLnRvIS5taW5EYXRlKSB7XG4gICAgICBuekRpc2FibGVkSG91cnMgPSB0aGlzLnJhbmdlKFxuICAgICAgICBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpICsgMSxcbiAgICAgICAgMjRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIG56RGlzYWJsZWRIb3VycyA9IHRoaXMucmFuZ2UoMCwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSk7XG4gICAgfVxuICAgIHJldHVybiBuekRpc2FibGVkSG91cnM7XG4gIH07XG5cbiAgZGlzYWJsZWRNaW51dGVzID0gKGU6IERhdGUpID0+IHtcbiAgICBsZXQgbnpEaXNhYmxlZE1pbnV0ZXM6IG51bWJlcltdID0gW107XG4gICAgaWYgKCEhdGhpcy50byEubWF4RGF0ZSAmJiAhIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSwgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkpID09PSAwKSB7XG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gdGhpcy5yYW5nZShcbiAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0TWludXRlcygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPT09IDApIHtcbiAgICAgICAgaWYgKCEhZSAmJiBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRIb3VycygpIC0gZS5nZXRIb3VycygpID09PSAwKSB7XG4gICAgICAgICAgbnpEaXNhYmxlZE1pbnV0ZXMgPSB0aGlzLnJhbmdlKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWF4RGF0ZSkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgNjBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIXRoaXMudG8hLm1heERhdGUgJiYgIXRoaXMudG8hLm1pbkRhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFlICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLCBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKSkgPT09IDBcbiAgICAgICkge1xuICAgICAgICBpZiAoISFlICYmIG5ldyBEYXRlKHRoaXMudG8hLm1heERhdGUpLmdldEhvdXJzKCkgLSBlLmdldEhvdXJzKCkgPT09IDApIHtcbiAgICAgICAgICBuekRpc2FibGVkTWludXRlcyA9IHRoaXMucmFuZ2UoXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLnRvIS5tYXhEYXRlKS5nZXRNaW51dGVzKCksXG4gICAgICAgICAgICA2MFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLnRvIS5tYXhEYXRlICYmICEhdGhpcy50byEubWluRGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIWUgJiZcbiAgICAgICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsIG5ldyBEYXRlKHRoaXMudG8hLm1pbkRhdGUpKSA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIGlmICghIWUgJiYgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0SG91cnMoKSAtIGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgIG56RGlzYWJsZWRNaW51dGVzID0gdGhpcy5yYW5nZShcbiAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy50byEubWluRGF0ZSkuZ2V0TWludXRlcygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuekRpc2FibGVkTWludXRlcztcbiAgfTtcbiAgLy8gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGU6IERhdGUgfCBudWxsLCBkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgLy8gICBpZiAoISFlKSB7XG4gIC8vICAgICByZXR1cm4gZS5nZXREYXRlKCkgLSBkYXRlLmdldERhdGUoKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgcmV0dXJuIDA7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldCBzaG93VG9kYXkoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnRvLnRvZGF5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy50by50b2RheTtcbiAgfVxufVxuIl19