@sumaris-net/ngx-components 2.12.26-alpha2 → 2.12.26
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 +6 -0
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +11 -8
- package/esm2022/src/app/admin/users/users.mjs +11 -5
- package/esm2022/src/app/core/account/account.page.mjs +12 -5
- package/esm2022/src/app/core/account/new-token.modal.mjs +15 -8
- package/esm2022/src/app/core/account/password/change-password.form.mjs +10 -5
- package/esm2022/src/app/core/account/password/change-password.page.mjs +9 -4
- package/esm2022/src/app/core/account/token.table.mjs +12 -5
- package/esm2022/src/app/core/auth/auth.form.mjs +11 -5
- package/esm2022/src/app/core/auth/auth.modal.mjs +17 -14
- package/esm2022/src/app/core/auth/reset-password.modal.mjs +20 -16
- package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +13 -5
- package/esm2022/src/app/core/form/entity/editor.class.mjs +20 -14
- package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +21 -10
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +24 -11
- package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +21 -5
- package/esm2022/src/app/core/form/form-container.class.mjs +5 -4
- package/esm2022/src/app/core/form/form.class.mjs +13 -13
- package/esm2022/src/app/core/form/list/list.form.mjs +20 -10
- package/esm2022/src/app/core/form/properties/properties.form.mjs +26 -17
- package/esm2022/src/app/core/form/properties/properties.table.mjs +14 -10
- package/esm2022/src/app/core/form/properties/property.validator.mjs +8 -5
- package/esm2022/src/app/core/form/username/username.form.mjs +10 -5
- package/esm2022/src/app/core/home/home.mjs +63 -40
- package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +34 -21
- package/esm2022/src/app/core/menu/menu.component.mjs +53 -33
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +15 -13
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +15 -13
- package/esm2022/src/app/core/peer/select-peer.modal.mjs +40 -26
- package/esm2022/src/app/core/services/testing/referential.validator.mjs +8 -5
- package/esm2022/src/app/core/services/validator/account.validator.mjs +18 -8
- package/esm2022/src/app/core/services/validator/base.validator.class.mjs +11 -9
- package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +10 -8
- package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +6 -5
- package/esm2022/src/app/core/services/validator/user-token.validator.mjs +6 -5
- package/esm2022/src/app/core/settings/settings.page.mjs +35 -25
- package/esm2022/src/app/core/table/async-table.class.mjs +32 -16
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +9 -8
- package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +9 -8
- package/esm2022/src/app/core/table/column/row-field.component.mjs +11 -6
- package/esm2022/src/app/core/table/memory-table.class.mjs +4 -4
- package/esm2022/src/app/core/table/table.class.mjs +40 -27
- package/esm2022/src/app/core/table/table.pipes.mjs +21 -15
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +8 -5
- package/esm2022/src/app/core/table/testing/table.testing.mjs +11 -6
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +8 -5
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +13 -9
- package/esm2022/src/app/shared/form/field.component.mjs +16 -14
- package/esm2022/src/app/shared/help/help.modal.mjs +25 -20
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +40 -31
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +18 -14
- package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +14 -13
- package/esm2022/src/app/shared/material/badge/badge.test.mjs +8 -6
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +21 -14
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +12 -5
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +23 -18
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +41 -33
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +42 -36
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +41 -33
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +13 -11
- package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +14 -12
- package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +14 -12
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +29 -18
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +14 -12
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +32 -25
- package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +20 -15
- package/esm2022/src/app/shared/material/testing/common.test.mjs +14 -12
- package/esm2022/src/app/shared/material/text/text-form.component.mjs +12 -5
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +13 -6
- package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +12 -13
- package/esm2022/src/app/shared/pipes/form.pipes.mjs +26 -18
- package/esm2022/src/app/shared/pipes/selection.pipes.mjs +35 -33
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +53 -28
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +30 -20
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +16 -14
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +20 -18
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +26 -18
- package/esm2022/src/app/social/message/message.form.mjs +10 -5
- package/esm2022/src/app/social/message/message.modal.mjs +19 -16
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +27 -18
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +40 -23
- package/fesm2022/sumaris-net.ngx-components.mjs +1250 -756
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/admin/services/validator/person.validator.d.ts +3 -2
- package/src/app/admin/users/users.d.ts +4 -2
- package/src/app/core/account/account.page.d.ts +4 -2
- package/src/app/core/account/new-token.modal.d.ts +3 -2
- package/src/app/core/account/password/change-password.form.d.ts +4 -2
- package/src/app/core/account/password/change-password.page.d.ts +4 -2
- package/src/app/core/account/token.table.d.ts +6 -3
- package/src/app/core/auth/auth.form.d.ts +5 -3
- package/src/app/core/auth/auth.modal.d.ts +7 -5
- package/src/app/core/auth/reset-password.modal.d.ts +6 -6
- package/src/app/core/form/array/testing/form-array.test.d.ts +5 -2
- package/src/app/core/form/entity/editor.class.d.ts +7 -7
- package/src/app/core/form/entity/entity-editor-modal.class.d.ts +5 -3
- package/src/app/core/form/entity/entity-editor.class.d.ts +7 -4
- package/src/app/core/form/entity/tab-editor.class.d.ts +11 -2
- package/src/app/core/form/form-container.class.d.ts +1 -2
- package/src/app/core/form/form.class.d.ts +3 -5
- package/src/app/core/form/list/list.form.d.ts +8 -3
- package/src/app/core/form/properties/properties.form.d.ts +7 -3
- package/src/app/core/form/properties/properties.table.d.ts +5 -3
- package/src/app/core/form/properties/property.validator.d.ts +3 -1
- package/src/app/core/form/username/username.form.d.ts +5 -3
- package/src/app/core/home/home.d.ts +22 -16
- package/src/app/core/install/install-upgrade-card.component.d.ts +15 -10
- package/src/app/core/menu/menu.component.d.ts +17 -13
- package/src/app/core/menu/testing/menu-other.testing.d.ts +5 -1
- package/src/app/core/menu/testing/menu.testing.d.ts +5 -1
- package/src/app/core/peer/select-peer.modal.d.ts +15 -10
- package/src/app/core/services/testing/referential.validator.d.ts +3 -2
- package/src/app/core/services/validator/account.validator.d.ts +8 -2
- package/src/app/core/services/validator/base.validator.class.d.ts +3 -3
- package/src/app/core/services/validator/local-settings.validator.d.ts +4 -3
- package/src/app/core/services/validator/user-settings.validator.d.ts +2 -2
- package/src/app/core/services/validator/user-token.validator.d.ts +2 -2
- package/src/app/core/settings/settings.page.d.ts +9 -3
- package/src/app/core/table/async-table.class.d.ts +14 -14
- package/src/app/core/table/column/actions-column.component.d.ts +3 -3
- package/src/app/core/table/column/nav-actions-column.component.d.ts +4 -4
- package/src/app/core/table/column/row-field.component.d.ts +2 -2
- package/src/app/core/table/memory-table.class.d.ts +2 -2
- package/src/app/core/table/table.class.d.ts +14 -15
- package/src/app/core/table/table.pipes.d.ts +5 -4
- package/src/app/core/table/testing/table-validator.service.d.ts +3 -2
- package/src/app/core/table/testing/table.testing.d.ts +4 -2
- package/src/app/core/table/testing/table2-validator.service.d.ts +3 -1
- package/src/app/core/table/testing/table2.testing.d.ts +4 -2
- package/src/app/shared/form/field.component.d.ts +5 -5
- package/src/app/shared/help/help.modal.d.ts +8 -7
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +8 -8
- package/src/app/shared/inputs.d.ts +1 -1
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +7 -6
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +4 -4
- package/src/app/shared/material/badge/badge.test.d.ts +3 -2
- package/src/app/shared/material/boolean/material.boolean.d.ts +6 -5
- package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +5 -2
- package/src/app/shared/material/chips/material.chips.d.ts +5 -5
- package/src/app/shared/material/datetime/material.date.d.ts +11 -10
- package/src/app/shared/material/datetime/material.dateshort.d.ts +11 -10
- package/src/app/shared/material/datetime/material.datetime.d.ts +11 -10
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +4 -4
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +3 -3
- package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +3 -3
- package/src/app/shared/material/duration/material.duration.d.ts +12 -6
- package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +3 -3
- package/src/app/shared/material/latlong/material.latlong.d.ts +9 -9
- package/src/app/shared/material/swipe/material.swipe.d.ts +5 -5
- package/src/app/shared/material/testing/common.test.d.ts +4 -4
- package/src/app/shared/material/text/text-form.component.d.ts +6 -3
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +5 -2
- package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +3 -4
- package/src/app/shared/pipes/form.pipes.d.ts +7 -6
- package/src/app/shared/pipes/selection.pipes.d.ts +10 -10
- package/src/app/shared/storage/storage-explorer.component.d.ts +15 -12
- package/src/app/shared/toolbar/toolbar.d.ts +12 -10
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +4 -4
- package/src/app/shared/upload-file/upload-file.component.d.ts +3 -3
- package/src/app/social/job/progression/job-progression.icon.d.ts +6 -5
- package/src/app/social/message/message.form.d.ts +4 -2
- package/src/app/social/message/message.modal.d.ts +5 -5
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +8 -7
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +9 -8
- package/src/assets/manifest.json +1 -1
- package/src/theme/_ngx-components.table.scss +1 -2
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { booleanAttribute, ChangeDetectionStrategy,
|
|
2
|
-
import {
|
|
3
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
1
|
+
import { booleanAttribute, ChangeDetectionStrategy, Component, forwardRef, Inject, Input, Optional, ViewChild, } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
|
|
4
3
|
import { isMoment } from 'moment';
|
|
5
4
|
import { SharedValidators } from '../../validator/validators';
|
|
6
5
|
import { isBlankString, isNil, isNotNil, isNotNilBoolean, nullIfNilOrBlank } from '../../functions';
|
|
@@ -11,26 +10,26 @@ import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
|
|
|
11
10
|
import { isFocusableElement } from '../../focusable';
|
|
12
11
|
import { DateUtils, fromDateISOString, toDateISOString } from '../../dates';
|
|
13
12
|
import { isMobile } from '../../platforms';
|
|
14
|
-
import { MomentDateAdapter } from '@angular/material-moment-adapter';
|
|
15
13
|
import { maskitoDateOptionsGenerator, maskitoWithPlaceholder } from '@maskito/kit';
|
|
16
14
|
import { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';
|
|
17
15
|
import { setTimeout } from '@rx-angular/cdk/zone-less/browser';
|
|
18
16
|
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@angular/
|
|
20
|
-
import * as i2 from "@
|
|
17
|
+
import * as i1 from "@angular/material-moment-adapter";
|
|
18
|
+
import * as i2 from "@ngx-translate/core";
|
|
21
19
|
import * as i3 from "@angular/forms";
|
|
22
|
-
import * as i4 from "@angular/
|
|
23
|
-
import * as i5 from "@angular
|
|
24
|
-
import * as i6 from "@angular/material/
|
|
25
|
-
import * as i7 from "@angular/material/
|
|
26
|
-
import * as i8 from "@angular/material/
|
|
27
|
-
import * as i9 from "@
|
|
28
|
-
import * as i10 from "@
|
|
29
|
-
import * as i11 from "
|
|
30
|
-
import * as i12 from "../../
|
|
31
|
-
import * as i13 from "../../pipes/
|
|
32
|
-
import * as i14 from "../../pipes/
|
|
33
|
-
import * as i15 from "../../pipes/
|
|
20
|
+
import * as i4 from "@angular/common";
|
|
21
|
+
import * as i5 from "@ionic/angular";
|
|
22
|
+
import * as i6 from "@angular/material/form-field";
|
|
23
|
+
import * as i7 from "@angular/material/input";
|
|
24
|
+
import * as i8 from "@angular/material/icon";
|
|
25
|
+
import * as i9 from "@angular/material/button";
|
|
26
|
+
import * as i10 from "@angular/material/datepicker";
|
|
27
|
+
import * as i11 from "@maskito/angular";
|
|
28
|
+
import * as i12 from "../../directives/autofocus.directive";
|
|
29
|
+
import * as i13 from "../../pipes/date-format.pipe";
|
|
30
|
+
import * as i14 from "../../pipes/arrays.pipe";
|
|
31
|
+
import * as i15 from "../../pipes/maps.pipe";
|
|
32
|
+
import * as i16 from "../../pipes/types.pipes";
|
|
34
33
|
const DEFAULT_VALUE_ACCESSOR = {
|
|
35
34
|
provide: NG_VALUE_ACCESSOR,
|
|
36
35
|
useExisting: forwardRef(() => MatDate),
|
|
@@ -39,6 +38,11 @@ const DEFAULT_VALUE_ACCESSOR = {
|
|
|
39
38
|
const I18N_KEYS = ['COMMON.DATE_PATTERN', 'COMMON.DATE_PLACEHOLDER'];
|
|
40
39
|
const noop = () => { };
|
|
41
40
|
export class MatDate {
|
|
41
|
+
dateAdapter;
|
|
42
|
+
translate;
|
|
43
|
+
formBuilder;
|
|
44
|
+
cd;
|
|
45
|
+
formGroupDir;
|
|
42
46
|
_onChangeCallback = noop;
|
|
43
47
|
_onTouchedCallback = noop;
|
|
44
48
|
_subscription = new Subscription();
|
|
@@ -104,16 +108,15 @@ export class MatDate {
|
|
|
104
108
|
}
|
|
105
109
|
datePicker;
|
|
106
110
|
_matInput;
|
|
107
|
-
cd
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
this.
|
|
115
|
-
this.
|
|
116
|
-
this._defaultAppearance = this.defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;
|
|
111
|
+
constructor(dateAdapter, translate, formBuilder, cd, formGroupDir, defaultOptions) {
|
|
112
|
+
this.dateAdapter = dateAdapter;
|
|
113
|
+
this.translate = translate;
|
|
114
|
+
this.formBuilder = formBuilder;
|
|
115
|
+
this.cd = cd;
|
|
116
|
+
this.formGroupDir = formGroupDir;
|
|
117
|
+
this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);
|
|
118
|
+
this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;
|
|
119
|
+
this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;
|
|
117
120
|
}
|
|
118
121
|
ngOnInit() {
|
|
119
122
|
this.formControl =
|
|
@@ -146,7 +149,7 @@ export class MatDate {
|
|
|
146
149
|
this._subscription.add(this.textControl.valueChanges.subscribe((value) => this.onFormChange(value)));
|
|
147
150
|
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
148
151
|
this._subscription.add(this.formControl.statusChanges
|
|
149
|
-
.pipe(filter(() => !this.readonly && !this._writing && !this._disabling) // Skip
|
|
152
|
+
.pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
|
|
150
153
|
)
|
|
151
154
|
.subscribe(() => {
|
|
152
155
|
this.textControl.updateValueAndValidity({ emitEvent: false });
|
|
@@ -411,13 +414,18 @@ export class MatDate {
|
|
|
411
414
|
markForCheck() {
|
|
412
415
|
this.cd.markForCheck();
|
|
413
416
|
}
|
|
414
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatDate, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
415
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MatDate, selector: "mat-date-field", inputs: { formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", mobile: ["mobile", "mobile", booleanAttribute], compact: ["compact", "compact", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], required: ["required", "required", booleanAttribute], startDate: "startDate", timezone: "timezone", datePickerFilter: "datePickerFilter", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: "readonly", tabindex: "tabindex" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "_matInput", first: true, predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value | dateFormat: { pattern: datePattern } }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n [appearance]=\"appearance\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Desktop -->\n @if (!mobile) {\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"maskitoOptions\"\n [formControl]=\"textControl\"\n (blur)=\"_onBlur()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n } @else {\n <!-- Mobile -->\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"textControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <div matSuffix>\n <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n\n @if (clearable) {\n <button\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"formControl.disabled || !formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n @switch (errorKey) {\n @case ('required') {\n <span translate>ERROR.FIELD_REQUIRED</span>\n }\n @case ('validDate') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n }\n @case ('dateIsAfter') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n </span>\n }\n @case ('dateIsBefore') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n </span>\n }\n @case ('dateRange') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n }\n @case ('dateMaxDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n }\n @case ('dateMinDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n }\n @case ('msg') {\n <span>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </span>\n }\n }\n </mat-error>\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <mat-datepicker #datePicker [touchUi]=\"mobile\" [disabled]=\"disabled\" [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.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: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i8.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i8.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i9.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i10.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i11.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i12.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i13.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i14.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i15.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
417
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatDate, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
|
|
418
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MatDate, selector: "mat-date-field", inputs: { formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", mobile: ["mobile", "mobile", booleanAttribute], compact: ["compact", "compact", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], required: ["required", "required", booleanAttribute], startDate: "startDate", timezone: "timezone", datePickerFilter: "datePickerFilter", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: "readonly", tabindex: "tabindex" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "_matInput", first: true, predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value | dateFormat: { pattern: datePattern } }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n [appearance]=\"appearance\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Desktop -->\n @if (!mobile) {\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"maskitoOptions\"\n [formControl]=\"textControl\"\n (blur)=\"_onBlur()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n } @else {\n <!-- Mobile -->\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"textControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <div matSuffix>\n <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n\n @if (clearable) {\n <button\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"formControl.disabled || !formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n @switch (errorKey) {\n @case ('required') {\n <span translate>ERROR.FIELD_REQUIRED</span>\n }\n @case ('validDate') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n }\n @case ('dateIsAfter') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n </span>\n }\n @case ('dateIsBefore') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n </span>\n }\n @case ('dateRange') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n }\n @case ('dateMaxDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n }\n @case ('dateMinDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n }\n @case ('msg') {\n <span>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </span>\n }\n }\n </mat-error>\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <mat-datepicker #datePicker [touchUi]=\"mobile\" [disabled]=\"disabled\" [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.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: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i10.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i10.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i13.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i14.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i15.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i16.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
416
419
|
}
|
|
417
420
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatDate, decorators: [{
|
|
418
421
|
type: Component,
|
|
419
422
|
args: [{ selector: 'mat-date-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value | dateFormat: { pattern: datePattern } }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n [appearance]=\"appearance\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Desktop -->\n @if (!mobile) {\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"maskitoOptions\"\n [formControl]=\"textControl\"\n (blur)=\"_onBlur()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n } @else {\n <!-- Mobile -->\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"textControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <div matSuffix>\n <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n\n @if (clearable) {\n <button\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"formControl.disabled || !formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n @switch (errorKey) {\n @case ('required') {\n <span translate>ERROR.FIELD_REQUIRED</span>\n }\n @case ('validDate') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n }\n @case ('dateIsAfter') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n </span>\n }\n @case ('dateIsBefore') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n </span>\n }\n @case ('dateRange') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n }\n @case ('dateMaxDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n }\n @case ('dateMinDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n }\n @case ('msg') {\n <span>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </span>\n }\n }\n </mat-error>\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <mat-datepicker #datePicker [touchUi]=\"mobile\" [disabled]=\"disabled\" [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"] }]
|
|
420
|
-
}], ctorParameters: () => [
|
|
423
|
+
}], ctorParameters: () => [{ type: i1.MomentDateAdapter }, { type: i2.TranslateService }, { type: i3.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.FormGroupDirective, decorators: [{
|
|
424
|
+
type: Optional
|
|
425
|
+
}] }, { type: undefined, decorators: [{
|
|
426
|
+
type: Inject,
|
|
427
|
+
args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]
|
|
428
|
+
}] }], propDecorators: { formControl: [{
|
|
421
429
|
type: Input
|
|
422
430
|
}], formControlName: [{
|
|
423
431
|
type: Input
|
|
@@ -461,4 +469,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
461
469
|
type: ViewChild,
|
|
462
470
|
args: ['matInput']
|
|
463
471
|
}] } });
|
|
464
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2RhdGV0aW1lL21hdGVyaWFsLmRhdGUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFJTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBc0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakosT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQWdCLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSw4QkFBOEIsRUFBMkMsTUFBTSw4QkFBOEIsQ0FBQztBQUV2SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FB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QUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNrQyxNQUFNO3NCQUE3QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLE9BQU87c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxTQUFTO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0YsVUFBVTtzQkFEYixLQUFLO2dCQVVGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBU08sUUFBUTtzQkFBcEIsS0FBSztnQkFTTyxRQUFRO3NCQUFwQixLQUFLO2dCQW1CbUIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNBLFNBQVM7c0JBQS9CLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUHJvdmlkZXIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpc01vbWVudCwgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFNoYXJlZFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3IvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBpc0JsYW5rU3RyaW5nLCBpc05pbCwgaXNOb3ROaWwsIGlzTm90TmlsQm9vbGVhbiwgbnVsbElmTmlsT3JCbGFuayB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQsIHNldFRhYkluZGV4IH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiwgTWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGlzRm9jdXNhYmxlRWxlbWVudCB9IGZyb20gJy4uLy4uL2ZvY3VzYWJsZSc7XG5pbXBvcnQgeyBEYXRlVXRpbHMsIGZyb21EYXRlSVNPU3RyaW5nLCB0b0RhdGVJU09TdHJpbmcgfSBmcm9tICcuLi8uLi9kYXRlcyc7XG5pbXBvcnQgeyBpc01vYmlsZSB9IGZyb20gJy4uLy4uL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IEFwcEZsb2F0TGFiZWxUeXBlIH0gZnJvbSAnLi4vLi4vZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBNYXNraXRvT3B0aW9ucyB9IGZyb20gJ0BtYXNraXRvL2NvcmUnO1xuaW1wb3J0IHsgTWFza2l0b0RhdGVNb2RlLCBtYXNraXRvRGF0ZU9wdGlvbnNHZW5lcmF0b3IsIG1hc2tpdG9XaXRoUGxhY2Vob2xkZXIgfSBmcm9tICdAbWFza2l0by9raXQnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9BUFBFQVJBTkNFLCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX1NVQlNDUklQVF9TSVpJTkcgfSBmcm9tICcuLi9tYXRlcmlhbC5jb25maWcnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ0ByeC1hbmd1bGFyL2Nkay96b25lLWxlc3MvYnJvd3Nlcic7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcbmNvbnN0IEkxOE5fS0VZUyA9IFsnQ09NTU9OLkRBVEVfUEFUVEVSTicsICdDT01NT04uREFURV9QTEFDRUhPTERFUiddO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmRhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmRhdGUuc2NzcyddLFxuICBwcm92aWRlcnM6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElucHV0RWxlbWVudCB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfd3JpdGluZyA9IHRydWU7XG4gIHByaXZhdGUgX2Rpc2FibGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF90YWJpbmRleDogbnVtYmVyO1xuICBwcml2YXRlIF9yZWFkb25seSA9IGZhbHNlO1xuICBwcml2YXRlIF9hcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3N1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRBcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmc7XG5cbiAgcHJvdGVjdGVkIHRleHRDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHByb3RlY3RlZCBkYXRlUGF0dGVybjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbG9jYWxlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtYXNraXRvT3B0aW9uczogTWFza2l0b09wdGlvbnM7XG4gIHByb3RlY3RlZCBkYXRlUGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb21wYWN0ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvZm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHRpbWV6b25lOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKSBkYXRlUGlja2VyRmlsdGVyOiBEYXRlRmlsdGVyRm48TW9tZW50PjtcblxuICBASW5wdXQoKVxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2FwcGVhcmFuY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBhcHBlYXJhbmNlKCk6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2Uge1xuICAgIHJldHVybiB0aGlzLl9hcHBlYXJhbmNlIHx8IHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHN1YnNjcmlwdFNpemluZyh2YWx1ZTogU3Vic2NyaXB0U2l6aW5nKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0U2l6aW5nID0gdmFsdWU7XG4gIH1cblxuICBnZXQgc3Vic2NyaXB0U2l6aW5nKCk6IFN1YnNjcmlwdFNpemluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdFNpemluZyB8fCB0aGlzLl9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0YWJpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3RhYmluZGV4ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFiaW5kZXggPSB2YWx1ZTtcbiAgICAgIGlmICghdGhpcy5fd3JpdGluZykgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcicpIGRhdGVQaWNrZXI6IE1hdERhdGVwaWNrZXI8TW9tZW50PjtcbiAgQFZpZXdDaGlsZCgnbWF0SW5wdXQnKSBfbWF0SW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNkID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtR3JvdXBEaXIgPSBpbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGVBZGFwdGVyID0gaW5qZWN0KE1vbWVudERhdGVBZGFwdGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXIgPSBpbmplY3QoVW50eXBlZEZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0T3B0aW9ucyA9IGluamVjdChNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9jYWxlID0gKHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nKS5zdWJzdHJpbmcoMCwgMik7XG4gICAgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM/LnN1YnNjcmlwdFNpemluZyB8fCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX1NVQlNDUklQVF9TSVpJTkc7XG4gICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSB0aGlzLmRlZmF1bHRPcHRpb25zPy5hcHBlYXJhbmNlIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPVxuICAgICAgdGhpcy5mb3JtQ29udHJvbCB8fCAodGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5mb3JtR3JvdXBEaXIgJiYgKHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wpKTtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSAnZm9ybUNvbnRyb2wnIG9yICdmb3JtQ29udHJvbE5hbWUnIGluIDxtYXQtZGF0ZS1maWVsZD4uXCIpO1xuXG4gICAgdGhpcy5tb2JpbGUgPSBpc05vdE5pbCh0aGlzLm1vYmlsZSkgPyB0aGlzLm1vYmlsZSA6IGlzTW9iaWxlKHdpbmRvdyk7XG4gICAgdGhpcy5yZXF1aXJlZCA9IGlzTm90TmlsQm9vbGVhbih0aGlzLnJlcXVpcmVkKVxuICAgICAgPyB0aGlzLnJlcXVpcmVkXG4gICAgICA6IHRoaXMuZm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpIHx8IGlzQmxhbmtTdHJpbmcodGhpcy5yZXF1aXJlZCk7XG5cbiAgICAvLyBBZGQgJ3ZhbGlkRGF0ZScgdmFsaWRhdG9yICh3aGVuIGV4aXN0aW5nIHZhbGlkYXRvciBhcmUgbnVsbCBvciByZXF1aXJlZCwgdG8gYmUgc3VyZSB0byBrZWVwIGl0KVxuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IgfHwgdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnJlcXVpcmVkID8gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXSA6IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKFxuICAgICAgICB0aGlzLnJlcXVpcmVkXG4gICAgICAgICAgPyBbdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IsIFZhbGlkYXRvcnMucmVxdWlyZWQsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXVxuICAgICAgICAgIDogW3RoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSB0ZXh0IGNvbnRyb2xcbiAgICB0aGlzLnRleHRDb250cm9sID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxuICAgICAgbnVsbCxcbiAgICAgIC8vIEltcG9ydGFudDogc2hvdWxkIGNvcHkgZXJyb3JzIGZyb20gdGhlIG1vZGVsIGZvcm1Db250cm9sXG4gICAgICAoKSA9PiB0aGlzLmZvcm1Db250cm9sLmVycm9yc1xuICAgICk7XG5cbiAgICAvLyBHZXQgcGF0dGVybnMgdG8gZGlzcGxheSBkYXRlXG4gICAgdGhpcy51cGRhdGVUcmFuc2xhdGlvbnModGhpcy50cmFuc2xhdGUuaW5zdGFudChJMThOX0tFWVMpKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy50cmFuc2xhdGVcbiAgICAgICAgLmdldChJMThOX0tFWVMpXG4gICAgICAgIC5waXBlKHNraXAoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHRyYW5zbGF0aW9ucykgPT4gdGhpcy51cGRhdGVUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zKSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnRleHRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLm9uRm9ybUNoYW5nZSh2YWx1ZSkpKTtcblxuICAgIC8vIExpc3RlbiBzdGF0dXMgY2hhbmdlcyAod2hlbiBkb25lIG91dHNpZGUgdGhlIGNvbXBvbmVudCAgLSBlLmcuIHdoZW4gc2V0RXJyb3JzKCkgaXMgY2FsbGluZyBvbiB0aGUgZm9ybUNvbnRyb2wpXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuX3dyaXRpbmcgJiYgIXRoaXMuX2Rpc2FibGluZykgLy8gU2tpcFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGV4dENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAhdGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcFxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJbbWF0LWRhdGVdIHdyaXRlVmFsdWUoKSB3aXRoOlwiLCB2YWx1ZSk7XG5cbiAgICAvLyBDb252ZXJ0IGludG8gZGF0ZVxuICAgIC8vIEltcG9ydGFudDogY2xvbmUsIGJlY2F1c2Ugc3RhcnRPZiB3aWxsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZGF0ZVxuICAgIGNvbnN0IGRhdGUgPSBpc01vbWVudCh2YWx1ZSkgPyB2YWx1ZS5jbG9uZSgpIDogZnJvbURhdGVJU09TdHJpbmcodmFsdWUpO1xuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sobnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1vdmUgdG8gdGhlIGV4cGVjdGVkIFRaIChrZWVwaW5nIGxvY2FsIGhvdXIgLSBlLmcuIG1pZG5pZ2h0KVxuICAgICAgY29uc3QgZGF5ID0gKCh0aGlzLnRpbWV6b25lICYmIGRhdGUudHoodGhpcy50aW1lem9uZSkpIHx8IGRhdGUpXG4gICAgICAgIC8vIFJlc2V0IGhvdXJcbiAgICAgICAgLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgY29uc3QgZGF5U3RyID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQoZGF5LCB0aGlzLmRhdGVQYXR0ZXJuKTtcblxuICAgICAgaWYgKHRoaXMudGV4dENvbnRyb2wudmFsdWUgIT09IGRheVN0cikge1xuICAgICAgICAvLyBVcGRhdGUgdGV4dCBjb250cm9sXG4gICAgICAgIHRoaXMudGV4dENvbnRyb2wucGF0Y2hWYWx1ZShkYXlTdHIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5fZGlzYWJsaW5nID0gdHJ1ZTtcbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvcGVuRGF0ZVBpY2tlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0ZVBpY2tlcikgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmRhdGVQaWNrZXIub3BlbmVkKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGVdIE9wZW5pbmcgZGF0ZSBwaWNrZXIuLi4nKTtcblxuICAgICAgdGhpcy5kYXRlUGlja2VyLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICBpZiAoIXRoaXMuX21hdElucHV0KSByZXR1cm47XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChpc0ZvY3VzYWJsZUVsZW1lbnQodGhpcy5fbWF0SW5wdXQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fbWF0SW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5fcHJldmVudEV2ZW50KGV2ZW50KTtcblxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIHByb3RlY3RlZCBfb25EYXRlUGlja2VyQ2hhbmdlKGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxNb21lbnQ+KTogdm9pZCB7XG4gICAgLy8gTWFrZSBzdXJlIGV2ZW50IGlzIHZhbGlkXG4gICAgaWYgKCFldmVudCB8fCAoZXZlbnQudmFsdWUgIT09IG51bGwgJiYgIWlzTW9tZW50KGV2ZW50LnZhbHVlKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBNYXREYXRlcGlja2VyIGV2ZW50LiBTa2lwcGluZycsIGV2ZW50KTtcbiAgICAgIHJldHVybjsgLy8gU2tpcFxuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnZhbHVlO1xuXG4gICAgLy8gTm8gdmFsdWUsIGJ1dCBtb2JpbGUgbW9kZTogdXNlIHRoZSBjdXJyZW50IGRhdGVcbiAgICBpZiAoIXZhbHVlICYmIHRoaXMubW9iaWxlKSB7XG4gICAgICB2YWx1ZSA9IERhdGVVdGlscy5yZXNldFRpbWUoRGF0ZVV0aWxzLm1vbWVudCgpLmxvY2FsZSh0aGlzLmxvY2FsZSksIHRoaXMudGltZXpvbmUpO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0b0RhdGVJU09TdHJpbmcodmFsdWUpLCB7XG4gICAgICAgIGVtaXRFdmVudDogZmFsc2UsIC8vIFdpbGwgY2FsbCB3cml0ZVZhbHVlKClcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZVxuICAgICAgPy5jbG9uZSgpXG4gICAgICAubG9jYWxlKHRoaXMubG9jYWxlKSAvLyBzZXQgYXMgdGltZSBhcyBsb2NhbGUgdGltZVxuICAgICAgLnN0YXJ0T2YoJ2RheScpIC8vIHJlc2V0IGhvdXJcbiAgICAgIC51dGModHJ1ZSk7XG4gICAgY29uc3QgZGF0ZVN0ciA9IChkYXRlICYmIHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuZGF0ZVBhdHRlcm4pKSB8fCBudWxsO1xuXG4gICAgaWYgKHRoaXMudGV4dENvbnRyb2wudmFsdWUgIT09IGRhdGVTdHIpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJbbWF0LWRhdGVdIG9uRGF0ZVBpY2tlckNoYW5nZSgpIG5ldyB2YWx1ZTpcIiwgZGF0ZVN0cik7XG5cbiAgICAgIHRoaXMudGV4dENvbnRyb2wuc2V0VmFsdWUoZGF0ZVN0ciwge1xuICAgICAgICBlbWl0RXZlbnQ6IHRydWUsIC8vIFdpbGwgY2FsbCBvbkZvcm1DaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZShldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMubW9iaWxlIHx8IGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8IHRoaXMuZGF0ZVBpY2tlcj8ub3BlbmVkIHx8IHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlXSBQcmVwYXJpbmcgdG8gb3BlbiBkYXRlIHBpY2tlci4uLiAnKTtcblxuICAgIHRoaXMuX3ByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICAvLyBPcGVuIHRoZSBwaWNrZXJcbiAgICB0aGlzLm9wZW5EYXRlUGlja2VyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uQmx1cigpIHtcbiAgICBpZiAodGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICAvLyBBdXRvIGZpbGwgZGF0YSBpbiBjYXNlIG9mIHBhcnRpYWwgaW5wdXRcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLmZvcm1Db250cm9sLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0b3VjaGVkXG4gICAgdGhpcy5fY2hlY2tJZlRvdWNoZWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMudGV4dENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZXZlbnRFdmVudChldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKCFldmVudCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZHMgLS0gKi9cblxuICBwcml2YXRlIHVwZGF0ZVRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBkYXRlUGF0dGVybiA9IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfUEFUVEVSTiddICE9PSAnQ09NTU9OLkRBVEVfUEFUVEVSTicgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1BBVFRFUk4nXSA6ICdERC9NTS9ZWVlZJztcbiAgICB0aGlzLnVwZGF0ZVBhdHRlcm4oZGF0ZVBhdHRlcm4pO1xuXG4gICAgY29uc3QgZGF0ZVBsYWNlaG9sZGVyID1cbiAgICAgIHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfUExBQ0VIT0xERVInXSAhPT0gJ0NPTU1PTi5EQVRFX1BMQUNFSE9MREVSJ1xuICAgICAgICA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfUExBQ0VIT0xERVInXVxuICAgICAgICA6IHRoaXMuZGF0ZVBhdHRlcm4/LnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy51cGRhdGVNYXNrT3B0aW9ucyhkYXRlUGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRhdGVQYXR0ZXJuICE9PSBwYXR0ZXJuKSB7XG4gICAgICB0aGlzLmRhdGVQYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNYXNrT3B0aW9ucyhkYXRlUGxhY2Vob2xkZXI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRhdGVQbGFjZWhvbGRlciAhPSBkYXRlUGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZGF0ZVBsYWNlaG9sZGVyID0gZGF0ZVBsYWNlaG9sZGVyO1xuXG4gICAgICBjb25zdCBkYXRlT3B0aW9ucyA9IG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICAgIG1vZGU6IHRoaXMuZGF0ZVBhdHRlcm4udG9Mb3dlckNhc2UoKSBhcyBNYXNraXRvRGF0ZU1vZGUsXG4gICAgICAgIHNlcGFyYXRvcjogJy8nLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGx1Z2lucywgLy8gcGx1Z2lucyBrZWVwcyBjYXJldCBpbnNpZGUgYWN0dWFsIHZhbHVlIGFuZCByZW1vdmUgcGxhY2Vob2xkZXIgb24gYmx1clxuICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnNcbiAgICAgICAgLy8gcGFzcyAndHJ1ZScgYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGFkZCBwbHVnaW4gdG8gaGlkZSBwbGFjZWhvbGRlciB3aGVuIGlucHV0IGlzIG5vdCBmb2N1c2VkXG4gICAgICB9ID0gbWFza2l0b1dpdGhQbGFjZWhvbGRlcih0aGlzLmRhdGVQbGFjZWhvbGRlciwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMubWFza2l0b09wdGlvbnMgPSB7XG4gICAgICAgIC4uLmRhdGVPcHRpb25zLFxuICAgICAgICBwbHVnaW5zOiBwbHVnaW5zLmNvbmNhdChkYXRlT3B0aW9ucy5wbHVnaW5zIHx8IFtdKSxcbiAgICAgICAgcHJlcHJvY2Vzc29yczogW1xuICAgICAgICAgIC8vIEFsd2F5cyBwdXQgaXQgQkVGT1JFIGFsbCBvdGhlciBwcmVwcm9jZXNzb3JzXG4gICAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zLnByZXByb2Nlc3NvcnMsXG4gICAgICAgICAgLi4uZGF0ZU9wdGlvbnMucHJlcHJvY2Vzc29ycyxcbiAgICAgICAgXSxcbiAgICAgICAgcG9zdHByb2Nlc3NvcnM6IFtcbiAgICAgICAgICAuLi5kYXRlT3B0aW9ucy5wb3N0cHJvY2Vzc29ycyxcbiAgICAgICAgICAvLyBBbHdheXMgcHV0IGl0IEFGVEVSIGFsbCBvdGhlciBwb3N0cHJvY2Vzc29yc1xuICAgICAgICAgIC4uLnBsYWNlaG9sZGVyT3B0aW9ucy5wb3N0cHJvY2Vzc29ycyxcbiAgICAgICAgXSxcbiAgICAgIH0gYXMgUmVxdWlyZWQ8TWFza2l0b09wdGlvbnM+O1xuXG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Gb3JtQ2hhbmdlKGRhdGVTdHI6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICBpZiAoZGF0ZVN0ciA9PT0gdGhpcy5kYXRlUGxhY2Vob2xkZXIpIHtcbiAgICAgIGRhdGVTdHIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlU3RyID0gbnVsbElmTmlsT3JCbGFuayhkYXRlU3RyKTtcbiAgICB9XG5cbiAgICAvL2NvbnNvbGUuZGVidWcoYFttYXQtZGF0ZV0gb25Gb3JtQ2hhbmdlKCkgLSBjb250cm9scyB2YWx1ZXM6IGAsIGRhdGVTdHIpO1xuXG4gICAgLy8gRm9yY2UgJzAnIGZvciBlbXB0eSBtb250aCAob3RoZXJ3aXNlIG1vbWVudCB3aWxsIHVzZSB0aGUgY3VycmVudCBtb250aClcbiAgICBkYXRlU3RyID0gZGF0ZVN0clxuICAgICAgPy5yZXBsYWNlKC9bXlxcZC9dL2csICcnKSAvLyBLZWVwIG9ubHkgIGRpZ2l0cyBhbmQgc2xhc2hlc1xuICAgICAgLnJlcGxhY2UoJy8vJywgJy8wLycpXG4gICAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IHllYXIgKG90aGVyd2lzZSBtb21lbnQgd2lsbCB1c2UgdGhlIGN1cnJlbnQgeWVhcilcbiAgICAgIC5yZXBsYWNlKC9cXC8kLywgJy8wJyk7XG5cbiAgICAvLyBQYXJzZSBkYXRlIChzdHJpY3QgPSBmYWxzZSlcbiAgICBsZXQgZGF0ZTogTW9tZW50ID0gKGRhdGVTdHIgJiYgdGhpcy5kYXRlQWRhcHRlci5wYXJzZShkYXRlU3RyLCB0aGlzLmRhdGVQYXR0ZXJuKSkgfHwgbnVsbDtcblxuICAgIC8vIE1vdmUgdG8gdGhlIGV4cGVjdGVkIFRaLCBhbmQga2VlcCB0aGUgbG9jYWwgaG91ciAoPSBtaWRuaWdodCkgdG8gaGF2ZSBtaWRuaWdodCBhdCBsb2NhbCB0aW1lXG4gICAgaWYgKHRoaXMudGltZXpvbmUpIHtcbiAgICAgIGRhdGUgPSBkYXRlPy50eih0aGlzLnRpbWV6b25lLCB0cnVlKTtcbiAgICB9XG5cbiAgICBkYXRlID0gZGF0ZVxuICAgICAgPy5zdGFydE9mKCdkYXknKSAvLyBSZXNldCBob3VyXG4gICAgICAvLyBDb252ZXJ0IHRvIFVUQyAoYXZvaWQgVFogb2Zmc2V0IGluIGZpbmFsIHN0cmluZyk7XG4gICAgICAudXRjKCk7XG5cbiAgICAvLyBTZXQgbW9kZWwgdmFsdWVcbiAgICB0aGlzLmVtaXRDaGFuZ2UoZGF0ZSwgZGF0ZVN0cik7XG5cbiAgICAvLyBGb3JjZSB0aGUgZGF5IGNvbnRyb2wgdG8gdXBkYXRlIGl0cyB2YWxpZGl0eSAoc2FtZSBlcnJvcnMgYXMgZm9ybUNvbnRyb2wgLSBzZWUgbmdPbkluaXQoKSlcbiAgICB0aGlzLnRleHRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZShkYXRlOiBNb21lbnQsIGRlZmF1bHRWYWx1ZT86IHN0cmluZykge1xuICAgIC8vIENvbnZlcnQgdG8gbW9kZWwgdmFsdWUgKElTTyBkYXRlIHN0cmluZylcbiAgICAvLyBJTVBPUlRBTlQ6IElmIGRhdGUgaXMgaW52YWxpZCwgdGhlbiBrZWVwIHRoZSBpbnZhbGlkIHN0cmluZyB2YWx1ZVxuICAgIC8vIHRvIGFsbG93IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlKCkgdG8gcmFpc2UgYW4gZXJyb3JcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBkYXRlPy5pc1ZhbGlkKCkgPyB0b0RhdGVJU09TdHJpbmcoZGF0ZSkgOiBkZWZhdWx0VmFsdWUgfHwgbnVsbDtcblxuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlICE9PSBjb250cm9sVmFsdWUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2NvbnNvbGUuZGVidWcoJ1ttYXQtZGF0ZV0gRW1pdCBuZXcgdmFsdWU6ICcgKyBjb250cm9sVmFsdWUpO1xuXG4gICAgICAvLyBVcGRhdGUgZm9ybUNvbnRyb2wgdmFsdWUgKHRoaXMgaXMgbmVlZCB0byB1cGRhdGUgZGF0ZVBpY2tlciBhbHNvLCBpbiBkZXNrdG9wIG1vZGUpXG4gICAgICBpZiAoIXRoaXMubW9iaWxlICYmIGRhdGU/LmlzVmFsaWQoKSkge1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKGNvbnRyb2xWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGFuZ2VzIGNvbWVzIGZyb20gaW5zaWRlIGZ1bmN0aW9uOiB1c2UgdGhlIGNhbGxiYWNrXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGNvbnRyb2xWYWx1ZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiSW5kZXgoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX3RhYmluZGV4KSB8fCB0aGlzLl90YWJpbmRleCA9PT0gLTEpIHJldHVybjsgLy8gc2tpcFxuXG4gICAgLy8gRm9jdXMgdG8gaW5wdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFRhYkluZGV4KHRoaXMuX21hdElucHV0LCB0aGlzLl90YWJpbmRleCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNUb3VjaGVkKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy50ZXh0Q29udHJvbC5tYXJrQXNUb3VjaGVkKG9wdHMpO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzRGlydHkob3B0cz86IGFueSkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkob3B0cyk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8IS0tIHJlYWRvbmx5IC0tPlxuQGlmIChyZWFkb25seSkge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICA+XG4gICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICA8aW9uLXRleHQ+e3sgZm9ybUNvbnRyb2wudmFsdWUgfCBkYXRlRm9ybWF0OiB7IHBhdHRlcm46IGRhdGVQYXR0ZXJuIH0gfX08L2lvbi10ZXh0PlxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhpbnRzIC0tPlxuICAgIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJmb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbn0gQGVsc2Uge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgKGZvY3VzKT1cIl9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKCRldmVudClcIlxuICAgIChjbGljayk9XCJfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZSgkZXZlbnQpXCJcbiAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgPlxuICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8IS0tIERlc2t0b3AgLS0+XG4gICAgQGlmICghbW9iaWxlKSB7XG4gICAgICA8aW5wdXRcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgI21hdElucHV0XG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW21hc2tpdG9dPVwibWFza2l0b09wdGlvbnNcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGV4dENvbnRyb2xcIlxuICAgICAgICAoYmx1cik9XCJfb25CbHVyKClcIlxuICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cIm9wZW5EYXRlUGlja2VyKClcIlxuICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIl9wcmV2ZW50RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgIC8+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICBoaWRkZW5cbiAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZVBpY2tlclwiXG4gICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImRhdGVQaWNrZXJGaWx0ZXJcIlxuICAgICAgICAoZGF0ZUNoYW5nZSk9XCJfb25EYXRlUGlja2VyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICByZWFkb25seVxuICAgICAgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gTW9iaWxlIC0tPlxuICAgICAgPGlucHV0XG4gICAgICAgICNtYXRJbnB1dFxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2wgbWRjLXRleHQtZmllbGRfX2lucHV0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInRleHRDb250cm9sXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgcmVhZG9ubHlcbiAgICAgIC8+XG4gICAgICA8aW5wdXRcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICBoaWRkZW5cbiAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZVBpY2tlclwiXG4gICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImRhdGVQaWNrZXJGaWx0ZXJcIlxuICAgICAgICAoZGF0ZUNoYW5nZSk9XCJfb25EYXRlUGlja2VyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICByZWFkb25seVxuICAgICAgLz5cbiAgICB9XG5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgKGNsaWNrKT1cIm9wZW5EYXRlUGlja2VyKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPG1hdC1pY29uPnt7IG1vYmlsZSA/ICdkYXRlX3JhbmdlJyA6ICdrZXlib2FyZF9hcnJvd19kb3duJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgQGlmIChjbGVhcmFibGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgICBbaGlkZGVuXT1cImZvcm1Db250cm9sLmRpc2FibGVkIHx8ICFmb3JtQ29udHJvbC52YWx1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGVycm9ycyAtLT5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5lcnJvcnMgfCBtYXBLZXlzIHwgYXJyYXlGaXJzdDsgbGV0IGVycm9yS2V5XCI+XG4gICAgICBAc3dpdGNoIChlcnJvcktleSkge1xuICAgICAgICBAY2FzZSAoJ3JlcXVpcmVkJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3ZhbGlkRGF0ZScpIHtcbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEU8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdkYXRlSXNBZnRlcicpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9BRlRFUicgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9ycy5kYXRlSXNBZnRlciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVJc0JlZm9yZScpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9CRUZPUkUnIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMuZGF0ZUlzQmVmb3JlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9SQU5HRTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVNYXhEdXJhdGlvbicpIHtcbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUFYX0RVUkFUSU9OPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZU1pbkR1cmF0aW9uJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NSU5fRFVSQVRJT048L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtc2cnKSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7eyBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5rZXkgfHwgZm9ybUNvbnRyb2wuZXJyb3JzLm1zZyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLm1zZz8ucGFyYW1zIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIGhpbnRzIC0tPlxuICAgIEBpZiAoIWZvcm1Db250cm9sLmludmFsaWQpIHtcbiAgICAgIDxtYXQtaGludD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtaGludD5cbiAgICB9XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1kYXRlcGlja2VyICNkYXRlUGlja2VyIFt0b3VjaFVpXT1cIm1vYmlsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtzdGFydEF0XT1cInN0YXJ0RGF0ZVwiPlxuICAgIDwhLS0gRGF0ZSBwaWNrZXIgYnV0dG9ucyAtLT5cbiAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgPG1hdC1kYXRlcGlja2VyLWFjdGlvbnM+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIG1hdERhdGVwaWNrZXJDYW5jZWw+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInRlcnRpYXJ5XCIgbWF0RGF0ZXBpY2tlckFwcGx5PlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fVkFMSURBVEU8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9tYXQtZGF0ZXBpY2tlci1hY3Rpb25zPlxuICAgIH1cbiAgPC9tYXQtZGF0ZXBpY2tlcj5cbn1cblxuPG5nLXRlbXBsYXRlICNtYXRQcmVmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdFN1ZmZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0RXJyb3JUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yLFttYXRFcnJvcl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEhpbnRUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludDpub3QoW2FsaWduPSdlbmQnXSksW21hdEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFthbGlnbj0nZW5kJ11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
472
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2RhdGV0aW1lL21hdGVyaWFsLmRhdGUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFFUixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBMEMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakosT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQWdCLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSw4QkFBOEIsRUFBdUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuSixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1B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Szt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxTQUFTO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRixVQUFVO3NCQURiLEtBQUs7Z0JBVUYsZUFBZTtzQkFEbEIsS0FBSztnQkFTTyxRQUFRO3NCQUFwQixLQUFLO2dCQVNPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBbUJtQixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0EsU0FBUztzQkFBL0IsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUHJvdmlkZXIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpc01vbWVudCwgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFNoYXJlZFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3IvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBpc0JsYW5rU3RyaW5nLCBpc05pbCwgaXNOb3ROaWwsIGlzTm90TmlsQm9vbGVhbiwgbnVsbElmTmlsT3JCbGFuayB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQsIHNldFRhYkluZGV4IH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucywgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRm4sIE1hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBpc0ZvY3VzYWJsZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9mb2N1c2FibGUnO1xuaW1wb3J0IHsgRGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgTW9tZW50RGF0ZUFkYXB0ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlcic7XG5pbXBvcnQgeyBBcHBGbG9hdExhYmVsVHlwZSB9IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgTWFza2l0b09wdGlvbnMgfSBmcm9tICdAbWFza2l0by9jb3JlJztcbmltcG9ydCB7IE1hc2tpdG9EYXRlTW9kZSwgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yLCBtYXNraXRvV2l0aFBsYWNlaG9sZGVyIH0gZnJvbSAnQG1hc2tpdG8va2l0JztcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRSwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HIH0gZnJvbSAnLi4vbWF0ZXJpYWwuY29uZmlnJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuXG5jb25zdCBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdERhdGUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5jb25zdCBJMThOX0tFWVMgPSBbJ0NPTU1PTi5EQVRFX1BBVFRFUk4nLCAnQ09NTU9OLkRBVEVfUExBQ0VIT0xERVInXTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZGF0ZS1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC5kYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5kYXRlLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbREVGQVVMVF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNYXREYXRlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJbnB1dEVsZW1lbnQge1xuICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX3dyaXRpbmcgPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdGFiaW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9zdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0QXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuXG4gIHByb3RlY3RlZCB0ZXh0Q29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwcm90ZWN0ZWQgZGF0ZVBhdHRlcm46IHN0cmluZztcbiAgcHJvdGVjdGVkIGxvY2FsZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbWFza2l0b09wdGlvbnM6IE1hc2tpdG9PcHRpb25zO1xuICBwcm90ZWN0ZWQgZGF0ZVBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY29tcGFjdCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhcmFibGUgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkOiBib29sZWFuO1xuICBASW5wdXQoKSBzdGFydERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSB0aW1lem9uZTogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgZGF0ZVBpY2tlckZpbHRlcjogRGF0ZUZpbHRlckZuPE1vbWVudD47XG5cbiAgQElucHV0KClcbiAgc2V0IGFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICB0aGlzLl9hcHBlYXJhbmNlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgYXBwZWFyYW5jZSgpOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwZWFyYW5jZSB8fCB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzdWJzY3JpcHRTaXppbmcodmFsdWU6IFN1YnNjcmlwdFNpemluZykge1xuICAgIHRoaXMuX3N1YnNjcmlwdFNpemluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHN1YnNjcmlwdFNpemluZygpOiBTdWJzY3JpcHRTaXppbmcge1xuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRTaXppbmcgfHwgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl90YWJpbmRleCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgICBpZiAoIXRoaXMuX3dyaXRpbmcpIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC5kaXNhYmxlZDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVQaWNrZXInKSBkYXRlUGlja2VyOiBNYXREYXRlcGlja2VyPE1vbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21hdElucHV0JykgX21hdElucHV0OiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IE1vbWVudERhdGVBZGFwdGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBJbmplY3QoTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TKSBkZWZhdWx0T3B0aW9ucz86IE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zXG4gICkge1xuICAgIHRoaXMubG9jYWxlID0gKHRyYW5zbGF0ZS5jdXJyZW50TGFuZyB8fCB0cmFuc2xhdGUuZGVmYXVsdExhbmcpLnN1YnN0cmluZygwLCAyKTtcbiAgICB0aGlzLl9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nID0gZGVmYXVsdE9wdGlvbnM/LnN1YnNjcmlwdFNpemluZyB8fCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX1NVQlNDUklQVF9TSVpJTkc7XG4gICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSBkZWZhdWx0T3B0aW9ucz8uYXBwZWFyYW5jZSB8fCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0U7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgfHwgKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWRhdGUtZmllbGQ+LlwiKTtcblxuICAgIHRoaXMubW9iaWxlID0gaXNOb3ROaWwodGhpcy5tb2JpbGUpID8gdGhpcy5tb2JpbGUgOiBpc01vYmlsZSh3aW5kb3cpO1xuICAgIHRoaXMucmVxdWlyZWQgPSBpc05vdE5pbEJvb2xlYW4odGhpcy5yZXF1aXJlZClcbiAgICAgID8gdGhpcy5yZXF1aXJlZFxuICAgICAgOiB0aGlzLmZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSB8fCBpc0JsYW5rU3RyaW5nKHRoaXMucmVxdWlyZWQpO1xuXG4gICAgLy8gQWRkICd2YWxpZERhdGUnIHZhbGlkYXRvciAod2hlbiBleGlzdGluZyB2YWxpZGF0b3IgYXJlIG51bGwgb3IgcmVxdWlyZWQsIHRvIGJlIHN1cmUgdG8ga2VlcCBpdClcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yIHx8IHRoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5yZXF1aXJlZCA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV0gOiBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgdGhpcy5yZXF1aXJlZFxuICAgICAgICAgID8gW3RoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV1cbiAgICAgICAgICA6IFt0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgdGV4dCBjb250cm9sXG4gICAgdGhpcy50ZXh0Q29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcbiAgICAgIG51bGwsXG4gICAgICAvLyBJbXBvcnRhbnQ6IHNob3VsZCBjb3B5IGVycm9ycyBmcm9tIHRoZSBtb2RlbCBmb3JtQ29udHJvbFxuICAgICAgKCkgPT4gdGhpcy5mb3JtQ29udHJvbC5lcnJvcnNcbiAgICApO1xuXG4gICAgLy8gR2V0IHBhdHRlcm5zIHRvIGRpc3BsYXkgZGF0ZVxuICAgIHRoaXMudXBkYXRlVHJhbnNsYXRpb25zKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoSTE4Tl9LRVlTKSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMudHJhbnNsYXRlXG4gICAgICAgIC5nZXQoSTE4Tl9LRVlTKVxuICAgICAgICAucGlwZShza2lwKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbnMpID0+IHRoaXMudXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9ucykpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy50ZXh0Q29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5vbkZvcm1DaGFuZ2UodmFsdWUpKSk7XG5cbiAgICAvLyBMaXN0ZW4gc3RhdHVzIGNoYW5nZXMgKHdoZW4gZG9uZSBvdXRzaWRlIHRoZSBjb21wb25lbnQgIC0gZS5nLiB3aGVuIHNldEVycm9ycygpIGlzIGNhbGxpbmcgb24gdGhlIGZvcm1Db250cm9sKVxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiAhdGhpcy5yZWFkb25seSAmJiAhdGhpcy5fd3JpdGluZyAmJiAhdGhpcy5fZGlzYWJsaW5nKSAvLyBTa2lwXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50ZXh0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkICYmICF0aGlzLnRleHRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dENvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZV0gd3JpdGVWYWx1ZSgpIHdpdGg6XCIsIHZhbHVlKTtcblxuICAgIC8vIENvbnZlcnQgaW50byBkYXRlXG4gICAgLy8gSW1wb3J0YW50OiBjbG9uZSwgYmVjYXVzZSBzdGFydE9mIHdpbGwgdXBkYXRlIHRoZSBleGlzdGluZyBkYXRlXG4gICAgY29uc3QgZGF0ZSA9IGlzTW9tZW50KHZhbHVlKSA/IHZhbHVlLmNsb25lKCkgOiBmcm9tRGF0ZUlTT1N0cmluZyh2YWx1ZSk7XG5cbiAgICBpZiAoIWRhdGUgfHwgIWRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLnBhdGNoVmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayhudWxsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW92ZSB0byB0aGUgZXhwZWN0ZWQgVFogKGtlZXBpbmcgbG9jYWwgaG91ciAtIGUuZy4gbWlkbmlnaHQpXG4gICAgICBjb25zdCBkYXkgPSAoKHRoaXMudGltZXpvbmUgJiYgZGF0ZS50eih0aGlzLnRpbWV6b25lKSkgfHwgZGF0ZSlcbiAgICAgICAgLy8gUmVzZXQgaG91clxuICAgICAgICAuc3RhcnRPZignZGF5Jyk7XG4gICAgICBjb25zdCBkYXlTdHIgPSB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdChkYXksIHRoaXMuZGF0ZVBhdHRlcm4pO1xuXG4gICAgICBpZiAodGhpcy50ZXh0Q29udHJvbC52YWx1ZSAhPT0gZGF5U3RyKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0ZXh0IGNvbnRyb2xcbiAgICAgICAgdGhpcy50ZXh0Q29udHJvbC5wYXRjaFZhbHVlKGRheVN0ciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSB0cnVlO1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIHRoaXMuX2Rpc2FibGluZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9wZW5EYXRlUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5kYXRlUGlja2VyKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuZGF0ZVBpY2tlci5vcGVuZWQpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2NvbnNvbGUuZGVidWcoJ1ttYXQtZGF0ZV0gT3BlbmluZyBkYXRlIHBpY2tlci4uLicpO1xuXG4gICAgICB0aGlzLmRhdGVQaWNrZXIub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIGlmICghdGhpcy5fbWF0SW5wdXQpIHJldHVybjtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGlzRm9jdXNhYmxlRWxlbWVudCh0aGlzLl9tYXRJbnB1dC5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLl9tYXRJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhcihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgZnVuY3Rpb25zIC0tICovXG5cbiAgcHJvdGVjdGVkIF9vbkRhdGVQaWNrZXJDaGFuZ2UoZXZlbnQ6IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PE1vbWVudD4pOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgZXZlbnQgaXMgdmFsaWRcbiAgICBpZiAoIWV2ZW50IHx8IChldmVudC52YWx1ZSAhPT0gbnVsbCAmJiAhaXNNb21lbnQoZXZlbnQudmFsdWUpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIE1hdERhdGVwaWNrZXIgZXZlbnQuIFNraXBwaW5nJywgZXZlbnQpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gZXZlbnQudmFsdWU7XG5cbiAgICAvLyBObyB2YWx1ZSwgYnV0IG1vYmlsZSBtb2RlOiB1c2UgdGhlIGN1cnJlbnQgZGF0ZVxuICAgIGlmICghdmFsdWUgJiYgdGhpcy5tb2JpbGUpIHtcbiAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLnJlc2V0VGltZShEYXRlVXRpbHMubW9tZW50KCkubG9jYWxlKHRoaXMubG9jYWxlKSwgdGhpcy50aW1lem9uZSk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRvRGF0ZUlTT1N0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSwgLy8gV2lsbCBjYWxsIHdyaXRlVmFsdWUoKVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IHZhbHVlXG4gICAgICA/LmNsb25lKClcbiAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUpIC8vIHNldCBhcyB0aW1lIGFzIGxvY2FsZSB0aW1lXG4gICAgICAuc3RhcnRPZignZGF5JykgLy8gcmVzZXQgaG91clxuICAgICAgLnV0Yyh0cnVlKTtcbiAgICBjb25zdCBkYXRlU3RyID0gKGRhdGUgJiYgdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQoZGF0ZSwgdGhpcy5kYXRlUGF0dGVybikpIHx8IG51bGw7XG5cbiAgICBpZiAodGhpcy50ZXh0Q29udHJvbC52YWx1ZSAhPT0gZGF0ZVN0cikge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZV0gb25EYXRlUGlja2VyQ2hhbmdlKCkgbmV3IHZhbHVlOlwiLCBkYXRlU3RyKTtcblxuICAgICAgdGhpcy50ZXh0Q29udHJvbC5zZXRWYWx1ZShkYXRlU3RyLCB7XG4gICAgICAgIGVtaXRFdmVudDogdHJ1ZSwgLy8gV2lsbCBjYWxsIG9uRm9ybUNoYW5nZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5kYXRlUGlja2VyPy5vcGVuZWQgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGVdIFByZXBhcmluZyB0byBvcGVuIGRhdGUgcGlja2VyLi4uICcpO1xuXG4gICAgdGhpcy5fcHJldmVudEV2ZW50KGV2ZW50KTtcblxuICAgIC8vIE9wZW4gdGhlIHBpY2tlclxuICAgIHRoaXMub3BlbkRhdGVQaWNrZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25CbHVyKCkge1xuICAgIGlmICh0aGlzLnRleHRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgIC8vIEF1dG8gZmlsbCBkYXRhIGluIGNhc2Ugb2YgcGFydGlhbCBpbnB1dFxuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRvdWNoZWRcbiAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jaGVja0lmVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfcHJldmVudEV2ZW50KGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kcyAtLSAqL1xuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9QQVRURVJOJ10gIT09ICdDT01NT04uREFURV9QQVRURVJOJyA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfUEFUVEVSTiddIDogJ0REL01NL1lZWVknO1xuICAgIHRoaXMudXBkYXRlUGF0dGVybihkYXRlUGF0dGVybik7XG5cbiAgICBjb25zdCBkYXRlUGxhY2Vob2xkZXIgPVxuICAgICAgdHJhbnNsYXRpb25zWydDT01NT04uREFURV9QTEFDRUhPTERFUiddICE9PSAnQ09NTU9OLkRBVEVfUExBQ0VIT0xERVInXG4gICAgICAgID8gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9QTEFDRUhPTERFUiddXG4gICAgICAgIDogdGhpcy5kYXRlUGF0dGVybj8udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnVwZGF0ZU1hc2tPcHRpb25zKGRhdGVQbGFjZWhvbGRlcik7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGF0ZVBhdHRlcm4gIT09IHBhdHRlcm4pIHtcbiAgICAgIHRoaXMuZGF0ZVBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hc2tPcHRpb25zKGRhdGVQbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGF0ZVBsYWNlaG9sZGVyICE9IGRhdGVQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5kYXRlUGxhY2Vob2xkZXIgPSBkYXRlUGxhY2Vob2xkZXI7XG5cbiAgICAgIGNvbnN0IGRhdGVPcHRpb25zID0gbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgICAgbW9kZTogdGhpcy5kYXRlUGF0dGVybi50b0xvd2VyQ2FzZSgpIGFzIE1hc2tpdG9EYXRlTW9kZSxcbiAgICAgICAgc2VwYXJhdG9yOiAnLycsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbHVnaW5zLCAvLyBwbHVnaW5zIGtlZXBzIGNhcmV0IGluc2lkZSBhY3R1YWwgdmFsdWUgYW5kIHJlbW92ZSBwbGFjZWhvbGRlciBvbiBibHVyXG4gICAgICAgIC4uLnBsYWNlaG9sZGVyT3B0aW9uc1xuICAgICAgICAvLyBwYXNzICd0cnVlJyBhcyBzZWNvbmQgYXJndW1lbnQgdG8gYWRkIHBsdWdpbiB0byBoaWRlIHBsYWNlaG9sZGVyIHdoZW4gaW5wdXQgaXMgbm90IGZvY3VzZWRcbiAgICAgIH0gPSBtYXNraXRvV2l0aFBsYWNlaG9sZGVyKHRoaXMuZGF0ZVBsYWNlaG9sZGVyLCB0cnVlKTtcblxuICAgICAgdGhpcy5tYXNraXRvT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZGF0ZU9wdGlvbnMsXG4gICAgICAgIHBsdWdpbnM6IHBsdWdpbnMuY29uY2F0KGRhdGVPcHRpb25zLnBsdWdpbnMgfHwgW10pLFxuICAgICAgICBwcmVwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBCRUZPUkUgYWxsIG90aGVyIHByZXByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAuLi5kYXRlT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgICBwb3N0cHJvY2Vzc29yczogW1xuICAgICAgICAgIC4uLmRhdGVPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICAgIC8vIEFsd2F5cyBwdXQgaXQgQUZURVIgYWxsIG90aGVyIHBvc3Rwcm9jZXNzb3JzXG4gICAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgfSBhcyBSZXF1aXJlZDxNYXNraXRvT3B0aW9ucz47XG5cbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UoZGF0ZVN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcCBpZiBjYWxsIGJ5IHNlbGZcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcblxuICAgIGlmIChkYXRlU3RyID09PSB0aGlzLmRhdGVQbGFjZWhvbGRlcikge1xuICAgICAgZGF0ZVN0ciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHIgPSBudWxsSWZOaWxPckJsYW5rKGRhdGVTdHIpO1xuICAgIH1cblxuICAgIC8vY29uc29sZS5kZWJ1ZyhgW21hdC1kYXRlXSBvbkZvcm1DaGFuZ2UoKSAtIGNvbnRyb2xzIHZhbHVlczogYCwgZGF0ZVN0cik7XG5cbiAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IG1vbnRoIChvdGhlcndpc2UgbW9tZW50IHdpbGwgdXNlIHRoZSBjdXJyZW50IG1vbnRoKVxuICAgIGRhdGVTdHIgPSBkYXRlU3RyXG4gICAgICA/LnJlcGxhY2UoL1teXFxkL10vZywgJycpIC8vIEtlZXAgb25seSAgZGlnaXRzIGFuZCBzbGFzaGVzXG4gICAgICAucmVwbGFjZSgnLy8nLCAnLzAvJylcbiAgICAgIC8vIEZvcmNlICcwJyBmb3IgZW1wdHkgeWVhciAob3RoZXJ3aXNlIG1vbWVudCB3aWxsIHVzZSB0aGUgY3VycmVudCB5ZWFyKVxuICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnLzAnKTtcblxuICAgIC8vIFBhcnNlIGRhdGUgKHN0cmljdCA9IGZhbHNlKVxuICAgIGxldCBkYXRlOiBNb21lbnQgPSAoZGF0ZVN0ciAmJiB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRhdGVTdHIsIHRoaXMuZGF0ZVBhdHRlcm4pKSB8fCBudWxsO1xuXG4gICAgLy8gTW92ZSB0byB0aGUgZXhwZWN0ZWQgVFosIGFuZCBrZWVwIHRoZSBsb2NhbCBob3VyICg9IG1pZG5pZ2h0KSB0byBoYXZlIG1pZG5pZ2h0IGF0IGxvY2FsIHRpbWVcbiAgICBpZiAodGhpcy50aW1lem9uZSkge1xuICAgICAgZGF0ZSA9IGRhdGU/LnR6KHRoaXMudGltZXpvbmUsIHRydWUpO1xuICAgIH1cblxuICAgIGRhdGUgPSBkYXRlXG4gICAgICA/LnN0YXJ0T2YoJ2RheScpIC8vIFJlc2V0IGhvdXJcbiAgICAgIC8vIENvbnZlcnQgdG8gVVRDIChhdm9pZCBUWiBvZmZzZXQgaW4gZmluYWwgc3RyaW5nKTtcbiAgICAgIC51dGMoKTtcblxuICAgIC8vIFNldCBtb2RlbCB2YWx1ZVxuICAgIHRoaXMuZW1pdENoYW5nZShkYXRlLCBkYXRlU3RyKTtcblxuICAgIC8vIEZvcmNlIHRoZSBkYXkgY29udHJvbCB0byB1cGRhdGUgaXRzIHZhbGlkaXR5IChzYW1lIGVycm9ycyBhcyBmb3JtQ29udHJvbCAtIHNlZSBuZ09uSW5pdCgpKVxuICAgIHRoaXMudGV4dENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKGRhdGU6IE1vbWVudCwgZGVmYXVsdFZhbHVlPzogc3RyaW5nKSB7XG4gICAgLy8gQ29udmVydCB0byBtb2RlbCB2YWx1ZSAoSVNPIGRhdGUgc3RyaW5nKVxuICAgIC8vIElNUE9SVEFOVDogSWYgZGF0ZSBpcyBpbnZhbGlkLCB0aGVuIGtlZXAgdGhlIGludmFsaWQgc3RyaW5nIHZhbHVlXG4gICAgLy8gdG8gYWxsb3cgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGUoKSB0byByYWlzZSBhbiBlcnJvclxuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGRhdGU/LmlzVmFsaWQoKSA/IHRvRGF0ZUlTT1N0cmluZyhkYXRlKSA6IGRlZmF1bHRWYWx1ZSB8fCBudWxsO1xuXG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IGNvbnRyb2xWYWx1ZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlXSBFbWl0IG5ldyB2YWx1ZTogJyArIGNvbnRyb2xWYWx1ZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBmb3JtQ29udHJvbCB2YWx1ZSAodGhpcyBpcyBuZWVkIHRvIHVwZGF0ZSBkYXRlUGlja2VyIGFsc28sIGluIGRlc2t0b3AgbW9kZSlcbiAgICAgIGlmICghdGhpcy5tb2JpbGUgJiYgZGF0ZT8uaXNWYWxpZCgpKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoY29udHJvbFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoYW5nZXMgY29tZXMgZnJvbSBpbnNpZGUgZnVuY3Rpb246IHVzZSB0aGUgY2FsbGJhY2tcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soY29udHJvbFZhbHVlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgY29udHJvbHNcbiAgICAgIHRoaXMuX2NoZWNrSWZUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYWJJbmRleCgpIHtcbiAgICBpZiAoaXNOaWwodGhpcy5fdGFiaW5kZXgpIHx8IHRoaXMuX3RhYmluZGV4ID09PSAtMSkgcmV0dXJuOyAvLyBza2lwXG5cbiAgICAvLyBGb2N1cyB0byBpbnB1dFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc2V0VGFiSW5kZXgodGhpcy5fbWF0SW5wdXQsIHRoaXMuX3RhYmluZGV4KTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtBc1RvdWNoZWQob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLnRleHRDb250cm9sLm1hcmtBc1RvdWNoZWQob3B0cyk7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNEaXJ0eShvcHRzPzogYW55KSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjwhLS0gcmVhZG9ubHkgLS0+XG5AaWYgKHJlYWRvbmx5KSB7XG4gIDxtYXQtZm9ybS1maWVsZFxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZFwiXG4gID5cbiAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gdHlwZT1cInRleHRcIiByZWFkb25seSBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiAvPlxuICAgIDxpb24tdGV4dD57eyBmb3JtQ29udHJvbC52YWx1ZSB8IGRhdGVGb3JtYXQ6IHsgcGF0dGVybjogZGF0ZVBhdHRlcm4gfSB9fTwvaW9uLXRleHQ+XG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gaGludHMgLS0+XG4gICAgPG1hdC1oaW50IFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cImZvcm1Db250cm9sLmludmFsaWRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1oaW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxufSBAZWxzZSB7XG4gIDxtYXQtZm9ybS1maWVsZFxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAoZm9jdXMpPVwiX29wZW5EYXRlUGlja2VySWZNb2JpbGUoJGV2ZW50KVwiXG4gICAgKGNsaWNrKT1cIl9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKCRldmVudClcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICA+XG4gICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuICAgIDwhLS0gRGVza3RvcCAtLT5cbiAgICBAaWYgKCFtb2JpbGUpIHtcbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbWFza2l0b109XCJtYXNraXRvT3B0aW9uc1wiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Q29udHJvbFwiXG4gICAgICAgIChibHVyKT1cIl9vbkJsdXIoKVwiXG4gICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwib3BlbkRhdGVQaWNrZXIoKVwiXG4gICAgICAgIChrZXl1cC5lc2NhcGUpPVwiX3ByZXZlbnRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgW2FwcEF1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgLz5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgIGhpZGRlblxuICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlUGlja2VyXCJcbiAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwiZGF0ZVBpY2tlckZpbHRlclwiXG4gICAgICAgIChkYXRlQ2hhbmdlKT1cIl9vbkRhdGVQaWNrZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPCEtLSBNb2JpbGUgLS0+XG4gICAgICA8aW5wdXRcbiAgICAgICAgI21hdElucHV0XG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbCBtZGMtdGV4dC1maWVsZF9faW5wdXRcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGV4dENvbnRyb2xcIlxuICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICByZWFkb25seVxuICAgICAgLz5cbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgIGhpZGRlblxuICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlUGlja2VyXCJcbiAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwiZGF0ZVBpY2tlckZpbHRlclwiXG4gICAgICAgIChkYXRlQ2hhbmdlKT1cIl9vbkRhdGVQaWNrZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAvPlxuICAgIH1cblxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwib3BlbkRhdGVQaWNrZXIoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8bWF0LWljb24+e3sgbW9iaWxlID8gJ2RhdGVfcmFuZ2UnIDogJ2tleWJvYXJkX2Fycm93X2Rvd24nIH19PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICAgIFtoaWRkZW5dPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgIWZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gZXJyb3JzIC0tPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIGZvcm1Db250cm9sLmVycm9ycyB8IG1hcEtleXMgfCBhcnJheUZpcnN0OyBsZXQgZXJyb3JLZXlcIj5cbiAgICAgIEBzd2l0Y2ggKGVycm9yS2V5KSB7XG4gICAgICAgIEBjYXNlICgncmVxdWlyZWQnKSB7XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndmFsaWREYXRlJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVJc0FmdGVyJykge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAge3sgJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX0FGVEVSJyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0FmdGVyIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZUlzQmVmb3JlJykge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAge3sgJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX0JFRk9SRScgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9ycy5kYXRlSXNCZWZvcmUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdkYXRlUmFuZ2UnKSB7XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX1JBTkdFPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZU1heER1cmF0aW9uJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NQVhfRFVSQVRJT048L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdkYXRlTWluRHVyYXRpb24nKSB7XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX01JTl9EVVJBVElPTjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ21zZycpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7IGZvcm1Db250cm9sLmVycm9ycy5tc2c/LmtleSB8fCBmb3JtQ29udHJvbC5lcnJvcnMubXNnIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5wYXJhbXMgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0RXJyb3JUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gaGludHMgLS0+XG4gICAgQGlmICghZm9ybUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgPG1hdC1oaW50PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC1oaW50PlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVQaWNrZXIgW3RvdWNoVWldPVwibW9iaWxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3N0YXJ0QXRdPVwic3RhcnREYXRlXCI+XG4gICAgPCEtLSBEYXRlIHBpY2tlciBidXR0b25zIC0tPlxuICAgIEBpZiAobW9iaWxlKSB7XG4gICAgICA8bWF0LWRhdGVwaWNrZXItYWN0aW9ucz5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgbWF0RGF0ZXBpY2tlckNhbmNlbD5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIGNvbG9yPVwidGVydGlhcnlcIiBtYXREYXRlcGlja2VyQXBwbHk+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L21hdC1kYXRlcGlja2VyLWFjdGlvbnM+XG4gICAgfVxuICA8L21hdC1kYXRlcGlja2VyPlxufVxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRFcnJvclRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3IsW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0SGludFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSxbbWF0SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|