@huntsman-cancer-institute/input 15.2.0 → 15.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/date/date-date.component.d.ts +3 -1
- package/date/date-validator.d.ts +3 -0
- package/esm2020/date/date-date-range.component.mjs +1 -1
- package/esm2020/date/date-date.component.mjs +48 -95
- package/esm2020/date/date-validator.mjs +12 -4
- package/esm2020/dropdown/dropdown-select.component.mjs +3 -3
- package/esm2020/select/custom-combobox.component.mjs +5 -5
- package/fesm2015/huntsman-cancer-institute-input.mjs +66 -105
- package/fesm2015/huntsman-cancer-institute-input.mjs.map +1 -1
- package/fesm2020/huntsman-cancer-institute-input.mjs +66 -105
- package/fesm2020/huntsman-cancer-institute-input.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -22,6 +22,7 @@ export declare class DateComponent extends DateBase implements OnInit, DoCheck,
|
|
|
22
22
|
inputData: Object;
|
|
23
23
|
modifiedData: Object;
|
|
24
24
|
inputDataChange: EventEmitter<any>;
|
|
25
|
+
dateValid: EventEmitter<boolean>;
|
|
25
26
|
dateForm: UntypedFormGroup;
|
|
26
27
|
dateInput: UntypedFormControl;
|
|
27
28
|
validate: boolean;
|
|
@@ -48,6 +49,7 @@ export declare class DateComponent extends DateBase implements OnInit, DoCheck,
|
|
|
48
49
|
* @returns {any}
|
|
49
50
|
*/
|
|
50
51
|
private ngbDateToString;
|
|
52
|
+
getDateValid(): boolean;
|
|
51
53
|
static ɵfac: i0.ɵɵFactoryDeclaration<DateComponent, never>;
|
|
52
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "hci-date", never, { "dateFormat": "dateFormat"; "minDate": "minDate"; "maxDate": "maxDate"; "label": "label"; "inputData": "inputData"; "modifiedData": "modifiedData"; }, { "inputDataChange": "inputDataChange"; }, never, never, false, never>;
|
|
54
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "hci-date", never, { "dateFormat": "dateFormat"; "minDate": "minDate"; "maxDate": "maxDate"; "label": "label"; "inputData": "inputData"; "modifiedData": "modifiedData"; }, { "inputDataChange": "inputDataChange"; "dateValid": "dateValid"; }, never, never, false, never>;
|
|
53
55
|
}
|
package/date/date-validator.d.ts
CHANGED
|
@@ -8,6 +8,9 @@ export declare class DateValidator {
|
|
|
8
8
|
static dateRangeValidator(ac: AbstractControl): {
|
|
9
9
|
dateRangeValidator: boolean;
|
|
10
10
|
};
|
|
11
|
+
static dateInvalidValidator(ac: AbstractControl): {
|
|
12
|
+
dateInvalidValidator: boolean;
|
|
13
|
+
};
|
|
11
14
|
static convertNgbStructToDate(struct: any): {
|
|
12
15
|
year: any;
|
|
13
16
|
month: number;
|
|
@@ -81,7 +81,7 @@ DateRangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ver
|
|
|
81
81
|
[maxDate]="maxEndDate">
|
|
82
82
|
</hci-date>
|
|
83
83
|
</div>
|
|
84
|
-
`, isInline: true, dependencies: [{ kind: "component", type: i1.DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange"] }] });
|
|
84
|
+
`, isInline: true, dependencies: [{ kind: "component", type: i1.DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange", "dateValid"] }] });
|
|
85
85
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DateRangeComponent, decorators: [{
|
|
86
86
|
type: Component,
|
|
87
87
|
args: [{
|
|
@@ -21,6 +21,7 @@ export class DateComponent extends DateBase {
|
|
|
21
21
|
// Binded data from the parent component.
|
|
22
22
|
this.dateFormat = "shortDate";
|
|
23
23
|
this.inputDataChange = new EventEmitter();
|
|
24
|
+
this.dateValid = new EventEmitter();
|
|
24
25
|
// only validate if user is typing
|
|
25
26
|
this.validate = false;
|
|
26
27
|
this.focused = false;
|
|
@@ -104,45 +105,35 @@ export class DateComponent extends DateBase {
|
|
|
104
105
|
this.state = 0;
|
|
105
106
|
this.dateForm.controls["dateInput"].setValue("");
|
|
106
107
|
this.inputDataChange.emit(this.inputData);
|
|
108
|
+
this.dateValid.emit(true);
|
|
107
109
|
}
|
|
108
110
|
onKeyUpInput(event) {
|
|
109
111
|
// Check for when the input is deleted before being saved
|
|
110
|
-
if (event.key === "Delete" || event.key === "Backspace") {
|
|
111
|
-
|
|
112
|
-
this.clear();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// update range so that the date range validator can run accurately
|
|
116
|
-
DateValidator.minValue = this.minDate;
|
|
117
|
-
DateValidator.maxValue = this.maxDate;
|
|
118
|
-
// Get the updated dateForm value
|
|
119
|
-
let eventTarget = event.target;
|
|
120
|
-
let inputValue = eventTarget.value;
|
|
121
|
-
this.dateForm.controls["dateInput"].patchValue(inputValue);
|
|
122
|
-
// if we have a good date and is within the range update the picker
|
|
123
|
-
if (DateValidator.inRange(this.dateForm.controls["dateInput"])) {
|
|
124
|
-
this.validate = false;
|
|
125
|
-
this.inputData = this.datePipe.transform(this.dateForm.controls["dateInput"].value, this.dateFormat);
|
|
126
|
-
this.updateInternalDataFromModel();
|
|
127
|
-
this.dateForm.controls["dateInput"].setValue(this.inputData);
|
|
128
|
-
this.inputDataChange.emit(this.inputData);
|
|
112
|
+
if ((event.key === "Delete" || event.key === "Backspace") && this.dateForm.controls["dateInput"].value.length === 0) {
|
|
113
|
+
this.clear();
|
|
129
114
|
}
|
|
130
115
|
else {
|
|
131
|
-
|
|
116
|
+
// update range so that the date range validator can run accurately
|
|
117
|
+
DateValidator.minValue = this.minDate;
|
|
118
|
+
DateValidator.maxValue = this.maxDate;
|
|
119
|
+
// Get the updated dateForm value
|
|
120
|
+
let eventTarget = event.target;
|
|
121
|
+
let inputValue = eventTarget.value;
|
|
122
|
+
this.dateForm.controls["dateInput"].patchValue(inputValue);
|
|
123
|
+
// if we have a good date and is within the range update the picker
|
|
124
|
+
if (DateValidator.inRange(this.dateForm.controls["dateInput"])) {
|
|
125
|
+
this.validate = false;
|
|
126
|
+
this.getDateValid();
|
|
127
|
+
this.inputData = this.datePipe.transform(this.dateForm.controls["dateInput"].value, this.dateFormat);
|
|
128
|
+
this.updateInternalDataFromModel();
|
|
129
|
+
this.dateForm.controls["dateInput"].setValue(this.inputData);
|
|
130
|
+
this.inputDataChange.emit(this.inputData);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
this.validate = true;
|
|
134
|
+
this.getDateValid();
|
|
135
|
+
}
|
|
132
136
|
}
|
|
133
|
-
// // only validate if user is typing
|
|
134
|
-
// if (!this.validate) {
|
|
135
|
-
// this.validate = true;
|
|
136
|
-
// this.dateForm.controls["dateInput"].setValue("");
|
|
137
|
-
//
|
|
138
|
-
// // clear the date picker
|
|
139
|
-
// this.modifiedData = null;
|
|
140
|
-
// this.inputData = null;
|
|
141
|
-
// let today: Date = new Date();
|
|
142
|
-
// this.startDate = {year: today.getFullYear(), month: today.getMonth() + 1, day: today.getDate()};
|
|
143
|
-
// this.state = 0;
|
|
144
|
-
// this.inputDataChange.emit(this.inputData);
|
|
145
|
-
// }
|
|
146
137
|
}
|
|
147
138
|
/**
|
|
148
139
|
* NgbDateStruct stores day, month and year. Convert this to ISO8601.
|
|
@@ -159,9 +150,21 @@ export class DateComponent extends DateBase {
|
|
|
159
150
|
}
|
|
160
151
|
return date.year + "-" + ((date.month < 10) ? "0" : "") + date.month + "-" + ((date.day < 10) ? "0" : "") + date.day + "T12:00-06:00";
|
|
161
152
|
}
|
|
153
|
+
getDateValid() {
|
|
154
|
+
if (this.dateForm.get("dateInput").hasError("dateFormatValidator")
|
|
155
|
+
|| this.dateForm.get("dateInput").hasError("dateRangeValidator")
|
|
156
|
+
|| this.dateForm.get("dateInput").hasError("dateInvalidValidator")) {
|
|
157
|
+
this.dateValid.emit(false);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.dateValid.emit(true);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
162
165
|
}
|
|
163
166
|
DateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DateComponent, deps: [{ token: i0.ElementRef }, { token: i1.UntypedFormBuilder }, { token: i2.DatePipe }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
164
|
-
DateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DateComponent, selector: "hci-date", inputs: { dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate", label: "label", inputData: "inputData", modifiedData: "modifiedData" }, outputs: { inputDataChange: "inputDataChange" }, host: { listeners: { "document:click": "handleOutsideEvent($event)" } }, providers: [DatePipe, DateValidator], viewQueries: [{ propertyName: "dp", first: true, predicate: ["dp"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
167
|
+
DateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DateComponent, selector: "hci-date", inputs: { dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate", label: "label", inputData: "inputData", modifiedData: "modifiedData" }, outputs: { inputDataChange: "inputDataChange", dateValid: "dateValid" }, host: { listeners: { "document:click": "handleOutsideEvent($event)" } }, providers: [DatePipe, DateValidator], viewQueries: [{ propertyName: "dp", first: true, predicate: ["dp"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
165
168
|
<div class="form-group">
|
|
166
169
|
<div class="input-group d-flex">
|
|
167
170
|
<form [formGroup]="dateForm" class="flex-grow-1">
|
|
@@ -170,7 +173,7 @@ DateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
|
|
|
170
173
|
<input type="text" (keyup)="onKeyUpInput($event)"
|
|
171
174
|
(ngModelChange)="onChange($event)" class="form-control"
|
|
172
175
|
formControlName="dateInput" placeholder="{{label}}"
|
|
173
|
-
aria-label="date" aria-describedby="basic-addon2" />
|
|
176
|
+
aria-label="date" aria-describedby="basic-addon2" attr.aria-label="hci-ng-date-{{label}}"/>
|
|
174
177
|
<span class="input-group-text" id="basic-addon2" (click)="clear()">
|
|
175
178
|
<i class="fas fa-times"></i>
|
|
176
179
|
</span>
|
|
@@ -182,43 +185,17 @@ DateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
|
|
|
182
185
|
class="invalid-date">Enter date as M/D/YYYY or MM/DD/YYYY</div>
|
|
183
186
|
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"
|
|
184
187
|
class="invalid-date">Invalid Date Range</div>
|
|
188
|
+
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateInvalidValidator')"
|
|
189
|
+
class="invalid-date">Not a real date</div>
|
|
185
190
|
</div>
|
|
186
191
|
</form>
|
|
187
|
-
<!--
|
|
188
|
-
We will replace the nbg date picker with material date picker
|
|
189
|
-
-->
|
|
190
|
-
<!-- <form [formGroup]="dateForm" class="flex-grow-1">-->
|
|
191
|
-
<!-- <div class="date-wrapper">-->
|
|
192
|
-
<!-- <div class="input-group-append">-->
|
|
193
|
-
<!-- <mat-form-field appearance="outline" [style.padding-top.em]="0.5"-->
|
|
194
|
-
<!-- [style.padding-bottom.em]="0.5">-->
|
|
195
|
-
<!-- <input matInput (keypress)="onKeyPressInput($event)"-->
|
|
196
|
-
<!-- [min]="minDate" [max]="maxDate" [matDatepicker]="datePicker"-->
|
|
197
|
-
<!-- formControlName="dateInput" placeholder="{{label}}" aria-label="date"-->
|
|
198
|
-
<!-- aria-describedby="basic-addon2">-->
|
|
199
|
-
<!-- <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>-->
|
|
200
|
-
<!-- <mat-datepicker #datePicker></mat-datepicker>-->
|
|
201
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateFormatValidator')"-->
|
|
202
|
-
<!-- class="invalid-date">-->
|
|
203
|
-
<!-- Enter date as M/D/YYYY or MM/DD/YYYY-->
|
|
204
|
-
<!-- </mat-error>-->
|
|
205
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"-->
|
|
206
|
-
<!-- class="invalid-date">-->
|
|
207
|
-
<!-- Invalid Date Range-->
|
|
208
|
-
<!-- </mat-error>-->
|
|
209
|
-
<!-- </mat-form-field>-->
|
|
210
|
-
<!-- </div>-->
|
|
211
|
-
<!-- </div>-->
|
|
212
|
-
<!-- </form>-->
|
|
213
192
|
</div>
|
|
214
193
|
</div>
|
|
215
194
|
<div *ngIf="state === 1" class="inline-editing">
|
|
216
195
|
<ngb-datepicker [ngModel]="modifiedData" #dp [startDate]="startDate" [minDate]="minDate"
|
|
217
196
|
[maxDate]="maxDate" (keydown)="onKeyDown($event)"
|
|
218
|
-
(ngModelChange)="onChange($event)" (
|
|
197
|
+
(ngModelChange)="onChange($event)" (dateSelect)="save()"></ngb-datepicker>
|
|
219
198
|
<div class="inline-hover-save-options">
|
|
220
|
-
<!-- <a class="btn ii-so-btn save" (click)="save()"><i class="fas fa-check"></i></a>-->
|
|
221
|
-
<!-- <a class="btn ii-so-btn cancel" (click)="cancel()"><i class="fas fa-times"></i></a>-->
|
|
222
199
|
</div>
|
|
223
200
|
</div>
|
|
224
201
|
|
|
@@ -234,7 +211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
234
211
|
<input type="text" (keyup)="onKeyUpInput($event)"
|
|
235
212
|
(ngModelChange)="onChange($event)" class="form-control"
|
|
236
213
|
formControlName="dateInput" placeholder="{{label}}"
|
|
237
|
-
aria-label="date" aria-describedby="basic-addon2" />
|
|
214
|
+
aria-label="date" aria-describedby="basic-addon2" attr.aria-label="hci-ng-date-{{label}}"/>
|
|
238
215
|
<span class="input-group-text" id="basic-addon2" (click)="clear()">
|
|
239
216
|
<i class="fas fa-times"></i>
|
|
240
217
|
</span>
|
|
@@ -246,43 +223,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
246
223
|
class="invalid-date">Enter date as M/D/YYYY or MM/DD/YYYY</div>
|
|
247
224
|
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"
|
|
248
225
|
class="invalid-date">Invalid Date Range</div>
|
|
226
|
+
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateInvalidValidator')"
|
|
227
|
+
class="invalid-date">Not a real date</div>
|
|
249
228
|
</div>
|
|
250
229
|
</form>
|
|
251
|
-
<!--
|
|
252
|
-
We will replace the nbg date picker with material date picker
|
|
253
|
-
-->
|
|
254
|
-
<!-- <form [formGroup]="dateForm" class="flex-grow-1">-->
|
|
255
|
-
<!-- <div class="date-wrapper">-->
|
|
256
|
-
<!-- <div class="input-group-append">-->
|
|
257
|
-
<!-- <mat-form-field appearance="outline" [style.padding-top.em]="0.5"-->
|
|
258
|
-
<!-- [style.padding-bottom.em]="0.5">-->
|
|
259
|
-
<!-- <input matInput (keypress)="onKeyPressInput($event)"-->
|
|
260
|
-
<!-- [min]="minDate" [max]="maxDate" [matDatepicker]="datePicker"-->
|
|
261
|
-
<!-- formControlName="dateInput" placeholder="{{label}}" aria-label="date"-->
|
|
262
|
-
<!-- aria-describedby="basic-addon2">-->
|
|
263
|
-
<!-- <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>-->
|
|
264
|
-
<!-- <mat-datepicker #datePicker></mat-datepicker>-->
|
|
265
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateFormatValidator')"-->
|
|
266
|
-
<!-- class="invalid-date">-->
|
|
267
|
-
<!-- Enter date as M/D/YYYY or MM/DD/YYYY-->
|
|
268
|
-
<!-- </mat-error>-->
|
|
269
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"-->
|
|
270
|
-
<!-- class="invalid-date">-->
|
|
271
|
-
<!-- Invalid Date Range-->
|
|
272
|
-
<!-- </mat-error>-->
|
|
273
|
-
<!-- </mat-form-field>-->
|
|
274
|
-
<!-- </div>-->
|
|
275
|
-
<!-- </div>-->
|
|
276
|
-
<!-- </form>-->
|
|
277
230
|
</div>
|
|
278
231
|
</div>
|
|
279
232
|
<div *ngIf="state === 1" class="inline-editing">
|
|
280
233
|
<ngb-datepicker [ngModel]="modifiedData" #dp [startDate]="startDate" [minDate]="minDate"
|
|
281
234
|
[maxDate]="maxDate" (keydown)="onKeyDown($event)"
|
|
282
|
-
(ngModelChange)="onChange($event)" (
|
|
235
|
+
(ngModelChange)="onChange($event)" (dateSelect)="save()"></ngb-datepicker>
|
|
283
236
|
<div class="inline-hover-save-options">
|
|
284
|
-
<!-- <a class="btn ii-so-btn save" (click)="save()"><i class="fas fa-check"></i></a>-->
|
|
285
|
-
<!-- <a class="btn ii-so-btn cancel" (click)="cancel()"><i class="fas fa-times"></i></a>-->
|
|
286
237
|
</div>
|
|
287
238
|
</div>
|
|
288
239
|
|
|
@@ -306,5 +257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
306
257
|
type: Input
|
|
307
258
|
}], inputDataChange: [{
|
|
308
259
|
type: Output
|
|
260
|
+
}], dateValid: [{
|
|
261
|
+
type: Output
|
|
309
262
|
}] } });
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9kYXRlL2RhdGUtZGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBa0MsU0FBUyxFQUFFLE1BQU0sRUFDN0YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsa0JBQWtCLEVBQW9CLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7Ozs7O0FBSXJDOzs7O0dBSUc7QUE0RUgsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBeUJ6QyxZQUFZLFVBQXNCLEVBQVUsV0FBK0IsRUFBVSxRQUFrQixFQUFVLGlCQUFvQztRQUNuSixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFEd0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFyQnJKLHlDQUF5QztRQUNoQyxlQUFVLEdBQVcsV0FBVyxDQUFDO1FBV2hDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUlwRCxrQ0FBa0M7UUFDbEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVsQixZQUFPLEdBQVksS0FBSyxDQUFDO0lBSWpDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3BDLFNB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QUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUM7SUFDeEksQ0FBQzs7MkdBL0tVLGFBQWE7K0ZBQWIsYUFBYSxpVEF6RWIsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLDJJQUMxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZEVDs0RkFXVSxhQUFhO2tCQTNFekIsU0FBUzsrQkFDRSxVQUFVLGFBQ1QsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFlBQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRULFFBTUs7d0JBQ0osa0JBQWtCLEVBQUUsNEJBQTRCO3FCQUNqRDt5TEFLaUMsRUFBRTtzQkFBbkMsU0FBUzt1QkFBQyxJQUFJLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUd2QixVQUFVO3NCQUFsQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgRG9DaGVjaywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBPdXRwdXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7VW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuaW1wb3J0IHtOZ2JEYXRlU3RydWN0fSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuXHJcbmltcG9ydCB7RGF0ZVZhbGlkYXRvcn0gZnJvbSBcIi4vZGF0ZS12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHtEYXRlQmFzZX0gZnJvbSBcIi4vZGF0ZS1iYXNlXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5cclxuLyoqXHJcbiAqIFRPRE86IENvbmZpcm0gdGltZXpvbmUgYmVoYXZpb3IuXHJcbiAqXHJcbiAqIEBzaW5jZSA0LjAuMFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaGNpLWRhdGVcIixcclxuICBwcm92aWRlcnM6IFtEYXRlUGlwZSwgRGF0ZVZhbGlkYXRvcl0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGQtZmxleFwiPlxyXG4gICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZGF0ZUZvcm1cIiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiAoa2V5dXApPVwib25LZXlVcElucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkYXRlSW5wdXRcIiBwbGFjZWhvbGRlcj1cInt7bGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJkYXRlXCIgYXJpYS1kZXNjcmliZWRieT1cImJhc2ljLWFkZG9uMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgaWQ9XCJiYXNpYy1hZGRvbjJcIiAoY2xpY2spPVwiY2xlYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzdGFydEVkaXQoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWFsdFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlRm9ybWF0VmFsaWRhdG9yJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1kYXRlXCI+RW50ZXIgZGF0ZSBhcyBNL0QvWVlZWSBvciBNTS9ERC9ZWVlZPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlUmFuZ2VWYWxpZGF0b3InKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj5JbnZhbGlkIERhdGUgUmFuZ2U8L2Rpdj5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICA8IS0tXHJcbiAgICAgICAgICAgICBXZSB3aWxsIHJlcGxhY2UgdGhlIG5iZyBkYXRlIHBpY2tlciB3aXRoIG1hdGVyaWFsIGRhdGUgcGlja2VyXHJcbiAgICAgICAgICAgLS0+XHJcbjwhLS0gICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZGF0ZUZvcm1cIiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+LS0+XHJcbjwhLS0gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtd3JhcHBlclwiPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgW3N0eWxlLnBhZGRpbmctdG9wLmVtXT1cIjAuNVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctYm90dG9tLmVtXT1cIjAuNVwiPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgKGtleXByZXNzKT1cIm9uS2V5UHJlc3NJbnB1dCgkZXZlbnQpXCItLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZVwiIFttYXhdPVwibWF4RGF0ZVwiIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZUlucHV0XCIgcGxhY2Vob2xkZXI9XCJ7e2xhYmVsfX1cIiBhcmlhLWxhYmVsPVwiZGF0ZVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiYmFzaWMtYWRkb24yXCI+LS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiZGF0ZVBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj4tLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInZhbGlkYXRlICYmIGRhdGVGb3JtLmdldCgnZGF0ZUlucHV0JykuaGFzRXJyb3IoJ2RhdGVGb3JtYXRWYWxpZGF0b3InKVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj4tLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICBFbnRlciBkYXRlIGFzIE0vRC9ZWVlZIG9yIE1NL0REL1lZWVktLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+LS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlUmFuZ2VWYWxpZGF0b3InKVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj4tLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkIERhdGUgUmFuZ2UtLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+LS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgPC9kaXY+LS0+XHJcbjwhLS0gICAgICAgICAgICAgPC9kaXY+LS0+XHJcbjwhLS0gICAgICAgICAgPC9mb3JtPi0tPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZSA9PT0gMVwiIGNsYXNzPVwiaW5saW5lLWVkaXRpbmdcIj5cclxuICAgICAgICA8bmdiLWRhdGVwaWNrZXIgW25nTW9kZWxdPVwibW9kaWZpZWREYXRhXCIgI2RwIFtzdGFydERhdGVdPVwic3RhcnREYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiAoc2VsZWN0KT1cInNhdmUoKVwiPjwvbmdiLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ob3Zlci1zYXZlLW9wdGlvbnNcIj5cclxuPCEtLSAgICAgICAgICA8YSBjbGFzcz1cImJ0biBpaS1zby1idG4gc2F2ZVwiIChjbGljayk9XCJzYXZlKClcIj48aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT48L2E+LS0+XHJcbjwhLS0gICAgICAgICAgPGEgY2xhc3M9XCJidG4gaWktc28tYnRuIGNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPjxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPjwvYT4tLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLyo6Om5nLWRlZXAgbWF0LWZvcm0tZmllbGQgLm1hdC1mb3JtLWZpZWxkLWZsZXggPiAubWF0LWZvcm0tZmllbGQtaW5maXh7Ki9cclxuICAgIC8qICBwYWRkaW5nOiAwLjI1ZW0gMCAwLjVlbSAwOyovXHJcbiAgICAvKn0qL1xyXG4gIGBdLFxyXG4gIGhvc3Q6IHtcclxuICAgIFwiKGRvY3VtZW50OmNsaWNrKVwiOiBcImhhbmRsZU91dHNpZGVFdmVudCgkZXZlbnQpXCJcclxuICB9XHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUNvbXBvbmVudCBleHRlbmRzIERhdGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZChcImRwXCIsIHtzdGF0aWM6IGZhbHNlfSkgZHA6IGFueTtcclxuXHJcbiAgLy8gQmluZGVkIGRhdGEgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cclxuICBASW5wdXQoKSBkYXRlRm9ybWF0OiBzdHJpbmcgPSBcInNob3J0RGF0ZVwiO1xyXG4gIC8vIEBJbnB1dCgpIGRhdGVGb3JtYXQ6IHN0cmluZyA9IFwiTU0vZC95eXl5XCI7IC8vRm9yIHRlc3Rpbmcgb25seVxyXG4gIHN0YXJ0RGF0ZTtcclxuICBASW5wdXQoKSBtaW5EYXRlO1xyXG4gIEBJbnB1dCgpIG1heERhdGU7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBsYWJlbERhdGU6IHN0cmluZztcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IE9iamVjdDtcclxuICAvLyBUaGUgZGF0YSB1c2VkIGluIG91ciBpbnB1dC4gIFdlIHN0b3JlZCB0aGlzIGFzIHdlbGwgYXMgdGhlIGlucHV0RGF0YSBzbyB3ZSBjYW4gY2FuY2VsIHRoZSBlZGl0IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZGF0YS5cclxuICBASW5wdXQoKSBtb2RpZmllZERhdGE6IE9iamVjdDtcclxuXHJcbiAgQE91dHB1dCgpIGlucHV0RGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBkYXRlRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBkYXRlSW5wdXQ6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuICAvLyBvbmx5IHZhbGlkYXRlIGlmIHVzZXIgaXMgdHlwaW5nXHJcbiAgdmFsaWRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlciwgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRhdGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICBkYXRlSW5wdXQgOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKFwiXCIsIFtEYXRlVmFsaWRhdG9yLmRhdGVGb3JtYXRWYWxpZGF0b3IsIERhdGVWYWxpZGF0b3IuZGF0ZVJhbmdlVmFsaWRhdG9yXSlcclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkNoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gICAgLy8gc2V0IHRoZSBtaW5EYXRlIHRvIDIwIHllYXJzIGluIHRoZSBwYXN0IGJ5IGRlZmF1bHRcclxuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICBpZiAoIXRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgIHRoaXMubWluRGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpIC0gMjAsIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IG1heCBkYXRlIHRvIHRvZGF5IGJ5IGRlZmF1bHRcclxuICAgIGlmICghdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgdGhpcy5tYXhEYXRlID0ge3llYXI6IHRvZGF5LmdldEZ1bGxZZWFyKCksIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gRmlsbCB0aGUgaW5wdXQgd2l0aCB0aGUgYm91bmQgZGF0YSBzZXQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICBpZiAodGhpcy5pbnB1dERhdGEpIHtcclxuICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKGZvcm1hdHRlZERhdGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZXMoKTogdm9pZCB7fVxyXG5cclxuXHJcbiAgbmdEb0NoZWNrKCkge1xyXG4gICAgLy8gdGhpcyBpcyB0aGUgb25seSB3YXkgSSBmb3VuZCB0byBoYXZlIHRoZSBmb2N1cyBvbiB0aGUgc3RhcnREYXRlIGRheSB3aGVuIHRoZSB1c2VyIG9wZW5zXHJcbiAgICAvLyB0aGUgcG9wdXAuIFdlIG9ubHkgd2FudCB0byBmb2N1cyBvbmNlIG90aGVyd2lzZSB1c2VyIGNhbiBub3QgY2xpY2sgYW55d2hlcmUgZWxzZSBpbiB0aGUgcG9wdXBcclxuICAgIGlmICh0aGlzLmRwICYmICF0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgICB0aGlzLmRwLmZvY3VzKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIG1hcmsgcGlja2VyIGZvciBmb2N1c2luZyBuZXh0IHRpbWUgaXQgaXMgb3BlblxyXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IDApIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJbnRlcm5hbERhdGFGcm9tTW9kZWwoKSB7XHJcbiAgICAgaWYgKHRoaXMuaW5wdXREYXRhKSB7XHJcbiAgICAgICAgIHRoaXMubW9kaWZpZWREYXRhID0gbmV3IERhdGUoPHN0cmluZz50aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgICAgIGxldCBtZDogRGF0ZSA9IG5ldyBEYXRlKDxzdHJpbmc+dGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiBtZC5nZXRGdWxsWWVhcigpLCBtb250aDogbWQuZ2V0TW9udGgoKSArIDEsIGRheTogbWQuZ2V0RGF0ZSgpfTtcclxuICAgICB9IGVsc2Uge1xyXG4gICAgICAgICBsZXQgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBib3VuZCBkYXRhIHdpdGggdGhlIHdvcmtpbmcgZGF0YS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlTW9kZWxGcm9tSW50ZXJuYWxEYXRhKCkge1xyXG4gICAgIGlmICh0aGlzLm1vZGlmaWVkRGF0YSkge1xyXG4gICAgICAgICBsZXQgZHNEYXRlID0gdGhpcy5uZ2JEYXRlVG9TdHJpbmcoPE5nYkRhdGVTdHJ1Y3Q+dGhpcy5tb2RpZmllZERhdGEpO1xyXG4gICAgICAgICBpZiAoZHNEYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRhID0gZHNEYXRlO1xyXG4gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0YSA9IHRoaXMubW9kaWZpZWREYXRhO1xyXG4gICAgICAgICB9XHJcblxyXG4gICAgICAgICBjb25zdCBmb3JtYXR0ZWRNb2RpZmllZERhdGUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKGZvcm1hdHRlZE1vZGlmaWVkRGF0ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcblxyXG4gICAgIH1cclxuICAgICB0aGlzLmlucHV0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRhKTtcclxuICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyKCkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVkRGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRhID0gbnVsbDtcclxuICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgdGhpcy52YWxpZGF0ZSA9IGZhbHNlO1xyXG4gICAgICBsZXQgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IDA7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0uc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pbnB1dERhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uS2V5VXBJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgLy8gQ2hlY2sgZm9yIHdoZW4gdGhlIGlucHV0IGlzIGRlbGV0ZWQgYmVmb3JlIGJlaW5nIHNhdmVkXHJcbiAgICBpZihldmVudC5rZXkgPT09IFwiRGVsZXRlXCIgfHwgZXZlbnQua2V5ID09PSBcIkJhY2tzcGFjZVwiKSB7XHJcbiAgICAgIGlmKHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRhSW5wdXRcIl0udmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgIC8vIHVwZGF0ZSByYW5nZSBzbyB0aGF0IHRoZSBkYXRlIHJhbmdlIHZhbGlkYXRvciBjYW4gcnVuIGFjY3VyYXRlbHlcclxuICAgICBEYXRlVmFsaWRhdG9yLm1pblZhbHVlID0gdGhpcy5taW5EYXRlO1xyXG4gICAgIERhdGVWYWxpZGF0b3IubWF4VmFsdWUgPSB0aGlzLm1heERhdGU7XHJcblxyXG4gICAgLy8gR2V0IHRoZSB1cGRhdGVkIGRhdGVGb3JtIHZhbHVlXHJcbiAgICAgbGV0IGV2ZW50VGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgbGV0IGlucHV0VmFsdWUgPSBldmVudFRhcmdldC52YWx1ZTtcclxuICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnBhdGNoVmFsdWUoaW5wdXRWYWx1ZSk7XHJcblxyXG4gICAgIC8vIGlmIHdlIGhhdmUgYSBnb29kIGRhdGUgYW5kIGlzIHdpdGhpbiB0aGUgcmFuZ2UgdXBkYXRlIHRoZSBwaWNrZXJcclxuICAgICBpZiAoRGF0ZVZhbGlkYXRvci5pblJhbmdlKHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0pKSB7XHJcbiAgICAgICAgIHRoaXMudmFsaWRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgdGhpcy5pbnB1dERhdGEgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gICAgICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKHRoaXMuaW5wdXREYXRhKTtcclxuICAgICAgICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgfSBlbHNlIHtcclxuICAgICAgIHRoaXMudmFsaWRhdGUgPSB0cnVlO1xyXG4gICAgIH1cclxuXHJcbiAgICAgIC8vIC8vIG9ubHkgdmFsaWRhdGUgaWYgdXNlciBpcyB0eXBpbmdcclxuICAgICAgLy8gaWYgKCF0aGlzLnZhbGlkYXRlKSB7XHJcbiAgICAgIC8vICAgdGhpcy52YWxpZGF0ZSA9IHRydWU7XHJcbiAgICAgIC8vICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgLy9cclxuICAgICAgLy8gICAvLyBjbGVhciB0aGUgZGF0ZSBwaWNrZXJcclxuICAgICAgLy8gICB0aGlzLm1vZGlmaWVkRGF0YSA9IG51bGw7XHJcbiAgICAgIC8vICAgdGhpcy5pbnB1dERhdGEgPSBudWxsO1xyXG4gICAgICAvLyAgIGxldCB0b2RheTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIC8vICAgdGhpcy5zdGFydERhdGUgPSB7eWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSwgbW9udGg6IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkYXk6IHRvZGF5LmdldERhdGUoKX07XHJcbiAgICAgIC8vICAgdGhpcy5zdGF0ZSA9IDA7XHJcbiAgICAgIC8vICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5nYkRhdGVTdHJ1Y3Qgc3RvcmVzIGRheSwgbW9udGggYW5kIHllYXIuICBDb252ZXJ0IHRoaXMgdG8gSVNPODYwMS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBkYXRlXHJcbiAgICogQHJldHVybnMge2FueX1cclxuICAgKi9cclxuICBwcml2YXRlIG5nYkRhdGVUb1N0cmluZyhkYXRlOiBOZ2JEYXRlU3RydWN0KTogc3RyaW5nIHtcclxuICAgIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAoZGF0ZS55ZWFyID09PSB1bmRlZmluZWQgfHwgZGF0ZS5tb250aCA9PT0gdW5kZWZpbmVkIHx8IGRhdGUuZGF5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGUueWVhciArIFwiLVwiICsgKChkYXRlLm1vbnRoIDwgMTApID8gXCIwXCIgOiBcIlwiKSArIGRhdGUubW9udGggKyBcIi1cIiArICgoZGF0ZS5kYXkgPCAxMCkgPyBcIjBcIiA6IFwiXCIpICsgZGF0ZS5kYXkgKyBcIlQxMjowMC0wNjowMFwiO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9kYXRlL2RhdGUtZGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBa0MsU0FBUyxFQUFFLE1BQU0sRUFDN0YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsa0JBQWtCLEVBQW9CLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7Ozs7O0FBSXJDOzs7O0dBSUc7QUErQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBMEJ6QyxZQUFZLFVBQXNCLEVBQVUsV0FBK0IsRUFBVSxRQUFrQixFQUFVLGlCQUFvQztRQUNuSixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFEd0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF0QnJKLHlDQUF5QztRQUNoQyxlQUFVLEdBQVcsV0FBVyxDQUFDO1FBVWhDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUtsRCxrQ0FBa0M7UUFDbEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVsQixZQUFPLEdBQVksS0FBSyxDQUFDO0lBSWpDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElB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LEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIERvQ2hlY2ssIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgT3V0cHV0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbmltcG9ydCB7TmdiRGF0ZVN0cnVjdH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcblxyXG5pbXBvcnQge0RhdGVWYWxpZGF0b3J9IGZyb20gXCIuL2RhdGUtdmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7RGF0ZUJhc2V9IGZyb20gXCIuL2RhdGUtYmFzZVwiO1xyXG5cclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBUT0RPOiBDb25maXJtIHRpbWV6b25lIGJlaGF2aW9yLlxyXG4gKlxyXG4gKiBAc2luY2UgNC4wLjBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImhjaS1kYXRlXCIsXHJcbiAgcHJvdmlkZXJzOiBbRGF0ZVBpcGUsIERhdGVWYWxpZGF0b3JdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBkLWZsZXhcIj5cclxuICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImRhdGVGb3JtXCIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgKGtleXVwKT1cIm9uS2V5VXBJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZUlucHV0XCIgcGxhY2Vob2xkZXI9XCJ7e2xhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiZGF0ZVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJiYXNpYy1hZGRvbjJcIiBhdHRyLmFyaWEtbGFiZWw9XCJoY2ktbmctZGF0ZS17e2xhYmVsfX1cIi8+XHJcbiAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgaWQ9XCJiYXNpYy1hZGRvbjJcIiAoY2xpY2spPVwiY2xlYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzdGFydEVkaXQoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWFsdFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlRm9ybWF0VmFsaWRhdG9yJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1kYXRlXCI+RW50ZXIgZGF0ZSBhcyBNL0QvWVlZWSBvciBNTS9ERC9ZWVlZPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlUmFuZ2VWYWxpZGF0b3InKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj5JbnZhbGlkIERhdGUgUmFuZ2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZhbGlkYXRlICYmIGRhdGVGb3JtLmdldCgnZGF0ZUlucHV0JykuaGFzRXJyb3IoJ2RhdGVJbnZhbGlkVmFsaWRhdG9yJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1kYXRlXCI+Tm90IGEgcmVhbCBkYXRlPC9kaXY+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cInN0YXRlID09PSAxXCIgY2xhc3M9XCJpbmxpbmUtZWRpdGluZ1wiPlxyXG4gICAgICAgIDxuZ2ItZGF0ZXBpY2tlciBbbmdNb2RlbF09XCJtb2RpZmllZERhdGFcIiAjZHAgW3N0YXJ0RGF0ZV09XCJzdGFydERhdGVcIiBbbWluRGF0ZV09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiIChkYXRlU2VsZWN0KT1cInNhdmUoKVwiPjwvbmdiLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ob3Zlci1zYXZlLW9wdGlvbnNcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gIGBdLFxyXG4gIGhvc3Q6IHtcclxuICAgIFwiKGRvY3VtZW50OmNsaWNrKVwiOiBcImhhbmRsZU91dHNpZGVFdmVudCgkZXZlbnQpXCJcclxuICB9XHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUNvbXBvbmVudCBleHRlbmRzIERhdGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZChcImRwXCIsIHtzdGF0aWM6IGZhbHNlfSkgZHA6IGFueTtcclxuXHJcbiAgLy8gQmluZGVkIGRhdGEgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cclxuICBASW5wdXQoKSBkYXRlRm9ybWF0OiBzdHJpbmcgPSBcInNob3J0RGF0ZVwiO1xyXG4gIHN0YXJ0RGF0ZTtcclxuICBASW5wdXQoKSBtaW5EYXRlO1xyXG4gIEBJbnB1dCgpIG1heERhdGU7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBsYWJlbERhdGU6IHN0cmluZztcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IE9iamVjdDtcclxuICAvLyBUaGUgZGF0YSB1c2VkIGluIG91ciBpbnB1dC4gIFdlIHN0b3JlZCB0aGlzIGFzIHdlbGwgYXMgdGhlIGlucHV0RGF0YSBzbyB3ZSBjYW4gY2FuY2VsIHRoZSBlZGl0IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZGF0YS5cclxuICBASW5wdXQoKSBtb2RpZmllZERhdGE6IE9iamVjdDtcclxuXHJcbiAgQE91dHB1dCgpIGlucHV0RGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBkYXRlVmFsaWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIGRhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG4gIGRhdGVJbnB1dDogVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAvLyBvbmx5IHZhbGlkYXRlIGlmIHVzZXIgaXMgdHlwaW5nXHJcbiAgdmFsaWRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlciwgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRhdGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICBkYXRlSW5wdXQgOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKFwiXCIsIFtEYXRlVmFsaWRhdG9yLmRhdGVGb3JtYXRWYWxpZGF0b3IsIERhdGVWYWxpZGF0b3IuZGF0ZVJhbmdlVmFsaWRhdG9yXSlcclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkNoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gICAgLy8gc2V0IHRoZSBtaW5EYXRlIHRvIDIwIHllYXJzIGluIHRoZSBwYXN0IGJ5IGRlZmF1bHRcclxuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICBpZiAoIXRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgIHRoaXMubWluRGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpIC0gMjAsIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IG1heCBkYXRlIHRvIHRvZGF5IGJ5IGRlZmF1bHRcclxuICAgIGlmICghdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgdGhpcy5tYXhEYXRlID0ge3llYXI6IHRvZGF5LmdldEZ1bGxZZWFyKCksIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gRmlsbCB0aGUgaW5wdXQgd2l0aCB0aGUgYm91bmQgZGF0YSBzZXQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICBpZiAodGhpcy5pbnB1dERhdGEpIHtcclxuICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKGZvcm1hdHRlZERhdGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZXMoKTogdm9pZCB7fVxyXG5cclxuXHJcbiAgbmdEb0NoZWNrKCkge1xyXG4gICAgLy8gdGhpcyBpcyB0aGUgb25seSB3YXkgSSBmb3VuZCB0byBoYXZlIHRoZSBmb2N1cyBvbiB0aGUgc3RhcnREYXRlIGRheSB3aGVuIHRoZSB1c2VyIG9wZW5zXHJcbiAgICAvLyB0aGUgcG9wdXAuIFdlIG9ubHkgd2FudCB0byBmb2N1cyBvbmNlIG90aGVyd2lzZSB1c2VyIGNhbiBub3QgY2xpY2sgYW55d2hlcmUgZWxzZSBpbiB0aGUgcG9wdXBcclxuICAgIGlmICh0aGlzLmRwICYmICF0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgICB0aGlzLmRwLmZvY3VzKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIG1hcmsgcGlja2VyIGZvciBmb2N1c2luZyBuZXh0IHRpbWUgaXQgaXMgb3BlblxyXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IDApIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJbnRlcm5hbERhdGFGcm9tTW9kZWwoKSB7XHJcbiAgICAgaWYgKHRoaXMuaW5wdXREYXRhKSB7XHJcbiAgICAgICAgIHRoaXMubW9kaWZpZWREYXRhID0gbmV3IERhdGUoPHN0cmluZz50aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgICAgIGxldCBtZDogRGF0ZSA9IG5ldyBEYXRlKDxzdHJpbmc+dGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiBtZC5nZXRGdWxsWWVhcigpLCBtb250aDogbWQuZ2V0TW9udGgoKSArIDEsIGRheTogbWQuZ2V0RGF0ZSgpfTtcclxuICAgICB9IGVsc2Uge1xyXG4gICAgICAgICBsZXQgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBib3VuZCBkYXRhIHdpdGggdGhlIHdvcmtpbmcgZGF0YS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlTW9kZWxGcm9tSW50ZXJuYWxEYXRhKCkge1xyXG4gICAgIGlmICh0aGlzLm1vZGlmaWVkRGF0YSkge1xyXG4gICAgICAgICBsZXQgZHNEYXRlID0gdGhpcy5uZ2JEYXRlVG9TdHJpbmcoPE5nYkRhdGVTdHJ1Y3Q+dGhpcy5tb2RpZmllZERhdGEpO1xyXG4gICAgICAgICBpZiAoZHNEYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRhID0gZHNEYXRlO1xyXG4gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0YSA9IHRoaXMubW9kaWZpZWREYXRhO1xyXG4gICAgICAgICB9XHJcblxyXG4gICAgICAgICBjb25zdCBmb3JtYXR0ZWRNb2RpZmllZERhdGUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKGZvcm1hdHRlZE1vZGlmaWVkRGF0ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcblxyXG4gICAgIH1cclxuICAgICB0aGlzLmlucHV0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRhKTtcclxuICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyKCkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVkRGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRhID0gbnVsbDtcclxuICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgdGhpcy52YWxpZGF0ZSA9IGZhbHNlO1xyXG4gICAgICBsZXQgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IDA7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0uc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICB0aGlzLmRhdGVWYWxpZC5lbWl0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uS2V5VXBJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgLy8gQ2hlY2sgZm9yIHdoZW4gdGhlIGlucHV0IGlzIGRlbGV0ZWQgYmVmb3JlIGJlaW5nIHNhdmVkXHJcbiAgICBpZiAoKGV2ZW50LmtleSA9PT0gXCJEZWxldGVcIiB8fCBldmVudC5rZXkgPT09IFwiQmFja3NwYWNlXCIpICYmIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0udmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHVwZGF0ZSByYW5nZSBzbyB0aGF0IHRoZSBkYXRlIHJhbmdlIHZhbGlkYXRvciBjYW4gcnVuIGFjY3VyYXRlbHlcclxuICAgICAgRGF0ZVZhbGlkYXRvci5taW5WYWx1ZSA9IHRoaXMubWluRGF0ZTtcclxuICAgICAgRGF0ZVZhbGlkYXRvci5tYXhWYWx1ZSA9IHRoaXMubWF4RGF0ZTtcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgdXBkYXRlZCBkYXRlRm9ybSB2YWx1ZVxyXG4gICAgICBsZXQgZXZlbnRUYXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgbGV0IGlucHV0VmFsdWUgPSBldmVudFRhcmdldC52YWx1ZTtcclxuICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5wYXRjaFZhbHVlKGlucHV0VmFsdWUpO1xyXG5cclxuICAgICAgLy8gaWYgd2UgaGF2ZSBhIGdvb2QgZGF0ZSBhbmQgaXMgd2l0aGluIHRoZSByYW5nZSB1cGRhdGUgdGhlIHBpY2tlclxyXG4gICAgICBpZiAoRGF0ZVZhbGlkYXRvci5pblJhbmdlKHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0pKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0ZVZhbGlkKCk7XHJcbiAgICAgICAgdGhpcy5pbnB1dERhdGEgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhRnJvbU1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZSh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXREYXRlVmFsaWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmdiRGF0ZVN0cnVjdCBzdG9yZXMgZGF5LCBtb250aCBhbmQgeWVhci4gIENvbnZlcnQgdGhpcyB0byBJU084NjAxLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGRhdGVcclxuICAgKiBAcmV0dXJucyB7YW55fVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbmdiRGF0ZVRvU3RyaW5nKGRhdGU6IE5nYkRhdGVTdHJ1Y3QpOiBzdHJpbmcge1xyXG4gICAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCB8fCBkYXRlID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIGlmIChkYXRlLnllYXIgPT09IHVuZGVmaW5lZCB8fCBkYXRlLm1vbnRoID09PSB1bmRlZmluZWQgfHwgZGF0ZS5kYXkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0ZS55ZWFyICsgXCItXCIgKyAoKGRhdGUubW9udGggPCAxMCkgPyBcIjBcIiA6IFwiXCIpICsgZGF0ZS5tb250aCArIFwiLVwiICsgKChkYXRlLmRheSA8IDEwKSA/IFwiMFwiIDogXCJcIikgKyBkYXRlLmRheSArIFwiVDEyOjAwLTA2OjAwXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0ZVZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZGF0ZUZvcm0uZ2V0KFwiZGF0ZUlucHV0XCIpLmhhc0Vycm9yKFwiZGF0ZUZvcm1hdFZhbGlkYXRvclwiKVxyXG4gICAgICB8fCB0aGlzLmRhdGVGb3JtLmdldChcImRhdGVJbnB1dFwiKS5oYXNFcnJvcihcImRhdGVSYW5nZVZhbGlkYXRvclwiKVxyXG4gICAgICB8fCB0aGlzLmRhdGVGb3JtLmdldChcImRhdGVJbnB1dFwiKS5oYXNFcnJvcihcImRhdGVJbnZhbGlkVmFsaWRhdG9yXCIpKSB7XHJcbiAgICAgIHRoaXMuZGF0ZVZhbGlkLmVtaXQoZmFsc2UpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGVWYWxpZC5lbWl0KHRydWUpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as moment from "moment";
|
|
2
2
|
export class DateValidator {
|
|
3
3
|
static dateFormatValidator(ac) {
|
|
4
|
-
|
|
4
|
+
let dateArr = ac.value.split("/");
|
|
5
|
+
if (dateArr.length != 3 || dateArr[0].length > 3 || dateArr[0].length < 1 || dateArr[1].length > 3 ||
|
|
6
|
+
dateArr[1].length < 1 || dateArr[2].length !== 4) {
|
|
5
7
|
return { "dateFormatValidator": true };
|
|
6
8
|
}
|
|
7
9
|
return null;
|
|
8
10
|
}
|
|
9
11
|
static dateRangeValidator(ac) {
|
|
10
|
-
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && moment(ac.value, "M/D/YYYY", true).isValid()) {
|
|
12
|
+
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && (moment(ac.value, "M/D/YYYY", true).isValid() || moment(ac.value, "MM/DD/YYYY", true).isValid())) {
|
|
11
13
|
let dateValue = moment(ac.value);
|
|
12
14
|
let minDate = moment(DateValidator.convertNgbStructToDate(DateValidator.minValue));
|
|
13
15
|
let maxDate = moment(DateValidator.convertNgbStructToDate(DateValidator.maxValue));
|
|
@@ -17,11 +19,17 @@ export class DateValidator {
|
|
|
17
19
|
}
|
|
18
20
|
return null;
|
|
19
21
|
}
|
|
22
|
+
static dateInvalidValidator(ac) {
|
|
23
|
+
if (ac && ac.value && !moment(ac.value, "M/D/YYYY", true).isValid() && !moment(ac.value, "MM/DD/YYYY", true).isValid()) {
|
|
24
|
+
return { "dateInvalidValidator": true };
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
20
28
|
static convertNgbStructToDate(struct) {
|
|
21
29
|
return { year: struct.year, month: struct.month - 1, day: struct.day };
|
|
22
30
|
}
|
|
23
31
|
static inRange(ac) {
|
|
24
|
-
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && moment(ac.value, "M/D/YYYY", true).isValid()) {
|
|
32
|
+
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && (moment(ac.value, "M/D/YYYY", true).isValid() || moment(ac.value, "MM/DD/YYYY", true).isValid())) {
|
|
25
33
|
let dateValue = moment(ac.value);
|
|
26
34
|
let minDate = moment(DateValidator.convertNgbStructToDate(DateValidator.minValue));
|
|
27
35
|
let maxDate = moment(DateValidator.convertNgbStructToDate(DateValidator.maxValue));
|
|
@@ -37,4 +45,4 @@ export class DateValidator {
|
|
|
37
45
|
}
|
|
38
46
|
DateValidator.minValue = undefined;
|
|
39
47
|
DateValidator.maxValue = undefined;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnB1dC9zcmMvZGF0ZS9kYXRlLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxNQUFNLE9BQU8sYUFBYTtJQUl4QixNQUFNLENBQUMsbUJBQW1CLENBQUMsRUFBbUI7UUFDNUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDaEcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQW1CO1FBQzNDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQzFLLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNuRixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRW5GLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQzNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN2QztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQW1CO1FBQzdDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUEsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQU07UUFDbEMsT0FBTyxFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQW1CO1FBQ2hDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQzFLLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNuRixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRW5GLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQzFFLE9BQU8sS0FBSyxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0osT0FBTyxJQUFJLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztBQWxESyxzQkFBUSxHQUFHLFNBQVMsQ0FBQztBQUNyQixzQkFBUSxHQUFHLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWJzdHJhY3RDb250cm9sfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcblxuZXhwb3J0IGNsYXNzIERhdGVWYWxpZGF0b3Ige1xuICBzdGF0aWMgbWluVmFsdWUgPSB1bmRlZmluZWQ7XG4gIHN0YXRpYyBtYXhWYWx1ZSA9IHVuZGVmaW5lZDtcblxuICBzdGF0aWMgZGF0ZUZvcm1hdFZhbGlkYXRvcihhYzogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgbGV0IGRhdGVBcnIgPSBhYy52YWx1ZS5zcGxpdChcIi9cIik7XG4gICAgaWYgKGRhdGVBcnIubGVuZ3RoICE9IDMgfHwgZGF0ZUFyclswXS5sZW5ndGggPiAzIHx8IGRhdGVBcnJbMF0ubGVuZ3RoIDwgMSB8fCBkYXRlQXJyWzFdLmxlbmd0aCA+IDMgfHxcbiAgICAgIGRhdGVBcnJbMV0ubGVuZ3RoIDwgMSB8fCBkYXRlQXJyWzJdLmxlbmd0aCAhPT0gNCkge1xuICAgICAgcmV0dXJuIHsgXCJkYXRlRm9ybWF0VmFsaWRhdG9yXCI6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgZGF0ZVJhbmdlVmFsaWRhdG9yKGFjOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBpZiAoYWMgJiYgYWMudmFsdWUgJiYgRGF0ZVZhbGlkYXRvci5taW5WYWx1ZSAmJiBEYXRlVmFsaWRhdG9yLm1heFZhbHVlICYmIChtb21lbnQoYWMudmFsdWUsIFwiTS9EL1lZWVlcIiwgdHJ1ZSkuaXNWYWxpZCgpIHx8IG1vbWVudChhYy52YWx1ZSwgXCJNTS9ERC9ZWVlZXCIsIHRydWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgIGxldCBkYXRlVmFsdWUgPSBtb21lbnQoYWMudmFsdWUpO1xuICAgICAgbGV0IG1pbkRhdGUgPSBtb21lbnQoRGF0ZVZhbGlkYXRvci5jb252ZXJ0TmdiU3RydWN0VG9EYXRlKERhdGVWYWxpZGF0b3IubWluVmFsdWUpKTtcbiAgICAgIGxldCBtYXhEYXRlID0gbW9tZW50KERhdGVWYWxpZGF0b3IuY29udmVydE5nYlN0cnVjdFRvRGF0ZShEYXRlVmFsaWRhdG9yLm1heFZhbHVlKSk7XG5cbiAgICAgIGlmIChkYXRlVmFsdWUuaXNCZWZvcmUobWluRGF0ZSwgXCJkYXlcIikgfHwgZGF0ZVZhbHVlLmlzQWZ0ZXIobWF4RGF0ZSwgXCJkYXlcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgXCJkYXRlUmFuZ2VWYWxpZGF0b3JcIjogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGRhdGVJbnZhbGlkVmFsaWRhdG9yKGFjOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBpZiAoYWMgJiYgYWMudmFsdWUgJiYgIW1vbWVudChhYy52YWx1ZSwgXCJNL0QvWVlZWVwiLCB0cnVlKS5pc1ZhbGlkKCkgJiYgIW1vbWVudChhYy52YWx1ZSwgXCJNTS9ERC9ZWVlZXCIsIHRydWUpLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHsgXCJkYXRlSW52YWxpZFZhbGlkYXRvclwiOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgIHN0YXRpYyBjb252ZXJ0TmdiU3RydWN0VG9EYXRlKHN0cnVjdCkge1xuICAgICByZXR1cm4ge3llYXI6IHN0cnVjdC55ZWFyLCBtb250aDogc3RydWN0Lm1vbnRoIC0gMSwgZGF5OiBzdHJ1Y3QuZGF5fTtcbiAgIH1cblxuICAgc3RhdGljIGluUmFuZ2UoYWM6IEFic3RyYWN0Q29udHJvbCkge1xuICAgICBpZiAoYWMgJiYgYWMudmFsdWUgJiYgRGF0ZVZhbGlkYXRvci5taW5WYWx1ZSAmJiBEYXRlVmFsaWRhdG9yLm1heFZhbHVlICYmIChtb21lbnQoYWMudmFsdWUsIFwiTS9EL1lZWVlcIiwgdHJ1ZSkuaXNWYWxpZCgpIHx8IG1vbWVudChhYy52YWx1ZSwgXCJNTS9ERC9ZWVlZXCIsIHRydWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICBsZXQgZGF0ZVZhbHVlID0gbW9tZW50KGFjLnZhbHVlKTtcbiAgICAgICBsZXQgbWluRGF0ZSA9IG1vbWVudChEYXRlVmFsaWRhdG9yLmNvbnZlcnROZ2JTdHJ1Y3RUb0RhdGUoRGF0ZVZhbGlkYXRvci5taW5WYWx1ZSkpO1xuICAgICAgIGxldCBtYXhEYXRlID0gbW9tZW50KERhdGVWYWxpZGF0b3IuY29udmVydE5nYlN0cnVjdFRvRGF0ZShEYXRlVmFsaWRhdG9yLm1heFZhbHVlKSk7XG5cbiAgICAgICBpZiAoZGF0ZVZhbHVlLmlzQmVmb3JlKG1pbkRhdGUsIFwiZGF5XCIpIHx8IGRhdGVWYWx1ZS5pc0FmdGVyKG1heERhdGUsIFwiZGF5XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgfVxuICAgICB9XG4gICAgIHJldHVybiBmYWxzZTtcbiAgIH1cbn1cbiJdfQ==
|