@c8y/ngx-components 1017.0.511 → 1017.0.514
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/core/bootstrap/cookie-banner/cookie-banner.service.d.ts +1 -1
- package/core/common/ApplicationOptions.d.ts +2 -0
- package/core/product-experience/gainsight.service.d.ts +86 -28
- package/core/product-experience/index.d.ts +1 -0
- package/core/product-experience/product-experience.module.d.ts +18 -5
- package/core/product-experience/user-engagements.service.d.ts +109 -0
- package/core/user/user-edit-modal.component.d.ts +33 -6
- package/core/user/user-edit.component.d.ts +8 -13
- package/esm2020/core/bootstrap/cookie-banner/cookie-banner.service.mjs +2 -2
- package/esm2020/core/common/ApplicationOptions.mjs +1 -1
- package/esm2020/core/product-experience/gainsight.service.mjs +157 -76
- package/esm2020/core/product-experience/index.mjs +2 -1
- package/esm2020/core/product-experience/product-experience.module.mjs +42 -24
- package/esm2020/core/product-experience/user-engagements.service.mjs +174 -0
- package/esm2020/core/range-display/range-display.component.mjs +4 -4
- package/esm2020/core/user/user-edit-modal.component.mjs +68 -33
- package/esm2020/core/user/user-edit.component.mjs +36 -45
- package/fesm2015/c8y-ngx-components.mjs +459 -163
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +450 -157
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +2 -2
- package/package.json +2 -2
|
@@ -4,9 +4,7 @@ import { clone } from 'lodash-es';
|
|
|
4
4
|
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
5
5
|
import { AlertService } from '../alert/alert.service';
|
|
6
6
|
import { AppStateService } from '../common/ui-state.service';
|
|
7
|
-
import { UserPreferencesService } from '../common/user-preferences/user-preferences.service';
|
|
8
7
|
import { TranslateService } from '../i18n/translate.service';
|
|
9
|
-
import { GainsightService } from '../product-experience/gainsight.service';
|
|
10
8
|
import { UserTotpSetupComponent } from './user-totp-setup.component';
|
|
11
9
|
import * as i0 from "@angular/core";
|
|
12
10
|
import * as i1 from "../common/ui-state.service";
|
|
@@ -14,19 +12,17 @@ import * as i2 from "../i18n/translate.service";
|
|
|
14
12
|
import * as i3 from "ngx-bootstrap/modal";
|
|
15
13
|
import * as i4 from "../alert/alert.service";
|
|
16
14
|
import * as i5 from "@c8y/client";
|
|
17
|
-
import * as i6 from "../
|
|
18
|
-
import * as i7 from "../
|
|
19
|
-
import * as i8 from "
|
|
20
|
-
import * as i9 from "../forms/
|
|
21
|
-
import * as i10 from "
|
|
22
|
-
import * as i11 from "../
|
|
23
|
-
import * as i12 from "
|
|
24
|
-
import * as i13 from "../
|
|
25
|
-
import * as i14 from "
|
|
26
|
-
import * as i15 from "../authentication/new-password.component";
|
|
27
|
-
import * as i16 from "../i18n/c8y-translate.pipe";
|
|
15
|
+
import * as i6 from "../forms/phone-validation.directive";
|
|
16
|
+
import * as i7 from "../forms/default-validation.directive";
|
|
17
|
+
import * as i8 from "@angular/forms";
|
|
18
|
+
import * as i9 from "../forms/form-group.component";
|
|
19
|
+
import * as i10 from "../forms/required-input-placeholder.directive";
|
|
20
|
+
import * as i11 from "../i18n/c8y-translate.directive";
|
|
21
|
+
import * as i12 from "@angular/common";
|
|
22
|
+
import * as i13 from "../authentication/new-password.component";
|
|
23
|
+
import * as i14 from "../i18n/c8y-translate.pipe";
|
|
28
24
|
export class UserEditComponent {
|
|
29
|
-
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService
|
|
25
|
+
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
|
|
30
26
|
this.state = state;
|
|
31
27
|
this.translate = translate;
|
|
32
28
|
this.bsModalService = bsModalService;
|
|
@@ -34,17 +30,15 @@ export class UserEditComponent {
|
|
|
34
30
|
this.userService = userService;
|
|
35
31
|
this.tenantLoginOptionsService = tenantLoginOptionsService;
|
|
36
32
|
this.tenantService = tenantService;
|
|
37
|
-
this.userPreferencesService = userPreferencesService;
|
|
38
|
-
this.gainsightService = gainsightService;
|
|
39
33
|
this.loading = false;
|
|
40
|
-
this.
|
|
34
|
+
this.showProductExperienceOptions = false;
|
|
41
35
|
this.isUsageTrackingEnabled = true;
|
|
42
|
-
this.
|
|
36
|
+
this.isUserEngagementPreferenceEnabled = true;
|
|
43
37
|
this.onUser = new EventEmitter();
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
this.onGainsightEngagements = new EventEmitter();
|
|
38
|
+
this.onUsageTrackingChange = new EventEmitter();
|
|
39
|
+
this.onUserEngagementPreferenceChange = new EventEmitter();
|
|
47
40
|
this.onCancel = new EventEmitter();
|
|
41
|
+
this.onLanguage = new EventEmitter();
|
|
48
42
|
this.userHasActiveTotp = false;
|
|
49
43
|
this.userCanSetupTotp = false;
|
|
50
44
|
this.isPhoneRequired = false;
|
|
@@ -68,16 +62,6 @@ export class UserEditComponent {
|
|
|
68
62
|
this.isPhoneRequired = true;
|
|
69
63
|
}
|
|
70
64
|
}
|
|
71
|
-
async onEnablingProductUsageTracking(isUsageTrackingEnabled) {
|
|
72
|
-
if (isUsageTrackingEnabled && this.isGainsightEngagementsEnabled === undefined) {
|
|
73
|
-
this.isGainsightEngagementsEnabled = await this.userPreferencesService
|
|
74
|
-
.get(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY)
|
|
75
|
-
.toPromise();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
get langs() {
|
|
79
|
-
return this.state.state.langs;
|
|
80
|
-
}
|
|
81
65
|
setupTotp() {
|
|
82
66
|
this.bsModalService.show(UserTotpSetupComponent, {
|
|
83
67
|
class: 'modal-sm',
|
|
@@ -93,15 +77,22 @@ export class UserEditComponent {
|
|
|
93
77
|
if (this.loading) {
|
|
94
78
|
return;
|
|
95
79
|
}
|
|
96
|
-
if (this.
|
|
97
|
-
this.
|
|
98
|
-
|
|
80
|
+
if (this.showProductExperienceOptions) {
|
|
81
|
+
this.onUsageTrackingChange.emit(this.isUsageTrackingEnabled);
|
|
82
|
+
/**
|
|
83
|
+
* Emits a user engagement preference change event.
|
|
84
|
+
* If usage tracking is disabled, it emits `false`. Otherwise, it emits the current state of the user engagement preference.
|
|
85
|
+
*/
|
|
86
|
+
this.onUserEngagementPreferenceChange.emit(this.isUsageTrackingEnabled === false ? false : this.isUserEngagementPreferenceEnabled);
|
|
99
87
|
}
|
|
100
88
|
this.onUser.emit(this._user);
|
|
101
89
|
}
|
|
102
90
|
onNewPasswordChanged(newPassword) {
|
|
103
91
|
this._user.password = newPassword.password;
|
|
104
92
|
}
|
|
93
|
+
get langs() {
|
|
94
|
+
return this.state.state.langs;
|
|
95
|
+
}
|
|
105
96
|
async initializeTotpSettings() {
|
|
106
97
|
try {
|
|
107
98
|
this.userCanSetupTotp = await this.canUserSetupTotp();
|
|
@@ -120,32 +111,32 @@ export class UserEditComponent {
|
|
|
120
111
|
return loginOptions.some(({ tfaStrategy = '' }) => tfaStrategy.toLowerCase() === 'totp');
|
|
121
112
|
}
|
|
122
113
|
}
|
|
123
|
-
UserEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, deps: [{ token: i1.AppStateService }, { token: i2.TranslateService }, { token: i3.BsModalService }, { token: i4.AlertService }, { token: i5.UserService }, { token: i5.TenantLoginOptionsService }, { token: i5.TenantService }
|
|
124
|
-
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { lang: "lang", loading: "loading", user: "user", showProductUsageSetting: "showProductUsageSetting", isUsageTrackingEnabled: "isUsageTrackingEnabled", isGainsightEngagementsEnabled: "isGainsightEngagementsEnabled" }, outputs: { onUser: "onUser", onLanguage: "onLanguage", onProductExperience: "onProductExperience", onGainsightEngagements: "onGainsightEngagements", onCancel: "onCancel" }, ngImport: i0, template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (for example, email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductUsageSetting\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n (change)=\"onEnablingProductUsageTracking(isUsageTrackingEnabled)\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable tracking to enhance the product experience' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"gainsightEngagements\">\n <input\n id=\"gainsightEngagements\"\n name=\"gainsightEngagements\"\n type=\"checkbox\"\n [(ngModel)]=\"isGainsightEngagementsEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i8.PhoneValidationDirective, selector: "[c8yPhoneValidation]" }, { kind: "directive", type: i9.DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.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: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i11.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i12.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i13.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i15.NewPasswordComponent, selector: "c8y-new-password", outputs: ["password"] }, { kind: "pipe", type: i16.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i14.AsyncPipe, name: "async" }] });
|
|
114
|
+
UserEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, deps: [{ token: i1.AppStateService }, { token: i2.TranslateService }, { token: i3.BsModalService }, { token: i4.AlertService }, { token: i5.UserService }, { token: i5.TenantLoginOptionsService }, { token: i5.TenantService }], target: i0.ɵɵFactoryTarget.Component });
|
|
115
|
+
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { lang: "lang", loading: "loading", user: "user", showProductExperienceOptions: "showProductExperienceOptions", isUsageTrackingEnabled: "isUsageTrackingEnabled", isUserEngagementPreferenceEnabled: "isUserEngagementPreferenceEnabled" }, outputs: { onUser: "onUser", onUsageTrackingChange: "onUsageTrackingChange", onUserEngagementPreferenceChange: "onUserEngagementPreferenceChange", onCancel: "onCancel", onLanguage: "onLanguage" }, ngImport: i0, template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (for example, email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductExperienceOptions\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable personalized product experience tracking' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"userEngagementPreference\">\n <input\n id=\"userEngagementPreference\"\n name=\"userEngagementPreference\"\n type=\"checkbox\"\n [(ngModel)]=\"isUserEngagementPreferenceEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i6.PhoneValidationDirective, selector: "[c8yPhoneValidation]" }, { kind: "directive", type: i7.DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.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: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i8.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i9.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i10.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i11.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i13.NewPasswordComponent, selector: "c8y-new-password", outputs: ["password"] }, { kind: "pipe", type: i14.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }] });
|
|
125
116
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, decorators: [{
|
|
126
117
|
type: Component,
|
|
127
|
-
args: [{ selector: 'c8y-user-edit', template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (for example, email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n
|
|
128
|
-
}], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.TranslateService }, { type: i3.BsModalService }, { type: i4.AlertService }, { type: i5.UserService }, { type: i5.TenantLoginOptionsService }, { type: i5.TenantService }
|
|
118
|
+
args: [{ selector: 'c8y-user-edit', template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (for example, email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductExperienceOptions\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable personalized product experience tracking' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"userEngagementPreference\">\n <input\n id=\"userEngagementPreference\"\n name=\"userEngagementPreference\"\n type=\"checkbox\"\n [(ngModel)]=\"isUserEngagementPreferenceEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
|
|
119
|
+
}], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.TranslateService }, { type: i3.BsModalService }, { type: i4.AlertService }, { type: i5.UserService }, { type: i5.TenantLoginOptionsService }, { type: i5.TenantService }]; }, propDecorators: { lang: [{
|
|
129
120
|
type: Input
|
|
130
121
|
}], loading: [{
|
|
131
122
|
type: Input
|
|
132
123
|
}], user: [{
|
|
133
124
|
type: Input
|
|
134
|
-
}],
|
|
125
|
+
}], showProductExperienceOptions: [{
|
|
135
126
|
type: Input
|
|
136
127
|
}], isUsageTrackingEnabled: [{
|
|
137
128
|
type: Input
|
|
138
|
-
}],
|
|
129
|
+
}], isUserEngagementPreferenceEnabled: [{
|
|
139
130
|
type: Input
|
|
140
131
|
}], onUser: [{
|
|
141
132
|
type: Output
|
|
142
|
-
}],
|
|
133
|
+
}], onUsageTrackingChange: [{
|
|
143
134
|
type: Output
|
|
144
|
-
}],
|
|
145
|
-
type: Output
|
|
146
|
-
}], onGainsightEngagements: [{
|
|
135
|
+
}], onUserEngagementPreferenceChange: [{
|
|
147
136
|
type: Output
|
|
148
137
|
}], onCancel: [{
|
|
149
138
|
type: Output
|
|
139
|
+
}], onLanguage: [{
|
|
140
|
+
type: Output
|
|
150
141
|
}] } });
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBUyx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlyRSxNQUFNLE9BQU8saUJBQWlCO0lBNkI1QixZQUNTLEtBQXNCLEVBQ3RCLFNBQTJCLEVBQzFCLGNBQThCLEVBQzlCLEtBQW1CLEVBQ25CLFdBQXdCLEVBQ3hCLHlCQUFvRCxFQUNwRCxhQUE0QixFQUM1QixzQkFBOEMsRUFDOUMsZ0JBQWtDO1FBUm5DLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMkI7UUFDcEQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBcENuQyxZQUFPLEdBQVksS0FBSyxDQUFDO1FBV3pCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6QywyQkFBc0IsR0FBWSxJQUFJLENBQUM7UUFDdkMsa0NBQTZCLEdBQVksSUFBSSxDQUFDO1FBQzdDLFdBQU0sR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxlQUFVLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdEQsd0JBQW1CLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEUsMkJBQXNCLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkUsYUFBUSxHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVELHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsb0JBQWUsR0FBRyxLQUFLLENBQUM7SUFnQnJCLENBQUM7SUFwQ0osSUFBYSxJQUFJLENBQUMsQ0FBTztRQUN2QixJQUFJLENBQUMsRUFBRTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUM7WUFDakUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQztTQUNqRjtJQUNILENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQTZCRCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQzVGLGFBQWEsQ0FDZCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxvQkFBb0IsSUFBSSxvQkFBb0IsQ0FBQztRQUVqRSxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsOEJBQThCLENBQUMsc0JBQStCO1FBQ2xFLElBQUksc0JBQXNCLElBQUksSUFBSSxDQUFDLDZCQUE2QixLQUFLLFNBQVMsRUFBRTtZQUM5RSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCO2lCQUNuRSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBDQUEwQyxDQUFDO2lCQUNyRSxTQUFTLEVBQUUsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9DLEtBQUssRUFBRSxVQUFVO1lBQ2pCLGVBQWUsRUFBRSxZQUFZO1lBQzdCLGNBQWMsRUFBRSxhQUFhO1NBQzlCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLG9FQUFvRTtJQUNyRixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUN0RTtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsV0FBd0I7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQjtRQUNsQyxJQUFJO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQzthQUNoRDtTQUNGO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQjtRQUM1QiwwRkFBMEY7UUFDMUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hGLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDM0YsQ0FBQzs7OEdBaEhVLGlCQUFpQjtrR0FBakIsaUJBQWlCLG9jQ3RCOUIsdWlOQXVNQTsyRkRqTGEsaUJBQWlCO2tCQUo3QixTQUFTOytCQUNFLGVBQWU7K1ZBSWhCLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ08sSUFBSTtzQkFBaEIsS0FBSztnQkFVRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJVXNlciwgVGVuYW50TG9naW5PcHRpb25zU2VydmljZSwgVGVuYW50U2VydmljZSwgVXNlclNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBOZXdQYXNzd29yZCB9IGZyb20gJy4uL2F1dGhlbnRpY2F0aW9uL3Bhc3N3b3JkLm1vZGVsJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uL2kxOG4vdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyVG90cFNldHVwQ29tcG9uZW50IH0gZnJvbSAnLi91c2VyLXRvdHAtc2V0dXAuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyIGV4dGVuZHMgSVVzZXIge1xuICBwaG9uZTogc3RyaW5nO1xuICBzZW5kUGFzc3dvcmRSZXNldEVtYWlsOiBib29sZWFuO1xuICBuZXdzbGV0dGVyPzogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXVzZXItZWRpdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWVkaXQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbGFuZzogc3RyaW5nO1xuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNldCB1c2VyKHU6IFVzZXIpIHtcbiAgICBpZiAodSkge1xuICAgICAgdGhpcy5fdXNlciA9IGNsb25lKHUpO1xuICAgICAgdGhpcy51c2VySXNFeHRlcm5hbCA9IHUuY3VzdG9tUHJvcGVydGllcy51c2VyT3JpZ2luID09PSAnT0FVVEgyJztcbiAgICAgIHRoaXMuaXNQaG9uZVJlcXVpcmVkID0gdGhpcy5pc1Bob25lUmVxdWlyZWQgJiYgdS50d29GYWN0b3JBdXRoZW50aWNhdGlvbkVuYWJsZWQ7XG4gICAgfVxuICB9XG4gIGdldCB1c2VyKCkge1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG4gIEBJbnB1dCgpIHNob3dQcm9kdWN0VXNhZ2VTZXR0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzVXNhZ2VUcmFja2luZ0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc0dhaW5zaWdodEVuZ2FnZW1lbnRzRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBPdXRwdXQoKSBvblVzZXI6IEV2ZW50RW1pdHRlcjxVc2VyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTGFuZ3VhZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25Qcm9kdWN0RXhwZXJpZW5jZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25HYWluc2lnaHRFbmdhZ2VtZW50czogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgdXNlckhhc0FjdGl2ZVRvdHAgPSBmYWxzZTtcbiAgdXNlckNhblNldHVwVG90cCA9IGZhbHNlO1xuICBpc1Bob25lUmVxdWlyZWQgPSBmYWxzZTtcbiAgdXNlcklzRXh0ZXJuYWw6IGJvb2xlYW47XG4gIGlzVGZhRW5hYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF91c2VyOiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50TG9naW5PcHRpb25zU2VydmljZTogVGVuYW50TG9naW5PcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFNlcnZpY2U6IFRlbmFudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY3VycmVudFRlbmFudCA9IChhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuY3VycmVudCgpKS5kYXRhO1xuICAgIGNvbnN0IHsgZW5hYmxlZE9uU3lzdGVtTGV2ZWwsIGVuYWJsZWRPblRlbmFudExldmVsIH0gPSBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuZ2V0VGZhU2V0dGluZ3MoXG4gICAgICBjdXJyZW50VGVuYW50XG4gICAgKTtcbiAgICB0aGlzLmlzVGZhRW5hYmxlZCA9IGVuYWJsZWRPblN5c3RlbUxldmVsIHx8IGVuYWJsZWRPblRlbmFudExldmVsO1xuXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplVG90cFNldHRpbmdzKCk7XG4gICAgaWYgKHRoaXMudXNlci50d29GYWN0b3JBdXRoZW50aWNhdGlvbkVuYWJsZWQgJiYgIXRoaXMudXNlckNhblNldHVwVG90cCkge1xuICAgICAgdGhpcy5pc1Bob25lUmVxdWlyZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRW5hYmxpbmdQcm9kdWN0VXNhZ2VUcmFja2luZyhpc1VzYWdlVHJhY2tpbmdFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGlzVXNhZ2VUcmFja2luZ0VuYWJsZWQgJiYgdGhpcy5pc0dhaW5zaWdodEVuZ2FnZW1lbnRzRW5hYmxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzR2FpbnNpZ2h0RW5nYWdlbWVudHNFbmFibGVkID0gYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlXG4gICAgICAgIC5nZXQodGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0VOR0FHRU1FTlRTX0tFWSlcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdGF0ZS5sYW5ncztcbiAgfVxuXG4gIHNldHVwVG90cCgpIHtcbiAgICB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coVXNlclRvdHBTZXR1cENvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnXG4gICAgfSk7XG4gICAgdGhpcy5jYW5jZWwoKTsgLy8gdG8gY2xvc2UgdGhlIHVzZXIgZWRpdCBtb2RhbCBhbmQgcHJldmVudCBjb25zb2xlIGVycm9ycyBvbiBsb2dvdXRcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dQcm9kdWN0VXNhZ2VTZXR0aW5nKSB7XG4gICAgICB0aGlzLm9uUHJvZHVjdEV4cGVyaWVuY2UuZW1pdCh0aGlzLmlzVXNhZ2VUcmFja2luZ0VuYWJsZWQpO1xuICAgICAgdGhpcy5vbkdhaW5zaWdodEVuZ2FnZW1lbnRzLmVtaXQodGhpcy5pc0dhaW5zaWdodEVuZ2FnZW1lbnRzRW5hYmxlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5vblVzZXIuZW1pdCh0aGlzLl91c2VyKTtcbiAgfVxuXG4gIG9uTmV3UGFzc3dvcmRDaGFuZ2VkKG5ld1Bhc3N3b3JkOiBOZXdQYXNzd29yZCkge1xuICAgIHRoaXMuX3VzZXIucGFzc3dvcmQgPSBuZXdQYXNzd29yZC5wYXNzd29yZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVRvdHBTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy51c2VyQ2FuU2V0dXBUb3RwID0gYXdhaXQgdGhpcy5jYW5Vc2VyU2V0dXBUb3RwKCk7XG4gICAgICBpZiAodGhpcy51c2VyQ2FuU2V0dXBUb3RwKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogdG90cEFjdGl2aXR5IH0gPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEFjdGl2aXR5VG90cCgpO1xuICAgICAgICB0aGlzLnVzZXJIYXNBY3RpdmVUb3RwID0gdG90cEFjdGl2aXR5LmlzQWN0aXZlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LnJlbW92ZUxhc3REYW5nZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhblVzZXJTZXR1cFRvdHAoKSB7XG4gICAgLy8gd2UgZG9uJ3QgY2hlY2sgZm9yIHRlbmFudCBvcHRpb25zIGhlcmUgZHVlIHRvIHBlcm1pc3Npb24gcmVzdHJpY3Rpb25zIG9uIHRoYXQgZW5kLXBvaW50XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0gKGF3YWl0IHRoaXMudGVuYW50TG9naW5PcHRpb25zU2VydmljZS5saXN0Rm9yQ3VycmVudFRlbmFudCgpKS5kYXRhO1xuICAgIHJldHVybiBsb2dpbk9wdGlvbnMuc29tZSgoeyB0ZmFTdHJhdGVneSA9ICcnIH0pID0+IHRmYVN0cmF0ZWd5LnRvTG93ZXJDYXNlKCkgPT09ICd0b3RwJyk7XG4gIH1cbn1cbiIsIjxmb3JtICN1c2VyRm9ybT1cIm5nRm9ybVwiIChuZ1N1Ym1pdCk9XCJ1c2VyRm9ybS5mb3JtLnZhbGlkICYmIHNhdmUoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZC1ibG9jayBwLTI0IHAtYi0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIiByb2xlPVwiYWxlcnRcIiAqbmdJZj1cInVzZXJJc0V4dGVybmFsXCIgdHJhbnNsYXRlPlxuICAgICAgU29tZSBvZiB0aGUgdXNlciBzZXR0aW5ncyBhcmUgbm90IGVkaXRhYmxlIGhlcmUgYmVjYXVzZSB0aGV5IGFyZSBtYW5hZ2VkIHZpYSB5b3VyXG4gICAgICBhdXRob3JpemF0aW9uIHNlcnZlci5cbiAgICA8L2Rpdj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJOYW1lXCI+VXNlcm5hbWUgKGZvciBleGFtcGxlLCBlbWFpbCk8L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGlkPVwidXNlck5hbWVcIlxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwidXNlci51c2VyTmFtZVwiXG4gICAgICAgIG5hbWU9XCJ1c2VyTmFtZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHJlcXVpcmVkXG4gICAgICAgIG1heGxlbmd0aD1cIjI1NFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gam9lLmRvZUBleGFtcGxlLmNvbWBMT0NBTElaRWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInVzZXIuaWRcIlxuICAgICAgICBjOHlEZWZhdWx0VmFsaWRhdGlvbj1cInVzZXJcIlxuICAgICAgLz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZSBmb3I9XCJkaXNwbGF5TmFtZVwiPkxvZ2luIGFsaWFzPC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBpZD1cImRpc3BsYXlOYW1lXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIuZGlzcGxheU5hbWVcIlxuICAgICAgICBuYW1lPVwiZGlzcGxheU5hbWVcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIyNTRcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIGpvZS5kb2VgTE9DQUxJWkVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAgIGM4eURlZmF1bHRWYWxpZGF0aW9uPVwibG9naW5BbGlhc1wiXG4gICAgICAvPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgW2hhc1dhcm5pbmddPVwiIXVzZXIuZW1haWxcIj5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGUgZm9yPVwidXNlckVtYWlsXCI+RW1haWw8L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGlkPVwidXNlckVtYWlsXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICBuYW1lPVwiZW1haWxcIlxuICAgICAgICBbbWF4bGVuZ3RoXT1cIjI1NFwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gam9lLmRvZUBleGFtcGxlLmNvbWBMT0NBTElaRWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ1c2VyLmVtYWlsXCJcbiAgICAgICAgZW1haWxcbiAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwidXNlcklzRXh0ZXJuYWxcIlxuICAgICAgLz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJGaXJzdE5hbWVcIj5GaXJzdCBuYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGlkPVwidXNlckZpcnN0TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgbmFtZT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIuZmlyc3ROYW1lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJMYXN0TmFtZVwiPkxhc3QgbmFtZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInVzZXJMYXN0TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgbmFtZT1cImxhc3ROYW1lXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidXNlci5sYXN0TmFtZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlcklzRXh0ZXJuYWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGUgZm9yPVwidXNlclRlbGVwaG9uZVwiPlRlbGVwaG9uZTwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9XCJ1c2VyVGVsZXBob25lXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBuYW1lPVwicGhvbmVcIlxuICAgICAgICBtYXhsZW5ndGg9XCIyNTRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIucGhvbmVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuICs0OSA5IDg3NiA1NDMgMjEwYExPQ0FMSVpFYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjOHlQaG9uZVZhbGlkYXRpb25cbiAgICAgICAgW3JlcXVpcmVkXT1cImlzUGhvbmVSZXF1aXJlZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAvPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJMYW5nXCI+TGFuZ3VhZ2U8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgaWQ9XCJ1c2VyTGFuZ1wiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICNzZWxlY3RMYW5nXG4gICAgICAgICAgbmFtZT1cImxhbmdcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwibGFuZ1wiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkxhbmd1YWdlLmVtaXQoc2VsZWN0TGFuZy52YWx1ZSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5nc1wiIFt2YWx1ZV09XCJsYW5nXCI+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGUuZ2V0TmF0aXZlTGFuZ3VhZ2UobGFuZykgfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLXQtMTYgc2VwYXJhdG9yLXRvcFwiICpuZ0lmPVwic2hvd1Byb2R1Y3RVc2FnZVNldHRpbmdcIj5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGU+UHJvZHVjdCBleHBlcmllbmNlPC9sYWJlbD5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1zd2l0Y2hcIiBmb3I9XCJwcm9kdWN0VXNhZ2VUcmFja2luZ1wiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBpZD1cInByb2R1Y3RVc2FnZVRyYWNraW5nXCJcbiAgICAgICAgICBuYW1lPVwicHJvZHVjdFVzYWdlVHJhY2tpbmdcIlxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkVuYWJsaW5nUHJvZHVjdFVzYWdlVHJhY2tpbmcoaXNVc2FnZVRyYWNraW5nRW5hYmxlZClcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiaXNVc2FnZVRyYWNraW5nRW5hYmxlZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAge3sgJ0VuYWJsZSB0cmFja2luZyB0byBlbmhhbmNlIHRoZSBwcm9kdWN0IGV4cGVyaWVuY2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2xhYmVsPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVXNhZ2VUcmFja2luZ0VuYWJsZWRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXN3aXRjaCBtLWwtMFwiIGZvcj1cImdhaW5zaWdodEVuZ2FnZW1lbnRzXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cImdhaW5zaWdodEVuZ2FnZW1lbnRzXCJcbiAgICAgICAgICAgIG5hbWU9XCJnYWluc2lnaHRFbmdhZ2VtZW50c1wiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpc0dhaW5zaWdodEVuZ2FnZW1lbnRzRW5hYmxlZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAge3sgJ0VuYWJsZSBpbi1wcm9kdWN0IGluZm9ybWF0aW9uICYgY29tbXVuaWNhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwLXQtMTYgc2VwYXJhdG9yLXRvcFwiICpuZ0lmPVwiIXVzZXJJc0V4dGVybmFsXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3sgJ0xvZ2luIG9wdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxjOHktbmV3LXBhc3N3b3JkIChwYXNzd29yZCk9XCJvbk5ld1Bhc3N3b3JkQ2hhbmdlZCgkZXZlbnQpXCI+PC9jOHktbmV3LXBhc3N3b3JkPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0aXRsZT1cInt7ICdTZXQgdXAgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwic2V0dXBUb3RwKClcIlxuICAgICAgICAqbmdJZj1cInVzZXJDYW5TZXR1cFRvdHAgJiYgIXVzZXJIYXNBY3RpdmVUb3RwICYmIGlzVGZhRW5hYmxlZFwiXG4gICAgICA+XG4gICAgICAgIHt7ICdTZXQgdXAgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGM4eS1mb3JtLWdyb3VwICpuZ0lmPVwiISEoc3RhdGUuc3RhdGUkIHwgYXN5bmMpLm5ld3NsZXR0ZXJcIj5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGU+TmV3c2xldHRlcjwvbGFiZWw+XG4gICAgICA8bGFiZWxcbiAgICAgICAgdGl0bGU9XCJ7eyAnU2VuZCBtZSBpbmZvcm1hdGlvbiBhYm91dCBvdXRhZ2VzLCBtYWludGVuYW5jZSBvciB1cGRhdGVzLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgbmFtZT1cIm5ld3NsZXR0ZXJcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwidXNlci5uZXdzbGV0dGVyXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlcklzRXh0ZXJuYWxcIlxuICAgICAgICAvPlxuICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIHt7ICdTZW5kIG1lIGluZm9ybWF0aW9uIGFib3V0IG91dGFnZXMsIG1haW50ZW5hbmNlIG9yIHVwZGF0ZXMuJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2xhYmVsPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIHNlcGFyYXRvci10b3AgYmctbGV2ZWwtMCBzdGlja3ktYm90dG9tXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgPlxuICAgICAge3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIFtkaXNhYmxlZF09XCIhdXNlckZvcm0uZm9ybS52YWxpZCB8fCB1c2VyRm9ybS5mb3JtLnByaXN0aW5lIHx8IGxvYWRpbmdcIlxuICAgID5cbiAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBUyx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZckUsTUFBTSxPQUFPLGlCQUFpQjtJQTZCNUIsWUFDUyxLQUFzQixFQUN0QixTQUEyQixFQUMxQixjQUE4QixFQUM5QixLQUFtQixFQUNuQixXQUF3QixFQUN4Qix5QkFBb0QsRUFDcEQsYUFBNEI7UUFON0IsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCxrQkFBYSxHQUFiLGFB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O2dCQUNHLGlDQUFpQztzQkFBekMsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLGdDQUFnQztzQkFBekMsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJVXNlciwgVGVuYW50TG9naW5PcHRpb25zU2VydmljZSwgVGVuYW50U2VydmljZSwgVXNlclNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBOZXdQYXNzd29yZCB9IGZyb20gJy4uL2F1dGhlbnRpY2F0aW9uL3Bhc3N3b3JkLm1vZGVsJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9pMThuL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJUb3RwU2V0dXBDb21wb25lbnQgfSBmcm9tICcuL3VzZXItdG90cC1zZXR1cC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBJVXNlciB7XG4gIHBob25lOiBzdHJpbmc7XG4gIHNlbmRQYXNzd29yZFJlc2V0RW1haWw6IGJvb2xlYW47XG4gIG5ld3NsZXR0ZXI/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktdXNlci1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZWRpdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsYW5nOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IHVzZXIodTogVXNlcikge1xuICAgIGlmICh1KSB7XG4gICAgICB0aGlzLl91c2VyID0gY2xvbmUodSk7XG4gICAgICB0aGlzLnVzZXJJc0V4dGVybmFsID0gdS5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gPT09ICdPQVVUSDInO1xuICAgICAgdGhpcy5pc1Bob25lUmVxdWlyZWQgPSB0aGlzLmlzUGhvbmVSZXF1aXJlZCAmJiB1LnR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRW5hYmxlZDtcbiAgICB9XG4gIH1cbiAgZ2V0IHVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cbiAgQElucHV0KCkgc2hvd1Byb2R1Y3RFeHBlcmllbmNlT3B0aW9ucyA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1VzYWdlVHJhY2tpbmdFbmFibGVkID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VFbmFibGVkID0gdHJ1ZTtcbiAgQE91dHB1dCgpIG9uVXNlcjogRXZlbnRFbWl0dGVyPFVzZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25Vc2FnZVRyYWNraW5nQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTGFuZ3VhZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB1c2VySGFzQWN0aXZlVG90cCA9IGZhbHNlO1xuICB1c2VyQ2FuU2V0dXBUb3RwID0gZmFsc2U7XG4gIGlzUGhvbmVSZXF1aXJlZCA9IGZhbHNlO1xuICB1c2VySXNFeHRlcm5hbDogYm9vbGVhbjtcbiAgaXNUZmFFbmFibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX3VzZXI6IFVzZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXRlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlOiBUZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogVGVuYW50U2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY3VycmVudFRlbmFudCA9IChhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuY3VycmVudCgpKS5kYXRhO1xuICAgIGNvbnN0IHsgZW5hYmxlZE9uU3lzdGVtTGV2ZWwsIGVuYWJsZWRPblRlbmFudExldmVsIH0gPSBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuZ2V0VGZhU2V0dGluZ3MoXG4gICAgICBjdXJyZW50VGVuYW50XG4gICAgKTtcbiAgICB0aGlzLmlzVGZhRW5hYmxlZCA9IGVuYWJsZWRPblN5c3RlbUxldmVsIHx8IGVuYWJsZWRPblRlbmFudExldmVsO1xuXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplVG90cFNldHRpbmdzKCk7XG4gICAgaWYgKHRoaXMudXNlci50d29GYWN0b3JBdXRoZW50aWNhdGlvbkVuYWJsZWQgJiYgIXRoaXMudXNlckNhblNldHVwVG90cCkge1xuICAgICAgdGhpcy5pc1Bob25lUmVxdWlyZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldHVwVG90cCgpIHtcbiAgICB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coVXNlclRvdHBTZXR1cENvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnXG4gICAgfSk7XG4gICAgdGhpcy5jYW5jZWwoKTsgLy8gdG8gY2xvc2UgdGhlIHVzZXIgZWRpdCBtb2RhbCBhbmQgcHJldmVudCBjb25zb2xlIGVycm9ycyBvbiBsb2dvdXRcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMpIHtcbiAgICAgIHRoaXMub25Vc2FnZVRyYWNraW5nQ2hhbmdlLmVtaXQodGhpcy5pc1VzYWdlVHJhY2tpbmdFbmFibGVkKTtcbiAgICAgIC8qKlxuICAgICAgICogRW1pdHMgYSB1c2VyIGVuZ2FnZW1lbnQgcHJlZmVyZW5jZSBjaGFuZ2UgZXZlbnQuXG4gICAgICAgKiBJZiB1c2FnZSB0cmFja2luZyBpcyBkaXNhYmxlZCwgaXQgZW1pdHMgYGZhbHNlYC4gT3RoZXJ3aXNlLCBpdCBlbWl0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdXNlciBlbmdhZ2VtZW50IHByZWZlcmVuY2UuXG4gICAgICAgKi9cbiAgICAgIHRoaXMub25Vc2VyRW5nYWdlbWVudFByZWZlcmVuY2VDaGFuZ2UuZW1pdChcbiAgICAgICAgdGhpcy5pc1VzYWdlVHJhY2tpbmdFbmFibGVkID09PSBmYWxzZSA/IGZhbHNlIDogdGhpcy5pc1VzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUVuYWJsZWRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5vblVzZXIuZW1pdCh0aGlzLl91c2VyKTtcbiAgfVxuXG4gIG9uTmV3UGFzc3dvcmRDaGFuZ2VkKG5ld1Bhc3N3b3JkOiBOZXdQYXNzd29yZCkge1xuICAgIHRoaXMuX3VzZXIucGFzc3dvcmQgPSBuZXdQYXNzd29yZC5wYXNzd29yZDtcbiAgfVxuXG4gIGdldCBsYW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdGF0ZS5sYW5ncztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVRvdHBTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy51c2VyQ2FuU2V0dXBUb3RwID0gYXdhaXQgdGhpcy5jYW5Vc2VyU2V0dXBUb3RwKCk7XG4gICAgICBpZiAodGhpcy51c2VyQ2FuU2V0dXBUb3RwKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogdG90cEFjdGl2aXR5IH0gPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEFjdGl2aXR5VG90cCgpO1xuICAgICAgICB0aGlzLnVzZXJIYXNBY3RpdmVUb3RwID0gdG90cEFjdGl2aXR5LmlzQWN0aXZlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LnJlbW92ZUxhc3REYW5nZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhblVzZXJTZXR1cFRvdHAoKSB7XG4gICAgLy8gd2UgZG9uJ3QgY2hlY2sgZm9yIHRlbmFudCBvcHRpb25zIGhlcmUgZHVlIHRvIHBlcm1pc3Npb24gcmVzdHJpY3Rpb25zIG9uIHRoYXQgZW5kLXBvaW50XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0gKGF3YWl0IHRoaXMudGVuYW50TG9naW5PcHRpb25zU2VydmljZS5saXN0Rm9yQ3VycmVudFRlbmFudCgpKS5kYXRhO1xuICAgIHJldHVybiBsb2dpbk9wdGlvbnMuc29tZSgoeyB0ZmFTdHJhdGVneSA9ICcnIH0pID0+IHRmYVN0cmF0ZWd5LnRvTG93ZXJDYXNlKCkgPT09ICd0b3RwJyk7XG4gIH1cbn1cbiIsIjxmb3JtICN1c2VyRm9ybT1cIm5nRm9ybVwiIChuZ1N1Ym1pdCk9XCJ1c2VyRm9ybS5mb3JtLnZhbGlkICYmIHNhdmUoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZC1ibG9jayBwLTI0IHAtYi0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIiByb2xlPVwiYWxlcnRcIiAqbmdJZj1cInVzZXJJc0V4dGVybmFsXCIgdHJhbnNsYXRlPlxuICAgICAgU29tZSBvZiB0aGUgdXNlciBzZXR0aW5ncyBhcmUgbm90IGVkaXRhYmxlIGhlcmUgYmVjYXVzZSB0aGV5IGFyZSBtYW5hZ2VkIHZpYSB5b3VyXG4gICAgICBhdXRob3JpemF0aW9uIHNlcnZlci5cbiAgICA8L2Rpdj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJOYW1lXCI+VXNlcm5hbWUgKGZvciBleGFtcGxlLCBlbWFpbCk8L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGlkPVwidXNlck5hbWVcIlxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwidXNlci51c2VyTmFtZVwiXG4gICAgICAgIG5hbWU9XCJ1c2VyTmFtZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHJlcXVpcmVkXG4gICAgICAgIG1heGxlbmd0aD1cIjI1NFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gam9lLmRvZUBleGFtcGxlLmNvbWBMT0NBTElaRWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInVzZXIuaWRcIlxuICAgICAgICBjOHlEZWZhdWx0VmFsaWRhdGlvbj1cInVzZXJcIlxuICAgICAgLz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZSBmb3I9XCJkaXNwbGF5TmFtZVwiPkxvZ2luIGFsaWFzPC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBpZD1cImRpc3BsYXlOYW1lXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIuZGlzcGxheU5hbWVcIlxuICAgICAgICBuYW1lPVwiZGlzcGxheU5hbWVcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIyNTRcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIGpvZS5kb2VgTE9DQUxJWkVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAgIGM4eURlZmF1bHRWYWxpZGF0aW9uPVwibG9naW5BbGlhc1wiXG4gICAgICAvPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgW2hhc1dhcm5pbmddPVwiIXVzZXIuZW1haWxcIj5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGUgZm9yPVwidXNlckVtYWlsXCI+RW1haWw8L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGlkPVwidXNlckVtYWlsXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICBuYW1lPVwiZW1haWxcIlxuICAgICAgICBbbWF4bGVuZ3RoXT1cIjI1NFwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gam9lLmRvZUBleGFtcGxlLmNvbWBMT0NBTElaRWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ1c2VyLmVtYWlsXCJcbiAgICAgICAgZW1haWxcbiAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwidXNlcklzRXh0ZXJuYWxcIlxuICAgICAgLz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJGaXJzdE5hbWVcIj5GaXJzdCBuYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGlkPVwidXNlckZpcnN0TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgbmFtZT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIuZmlyc3ROYW1lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJMYXN0TmFtZVwiPkxhc3QgbmFtZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInVzZXJMYXN0TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgbmFtZT1cImxhc3ROYW1lXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidXNlci5sYXN0TmFtZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlcklzRXh0ZXJuYWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGUgZm9yPVwidXNlclRlbGVwaG9uZVwiPlRlbGVwaG9uZTwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9XCJ1c2VyVGVsZXBob25lXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBuYW1lPVwicGhvbmVcIlxuICAgICAgICBtYXhsZW5ndGg9XCIyNTRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIucGhvbmVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuICs0OSA5IDg3NiA1NDMgMjEwYExPQ0FMSVpFYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjOHlQaG9uZVZhbGlkYXRpb25cbiAgICAgICAgW3JlcXVpcmVkXT1cImlzUGhvbmVSZXF1aXJlZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAvPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGUgZm9yPVwidXNlckxhbmdcIj5MYW5ndWFnZTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBpZD1cInVzZXJMYW5nXCJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgI3NlbGVjdExhbmdcbiAgICAgICAgICBuYW1lPVwibGFuZ1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJsYW5nXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uTGFuZ3VhZ2UuZW1pdChzZWxlY3RMYW5nLnZhbHVlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmdzXCIgW3ZhbHVlXT1cImxhbmdcIj5cbiAgICAgICAgICAgIHt7IHRyYW5zbGF0ZS5nZXROYXRpdmVMYW5ndWFnZShsYW5nKSB9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInAtdC0xNiBzZXBhcmF0b3ItdG9wXCIgKm5nSWY9XCJzaG93UHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zXCI+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlPlByb2R1Y3QgZXhwZXJpZW5jZTwvbGFiZWw+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoXCIgZm9yPVwicHJvZHVjdFVzYWdlVHJhY2tpbmdcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgaWQ9XCJwcm9kdWN0VXNhZ2VUcmFja2luZ1wiXG4gICAgICAgICAgbmFtZT1cInByb2R1Y3RVc2FnZVRyYWNraW5nXCJcbiAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiaXNVc2FnZVRyYWNraW5nRW5hYmxlZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAge3sgJ0VuYWJsZSBwZXJzb25hbGl6ZWQgcHJvZHVjdCBleHBlcmllbmNlIHRyYWNraW5nJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1VzYWdlVHJhY2tpbmdFbmFibGVkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1zd2l0Y2ggbS1sLTBcIiBmb3I9XCJ1c2VyRW5nYWdlbWVudFByZWZlcmVuY2VcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGlkPVwidXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlXCJcbiAgICAgICAgICAgIG5hbWU9XCJ1c2VyRW5nYWdlbWVudFByZWZlcmVuY2VcIlxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXNVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VFbmFibGVkXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICB7eyAnRW5hYmxlIGluLXByb2R1Y3QgaW5mb3JtYXRpb24gJiBjb21tdW5pY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHAtdC0xNiBzZXBhcmF0b3ItdG9wXCIgKm5nSWY9XCIhdXNlcklzRXh0ZXJuYWxcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57eyAnTG9naW4gb3B0aW9ucycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgPGM4eS1uZXctcGFzc3dvcmQgKHBhc3N3b3JkKT1cIm9uTmV3UGFzc3dvcmRDaGFuZ2VkKCRldmVudClcIj48L2M4eS1uZXctcGFzc3dvcmQ+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHRpdGxlPVwie3sgJ1NldCB1cCB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJzZXR1cFRvdHAoKVwiXG4gICAgICAgICpuZ0lmPVwidXNlckNhblNldHVwVG90cCAmJiAhdXNlckhhc0FjdGl2ZVRvdHAgJiYgaXNUZmFFbmFibGVkXCJcbiAgICAgID5cbiAgICAgICAge3sgJ1NldCB1cCB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgKm5nSWY9XCIhIShzdGF0ZS5zdGF0ZSQgfCBhc3luYykubmV3c2xldHRlclwiPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5OZXdzbGV0dGVyPC9sYWJlbD5cbiAgICAgIDxsYWJlbFxuICAgICAgICB0aXRsZT1cInt7ICdTZW5kIG1lIGluZm9ybWF0aW9uIGFib3V0IG91dGFnZXMsIG1haW50ZW5hbmNlIG9yIHVwZGF0ZXMuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgID5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICBuYW1lPVwibmV3c2xldHRlclwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJ1c2VyLm5ld3NsZXR0ZXJcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ1c2VySXNFeHRlcm5hbFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAge3sgJ1NlbmQgbWUgaW5mb3JtYXRpb24gYWJvdXQgb3V0YWdlcywgbWFpbnRlbmFuY2Ugb3IgdXBkYXRlcy4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgc2VwYXJhdG9yLXRvcCBiZy1sZXZlbC0wIHN0aWNreS1ib3R0b21cIj5cbiAgICA8YnV0dG9uXG4gICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICA+XG4gICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIHRpdGxlPVwie3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgW2Rpc2FibGVkXT1cIiF1c2VyRm9ybS5mb3JtLnZhbGlkIHx8IHVzZXJGb3JtLmZvcm0ucHJpc3RpbmUgfHwgbG9hZGluZ1wiXG4gICAgPlxuICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
|