@tuki-io/tuki-widgets 0.0.219-dev.7 → 0.0.219-dev.9
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/README.md +24 -24
- package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
- package/esm2020/di2mt/widgets/upgrade-overview/cards/pending-activation-users/pending-activation-users.component.mjs +17 -17
- package/esm2020/lib/widgets.component.mjs +9 -9
- package/esm2020/lib/widgets.module.mjs +1 -1
- package/esm2020/lib/widgets.service.mjs +1 -1
- package/esm2020/public-api.mjs +1 -1
- package/esm2020/user-creation/src/app.constants.mjs +1 -1
- package/esm2020/user-creation/src/classes/notification.mjs +1 -1
- package/esm2020/user-creation/src/classes/site.mjs +1 -1
- package/esm2020/user-creation/src/environments/environment.mjs +1 -1
- package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +1 -1
- package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +3 -3
- package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/notification.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/utils.mjs +1 -1
- package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-default-prefix.mjs +19 -2
- package/esm2020/user-creation/src/utils/device-name-dynamic-tokens.mjs +4 -0
- package/esm2020/user-creation/src/utils/device-name-validation.mjs +1 -1
- package/esm2020/user-creation/src/utils/model.mjs +1 -1
- package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +6 -3
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +60 -13
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +3 -3
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +13 -9
- package/esm2020/user-device-manage/public-api.mjs +1 -1
- package/esm2020/user-device-manage/src/app.constants.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/site-defaults.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/types.mjs +1 -1
- package/esm2020/user-device-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +1 -1
- package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +2 -2
- package/esm2020/user-device-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-device-manage/src/material.module.mjs +1 -1
- package/esm2020/user-device-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +1 -1
- package/esm2020/user-device-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/device.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/user.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/validation.service.mjs +1 -1
- package/esm2020/user-device-manage/src/shared/tk-page-section/page-section.component.mjs +1 -1
- package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/public-api.mjs +1 -1
- package/esm2020/user-manage/src/app.constants.mjs +1 -1
- package/esm2020/user-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
- package/esm2020/user-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-manage/src/classes/table-data.mjs +1 -1
- package/esm2020/user-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-manage/src/classes/user-list.mjs +1 -1
- package/esm2020/user-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-manage/src/device-list/device-list.component.mjs +3 -3
- package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
- package/esm2020/user-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-manage/src/material.module.mjs +1 -1
- package/esm2020/user-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-manage/src/services/user.service.mjs +1 -1
- package/esm2020/user-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +3 -3
- package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
- package/esm2020/user-manage/src/user-manage-widget.component.mjs +2 -2
- package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
- package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +3 -3
- package/esm2020/users-list/public-api.mjs +1 -1
- package/esm2020/users-list/src/app.constants.mjs +1 -1
- package/esm2020/users-list/src/classes/app-location.mjs +1 -1
- package/esm2020/users-list/src/classes/device.mjs +1 -1
- package/esm2020/users-list/src/classes/line.mjs +1 -1
- package/esm2020/users-list/src/classes/move-user.mjs +1 -1
- package/esm2020/users-list/src/classes/notification.mjs +1 -1
- package/esm2020/users-list/src/classes/simlified-user.mjs +1 -1
- package/esm2020/users-list/src/classes/table-data.mjs +1 -1
- package/esm2020/users-list/src/classes/user-list.mjs +1 -1
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/services/api-webex.service.mjs +1 -1
- package/esm2020/users-list/src/services/api.service.mjs +1 -1
- package/esm2020/users-list/src/services/dns.service.mjs +1 -1
- package/esm2020/users-list/src/services/events-communication.service.mjs +1 -1
- package/esm2020/users-list/src/services/notification.service.mjs +1 -1
- package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/users-list/src/services/site-settings.service.mjs +1 -1
- package/esm2020/users-list/src/services/user.service.mjs +1 -1
- package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +3 -3
- package/esm2020/users-list/src/users-list.component.mjs +2 -2
- package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/users-list/src/utils/common-functions.mjs +1 -1
- package/esm2020/users-list/src/utils/notifications/notification.component.mjs +3 -3
- package/esm2020/users-list/src/utils/utils.service.mjs +1 -1
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +2 -2
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +109 -33
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +18 -18
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +13 -13
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +2 -2
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +102 -29
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +18 -18
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +13 -13
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -1
- package/package.json +1 -1
- package/user-creation/src/utils/device-default-prefix.d.ts +7 -2
- package/user-creation/src/utils/device-name-dynamic-tokens.d.ts +1 -0
- package/user-creation/src/utils/parse-device-name-rule.d.ts +1 -0
- package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +2 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component, EventEmitter, Output } from '@angular/core';
|
|
2
2
|
import { Validators, } from '@angular/forms';
|
|
3
3
|
import { catchError, debounceTime, finalize, map, of, startWith, Subject, switchMap, take, takeUntil, tap, timer, } from 'rxjs';
|
|
4
|
+
import { deviceNameHasDynamicTokens } from '../../../../utils/device-name-dynamic-tokens';
|
|
4
5
|
import { deviceNameValidator } from '../../../../utils/device-name-validation';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/forms";
|
|
@@ -90,9 +91,6 @@ export class UserDetailsStepComponent {
|
|
|
90
91
|
this.setupFormSync();
|
|
91
92
|
this.setupValidityEmitter();
|
|
92
93
|
this.fetchInitialAvailableNumbers();
|
|
93
|
-
if (!isRestoringPreviousEntry) {
|
|
94
|
-
this.userCreationWizardService.applyUserDetailsFormValue(this.userDetailsForm.getRawValue());
|
|
95
|
-
}
|
|
96
94
|
this.applyDeviceNameValidators();
|
|
97
95
|
this.userCreationWizardService.deviceDefaultsLoaded$
|
|
98
96
|
.pipe(takeUntil(this.destroy$))
|
|
@@ -140,6 +138,12 @@ export class UserDetailsStepComponent {
|
|
|
140
138
|
getDeviceProfileNameValidationCaption(index) {
|
|
141
139
|
return this.userCreationWizardService.getDeviceNameValidationCaption(index, true);
|
|
142
140
|
}
|
|
141
|
+
isDeviceNameReadonly(index, isProfile) {
|
|
142
|
+
const device = isProfile
|
|
143
|
+
? this.userCreationWizardService.deviceProfiles[index]
|
|
144
|
+
: this.userCreationWizardService.devices[index];
|
|
145
|
+
return deviceNameHasDynamicTokens(device?.name ?? device?.newName);
|
|
146
|
+
}
|
|
143
147
|
getFilteredNumbers(lineIndex) {
|
|
144
148
|
return this.filteredAvailableNumbersByLine[lineIndex] ?? [];
|
|
145
149
|
}
|
|
@@ -165,6 +169,23 @@ export class UserDetailsStepComponent {
|
|
|
165
169
|
const lineGroup = this.linesFormArray.at(lineIndex);
|
|
166
170
|
const displayNumber = this.extractDirectoryNumber(number);
|
|
167
171
|
lineGroup.get('number')?.setValue(displayNumber, { emitEvent: true });
|
|
172
|
+
this.devicesFormArray.controls.forEach((_, deviceIndex) => {
|
|
173
|
+
const device = this.userCreationWizardService.devices[deviceIndex];
|
|
174
|
+
const templateName = device?.newName ?? '';
|
|
175
|
+
if (!templateName || !templateName.includes('[DN]')) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const resolvedName = templateName.replace(/\[DN\]/g, displayNumber);
|
|
179
|
+
const deviceGroup = this.getDeviceGroup(deviceIndex);
|
|
180
|
+
const nameControl = deviceGroup.get('name');
|
|
181
|
+
if (!nameControl) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (nameControl.value === resolvedName) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
nameControl.setValue(resolvedName);
|
|
188
|
+
});
|
|
168
189
|
}
|
|
169
190
|
searchLdapUsers(pageIndex = 0) {
|
|
170
191
|
const queryValue = String(this.ldapSearchForm.get('queryValue')?.value).trim() || undefined;
|
|
@@ -306,7 +327,7 @@ export class UserDetailsStepComponent {
|
|
|
306
327
|
],
|
|
307
328
|
number: [
|
|
308
329
|
savedLine?.number ?? line.directoryNumber?.directoryNumber ?? '',
|
|
309
|
-
Validators.required,
|
|
330
|
+
[Validators.required, this.createAvailableNumberValidator()],
|
|
310
331
|
],
|
|
311
332
|
routePartition: [
|
|
312
333
|
savedLine?.routePartition ?? line.directoryNumber?.routePartitionName ?? '',
|
|
@@ -318,25 +339,31 @@ export class UserDetailsStepComponent {
|
|
|
318
339
|
});
|
|
319
340
|
service.devices.forEach((device, index) => {
|
|
320
341
|
const savedDevice = savedFormValue?.devices?.[index];
|
|
342
|
+
const nameReadonly = deviceNameHasDynamicTokens(device.name ?? device.newName);
|
|
321
343
|
devicesArray.push(this.fb.group({
|
|
322
344
|
deviceType: [{ value: device.deviceType || '', disabled: true }],
|
|
323
345
|
protocol: [{ value: device.protocol || '', disabled: true }],
|
|
324
346
|
buttonTemplate: [{ value: device.buttonTemplate || '', disabled: true }],
|
|
325
|
-
name: [
|
|
326
|
-
|
|
327
|
-
|
|
347
|
+
name: [{
|
|
348
|
+
value: savedDevice?.name ?? device.name ?? device.newName ?? '',
|
|
349
|
+
disabled: nameReadonly,
|
|
350
|
+
},
|
|
351
|
+
nameReadonly ? [] : this.buildDeviceNameValidators(index, false),
|
|
328
352
|
],
|
|
329
353
|
}));
|
|
330
354
|
});
|
|
331
355
|
service.deviceProfiles.forEach((profile, index) => {
|
|
332
356
|
const savedProfile = savedFormValue?.deviceProfiles?.[index];
|
|
357
|
+
const nameReadonly = deviceNameHasDynamicTokens(profile.name ?? profile.newName);
|
|
333
358
|
profilesArray.push(this.fb.group({
|
|
334
359
|
deviceType: [{ value: profile.deviceType || '', disabled: true }],
|
|
335
360
|
protocol: [{ value: profile.protocol || '', disabled: true }],
|
|
336
361
|
buttonTemplate: [{ value: profile.buttonTemplate || '', disabled: true }],
|
|
337
|
-
name: [
|
|
338
|
-
|
|
339
|
-
|
|
362
|
+
name: [{
|
|
363
|
+
value: profile?.name ?? profile.name ?? profile.newName ?? '',
|
|
364
|
+
disabled: nameReadonly,
|
|
365
|
+
},
|
|
366
|
+
nameReadonly ? [] : this.buildDeviceNameValidators(index, false),
|
|
340
367
|
],
|
|
341
368
|
}));
|
|
342
369
|
});
|
|
@@ -351,11 +378,17 @@ export class UserDetailsStepComponent {
|
|
|
351
378
|
}
|
|
352
379
|
applyDeviceNameValidators() {
|
|
353
380
|
this.devicesFormArray.controls.forEach((_, index) => {
|
|
381
|
+
if (this.isDeviceNameReadonly(index, false)) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
354
384
|
const nameControl = this.getDeviceGroup(index).get('name');
|
|
355
385
|
nameControl?.setValidators(this.buildDeviceNameValidators(index, false));
|
|
356
386
|
nameControl?.updateValueAndValidity({ emitEvent: false });
|
|
357
387
|
});
|
|
358
388
|
this.deviceProfilesFormArray.controls.forEach((_, index) => {
|
|
389
|
+
if (this.isDeviceNameReadonly(index, true)) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
359
392
|
const nameControl = this.getDeviceProfileGroup(index).get('name');
|
|
360
393
|
nameControl?.setValidators(this.buildDeviceNameValidators(index, true));
|
|
361
394
|
nameControl?.updateValueAndValidity({ emitEvent: false });
|
|
@@ -456,6 +489,9 @@ export class UserDetailsStepComponent {
|
|
|
456
489
|
const current = String(this.linesFormArray.at(index).get('number')?.value ?? '');
|
|
457
490
|
return this.filterOptions(numbers, current);
|
|
458
491
|
});
|
|
492
|
+
this.linesFormArray.controls.forEach(lineGroup => {
|
|
493
|
+
lineGroup.get('number')?.updateValueAndValidity({ emitEvent: false });
|
|
494
|
+
});
|
|
459
495
|
}
|
|
460
496
|
applyNumberFilter(lineIndex, raw) {
|
|
461
497
|
const value = raw.trim().toLowerCase();
|
|
@@ -478,6 +514,17 @@ export class UserDetailsStepComponent {
|
|
|
478
514
|
}
|
|
479
515
|
return source.filter(item => !!item && item.toLowerCase().includes(value));
|
|
480
516
|
}
|
|
517
|
+
createAvailableNumberValidator() {
|
|
518
|
+
return (control) => {
|
|
519
|
+
const value = String(control.value ?? '').trim();
|
|
520
|
+
if (!value) {
|
|
521
|
+
return null;
|
|
522
|
+
}
|
|
523
|
+
const numbers = this.userCreationWizardService.availableNumbers || [];
|
|
524
|
+
const isAvailableNumber = numbers.some(number => this.extractDirectoryNumber(number) === value);
|
|
525
|
+
return isAvailableNumber ? null : { availableNumber: true };
|
|
526
|
+
};
|
|
527
|
+
}
|
|
481
528
|
extractDirectoryNumber(value) {
|
|
482
529
|
const trimmed = value.trim();
|
|
483
530
|
const spaceIndex = trimmed.indexOf(' ');
|
|
@@ -511,11 +558,11 @@ export class UserDetailsStepComponent {
|
|
|
511
558
|
}
|
|
512
559
|
}
|
|
513
560
|
UserDetailsStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserDetailsStepComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UserCreationApiService }, { token: i3.UserCreationWizardService }], target: i0.ɵɵFactoryTarget.Component });
|
|
514
|
-
UserDetailsStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserDetailsStepComponent, selector: "tk-user-details-step", outputs: { validityChange: "validityChange" }, ngImport: i0, template: "<app-loader *ngIf=\"loadingAvailableNumbers\"></app-loader>\r\n<section class=\"details-step-content\">\r\n <form [formGroup]=\"userDetailsForm\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"User ID\" formControlName=\"userId\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('required') && userDetailsForm.get('userId')?.touched\">\r\n User ID is required\r\n </mat-error>\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('userIdExists') && userDetailsForm.get('userId')?.touched\">\r\n User ID already exists\r\n </mat-error>\r\n <mat-hint *ngIf=\"userIdCheckPending\">Checking user ID...</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"First Name\" formControlName=\"firstName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('firstName')?.hasError('required') && userDetailsForm.get('firstName')?.touched\">\r\n First name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Last Name\" formControlName=\"lastName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('lastName')?.hasError('required') && userDetailsForm.get('lastName')?.touched\">\r\n Last name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Email\" formControlName=\"email\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('email')?.invalid && userDetailsForm.get('email')?.touched\">\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('required')\">Email is required</span>\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('email')\">Please enter a valid email</span>\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplateName || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Choose an existing or a LDAP user</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <div class=\"details-ldap-search\" [formGroup]=\"ldapSearchForm\">\r\n <mat-form-field\r\n class=\"details-ldap-search__input\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search\"\r\n formControlName=\"queryValue\"\r\n (keyup.enter)=\"searchLdapUsers()\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-ldap-search__select\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <mat-select formControlName=\"queryType\">\r\n <mat-option *ngFor=\"let option of ldapQueryTypeOptions\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-chip-list *ngIf=\"selectedLdapUser\" class=\"details-ldap-search__chip\">\r\n <mat-chip removable (removed)=\"onRemoveLdapTag()\">\r\n {{ selectedLdapUser.userid }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n\r\n <button\r\n mat-button\r\n class=\"details-ldap-search__btn\"\r\n type=\"button\"\r\n [disabled]=\"ldapLoading\"\r\n (click)=\"searchLdapUsers()\"\r\n >\r\n Search\r\n </button>\r\n </div>\r\n\r\n <app-loader *ngIf=\"ldapLoading\"></app-loader>\r\n\r\n <p\r\n *ngIf=\"!ldapLoading && ldapSearchAttempted && !hasLdapUsers\"\r\n class=\"details-ldap-table__empty\"\r\n >\r\n No users found\r\n </p>\r\n\r\n <table\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User Id</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userid }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n *ngIf=\"!isLdapUserRowSelected(row); else deleteLdapUserBtn\"\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n (click)=\"onAddLdapUser(row)\"\r\n >\r\n Add User\r\n </button>\r\n <ng-template #deleteLdapUserBtn>\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn details-ldap-table__add-btn--delete\"\r\n type=\"button\"\r\n (click)=\"onDeleteLdapUser(row)\"\r\n >\r\n Delete user\r\n </button>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"userCreationWizardService.ldapTableColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: userCreationWizardService.ldapTableColumns\"></tr>\r\n </table>\r\n\r\n <mat-paginator\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n class=\"details-ldap-paginator\"\r\n [length]=\"ldapTotalCount\"\r\n [pageSize]=\"ldapPageSize\"\r\n [pageIndex]=\"ldapPageIndex\"\r\n [pageSizeOptions]=\"[ldapPageSize]\"\r\n [hidePageSize]=\"true\"\r\n [disabled]=\"ldapLoading\"\r\n (page)=\"onLdapPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"lines\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"let lineGroup of linesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"line-info\">\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input matInput placeholder=\"Line number\" formControlName=\"lineNumber\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search for a number\"\r\n formControlName=\"number\"\r\n [matAutocomplete]=\"numberAuto\"\r\n (input)=\"filterAvailableNumbers(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #numberAuto=\"matAutocomplete\"\r\n [panelWidth]=\"'auto'\"\r\n (optionSelected)=\"onNumberSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of getFilteredNumbers(idx)\" [value]=\"option\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.invalid && getLineGroup(idx).get('number')?.touched\">\r\n Number is required\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Select route partition\"\r\n formControlName=\"routePartition\"\r\n [matAutocomplete]=\"routePartitionAuto\"\r\n (input)=\"filterRoutePartitions(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #routePartitionAuto=\"matAutocomplete\"\r\n (optionSelected)=\"onRoutePartitionSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let routePartition of getFilteredRoutePartitions(idx)\"\r\n [value]=\"routePartition\"\r\n >\r\n {{ routePartition }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('routePartition')?.invalid && getLineGroup(idx).get('routePartition')?.touched\">\r\n Route partition is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"devices\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let deviceGroup of devicesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceNamePrefix(idx) as devicePrefix\">{{ devicePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('deviceName') && getDeviceGroup(idx).get('name')?.touched\">\r\n {{ getDeviceGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('required') && getDeviceGroup(idx).get('name')?.touched\">\r\n Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\" *ngIf=\"deviceProfilesFormArray.length\">\r\n <h3 class=\"details-step-section__title\">Device profiles</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"deviceProfiles\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let profileGroup of deviceProfilesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceProfileNamePrefix(idx) as profilePrefix\">{{ profilePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceProfileGroup(idx).get('name')?.hasError('deviceName') && getDeviceProfileGroup(idx).get('name')?.touched\">\r\n {{ getDeviceProfileGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceProfileNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </form>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-search{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px}.details-ldap-search__input{min-width:180px;width:180px}.details-ldap-search__select{flex:0 1 180px;min-width:160px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-wrapper,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-wrapper{padding-bottom:0;margin:0}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-flex,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:0 12px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-gap,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-infix,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-infix{width:100%;border-top:0;padding:0;display:flex;align-items:center;min-height:unset}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-input-element,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-input-element{margin:0;line-height:20px}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-trigger{display:flex;align-items:center;width:100%;height:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-value{display:flex;align-items:center;max-width:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-arrow-wrapper{display:flex;align-items:center}.details-ldap-search__chip{flex:0 0 auto}.details-ldap-search__btn{flex:0 0 auto;min-width:0;padding:0 12px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;color:#0d56aa}.details-ldap-paginator{margin-top:8px}.details-ldap-table__add-btn--delete{color:#c62828}.details-ldap-table{width:100%}.details-ldap-table__empty{margin:16px 0 8px;font-family:Inter,sans-serif;font-size:14px;line-height:20px;color:#737480;text-align:center}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-info{display:flex;align-items:flex-start;gap:16px}.line-route-field{flex:1 1 180px;min-width:160px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .line-info .details-step-input .mat-form-field-flex{height:36px;padding:0 8px}:host ::ng-deep .line-info .details-step-input .mat-form-field-infix{padding:0}:host ::ng-deep .line-info .details-step-input .mat-input-element{font-size:14px;line-height:20px}:host ::ng-deep .mat-form-field-subscript-wrapper{position:relative}:host ::ng-deep .line-info .details-step-input .mat-form-field-subscript-wrapper{margin-top:4px;position:relative}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex{display:flex;gap:3px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex .mat-form-field-prefix{top:1px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i9.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: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i12.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i14.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i14.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i14.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i15.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i15.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i15.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i15.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i16.AppLoaderComponent, selector: "app-loader" }] });
|
|
561
|
+
UserDetailsStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserDetailsStepComponent, selector: "tk-user-details-step", outputs: { validityChange: "validityChange" }, ngImport: i0, template: "<app-loader *ngIf=\"loadingAvailableNumbers\"></app-loader>\r\n<section class=\"details-step-content\">\r\n <form [formGroup]=\"userDetailsForm\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"User ID\" formControlName=\"userId\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('required') && userDetailsForm.get('userId')?.touched\">\r\n User ID is required\r\n </mat-error>\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('userIdExists') && userDetailsForm.get('userId')?.touched\">\r\n User ID already exists\r\n </mat-error>\r\n <mat-hint *ngIf=\"userIdCheckPending\">Checking user ID...</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"First Name\" formControlName=\"firstName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('firstName')?.hasError('required') && userDetailsForm.get('firstName')?.touched\">\r\n First name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Last Name\" formControlName=\"lastName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('lastName')?.hasError('required') && userDetailsForm.get('lastName')?.touched\">\r\n Last name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Email\" formControlName=\"email\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('email')?.invalid && userDetailsForm.get('email')?.touched\">\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('required')\">Email is required</span>\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('email')\">Please enter a valid email</span>\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplateName || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Choose an existing or a LDAP user</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <div class=\"details-ldap-search\" [formGroup]=\"ldapSearchForm\">\r\n <mat-form-field\r\n class=\"details-ldap-search__input\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search\"\r\n formControlName=\"queryValue\"\r\n (keyup.enter)=\"searchLdapUsers()\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-ldap-search__select\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <mat-select formControlName=\"queryType\">\r\n <mat-option *ngFor=\"let option of ldapQueryTypeOptions\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-chip-list *ngIf=\"selectedLdapUser\" class=\"details-ldap-search__chip\">\r\n <mat-chip removable (removed)=\"onRemoveLdapTag()\">\r\n {{ selectedLdapUser.userid }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n\r\n <button\r\n mat-button\r\n class=\"details-ldap-search__btn\"\r\n type=\"button\"\r\n [disabled]=\"ldapLoading\"\r\n (click)=\"searchLdapUsers()\"\r\n >\r\n Search\r\n </button>\r\n </div>\r\n\r\n <app-loader *ngIf=\"ldapLoading\"></app-loader>\r\n\r\n <p\r\n *ngIf=\"!ldapLoading && ldapSearchAttempted && !hasLdapUsers\"\r\n class=\"details-ldap-table__empty\"\r\n >\r\n No users found\r\n </p>\r\n\r\n <table\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User Id</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userid }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n *ngIf=\"!isLdapUserRowSelected(row); else deleteLdapUserBtn\"\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n (click)=\"onAddLdapUser(row)\"\r\n >\r\n Add User\r\n </button>\r\n <ng-template #deleteLdapUserBtn>\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn details-ldap-table__add-btn--delete\"\r\n type=\"button\"\r\n (click)=\"onDeleteLdapUser(row)\"\r\n >\r\n Delete user\r\n </button>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"userCreationWizardService.ldapTableColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: userCreationWizardService.ldapTableColumns\"></tr>\r\n </table>\r\n\r\n <mat-paginator\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n class=\"details-ldap-paginator\"\r\n [length]=\"ldapTotalCount\"\r\n [pageSize]=\"ldapPageSize\"\r\n [pageIndex]=\"ldapPageIndex\"\r\n [pageSizeOptions]=\"[ldapPageSize]\"\r\n [hidePageSize]=\"true\"\r\n [disabled]=\"ldapLoading\"\r\n (page)=\"onLdapPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"lines\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"let lineGroup of linesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"line-info\">\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input matInput placeholder=\"Line number\" formControlName=\"lineNumber\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search for a number\"\r\n formControlName=\"number\"\r\n [matAutocomplete]=\"numberAuto\"\r\n (input)=\"filterAvailableNumbers(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #numberAuto=\"matAutocomplete\"\r\n [panelWidth]=\"'auto'\"\r\n (optionSelected)=\"onNumberSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of getFilteredNumbers(idx)\" [value]=\"option\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.hasError('required') && getLineGroup(idx).get('number')?.touched\">\r\n Number is required\r\n </mat-error>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.hasError('availableNumber') && getLineGroup(idx).get('number')?.touched\">\r\n Select a number from the list\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Select route partition\"\r\n formControlName=\"routePartition\"\r\n [matAutocomplete]=\"routePartitionAuto\"\r\n (input)=\"filterRoutePartitions(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #routePartitionAuto=\"matAutocomplete\"\r\n (optionSelected)=\"onRoutePartitionSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let routePartition of getFilteredRoutePartitions(idx)\"\r\n [value]=\"routePartition\"\r\n >\r\n {{ routePartition }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('routePartition')?.invalid && getLineGroup(idx).get('routePartition')?.touched\">\r\n Route partition is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"devices\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let deviceGroup of devicesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceNamePrefix(idx) as devicePrefix\">{{ devicePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" [readonly]=\"isDeviceNameReadonly(idx, false)\" />\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('deviceName') && getDeviceGroup(idx).get('name')?.touched\">\r\n {{ getDeviceGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('required') && getDeviceGroup(idx).get('name')?.touched\">\r\n Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\" *ngIf=\"deviceProfilesFormArray.length\">\r\n <h3 class=\"details-step-section__title\">Device profiles</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"deviceProfiles\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let profileGroup of deviceProfilesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceProfileNamePrefix(idx) as profilePrefix\">{{ profilePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" [readonly]=\"isDeviceNameReadonly(idx, true)\" />\r\n <mat-error *ngIf=\"getDeviceProfileGroup(idx).get('name')?.hasError('deviceName') && getDeviceProfileGroup(idx).get('name')?.touched\">\r\n {{ getDeviceProfileGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceProfileNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </form>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-search{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px}.details-ldap-search__input{min-width:180px;width:180px}.details-ldap-search__select{flex:0 1 180px;min-width:160px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-wrapper,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-wrapper{padding-bottom:0;margin:0}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-flex,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:0 12px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-gap,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-infix,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-infix{width:100%;border-top:0;padding:0;display:flex;align-items:center;min-height:unset}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-input-element,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-input-element{margin:0;line-height:20px}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-trigger{display:flex;align-items:center;width:100%;height:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-value{display:flex;align-items:center;max-width:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-arrow-wrapper{display:flex;align-items:center}.details-ldap-search__chip{flex:0 0 auto}.details-ldap-search__btn{flex:0 0 auto;min-width:0;padding:0 12px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;color:#0d56aa}.details-ldap-paginator{margin-top:8px}.details-ldap-table__add-btn--delete{color:#c62828}.details-ldap-table{width:100%}.details-ldap-table__empty{margin:16px 0 8px;font-family:Inter,sans-serif;font-size:14px;line-height:20px;color:#737480;text-align:center}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-info{display:flex;align-items:flex-start;gap:16px}.line-route-field{flex:1 1 180px;min-width:160px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .line-info .details-step-input .mat-form-field-flex{height:36px;padding:0 8px}:host ::ng-deep .line-info .details-step-input .mat-form-field-infix{padding:0}:host ::ng-deep .line-info .details-step-input .mat-input-element{font-size:14px;line-height:20px}:host ::ng-deep .mat-form-field-subscript-wrapper{position:relative}:host ::ng-deep .line-info .details-step-input .mat-form-field-subscript-wrapper{margin-top:4px;position:relative}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex{display:flex;gap:3px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex .mat-form-field-prefix{top:1px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i9.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: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i12.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i14.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i14.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i14.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i15.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i15.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i15.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i15.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i16.AppLoaderComponent, selector: "app-loader" }] });
|
|
515
562
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserDetailsStepComponent, decorators: [{
|
|
516
563
|
type: Component,
|
|
517
|
-
args: [{ selector: 'tk-user-details-step', template: "<app-loader *ngIf=\"loadingAvailableNumbers\"></app-loader>\r\n<section class=\"details-step-content\">\r\n <form [formGroup]=\"userDetailsForm\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"User ID\" formControlName=\"userId\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('required') && userDetailsForm.get('userId')?.touched\">\r\n User ID is required\r\n </mat-error>\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('userIdExists') && userDetailsForm.get('userId')?.touched\">\r\n User ID already exists\r\n </mat-error>\r\n <mat-hint *ngIf=\"userIdCheckPending\">Checking user ID...</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"First Name\" formControlName=\"firstName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('firstName')?.hasError('required') && userDetailsForm.get('firstName')?.touched\">\r\n First name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Last Name\" formControlName=\"lastName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('lastName')?.hasError('required') && userDetailsForm.get('lastName')?.touched\">\r\n Last name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Email\" formControlName=\"email\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('email')?.invalid && userDetailsForm.get('email')?.touched\">\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('required')\">Email is required</span>\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('email')\">Please enter a valid email</span>\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplateName || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Choose an existing or a LDAP user</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <div class=\"details-ldap-search\" [formGroup]=\"ldapSearchForm\">\r\n <mat-form-field\r\n class=\"details-ldap-search__input\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search\"\r\n formControlName=\"queryValue\"\r\n (keyup.enter)=\"searchLdapUsers()\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-ldap-search__select\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <mat-select formControlName=\"queryType\">\r\n <mat-option *ngFor=\"let option of ldapQueryTypeOptions\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-chip-list *ngIf=\"selectedLdapUser\" class=\"details-ldap-search__chip\">\r\n <mat-chip removable (removed)=\"onRemoveLdapTag()\">\r\n {{ selectedLdapUser.userid }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n\r\n <button\r\n mat-button\r\n class=\"details-ldap-search__btn\"\r\n type=\"button\"\r\n [disabled]=\"ldapLoading\"\r\n (click)=\"searchLdapUsers()\"\r\n >\r\n Search\r\n </button>\r\n </div>\r\n\r\n <app-loader *ngIf=\"ldapLoading\"></app-loader>\r\n\r\n <p\r\n *ngIf=\"!ldapLoading && ldapSearchAttempted && !hasLdapUsers\"\r\n class=\"details-ldap-table__empty\"\r\n >\r\n No users found\r\n </p>\r\n\r\n <table\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User Id</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userid }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n *ngIf=\"!isLdapUserRowSelected(row); else deleteLdapUserBtn\"\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n (click)=\"onAddLdapUser(row)\"\r\n >\r\n Add User\r\n </button>\r\n <ng-template #deleteLdapUserBtn>\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn details-ldap-table__add-btn--delete\"\r\n type=\"button\"\r\n (click)=\"onDeleteLdapUser(row)\"\r\n >\r\n Delete user\r\n </button>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"userCreationWizardService.ldapTableColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: userCreationWizardService.ldapTableColumns\"></tr>\r\n </table>\r\n\r\n <mat-paginator\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n class=\"details-ldap-paginator\"\r\n [length]=\"ldapTotalCount\"\r\n [pageSize]=\"ldapPageSize\"\r\n [pageIndex]=\"ldapPageIndex\"\r\n [pageSizeOptions]=\"[ldapPageSize]\"\r\n [hidePageSize]=\"true\"\r\n [disabled]=\"ldapLoading\"\r\n (page)=\"onLdapPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"lines\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"let lineGroup of linesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"line-info\">\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input matInput placeholder=\"Line number\" formControlName=\"lineNumber\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search for a number\"\r\n formControlName=\"number\"\r\n [matAutocomplete]=\"numberAuto\"\r\n (input)=\"filterAvailableNumbers(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #numberAuto=\"matAutocomplete\"\r\n [panelWidth]=\"'auto'\"\r\n (optionSelected)=\"onNumberSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of getFilteredNumbers(idx)\" [value]=\"option\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.invalid && getLineGroup(idx).get('number')?.touched\">\r\n Number is required\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Select route partition\"\r\n formControlName=\"routePartition\"\r\n [matAutocomplete]=\"routePartitionAuto\"\r\n (input)=\"filterRoutePartitions(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #routePartitionAuto=\"matAutocomplete\"\r\n (optionSelected)=\"onRoutePartitionSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let routePartition of getFilteredRoutePartitions(idx)\"\r\n [value]=\"routePartition\"\r\n >\r\n {{ routePartition }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('routePartition')?.invalid && getLineGroup(idx).get('routePartition')?.touched\">\r\n Route partition is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"devices\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let deviceGroup of devicesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceNamePrefix(idx) as devicePrefix\">{{ devicePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('deviceName') && getDeviceGroup(idx).get('name')?.touched\">\r\n {{ getDeviceGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('required') && getDeviceGroup(idx).get('name')?.touched\">\r\n Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\" *ngIf=\"deviceProfilesFormArray.length\">\r\n <h3 class=\"details-step-section__title\">Device profiles</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"deviceProfiles\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let profileGroup of deviceProfilesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceProfileNamePrefix(idx) as profilePrefix\">{{ profilePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" />\r\n <mat-error *ngIf=\"getDeviceProfileGroup(idx).get('name')?.hasError('deviceName') && getDeviceProfileGroup(idx).get('name')?.touched\">\r\n {{ getDeviceProfileGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceProfileNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </form>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-search{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px}.details-ldap-search__input{min-width:180px;width:180px}.details-ldap-search__select{flex:0 1 180px;min-width:160px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-wrapper,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-wrapper{padding-bottom:0;margin:0}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-flex,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:0 12px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-gap,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-infix,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-infix{width:100%;border-top:0;padding:0;display:flex;align-items:center;min-height:unset}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-input-element,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-input-element{margin:0;line-height:20px}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-trigger{display:flex;align-items:center;width:100%;height:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-value{display:flex;align-items:center;max-width:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-arrow-wrapper{display:flex;align-items:center}.details-ldap-search__chip{flex:0 0 auto}.details-ldap-search__btn{flex:0 0 auto;min-width:0;padding:0 12px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;color:#0d56aa}.details-ldap-paginator{margin-top:8px}.details-ldap-table__add-btn--delete{color:#c62828}.details-ldap-table{width:100%}.details-ldap-table__empty{margin:16px 0 8px;font-family:Inter,sans-serif;font-size:14px;line-height:20px;color:#737480;text-align:center}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-info{display:flex;align-items:flex-start;gap:16px}.line-route-field{flex:1 1 180px;min-width:160px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .line-info .details-step-input .mat-form-field-flex{height:36px;padding:0 8px}:host ::ng-deep .line-info .details-step-input .mat-form-field-infix{padding:0}:host ::ng-deep .line-info .details-step-input .mat-input-element{font-size:14px;line-height:20px}:host ::ng-deep .mat-form-field-subscript-wrapper{position:relative}:host ::ng-deep .line-info .details-step-input .mat-form-field-subscript-wrapper{margin-top:4px;position:relative}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex{display:flex;gap:3px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex .mat-form-field-prefix{top:1px}\n"] }]
|
|
564
|
+
args: [{ selector: 'tk-user-details-step', template: "<app-loader *ngIf=\"loadingAvailableNumbers\"></app-loader>\r\n<section class=\"details-step-content\">\r\n <form [formGroup]=\"userDetailsForm\">\r\n <div class=\"details-step-sections\">\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">User details</h3>\r\n <div class=\"details-step-section__content\">\r\n <div class=\"details-step-section__part\">\r\n <div class=\"details-inline-fields\">\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User ID</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"User ID\" formControlName=\"userId\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('required') && userDetailsForm.get('userId')?.touched\">\r\n User ID is required\r\n </mat-error>\r\n <mat-error *ngIf=\"userDetailsForm.get('userId')?.hasError('userIdExists') && userDetailsForm.get('userId')?.touched\">\r\n User ID already exists\r\n </mat-error>\r\n <mat-hint *ngIf=\"userIdCheckPending\">Checking user ID...</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">First Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"First Name\" formControlName=\"firstName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('firstName')?.hasError('required') && userDetailsForm.get('firstName')?.touched\">\r\n First name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Last Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Last Name\" formControlName=\"lastName\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('lastName')?.hasError('required') && userDetailsForm.get('lastName')?.touched\">\r\n Last name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Email</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput placeholder=\"Email\" formControlName=\"email\" />\r\n <mat-error *ngIf=\"userDetailsForm.get('email')?.invalid && userDetailsForm.get('email')?.touched\">\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('required')\">Email is required</span>\r\n <span *ngIf=\"userDetailsForm.get('email')?.hasError('email')\">Please enter a valid email</span>\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">User Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input\r\n matInput\r\n placeholder=\"User Template\"\r\n [value]=\"userCreationWizardService.selectedTemplateName || ''\"\r\n [disabled]=\"true\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"details-step-section__part\">\r\n <mat-accordion class=\"details-user-accordion\">\r\n <mat-expansion-panel togglePosition=\"before\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Choose an existing or a LDAP user</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"details-user-accordion__content\">\r\n <div class=\"details-ldap-search\" [formGroup]=\"ldapSearchForm\">\r\n <mat-form-field\r\n class=\"details-ldap-search__input\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search\"\r\n formControlName=\"queryValue\"\r\n (keyup.enter)=\"searchLdapUsers()\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-ldap-search__select\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n >\r\n <mat-select formControlName=\"queryType\">\r\n <mat-option *ngFor=\"let option of ldapQueryTypeOptions\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-chip-list *ngIf=\"selectedLdapUser\" class=\"details-ldap-search__chip\">\r\n <mat-chip removable (removed)=\"onRemoveLdapTag()\">\r\n {{ selectedLdapUser.userid }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n\r\n <button\r\n mat-button\r\n class=\"details-ldap-search__btn\"\r\n type=\"button\"\r\n [disabled]=\"ldapLoading\"\r\n (click)=\"searchLdapUsers()\"\r\n >\r\n Search\r\n </button>\r\n </div>\r\n\r\n <app-loader *ngIf=\"ldapLoading\"></app-loader>\r\n\r\n <p\r\n *ngIf=\"!ldapLoading && ldapSearchAttempted && !hasLdapUsers\"\r\n class=\"details-ldap-table__empty\"\r\n >\r\n No users found\r\n </p>\r\n\r\n <table\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n mat-table\r\n [dataSource]=\"userCreationWizardService.ldapUsers\"\r\n class=\"details-ldap-table\"\r\n >\r\n <ng-container matColumnDef=\"userId\">\r\n <th mat-header-cell *matHeaderCellDef>User Id</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.userid }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"firstName\">\r\n <th mat-header-cell *matHeaderCellDef>First Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.firstName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"lastName\">\r\n <th mat-header-cell *matHeaderCellDef>Last Name</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.lastName }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"email\">\r\n <th mat-header-cell *matHeaderCellDef>Email</th>\r\n <td mat-cell *matCellDef=\"let row\">{{ row.email }}</td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"add\">\r\n <th mat-header-cell *matHeaderCellDef>Add</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <button\r\n *ngIf=\"!isLdapUserRowSelected(row); else deleteLdapUserBtn\"\r\n mat-button\r\n class=\"details-ldap-table__add-btn\"\r\n type=\"button\"\r\n (click)=\"onAddLdapUser(row)\"\r\n >\r\n Add User\r\n </button>\r\n <ng-template #deleteLdapUserBtn>\r\n <button\r\n mat-button\r\n class=\"details-ldap-table__add-btn details-ldap-table__add-btn--delete\"\r\n type=\"button\"\r\n (click)=\"onDeleteLdapUser(row)\"\r\n >\r\n Delete user\r\n </button>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"userCreationWizardService.ldapTableColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: userCreationWizardService.ldapTableColumns\"></tr>\r\n </table>\r\n\r\n <mat-paginator\r\n *ngIf=\"!ldapLoading && hasLdapUsers\"\r\n class=\"details-ldap-paginator\"\r\n [length]=\"ldapTotalCount\"\r\n [pageSize]=\"ldapPageSize\"\r\n [pageIndex]=\"ldapPageIndex\"\r\n [pageSizeOptions]=\"[ldapPageSize]\"\r\n [hidePageSize]=\"true\"\r\n [disabled]=\"ldapLoading\"\r\n (page)=\"onLdapPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Lines</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"lines\">\r\n <div class=\"line-route-list\">\r\n <div\r\n class=\"line-route-row\"\r\n *ngFor=\"let lineGroup of linesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"line-info\">\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input matInput placeholder=\"Line number\" formControlName=\"lineNumber\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Search for a number\"\r\n formControlName=\"number\"\r\n [matAutocomplete]=\"numberAuto\"\r\n (input)=\"filterAvailableNumbers(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #numberAuto=\"matAutocomplete\"\r\n [panelWidth]=\"'auto'\"\r\n (optionSelected)=\"onNumberSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of getFilteredNumbers(idx)\" [value]=\"option\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.hasError('required') && getLineGroup(idx).get('number')?.touched\">\r\n Number is required\r\n </mat-error>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('number')?.hasError('availableNumber') && getLineGroup(idx).get('number')?.touched\">\r\n Select a number from the list\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <mat-form-field\r\n class=\"details-step-input line-route-field\"\r\n appearance=\"outline\"\r\n floatLabel=\"never\"\r\n hideRequiredMarker\r\n >\r\n <input\r\n matInput\r\n placeholder=\"Select route partition\"\r\n formControlName=\"routePartition\"\r\n [matAutocomplete]=\"routePartitionAuto\"\r\n (input)=\"filterRoutePartitions(idx, $event)\"\r\n />\r\n <mat-autocomplete\r\n #routePartitionAuto=\"matAutocomplete\"\r\n (optionSelected)=\"onRoutePartitionSelected(idx, $event.option.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let routePartition of getFilteredRoutePartitions(idx)\"\r\n [value]=\"routePartition\"\r\n >\r\n {{ routePartition }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"getLineGroup(idx).get('routePartition')?.invalid && getLineGroup(idx).get('routePartition')?.touched\">\r\n Route partition is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\">\r\n <h3 class=\"details-step-section__title\">Devices</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"devices\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let deviceGroup of devicesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceNamePrefix(idx) as devicePrefix\">{{ devicePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" [readonly]=\"isDeviceNameReadonly(idx, false)\" />\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('deviceName') && getDeviceGroup(idx).get('name')?.touched\">\r\n {{ getDeviceGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n <mat-error *ngIf=\"getDeviceGroup(idx).get('name')?.hasError('required') && getDeviceGroup(idx).get('name')?.touched\">\r\n Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"details-step-section\" *ngIf=\"deviceProfilesFormArray.length\">\r\n <h3 class=\"details-step-section__title\">Device profiles</h3>\r\n <div class=\"details-step-section__content\" formArrayName=\"deviceProfiles\">\r\n <div class=\"devices-rows\">\r\n <div\r\n class=\"details-inline-fields details-inline-fields--four\"\r\n *ngFor=\"let profileGroup of deviceProfilesFormArray.controls; let idx = index\"\r\n [formGroupName]=\"idx\"\r\n >\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Device type</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"deviceType\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Protocol</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"protocol\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Button Template</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <input matInput formControlName=\"buttonTemplate\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"details-inline-field\">\r\n <label class=\"details-inline-field__label\">Name</label>\r\n <mat-form-field class=\"details-step-input\" appearance=\"outline\">\r\n <span matPrefix *ngIf=\"getDeviceProfileNamePrefix(idx) as profilePrefix\">{{ profilePrefix }}</span>\r\n <input matInput placeholder=\"Name\" formControlName=\"name\" [readonly]=\"isDeviceNameReadonly(idx, true)\" />\r\n <mat-error *ngIf=\"getDeviceProfileGroup(idx).get('name')?.hasError('deviceName') && getDeviceProfileGroup(idx).get('name')?.touched\">\r\n {{ getDeviceProfileGroup(idx).get('name')?.getError('deviceName')?.caption || getDeviceProfileNameValidationCaption(idx) || 'Please enter a valid device name' }}\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </form>\r\n</section>\r\n", styles: [".details-step-content{display:flex;flex-direction:column;gap:0}.details-step-dropdowns{display:flex;flex-direction:column;gap:1rem}.details-step-field{display:flex;flex-direction:column;gap:8px}.details-step-label{font-size:16px;font-weight:400;line-height:100%;letter-spacing:0;color:#333}.details-step-select{width:333px}.details-step-divider{border-top:1px solid #d9d9d9;margin-top:24px}.details-step-sections{display:flex;flex-direction:column}.details-step-section{display:flex;flex-direction:column;gap:0;padding:24px 0}.details-step-sections>.details-step-section:first-child{padding-top:0}.details-step-section+.details-step-section{border-top:1px solid #d9d9d9}.details-step-section__title{margin:0;font-family:Inter,sans-serif;font-size:16px;font-weight:600;line-height:100%;letter-spacing:0;color:#333}.details-step-section__content{margin-top:24px}.details-step-section__part+.details-step-section__part{margin-top:24px}.details-user-accordion{width:100%}.details-user-accordion__content{padding:12px 0 0}.details-ldap-search{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px}.details-ldap-search__input{min-width:180px;width:180px}.details-ldap-search__select{flex:0 1 180px;min-width:160px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-wrapper,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-wrapper{padding-bottom:0;margin:0}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-flex,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:0 12px}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-outline-gap,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-start,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-end,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-form-field-infix,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-form-field-infix{width:100%;border-top:0;padding:0;display:flex;align-items:center;min-height:unset}:host ::ng-deep .details-ldap-search__input.mat-form-field .mat-input-element,:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-input-element{margin:0;line-height:20px}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-trigger{display:flex;align-items:center;width:100%;height:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-value{display:flex;align-items:center;max-width:100%}:host ::ng-deep .details-ldap-search__select.mat-form-field .mat-select-arrow-wrapper{display:flex;align-items:center}.details-ldap-search__chip{flex:0 0 auto}.details-ldap-search__btn{flex:0 0 auto;min-width:0;padding:0 12px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;color:#0d56aa}.details-ldap-paginator{margin-top:8px}.details-ldap-table__add-btn--delete{color:#c62828}.details-ldap-table{width:100%}.details-ldap-table__empty{margin:16px 0 8px;font-family:Inter,sans-serif;font-size:14px;line-height:20px;color:#737480;text-align:center}.details-ldap-table__row--disabled{opacity:.35}.details-ldap-table__add-btn{min-width:0;padding:0;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#0d56aa}:host ::ng-deep .details-ldap-table .mat-header-cell{font-family:Inter,sans-serif;font-size:12px;font-weight:500;line-height:16px;letter-spacing:0;color:#737480;height:30px;padding:7px 8px}:host ::ng-deep .details-ldap-table .mat-cell{font-family:Inter,sans-serif;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0;color:#333;height:40px;padding:8px}.details-inline-fields{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px}.details-inline-fields--four{grid-template-columns:repeat(4,minmax(0,1fr))}.devices-rows{display:flex;flex-direction:column;gap:24px}.details-inline-field{display:flex;flex-direction:column;gap:4px}.details-inline-field__label{color:#c0c2ce;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0}.details-step-input{width:100%}.line-route-list{display:flex;flex-direction:column;gap:16px}.line-route-row{display:flex;gap:16px}.line-info{display:flex;align-items:flex-start;gap:16px}.line-route-field{flex:1 1 180px;min-width:160px}.line-route-field{display:flex;flex-direction:column;gap:0}.line-route-field:nth-of-type(1) .line-route-select{width:230px}.line-route-field .line-route-select{width:185px}:host ::ng-deep .details-step-select .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-input .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .details-step-select .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:6px;padding:0 12px}:host ::ng-deep .details-step-input .mat-form-field-flex{align-items:center;height:36px;border:1px solid #767676;border-radius:4px;padding:10px 8px}:host ::ng-deep .details-step-select .mat-form-field-outline,:host ::ng-deep .details-step-select .mat-form-field-outline-start,:host ::ng-deep .details-step-select .mat-form-field-outline-end,:host ::ng-deep .details-step-select .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-input .mat-form-field-outline,:host ::ng-deep .details-step-input .mat-form-field-outline-start,:host ::ng-deep .details-step-input .mat-form-field-outline-end,:host ::ng-deep .details-step-input .mat-form-field-outline-gap{display:none}:host ::ng-deep .details-step-select .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-input .mat-form-field-infix{width:100%;border-top:0;padding:0}:host ::ng-deep .details-step-select .mat-select-trigger{display:flex;align-items:center;justify-content:space-between;height:100%}:host ::ng-deep .details-step-input .mat-input-element{height:100%;margin:0}:host ::ng-deep .details-step-input.mat-form-field-disabled .mat-form-field-flex{background-color:#f5f6fa;border-color:#b8beca;opacity:.55;cursor:not-allowed}:host ::ng-deep .details-step-input .mat-input-element:disabled{color:#7f8694;-webkit-text-fill-color:#7f8694;cursor:not-allowed}:host ::ng-deep .line-info .details-step-input .mat-form-field-flex{height:36px;padding:0 8px}:host ::ng-deep .line-info .details-step-input .mat-form-field-infix{padding:0}:host ::ng-deep .line-info .details-step-input .mat-input-element{font-size:14px;line-height:20px}:host ::ng-deep .mat-form-field-subscript-wrapper{position:relative}:host ::ng-deep .line-info .details-step-input .mat-form-field-subscript-wrapper{margin-top:4px;position:relative}:host ::ng-deep .details-user-accordion .mat-expansion-panel{border:0;border-radius:0!important;background:transparent;box-shadow:none!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header{padding:0 0 0 8px;min-height:32px;height:32px}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header-title{margin:0;display:flex;align-items:center;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;letter-spacing:0;color:#333}:host ::ng-deep .details-user-accordion .mat-expansion-panel-body{padding:0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-content{display:flex;align-items:center}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator{display:block!important;opacity:1!important;color:#333!important;align-self:center;margin:0 8px 0 0!important}:host ::ng-deep .details-user-accordion .mat-expansion-panel-header .mat-expansion-indicator:after{color:#333!important;border-color:#333!important;position:relative;top:-4px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex{display:flex;gap:3px}:host ::ng-deep .devices-rows .details-inline-fields .details-inline-field .mat-form-field .mat-form-field-flex .mat-form-field-prefix{top:1px}\n"] }]
|
|
518
565
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.UserCreationApiService }, { type: i3.UserCreationWizardService }]; }, propDecorators: { validityChange: [{
|
|
519
566
|
type: Output
|
|
520
567
|
}] } });
|
|
521
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1kZXRhaWxzLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3dpZGdldHMvdXNlci1jcmVhdGlvbi13aXphcmQvY29tcG9uZW50cy91c2VyLWRldGFpbHMtc3RlcC91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlci1jcmVhdGlvbi9zcmMvd2lkZ2V0cy91c2VyLWNyZWF0aW9uLXdpemFyZC9jb21wb25lbnRzL3VzZXItZGV0YWlscy1zdGVwL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQVFILFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssR0FDUixNQUFNLE1BQU0sQ0FBQztBQVFkLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHL0UsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBTzFCLE1BQU0sT0FBTyx3QkFBd0I7SUEwQmpDLElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFjLENBQUM7SUFDMUQsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FB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QyxFQUNuQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQzdCLENBQ1IsRUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBQ04sQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7c0hBbm1CUSx3QkFBd0I7MEdBQXhCLHdCQUF3QiwyR0M1Q3JDLHMwbEJBd1hBOzRGRDVVYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksc0JBQXNCOytLQUt0QixjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEFic3RyYWN0Q29udHJvbCxcclxuICAgIEFzeW5jVmFsaWRhdG9yRm4sXHJcbiAgICBGb3JtQXJyYXksXHJcbiAgICBGb3JtQnVpbGRlcixcclxuICAgIEZvcm1Hcm91cCxcclxuICAgIFZhbGlkYXRpb25FcnJvcnMsXHJcbiAgICBWYWxpZGF0b3JGbixcclxuICAgIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQge1xyXG4gICAgY2F0Y2hFcnJvcixcclxuICAgIGRlYm91bmNlVGltZSxcclxuICAgIGZpbmFsaXplLFxyXG4gICAgbWFwLFxyXG4gICAgT2JzZXJ2YWJsZSxcclxuICAgIG9mLFxyXG4gICAgc3RhcnRXaXRoLFxyXG4gICAgU3ViamVjdCxcclxuICAgIHN3aXRjaE1hcCxcclxuICAgIHRha2UsXHJcbiAgICB0YWtlVW50aWwsXHJcbiAgICB0YXAsXHJcbiAgICB0aW1lcixcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIExkYXBRdWVyeVR5cGUsXHJcbiAgICBMZGFwVXNlcnNUYWJsZVJlc3BvbnNlLFxyXG4gICAgTGlzdFVzZXJJbnRlcmZhY2UsXHJcbiAgICBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSxcclxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3VzZXItY3JlYXRpb24td2l6YXJkLmludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3VzZXItY3JlYXRpb24tYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBkZXZpY2VOYW1lVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvZGV2aWNlLW5hbWUtdmFsaWRhdGlvbic7XHJcbmltcG9ydCB7IFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyLWNyZWF0aW9uLXdpemFyZC5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IExEQVBfUEFHRV9TSVpFID0gMTA7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndGstdXNlci1kZXRhaWxzLXN0ZXAnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyRGV0YWlsc1N0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAT3V0cHV0KCkgdmFsaWRpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgdXNlckRldGFpbHNGb3JtOiBGb3JtR3JvdXA7XHJcbiAgICBsZGFwU2VhcmNoRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICAgIHVzZXJJZENoZWNrUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgbG9hZGluZ0F2YWlsYWJsZU51bWJlcnMgPSBmYWxzZTtcclxuICAgIGxkYXBMb2FkaW5nID0gZmFsc2U7XHJcbiAgICBsZGFwU2VhcmNoQXR0ZW1wdGVkID0gZmFsc2U7XHJcblxyXG4gICAgcmVhZG9ubHkgbGRhcFBhZ2VTaXplID0gTERBUF9QQUdFX1NJWkU7XHJcbiAgICBsZGFwUGFnZUluZGV4ID0gMDtcclxuXHJcbiAgICByZWFkb25seSBsZGFwUXVlcnlUeXBlT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogTGRhcFF1ZXJ5VHlwZSB9W10gPSBbXHJcbiAgICAgICAgeyBsYWJlbDogJ1VzZXIgSUQnLCB2YWx1ZTogJ3VzZXJJZCcgfSxcclxuICAgICAgICB7IGxhYmVsOiAnRmlyc3QgTmFtZScsIHZhbHVlOiAnZmlyc3ROYW1lJyB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdMYXN0IE5hbWUnLCB2YWx1ZTogJ2xhc3ROYW1lJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmaWx0ZXJlZEF2YWlsYWJsZU51bWJlcnNCeUxpbmU6IHN0cmluZ1tdW10gPSBbXTtcclxuICAgIGZpbHRlcmVkUm91dGVQYXJ0aXRpb25zQnlMaW5lOiBzdHJpbmdbXVtdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJJZEFzeW5jVmFsaWRhdG9yID0gdGhpcy5jcmVhdGVVc2VySWRBc3luY1ZhbGlkYXRvcigpO1xyXG5cclxuICAgIGdldCBsaW5lc0Zvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2xpbmVzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXZpY2VzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZGV2aWNlcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdkZXZpY2VQcm9maWxlcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VsZWN0ZWRMZGFwVXNlcigpOiBMaXN0VXNlckludGVyZmFjZSB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0ZWRMZGFwVXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGRhcFRvdGFsQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmxkYXBVc2Vyc1RvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoYXNMZGFwVXNlcnMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5sZGFwVXNlcnMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDcmVhdGlvbkFwaVNlcnZpY2U6IFVzZXJDcmVhdGlvbkFwaVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2U6IFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubGRhcFNlYXJjaEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgcXVlcnlWYWx1ZTogWycnXSxcclxuICAgICAgICAgICAgcXVlcnlUeXBlOiBbJ3VzZXJJZCcgYXMgTGRhcFF1ZXJ5VHlwZV0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHVzZXJJZDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnVzZXJJZEFzeW5jVmFsaWRhdG9yXV0sXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGVtYWlsOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXV0sXHJcbiAgICAgICAgICAgIGxpbmVzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgICAgICAgZGV2aWNlczogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgICAgICAgIGRldmljZVByb2ZpbGVzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzYXZlZEZvcm1WYWx1ZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS51c2VyRGV0YWlsc0Zvcm1WYWx1ZTtcclxuICAgICAgICBjb25zdCBpc1Jlc3RvcmluZ1ByZXZpb3VzRW50cnkgPSAhIXNhdmVkRm9ybVZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoIWlzUmVzdG9yaW5nUHJldmlvdXNFbnRyeSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0TGRhcFNlYXJjaEZvcm0oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYnVpbGREeW5hbWljRm9ybUFycmF5cyhzYXZlZEZvcm1WYWx1ZSk7XHJcbiAgICAgICAgaWYgKGlzUmVzdG9yaW5nUHJldmlvdXNFbnRyeSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoVXNlckZpZWxkc0Zyb21TYXZlZFZhbHVlKHNhdmVkRm9ybVZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoVXNlckZpZWxkc0Zyb21TZXJ2aWNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRMaW5lRmlsdGVycygpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBGb3JtU3luYygpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBWYWxpZGl0eUVtaXR0ZXIoKTtcclxuICAgICAgICB0aGlzLmZldGNoSW5pdGlhbEF2YWlsYWJsZU51bWJlcnMoKTtcclxuXHJcbiAgICAgICAgaWYgKCFpc1Jlc3RvcmluZ1ByZXZpb3VzRW50cnkpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmFwcGx5VXNlckRldGFpbHNGb3JtVmFsdWUodGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0UmF3VmFsdWUoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RGV2aWNlTmFtZVZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmRldmljZURlZmF1bHRzTG9hZGVkJFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseURldmljZU5hbWVWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5pc0xkYXBJbnRlZ3JhdGVkICYmIHRoaXMuc2VsZWN0ZWRMZGFwVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5TGRhcEludGVncmF0ZWRGb3JtU3RhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU3RlcFZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJEZXRhaWxzRm9ybS52YWxpZCAmJiAhdGhpcy51c2VySWRDaGVja1BlbmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgbWFya0FsbEFzVG91Y2hlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBzeW5jVG9TZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hcHBseVVzZXJEZXRhaWxzRm9ybVZhbHVlKHRoaXMudXNlckRldGFpbHNGb3JtLmdldFJhd1ZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldExpbmVHcm91cChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saW5lc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZUdyb3VwKGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZXNGb3JtQXJyYXkuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VQcm9maWxlR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXkuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VOYW1lUHJlZml4KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmdldERldmljZU5hbWVQcmVmaXgoaW5kZXgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VQcm9maWxlTmFtZVByZWZpeChpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5nZXREZXZpY2VOYW1lUHJlZml4KGluZGV4LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VOYW1lVmFsaWRhdGlvbkNhcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5nZXREZXZpY2VOYW1lVmFsaWRhdGlvbkNhcHRpb24oaW5kZXgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VQcm9maWxlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGluZGV4LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJlZE51bWJlcnMobGluZUluZGV4OiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRBdmFpbGFibGVOdW1iZXJzQnlMaW5lW2xpbmVJbmRleF0gPz8gW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyZWRSb3V0ZVBhcnRpdGlvbnMobGluZUluZGV4OiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3V0ZVBhcnRpdGlvbnNCeUxpbmVbbGluZUluZGV4XSA/PyBbXTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJBdmFpbGFibGVOdW1iZXJzKGxpbmVJbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByYXcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsKT8udmFsdWUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5hcHBseU51bWJlckZpbHRlcihsaW5lSW5kZXgsIHJhdyk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyUm91dGVQYXJ0aXRpb25zKGxpbmVJbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByYXcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsKT8udmFsdWUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5hcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleCwgcmF3KTtcclxuICAgIH1cclxuXHJcbiAgICBvblJvdXRlUGFydGl0aW9uU2VsZWN0ZWQobGluZUluZGV4OiBudW1iZXIsIHJvdXRlUGFydGl0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBsaW5lR3JvdXAgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGxpbmVJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGxpbmVHcm91cC5nZXQoJ3JvdXRlUGFydGl0aW9uJyk/LnNldFZhbHVlKHJvdXRlUGFydGl0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgbGluZUdyb3VwLmdldCgnbnVtYmVyJyk/LnNldFZhbHVlKCcnKTtcclxuICAgICAgICB0aGlzLmFwcGx5Um91dGVQYXJ0aXRpb25GaWx0ZXIobGluZUluZGV4LCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgdGhpcy5sb2FkQXZhaWxhYmxlTnVtYmVyc0ZvckxpbmUobGluZUluZGV4LCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgb25OdW1iZXJTZWxlY3RlZChsaW5lSW5kZXg6IG51bWJlciwgbnVtYmVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBsaW5lR3JvdXAgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGxpbmVJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOdW1iZXIgPSB0aGlzLmV4dHJhY3REaXJlY3RvcnlOdW1iZXIobnVtYmVyKTtcclxuICAgICAgICBsaW5lR3JvdXAuZ2V0KCdudW1iZXInKT8uc2V0VmFsdWUoZGlzcGxheU51bWJlciwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoTGRhcFVzZXJzKHBhZ2VJbmRleCA9IDApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBxdWVyeVZhbHVlID0gU3RyaW5nKHRoaXMubGRhcFNlYXJjaEZvcm0uZ2V0KCdxdWVyeVZhbHVlJyk/LnZhbHVlKS50cmltKCkgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHNpdGVJZCA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZWxlY3RlZFNpdGU7XHJcblxyXG4gICAgICAgIGlmICghc2l0ZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZXRMZGFwVXNlcnNSZXN1bHQoW10sIDApO1xyXG4gICAgICAgICAgICB0aGlzLmxkYXBQYWdlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmxkYXBTZWFyY2hBdHRlbXB0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZGFwUGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5VHlwZSA9IHRoaXMubGRhcFNlYXJjaEZvcm0uZ2V0KCdxdWVyeVR5cGUnKT8udmFsdWUgYXMgTGRhcFF1ZXJ5VHlwZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBzaXplOiBTdHJpbmcoTERBUF9QQUdFX1NJWkUpLFxyXG4gICAgICAgICAgICBwYWdlOiBTdHJpbmcocGFnZUluZGV4KSxcclxuICAgICAgICAgICAgZGV2aWNlbGVzczogJ3RydWUnLFxyXG4gICAgICAgICAgICBxdWVyeXR5cGU6IHF1ZXJ5VHlwZSxcclxuICAgICAgICAgICAgd2l0aEVtYWlsT25seTogJ3RydWUnLFxyXG4gICAgICAgICAgICBxdWVyeXZhbHVlOiBxdWVyeVZhbHVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMubGRhcExvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudXNlckNyZWF0aW9uQXBpU2VydmljZVxyXG4gICAgICAgICAgICAuZ2V0TGRhcFVzZXJzKFN0cmluZyhzaXRlSWQpLCBwYXJhbXMpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgIG1hcCgocmVzOiBMZGFwVXNlcnNUYWJsZVJlc3BvbnNlKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJzOiByZXM/LnBhZ2VEYXRhID8/IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiByZXM/LnRvdGFsID8/IDAsXHJcbiAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgdXNlcnM6IFtdLCB0b3RhbDogMCB9KSksXHJcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZGFwTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IHVzZXJzLCB0b3RhbCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxkYXBTZWFyY2hBdHRlbXB0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNldExkYXBVc2Vyc1Jlc3VsdCh1c2VycywgdG90YWwpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkxkYXBQYWdlQ2hhbmdlKGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlYXJjaExkYXBVc2VycyhldmVudC5wYWdlSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWRkTGRhcFVzZXIocm93OiBMaXN0VXNlckludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZWxlY3RMZGFwVXNlcihyb3cpO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHJvdy51c2VyaWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogcm93LmZpcnN0TmFtZSA/PyAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IHJvdy5sYXN0TmFtZSA/PyAnJyxcclxuICAgICAgICAgICAgZW1haWw6IHJvdy5lbWFpbCA/PyAnJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFwcGx5TGRhcEludGVncmF0ZWRGb3JtU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVsZXRlTGRhcFVzZXIocm93OiBMaXN0VXNlckludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3cpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGVhckxkYXBTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBvblJlbW92ZUxkYXBUYWcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckxkYXBTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0xkYXBVc2VyUm93U2VsZWN0ZWQocm93OiBMaXN0VXNlckludGVyZmFjZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuaXNMZGFwVXNlclJvd1NlbGVjdGVkKHJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhckxkYXBTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmNsZWFyTGRhcFVzZXJTZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZXN0b3JlTWFudWFsRW50cnlGb3JtU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwbHlMZGFwSW50ZWdyYXRlZEZvcm1TdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFVzZXJJZGVudGl0eUZpZWxkc1JlYWRvbmx5KHRydWUpO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlVXNlcklkQXN5bmNWYWxpZGF0b3IoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzdG9yZU1hbnVhbEVudHJ5Rm9ybVN0YXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlcklkZW50aXR5RmllbGRzUmVhZG9ubHkoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlVXNlcklkQXN5bmNWYWxpZGF0b3IodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCd1c2VySWQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0VXNlcklkZW50aXR5RmllbGRzUmVhZG9ubHkocmVhZG9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBbJ3VzZXJJZCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnZW1haWwnXS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgICAgICAgICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlYWRvbmx5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0b2dnbGVVc2VySWRBc3luY1ZhbGlkYXRvcihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk7XHJcbiAgICAgICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnMoW3RoaXMudXNlcklkQXN5bmNWYWxpZGF0b3JdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb250cm9sLmNsZWFyQXN5bmNWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cFZhbGlkaXR5RW1pdHRlcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aCh0aGlzLnVzZXJEZXRhaWxzRm9ybS5zdGF0dXMpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5lbWl0VmFsaWRpdHkoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbWl0VmFsaWRpdHkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWxpZGl0eUNoYW5nZS5lbWl0KHRoaXMuaXNTdGVwVmFsaWQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZER5bmFtaWNGb3JtQXJyYXlzKHNhdmVkRm9ybVZhbHVlPzogVXNlckRldGFpbHNGb3JtVmFsdWUgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZTtcclxuICAgICAgICBjb25zdCBsaW5lc0FycmF5ID0gdGhpcy5saW5lc0Zvcm1BcnJheTtcclxuICAgICAgICBjb25zdCBkZXZpY2VzQXJyYXkgPSB0aGlzLmRldmljZXNGb3JtQXJyYXk7XHJcbiAgICAgICAgY29uc3QgcHJvZmlsZXNBcnJheSA9IHRoaXMuZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXk7XHJcblxyXG4gICAgICAgIHdoaWxlIChsaW5lc0FycmF5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsaW5lc0FycmF5LnJlbW92ZUF0KDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoZGV2aWNlc0FycmF5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBkZXZpY2VzQXJyYXkucmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChwcm9maWxlc0FycmF5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBwcm9maWxlc0FycmF5LnJlbW92ZUF0KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VydmljZS5saW5lcy5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzYXZlZExpbmUgPSBzYXZlZEZvcm1WYWx1ZT8ubGluZXM/LltpbmRleF07XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxpbmUuZGlyZWN0b3J5TnVtYmVyPy50ZW1wbGF0ZURpcmVjdG9yeU51bWJlciB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBudW1iZXI6IFtcclxuICAgICAgICAgICAgICAgICAgICBzYXZlZExpbmU/Lm51bWJlciA/PyBsaW5lLmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyID8/ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb246IFtcclxuICAgICAgICAgICAgICAgICAgICBzYXZlZExpbmU/LnJvdXRlUGFydGl0aW9uID8/IGxpbmUuZGlyZWN0b3J5TnVtYmVyPy5yb3V0ZVBhcnRpdGlvbk5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBsaW5lc0FycmF5LnB1c2gobGluZUdyb3VwKTtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cExpbmVMaXN0ZW5lcnMoaW5kZXgsIGxpbmVHcm91cCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZpY2UuZGV2aWNlcy5mb3JFYWNoKChkZXZpY2UsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhdmVkRGV2aWNlID0gc2F2ZWRGb3JtVmFsdWU/LmRldmljZXM/LltpbmRleF07XHJcbiAgICAgICAgICAgIGRldmljZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogW3sgdmFsdWU6IGRldmljZS5kZXZpY2VUeXBlIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogW3sgdmFsdWU6IGRldmljZS5wcm90b2NvbCB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uVGVtcGxhdGU6IFt7IHZhbHVlOiBkZXZpY2UuYnV0dG9uVGVtcGxhdGUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREZXZpY2U/Lm5hbWUgPz8gZGV2aWNlLm5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGREZXZpY2VOYW1lVmFsaWRhdG9ycyhpbmRleCwgZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXJ2aWNlLmRldmljZVByb2ZpbGVzLmZvckVhY2goKHByb2ZpbGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhdmVkUHJvZmlsZSA9IHNhdmVkRm9ybVZhbHVlPy5kZXZpY2VQcm9maWxlcz8uW2luZGV4XTtcclxuICAgICAgICAgICAgcHJvZmlsZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogW3sgdmFsdWU6IHByb2ZpbGUuZGV2aWNlVHlwZSB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IFt7IHZhbHVlOiBwcm9maWxlLnByb3RvY29sIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogW3sgdmFsdWU6IHByb2ZpbGUuYnV0dG9uVGVtcGxhdGUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRQcm9maWxlPy5uYW1lID8/IHByb2ZpbGUubmFtZSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZERldmljZU5hbWVWYWxpZGF0b3JzKGluZGV4LCB0cnVlKSxcclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkRGV2aWNlTmFtZVZhbGlkYXRvcnMoZGV2aWNlSW5kZXg6IG51bWJlciwgaXNQcm9maWxlOiBib29sZWFuKTogVmFsaWRhdG9yRm5bXSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IGlzUHJvZmlsZSA/IFtdIDogW1ZhbGlkYXRvcnMucmVxdWlyZWRdO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25PcHRpb25zKFxyXG4gICAgICAgICAgICBkZXZpY2VJbmRleCxcclxuICAgICAgICAgICAgaXNQcm9maWxlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goZGV2aWNlTmFtZVZhbGlkYXRvcihvcHRpb25zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwbHlEZXZpY2VOYW1lVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRldmljZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZUNvbnRyb2wgPSB0aGlzLmdldERldmljZUdyb3VwKGluZGV4KS5nZXQoJ25hbWUnKTtcclxuICAgICAgICAgICAgbmFtZUNvbnRyb2w/LnNldFZhbGlkYXRvcnModGhpcy5idWlsZERldmljZU5hbWVWYWxpZGF0b3JzKGluZGV4LCBmYWxzZSkpO1xyXG4gICAgICAgICAgICBuYW1lQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZUNvbnRyb2wgPSB0aGlzLmdldERldmljZVByb2ZpbGVHcm91cChpbmRleCkuZ2V0KCduYW1lJyk7XHJcbiAgICAgICAgICAgIG5hbWVDb250cm9sPy5zZXRWYWxpZGF0b3JzKHRoaXMuYnVpbGREZXZpY2VOYW1lVmFsaWRhdG9ycyhpbmRleCwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICBuYW1lQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldExkYXBTZWFyY2hGb3JtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGRhcFNlYXJjaEZvcm0ucmVzZXQoe1xyXG4gICAgICAgICAgICBxdWVyeVZhbHVlOiAnJyxcclxuICAgICAgICAgICAgcXVlcnlUeXBlOiAndXNlcklkJyBhcyBMZGFwUXVlcnlUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubGRhcFNlYXJjaEF0dGVtcHRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubGRhcFBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBhdGNoVXNlckZpZWxkc0Zyb21TYXZlZFZhbHVlKHNhdmVkOiBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHNhdmVkLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiBzYXZlZC5maXJzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBzYXZlZC5sYXN0TmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgZW1haWw6IHNhdmVkLmVtYWlsIHx8ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGF0Y2hVc2VyRmllbGRzRnJvbVNlcnZpY2UoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZTtcclxuICAgICAgICBjb25zdCBlbmRVc2VyID0gc2VydmljZS5lbmRVc2VyO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IGVuZFVzZXI/LnVzZXJpZCB8fCBzZXJ2aWNlLnVzZXJEZXRhaWxzRm9ybS51c2VySWQgfHwgJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogZW5kVXNlcj8uZmlyc3ROYW1lIHx8IHNlcnZpY2UudXNlckRldGFpbHNGb3JtLmZpcnN0TmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IGVuZFVzZXI/Lmxhc3ROYW1lIHx8IHNlcnZpY2UudXNlckRldGFpbHNGb3JtLmxhc3ROYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogZW5kVXNlcj8uZW1haWwgfHwgc2VydmljZS51c2VyRGV0YWlsc0Zvcm0uZW1haWwgfHwgJycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwTGluZUxpc3RlbmVycyhsaW5lSW5kZXg6IG51bWJlciwgbGluZUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBsaW5lR3JvdXBcclxuICAgICAgICAgICAgLmdldCgncm91dGVQYXJ0aXRpb24nKVxyXG4gICAgICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgzMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleCwgU3RyaW5nKHZhbHVlID8/ICcnKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsaW5lR3JvdXBcclxuICAgICAgICAgICAgLmdldCgnbnVtYmVyJylcclxuICAgICAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMTUwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlOdW1iZXJGaWx0ZXIobGluZUluZGV4LCBTdHJpbmcodmFsdWUgPz8gJycpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TGluZUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcGFydGl0aW9ucyA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5yb3V0ZVBhcnRpdGlvbk9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgbnVtYmVycyA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hdmFpbGFibGVOdW1iZXJzO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRSb3V0ZVBhcnRpdGlvbnNCeUxpbmUgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IFN0cmluZyhcclxuICAgICAgICAgICAgICAgICh0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgncm91dGVQYXJ0aXRpb24nKT8udmFsdWUgPz8gJydcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyT3B0aW9ucyhwYXJ0aXRpb25zLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkQXZhaWxhYmxlTnVtYmVyc0J5TGluZSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubWFwKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gU3RyaW5nKCh0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgnbnVtYmVyJyk/LnZhbHVlID8/ICcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyT3B0aW9ucyhudW1iZXJzLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwRm9ybVN5bmMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmFwcGx5VXNlckRldGFpbHNGb3JtVmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0UmF3VmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmZXRjaEluaXRpYWxBdmFpbGFibGVOdW1iZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0UGFydGl0aW9uID1cclxuICAgICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICA/IFN0cmluZygodGhpcy5saW5lc0Zvcm1BcnJheS5hdCgwKSBhcyBGb3JtR3JvdXApLmdldCgncm91dGVQYXJ0aXRpb24nKT8udmFsdWUgPz8gJycpLnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZmlyc3RMaW5lUm91dGVQYXJ0aXRpb24gfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNpdGVEZWZhdWx0Um91dGVQYXJ0aXRpb24gfHxcclxuICAgICAgICAgICAgICAgICAgJyc7XHJcblxyXG4gICAgICAgIGlmIChmaXJzdFBhcnRpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRBdmFpbGFibGVOdW1iZXJzRm9yTGluZSgwLCBmaXJzdFBhcnRpdGlvbiwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRBdmFpbGFibGVOdW1iZXJzRm9yTGluZShcclxuICAgICAgICBsaW5lSW5kZXg6IG51bWJlcixcclxuICAgICAgICByb3V0ZVBhcnRpdGlvbjogc3RyaW5nLFxyXG4gICAgICAgIGNsZWFyTnVtYmVyID0gdHJ1ZVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2l0ZUlkID0gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNlbGVjdGVkU2l0ZTtcclxuICAgICAgICBpZiAoIXNpdGVJZCB8fCAhcm91dGVQYXJ0aXRpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGVhck51bWJlcikge1xyXG4gICAgICAgICAgICAodGhpcy5saW5lc0Zvcm1BcnJheS5hdChsaW5lSW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KCdudW1iZXInKT8uc2V0VmFsdWUoJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nQXZhaWxhYmxlTnVtYmVycyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5nZXROdW1iZXJSYW5nZShTdHJpbmcoc2l0ZUlkKSwgcm91dGVQYXJ0aXRpb24pXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0F2YWlsYWJsZU51bWJlcnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hOdW1iZXJGaWx0ZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hOdW1iZXJGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuYXZhaWxhYmxlTnVtYmVycztcclxuICAgICAgICB0aGlzLmZpbHRlcmVkQXZhaWxhYmxlTnVtYmVyc0J5TGluZSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubWFwKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gU3RyaW5nKCh0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgnbnVtYmVyJyk/LnZhbHVlID8/ICcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyT3B0aW9ucyhudW1iZXJzLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5TnVtYmVyRmlsdGVyKGxpbmVJbmRleDogbnVtYmVyLCByYXc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hdmFpbGFibGVOdW1iZXJzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRBdmFpbGFibGVOdW1iZXJzQnlMaW5lW2xpbmVJbmRleF0gPSB2YWx1ZS5sZW5ndGhcclxuICAgICAgICAgICAgPyBzb3VyY2UuZmlsdGVyKG4gPT4gISFuICYmIG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSkpXHJcbiAgICAgICAgICAgIDogWy4uLnNvdXJjZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleDogbnVtYmVyLCByYXc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFJvdXRlUGFydGl0aW9uc0J5TGluZVtsaW5lSW5kZXhdID0gdmFsdWUubGVuZ3RoXHJcbiAgICAgICAgICAgID8gc291cmNlLmZpbHRlcihuID0+ICEhbiAmJiBuLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUpKVxyXG4gICAgICAgICAgICA6IFsuLi5zb3VyY2VdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyT3B0aW9ucyhzb3VyY2U6IHN0cmluZ1tdLCByYXc6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhdy50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gWy4uLnNvdXJjZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzb3VyY2UuZmlsdGVyKGl0ZW0gPT4gISFpdGVtICYmIGl0ZW0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXh0cmFjdERpcmVjdG9yeU51bWJlcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlSW5kZXggPSB0cmltbWVkLmluZGV4T2YoJyAnKTtcclxuICAgICAgICByZXR1cm4gc3BhY2VJbmRleCA+IC0xID8gdHJpbW1lZC5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCkgOiB0cmltbWVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlVXNlcklkQXN5bmNWYWxpZGF0b3IoKTogQXN5bmNWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuaXNMZGFwSW50ZWdyYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdXNlcklkID0gU3RyaW5nKGNvbnRyb2wudmFsdWUgPz8gJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l0ZUlkID0gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNlbGVjdGVkU2l0ZTtcclxuICAgICAgICAgICAgaWYgKCF1c2VySWQgfHwgIXNpdGVJZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aW1lcig1MDApLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrVXNlcklkRXhpc3RpbmcoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcoc2l0ZUlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQodXNlcklkKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiAoeyB1c2VySWRFeGlzdHM6IHRydWUgfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIjxhcHAtbG9hZGVyICpuZ0lmPVwibG9hZGluZ0F2YWlsYWJsZU51bWJlcnNcIj48L2FwcC1sb2FkZXI+XHJcbjxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLWNvbnRlbnRcIj5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJEZXRhaWxzRm9ybVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uc1wiPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3RpdGxlXCI+VXNlciBkZXRhaWxzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fcGFydFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5Vc2VyIElEPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlVzZXIgSURcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VySWRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwidXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVXNlciBJRCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy5oYXNFcnJvcigndXNlcklkRXhpc3RzJykgJiYgdXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBVc2VyIElEIGFscmVhZHkgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ1c2VySWRDaGVja1BlbmRpbmdcIj5DaGVja2luZyB1c2VyIElELi4uPC9tYXQtaGludD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+Rmlyc3QgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJGaXJzdCBOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3ROYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2ZpcnN0TmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdmaXJzdE5hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEZpcnN0IG5hbWUgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkxhc3QgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJMYXN0IE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdsYXN0TmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdsYXN0TmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgTGFzdCBuYW1lIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5FbWFpbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJFbWFpbFwiIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWQgJiYgdXNlckRldGFpbHNGb3JtLmdldCgnZW1haWwnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlckRldGFpbHNGb3JtLmdldCgnZW1haWwnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5FbWFpbCBpcyByZXF1aXJlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtYWlsJyk/Lmhhc0Vycm9yKCdlbWFpbCcpXCI+UGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5Vc2VyIFRlbXBsYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJVc2VyIFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZWxlY3RlZFRlbXBsYXRlTmFtZSB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3BhcnRcIj5cclxuICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJkZXRhaWxzLXVzZXItYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgdG9nZ2xlUG9zaXRpb249XCJiZWZvcmVcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5DaG9vc2UgYW4gZXhpc3Rpbmcgb3IgYSBMREFQIHVzZXI8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy11c2VyLWFjY29yZGlvbl9fY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1sZGFwLXNlYXJjaFwiIFtmb3JtR3JvdXBdPVwibGRhcFNlYXJjaEZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXNlYXJjaF9faW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cIm5ldmVyXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJxdWVyeVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaExkYXBVc2VycygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC1zZWFyY2hfX3NlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInF1ZXJ5VHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGxkYXBRdWVyeVR5cGVPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLWxpc3QgKm5nSWY9XCJzZWxlY3RlZExkYXBVc2VyXCIgY2xhc3M9XCJkZXRhaWxzLWxkYXAtc2VhcmNoX19jaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgcmVtb3ZhYmxlIChyZW1vdmVkKT1cIm9uUmVtb3ZlTGRhcFRhZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkTGRhcFVzZXIudXNlcmlkIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtc2VhcmNoX19idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGRhcExvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaExkYXBVc2VycygpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWxvYWRlciAqbmdJZj1cImxkYXBMb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFsZGFwTG9hZGluZyAmJiBsZGFwU2VhcmNoQXR0ZW1wdGVkICYmICFoYXNMZGFwVXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXRhYmxlX19lbXB0eVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBObyB1c2VycyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8dGFibGVcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFsZGFwTG9hZGluZyAmJiBoYXNMZGFwVXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC10YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyIElkPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cudXNlcmlkIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmaXJzdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Rmlyc3QgTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LmZpcnN0TmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFzdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+TGFzdCBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cubGFzdE5hbWUgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkVtYWlsPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cuZW1haWwgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFkZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BZGQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNMZGFwVXNlclJvd1NlbGVjdGVkKHJvdyk7IGVsc2UgZGVsZXRlTGRhcFVzZXJCdG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZV9fYWRkLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkTGRhcFVzZXIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgVXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWxldGVMZGFwVXNlckJ0bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZV9fYWRkLWJ0biBkZXRhaWxzLWxkYXAtdGFibGVfX2FkZC1idG4tLWRlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZUxkYXBVc2VyKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFRhYmxlQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFRhYmxlQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXBhZ2luYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWxkYXBMb2FkaW5nICYmIGhhc0xkYXBVc2Vyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtcGFnaW5hdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cImxkYXBUb3RhbENvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwibGRhcFBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnZUluZGV4XT1cImxkYXBQYWdlSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiW2xkYXBQYWdlU2l6ZV1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlUGFnZVNpemVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxkYXBMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZSk9XCJvbkxkYXBQYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvblwiPlxyXG4gICAgICAgIDxoMyBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX190aXRsZVwiPkxpbmVzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwibGluZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lLXJvdXRlLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibGluZS1yb3V0ZS1yb3dcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaW5lR3JvdXAgb2YgbGluZXNGb3JtQXJyYXkuY29udHJvbHM7IGxldCBpZHggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaWR4XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lLWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dCBsaW5lLXJvdXRlLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBoaWRlUmVxdWlyZWRNYXJrZXJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTGluZSBudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJsaW5lTnVtYmVyXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0IGxpbmUtcm91dGUtZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJuZXZlclwiXHJcbiAgICAgICAgICAgICAgICAgIGhpZGVSZXF1aXJlZE1hcmtlclxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGZvciBhIG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cIm51bWJlckF1dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJBdmFpbGFibGVOdW1iZXJzKGlkeCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgI251bWJlckF1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYW5lbFdpZHRoXT1cIidhdXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uTnVtYmVyU2VsZWN0ZWQoaWR4LCAkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldEZpbHRlcmVkTnVtYmVycyhpZHgpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJnZXRMaW5lR3JvdXAoaWR4KS5nZXQoJ251bWJlcicpPy5pbnZhbGlkICYmIGdldExpbmVHcm91cChpZHgpLmdldCgnbnVtYmVyJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBOdW1iZXIgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dCBsaW5lLXJvdXRlLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBoaWRlUmVxdWlyZWRNYXJrZXJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCByb3V0ZSBwYXJ0aXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJvdXRlUGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cInJvdXRlUGFydGl0aW9uQXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImZpbHRlclJvdXRlUGFydGl0aW9ucyhpZHgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNyb3V0ZVBhcnRpdGlvbkF1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblJvdXRlUGFydGl0aW9uU2VsZWN0ZWQoaWR4LCAkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvdXRlUGFydGl0aW9uIG9mIGdldEZpbHRlcmVkUm91dGVQYXJ0aXRpb25zKGlkeClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdXRlUGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3V0ZVBhcnRpdGlvbiB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0TGluZUdyb3VwKGlkeCkuZ2V0KCdyb3V0ZVBhcnRpdGlvbicpPy5pbnZhbGlkICYmIGdldExpbmVHcm91cChpZHgpLmdldCgncm91dGVQYXJ0aXRpb24nKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFJvdXRlIHBhcnRpdGlvbiBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25cIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fdGl0bGVcIj5EZXZpY2VzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwiZGV2aWNlc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZXMtcm93c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZHMgZGV0YWlscy1pbmxpbmUtZmllbGRzLS1mb3VyXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGV2aWNlR3JvdXAgb2YgZGV2aWNlc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGlkeCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpZHhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5EZXZpY2UgdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV2aWNlVHlwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPlByb3RvY29sPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm90b2NvbFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkJ1dHRvbiBUZW1wbGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYnV0dG9uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIG1hdFByZWZpeCAqbmdJZj1cImdldERldmljZU5hbWVQcmVmaXgoaWR4KSBhcyBkZXZpY2VQcmVmaXhcIj57eyBkZXZpY2VQcmVmaXggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdkZXZpY2VOYW1lJykgJiYgZ2V0RGV2aWNlR3JvdXAoaWR4KS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LmdldEVycm9yKCdkZXZpY2VOYW1lJyk/LmNhcHRpb24gfHwgZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGlkeCkgfHwgJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRldmljZSBuYW1lJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBOYW1lIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvblwiICpuZ0lmPVwiZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXkubGVuZ3RoXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3RpdGxlXCI+RGV2aWNlIHByb2ZpbGVzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwiZGV2aWNlUHJvZmlsZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2VzLXJvd3NcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRzIGRldGFpbHMtaW5saW5lLWZpZWxkcy0tZm91clwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2ZpbGVHcm91cCBvZiBkZXZpY2VQcm9maWxlc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGlkeCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpZHhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5EZXZpY2UgdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV2aWNlVHlwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPlByb3RvY29sPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm90b2NvbFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkJ1dHRvbiBUZW1wbGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYnV0dG9uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIG1hdFByZWZpeCAqbmdJZj1cImdldERldmljZVByb2ZpbGVOYW1lUHJlZml4KGlkeCkgYXMgcHJvZmlsZVByZWZpeFwiPnt7IHByb2ZpbGVQcmVmaXggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldERldmljZVByb2ZpbGVHcm91cChpZHgpLmdldCgnbmFtZScpPy5oYXNFcnJvcignZGV2aWNlTmFtZScpICYmIGdldERldmljZVByb2ZpbGVHcm91cChpZHgpLmdldCgnbmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGV2aWNlUHJvZmlsZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LmdldEVycm9yKCdkZXZpY2VOYW1lJyk/LmNhcHRpb24gfHwgZ2V0RGV2aWNlUHJvZmlsZU5hbWVWYWxpZGF0aW9uQ2FwdGlvbihpZHgpIHx8ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBkZXZpY2UgbmFtZScgfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbjwvc2VjdGlvbj5cclxuIl19
|
|
568
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1kZXRhaWxzLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3dpZGdldHMvdXNlci1jcmVhdGlvbi13aXphcmQvY29tcG9uZW50cy91c2VyLWRldGFpbHMtc3RlcC91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlci1jcmVhdGlvbi9zcmMvd2lkZ2V0cy91c2VyLWNyZWF0aW9uLXdpemFyZC9jb21wb25lbnRzL3VzZXItZGV0YWlscy1zdGVwL3VzZXItZGV0YWlscy1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQVFILFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFDSCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssR0FDUixNQUFNLE1BQU0sQ0FBQztBQVFkLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHL0UsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBTzFCLE1BQU0sT0FBTyx3QkFBd0I7SUEwQmpDLElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMs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Q1gsSUFBSSxDQUFDLHNCQUFzQjtpQkFDdEIsbUJBQW1CLENBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDZCxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNqRDtpQkFDQSxJQUFJLENBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNuQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQzdCLENBQ1IsRUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBQ04sQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7c0hBeHBCUSx3QkFBd0I7MEdBQXhCLHdCQUF3QiwyR0M3Q3JDLDZwbUJBMlhBOzRGRDlVYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksc0JBQXNCOytLQUt0QixjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEFic3RyYWN0Q29udHJvbCxcclxuICAgIEFzeW5jVmFsaWRhdG9yRm4sXHJcbiAgICBGb3JtQXJyYXksXHJcbiAgICBGb3JtQnVpbGRlcixcclxuICAgIEZvcm1Hcm91cCxcclxuICAgIFZhbGlkYXRpb25FcnJvcnMsXHJcbiAgICBWYWxpZGF0b3JGbixcclxuICAgIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQge1xyXG4gICAgY2F0Y2hFcnJvcixcclxuICAgIGRlYm91bmNlVGltZSxcclxuICAgIGZpbmFsaXplLFxyXG4gICAgbWFwLFxyXG4gICAgT2JzZXJ2YWJsZSxcclxuICAgIG9mLFxyXG4gICAgc3RhcnRXaXRoLFxyXG4gICAgU3ViamVjdCxcclxuICAgIHN3aXRjaE1hcCxcclxuICAgIHRha2UsXHJcbiAgICB0YWtlVW50aWwsXHJcbiAgICB0YXAsXHJcbiAgICB0aW1lcixcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIExkYXBRdWVyeVR5cGUsXHJcbiAgICBMZGFwVXNlcnNUYWJsZVJlc3BvbnNlLFxyXG4gICAgTGlzdFVzZXJJbnRlcmZhY2UsXHJcbiAgICBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSxcclxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3VzZXItY3JlYXRpb24td2l6YXJkLmludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3VzZXItY3JlYXRpb24tYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBkZXZpY2VOYW1lSGFzRHluYW1pY1Rva2VucyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2RldmljZS1uYW1lLWR5bmFtaWMtdG9rZW5zJztcclxuaW1wb3J0IHsgZGV2aWNlTmFtZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2RldmljZS1uYW1lLXZhbGlkYXRpb24nO1xyXG5pbXBvcnQgeyBVc2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZSc7XHJcblxyXG5jb25zdCBMREFQX1BBR0VfU0laRSA9IDEwO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3RrLXVzZXItZGV0YWlscy1zdGVwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi91c2VyLWRldGFpbHMtc3RlcC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckRldGFpbHNTdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQE91dHB1dCgpIHZhbGlkaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICAgIHVzZXJEZXRhaWxzRm9ybTogRm9ybUdyb3VwO1xyXG4gICAgbGRhcFNlYXJjaEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICB1c2VySWRDaGVja1BlbmRpbmcgPSBmYWxzZTtcclxuICAgIGxvYWRpbmdBdmFpbGFibGVOdW1iZXJzID0gZmFsc2U7XHJcbiAgICBsZGFwTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgbGRhcFNlYXJjaEF0dGVtcHRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHJlYWRvbmx5IGxkYXBQYWdlU2l6ZSA9IExEQVBfUEFHRV9TSVpFO1xyXG4gICAgbGRhcFBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgcmVhZG9ubHkgbGRhcFF1ZXJ5VHlwZU9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IExkYXBRdWVyeVR5cGUgfVtdID0gW1xyXG4gICAgICAgIHsgbGFiZWw6ICdVc2VyIElEJywgdmFsdWU6ICd1c2VySWQnIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ0ZpcnN0IE5hbWUnLCB2YWx1ZTogJ2ZpcnN0TmFtZScgfSxcclxuICAgICAgICB7IGxhYmVsOiAnTGFzdCBOYW1lJywgdmFsdWU6ICdsYXN0TmFtZScgfSxcclxuICAgIF07XHJcblxyXG4gICAgZmlsdGVyZWRBdmFpbGFibGVOdW1iZXJzQnlMaW5lOiBzdHJpbmdbXVtdID0gW107XHJcbiAgICBmaWx0ZXJlZFJvdXRlUGFydGl0aW9uc0J5TGluZTogc3RyaW5nW11bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VySWRBc3luY1ZhbGlkYXRvciA9IHRoaXMuY3JlYXRlVXNlcklkQXN5bmNWYWxpZGF0b3IoKTtcclxuXHJcbiAgICBnZXQgbGluZXNGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KCdsaW5lcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV2aWNlc0Zvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ2RldmljZXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRldmljZVByb2ZpbGVzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgnZGV2aWNlUHJvZmlsZXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGVkTGRhcFVzZXIoKTogTGlzdFVzZXJJbnRlcmZhY2UgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLnNlbGVjdGVkTGRhcFVzZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxkYXBUb3RhbENvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5sZGFwVXNlcnNUb3RhbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaGFzTGRhcFVzZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UubGRhcFVzZXJzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ3JlYXRpb25BcGlTZXJ2aWNlOiBVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlOiBVc2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmxkYXBTZWFyY2hGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHF1ZXJ5VmFsdWU6IFsnJ10sXHJcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogWyd1c2VySWQnIGFzIExkYXBRdWVyeVR5cGVdLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy51c2VySWRBc3luY1ZhbGlkYXRvcl1dLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBlbWFpbDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF1dLFxyXG4gICAgICAgICAgICBsaW5lczogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgICAgICAgIGRldmljZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICAgICAgICBkZXZpY2VQcm9maWxlczogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2F2ZWRGb3JtVmFsdWUgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UudXNlckRldGFpbHNGb3JtVmFsdWU7XHJcbiAgICAgICAgY29uc3QgaXNSZXN0b3JpbmdQcmV2aW91c0VudHJ5ID0gISFzYXZlZEZvcm1WYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKCFpc1Jlc3RvcmluZ1ByZXZpb3VzRW50cnkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldExkYXBTZWFyY2hGb3JtKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJ1aWxkRHluYW1pY0Zvcm1BcnJheXMoc2F2ZWRGb3JtVmFsdWUpO1xyXG4gICAgICAgIGlmIChpc1Jlc3RvcmluZ1ByZXZpb3VzRW50cnkpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXRjaFVzZXJGaWVsZHNGcm9tU2F2ZWRWYWx1ZShzYXZlZEZvcm1WYWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYXRjaFVzZXJGaWVsZHNGcm9tU2VydmljZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0TGluZUZpbHRlcnMoKTtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybVN5bmMoKTtcclxuICAgICAgICB0aGlzLnNldHVwVmFsaWRpdHlFbWl0dGVyKCk7XHJcbiAgICAgICAgdGhpcy5mZXRjaEluaXRpYWxBdmFpbGFibGVOdW1iZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYXBwbHlEZXZpY2VOYW1lVmFsaWRhdG9ycygpO1xyXG5cclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZGV2aWNlRGVmYXVsdHNMb2FkZWQkXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RGV2aWNlTmFtZVZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmlzTGRhcEludGVncmF0ZWQgJiYgdGhpcy5zZWxlY3RlZExkYXBVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlMZGFwSW50ZWdyYXRlZEZvcm1TdGF0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTdGVwVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckRldGFpbHNGb3JtLnZhbGlkICYmICF0aGlzLnVzZXJJZENoZWNrUGVuZGluZztcclxuICAgIH1cclxuXHJcbiAgICBtYXJrQWxsQXNUb3VjaGVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN5bmNUb1NlcnZpY2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmFwcGx5VXNlckRldGFpbHNGb3JtVmFsdWUodGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0UmF3VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGluZUdyb3VwKGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZVByb2ZpbGVHcm91cChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VQcm9maWxlc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZU5hbWVQcmVmaXgoaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZ2V0RGV2aWNlTmFtZVByZWZpeChpbmRleCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZVByb2ZpbGVOYW1lUHJlZml4KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmdldERldmljZU5hbWVQcmVmaXgoaW5kZXgsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZU5hbWVWYWxpZGF0aW9uQ2FwdGlvbihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmdldERldmljZU5hbWVWYWxpZGF0aW9uQ2FwdGlvbihpbmRleCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZVByb2ZpbGVOYW1lVmFsaWRhdGlvbkNhcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5nZXREZXZpY2VOYW1lVmFsaWRhdGlvbkNhcHRpb24oaW5kZXgsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRGV2aWNlTmFtZVJlYWRvbmx5KGluZGV4OiBudW1iZXIsIGlzUHJvZmlsZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGRldmljZSA9IGlzUHJvZmlsZVxyXG4gICAgICAgICAgICA/IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5kZXZpY2VQcm9maWxlc1tpbmRleF1cclxuICAgICAgICAgICAgOiB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZGV2aWNlc1tpbmRleF07XHJcbiAgICAgICAgcmV0dXJuIGRldmljZU5hbWVIYXNEeW5hbWljVG9rZW5zKGRldmljZT8ubmFtZSA/PyBkZXZpY2U/Lm5ld05hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbHRlcmVkTnVtYmVycyhsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEF2YWlsYWJsZU51bWJlcnNCeUxpbmVbbGluZUluZGV4XSA/PyBbXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJlZFJvdXRlUGFydGl0aW9ucyhsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFJvdXRlUGFydGl0aW9uc0J5TGluZVtsaW5lSW5kZXhdID8/IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlckF2YWlsYWJsZU51bWJlcnMobGluZUluZGV4OiBudW1iZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGwpPy52YWx1ZSB8fCAnJztcclxuICAgICAgICB0aGlzLmFwcGx5TnVtYmVyRmlsdGVyKGxpbmVJbmRleCwgcmF3KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJSb3V0ZVBhcnRpdGlvbnMobGluZUluZGV4OiBudW1iZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGwpPy52YWx1ZSB8fCAnJztcclxuICAgICAgICB0aGlzLmFwcGx5Um91dGVQYXJ0aXRpb25GaWx0ZXIobGluZUluZGV4LCByYXcpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUm91dGVQYXJ0aXRpb25TZWxlY3RlZChsaW5lSW5kZXg6IG51bWJlciwgcm91dGVQYXJ0aXRpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxpbmVHcm91cCA9IHRoaXMubGluZXNGb3JtQXJyYXkuYXQobGluZUluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgbGluZUdyb3VwLmdldCgncm91dGVQYXJ0aXRpb24nKT8uc2V0VmFsdWUocm91dGVQYXJ0aXRpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBsaW5lR3JvdXAuZ2V0KCdudW1iZXInKT8uc2V0VmFsdWUoJycpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlSb3V0ZVBhcnRpdGlvbkZpbHRlcihsaW5lSW5kZXgsIHJvdXRlUGFydGl0aW9uKTtcclxuICAgICAgICB0aGlzLmxvYWRBdmFpbGFibGVOdW1iZXJzRm9yTGluZShsaW5lSW5kZXgsIHJvdXRlUGFydGl0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk51bWJlclNlbGVjdGVkKGxpbmVJbmRleDogbnVtYmVyLCBudW1iZXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxpbmVHcm91cCA9IHRoaXMubGluZXNGb3JtQXJyYXkuYXQobGluZUluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheU51bWJlciA9IHRoaXMuZXh0cmFjdERpcmVjdG9yeU51bWJlcihudW1iZXIpO1xyXG4gICAgICAgIGxpbmVHcm91cC5nZXQoJ251bWJlcicpPy5zZXRWYWx1ZShkaXNwbGF5TnVtYmVyLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kZXZpY2VzRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKF8sIGRldmljZUluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRldmljZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5kZXZpY2VzW2RldmljZUluZGV4XTtcclxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gZGV2aWNlPy5uZXdOYW1lID8/ICcnO1xyXG4gICAgICAgICAgICBpZiAoIXRlbXBsYXRlTmFtZSB8fCAhdGVtcGxhdGVOYW1lLmluY2x1ZGVzKCdbRE5dJykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWROYW1lID0gdGVtcGxhdGVOYW1lLnJlcGxhY2UoL1xcW0ROXFxdL2csIGRpc3BsYXlOdW1iZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBkZXZpY2VHcm91cCA9IHRoaXMuZ2V0RGV2aWNlR3JvdXAoZGV2aWNlSW5kZXgpO1xyXG4gICAgICAgICAgICBjb25zdCBuYW1lQ29udHJvbCA9IGRldmljZUdyb3VwLmdldCgnbmFtZScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFuYW1lQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobmFtZUNvbnRyb2wudmFsdWUgPT09IHJlc29sdmVkTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBuYW1lQ29udHJvbC5zZXRWYWx1ZShyZXNvbHZlZE5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaExkYXBVc2VycyhwYWdlSW5kZXggPSAwKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlWYWx1ZSA9IFN0cmluZyh0aGlzLmxkYXBTZWFyY2hGb3JtLmdldCgncXVlcnlWYWx1ZScpPy52YWx1ZSkudHJpbSgpIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBzaXRlSWQgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0ZWRTaXRlO1xyXG5cclxuICAgICAgICBpZiAoIXNpdGVJZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2V0TGRhcFVzZXJzUmVzdWx0KFtdLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5sZGFwUGFnZUluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5sZGFwU2VhcmNoQXR0ZW1wdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGRhcFBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgICAgICBjb25zdCBxdWVyeVR5cGUgPSB0aGlzLmxkYXBTZWFyY2hGb3JtLmdldCgncXVlcnlUeXBlJyk/LnZhbHVlIGFzIExkYXBRdWVyeVR5cGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgc2l6ZTogU3RyaW5nKExEQVBfUEFHRV9TSVpFKSxcclxuICAgICAgICAgICAgcGFnZTogU3RyaW5nKHBhZ2VJbmRleCksXHJcbiAgICAgICAgICAgIGRldmljZWxlc3M6ICd0cnVlJyxcclxuICAgICAgICAgICAgcXVlcnl0eXBlOiBxdWVyeVR5cGUsXHJcbiAgICAgICAgICAgIHdpdGhFbWFpbE9ubHk6ICd0cnVlJyxcclxuICAgICAgICAgICAgcXVlcnl2YWx1ZTogcXVlcnlWYWx1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmxkYXBMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgLmdldExkYXBVc2VycyhTdHJpbmcoc2l0ZUlkKSwgcGFyYW1zKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJlczogTGRhcFVzZXJzVGFibGVSZXNwb25zZSkgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyczogcmVzPy5wYWdlRGF0YSA/PyBbXSxcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogcmVzPy50b3RhbCA/PyAwLFxyXG4gICAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IHVzZXJzOiBbXSwgdG90YWw6IDAgfSkpLFxyXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGRhcExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyB1c2VycywgdG90YWwgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZGFwU2VhcmNoQXR0ZW1wdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZXRMZGFwVXNlcnNSZXN1bHQodXNlcnMsIHRvdGFsKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25MZGFwUGFnZUNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hMZGFwVXNlcnMoZXZlbnQucGFnZUluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZExkYXBVc2VyKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0TGRhcFVzZXIocm93KTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgdXNlcklkOiByb3cudXNlcmlkLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IHJvdy5maXJzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiByb3cubGFzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGVtYWlsOiByb3cuZW1haWwgPz8gJycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUxkYXBJbnRlZ3JhdGVkRm9ybVN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZUxkYXBVc2VyKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5pc0xkYXBVc2VyUm93U2VsZWN0ZWQocm93KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xlYXJMZGFwU2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25SZW1vdmVMZGFwVGFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXJMZGFwU2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZGFwVXNlclJvd1NlbGVjdGVkKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2xlYXJMZGFwU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5jbGVhckxkYXBVc2VyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgIHVzZXJJZDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgZW1haWw6ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzdG9yZU1hbnVhbEVudHJ5Rm9ybVN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5TGRhcEludGVncmF0ZWRGb3JtU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRVc2VySWRlbnRpdHlGaWVsZHNSZWFkb25seSh0cnVlKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZVVzZXJJZEFzeW5jVmFsaWRhdG9yKGZhbHNlKTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc3RvcmVNYW51YWxFbnRyeUZvcm1TdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFVzZXJJZGVudGl0eUZpZWxkc1JlYWRvbmx5KGZhbHNlKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZVVzZXJJZEFzeW5jVmFsaWRhdG9yKHRydWUpO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLmdldCgndXNlcklkJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFVzZXJJZGVudGl0eUZpZWxkc1JlYWRvbmx5KHJlYWRvbmx5OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgWyd1c2VySWQnLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ2VtYWlsJ10uZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy51c2VyRGV0YWlsc0Zvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICAgICAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZWFkb25seSkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9nZ2xlVXNlcklkQXN5bmNWYWxpZGF0b3IoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpO1xyXG4gICAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKFt0aGlzLnVzZXJJZEFzeW5jVmFsaWRhdG9yXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0dXBWYWxpZGl0eUVtaXR0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShzdGFydFdpdGgodGhpcy51c2VyRGV0YWlsc0Zvcm0uc3RhdHVzKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZW1pdFZhbGlkaXR5KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZW1pdFZhbGlkaXR5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsaWRpdHlDaGFuZ2UuZW1pdCh0aGlzLmlzU3RlcFZhbGlkKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGREeW5hbWljRm9ybUFycmF5cyhzYXZlZEZvcm1WYWx1ZT86IFVzZXJEZXRhaWxzRm9ybVZhbHVlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2U7XHJcbiAgICAgICAgY29uc3QgbGluZXNBcnJheSA9IHRoaXMubGluZXNGb3JtQXJyYXk7XHJcbiAgICAgICAgY29uc3QgZGV2aWNlc0FycmF5ID0gdGhpcy5kZXZpY2VzRm9ybUFycmF5O1xyXG4gICAgICAgIGNvbnN0IHByb2ZpbGVzQXJyYXkgPSB0aGlzLmRldmljZVByb2ZpbGVzRm9ybUFycmF5O1xyXG5cclxuICAgICAgICB3aGlsZSAobGluZXNBcnJheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGluZXNBcnJheS5yZW1vdmVBdCgwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGRldmljZXNBcnJheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGV2aWNlc0FycmF5LnJlbW92ZUF0KDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAocHJvZmlsZXNBcnJheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcHJvZmlsZXNBcnJheS5yZW1vdmVBdCgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcnZpY2UubGluZXMuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZWRMaW5lID0gc2F2ZWRGb3JtVmFsdWU/LmxpbmVzPy5baW5kZXhdO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsaW5lLmRpcmVjdG9yeU51bWJlcj8udGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgc2F2ZWRMaW5lPy5udW1iZXIgPz8gbGluZS5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jcmVhdGVBdmFpbGFibGVOdW1iZXJWYWxpZGF0b3IoKV0sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb246IFtcclxuICAgICAgICAgICAgICAgICAgICBzYXZlZExpbmU/LnJvdXRlUGFydGl0aW9uID8/IGxpbmUuZGlyZWN0b3J5TnVtYmVyPy5yb3V0ZVBhcnRpdGlvbk5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBsaW5lc0FycmF5LnB1c2gobGluZUdyb3VwKTtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cExpbmVMaXN0ZW5lcnMoaW5kZXgsIGxpbmVHcm91cCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZpY2UuZGV2aWNlcy5mb3JFYWNoKChkZXZpY2UsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhdmVkRGV2aWNlID0gc2F2ZWRGb3JtVmFsdWU/LmRldmljZXM/LltpbmRleF07XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVSZWFkb25seSA9IGRldmljZU5hbWVIYXNEeW5hbWljVG9rZW5zKGRldmljZS5uYW1lID8/IGRldmljZS5uZXdOYW1lKTtcclxuICAgICAgICAgICAgZGV2aWNlc0FycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBbeyB2YWx1ZTogZGV2aWNlLmRldmljZVR5cGUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sOiBbeyB2YWx1ZTogZGV2aWNlLnByb3RvY29sIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogW3sgdmFsdWU6IGRldmljZS5idXR0b25UZW1wbGF0ZSB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogW3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzYXZlZERldmljZT8ubmFtZSA/PyBkZXZpY2UubmFtZSA/PyBkZXZpY2UubmV3TmFtZSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBuYW1lUmVhZG9ubHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVSZWFkb25seSA/IFtdIDogdGhpcy5idWlsZERldmljZU5hbWVWYWxpZGF0b3JzKGluZGV4LCBmYWxzZSksXHJcbiAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZpY2UuZGV2aWNlUHJvZmlsZXMuZm9yRWFjaCgocHJvZmlsZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZWRQcm9maWxlID0gc2F2ZWRGb3JtVmFsdWU/LmRldmljZVByb2ZpbGVzPy5baW5kZXhdO1xyXG4gICAgICAgICAgICBjb25zdCBuYW1lUmVhZG9ubHkgPSBkZXZpY2VOYW1lSGFzRHluYW1pY1Rva2Vucyhwcm9maWxlLm5hbWUgPz8gcHJvZmlsZS5uZXdOYW1lKTtcclxuICAgICAgICAgICAgcHJvZmlsZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogW3sgdmFsdWU6IHByb2ZpbGUuZGV2aWNlVHlwZSB8fCAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IFt7IHZhbHVlOiBwcm9maWxlLnByb3RvY29sIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogW3sgdmFsdWU6IHByb2ZpbGUuYnV0dG9uVGVtcGxhdGUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvZmlsZT8ubmFtZSA/PyBwcm9maWxlLm5hbWUgPz8gcHJvZmlsZS5uZXdOYW1lID8/ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG5hbWVSZWFkb25seSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVJlYWRvbmx5ID8gW10gOiB0aGlzLmJ1aWxkRGV2aWNlTmFtZVZhbGlkYXRvcnMoaW5kZXgsIGZhbHNlKSxcclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkRGV2aWNlTmFtZVZhbGlkYXRvcnMoZGV2aWNlSW5kZXg6IG51bWJlciwgaXNQcm9maWxlOiBib29sZWFuKTogVmFsaWRhdG9yRm5bXSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IGlzUHJvZmlsZSA/IFtdIDogW1ZhbGlkYXRvcnMucmVxdWlyZWRdO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25PcHRpb25zKFxyXG4gICAgICAgICAgICBkZXZpY2VJbmRleCxcclxuICAgICAgICAgICAgaXNQcm9maWxlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goZGV2aWNlTmFtZVZhbGlkYXRvcihvcHRpb25zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwbHlEZXZpY2VOYW1lVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRldmljZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNEZXZpY2VOYW1lUmVhZG9ubHkoaW5kZXgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVDb250cm9sID0gdGhpcy5nZXREZXZpY2VHcm91cChpbmRleCkuZ2V0KCduYW1lJyk7XHJcbiAgICAgICAgICAgIG5hbWVDb250cm9sPy5zZXRWYWxpZGF0b3JzKHRoaXMuYnVpbGREZXZpY2VOYW1lVmFsaWRhdG9ycyhpbmRleCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgbmFtZUNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKF8sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRGV2aWNlTmFtZVJlYWRvbmx5KGluZGV4LCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVDb250cm9sID0gdGhpcy5nZXREZXZpY2VQcm9maWxlR3JvdXAoaW5kZXgpLmdldCgnbmFtZScpO1xyXG4gICAgICAgICAgICBuYW1lQ29udHJvbD8uc2V0VmFsaWRhdG9ycyh0aGlzLmJ1aWxkRGV2aWNlTmFtZVZhbGlkYXRvcnMoaW5kZXgsIHRydWUpKTtcclxuICAgICAgICAgICAgbmFtZUNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRMZGFwU2VhcmNoRm9ybSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxkYXBTZWFyY2hGb3JtLnJlc2V0KHtcclxuICAgICAgICAgICAgcXVlcnlWYWx1ZTogJycsXHJcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogJ3VzZXJJZCcgYXMgTGRhcFF1ZXJ5VHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmxkYXBTZWFyY2hBdHRlbXB0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxkYXBQYWdlSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXRjaFVzZXJGaWVsZHNGcm9tU2F2ZWRWYWx1ZShzYXZlZDogVXNlckRldGFpbHNGb3JtVmFsdWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgdXNlcklkOiBzYXZlZC51c2VySWQgfHwgJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogc2F2ZWQuZmlyc3ROYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogc2F2ZWQubGFzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGVtYWlsOiBzYXZlZC5lbWFpbCB8fCAnJyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBhdGNoVXNlckZpZWxkc0Zyb21TZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2U7XHJcbiAgICAgICAgY29uc3QgZW5kVXNlciA9IHNlcnZpY2UuZW5kVXNlcjtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgdXNlcklkOiBlbmRVc2VyPy51c2VyaWQgfHwgc2VydmljZS51c2VyRGV0YWlsc0Zvcm0udXNlcklkIHx8ICcnLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IGVuZFVzZXI/LmZpcnN0TmFtZSB8fCBzZXJ2aWNlLnVzZXJEZXRhaWxzRm9ybS5maXJzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBlbmRVc2VyPy5sYXN0TmFtZSB8fCBzZXJ2aWNlLnVzZXJEZXRhaWxzRm9ybS5sYXN0TmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgZW1haWw6IGVuZFVzZXI/LmVtYWlsIHx8IHNlcnZpY2UudXNlckRldGFpbHNGb3JtLmVtYWlsIHx8ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cExpbmVMaXN0ZW5lcnMobGluZUluZGV4OiBudW1iZXIsIGxpbmVHcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgbGluZUdyb3VwXHJcbiAgICAgICAgICAgIC5nZXQoJ3JvdXRlUGFydGl0aW9uJylcclxuICAgICAgICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlSb3V0ZVBhcnRpdGlvbkZpbHRlcihsaW5lSW5kZXgsIFN0cmluZyh2YWx1ZSA/PyAnJykpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGluZUdyb3VwXHJcbiAgICAgICAgICAgIC5nZXQoJ251bWJlcicpXHJcbiAgICAgICAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDE1MCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TnVtYmVyRmlsdGVyKGxpbmVJbmRleCwgU3RyaW5nKHZhbHVlID8/ICcnKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdExpbmVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uucm91dGVQYXJ0aXRpb25PcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSB0aGlzLnVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2UuYXZhaWxhYmxlTnVtYmVycztcclxuICAgICAgICB0aGlzLmZpbHRlcmVkUm91dGVQYXJ0aXRpb25zQnlMaW5lID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5tYXAoKF8sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBTdHJpbmcoXHJcbiAgICAgICAgICAgICAgICAodGhpcy5saW5lc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoJ3JvdXRlUGFydGl0aW9uJyk/LnZhbHVlID8/ICcnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlck9wdGlvbnMocGFydGl0aW9ucywgY3VycmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEF2YWlsYWJsZU51bWJlcnNCeUxpbmUgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IFN0cmluZygodGhpcy5saW5lc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoJ251bWJlcicpPy52YWx1ZSA/PyAnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlck9wdGlvbnMobnVtYmVycywgY3VycmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cEZvcm1TeW5jKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMjAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hcHBseVVzZXJEZXRhaWxzRm9ybVZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtLmdldFJhd1ZhbHVlKClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmV0Y2hJbml0aWFsQXZhaWxhYmxlTnVtYmVycygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmaXJzdFBhcnRpdGlvbiA9XHJcbiAgICAgICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgPyBTdHJpbmcoKHRoaXMubGluZXNGb3JtQXJyYXkuYXQoMCkgYXMgRm9ybUdyb3VwKS5nZXQoJ3JvdXRlUGFydGl0aW9uJyk/LnZhbHVlID8/ICcnKS50cmltKClcclxuICAgICAgICAgICAgICAgIDogdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmZpcnN0TGluZVJvdXRlUGFydGl0aW9uIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zaXRlRGVmYXVsdFJvdXRlUGFydGl0aW9uIHx8XHJcbiAgICAgICAgICAgICAgICAgICcnO1xyXG5cclxuICAgICAgICBpZiAoZmlyc3RQYXJ0aXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkQXZhaWxhYmxlTnVtYmVyc0ZvckxpbmUoMCwgZmlyc3RQYXJ0aXRpb24sIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkQXZhaWxhYmxlTnVtYmVyc0ZvckxpbmUoXHJcbiAgICAgICAgbGluZUluZGV4OiBudW1iZXIsXHJcbiAgICAgICAgcm91dGVQYXJ0aXRpb246IHN0cmluZyxcclxuICAgICAgICBjbGVhck51bWJlciA9IHRydWVcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNpdGVJZCA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZWxlY3RlZFNpdGU7XHJcbiAgICAgICAgaWYgKCFzaXRlSWQgfHwgIXJvdXRlUGFydGl0aW9uLnRyaW0oKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xlYXJOdW1iZXIpIHtcclxuICAgICAgICAgICAgKHRoaXMubGluZXNGb3JtQXJyYXkuYXQobGluZUluZGV4KSBhcyBGb3JtR3JvdXApLmdldCgnbnVtYmVyJyk/LnNldFZhbHVlKCcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGluZ0F2YWlsYWJsZU51bWJlcnMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZVxyXG4gICAgICAgICAgICAuZ2V0TnVtYmVyUmFuZ2UoU3RyaW5nKHNpdGVJZCksIHJvdXRlUGFydGl0aW9uKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSxcclxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdBdmFpbGFibGVOdW1iZXJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoTnVtYmVyRmlsdGVycygpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWZyZXNoTnVtYmVyRmlsdGVycygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBudW1iZXJzID0gdGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmF2YWlsYWJsZU51bWJlcnM7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEF2YWlsYWJsZU51bWJlcnNCeUxpbmUgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoXywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IFN0cmluZygodGhpcy5saW5lc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoJ251bWJlcicpPy52YWx1ZSA/PyAnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlck9wdGlvbnMobnVtYmVycywgY3VycmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKGxpbmVHcm91cCA9PiB7XHJcbiAgICAgICAgICAgIGxpbmVHcm91cC5nZXQoJ251bWJlcicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5TnVtYmVyRmlsdGVyKGxpbmVJbmRleDogbnVtYmVyLCByYXc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hdmFpbGFibGVOdW1iZXJzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRBdmFpbGFibGVOdW1iZXJzQnlMaW5lW2xpbmVJbmRleF0gPSB2YWx1ZS5sZW5ndGhcclxuICAgICAgICAgICAgPyBzb3VyY2UuZmlsdGVyKG4gPT4gISFuICYmIG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSkpXHJcbiAgICAgICAgICAgIDogWy4uLnNvdXJjZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBseVJvdXRlUGFydGl0aW9uRmlsdGVyKGxpbmVJbmRleDogbnVtYmVyLCByYXc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFJvdXRlUGFydGl0aW9uc0J5TGluZVtsaW5lSW5kZXhdID0gdmFsdWUubGVuZ3RoXHJcbiAgICAgICAgICAgID8gc291cmNlLmZpbHRlcihuID0+ICEhbiAmJiBuLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUpKVxyXG4gICAgICAgICAgICA6IFsuLi5zb3VyY2VdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyT3B0aW9ucyhzb3VyY2U6IHN0cmluZ1tdLCByYXc6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhdy50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gWy4uLnNvdXJjZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzb3VyY2UuZmlsdGVyKGl0ZW0gPT4gISFpdGVtICYmIGl0ZW0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlQXZhaWxhYmxlTnVtYmVyVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoY29udHJvbC52YWx1ZSA/PyAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbnVtYmVycyA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5hdmFpbGFibGVOdW1iZXJzIHx8IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBpc0F2YWlsYWJsZU51bWJlciA9IG51bWJlcnMuc29tZShudW1iZXIgPT4gdGhpcy5leHRyYWN0RGlyZWN0b3J5TnVtYmVyKG51bWJlcikgPT09IHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzQXZhaWxhYmxlTnVtYmVyID8gbnVsbCA6IHsgYXZhaWxhYmxlTnVtYmVyOiB0cnVlIH07XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3REaXJlY3RvcnlOdW1iZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcclxuICAgICAgICBjb25zdCBzcGFjZUluZGV4ID0gdHJpbW1lZC5pbmRleE9mKCcgJyk7XHJcbiAgICAgICAgcmV0dXJuIHNwYWNlSW5kZXggPiAtMSA/IHRyaW1tZWQuc3Vic3RyaW5nKDAsIHNwYWNlSW5kZXgpIDogdHJpbW1lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVVzZXJJZEFzeW5jVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy51c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmlzTGRhcEludGVncmF0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IFN0cmluZyhjb250cm9sLnZhbHVlID8/ICcnKS50cmltKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpdGVJZCA9IHRoaXMudXNlckNyZWF0aW9uV2l6YXJkU2VydmljZS5zZWxlY3RlZFNpdGU7XHJcbiAgICAgICAgICAgIGlmICghdXNlcklkIHx8ICFzaXRlSWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVzZXJJZENoZWNrUGVuZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGltZXIoNTAwKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25BcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja1VzZXJJZEV4aXN0aW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKHNpdGVJZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgdXNlcklkRXhpc3RzOiB0cnVlIH0pKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcklkQ2hlY2tQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0VmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8YXBwLWxvYWRlciAqbmdJZj1cImxvYWRpbmdBdmFpbGFibGVOdW1iZXJzXCI+PC9hcHAtbG9hZGVyPlxyXG48c2VjdGlvbiBjbGFzcz1cImRldGFpbHMtc3RlcC1jb250ZW50XCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ1c2VyRGV0YWlsc0Zvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbnNcIj5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvblwiPlxyXG4gICAgICAgIDxoMyBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX190aXRsZVwiPlVzZXIgZGV0YWlsczwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19jb250ZW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3BhcnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+VXNlciBJRDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJVc2VyIElEXCIgZm9ybUNvbnRyb2xOYW1lPVwidXNlcklkXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiB1c2VyRGV0YWlsc0Zvcm0uZ2V0KCd1c2VySWQnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFVzZXIgSUQgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ1c2VyRGV0YWlsc0Zvcm0uZ2V0KCd1c2VySWQnKT8uaGFzRXJyb3IoJ3VzZXJJZEV4aXN0cycpICYmIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ3VzZXJJZCcpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVXNlciBJRCBhbHJlYWR5IGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwidXNlcklkQ2hlY2tQZW5kaW5nXCI+Q2hlY2tpbmcgdXNlciBJRC4uLjwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkZpcnN0IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRmlyc3QgTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdmaXJzdE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgdXNlckRldGFpbHNGb3JtLmdldCgnZmlyc3ROYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBGaXJzdCBuYW1lIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5MYXN0IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTGFzdCBOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwidXNlckRldGFpbHNGb3JtLmdldCgnbGFzdE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgdXNlckRldGFpbHNGb3JtLmdldCgnbGFzdE5hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIExhc3QgbmFtZSBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+RW1haWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGV0YWlscy1zdGVwLWlucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdlbWFpbCcpPy5pbnZhbGlkICYmIHVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtYWlsJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZXJEZXRhaWxzRm9ybS5nZXQoJ2VtYWlsJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+RW1haWwgaXMgcmVxdWlyZWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VyRGV0YWlsc0Zvcm0uZ2V0KCdlbWFpbCcpPy5oYXNFcnJvcignZW1haWwnKVwiPlBsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRfX2xhYmVsXCI+VXNlciBUZW1wbGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVXNlciBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uuc2VsZWN0ZWRUZW1wbGF0ZU5hbWUgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19wYXJ0XCI+XHJcbiAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGNsYXNzPVwiZGV0YWlscy11c2VyLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIHRvZ2dsZVBvc2l0aW9uPVwiYmVmb3JlXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+Q2hvb3NlIGFuIGV4aXN0aW5nIG9yIGEgTERBUCB1c2VyPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtdXNlci1hY2NvcmRpb25fX2NvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtbGRhcC1zZWFyY2hcIiBbZm9ybUdyb3VwXT1cImxkYXBTZWFyY2hGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC1zZWFyY2hfX2lucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJuZXZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicXVlcnlWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hMZGFwVXNlcnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtc2VhcmNoX19zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cIm5ldmVyXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJxdWVyeVR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBsZGFwUXVlcnlUeXBlT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0ICpuZ0lmPVwic2VsZWN0ZWRMZGFwVXNlclwiIGNsYXNzPVwiZGV0YWlscy1sZGFwLXNlYXJjaF9fY2hpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIHJlbW92YWJsZSAocmVtb3ZlZCk9XCJvblJlbW92ZUxkYXBUYWcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZExkYXBVc2VyLnVzZXJpZCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXNlYXJjaF9fYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxkYXBMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hMZGFwVXNlcnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU2VhcmNoXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJsZGFwTG9hZGluZ1wiPjwvYXBwLWxvYWRlcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxwXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbGRhcExvYWRpbmcgJiYgbGRhcFNlYXJjaEF0dGVtcHRlZCAmJiAhaGFzTGRhcFVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtbGRhcC10YWJsZV9fZW1wdHlcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgTm8gdXNlcnMgZm91bmRcclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbGRhcExvYWRpbmcgJiYgaGFzTGRhcFVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXQtdGFibGVcclxuICAgICAgICAgICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJ1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmxkYXBVc2Vyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VySWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+VXNlciBJZDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LnVzZXJpZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZmlyc3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkZpcnN0IE5hbWU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy5maXJzdE5hbWUgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkxhc3QgTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93Lmxhc3ROYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJlbWFpbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5FbWFpbDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LmVtYWlsIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+QWRkPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3cpOyBlbHNlIGRlbGV0ZUxkYXBVc2VyQnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtdGFibGVfX2FkZC1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZExkYXBVc2VyKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIFVzZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVsZXRlTGRhcFVzZXJCdG4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWxkYXAtdGFibGVfX2FkZC1idG4gZGV0YWlscy1sZGFwLXRhYmxlX19hZGQtYnRuLS1kZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVMZGFwVXNlcihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJ1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmxkYXBUYWJsZUNvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiB1c2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlLmxkYXBUYWJsZUNvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1wYWdpbmF0b3JcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFsZGFwTG9hZGluZyAmJiBoYXNMZGFwVXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1sZGFwLXBhZ2luYXRvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xlbmd0aF09XCJsZGFwVG90YWxDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cImxkYXBQYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2VJbmRleF09XCJsZGFwUGFnZUluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIltsZGFwUGFnZVNpemVdXCJcclxuICAgICAgICAgICAgICAgICAgICBbaGlkZVBhZ2VTaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsZGFwTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBhZ2UpPVwib25MZGFwUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPjwvbWF0LXBhZ2luYXRvcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25cIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fdGl0bGVcIj5MaW5lczwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtc3RlcC1zZWN0aW9uX19jb250ZW50XCIgZm9ybUFycmF5TmFtZT1cImxpbmVzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZS1yb3V0ZS1saXN0XCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImxpbmUtcm91dGUtcm93XCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGluZUdyb3VwIG9mIGxpbmVzRm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaWR4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlkeFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXQgbGluZS1yb3V0ZS1maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cIm5ldmVyXCJcclxuICAgICAgICAgICAgICAgICAgaGlkZVJlcXVpcmVkTWFya2VyXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkxpbmUgbnVtYmVyXCIgZm9ybUNvbnRyb2xOYW1lPVwibGluZU51bWJlclwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dCBsaW5lLXJvdXRlLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBoaWRlUmVxdWlyZWRNYXJrZXJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBmb3IgYSBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJudW1iZXJBdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZmlsdGVyQXZhaWxhYmxlTnVtYmVycyhpZHgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNudW1iZXJBdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCInYXV0bydcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk51bWJlclNlbGVjdGVkKGlkeCwgJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBnZXRGaWx0ZXJlZE51bWJlcnMoaWR4KVwiIFt2YWx1ZV09XCJvcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbiB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0TGluZUdyb3VwKGlkeCkuZ2V0KCdudW1iZXInKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgZ2V0TGluZUdyb3VwKGlkeCkuZ2V0KCdudW1iZXInKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIE51bWJlciBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldExpbmVHcm91cChpZHgpLmdldCgnbnVtYmVyJyk/Lmhhc0Vycm9yKCdhdmFpbGFibGVOdW1iZXInKSAmJiBnZXRMaW5lR3JvdXAoaWR4KS5nZXQoJ251bWJlcicpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgbnVtYmVyIGZyb20gdGhlIGxpc3RcclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dCBsaW5lLXJvdXRlLWZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBoaWRlUmVxdWlyZWRNYXJrZXJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCByb3V0ZSBwYXJ0aXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJvdXRlUGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cInJvdXRlUGFydGl0aW9uQXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImZpbHRlclJvdXRlUGFydGl0aW9ucyhpZHgsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNyb3V0ZVBhcnRpdGlvbkF1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblJvdXRlUGFydGl0aW9uU2VsZWN0ZWQoaWR4LCAkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvdXRlUGFydGl0aW9uIG9mIGdldEZpbHRlcmVkUm91dGVQYXJ0aXRpb25zKGlkeClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdXRlUGFydGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyByb3V0ZVBhcnRpdGlvbiB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0TGluZUdyb3VwKGlkeCkuZ2V0KCdyb3V0ZVBhcnRpdGlvbicpPy5pbnZhbGlkICYmIGdldExpbmVHcm91cChpZHgpLmdldCgncm91dGVQYXJ0aXRpb24nKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFJvdXRlIHBhcnRpdGlvbiBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25cIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvbl9fdGl0bGVcIj5EZXZpY2VzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwiZGV2aWNlc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZXMtcm93c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZHMgZGV0YWlscy1pbmxpbmUtZmllbGRzLS1mb3VyXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGV2aWNlR3JvdXAgb2YgZGV2aWNlc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGlkeCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpZHhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5EZXZpY2UgdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV2aWNlVHlwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPlByb3RvY29sPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm90b2NvbFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkJ1dHRvbiBUZW1wbGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYnV0dG9uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIG1hdFByZWZpeCAqbmdJZj1cImdldERldmljZU5hbWVQcmVmaXgoaWR4KSBhcyBkZXZpY2VQcmVmaXhcIj57eyBkZXZpY2VQcmVmaXggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgW3JlYWRvbmx5XT1cImlzRGV2aWNlTmFtZVJlYWRvbmx5KGlkeCwgZmFsc2UpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdkZXZpY2VOYW1lJykgJiYgZ2V0RGV2aWNlR3JvdXAoaWR4KS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LmdldEVycm9yKCdkZXZpY2VOYW1lJyk/LmNhcHRpb24gfHwgZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGlkeCkgfHwgJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRldmljZSBuYW1lJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGdldERldmljZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBOYW1lIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkZXRhaWxzLXN0ZXAtc2VjdGlvblwiICpuZ0lmPVwiZGV2aWNlUHJvZmlsZXNGb3JtQXJyYXkubGVuZ3RoXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX3RpdGxlXCI+RGV2aWNlIHByb2ZpbGVzPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1zdGVwLXNlY3Rpb25fX2NvbnRlbnRcIiBmb3JtQXJyYXlOYW1lPVwiZGV2aWNlUHJvZmlsZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2VzLXJvd3NcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRzIGRldGFpbHMtaW5saW5lLWZpZWxkcy0tZm91clwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2ZpbGVHcm91cCBvZiBkZXZpY2VQcm9maWxlc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGlkeCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpZHhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5EZXZpY2UgdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV2aWNlVHlwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPlByb3RvY29sPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm90b2NvbFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1pbmxpbmUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkX19sYWJlbFwiPkJ1dHRvbiBUZW1wbGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkZXRhaWxzLXN0ZXAtaW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYnV0dG9uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtaW5saW5lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkZXRhaWxzLWlubGluZS1maWVsZF9fbGFiZWxcIj5OYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRldGFpbHMtc3RlcC1pbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIG1hdFByZWZpeCAqbmdJZj1cImdldERldmljZVByb2ZpbGVOYW1lUHJlZml4KGlkeCkgYXMgcHJvZmlsZVByZWZpeFwiPnt7IHByb2ZpbGVQcmVmaXggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgW3JlYWRvbmx5XT1cImlzRGV2aWNlTmFtZVJlYWRvbmx5KGlkeCwgdHJ1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0RGV2aWNlUHJvZmlsZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdkZXZpY2VOYW1lJykgJiYgZ2V0RGV2aWNlUHJvZmlsZUdyb3VwKGlkeCkuZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBnZXREZXZpY2VQcm9maWxlR3JvdXAoaWR4KS5nZXQoJ25hbWUnKT8uZ2V0RXJyb3IoJ2RldmljZU5hbWUnKT8uY2FwdGlvbiB8fCBnZXREZXZpY2VQcm9maWxlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGlkeCkgfHwgJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRldmljZSBuYW1lJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
|