@sumaris-net/ngx-components 18.26.13 → 18.27.0-alpha1
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/doc/changelog.md +3 -1
- package/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/core/core.module.mjs +4 -1
- package/esm2022/src/app/core/form/form.utils.mjs +12 -1
- package/esm2022/src/app/shared/field-accessor.mjs +16 -0
- package/esm2022/src/app/shared/focusable.mjs +1 -1
- package/esm2022/src/app/shared/inputs.mjs +22 -3
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +175 -46
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +69 -23
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +18 -4
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +116 -28
- package/esm2022/src/app/shared/material/duration/duration.module.mjs +10 -3
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +63 -33
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +3 -3
- package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +14 -1
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +16 -1
- package/esm2022/src/app/shared/material/testing/common.test.mjs +218 -27
- package/fesm2022/sumaris-net.ngx-components.mjs +985 -429
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/core/core.module.d.ts +15 -15
- package/src/app/core/form/form.utils.d.ts +7 -0
- package/src/app/shared/field-accessor.d.ts +51 -0
- package/src/app/shared/focusable.d.ts +3 -1
- package/src/app/shared/inputs.d.ts +3 -1
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +20 -7
- package/src/app/shared/material/boolean/material.boolean.d.ts +12 -4
- package/src/app/shared/material/datetime/material.date.d.ts +6 -2
- package/src/app/shared/material/datetime/material.datetime.d.ts +20 -4
- package/src/app/shared/material/duration/duration.module.d.ts +3 -1
- package/src/app/shared/material/duration/material.duration.d.ts +15 -13
- package/src/app/shared/material/latlong/material.latlong-input.d.ts +5 -3
- package/src/app/shared/material/latlong/material.latlong.d.ts +5 -1
- package/src/app/shared/material/testing/common.test.d.ts +49 -6
- package/src/assets/i18n/en.json +1 -1
- package/src/assets/manifest.json +1 -1
|
@@ -1,33 +1,50 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ViewChild, ViewChildren } from '@angular/core';
|
|
2
2
|
import { AppFormUtils } from '../../../core/form/form.utils';
|
|
3
3
|
import { debounceTime } from 'rxjs/operators';
|
|
4
4
|
import { Validators } from '@angular/forms';
|
|
5
|
-
import {
|
|
5
|
+
import { SharedValidators } from '../../validator/validators';
|
|
6
6
|
import { isMobile } from '../../platforms';
|
|
7
7
|
import { DateUtils, toDateISOString } from '../../dates';
|
|
8
8
|
import { StatusList } from '../../../core/services/model/referential.model';
|
|
9
9
|
import { Subscription } from 'rxjs';
|
|
10
|
+
import { isNilOrBlank, sleep, toBoolean, toNumber } from '../../functions';
|
|
11
|
+
import { INPUT_FIELD_ACCESSOR } from '../../field-accessor';
|
|
10
12
|
import * as i0 from "@angular/core";
|
|
11
13
|
import * as i1 from "@angular/forms";
|
|
12
|
-
import * as i2 from "@
|
|
13
|
-
import * as i3 from "@angular
|
|
14
|
-
import * as i4 from "@angular/material/
|
|
15
|
-
import * as i5 from "@angular/material/
|
|
16
|
-
import * as i6 from "@angular/material/
|
|
17
|
-
import * as i7 from "@angular/material/
|
|
18
|
-
import * as i8 from "
|
|
19
|
-
import * as i9 from "
|
|
20
|
-
import * as i10 from "
|
|
21
|
-
import * as i11 from "
|
|
22
|
-
import * as i12 from "
|
|
14
|
+
import * as i2 from "@angular/common";
|
|
15
|
+
import * as i3 from "@ionic/angular";
|
|
16
|
+
import * as i4 from "@angular/material/form-field";
|
|
17
|
+
import * as i5 from "@angular/material/input";
|
|
18
|
+
import * as i6 from "@angular/material/checkbox";
|
|
19
|
+
import * as i7 from "@angular/material/select";
|
|
20
|
+
import * as i8 from "@angular/material/core";
|
|
21
|
+
import * as i9 from "@angular/material/tabs";
|
|
22
|
+
import * as i10 from "../autocomplete/material.autocomplete";
|
|
23
|
+
import * as i11 from "../latlong/material.latlong";
|
|
24
|
+
import * as i12 from "../datetime/material.date";
|
|
25
|
+
import * as i13 from "../datetime/material.datetime";
|
|
26
|
+
import * as i14 from "../duration/material.duration";
|
|
27
|
+
import * as i15 from "../boolean/material.boolean";
|
|
28
|
+
import * as i16 from "@ngx-translate/core";
|
|
29
|
+
import * as i17 from "../../pipes/property.pipes";
|
|
30
|
+
import * as i18 from "../../pipes/form.pipes";
|
|
31
|
+
/** Fake items for autocomplete testing — same shape as FAKE_ENTITIES in autocomplete.test.ts */
|
|
32
|
+
const FAKE_ACCESSOR_ITEMS = [
|
|
33
|
+
{ id: 1, label: 'AAA', name: 'Item A' },
|
|
34
|
+
{ id: 2, label: 'BBB', name: 'Item B' },
|
|
35
|
+
{ id: 3, label: 'CCC', name: 'Item C' },
|
|
36
|
+
{ id: 4, label: 'DDD', name: 'Item D' },
|
|
37
|
+
{ id: 5, label: 'EEE', name: 'Item E' },
|
|
38
|
+
];
|
|
23
39
|
export class MatCommonTestPage {
|
|
24
40
|
formBuilder;
|
|
25
41
|
cd;
|
|
42
|
+
subscription = new Subscription();
|
|
43
|
+
form;
|
|
26
44
|
showLogPanel = true;
|
|
27
45
|
logContent = '';
|
|
28
|
-
form;
|
|
29
46
|
statusList = StatusList;
|
|
30
|
-
|
|
47
|
+
mode = 'mobile';
|
|
31
48
|
constructor(formBuilder, cd) {
|
|
32
49
|
this.formBuilder = formBuilder;
|
|
33
50
|
this.cd = cd;
|
|
@@ -38,10 +55,14 @@ export class MatCommonTestPage {
|
|
|
38
55
|
disable: [null, Validators.required],
|
|
39
56
|
readonly: [null],
|
|
40
57
|
select: [null, Validators.required],
|
|
41
|
-
|
|
58
|
+
// Shared components
|
|
59
|
+
autocomplete: [null, SharedValidators.entity],
|
|
42
60
|
date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
|
|
43
|
-
|
|
44
|
-
|
|
61
|
+
datetime: [null],
|
|
62
|
+
boolean: [null],
|
|
63
|
+
latitude: [null],
|
|
64
|
+
longitude: [null],
|
|
65
|
+
duration: [null],
|
|
45
66
|
});
|
|
46
67
|
const disableControl = this.form.get('disable');
|
|
47
68
|
disableControl.disable();
|
|
@@ -55,18 +76,29 @@ export class MatCommonTestPage {
|
|
|
55
76
|
ngOnDestroy() {
|
|
56
77
|
this.subscription.unsubscribe();
|
|
57
78
|
}
|
|
79
|
+
toggleMode(value) {
|
|
80
|
+
if (this.mode !== value) {
|
|
81
|
+
this.mode = value;
|
|
82
|
+
this.cd.detectChanges();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
58
85
|
// Load the form with data
|
|
59
86
|
async loadData() {
|
|
60
87
|
const now = DateUtils.moment();
|
|
61
88
|
const data = {
|
|
62
|
-
empty: null,
|
|
89
|
+
empty: null,
|
|
63
90
|
emptyRequired: null,
|
|
64
|
-
enable:
|
|
65
|
-
disable:
|
|
66
|
-
readonly:
|
|
91
|
+
enable: 'value',
|
|
92
|
+
disable: 'value',
|
|
93
|
+
readonly: 'readonly',
|
|
67
94
|
select: null,
|
|
95
|
+
autocomplete: null,
|
|
68
96
|
boolean: null,
|
|
69
|
-
date:
|
|
97
|
+
date: toDateISOString(now),
|
|
98
|
+
datetime: toDateISOString(now),
|
|
99
|
+
latitude: null,
|
|
100
|
+
longitude: null,
|
|
101
|
+
duration: null,
|
|
70
102
|
};
|
|
71
103
|
this.form.setValue(data);
|
|
72
104
|
this.log('[test-page] Data loaded: ' + JSON.stringify(data));
|
|
@@ -101,11 +133,170 @@ export class MatCommonTestPage {
|
|
|
101
133
|
this.cd.markForCheck();
|
|
102
134
|
}
|
|
103
135
|
stringify = JSON.stringify;
|
|
136
|
+
// ── Field Accessor tab state ──
|
|
137
|
+
inputFieldAccessors;
|
|
138
|
+
autocompleteField;
|
|
139
|
+
booleanField;
|
|
140
|
+
dateField;
|
|
141
|
+
dateTimeField;
|
|
142
|
+
latitudeField;
|
|
143
|
+
longitudeField;
|
|
144
|
+
durationField;
|
|
145
|
+
accessorFieldOptions = [
|
|
146
|
+
{ id: 'autocomplete', label: 'Autocomplete', hasTypeText: true },
|
|
147
|
+
{ id: 'boolean', label: 'Boolean', hasTypeText: false },
|
|
148
|
+
{ id: 'date', label: 'Date', hasTypeText: true },
|
|
149
|
+
{ id: 'datetime', label: 'DateTime', hasTypeText: true },
|
|
150
|
+
{ id: 'latitude', label: 'Latitude', hasTypeText: true },
|
|
151
|
+
{ id: 'longitude', label: 'Longitude', hasTypeText: true },
|
|
152
|
+
{ id: 'duration', label: 'Duration', hasTypeText: true },
|
|
153
|
+
];
|
|
154
|
+
selectedAccessorField = this.accessorFieldOptions[3];
|
|
155
|
+
accessorWriteValue = '';
|
|
156
|
+
accessorTypeText = '010120260100';
|
|
157
|
+
accessorLastAction = '';
|
|
158
|
+
accessorTypeTextLetterByLetter = true;
|
|
159
|
+
autocompleteSuggestItems = [...FAKE_ACCESSOR_ITEMS];
|
|
160
|
+
// ── Field Accessor control panel methods ──
|
|
161
|
+
_getAccessor(controlName) {
|
|
162
|
+
// Resolve by control name
|
|
163
|
+
const fieldAccessor = this.inputFieldAccessors.find(field => field.controlName === controlName);
|
|
164
|
+
if (fieldAccessor)
|
|
165
|
+
return fieldAccessor;
|
|
166
|
+
// Resolve by map
|
|
167
|
+
const map = {
|
|
168
|
+
autocomplete: this.autocompleteField,
|
|
169
|
+
boolean: this.booleanField,
|
|
170
|
+
date: this.dateField,
|
|
171
|
+
datetime: this.dateTimeField,
|
|
172
|
+
latitude: this.latitudeField,
|
|
173
|
+
longitude: this.longitudeField,
|
|
174
|
+
duration: this.durationField,
|
|
175
|
+
};
|
|
176
|
+
return map[controlName] ?? null;
|
|
177
|
+
}
|
|
178
|
+
selectAccessorField(option) {
|
|
179
|
+
this.selectedAccessorField = option;
|
|
180
|
+
this.accessorLastAction = `Selected: ${option.label}`;
|
|
181
|
+
}
|
|
182
|
+
selectAccessorFieldById(id) {
|
|
183
|
+
const option = this.accessorFieldOptions.find((f) => f.id === id);
|
|
184
|
+
if (option)
|
|
185
|
+
this.selectAccessorField(option);
|
|
186
|
+
}
|
|
187
|
+
doAccessorFocus() {
|
|
188
|
+
const accessor = this._getAccessor(this.selectedAccessorField.id);
|
|
189
|
+
if (accessor) {
|
|
190
|
+
accessor.focus();
|
|
191
|
+
this.accessorLastAction = `focus() → ${this.selectedAccessorField.label}`;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.accessorLastAction = `focus() FAILED: component not available`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
doAccessorClear() {
|
|
198
|
+
const accessor = this._getAccessor(this.selectedAccessorField.id);
|
|
199
|
+
if (accessor) {
|
|
200
|
+
accessor.clearValue();
|
|
201
|
+
this.accessorLastAction = `clearValue() → ${this.selectedAccessorField.label}`;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.accessorLastAction = `clearValue() FAILED: component not available`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
doAccessorWriteValue() {
|
|
208
|
+
const accessor = this._getAccessor(this.selectedAccessorField.id);
|
|
209
|
+
if (!accessor) {
|
|
210
|
+
this.accessorLastAction = `writeValue() FAILED: component not available`;
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
let value;
|
|
214
|
+
const valueStr = this.accessorWriteValue?.trim();
|
|
215
|
+
if (isNilOrBlank(valueStr)) {
|
|
216
|
+
value = null;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
switch (this.selectedAccessorField.id) {
|
|
220
|
+
case 'autocomplete':
|
|
221
|
+
try {
|
|
222
|
+
value = JSON.parse(valueStr);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
value = valueStr; // keep as string if not valid JSON
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
case 'boolean':
|
|
229
|
+
value = toBoolean(valueStr);
|
|
230
|
+
break;
|
|
231
|
+
case 'date':
|
|
232
|
+
case 'datetime':
|
|
233
|
+
value = DateUtils.moment(valueStr);
|
|
234
|
+
break;
|
|
235
|
+
case 'duration':
|
|
236
|
+
value = toNumber(valueStr);
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
value = valueStr;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
accessor.writeValue(value);
|
|
243
|
+
this.accessorLastAction = `writeValue(${valueStr}) → ${JSON.stringify(value)} → ${this.selectedAccessorField.label}`;
|
|
244
|
+
}
|
|
245
|
+
async doAccessorTypeText(event) {
|
|
246
|
+
event?.preventDefault();
|
|
247
|
+
event?.stopPropagation();
|
|
248
|
+
const accessor = this._getAccessor(this.selectedAccessorField.id);
|
|
249
|
+
if (!accessor || typeof accessor.typeText !== 'function') {
|
|
250
|
+
this.accessorLastAction = `typeText() not supported on ${this.selectedAccessorField.label}`;
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const text = this.accessorTypeText?.trim();
|
|
254
|
+
if (!text) {
|
|
255
|
+
this.accessorLastAction = `typeText() — enter text`;
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (!accessor.focused)
|
|
259
|
+
accessor.focus();
|
|
260
|
+
if (this.accessorTypeTextLetterByLetter) {
|
|
261
|
+
for (let i = 0; i < text.length; i++) {
|
|
262
|
+
accessor.typeText(text[i]);
|
|
263
|
+
await sleep(500);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
accessor.typeText(text);
|
|
268
|
+
}
|
|
269
|
+
this.accessorLastAction = `typeText("${text}") → ${this.selectedAccessorField.label}`;
|
|
270
|
+
}
|
|
104
271
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MatCommonTestPage, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
105
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MatCommonTestPage, selector: "mat-common-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Common field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>\n {{ stringify(form.controls.empty.value) }}\n </pre>\n <br />\n <pre>\n formControl.valid? {{ form.controls.empty?.valid }}\n </pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"empty\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <!-- Empty value + required -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value (required)</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"emptyRequired\" [required]=\"true\" />\n\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">With value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.enable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"enable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Disable</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.disable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"disable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Readonly toggle</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox\n (change)=\"desktopReadonlyField.readOnly = $event.checked\"\n [checked]=\"desktopReadonlyField.readOnly\"\n >Readonly ?</mat-checkbox>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput #desktopReadonlyField formControlName=\"readonly\" [readOnly]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Boolean -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Boolean</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.disable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-boolean-field formControlName=\"boolean\" placeholder=\"Boolean\"></mat-boolean-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatSelect -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Mat Select</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Select</mat-label>\n <mat-select [formControl]=\"form.controls['select'] | formGetControl\" placeholder=\"Select a value\">\n <mat-select-trigger>\n {{ (form | formGetValue: 'select' | propertyGet: 'label' | translate) || '' }}\n </mat-select-trigger>\n @for (item of statusList; track item) {\n <mat-option [value]=\"item\">{{ item.label | translate }}</mat-option>\n }\n </mat-select>\n\n\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatDateTime -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Mat DateTime</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.date.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field\n [formControl]=\"form.controls['date'] | formGetControl\"\n placeholder=\"Date/Time\">\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n", dependencies: [{ kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i6.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i8.MatDateTime, selector: "mat-date-time-field", inputs: ["logPrefix", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "startDate", "datePickerFilter", "allowNoTime", "dottedMinutesInGap", "timeHoursOnly", "debug", "class", "style", "hourMinWidth", "hourMaxWidth", "appearance", "subscriptSizing", "formControl", "formControlName", "required", "readonly", "tabindex"], outputs: ["focus", "blur", "keydown.escape", "keyup.enter"] }, { kind: "component", type: i9.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "autofocus", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "directive", type: i10.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }, { kind: "pipe", type: i11.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i12.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i12.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
272
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MatCommonTestPage, selector: "mat-common-test", viewQueries: [{ propertyName: "autocompleteField", first: true, predicate: ["autocompleteField"], descendants: true }, { propertyName: "booleanField", first: true, predicate: ["booleanField"], descendants: true }, { propertyName: "dateField", first: true, predicate: ["dateField"], descendants: true }, { propertyName: "dateTimeField", first: true, predicate: ["dateTimeField"], descendants: true }, { propertyName: "latitudeField", first: true, predicate: ["latitudeField"], descendants: true }, { propertyName: "longitudeField", first: true, predicate: ["longitudeField"], descendants: true }, { propertyName: "durationField", first: true, predicate: ["durationField"], descendants: true }, { propertyName: "inputFieldAccessors", predicate: INPUT_FIELD_ACCESSOR, descendants: true }], ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Common field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n </nav>\n\n <form #tabPanel class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n @switch (mode){\n @case ('mobile') {\n <ng-container *ngTemplateOutlet=\"content; context: { mobile: true }\"></ng-container>\n }\n @case ('desktop') {\n <ng-container *ngTemplateOutlet=\"content; context: { mobile: false }\"></ng-container>\n }\n }\n </form>\n</ion-content>\n\n<ng-template #content let-mobile=\"mobile\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <!-- \u2500\u2500 Left column: form + fields \u2500\u2500 -->\n <ion-col size=\"12\" size-lg=\"9\" size-xl=\"8\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.empty.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"empty\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <!-- Empty value + required -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value (required)</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"emptyRequired\" [required]=\"true\" />\n\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">With value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.enable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"enable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Disable</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.disable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"disable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Readonly toggle</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox\n (change)=\"readonlyField.readOnly = $event.checked\"\n [checked]=\"readonlyField.readOnly\"\n >Readonly ?</mat-checkbox>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput #readonlyField formControlName=\"readonly\" [readOnly]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatSelect -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">MatSelect</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Select</mat-label>\n <mat-select [formControl]=\"form | formGetControl: 'select'\"\n placeholder=\"Select a value\">\n <mat-select-trigger>\n {{ (form | formGetValue: 'select' | propertyGet: 'label' | translate) || '' }}\n </mat-select-trigger>\n @for (item of statusList; track item) {\n <mat-option [value]=\"item\">{{ item.label | translate }}</mat-option>\n }\n </mat-select>\n\n\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <!-- custom fields -->\n <ion-row>\n <!-- Automcomplete (suggest) -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatAutocompleteField</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.autocomplete.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field #autocompleteField\n formControlName=\"autocomplete\"\n [mobile]=\"mobile\"\n [showSearchBar]=\"false\"\n [showAllOnFocus]=\"false\"\n [items]=\"autocompleteSuggestItems\"\n placeholder=\"Autocomplete\" ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatBoolean -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatBooleanField</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.boolean.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-boolean-field #booleanField formControlName=\"boolean\"\n [style]=\"mobile ? 'button' : 'radio'\"\n placeholder=\"Boolean\"></mat-boolean-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- MatDate -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatDate</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.date.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #dateField formControlName=\"date\" placeholder=\"Date\" [mobile]=\"mobile\"></mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatDateTime -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatDateTime</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.datetime.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field #dateTimeField formControlName=\"datetime\" placeholder=\"Date/Time\" [mobile]=\"mobile\"></mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatLatLong</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.latitude.value) }}, {{ stringify(form.controls.longitude.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-latlong-field #latitudeField type=\"latitude\"\n formControlName=\"latitude\" placeholder=\"Latitude\" [mobile]=\"mobile\"></mat-latlong-field>\n <mat-latlong-field #longitudeField type=\"longitude\"\n formControlName=\"longitude\" placeholder=\"Longitude\" [mobile]=\"mobile\"></mat-latlong-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatDuration</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.duration.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-duration-field #durationField formControlName=\"duration\" placeholder=\"Duration\"></mat-duration-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-col>\n\n <!-- \u2500\u2500 Right column: control panel \u2500\u2500 -->\n <ion-col size=\"12\" size-lg=\"3\" size-xl=\"4\">\n <ion-card color=\"light\" style=\"position: sticky; top: 8px\">\n <ion-card-header>\n <ion-card-title>Control panel</ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\"><small>Control a field using the token INPUT_FIELD_ACCESSOR</small></ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%\">\n <mat-label>Target field</mat-label>\n <input matInput type=\"text\" hidden />\n <mat-select\n (selectionChange)=\"selectAccessorFieldById($event.value)\"\n [value]=\"selectedAccessorField.id\"\n >\n @for (item of accessorFieldOptions; track item.id) {\n <mat-option [value]=\"item.id\">{{ item.label }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <ion-item lines=\"none\">\n <ion-button size=\"small\" (click)=\"doAccessorFocus()\">Focus</ion-button>\n <ion-button size=\"small\" (click)=\"doAccessorClear()\">Clear</ion-button>\n </ion-item>\n\n <ion-item>\n <ion-input [(ngModel)]=\"accessorWriteValue\"\n [ngModelOptions]=\"{standalone: true}\"\n (keydown.enter)=\"doAccessorWriteValue()\"\n placeholder=\"null\">\n <ion-label>Value</ion-label>\n </ion-input>\n <ion-button slot=\"end\" (click)=\"doAccessorWriteValue()\">write</ion-button>\n </ion-item>\n\n @if (selectedAccessorField.hasTypeText) {\n <ion-item>\n <ion-input [(ngModel)]=\"accessorTypeText\" [ngModelOptions]=\"{standalone: true}\"\n (keydown.enter)=\"doAccessorTypeText()\"\n >\n <ion-label>Text</ion-label>\n </ion-input>\n <ion-button slot=\"end\" (click)=\"doAccessorTypeText($event)\">send</ion-button>\n </ion-item>\n <ion-item>\n <ion-input>\n <ion-checkbox [(ngModel)]=\"accessorTypeTextLetterByLetter\">\n <ion-label>Send letter by Letter ?</ion-label>\n </ion-checkbox>\n </ion-input>\n </ion-item>\n }\n\n <ion-text color=\"medium\">\n <small><code>{{ accessorLastAction || '' }}</code></small>\n </ion-text>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i3.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "legacy", "mode", "name", "value"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i3.IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "legacy", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i3.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i3.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i3.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar,ion-range" }, { kind: "component", type: i3.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i7.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i9.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i9.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "component", type: i10.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "label", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "hideRequiredMarker", "mobile", "showPanelHeader", "showPanelFooter", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "reloadItemsOnFocus", "clearInvalidValueOnBlur", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "selectInputContentOnFocusDelay", "previewImplicitValue", "showFavorites", "toggleFavoriteTitle", "favoriteItems", "colSizes", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keydown.backspace", "keyup.enter", "arrowUp", "arrowDown", "enter", "selectionChange", "openedChange", "toggleFavorite"] }, { kind: "component", type: i11.MatLatLongField, selector: "mat-latlong-field", inputs: ["formControl", "formControlName", "type", "latLongPattern", "maxDecimals", "required", "floatLabel", "placeholder", "defaultSign", "autofocus", "mobile", "clearable", "class", "tabindex", "appearance", "readonly", "subscriptSizing"] }, { kind: "component", type: i12.MatDate, selector: "mat-date-field", inputs: ["formControl", "formControlName", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "required", "startDate", "timezone", "datePickerFilter", "appearance", "subscriptSizing", "readonly", "tabindex"] }, { kind: "component", type: i13.MatDateTime, selector: "mat-date-time-field", inputs: ["logPrefix", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "startDate", "datePickerFilter", "allowNoTime", "dottedMinutesInGap", "timeHoursOnly", "debug", "class", "style", "hourMinWidth", "hourMaxWidth", "appearance", "subscriptSizing", "formControl", "formControlName", "required", "readonly", "tabindex"], outputs: ["focus", "blur", "keydown.escape", "keyup.enter"] }, { kind: "component", type: i14.MatDuration, selector: "mat-duration-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "readonly", "required", "compact", "maxDecimals", "placeholderChar", "clearButtonTitle", "tabindex", "clearable"] }, { kind: "component", type: i15.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "autofocus", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "directive", type: i16.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i16.TranslatePipe, name: "translate" }, { kind: "pipe", type: i17.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i18.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i18.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
106
273
|
}
|
|
107
274
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MatCommonTestPage, decorators: [{
|
|
108
275
|
type: Component,
|
|
109
|
-
args: [{ selector: 'mat-common-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Common field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>\n {{ stringify(form.controls.empty.value) }}\n </pre>\n <br />\n <pre>\n formControl.valid? {{ form.controls.empty?.valid }}\n </pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"empty\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <!-- Empty value + required -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value (required)</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"emptyRequired\" [required]=\"true\" />\n\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">With value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.enable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"enable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Disable</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.disable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"disable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Readonly toggle</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox\n (change)=\"desktopReadonlyField.readOnly = $event.checked\"\n [checked]=\"desktopReadonlyField.readOnly\"\n >Readonly ?</mat-checkbox>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput #desktopReadonlyField formControlName=\"readonly\" [readOnly]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Boolean -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Boolean</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.disable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-boolean-field formControlName=\"boolean\" placeholder=\"Boolean\"></mat-boolean-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatSelect -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Mat Select</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Select</mat-label>\n <mat-select [formControl]=\"form.controls['select'] | formGetControl\" placeholder=\"Select a value\">\n <mat-select-trigger>\n {{ (form | formGetValue: 'select' | propertyGet: 'label' | translate) || '' }}\n </mat-select-trigger>\n @for (item of statusList; track item) {\n <mat-option [value]=\"item\">{{ item.label | translate }}</mat-option>\n }\n </mat-select>\n\n\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatDateTime -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Mat DateTime</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.date.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field\n [formControl]=\"form.controls['date'] | formGetControl\"\n placeholder=\"Date/Time\">\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n" }]
|
|
110
|
-
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }]
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC90ZXN0aW5nL2NvbW1vbi50ZXN0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvdGVzdGluZy9jb21tb24udGVzdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBd0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU9wQyxNQUFNLE9BQU8saUJBQWlCO0lBV2hCO0lBQ0E7SUFYWixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFFaEIsSUFBSSxDQUFtQjtJQUV2QixVQUFVLEdBQUcsVUFBVSxDQUFDO0lBRWhCLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBRTFDLFlBQ1ksV0FBK0IsRUFDL0IsRUFBcUI7UUFEckIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLE9BQUUsR0FBRixF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O1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7d0dBM0doQixpQkFBaUI7NEZBQWpCLGlCQUFpQix1RENmOUIsaTZQQW1PQTs7NEZEcE5hLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxpQkFBaUIsbUJBRVYsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwRm9ybVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9mb3JtL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2hhcmVkRm9ybUdyb3VwVmFsaWRhdG9ycywgU2hhcmVkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7IERhdGVVdGlscywgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuaW1wb3J0IHsgU3RhdHVzTGlzdCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1jb21tb24tdGVzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21tb24udGVzdC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdENvbW1vblRlc3RQYWdlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBzaG93TG9nUGFuZWwgPSB0cnVlO1xuICBsb2dDb250ZW50ID0gJyc7XG5cbiAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICBzdGF0dXNMaXN0ID0gU3RhdHVzTGlzdDtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAge1xuICAgICAgICBlbXB0eTogW251bGxdLFxuICAgICAgICBlbXB0eVJlcXVpcmVkOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIGVuYWJsZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBkaXNhYmxlOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHJlYWRvbmx5OiBbbnVsbF0sXG4gICAgICAgIHNlbGVjdDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBib29sZWFuOiBbbnVsbF0sXG4gICAgICAgIGRhdGU6IFtudWxsLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXSldLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdG9yczogU2hhcmVkRm9ybUdyb3VwVmFsaWRhdG9ycy5kYXRlUmFuZ2UoJ2VtcHR5JywgJ2VuYWJsZScpLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBkaXNhYmxlQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoJ2Rpc2FibGUnKTtcbiAgICBkaXNhYmxlQ29udHJvbC5kaXNhYmxlKCk7XG5cbiAgICAvLyBDb3B5IHRoZSAnZW5hYmxlJyB2YWx1ZSwgaW50byB0aGUgZGlzYWJsZSBjb250cm9sXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuZm9ybS5nZXQoJ2VuYWJsZScpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiBkaXNhYmxlQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSkpKTtcblxuICAgIHRoaXMuc2hvd0xvZ1BhbmVsID0gdGhpcy5zaG93TG9nUGFuZWwgfHwgaXNNb2JpbGUod2luZG93KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkRGF0YSgpLCAyNTApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIExvYWQgdGhlIGZvcm0gd2l0aCBkYXRhXG4gIGFzeW5jIGxvYWREYXRhKCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGVVdGlscy5tb21lbnQoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBlbXB0eTogbnVsbCwgLy8gdG9EYXRlSVNPU3RyaW5nKG5vdy5jbG9uZSgpLmFkZCgyLCAnaG91cnMnKSksXG4gICAgICBlbXB0eVJlcXVpcmVkOiBudWxsLFxuICAgICAgZW5hYmxlOiB0b0RhdGVJU09TdHJpbmcobm93KSxcbiAgICAgIGRpc2FibGU6IG5vdy5jbG9uZSgpLFxuICAgICAgcmVhZG9ubHk6IG5vdy5jbG9uZSgpLFxuICAgICAgc2VsZWN0OiBudWxsLFxuICAgICAgYm9vbGVhbjogbnVsbCxcbiAgICAgIGRhdGU6IG51bGwsXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybS5zZXRWYWx1ZShkYXRhKTtcblxuICAgIHRoaXMubG9nKCdbdGVzdC1wYWdlXSBEYXRhIGxvYWRlZDogJyArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybVxuICAgICAgICAuZ2V0KCdlbXB0eScpXG4gICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMubG9nKCdbdGVzdC1wYWdlXSBWYWx1ZSBuwrAxOiAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtXG4gICAgICAgIC5nZXQoJ2VuYWJsZScpXG4gICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMubG9nKCdbdGVzdC1wYWdlXSBWYWx1ZSBuwrAyOiAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKSlcbiAgICApO1xuICB9XG5cbiAgZG9TdWJtaXQoXykge1xuICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5sb2coJ1t0ZXN0LXBhZ2VdIEZvcm0gY29udGVudDogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybS52YWx1ZSkpO1xuICAgIHRoaXMubG9nKCdbdGVzdC1wYWdlXSBGb3JtIHN0YXR1czogJyArIHRoaXMuZm9ybS5zdGF0dXMpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5sb2coJ1t0ZXN0LXBhZ2VdIEZvcm0gZXJyb3JzOiAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5mb3JtLmVycm9ycykpO1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnModGhpcy5mb3JtKTtcbiAgICB9XG4gIH1cblxuICBsb2cobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKTtcblxuICAgIGlmICh0aGlzLnNob3dMb2dQYW5lbCkge1xuICAgICAgdGhpcy5sb2dDb250ZW50ICs9IG1lc3NhZ2UgKyAnPGJyLz4nO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckxvZ1BhbmVsKCkge1xuICAgIHRoaXMubG9nQ29udGVudCA9ICcnO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIj5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XG4gICAgICA8aW9uLWJhY2stYnV0dG9uPjwvaW9uLWJhY2stYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG5cbiAgICA8aW9uLXRpdGxlPkNvbW1vbiBmaWVsZCB0ZXN0IHBhZ2U8L2lvbi10aXRsZT5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJkb1N1Ym1pdCgkZXZlbnQpXCI+XG4gICAgPGlvbi1ncmlkPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDwhLS0gRW1wdHkgdmFsdWUgLS0+XG4gICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+RW1wdHkgdmFsdWU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8cHJlPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmVtcHR5LnZhbHVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxwcmU+XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2wudmFsaWQ/IHt7IGZvcm0uY29udHJvbHMuZW1wdHk/LnZhbGlkIH19XG4gICAgICAgICAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsdWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZW1wdHlcIiAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8IS0tIEVtcHR5IHZhbHVlICsgcmVxdWlyZWQgLS0+XG4gICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+RW1wdHkgdmFsdWUgKHJlcXVpcmVkKTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMuZW1wdHlSZXF1aXJlZC52YWx1ZSkgfX08L3ByZT5cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImVtcHR5UmVxdWlyZWRcIiBbcmVxdWlyZWRdPVwidHJ1ZVwiIC8+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICA8IS0tIEVuYWJsZSAgLS0+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiPldpdGggdmFsdWU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8cHJlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmVuYWJsZS52YWx1ZSkgfX08L3ByZT5cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImVuYWJsZVwiIFtyZXF1aXJlZF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBEaXNhYmxlIC0tPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNhcmQ+XG4gICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5EaXNhYmxlPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPHByZT57eyBzdHJpbmdpZnkoZm9ybS5jb250cm9scy5kaXNhYmxlLnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsdWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGlzYWJsZVwiIFtyZXF1aXJlZF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBSZWFkb25seSAgLS0+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiPlJlYWRvbmx5IHRvZ2dsZTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMucmVhZG9ubHkudmFsdWUpIH19PC9wcmU+XG4gICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJkZXNrdG9wUmVhZG9ubHlGaWVsZC5yZWFkT25seSA9ICRldmVudC5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJkZXNrdG9wUmVhZG9ubHlGaWVsZC5yZWFkT25seVwiXG4gICAgICAgICAgICAgID5SZWFkb25seSA/PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0ICNkZXNrdG9wUmVhZG9ubHlGaWVsZCBmb3JtQ29udHJvbE5hbWU9XCJyZWFkb25seVwiIFtyZWFkT25seV09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBCb29sZWFuIC0tPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNhcmQ+XG4gICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5Cb29sZWFuPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPHByZT57eyBzdHJpbmdpZnkoZm9ybS5jb250cm9scy5kaXNhYmxlLnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPG1hdC1ib29sZWFuLWZpZWxkIGZvcm1Db250cm9sTmFtZT1cImJvb2xlYW5cIiBwbGFjZWhvbGRlcj1cIkJvb2xlYW5cIj48L21hdC1ib29sZWFuLWZpZWxkPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICA8IS0tIE1hdFNlbGVjdCAgLS0+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiPk1hdCBTZWxlY3Q8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8cHJlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLnJlYWRvbmx5LnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VsZWN0PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cImZvcm0uY29udHJvbHNbJ3NlbGVjdCddIHwgZm9ybUdldENvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBhIHZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3NlbGVjdCcgfCBwcm9wZXJ0eUdldDogJ2xhYmVsJyB8IHRyYW5zbGF0ZSkgfHwgJycgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzdGF0dXNMaXN0OyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtXCI+e3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cblxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICA8IS0tIE1hdERhdGVUaW1lICAtLT5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+TWF0IERhdGVUaW1lPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPHByZT57eyBzdHJpbmdpZnkoZm9ybS5jb250cm9scy5kYXRlLnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPG1hdC1kYXRlLXRpbWUtZmllbGRcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9sc1snZGF0ZSddIHwgZm9ybUdldENvbnRyb2xcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGF0ZS9UaW1lXCI+XG4gICAgICAgICAgICAgIDwvbWF0LWRhdGUtdGltZS1maWVsZD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9pb24tZ3JpZD5cbiAgPC9mb3JtPlxuPC9pb24tY29udGVudD5cbiJdfQ==
|
|
276
|
+
args: [{ selector: 'mat-common-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Common field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n </nav>\n\n <form #tabPanel class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n @switch (mode){\n @case ('mobile') {\n <ng-container *ngTemplateOutlet=\"content; context: { mobile: true }\"></ng-container>\n }\n @case ('desktop') {\n <ng-container *ngTemplateOutlet=\"content; context: { mobile: false }\"></ng-container>\n }\n }\n </form>\n</ion-content>\n\n<ng-template #content let-mobile=\"mobile\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <!-- \u2500\u2500 Left column: form + fields \u2500\u2500 -->\n <ion-col size=\"12\" size-lg=\"9\" size-xl=\"8\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.empty.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"empty\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <!-- Empty value + required -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Empty value (required)</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"emptyRequired\" [required]=\"true\" />\n\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">With value</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.enable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"enable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Disable</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.disable.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput formControlName=\"disable\" [required]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Readonly toggle</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox\n (change)=\"readonlyField.readOnly = $event.checked\"\n [checked]=\"readonlyField.readOnly\"\n >Readonly ?</mat-checkbox>\n <mat-form-field>\n <mat-label>Value</mat-label>\n <input matInput #readonlyField formControlName=\"readonly\" [readOnly]=\"true\" />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatSelect -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">MatSelect</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <mat-label>Select</mat-label>\n <mat-select [formControl]=\"form | formGetControl: 'select'\"\n placeholder=\"Select a value\">\n <mat-select-trigger>\n {{ (form | formGetValue: 'select' | propertyGet: 'label' | translate) || '' }}\n </mat-select-trigger>\n @for (item of statusList; track item) {\n <mat-option [value]=\"item\">{{ item.label | translate }}</mat-option>\n }\n </mat-select>\n\n\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <!-- custom fields -->\n <ion-row>\n <!-- Automcomplete (suggest) -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatAutocompleteField</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.autocomplete.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field #autocompleteField\n formControlName=\"autocomplete\"\n [mobile]=\"mobile\"\n [showSearchBar]=\"false\"\n [showAllOnFocus]=\"false\"\n [items]=\"autocompleteSuggestItems\"\n placeholder=\"Autocomplete\" ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatBoolean -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatBooleanField</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.boolean.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-boolean-field #booleanField formControlName=\"boolean\"\n [style]=\"mobile ? 'button' : 'radio'\"\n placeholder=\"Boolean\"></mat-boolean-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- MatDate -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatDate</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.date.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #dateField formControlName=\"date\" placeholder=\"Date\" [mobile]=\"mobile\"></mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- MatDateTime -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatDateTime</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.datetime.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field #dateTimeField formControlName=\"datetime\" placeholder=\"Date/Time\" [mobile]=\"mobile\"></mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatLatLong</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.latitude.value) }}, {{ stringify(form.controls.longitude.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-latlong-field #latitudeField type=\"latitude\"\n formControlName=\"latitude\" placeholder=\"Latitude\" [mobile]=\"mobile\"></mat-latlong-field>\n <mat-latlong-field #longitudeField type=\"longitude\"\n formControlName=\"longitude\" placeholder=\"Longitude\" [mobile]=\"mobile\"></mat-latlong-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title><ion-label color=\"primary\">MatDuration</ion-label></ion-card-title>\n <ion-card-subtitle>{{ stringify(form.controls.duration.value) }}</ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-duration-field #durationField formControlName=\"duration\" placeholder=\"Duration\"></mat-duration-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-col>\n\n <!-- \u2500\u2500 Right column: control panel \u2500\u2500 -->\n <ion-col size=\"12\" size-lg=\"3\" size-xl=\"4\">\n <ion-card color=\"light\" style=\"position: sticky; top: 8px\">\n <ion-card-header>\n <ion-card-title>Control panel</ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\"><small>Control a field using the token INPUT_FIELD_ACCESSOR</small></ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%\">\n <mat-label>Target field</mat-label>\n <input matInput type=\"text\" hidden />\n <mat-select\n (selectionChange)=\"selectAccessorFieldById($event.value)\"\n [value]=\"selectedAccessorField.id\"\n >\n @for (item of accessorFieldOptions; track item.id) {\n <mat-option [value]=\"item.id\">{{ item.label }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <ion-item lines=\"none\">\n <ion-button size=\"small\" (click)=\"doAccessorFocus()\">Focus</ion-button>\n <ion-button size=\"small\" (click)=\"doAccessorClear()\">Clear</ion-button>\n </ion-item>\n\n <ion-item>\n <ion-input [(ngModel)]=\"accessorWriteValue\"\n [ngModelOptions]=\"{standalone: true}\"\n (keydown.enter)=\"doAccessorWriteValue()\"\n placeholder=\"null\">\n <ion-label>Value</ion-label>\n </ion-input>\n <ion-button slot=\"end\" (click)=\"doAccessorWriteValue()\">write</ion-button>\n </ion-item>\n\n @if (selectedAccessorField.hasTypeText) {\n <ion-item>\n <ion-input [(ngModel)]=\"accessorTypeText\" [ngModelOptions]=\"{standalone: true}\"\n (keydown.enter)=\"doAccessorTypeText()\"\n >\n <ion-label>Text</ion-label>\n </ion-input>\n <ion-button slot=\"end\" (click)=\"doAccessorTypeText($event)\">send</ion-button>\n </ion-item>\n <ion-item>\n <ion-input>\n <ion-checkbox [(ngModel)]=\"accessorTypeTextLetterByLetter\">\n <ion-label>Send letter by Letter ?</ion-label>\n </ion-checkbox>\n </ion-input>\n </ion-item>\n }\n\n <ion-text color=\"medium\">\n <small><code>{{ accessorLastAction || '' }}</code></small>\n </ion-text>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ng-template>\n" }]
|
|
277
|
+
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { inputFieldAccessors: [{
|
|
278
|
+
type: ViewChildren,
|
|
279
|
+
args: [INPUT_FIELD_ACCESSOR]
|
|
280
|
+
}], autocompleteField: [{
|
|
281
|
+
type: ViewChild,
|
|
282
|
+
args: ['autocompleteField']
|
|
283
|
+
}], booleanField: [{
|
|
284
|
+
type: ViewChild,
|
|
285
|
+
args: ['booleanField']
|
|
286
|
+
}], dateField: [{
|
|
287
|
+
type: ViewChild,
|
|
288
|
+
args: ['dateField']
|
|
289
|
+
}], dateTimeField: [{
|
|
290
|
+
type: ViewChild,
|
|
291
|
+
args: ['dateTimeField']
|
|
292
|
+
}], latitudeField: [{
|
|
293
|
+
type: ViewChild,
|
|
294
|
+
args: ['latitudeField']
|
|
295
|
+
}], longitudeField: [{
|
|
296
|
+
type: ViewChild,
|
|
297
|
+
args: ['longitudeField']
|
|
298
|
+
}], durationField: [{
|
|
299
|
+
type: ViewChild,
|
|
300
|
+
args: ['durationField']
|
|
301
|
+
}] } });
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC90ZXN0aW5nL2NvbW1vbi50ZXN0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvdGVzdGluZy9jb21tb24udGVzdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBcUIsU0FBUyxFQUFnQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUF1QyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdkQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQzFFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTXpFLE9BQU8sRUFBdUIsb0JBQW9CLEVBQTJCLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRzFHLGdHQUFnRztBQUNoRyxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVB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QixTQUFTOytCQUNFLGlCQUFpQixtQkFFVix1QkFBdUIsQ0FBQyxNQUFNO3VIQStIWCxtQkFBbUI7c0JBQXRELFlBQVk7dUJBQUMsb0JBQW9CO2dCQUVGLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0gsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNELFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDTSxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0UsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNHLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNDLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXBwRm9ybVV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Zvcm0vZm9ybS51dGlscyc7XG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7U2hhcmVkVmFsaWRhdG9yc30gZnJvbSAnLi4vLi4vdmFsaWRhdG9yL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtpc01vYmlsZX0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7RGF0ZVV0aWxzLCB0b0RhdGVJU09TdHJpbmd9IGZyb20gJy4uLy4uL2RhdGVzJztcbmltcG9ydCB7U3RhdHVzTGlzdH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9yZWZlcmVudGlhbC5tb2RlbCc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2lzTmlsT3JCbGFuaywgc2xlZXAsIHRvQm9vbGVhbiwgdG9OdW1iZXJ9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZUZpZWxkfSBmcm9tICcuLi9hdXRvY29tcGxldGUvbWF0ZXJpYWwuYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7TWF0Qm9vbGVhbkZpZWxkfSBmcm9tICcuLi9ib29sZWFuL21hdGVyaWFsLmJvb2xlYW4nO1xuaW1wb3J0IHtNYXREYXRlfSBmcm9tICcuLi9kYXRldGltZS9tYXRlcmlhbC5kYXRlJztcbmltcG9ydCB7TWF0RGF0ZVRpbWV9IGZyb20gJy4uL2RhdGV0aW1lL21hdGVyaWFsLmRhdGV0aW1lJztcbmltcG9ydCB7TWF0RHVyYXRpb259IGZyb20gJy4uL2R1cmF0aW9uL21hdGVyaWFsLmR1cmF0aW9uJztcbmltcG9ydCB7Q29udHJvbEZpZWxkQWNjZXNzb3IsIElOUFVUX0ZJRUxEX0FDQ0VTU09SLCBUZXh0Q29udHJvbEZpZWxkQWNjZXNzb3J9IGZyb20gJy4uLy4uL2ZpZWxkLWFjY2Vzc29yJztcbmltcG9ydCB7TWF0TGF0TG9uZ0ZpZWxkfSBmcm9tICcuLi9sYXRsb25nL21hdGVyaWFsLmxhdGxvbmcnO1xuXG4vKiogRmFrZSBpdGVtcyBmb3IgYXV0b2NvbXBsZXRlIHRlc3Rpbmcg4oCUIHNhbWUgc2hhcGUgYXMgRkFLRV9FTlRJVElFUyBpbiBhdXRvY29tcGxldGUudGVzdC50cyAqL1xuY29uc3QgRkFLRV9BQ0NFU1NPUl9JVEVNUyA9IFtcbiAgeyBpZDogMSwgbGFiZWw6ICdBQUEnLCBuYW1lOiAnSXRlbSBBJyB9LFxuICB7IGlkOiAyLCBsYWJlbDogJ0JCQicsIG5hbWU6ICdJdGVtIEInIH0sXG4gIHsgaWQ6IDMsIGxhYmVsOiAnQ0NDJywgbmFtZTogJ0l0ZW0gQycgfSxcbiAgeyBpZDogNCwgbGFiZWw6ICdEREQnLCBuYW1lOiAnSXRlbSBEJyB9LFxuICB7IGlkOiA1LCBsYWJlbDogJ0VFRScsIG5hbWU6ICdJdGVtIEUnIH0sXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtY29tbW9uLXRlc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbW9uLnRlc3QuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1hdENvbW1vblRlc3RQYWdlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcm90ZWN0ZWQgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHJvdGVjdGVkIHNob3dMb2dQYW5lbCA9IHRydWU7XG4gIHByb3RlY3RlZCBsb2dDb250ZW50ID0gJyc7XG4gIHByb3RlY3RlZCBzdGF0dXNMaXN0ID0gU3RhdHVzTGlzdDtcbiAgcHJvdGVjdGVkIG1vZGU6ICdtb2JpbGUnIHwgJ2Rlc2t0b3AnID0gJ21vYmlsZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHtcbiAgICAgICAgZW1wdHk6IFtudWxsXSxcbiAgICAgICAgZW1wdHlSZXF1aXJlZDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBlbmFibGU6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgZGlzYWJsZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICByZWFkb25seTogW251bGxdLFxuICAgICAgICBzZWxlY3Q6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgLy8gU2hhcmVkIGNvbXBvbmVudHNcbiAgICAgICAgYXV0b2NvbXBsZXRlOiBbbnVsbCwgU2hhcmVkVmFsaWRhdG9ycy5lbnRpdHldLFxuICAgICAgICBkYXRlOiBbbnVsbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV0pXSxcbiAgICAgICAgZGF0ZXRpbWU6IFtudWxsXSxcbiAgICAgICAgYm9vbGVhbjogW251bGxdLFxuICAgICAgICBsYXRpdHVkZTogW251bGxdLFxuICAgICAgICBsb25naXR1ZGU6IFtudWxsXSxcbiAgICAgICAgZHVyYXRpb246IFtudWxsXSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgZGlzYWJsZUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KCdkaXNhYmxlJyk7XG4gICAgZGlzYWJsZUNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgLy8gQ29weSB0aGUgJ2VuYWJsZScgdmFsdWUsIGludG8gdGhlIGRpc2FibGUgY29udHJvbFxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmZvcm0uZ2V0KCdlbmFibGUnKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gZGlzYWJsZUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpKSk7XG5cbiAgICB0aGlzLnNob3dMb2dQYW5lbCA9IHRoaXMuc2hvd0xvZ1BhbmVsIHx8IGlzTW9iaWxlKHdpbmRvdyk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZERhdGEoKSwgMjUwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB0b2dnbGVNb2RlKHZhbHVlOiAnbW9iaWxlJyB8ICdkZXNrdG9wJykge1xuICAgIGlmICh0aGlzLm1vZGUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLm1vZGUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgdGhlIGZvcm0gd2l0aCBkYXRhXG4gIGFzeW5jIGxvYWREYXRhKCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGVVdGlscy5tb21lbnQoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBlbXB0eTogbnVsbCxcbiAgICAgIGVtcHR5UmVxdWlyZWQ6IG51bGwsXG4gICAgICBlbmFibGU6ICd2YWx1ZScsXG4gICAgICBkaXNhYmxlOiAndmFsdWUnLFxuICAgICAgcmVhZG9ubHk6ICdyZWFkb25seScsXG4gICAgICBzZWxlY3Q6IG51bGwsXG4gICAgICBhdXRvY29tcGxldGU6IG51bGwsXG4gICAgICBib29sZWFuOiBudWxsLFxuICAgICAgZGF0ZTogdG9EYXRlSVNPU3RyaW5nKG5vdyksXG4gICAgICBkYXRldGltZTogdG9EYXRlSVNPU3RyaW5nKG5vdyksXG4gICAgICBsYXRpdHVkZTogbnVsbCxcbiAgICAgIGxvbmdpdHVkZTogbnVsbCxcbiAgICAgIGR1cmF0aW9uOiBudWxsLFxuICAgIH07XG5cbiAgICB0aGlzLmZvcm0uc2V0VmFsdWUoZGF0YSk7XG5cbiAgICB0aGlzLmxvZygnW3Rlc3QtcGFnZV0gRGF0YSBsb2FkZWQ6ICcgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmZvcm1cbiAgICAgICAgLmdldCgnZW1wdHknKVxuICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLmxvZygnW3Rlc3QtcGFnZV0gVmFsdWUgbsKwMTogJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybVxuICAgICAgICAuZ2V0KCdlbmFibGUnKVxuICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLmxvZygnW3Rlc3QtcGFnZV0gVmFsdWUgbsKwMjogJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpXG4gICAgKTtcbiAgfVxuXG4gIGRvU3VibWl0KF8pIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIHRoaXMubG9nKCdbdGVzdC1wYWdlXSBGb3JtIGNvbnRlbnQ6ICcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmZvcm0udmFsdWUpKTtcbiAgICB0aGlzLmxvZygnW3Rlc3QtcGFnZV0gRm9ybSBzdGF0dXM6ICcgKyB0aGlzLmZvcm0uc3RhdHVzKTtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMubG9nKCdbdGVzdC1wYWdlXSBGb3JtIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybS5lcnJvcnMpKTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKHRoaXMuZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgbG9nKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSk7XG5cbiAgICBpZiAodGhpcy5zaG93TG9nUGFuZWwpIHtcbiAgICAgIHRoaXMubG9nQ29udGVudCArPSBtZXNzYWdlICsgJzxici8+JztcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJMb2dQYW5lbCgpIHtcbiAgICB0aGlzLmxvZ0NvbnRlbnQgPSAnJztcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVhZG9ubHkgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbiAgLy8g4pSA4pSAIEZpZWxkIEFjY2Vzc29yIHRhYiBzdGF0ZSDilIDilIBcblxuICBAVmlld0NoaWxkcmVuKElOUFVUX0ZJRUxEX0FDQ0VTU09SKSBpbnB1dEZpZWxkQWNjZXNzb3JzOiBRdWVyeUxpc3Q8Q29udHJvbEZpZWxkQWNjZXNzb3I+O1xuXG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZUZpZWxkJykgYXV0b2NvbXBsZXRlRmllbGQ6IE1hdEF1dG9jb21wbGV0ZUZpZWxkO1xuICBAVmlld0NoaWxkKCdib29sZWFuRmllbGQnKSBib29sZWFuRmllbGQ6IE1hdEJvb2xlYW5GaWVsZDtcbiAgQFZpZXdDaGlsZCgnZGF0ZUZpZWxkJykgZGF0ZUZpZWxkOiBNYXREYXRlO1xuICBAVmlld0NoaWxkKCdkYXRlVGltZUZpZWxkJykgZGF0ZVRpbWVGaWVsZDogTWF0RGF0ZVRpbWU7XG4gIEBWaWV3Q2hpbGQoJ2xhdGl0dWRlRmllbGQnKSBsYXRpdHVkZUZpZWxkOiBNYXRMYXRMb25nRmllbGQ7XG4gIEBWaWV3Q2hpbGQoJ2xvbmdpdHVkZUZpZWxkJykgbG9uZ2l0dWRlRmllbGQ6IE1hdExhdExvbmdGaWVsZDtcbiAgQFZpZXdDaGlsZCgnZHVyYXRpb25GaWVsZCcpIGR1cmF0aW9uRmllbGQ6IE1hdER1cmF0aW9uO1xuXG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjY2Vzc29yRmllbGRPcHRpb25zID0gW1xuICAgIHsgaWQ6ICdhdXRvY29tcGxldGUnLCBsYWJlbDogJ0F1dG9jb21wbGV0ZScsIGhhc1R5cGVUZXh0OiB0cnVlIH0sXG4gICAgeyBpZDogJ2Jvb2xlYW4nLCBsYWJlbDogJ0Jvb2xlYW4nLCBoYXNUeXBlVGV4dDogZmFsc2UgfSxcbiAgICB7IGlkOiAnZGF0ZScsIGxhYmVsOiAnRGF0ZScsIGhhc1R5cGVUZXh0OiB0cnVlIH0sXG4gICAgeyBpZDogJ2RhdGV0aW1lJywgbGFiZWw6ICdEYXRlVGltZScsIGhhc1R5cGVUZXh0OiB0cnVlIH0sXG4gICAgeyBpZDogJ2xhdGl0dWRlJywgbGFiZWw6ICdMYXRpdHVkZScsIGhhc1R5cGVUZXh0OiB0cnVlIH0sXG4gICAgeyBpZDogJ2xvbmdpdHVkZScsIGxhYmVsOiAnTG9uZ2l0dWRlJywgaGFzVHlwZVRleHQ6IHRydWUgfSxcbiAgICB7IGlkOiAnZHVyYXRpb24nLCBsYWJlbDogJ0R1cmF0aW9uJywgaGFzVHlwZVRleHQ6IHRydWUgfSxcbiAgXTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0ZWRBY2Nlc3NvckZpZWxkID0gdGhpcy5hY2Nlc3NvckZpZWxkT3B0aW9uc1szXTtcbiAgcHJvdGVjdGVkIGFjY2Vzc29yV3JpdGVWYWx1ZSA9ICcnO1xuICBwcm90ZWN0ZWQgYWNjZXNzb3JUeXBlVGV4dCA9ICcwMTAxMjAyNjAxMDAnO1xuICBwcm90ZWN0ZWQgYWNjZXNzb3JMYXN0QWN0aW9uID0gJyc7XG4gIHByb3RlY3RlZCBhY2Nlc3NvclR5cGVUZXh0TGV0dGVyQnlMZXR0ZXIgPSB0cnVlO1xuXG4gIHJlYWRvbmx5IGF1dG9jb21wbGV0ZVN1Z2dlc3RJdGVtcyA9IFsuLi5GQUtFX0FDQ0VTU09SX0lURU1TXTtcblxuICAvLyDilIDilIAgRmllbGQgQWNjZXNzb3IgY29udHJvbCBwYW5lbCBtZXRob2RzIOKUgOKUgFxuXG4gIHByaXZhdGUgX2dldEFjY2Vzc29yKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBDb250cm9sRmllbGRBY2Nlc3NvciB8IG51bGwge1xuICAgIC8vIFJlc29sdmUgYnkgY29udHJvbCBuYW1lXG4gICAgY29uc3QgZmllbGRBY2Nlc3NvciA9IHRoaXMuaW5wdXRGaWVsZEFjY2Vzc29ycy5maW5kKGZpZWxkID0+IGZpZWxkLmNvbnRyb2xOYW1lID09PSBjb250cm9sTmFtZSk7XG4gICAgaWYgKGZpZWxkQWNjZXNzb3IpIHJldHVybiBmaWVsZEFjY2Vzc29yO1xuXG4gICAgLy8gUmVzb2x2ZSBieSBtYXBcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xGaWVsZEFjY2Vzc29yIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAgIGF1dG9jb21wbGV0ZTogdGhpcy5hdXRvY29tcGxldGVGaWVsZCxcbiAgICAgIGJvb2xlYW46IHRoaXMuYm9vbGVhbkZpZWxkLFxuICAgICAgZGF0ZTogdGhpcy5kYXRlRmllbGQsXG4gICAgICBkYXRldGltZTogdGhpcy5kYXRlVGltZUZpZWxkLFxuICAgICAgbGF0aXR1ZGU6IHRoaXMubGF0aXR1ZGVGaWVsZCxcbiAgICAgIGxvbmdpdHVkZTogdGhpcy5sb25naXR1ZGVGaWVsZCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uRmllbGQsXG4gICAgfTtcbiAgICByZXR1cm4gbWFwW2NvbnRyb2xOYW1lXSA/PyBudWxsO1xuICB9XG5cbiAgc2VsZWN0QWNjZXNzb3JGaWVsZChvcHRpb246ICh0eXBlb2YgdGhpcy5hY2Nlc3NvckZpZWxkT3B0aW9ucylbMF0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQWNjZXNzb3JGaWVsZCA9IG9wdGlvbjtcbiAgICB0aGlzLmFjY2Vzc29yTGFzdEFjdGlvbiA9IGBTZWxlY3RlZDogJHtvcHRpb24ubGFiZWx9YDtcbiAgfVxuXG4gIHNlbGVjdEFjY2Vzc29yRmllbGRCeUlkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLmFjY2Vzc29yRmllbGRPcHRpb25zLmZpbmQoKGYpID0+IGYuaWQgPT09IGlkKTtcbiAgICBpZiAob3B0aW9uKSB0aGlzLnNlbGVjdEFjY2Vzc29yRmllbGQob3B0aW9uKTtcbiAgfVxuXG4gIGRvQWNjZXNzb3JGb2N1cygpOiB2b2lkIHtcbiAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuX2dldEFjY2Vzc29yKHRoaXMuc2VsZWN0ZWRBY2Nlc3NvckZpZWxkLmlkKTtcbiAgICBpZiAoYWNjZXNzb3IpIHtcbiAgICAgIGFjY2Vzc29yLmZvY3VzKCk7XG4gICAgICB0aGlzLmFjY2Vzc29yTGFzdEFjdGlvbiA9IGBmb2N1cygpIOKGkiAke3RoaXMuc2VsZWN0ZWRBY2Nlc3NvckZpZWxkLmxhYmVsfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWNjZXNzb3JMYXN0QWN0aW9uID0gYGZvY3VzKCkgRkFJTEVEOiBjb21wb25lbnQgbm90IGF2YWlsYWJsZWA7XG4gICAgfVxuICB9XG5cbiAgZG9BY2Nlc3NvckNsZWFyKCkge1xuICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5fZ2V0QWNjZXNzb3IodGhpcy5zZWxlY3RlZEFjY2Vzc29yRmllbGQuaWQpO1xuICAgIGlmIChhY2Nlc3Nvcikge1xuICAgICAgYWNjZXNzb3IuY2xlYXJWYWx1ZSgpO1xuICAgICAgdGhpcy5hY2Nlc3Nvckxhc3RBY3Rpb24gPSBgY2xlYXJWYWx1ZSgpIOKGkiAke3RoaXMuc2VsZWN0ZWRBY2Nlc3NvckZpZWxkLmxhYmVsfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWNjZXNzb3JMYXN0QWN0aW9uID0gYGNsZWFyVmFsdWUoKSBGQUlMRUQ6IGNvbXBvbmVudCBub3QgYXZhaWxhYmxlYDtcbiAgICB9XG4gIH1cblxuICBkb0FjY2Vzc29yV3JpdGVWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuX2dldEFjY2Vzc29yKHRoaXMuc2VsZWN0ZWRBY2Nlc3NvckZpZWxkLmlkKTtcbiAgICBpZiAoIWFjY2Vzc29yKSB7XG4gICAgICB0aGlzLmFjY2Vzc29yTGFzdEFjdGlvbiA9IGB3cml0ZVZhbHVlKCkgRkFJTEVEOiBjb21wb25lbnQgbm90IGF2YWlsYWJsZWA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgY29uc3QgdmFsdWVTdHIgPSB0aGlzLmFjY2Vzc29yV3JpdGVWYWx1ZT8udHJpbSgpO1xuICAgIGlmIChpc05pbE9yQmxhbmsodmFsdWVTdHIpKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEFjY2Vzc29yRmllbGQuaWQpIHtcbiAgICAgICAgY2FzZSAnYXV0b2NvbXBsZXRlJzpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlU3RyKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVTdHI7IC8vIGtlZXAgYXMgc3RyaW5nIGlmIG5vdCB2YWxpZCBKU09OXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICB2YWx1ZSA9IHRvQm9vbGVhbih2YWx1ZVN0cik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICAgICAgdmFsdWUgPSBEYXRlVXRpbHMubW9tZW50KHZhbHVlU3RyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZHVyYXRpb24nOlxuICAgICAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWVTdHIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHZhbHVlID0gdmFsdWVTdHI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWNjZXNzb3Iud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5hY2Nlc3Nvckxhc3RBY3Rpb24gPSBgd3JpdGVWYWx1ZSgke3ZhbHVlU3RyfSkg4oaSICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSDihpIgJHt0aGlzLnNlbGVjdGVkQWNjZXNzb3JGaWVsZC5sYWJlbH1gO1xuICB9XG5cbiAgYXN5bmMgZG9BY2Nlc3NvclR5cGVUZXh0KGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgYWNjZXNzb3IgPSB0aGlzLl9nZXRBY2Nlc3Nvcih0aGlzLnNlbGVjdGVkQWNjZXNzb3JGaWVsZC5pZCkgYXMgVGV4dENvbnRyb2xGaWVsZEFjY2Vzc29yIHwgbnVsbDtcbiAgICBpZiAoIWFjY2Vzc29yIHx8IHR5cGVvZiBhY2Nlc3Nvci50eXBlVGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5hY2Nlc3Nvckxhc3RBY3Rpb24gPSBgdHlwZVRleHQoKSBub3Qgc3VwcG9ydGVkIG9uICR7dGhpcy5zZWxlY3RlZEFjY2Vzc29yRmllbGQubGFiZWx9YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuYWNjZXNzb3JUeXBlVGV4dD8udHJpbSgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhpcy5hY2Nlc3Nvckxhc3RBY3Rpb24gPSBgdHlwZVRleHQoKSDigJQgZW50ZXIgdGV4dGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghYWNjZXNzb3IuZm9jdXNlZCkgYWNjZXNzb3IuZm9jdXMoKTtcblxuICAgIGlmICh0aGlzLmFjY2Vzc29yVHlwZVRleHRMZXR0ZXJCeUxldHRlcikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFjY2Vzc29yLnR5cGVUZXh0KHRleHRbaV0pO1xuICAgICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhY2Nlc3Nvci50eXBlVGV4dCh0ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLmFjY2Vzc29yTGFzdEFjdGlvbiA9IGB0eXBlVGV4dChcIiR7dGV4dH1cIikg4oaSICR7dGhpcy5zZWxlY3RlZEFjY2Vzc29yRmllbGQubGFiZWx9YDtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG59XG4iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYmFjay1idXR0b24+PC9pb24tYmFjay1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cblxuICAgIDxpb24tdGl0bGU+Q29tbW9uIGZpZWxkIHRlc3QgcGFnZTwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuXG48aW9uLWNvbnRlbnQ+XG4gIDwhLS0gVGFiIG5hdiAtIG1vYmlsZS9kZXNrdG9wIG1vZGUgLS0+XG4gIDxuYXYgbWF0LXRhYi1uYXYtYmFyIFt0YWJQYW5lbF09XCJ0YWJQYW5lbFwiPlxuICAgIDxhIG1hdC10YWItbGluayBbYWN0aXZlXT1cIm1vZGUgPT09ICdtb2JpbGUnXCIgKGNsaWNrKT1cInRvZ2dsZU1vZGUoJ21vYmlsZScpXCI+XG4gICAgICA8bWF0LWxhYmVsPk1vYmlsZTwvbWF0LWxhYmVsPlxuICAgIDwvYT5cbiAgICA8YSBtYXQtdGFiLWxpbmsgW2FjdGl2ZV09XCJtb2RlID09PSAnZGVza3RvcCdcIiAoY2xpY2spPVwidG9nZ2xlTW9kZSgnZGVza3RvcCcpXCI+XG4gICAgICA8bWF0LWxhYmVsPkRlc2t0b3A8L21hdC1sYWJlbD5cbiAgICA8L2E+XG4gIDwvbmF2PlxuXG4gIDxmb3JtICN0YWJQYW5lbCBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cImRvU3VibWl0KCRldmVudClcIj5cblxuICBAc3dpdGNoIChtb2RlKXtcbiAgICBAY2FzZSAoJ21vYmlsZScpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50OyBjb250ZXh0OiB7IG1vYmlsZTogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBjYXNlICgnZGVza3RvcCcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50OyBjb250ZXh0OiB7IG1vYmlsZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgfVxuICA8L2Zvcm0+XG48L2lvbi1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnQgbGV0LW1vYmlsZT1cIm1vYmlsZVwiPlxuICA8aW9uLWdyaWQgIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDwhLS0g4pSA4pSAIExlZnQgY29sdW1uOiBmb3JtICsgZmllbGRzIOKUgOKUgCAtLT5cbiAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIHNpemUtbGc9XCI5XCIgc2l6ZS14bD1cIjhcIj5cbiAgICAgICAgPGlvbi1ncmlkPlxuICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDwhLS0gRW1wdHkgdmFsdWUgLS0+XG4gICAgICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiPkVtcHR5IHZhbHVlPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmVtcHR5LnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJlbXB0eVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDwhLS0gRW1wdHkgdmFsdWUgKyByZXF1aXJlZCAtLT5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+RW1wdHkgdmFsdWUgKHJlcXVpcmVkKTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT57eyBzdHJpbmdpZnkoZm9ybS5jb250cm9scy5lbXB0eVJlcXVpcmVkLnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJlbXB0eVJlcXVpcmVkXCIgW3JlcXVpcmVkXT1cInRydWVcIiAvPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICAgICAgPCEtLSBFbmFibGUgIC0tPlxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiPldpdGggdmFsdWU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMuZW5hYmxlLnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJlbmFibGVcIiBbcmVxdWlyZWRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICAgICAgPCEtLSBEaXNhYmxlIC0tPlxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiPkRpc2FibGU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMuZGlzYWJsZS52YWx1ZSkgfX08L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGlzYWJsZVwiIFtyZXF1aXJlZF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICA8IS0tIFJlYWRvbmx5ICAtLT5cbiAgICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQ+XG4gICAgICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5SZWFkb25seSB0b2dnbGU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMucmVhZG9ubHkudmFsdWUpIH19PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicmVhZG9ubHlGaWVsZC5yZWFkT25seSA9ICRldmVudC5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicmVhZG9ubHlGaWVsZC5yZWFkT25seVwiXG4gICAgICAgICAgICAgICAgICA+UmVhZG9ubHkgPzwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCAjcmVhZG9ubHlGaWVsZCBmb3JtQ29udHJvbE5hbWU9XCJyZWFkb25seVwiIFtyZWFkT25seV09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICA8IS0tIE1hdFNlbGVjdCAgLS0+XG4gICAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+TWF0U2VsZWN0PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLnJlYWRvbmx5LnZhbHVlKSB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlNlbGVjdDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZm9ybSB8IGZvcm1HZXRDb250cm9sOiAnc2VsZWN0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGEgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKGZvcm0gfCBmb3JtR2V0VmFsdWU6ICdzZWxlY3QnIHwgcHJvcGVydHlHZXQ6ICdsYWJlbCcgfCB0cmFuc2xhdGUpIHx8ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzdGF0dXNMaXN0OyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPnt7IGl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cblxuICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPC9pb24tcm93PlxuXG4gICAgICAgICAgPCEtLSBjdXN0b20gZmllbGRzICAtLT5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIDwhLS0gQXV0b21jb21wbGV0ZSAoc3VnZ2VzdCkgLS0+XG4gICAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+PGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5NYXRBdXRvY29tcGxldGVGaWVsZDwvaW9uLWxhYmVsPjwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMuYXV0b2NvbXBsZXRlLnZhbHVlKSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZCAjYXV0b2NvbXBsZXRlRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9iaWxlXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJhcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0FsbE9uRm9jdXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImF1dG9jb21wbGV0ZVN1Z2dlc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkF1dG9jb21wbGV0ZVwiID48L21hdC1hdXRvY29tcGxldGUtZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICA8IS0tIE1hdEJvb2xlYW4gLS0+XG4gICAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+PGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5NYXRCb29sZWFuRmllbGQ8L2lvbi1sYWJlbD48L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmJvb2xlYW4udmFsdWUpIH19PC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtYm9vbGVhbi1maWVsZCAjYm9vbGVhbkZpZWxkIGZvcm1Db250cm9sTmFtZT1cImJvb2xlYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJtb2JpbGUgPyAnYnV0dG9uJyA6ICdyYWRpbydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQm9vbGVhblwiPjwvbWF0LWJvb2xlYW4tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgPCEtLSBNYXREYXRlIC0tPlxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPjxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+TWF0RGF0ZTwvaW9uLWxhYmVsPjwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+e3sgc3RyaW5naWZ5KGZvcm0uY29udHJvbHMuZGF0ZS52YWx1ZSkgfX08L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlLWZpZWxkICNkYXRlRmllbGQgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZVwiIHBsYWNlaG9sZGVyPVwiRGF0ZVwiIFttb2JpbGVdPVwibW9iaWxlXCI+PC9tYXQtZGF0ZS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICAgIDwhLS0gTWF0RGF0ZVRpbWUgIC0tPlxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPjxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+TWF0RGF0ZVRpbWU8L2lvbi1sYWJlbD48L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmRhdGV0aW1lLnZhbHVlKSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8bWF0LWRhdGUtdGltZS1maWVsZCAjZGF0ZVRpbWVGaWVsZCBmb3JtQ29udHJvbE5hbWU9XCJkYXRldGltZVwiIHBsYWNlaG9sZGVyPVwiRGF0ZS9UaW1lXCIgW21vYmlsZV09XCJtb2JpbGVcIj48L21hdC1kYXRlLXRpbWUtZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+PGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5NYXRMYXRMb25nPC9pb24tbGFiZWw+PC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT57eyBzdHJpbmdpZnkoZm9ybS5jb250cm9scy5sYXRpdHVkZS52YWx1ZSkgfX0sIHt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmxvbmdpdHVkZS52YWx1ZSkgfX08L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYXRsb25nLWZpZWxkICNsYXRpdHVkZUZpZWxkIHR5cGU9XCJsYXRpdHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGF0aXR1ZGVcIiAgcGxhY2Vob2xkZXI9XCJMYXRpdHVkZVwiIFttb2JpbGVdPVwibW9iaWxlXCI+PC9tYXQtbGF0bG9uZy1maWVsZD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGF0bG9uZy1maWVsZCAjbG9uZ2l0dWRlRmllbGQgdHlwZT1cImxvbmdpdHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibG9uZ2l0dWRlXCIgcGxhY2Vob2xkZXI9XCJMb25naXR1ZGVcIiBbbW9iaWxlXT1cIm1vYmlsZVwiPjwvbWF0LWxhdGxvbmctZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgIDxpb24tY2FyZD5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPjxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+TWF0RHVyYXRpb248L2lvbi1sYWJlbD48L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPnt7IHN0cmluZ2lmeShmb3JtLmNvbnRyb2xzLmR1cmF0aW9uLnZhbHVlKSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8bWF0LWR1cmF0aW9uLWZpZWxkICNkdXJhdGlvbkZpZWxkIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9uXCIgcGxhY2Vob2xkZXI9XCJEdXJhdGlvblwiPjwvbWF0LWR1cmF0aW9uLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICA8L2lvbi1jb2w+XG5cbiAgICAgIDwhLS0g4pSA4pSAIFJpZ2h0IGNvbHVtbjogY29udHJvbCBwYW5lbCDilIDilIAgLS0+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLWxnPVwiM1wiIHNpemUteGw9XCI0XCI+XG4gICAgICAgIDxpb24tY2FyZCBjb2xvcj1cImxpZ2h0XCIgc3R5bGU9XCJwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDhweFwiPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+Q29udHJvbCBwYW5lbDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPjxzbWFsbD5Db250cm9sIGEgZmllbGQgdXNpbmcgdGhlIHRva2VuIElOUFVUX0ZJRUxEX0FDQ0VTU09SPC9zbWFsbD48L2lvbi10ZXh0PlxuICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYWx3YXlzXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UYXJnZXQgZmllbGQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgaGlkZGVuIC8+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3RBY2Nlc3NvckZpZWxkQnlJZCgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRBY2Nlc3NvckZpZWxkLmlkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgYWNjZXNzb3JGaWVsZE9wdGlvbnM7IHRyYWNrIGl0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtLmlkXCI+e3sgaXRlbS5sYWJlbCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImRvQWNjZXNzb3JGb2N1cygpXCI+Rm9jdXM8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJkb0FjY2Vzc29yQ2xlYXIoKVwiPkNsZWFyPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9pb24taXRlbT5cblxuICAgICAgICAgICAgPGlvbi1pdGVtPlxuICAgICAgICAgICAgICA8aW9uLWlucHV0IFsobmdNb2RlbCldPVwiYWNjZXNzb3JXcml0ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJkb0FjY2Vzc29yV3JpdGVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIm51bGxcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlZhbHVlPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLWlucHV0PlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBzbG90PVwiZW5kXCIgKGNsaWNrKT1cImRvQWNjZXNzb3JXcml0ZVZhbHVlKClcIj53cml0ZTwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG5cbiAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRBY2Nlc3NvckZpZWxkLmhhc1R5cGVUZXh0KSB7XG4gICAgICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgICAgICA8aW9uLWlucHV0IFsobmdNb2RlbCldPVwiYWNjZXNzb3JUeXBlVGV4dFwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZG9BY2Nlc3NvclR5cGVUZXh0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+VGV4dDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIDwvaW9uLWlucHV0PlxuICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIHNsb3Q9XCJlbmRcIiAoY2xpY2spPVwiZG9BY2Nlc3NvclR5cGVUZXh0KCRldmVudClcIj5zZW5kPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgPGlvbi1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2hlY2tib3ggWyhuZ01vZGVsKV09XCJhY2Nlc3NvclR5cGVUZXh0TGV0dGVyQnlMZXR0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5TZW5kIGxldHRlciBieSBMZXR0ZXIgPzwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC9pb24taW5wdXQ+XG4gICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPlxuICAgICAgICAgICAgICA8c21hbGw+PGNvZGU+e3sgYWNjZXNzb3JMYXN0QWN0aW9uIHx8ICcnIH19PC9jb2RlPjwvc21hbGw+XG4gICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG48L25nLXRlbXBsYXRlPlxuIl19
|