@tuki-io/tuki-widgets 0.0.197 → 0.0.199

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.
Files changed (49) hide show
  1. package/esm2020/di2mt/shared/components/stat-card/stat-card.component.mjs +2 -2
  2. package/esm2020/user-creation/src/app.constants.mjs +2 -16
  3. package/esm2020/user-creation/src/shared/material.module.mjs +7 -35
  4. package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +19 -43
  5. package/esm2020/user-creation/src/shared/shared.module.mjs +4 -27
  6. package/esm2020/user-creation/src/user-creation.module.mjs +7 -40
  7. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +20 -512
  8. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-overview-step/user-overview-step.component.mjs +3 -3
  9. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +34 -80
  10. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +19 -83
  11. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +124 -594
  12. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +1 -1
  13. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  14. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +325 -1913
  15. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  16. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +1 -1
  17. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  18. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +313 -1868
  19. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  20. package/package.json +1 -1
  21. package/user-creation/src/app.constants.d.ts +0 -10
  22. package/user-creation/src/shared/material.module.d.ts +1 -5
  23. package/user-creation/src/shared/services/user-creation-api.service.d.ts +2 -8
  24. package/user-creation/src/shared/shared.module.d.ts +1 -3
  25. package/user-creation/src/user-creation.module.d.ts +10 -17
  26. package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +7 -83
  27. package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +4 -11
  28. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.d.ts +0 -18
  29. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +56 -71
  30. package/esm2020/user-creation/src/classes/notification.mjs +0 -32
  31. package/esm2020/user-creation/src/environments/environment.mjs +0 -11
  32. package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +0 -19
  33. package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +0 -38
  34. package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +0 -30
  35. package/esm2020/user-creation/src/shared/services/notification.service.mjs +0 -62
  36. package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +0 -14
  37. package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +0 -147
  38. package/esm2020/user-creation/src/utils/device-name-validation.mjs +0 -23
  39. package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +0 -26
  40. package/user-creation/src/classes/notification.d.ts +0 -18
  41. package/user-creation/src/environments/environment.d.ts +0 -9
  42. package/user-creation/src/interfaces/user-creation-wizard.interfaces.d.ts +0 -502
  43. package/user-creation/src/shared/components/notification/notification.component.d.ts +0 -19
  44. package/user-creation/src/shared/pipes/truncate.pipe.d.ts +0 -7
  45. package/user-creation/src/shared/services/notification.service.d.ts +0 -18
  46. package/user-creation/src/utils/app-loader/app-loader.d.ts +0 -6
  47. package/user-creation/src/utils/build-savable-end-user.d.ts +0 -23
  48. package/user-creation/src/utils/device-name-validation.d.ts +0 -6
  49. package/user-creation/src/utils/parse-device-name-rule.d.ts +0 -8
@@ -1,37 +1,11 @@
1
1
  import { inject, Injectable } from "@angular/core";
2
2
  import { UserCreationApiService } from "../../shared/services/user-creation-api.service";
3
- import { catchError, forkJoin, map, of, Subject, switchMap, tap } from "rxjs";
4
- import Big from "big.js";
5
- import { SiteDefaults } from "../../classes/site";
6
- import { Site } from "../../classes/site";
7
- import { DnRangeType, } from "../../interfaces/user-creation-wizard.interfaces";
8
- import { buildSavableEndUser } from "../../utils/build-savable-end-user";
9
- import { parseDeviceNameRegexBody } from "../../utils/parse-device-name-rule";
10
3
  import * as i0 from "@angular/core";
11
4
  export class UserCreationWizardService {
12
- get currentSite() {
13
- return this._currentSite;
14
- }
15
- get firstLineRoutePartition() {
16
- return this.lines[0]?.directoryNumber?.routePartitionName ?? '';
17
- }
18
- get siteDefaultRoutePartition() {
19
- return this.siteDefaults?.routePartition || '';
20
- }
21
- get routePartitionNamesList() {
22
- return this.siteDefaults ? this.siteDefaults.routePartitionFilter : [];
23
- }
24
5
  constructor() {
25
- this.userCreationApiService = inject(UserCreationApiService);
6
+ this.api = inject(UserCreationApiService);
26
7
  this.ldapTableColumns = ['userId', 'firstName', 'lastName', 'email', 'add'];
27
8
  this.userCreationTypes = ['CUCM', 'MT'];
28
- this.template = null;
29
- this.endUser = null;
30
- this.lines = [];
31
- this.devices = [];
32
- this.deviceProfiles = [];
33
- this.templateLinesSnapshot = null;
34
- this._currentSite = null;
35
9
  this.siteOptions = [];
36
10
  this.templateOptions = [];
37
11
  this.lineOptions = [];
@@ -41,89 +15,40 @@ export class UserCreationWizardService {
41
15
  this.overviewUsers = [];
42
16
  this.overviewLines = [];
43
17
  this.overviewDevices = [];
44
- this.overviewDeviceProfiles = [];
45
- this.userDetailsFormValue = null;
46
18
  this.userDetailsForm = {
47
19
  userId: '',
48
20
  firstName: '',
49
21
  lastName: '',
50
- email: '',
22
+ email: ''
51
23
  };
52
24
  this.lineSelections = [];
53
25
  this.deviceEntries = [];
54
- this.availableNumbers = [];
55
- this.deviceTypes = [];
56
- this.siteDefaults = null;
57
- this.originalSiteDefaults = null;
58
- this.templateLines = [];
59
- this.templateDevices = [];
60
- this.templateUserDetails = {};
61
26
  this.selectedSite = null;
62
- this.selectedTemplateName = null;
63
- this.selectedTemplateId = null;
27
+ this.selectedTemplate = null;
64
28
  this.selectedUserCreationType = 'CUCM';
65
- this.availableDidPatternsMappedToDn = {};
66
- this.deviceDefaultsLoadedSubject = new Subject();
67
- this.deviceDefaultsLoaded$ = this.deviceDefaultsLoadedSubject.asObservable();
68
- this.selectedLdapUser = null;
69
- this.ldapUsersTotal = 0;
70
- // this.loadPlaceholderData();
71
- }
72
- get isLdapIntegrated() {
73
- return !!this.endUser?.ldapIntegrated;
74
- }
75
- selectLdapUser(user) {
76
- this.selectedLdapUser = user;
77
- if (this.endUser) {
78
- this.endUser.ldapIntegrated = true;
79
- this.endUser.userid = user.userid;
80
- this.endUser.firstName = user.firstName ?? '';
81
- this.endUser.lastName = user.lastName ?? '';
82
- this.endUser.email = user.email ?? '';
83
- }
84
- this.userDetailsForm = {
85
- userId: user.userid,
86
- firstName: user.firstName ?? '',
87
- lastName: user.lastName ?? '',
88
- email: user.email ?? '',
89
- };
90
- this.rebuildOverviewUsers();
29
+ this.addedLdapUserIds = new Set();
30
+ this.loadPlaceholderData();
91
31
  }
92
- clearLdapUserSelection() {
93
- this.selectedLdapUser = null;
94
- if (this.endUser) {
95
- this.endUser.ldapIntegrated = false;
96
- this.endUser.userid = '';
97
- this.endUser.firstName = '';
98
- this.endUser.lastName = '';
99
- this.endUser.email = '';
100
- }
32
+ addLdapUser(row) {
101
33
  this.userDetailsForm = {
102
- userId: '',
103
- firstName: '',
104
- lastName: '',
105
- email: '',
34
+ userId: row.userId,
35
+ firstName: row.firstName,
36
+ lastName: row.lastName,
37
+ email: row.email
106
38
  };
39
+ this.addedLdapUserIds.add(row.userId);
107
40
  this.rebuildOverviewUsers();
108
41
  }
109
- isLdapUserRowSelected(row) {
110
- return this.selectedLdapUser?.userid === row.userid;
111
- }
112
- setLdapUsersResult(users, total) {
113
- this.ldapUsers = users;
114
- this.ldapUsersTotal = total;
42
+ isLdapUserAdded(row) {
43
+ return this.addedLdapUserIds.has(row.userId);
115
44
  }
116
45
  setSelectedSite(site) {
117
- this.selectedSite = site || null;
46
+ this.selectedSite = site;
118
47
  }
119
48
  setSelectedTemplate(template) {
120
- this.selectedTemplateName = template?.name || null;
121
- this.selectedTemplateId = template?.id || null;
49
+ this.selectedTemplate = template;
122
50
  this.rebuildOverviewUsers();
123
51
  }
124
- setCurrentSite(site) {
125
- this._currentSite = site;
126
- }
127
52
  resetTemplateDrivenData() {
128
53
  this.lineOptions = [];
129
54
  this.routePartitionOptions = [];
@@ -134,121 +59,69 @@ export class UserCreationWizardService {
134
59
  this.rebuildOverviewDevices();
135
60
  }
136
61
  applyTemplateTokenPayload(payload) {
137
- this.template = this.extractTemplateFromTokenPayload(payload);
138
- this.endUser = this.template?.endUser || null;
139
- this.lines = this.endUser && Array.isArray(this.endUser?.lines) ? this.endUser.lines : [];
140
- this.devices = this.endUser && Array.isArray(this.endUser?.devices) ? this.endUser.devices : [];
141
- this.deviceProfiles = this.endUser && Array.isArray(this.endUser?.deviceProfiles) ? this.endUser.deviceProfiles : [];
142
- this.initTemplateDnsNamesForLines();
143
- // this.userDetailsForm = {
144
- // userId: this.valueToString(this.endUser?.userid ?? ''),
145
- // firstName: this.valueToString(this.endUser?.firstName ?? ''),
146
- // lastName: this.valueToString(this.endUser?.lastName ?? ''),
147
- // email: this.valueToString(this.endUser?.email ?? '')
148
- // };
149
- // const mappedLineOptions: LineOption[] = linesFromTemplate
150
- // .map(line => ({
151
- // number: this.valueToString(line?.directoryNumber?.directoryNumber),
152
- // did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
153
- // css: this.valueToString(
154
- // typeof line?.callingSearchSpace === 'string'
155
- // ? line.callingSearchSpace
156
- // : line?.callingSearchSpace?.name
157
- // ),
158
- // description: this.valueToString(line?.description)
159
- // }))
160
- // .filter(line => line.number.trim().length > 0);
161
- this.devices.forEach(device => this.initDeviceWithSiteInfo(device));
162
- this.deviceProfiles.forEach(device => this.initDeviceWithSiteInfo(device));
163
- this.lines.forEach(line => this.initLineWithSiteInfo(line));
164
- this.captureTemplateLinesSnapshot();
165
- if (this.selectedSite) {
166
- this.loadDeviceDefaultsForDevices(this.selectedSite).subscribe();
167
- }
168
- // if (mappedLineOptions.length) {
169
- // this.lineOptions = this.uniqueByNumber(mappedLineOptions);
170
- // this.lineSelections = this.lineOptions.map(line => ({
171
- // lineNumber: line.number,
172
- // routePartitionName: linesFromTemplate.find(
173
- // source => (source?.directoryNumber?.directoryNumber || '') === line.number
174
- // )?.directoryNumber?.routePartitionName || null
175
- // }));
176
- // } else {
177
- // const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
178
- // const associatedLineOptions: LineOption[] = lineAssociations
179
- // .map(association => {
180
- // const number = association?.directoryNumber?.directoryNumber || '';
181
- // return {
182
- // number,
183
- // did: number,
184
- // css: '',
185
- // description: ''
186
- // };
187
- // })
188
- // .filter(line => line.number.trim().length > 0);
189
- // this.lineOptions = this.uniqueByNumber(associatedLineOptions);
190
- // this.lineSelections = this.lineOptions.map(line => ({
191
- // lineNumber: line.number,
192
- // routePartitionName: lineAssociations.find(
193
- // source => (source?.directoryNumber?.directoryNumber || '') === line.number
194
- // )?.directoryNumber?.routePartitionName || null
195
- // }));
196
- // this.templateLines.forEach((line: any) => this.initLineWithSiteInfo(line));
197
- // this.initTemplateDnsNamesForLines(this.templateLines);
198
- // }
199
- // const routePartitions = this.lineSelections
200
- // .map(line => line.routePartitionName)
201
- // .filter((value): value is string => !!value && value.trim().length > 0);
202
- // this.routePartitionOptions = this.uniqueStrings(routePartitions);
203
- // this.deviceEntries = devicesFromTemplate.map(device => ({
204
- // deviceType: this.valueToString(device.deviceType),
205
- // protocol: this.valueToString(device.protocol),
206
- // buttonTemplate: this.valueToString(device.buttonTemplate),
207
- // name: this.valueToString(device.name)
208
- // }));
209
- // this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
210
- // this.rebuildOverviewUsers();
211
- // this.rebuildOverviewLines();
212
- // this.rebuildOverviewDevices();
213
- }
214
- setSelectedUserCreationType(type) {
215
- this.selectedUserCreationType = type;
216
- }
217
- resetUserDetailsStepState() {
218
- this.userDetailsFormValue = null;
62
+ const template = this.extractTemplateFromTokenPayload(payload);
63
+ const endUser = template?.endUser || {};
64
+ const linesFromTemplate = Array.isArray(endUser.lines) ? endUser.lines : [];
65
+ const devicesFromTemplate = Array.isArray(endUser.devices) ? endUser.devices : [];
219
66
  this.userDetailsForm = {
220
- userId: '',
221
- firstName: '',
222
- lastName: '',
223
- email: '',
67
+ userId: this.valueToString(endUser.userid),
68
+ firstName: this.valueToString(endUser.firstName),
69
+ lastName: this.valueToString(endUser.lastName),
70
+ email: this.valueToString(endUser.email)
224
71
  };
225
- this.selectedLdapUser = null;
226
- this.ldapUsers = [];
227
- this.ldapUsersTotal = 0;
228
- if (this.templateLinesSnapshot) {
229
- this.lines = JSON.parse(JSON.stringify(this.templateLinesSnapshot));
72
+ const mappedLineOptions = linesFromTemplate
73
+ .map(line => ({
74
+ number: this.valueToString(line?.directoryNumber?.directoryNumber),
75
+ did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
76
+ css: this.valueToString(typeof line?.callingSearchSpace === 'string'
77
+ ? line.callingSearchSpace
78
+ : line?.callingSearchSpace?.name),
79
+ description: this.valueToString(line?.description)
80
+ }))
81
+ .filter(line => line.number.trim().length > 0);
82
+ if (mappedLineOptions.length) {
83
+ this.lineOptions = this.uniqueByNumber(mappedLineOptions);
84
+ this.lineSelections = this.lineOptions.map(line => ({
85
+ lineNumber: line.number,
86
+ routePartitionName: linesFromTemplate.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
87
+ }));
230
88
  }
231
- this.devices.forEach(device => {
232
- device.name = '';
233
- });
234
- this.deviceProfiles.forEach(profile => {
235
- profile.name = '';
236
- });
237
- if (this.endUser) {
238
- this.endUser.userid = '';
239
- this.endUser.firstName = '';
240
- this.endUser.lastName = '';
241
- this.endUser.email = '';
242
- this.endUser.ldapIntegrated = false;
243
- this.endUser.lines = this.lines;
89
+ else {
90
+ const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
91
+ const associatedLineOptions = lineAssociations
92
+ .map(association => {
93
+ const number = association?.directoryNumber?.directoryNumber || '';
94
+ return {
95
+ number,
96
+ did: number,
97
+ css: '',
98
+ description: ''
99
+ };
100
+ })
101
+ .filter(line => line.number.trim().length > 0);
102
+ this.lineOptions = this.uniqueByNumber(associatedLineOptions);
103
+ this.lineSelections = this.lineOptions.map(line => ({
104
+ lineNumber: line.number,
105
+ routePartitionName: lineAssociations.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
106
+ }));
244
107
  }
245
- this.overviewUsers = [];
108
+ const routePartitions = this.lineSelections
109
+ .map(line => line.routePartitionName)
110
+ .filter((value) => !!value && value.trim().length > 0);
111
+ this.routePartitionOptions = this.uniqueStrings(routePartitions);
112
+ this.deviceEntries = devicesFromTemplate.map(device => ({
113
+ deviceType: this.valueToString(device.deviceType),
114
+ protocol: this.valueToString(device.protocol),
115
+ buttonTemplate: this.valueToString(device.buttonTemplate),
116
+ name: this.valueToString(device.name)
117
+ }));
118
+ this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
119
+ this.rebuildOverviewUsers();
246
120
  this.rebuildOverviewLines();
247
121
  this.rebuildOverviewDevices();
248
- this.rebuildOverviewDeviceProfiles();
249
122
  }
250
- captureTemplateLinesSnapshot() {
251
- this.templateLinesSnapshot = JSON.parse(JSON.stringify(this.lines));
123
+ setSelectedUserCreationType(type) {
124
+ this.selectedUserCreationType = type;
252
125
  }
253
126
  setUserDetailsField(field, value) {
254
127
  this.userDetailsForm = {
@@ -257,47 +130,6 @@ export class UserCreationWizardService {
257
130
  };
258
131
  this.rebuildOverviewUsers();
259
132
  }
260
- applyUserDetailsFormValue(formValue) {
261
- this.userDetailsFormValue = formValue;
262
- this.userDetailsForm = {
263
- userId: formValue.userId || '',
264
- firstName: formValue.firstName || '',
265
- lastName: formValue.lastName || '',
266
- email: formValue.email || '',
267
- };
268
- formValue.lines?.forEach((lineValue, index) => {
269
- const line = this.lines[index];
270
- if (!line?.directoryNumber) {
271
- return;
272
- }
273
- line.directoryNumber.directoryNumber = lineValue.number || '';
274
- line.directoryNumber.routePartitionName = lineValue.routePartition || '';
275
- });
276
- formValue.devices?.forEach((deviceValue, index) => {
277
- const device = this.devices[index];
278
- if (!device) {
279
- return;
280
- }
281
- device.name = deviceValue.name || '';
282
- });
283
- formValue.deviceProfiles?.forEach((profileValue, index) => {
284
- const profile = this.deviceProfiles[index];
285
- if (!profile) {
286
- return;
287
- }
288
- profile.name = profileValue.name || '';
289
- });
290
- if (this.endUser) {
291
- this.endUser.userid = formValue.userId || '';
292
- this.endUser.firstName = formValue.firstName || '';
293
- this.endUser.lastName = formValue.lastName || '';
294
- this.endUser.email = formValue.email || '';
295
- }
296
- this.rebuildOverviewUsers();
297
- this.rebuildOverviewLines();
298
- this.rebuildOverviewDevices();
299
- this.rebuildOverviewDeviceProfiles();
300
- }
301
133
  setLineSelection(index, lineNumber) {
302
134
  if (!this.lineSelections[index]) {
303
135
  return;
@@ -347,83 +179,63 @@ export class UserCreationWizardService {
347
179
  }
348
180
  return entry.name || '';
349
181
  }
350
- getSiteAllData(siteId) {
351
- return this.userCreationApiService.getSiteAllData(siteId).pipe(tap((res) => {
352
- if (res && res[0]) {
353
- const site = new Site(res[0]);
354
- this.selectedSite = site.id;
182
+ // Placeholder bootstrap until backend APIs are connected.
183
+ loadPlaceholderData() {
184
+ this.siteOptions = ['Site 1', 'Site 2', 'Site 3'];
185
+ this.templateOptions = ['User 8851 Office'];
186
+ this.lineOptions = [
187
+ {
188
+ number: '557046',
189
+ did: '+13125557046',
190
+ css: 'Atlanta_internal_css',
191
+ description: ''
192
+ },
193
+ {
194
+ number: '557047',
195
+ did: '+13125557047',
196
+ css: 'Atlanta_internal_css',
197
+ description: ''
198
+ },
199
+ {
200
+ number: '557048',
201
+ did: '+13125557048',
202
+ css: 'Atlanta_internal_css',
203
+ description: ''
355
204
  }
356
- if (res && res[1]) {
357
- this.siteDefaults = new SiteDefaults(res[1], false);
358
- this.originalSiteDefaults = new SiteDefaults(res[1], false);
359
- this.routePartitionOptions = [...this.routePartitionNamesList];
205
+ ];
206
+ this.routePartitionOptions = ['Atlanta_internal_PT', 'Beijing_national_PT'];
207
+ this.deviceRows = [1, 2];
208
+ this.ldapUsers = [
209
+ { userId: 'John.Doe', firstName: 'John', lastName: 'Doe', email: 'john.doe@car.west.io' },
210
+ { userId: 'Jane.Smith', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@car.west.io' }
211
+ ];
212
+ this.lineSelections = [
213
+ {
214
+ lineNumber: null,
215
+ routePartitionName: this.routePartitionOptions[0] || null
360
216
  }
361
- if (res && res[2]) {
362
- this.deviceTypes = res[2];
217
+ ];
218
+ this.deviceEntries = [
219
+ {
220
+ deviceType: 'Cisco 8851',
221
+ protocol: 'SIP',
222
+ buttonTemplate: 'Standard 8851 SIP',
223
+ name: ''
224
+ },
225
+ {
226
+ deviceType: 'Cisco Unified Client Services Framework',
227
+ protocol: 'SIP',
228
+ buttonTemplate: 'Standard Client Services Framework',
229
+ name: ''
363
230
  }
364
- }), switchMap(res => this.loadDeviceDefaultsForDevices(siteId).pipe(map(() => res))));
365
- }
366
- loadDeviceDefaultsForDevices(siteId) {
367
- const deviceTypes = this.getUniqueDeviceTypes();
368
- if (!deviceTypes.length) {
369
- return of(undefined);
370
- }
371
- const requests = deviceTypes.map(deviceType => this.userCreationApiService.getDeviceDefaults(String(siteId), deviceType).pipe(tap(defaults => this.applyDeviceDefaultsToType(deviceType, defaults)), catchError(() => of(null))));
372
- return forkJoin(requests).pipe(tap(() => this.deviceDefaultsLoadedSubject.next()), map(() => undefined));
373
- }
374
- getUniqueDeviceTypes() {
375
- const types = [
376
- ...this.devices.map(device => device.deviceType),
377
- ...this.deviceProfiles.map(profile => profile.deviceType),
378
- ].filter((type) => !!type && type.trim().length > 0);
379
- return [...new Set(types)];
380
- }
381
- applyDeviceDefaultsToType(deviceType, defaults) {
382
- const nameValidationRegex = parseDeviceNameRegexBody(defaults.deviceNameRegex);
383
- const targets = [...this.devices, ...this.deviceProfiles].filter(device => device.deviceType === deviceType);
384
- targets.forEach(device => {
385
- device.deviceDefaults = defaults;
386
- device.nameValidationRegex = nameValidationRegex;
387
- device.nameValidationCaption = defaults.deviceNameExplained;
388
- });
389
- }
390
- getDeviceNamePrefix(deviceIndex, isProfile = false) {
391
- const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
392
- const prefix = device?.prefix?.trim();
393
- return prefix || null;
394
- }
395
- getDeviceNameValidationCaption(deviceIndex, isProfile = false) {
396
- const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
397
- return device?.nameValidationCaption || device?.deviceDefaults?.deviceNameExplained || '';
398
- }
399
- getDeviceNameValidationOptions(deviceIndex, isProfile = false) {
400
- const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
401
- const regex = device?.nameValidationRegex?.trim() ||
402
- parseDeviceNameRegexBody(device?.deviceDefaults?.deviceNameRegex);
403
- if (!regex) {
404
- return null;
405
- }
406
- return {
407
- regex,
408
- caption: this.getDeviceNameValidationCaption(deviceIndex, isProfile),
409
- };
410
- }
411
- getNumberRange(siteId, routePartition) {
412
- this.availableDidPatternsMappedToDn = {};
413
- const pageSize = 9999;
414
- const params = { dntype: DnRangeType.extension, routepartition: routePartition, size: pageSize, page: 0 };
415
- this.availableNumbers = [];
416
- return this.userCreationApiService.getAvailableDnInRanges(siteId, params)
417
- .pipe(map((res) => {
418
- res.availableNumberList.forEach((availableNumber) => {
419
- this.setAvailableDidMappedToDn(availableNumber);
420
- this.availableNumbers = [...this.availableNumbers, ...this.getUnwrapNumberRange(availableNumber)];
421
- });
422
- }));
423
- // .pipe(this.handleError(true, false));
231
+ ];
232
+ this.selectedTemplate = this.selectedTemplate ?? null;
233
+ this.rebuildOverviewUsers();
234
+ this.rebuildOverviewLines();
235
+ this.rebuildOverviewDevices();
424
236
  }
425
237
  rebuildOverviewUsers() {
426
- const userTemplate = this.selectedTemplateName || '';
238
+ const userTemplate = this.selectedTemplate || '';
427
239
  const hasUserData = Object.values(this.userDetailsForm).some(value => value.trim().length > 0);
428
240
  this.overviewUsers = hasUserData
429
241
  ? [{
@@ -436,23 +248,6 @@ export class UserCreationWizardService {
436
248
  : [];
437
249
  }
438
250
  rebuildOverviewLines() {
439
- const formLines = this.userDetailsFormValue?.lines;
440
- if (formLines?.length) {
441
- this.overviewLines = formLines
442
- .filter(line => !!line?.number?.trim())
443
- .map((lineValue, index) => {
444
- const templateLine = this.lines[index];
445
- const css = this.valueToString(templateLine?.callingSearchSpace);
446
- return {
447
- number: lineValue.number,
448
- did: lineValue.lineNumber || lineValue.number,
449
- routePartitionName: lineValue.routePartition || '',
450
- css,
451
- description: this.valueToString(templateLine?.description),
452
- };
453
- });
454
- return;
455
- }
456
251
  this.overviewLines = this.lineSelections
457
252
  .map(selection => {
458
253
  if (!selection?.lineNumber) {
@@ -474,18 +269,6 @@ export class UserCreationWizardService {
474
269
  }
475
270
  rebuildOverviewDevices() {
476
271
  const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
477
- const formDevices = this.userDetailsFormValue?.devices;
478
- if (formDevices?.length) {
479
- this.overviewDevices = formDevices
480
- .filter(device => !!device.deviceType?.trim() || !!device.name?.trim())
481
- .map(device => ({
482
- name: device.name || '',
483
- deviceType: device.deviceType || '',
484
- lines: selectedLineNumbers,
485
- description: `${device.protocol || ''} / ${device.buttonTemplate || ''}`.trim(),
486
- }));
487
- return;
488
- }
489
272
  this.overviewDevices = this.deviceEntries
490
273
  .map((device, index) => ({
491
274
  device,
@@ -499,22 +282,6 @@ export class UserCreationWizardService {
499
282
  description: `${device.protocol} / ${device.buttonTemplate}`
500
283
  }));
501
284
  }
502
- rebuildOverviewDeviceProfiles() {
503
- const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
504
- const formProfiles = this.userDetailsFormValue?.deviceProfiles;
505
- if (!formProfiles?.length) {
506
- this.overviewDeviceProfiles = [];
507
- return;
508
- }
509
- this.overviewDeviceProfiles = formProfiles
510
- .filter(profile => !!profile.deviceType?.trim() || !!profile.name?.trim())
511
- .map(profile => ({
512
- name: profile.name || '',
513
- deviceType: profile.deviceType || '',
514
- lines: selectedLineNumbers,
515
- description: `${profile.protocol || ''} / ${profile.buttonTemplate || ''}`.trim(),
516
- }));
517
- }
518
285
  extractTemplateFromTokenPayload(payload) {
519
286
  if (!payload || typeof payload !== 'object') {
520
287
  return null;
@@ -541,251 +308,14 @@ export class UserCreationWizardService {
541
308
  valueToString(value) {
542
309
  return typeof value === 'string' ? value : '';
543
310
  }
544
- getUnwrapNumberRange(availableNumber) {
545
- let unwrapNumberRange = this.unwrapNumberRange(availableNumber.phoneNumberRange.from, availableNumber.phoneNumberRange.to)
546
- .map((unwrappedNumber) => {
547
- const dn = availableNumber.phoneNumberRange.prefix + unwrappedNumber;
548
- let str = dn;
549
- if (this.availableDidPatternsMappedToDn[dn] && this.availableDidPatternsMappedToDn[dn].length > 0) {
550
- if (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] && this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 0) {
551
- str += ' DID: ' + (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 1 ? 'multiple' :
552
- this.availableDidPatternsMappedToDn[dn][0]['mappedDids'][0]);
553
- }
554
- if (this.availableDidPatternsMappedToDn[dn][0]['vm']) {
555
- str += ' In Use - VM';
556
- }
557
- }
558
- return str;
559
- });
560
- unwrapNumberRange = unwrapNumberRange.filter((unwrappedNumber) => !availableNumber.usedNumbers.includes(unwrappedNumber));
561
- return unwrapNumberRange;
562
- }
563
- unwrapNumberRange(start, end) {
564
- const regExp = /(^0+)/;
565
- let leadingZeros = '';
566
- const matches = start.match(regExp);
567
- if (matches) {
568
- leadingZeros = matches[1];
569
- }
570
- const startNumeric = new Big(start);
571
- const endNumeric = new Big(end);
572
- return Array.from({ length: Number(endNumeric.minus(startNumeric).plus(new Big(1)).toFixed(0)) }, (v, k) => {
573
- const number = String(startNumeric.plus(new Big(k.toString())).toFixed(0));
574
- if ((leadingZeros + number).length > start.length) {
575
- leadingZeros = leadingZeros.substr(1);
576
- }
577
- return leadingZeros + number;
578
- });
579
- }
580
- setAvailableDidMappedToDn(availableNumber) {
581
- if (availableNumber.unUsedNumbersWithDids && availableNumber.unUsedNumbersWithDids.length) {
582
- availableNumber.unUsedNumbersWithDids.forEach((numberWithDids) => {
583
- const dn = numberWithDids['unUsedNumber'];
584
- this.availableDidPatternsMappedToDn[dn] = [{}];
585
- if (numberWithDids['translationPatternList'] && numberWithDids['translationPatternList'].length > 0) {
586
- this.availableDidPatternsMappedToDn[dn] = numberWithDids['translationPatternList'];
587
- this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = [{}];
588
- if (numberWithDids['mappedDids'] && numberWithDids['mappedDids'].length > 0) {
589
- this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = numberWithDids['mappedDids'];
590
- }
591
- }
592
- this.availableDidPatternsMappedToDn[dn][0]['vm'] = numberWithDids['vm'];
593
- });
594
- }
595
- }
596
311
  // TODO: replace placeholders with real API integration.
597
312
  loadDataFromApi() {
598
313
  // this.api.getWizardBootstrapData().subscribe(...)
599
314
  }
600
- initLineWithSiteInfo(line) {
601
- line.directoryNumber.routePartitionName = this.siteDefaults?.routePartition || '';
602
- let callingSearchSpaceVal = this.siteDefaults?.lineCss || '';
603
- line.callingSearchSpace = callingSearchSpaceVal;
604
- }
605
- // private initTemplateDnsNamesForLines(userLines: TemplateLineLike[]): void {
606
- // const routePartition = this.siteDefaults?.routePartition || '';
607
- // if (userLines && userLines.length > 0) {
608
- // userLines.forEach((line, index) => {
609
- // line && line.directoryNumber && (line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber);
610
- // line && line.directoryNumber && (line.directoryNumber.directoryNumber = '');
611
- // return line;
612
- // });
613
- // // const routePartition = this.siteDefaults?.routePartition || '';
614
- // // if (line.lineAssociations && line.lineAssociations.length) {
615
- // // this.setLineAssociationsForDevice(line, routePartition);
616
- // // }
617
- // }
618
- // this.templateDevices.forEach(device => {
619
- // if (device.lineAssociations && device.lineAssociations.length) {
620
- // this.setLineAssociationsForDevice(device, routePartition);
621
- // }
622
- // });
623
- // }
624
- setLineAssociationsForDevice(device, routePartition) {
625
- const lineAssociations = device.lineAssociations || [];
626
- if (lineAssociations && lineAssociations.length) {
627
- lineAssociations.forEach(lineAssociation => {
628
- lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber || '');
629
- lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.routePartitionName = routePartition);
630
- });
631
- }
632
- }
633
- initDeviceWithSiteInfo(device) {
634
- device.newName = device.name;
635
- device.name = '';
636
- if (!device['enabledExtensionMobility']) {
637
- device.enabledExtensionMobility = this.siteDefaults?.enableEm ?? false;
638
- }
639
- else if (device['enabledExtensionMobility'].toString() === 'Yes') {
640
- device.enabledExtensionMobility = true;
641
- }
642
- else if (device['enabledExtensionMobility'].toString() === 'No') {
643
- device.enabledExtensionMobility = false;
644
- }
645
- if (device.location) {
646
- const replacedValue = this.replaceDynamicValueSiteInfo(device.location, this.currentSite?.shortName ?? '') ?? null;
647
- device.location = replacedValue;
648
- }
649
- if (device.location) {
650
- const replacedValue = this.replaceDynamicValueSiteInfo(device.devicePoolName, this.currentSite?.shortName ?? '') ?? null;
651
- device.devicePoolName = replacedValue;
652
- }
653
- if (device.location) {
654
- const replacedValue = this.replaceDynamicValueSiteInfo(device.callingSearchSpaceName, this.currentSite?.shortName ?? '') ?? null;
655
- device.callingSearchSpaceName = replacedValue;
656
- }
657
- if (device.extraOptions) {
658
- const replacedValue = this.replaceDynamicValueSiteInfo(device.extraOptions.aarCss, this.currentSite?.shortName ?? '') ?? null;
659
- device.extraOptions.aarCss = replacedValue;
660
- }
661
- if (!device.description && this.siteDefaults) {
662
- device.description = this.siteDefaults.deviceDescription;
663
- }
664
- }
665
- replaceDynamicValueSiteInfo(fieldValue, siteShortName) {
666
- if (fieldValue) {
667
- fieldValue = this.replaceDynamicValueFormat(fieldValue);
668
- const paramsToReplaces = { 'SiteShortName': siteShortName };
669
- return this.mutliStringReplace(paramsToReplaces, fieldValue);
670
- }
671
- return null;
672
- }
673
- replaceDynamicValueFormat(str) {
674
- str = str.replace(/\[FN\]/ig, '[FN]').replace(/\[LN\]/ig, '[LN]').replace(/\[ID\]/ig, '[UserId]')
675
- .replace(/\[UserId\]/ig, '[UserId]').replace(/<Match User ID>/ig, '[UserId]')
676
- .replace(/\[Email\]/ig, '[Email]').replace(/\[DN\(/ig, '[DN(')
677
- .replace(/\[SiteShortName\]/ig, '[SiteShortName]').replace(/\$\(SiteShortName\)/ig, '[SiteShortName]')
678
- .replace(/\$\{SiteShortName\}/ig, '[SiteShortName]').replace(/{SiteShortName}/ig, '[SiteShortName]')
679
- .replace(/\[FN\(/ig, '[FN(').replace(/\[LN\(/ig, '[LN(')
680
- .replace(/\[ID\(/ig, '[ID(');
681
- return str;
682
- }
683
- mutliStringReplace(object, input, directoryNumber, user) {
684
- var val = input;
685
- if (val.includes('[DN]') && directoryNumber && !directoryNumber.includes('Line')) {
686
- val = val.replace('[DN]', directoryNumber);
687
- }
688
- var indexOfDN = val.indexOf('[DN(');
689
- if (indexOfDN !== -1 && directoryNumber) {
690
- var digit = val.substring(indexOfDN + 4, val.indexOf(')', indexOfDN + 4));
691
- var digitCount = Number(digit) || 0;
692
- var dnDigit = (digitCount > val.length) ? directoryNumber : directoryNumber.substring(directoryNumber.length - digitCount, directoryNumber.length);
693
- val = val.replace('[DN(' + digit + ')]', dnDigit);
694
- }
695
- var indexOfFN = val.indexOf('[FN(');
696
- if (indexOfFN !== -1 && user && user.firstName) {
697
- var digit = val.substring(indexOfFN + 4, val.indexOf(')', indexOfFN + 4));
698
- var fnDigit = user.firstName.substring(0, digit);
699
- val = val.replace('[FN(' + digit + ')]', fnDigit);
700
- }
701
- var indexOfLN = val.indexOf('[LN(');
702
- if (indexOfLN !== -1 && user && user.lastName) {
703
- var digit = val.substring(indexOfLN + 4, val.indexOf(')', indexOfLN + 4));
704
- var lnDigit = user.lastName.substring(0, digit);
705
- val = val.replace('[LN(' + digit + ')]', lnDigit);
706
- }
707
- var indexOfID = val.indexOf('[ID(');
708
- if (indexOfID !== -1 && user && user.userid) {
709
- var digit = val.substring(indexOfID + 4, val.indexOf(')', indexOfID + 4));
710
- var idDigit = user.userid.substring(0, digit);
711
- val = val.replace('[ID(' + digit + ')]', idDigit);
712
- }
713
- var entries = Object.entries(object);
714
- entries.forEach((para) => {
715
- var find = '[' + para[0] + ']';
716
- var replacement = para[1] != null ? String(para[1]) : '';
717
- val = val.split(find).join(replacement);
718
- });
719
- return val;
720
- }
721
- initTemplateDnsNamesForLines() {
722
- if (this.lines && this.lines.length > 0) {
723
- this.lines.forEach((line, index) => {
724
- line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber;
725
- line.directoryNumber.directoryNumber = '';
726
- return line;
727
- });
728
- const routePartition = this.siteDefaults?.routePartition || '';
729
- this.devices.forEach(device => {
730
- if (device.lineAssociations && device.lineAssociations.length) {
731
- this.setLineAssociationsForDevice(device, routePartition);
732
- }
733
- });
734
- this.deviceProfiles.forEach(deviceProfile => {
735
- if (deviceProfile.lineAssociations && deviceProfile.lineAssociations.length) {
736
- this.setLineAssociationsForDevice(deviceProfile, routePartition);
737
- }
738
- });
739
- if (this.endUser?.singleNumberReach && this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
740
- if (this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
741
- this.endUser.singleNumberReach.associatedLines.map(lineAssociation => {
742
- lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
743
- lineAssociation.directoryNumber.routePartitionName = routePartition;
744
- });
745
- }
746
- if (this.endUser.singleNumberReach.remoteDestinations && this.endUser.singleNumberReach.remoteDestinations.length) {
747
- this.endUser.singleNumberReach.remoteDestinations.forEach(remoteDestination => {
748
- if (remoteDestination.lineAssociations && remoteDestination.lineAssociations.length) {
749
- remoteDestination.lineAssociations.map(lineAssociation => {
750
- lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
751
- lineAssociation.directoryNumber.routePartitionName = routePartition;
752
- });
753
- }
754
- });
755
- }
756
- }
757
- }
758
- }
759
- buildSavableEndUser() {
760
- if (!this.endUser) {
761
- throw new Error('No template user loaded');
762
- }
763
- return buildSavableEndUser(this.endUser, this.lines, this.devices, this.deviceProfiles, this.userDetailsForm, {
764
- resolveDeviceName: (index, device) => this.resolveDeviceNameForSave(index, device),
765
- resolveDeviceProfileName: (index, profile) => this.resolveDeviceNameForSave(index, profile),
766
- });
767
- }
768
- resolveDeviceNameForSave(_index, device) {
769
- const rawName = (device.name || device.newName || '').trim();
770
- if (!rawName) {
771
- return '';
772
- }
773
- const prefix = device.prefix?.trim();
774
- if (prefix && !rawName.toUpperCase().startsWith(prefix.toUpperCase())) {
775
- return `${prefix}${rawName}`;
776
- }
777
- return rawName;
778
- }
779
- saveNewUser() {
780
- const user = this.buildSavableEndUser();
781
- const siteId = String(this.selectedSite ?? '');
782
- const templateId = String(this.selectedTemplateId ?? '');
783
- return this.userCreationApiService.saveTemplateUser(user, templateId, siteId);
784
- }
785
315
  }
786
316
  UserCreationWizardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
787
317
  UserCreationWizardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService });
788
318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, decorators: [{
789
319
  type: Injectable
790
320
  }], ctorParameters: function () { return []; } });
791
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFJekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDekIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQXdDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQW9CSCxXQUFXLEdBRWQsTUFBTSxrREFBa0QsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFHOUUsTUFBTSxPQUFPLHlCQUF5QjtJQWNsQyxJQUFJLFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQXNDRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDekIsT0FBTyxJQUFJ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QUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzQyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN6QyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxD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LENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDckMsSUFBSSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ25FLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUM7U0FDaEM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRU0sV0FBVztRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRixDQUFDOzt1SEF2NEJRLHlCQUF5QjsySEFBekIseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9zZXJ2aWNlcy91c2VyLWNyZWF0aW9uLWFwaS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFQSSB9IGZyb20gXCIuLi8uLi9hcHAuY29uc3RhbnRzXCI7XHJcbi8vIGltcG9ydCB7IEF2YWlsYWJsZVBob25lTnVtYmVyUmFuZ2VJbnRlcmZhY2UsIEF2YWlsYWJsZVJhbmdlSW50ZXJmYWNlLCBEblJhbmdlVHlwZSwgTGluZUludGVyZmFjZSB9IGZyb20gXCJwcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlcnMtbGlzdC9zcmMvY2xhc3Nlcy9saW5lXCI7XHJcbmltcG9ydCB7IEFQSVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2FwaS9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmb3JrSm9pbiwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgQmlnIGZyb20gXCJiaWcuanNcIjtcclxuaW1wb3J0IHsgU2l0ZURlZmF1bHRzIH0gZnJvbSBcIi4uLy4uL2NsYXNzZXMvc2l0ZVwiO1xyXG5pbXBvcnQgeyBTaXRlLCBTaXRlSW50ZXJmYWNlLCBTaXRlVGVtcGxhdGVJbnRlcmZhY2UgfSBmcm9tIFwiLi4vLi4vY2xhc3Nlcy9zaXRlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBEZXZpY2VFbnRyeSxcclxuICAgIEVuZFVzZXJJbnRlcmZhY2UsXHJcbiAgICBMaW5lT3B0aW9uLFxyXG4gICAgT3ZlcnZpZXdEZXZpY2VSb3csXHJcbiAgICBPdmVydmlld0xpbmVSb3csXHJcbiAgICBPdmVydmlld1VzZXJSb3csXHJcbiAgICBTZWxlY3RlZExpbmVSb3csXHJcbiAgICBUZW1wbGF0ZURldmljZUxpa2UsXHJcbiAgICBUZW1wbGF0ZUVuZFVzZXJMaWtlLFxyXG4gICAgVGVtcGxhdGVMaW5lTGlrZSxcclxuICAgIFVzZXJDcmVhdGlvblR5cGUsXHJcbiAgICBVc2VyRGV0YWlsc0Zvcm0sXHJcbiAgICBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSxcclxuICAgIFVzZXJUZW1wbGF0ZUludGVyZmFjZSxcclxuICAgIExpbmVJbnRlcmZhY2UsXHJcbiAgICBEZXZpY2VJbnRlcmZhY2UsXHJcbiAgICBEZXZpY2VEZWZhdWx0c0ludGVyZmFjZSxcclxuICAgIEF2YWlsYWJsZVBob25lTnVtYmVyUmFuZ2VJbnRlcmZhY2UsXHJcbiAgICBBdmFpbGFibGVSYW5nZUludGVyZmFjZSxcclxuICAgIERuUmFuZ2VUeXBlLFxyXG4gICAgTGlzdFVzZXJJbnRlcmZhY2UsXHJcbn0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdXNlci1jcmVhdGlvbi13aXphcmQuaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBidWlsZFNhdmFibGVFbmRVc2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2J1aWxkLXNhdmFibGUtZW5kLXVzZXJcIjtcclxuaW1wb3J0IHsgcGFyc2VEZXZpY2VOYW1lUmVnZXhCb2R5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3BhcnNlLWRldmljZS1uYW1lLXJ1bGVcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ3JlYXRpb25BcGlTZXJ2aWNlID0gaW5qZWN0KFVzZXJDcmVhdGlvbkFwaVNlcnZpY2UpO1xyXG5cclxuICAgIHJlYWRvbmx5IGxkYXBUYWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gWyd1c2VySWQnLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ2VtYWlsJywgJ2FkZCddO1xyXG4gICAgcmVhZG9ubHkgdXNlckNyZWF0aW9uVHlwZXM6IFVzZXJDcmVhdGlvblR5cGVbXSA9IFsnQ1VDTScsICdNVCddO1xyXG5cclxuICAgIHByaXZhdGUgdGVtcGxhdGU6IFVzZXJUZW1wbGF0ZUludGVyZmFjZSB8IG51bGwgPSBudWxsO1xyXG4gICAgcHVibGljIGVuZFVzZXI6IEVuZFVzZXJJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcclxuICAgIHB1YmxpYyBsaW5lczogTGluZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwdWJsaWMgZGV2aWNlczogRGV2aWNlSW50ZXJmYWNlW10gPSBbXTtcclxuICAgIHB1YmxpYyBkZXZpY2VQcm9maWxlczogRGV2aWNlSW50ZXJmYWNlW10gPSBbXTtcclxuICAgIHByaXZhdGUgdGVtcGxhdGVMaW5lc1NuYXBzaG90OiBMaW5lSW50ZXJmYWNlW10gfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRTaXRlOiBTaXRlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTaXRlKCk6IFNpdGUgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFNpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2l0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gW107XHJcbiAgICByb3V0ZVBhcnRpdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBkZXZpY2VSb3dzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgbGRhcFVzZXJzOiBMaXN0VXNlckludGVyZmFjZVtdID0gW107XHJcbiAgICBvdmVydmlld1VzZXJzOiBPdmVydmlld1VzZXJSb3dbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdMaW5lczogT3ZlcnZpZXdMaW5lUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlczogT3ZlcnZpZXdEZXZpY2VSb3dbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdEZXZpY2VQcm9maWxlczogT3ZlcnZpZXdEZXZpY2VSb3dbXSA9IFtdO1xyXG4gICAgdXNlckRldGFpbHNGb3JtVmFsdWU6IFVzZXJEZXRhaWxzRm9ybVZhbHVlIHwgbnVsbCA9IG51bGw7XHJcbiAgICB1c2VyRGV0YWlsc0Zvcm06IFVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICB1c2VySWQ6ICcnLFxyXG4gICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgIGVtYWlsOiAnJyxcclxuICAgIH07XHJcbiAgICBsaW5lU2VsZWN0aW9uczogU2VsZWN0ZWRMaW5lUm93W10gPSBbXTtcclxuICAgIGRldmljZUVudHJpZXM6IERldmljZUVudHJ5W10gPSBbXTtcclxuICAgIGF2YWlsYWJsZU51bWJlcnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBkZXZpY2VUeXBlczogc3RyaW5nW10gPSBbXTtcclxuICAgIHNpdGVEZWZhdWx0czogU2l0ZURlZmF1bHRzIHwgbnVsbCA9IG51bGw7XHJcbiAgICBvcmlnaW5hbFNpdGVEZWZhdWx0czogU2l0ZURlZmF1bHRzIHwgbnVsbCA9IG51bGw7XHJcbiAgICB0ZW1wbGF0ZUxpbmVzOiBUZW1wbGF0ZUxpbmVMaWtlW10gPSBbXTtcclxuICAgIHRlbXBsYXRlRGV2aWNlczogVGVtcGxhdGVEZXZpY2VMaWtlW10gPSBbXTtcclxuICAgIHRlbXBsYXRlVXNlckRldGFpbHM6IFRlbXBsYXRlRW5kVXNlckxpa2UgPSB7fTtcclxuXHJcbiAgICBzZWxlY3RlZFNpdGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRUZW1wbGF0ZU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRUZW1wbGF0ZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVXNlckNyZWF0aW9uVHlwZTogVXNlckNyZWF0aW9uVHlwZSA9ICdDVUNNJztcclxuICAgIGF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9EbjogYW55ID0ge307XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VEZWZhdWx0c0xvYWRlZFN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcmVhZG9ubHkgZGV2aWNlRGVmYXVsdHNMb2FkZWQkID0gdGhpcy5kZXZpY2VEZWZhdWx0c0xvYWRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgZ2V0IGZpcnN0TGluZVJvdXRlUGFydGl0aW9uKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXNbMF0/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lID8/ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaXRlRGVmYXVsdFJvdXRlUGFydGl0aW9uKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZURlZmF1bHRzPy5yb3V0ZVBhcnRpdGlvbiB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm91dGVQYXJ0aXRpb25OYW1lc0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpdGVEZWZhdWx0cyA/IHRoaXMuc2l0ZURlZmF1bHRzLnJvdXRlUGFydGl0aW9uRmlsdGVyIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0ZWRMZGFwVXNlcjogTGlzdFVzZXJJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcclxuICAgIGxkYXBVc2Vyc1RvdGFsID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvLyB0aGlzLmxvYWRQbGFjZWhvbGRlckRhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNMZGFwSW50ZWdyYXRlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmVuZFVzZXI/LmxkYXBJbnRlZ3JhdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdExkYXBVc2VyKHVzZXI6IExpc3RVc2VySW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExkYXBVc2VyID0gdXNlcjtcclxuICAgICAgICBpZiAodGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sZGFwSW50ZWdyYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci51c2VyaWQgPSB1c2VyLnVzZXJpZDtcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmZpcnN0TmFtZSA9IHVzZXIuZmlyc3ROYW1lID8/ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGFzdE5hbWUgPSB1c2VyLmxhc3ROYW1lID8/ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZW1haWwgPSB1c2VyLmVtYWlsID8/ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJpZCxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSA/PyAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IHVzZXIubGFzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsID8/ICcnLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyTGRhcFVzZXJTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExkYXBVc2VyID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sZGFwSW50ZWdyYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIudXNlcmlkID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5maXJzdE5hbWUgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5lbWFpbCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZGFwVXNlclJvd1NlbGVjdGVkKHJvdzogTGlzdFVzZXJJbnRlcmZhY2UpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZExkYXBVc2VyPy51c2VyaWQgPT09IHJvdy51c2VyaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGRhcFVzZXJzUmVzdWx0KHVzZXJzOiBMaXN0VXNlckludGVyZmFjZVtdLCB0b3RhbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sZGFwVXNlcnMgPSB1c2VycztcclxuICAgICAgICB0aGlzLmxkYXBVc2Vyc1RvdGFsID0gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNlbGVjdGVkU2l0ZShzaXRlOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNpdGUgPSBzaXRlIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRUZW1wbGF0ZSh0ZW1wbGF0ZT86IFVzZXJUZW1wbGF0ZUludGVyZmFjZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZT8ubmFtZSB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZUlkID0gdGVtcGxhdGU/LmlkIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRDdXJyZW50U2l0ZShzaXRlOiBTaXRlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFNpdGUgPSBzaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0VGVtcGxhdGVEcml2ZW5EYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGluZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSBbXTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlUZW1wbGF0ZVRva2VuUGF5bG9hZChwYXlsb2FkOiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy5leHRyYWN0VGVtcGxhdGVGcm9tVG9rZW5QYXlsb2FkKHBheWxvYWQpO1xyXG4gICAgICAgIHRoaXMuZW5kVXNlciA9IHRoaXMudGVtcGxhdGU/LmVuZFVzZXIgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmxpbmVzID0gdGhpcy5lbmRVc2VyICYmIEFycmF5LmlzQXJyYXkodGhpcy5lbmRVc2VyPy5saW5lcykgPyB0aGlzLmVuZFVzZXIubGluZXMgOiBbXTtcclxuICAgICAgICB0aGlzLmRldmljZXMgPSB0aGlzLmVuZFVzZXIgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmVuZFVzZXI/LmRldmljZXMpID8gdGhpcy5lbmRVc2VyLmRldmljZXMgOiBbXTtcclxuICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzID0gdGhpcy5lbmRVc2VyICYmIEFycmF5LmlzQXJyYXkodGhpcy5lbmRVc2VyPy5kZXZpY2VQcm9maWxlcykgPyB0aGlzLmVuZFVzZXIuZGV2aWNlUHJvZmlsZXMgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKCk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgIC8vICAgICB1c2VySWQ6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LnVzZXJpZCA/PyAnJyksXHJcbiAgICAgICAgLy8gICAgIGZpcnN0TmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMuZW5kVXNlcj8uZmlyc3ROYW1lID8/ICcnKSxcclxuICAgICAgICAvLyAgICAgbGFzdE5hbWU6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/Lmxhc3ROYW1lID8/ICcnKSxcclxuICAgICAgICAvLyAgICAgZW1haWw6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LmVtYWlsID8/ICcnKVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IG1hcHBlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lc0Zyb21UZW1wbGF0ZVxyXG4gICAgICAgIC8vICAgICAubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAvLyAgICAgICAgIG51bWJlcjogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyKSxcclxuICAgICAgICAvLyAgICAgICAgIGRpZDogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRpZFBhdHRlcm5zPy5bMF0/LnBhdHRlcm4gfHwgbGluZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIpLFxyXG4gICAgICAgIC8vICAgICAgICAgY3NzOiB0aGlzLnZhbHVlVG9TdHJpbmcoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdHlwZW9mIGxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZSA9PT0gJ3N0cmluZydcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgPyBsaW5lLmNhbGxpbmdTZWFyY2hTcGFjZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICA6IGxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZT8ubmFtZVxyXG4gICAgICAgIC8vICAgICAgICAgKSxcclxuICAgICAgICAvLyAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGVzY3JpcHRpb24pXHJcbiAgICAgICAgLy8gICAgIH0pKVxyXG4gICAgICAgIC8vICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICB0aGlzLmRldmljZXMuZm9yRWFjaChkZXZpY2UgPT4gdGhpcy5pbml0RGV2aWNlV2l0aFNpdGVJbmZvKGRldmljZSkpO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlUHJvZmlsZXMuZm9yRWFjaChkZXZpY2UgPT4gdGhpcy5pbml0RGV2aWNlV2l0aFNpdGVJbmZvKGRldmljZSkpO1xyXG4gICAgICAgIHRoaXMubGluZXMuZm9yRWFjaChsaW5lID0+IHRoaXMuaW5pdExpbmVXaXRoU2l0ZUluZm8obGluZSkpO1xyXG5cclxuICAgICAgICB0aGlzLmNhcHR1cmVUZW1wbGF0ZUxpbmVzU25hcHNob3QoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTaXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZERldmljZURlZmF1bHRzRm9yRGV2aWNlcyh0aGlzLnNlbGVjdGVkU2l0ZSkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAobWFwcGVkTGluZU9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMubGluZU9wdGlvbnMgPSB0aGlzLnVuaXF1ZUJ5TnVtYmVyKG1hcHBlZExpbmVPcHRpb25zKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IHRoaXMubGluZU9wdGlvbnMubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAvLyAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmUubnVtYmVyLFxyXG4gICAgICAgIC8vICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBsaW5lc0Zyb21UZW1wbGF0ZS5maW5kKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHNvdXJjZSA9PiAoc291cmNlPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciB8fCAnJykgPT09IGxpbmUubnVtYmVyXHJcbiAgICAgICAgLy8gICAgICAgICApPy5kaXJlY3RvcnlOdW1iZXI/LnJvdXRlUGFydGl0aW9uTmFtZSB8fCBudWxsXHJcbiAgICAgICAgLy8gICAgIH0pKTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBsaW5lQXNzb2NpYXRpb25zID0gZGV2aWNlc0Zyb21UZW1wbGF0ZS5mbGF0TWFwKGRldmljZSA9PiBkZXZpY2UubGluZUFzc29jaWF0aW9ucyB8fCBbXSk7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGFzc29jaWF0ZWRMaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gbGluZUFzc29jaWF0aW9uc1xyXG4gICAgICAgIC8vICAgICAgICAgLm1hcChhc3NvY2lhdGlvbiA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgbnVtYmVyID0gYXNzb2NpYXRpb24/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIG51bWJlcixcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGlkOiBudW1iZXIsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGNzczogJycsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJ1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIH07XHJcbiAgICAgICAgLy8gICAgICAgICB9KVxyXG4gICAgICAgIC8vICAgICAgICAgLmZpbHRlcihsaW5lID0+IGxpbmUubnVtYmVyLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuXHJcbiAgICAgICAgLy8gICAgIHRoaXMubGluZU9wdGlvbnMgPSB0aGlzLnVuaXF1ZUJ5TnVtYmVyKGFzc29jaWF0ZWRMaW5lT3B0aW9ucyk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSB0aGlzLmxpbmVPcHRpb25zLm1hcChsaW5lID0+ICh7XHJcbiAgICAgICAgLy8gICAgICAgICBsaW5lTnVtYmVyOiBsaW5lLm51bWJlcixcclxuICAgICAgICAvLyAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogbGluZUFzc29jaWF0aW9ucy5maW5kKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHNvdXJjZSA9PiAoc291cmNlPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciB8fCAnJykgPT09IGxpbmUubnVtYmVyXHJcbiAgICAgICAgLy8gICAgICAgICApPy5kaXJlY3RvcnlOdW1iZXI/LnJvdXRlUGFydGl0aW9uTmFtZSB8fCBudWxsXHJcbiAgICAgICAgLy8gICAgIH0pKTtcclxuXHJcbiAgICAgICAgLy8gICAgIHRoaXMudGVtcGxhdGVMaW5lcy5mb3JFYWNoKChsaW5lOiBhbnkpID0+IHRoaXMuaW5pdExpbmVXaXRoU2l0ZUluZm8obGluZSkpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmluaXRUZW1wbGF0ZURuc05hbWVzRm9yTGluZXModGhpcy50ZW1wbGF0ZUxpbmVzKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHJvdXRlUGFydGl0aW9ucyA9IHRoaXMubGluZVNlbGVjdGlvbnNcclxuICAgICAgICAvLyAgICAgLm1hcChsaW5lID0+IGxpbmUucm91dGVQYXJ0aXRpb25OYW1lKVxyXG4gICAgICAgIC8vICAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiAhIXZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuICAgICAgICAvLyB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IHRoaXMudW5pcXVlU3RyaW5ncyhyb3V0ZVBhcnRpdGlvbnMpO1xyXG5cclxuICAgICAgICAvLyB0aGlzLmRldmljZUVudHJpZXMgPSBkZXZpY2VzRnJvbVRlbXBsYXRlLm1hcChkZXZpY2UgPT4gKHtcclxuICAgICAgICAvLyAgICAgZGV2aWNlVHlwZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5kZXZpY2VUeXBlKSxcclxuICAgICAgICAvLyAgICAgcHJvdG9jb2w6IHRoaXMudmFsdWVUb1N0cmluZyhkZXZpY2UucHJvdG9jb2wpLFxyXG4gICAgICAgIC8vICAgICBidXR0b25UZW1wbGF0ZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5idXR0b25UZW1wbGF0ZSksXHJcbiAgICAgICAgLy8gICAgIG5hbWU6IHRoaXMudmFsdWVUb1N0cmluZyhkZXZpY2UubmFtZSlcclxuICAgICAgICAvLyB9KSk7XHJcbiAgICAgICAgLy8gdGhpcy5kZXZpY2VSb3dzID0gdGhpcy5kZXZpY2VFbnRyaWVzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4ICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgICAgICAvLyB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgLy8gdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRVc2VyQ3JlYXRpb25UeXBlKHR5cGU6IFVzZXJDcmVhdGlvblR5cGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckNyZWF0aW9uVHlwZSA9IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc2V0VXNlckRldGFpbHNTdGVwU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgZW1haWw6ICcnLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExkYXBVc2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxkYXBVc2VycyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzVG90YWwgPSAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUxpbmVzU25hcHNob3QpIHtcclxuICAgICAgICAgICAgdGhpcy5saW5lcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy50ZW1wbGF0ZUxpbmVzU25hcHNob3QpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGV2aWNlcy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAgICAgICAgIGRldmljZS5uYW1lID0gJyc7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcy5mb3JFYWNoKHByb2ZpbGUgPT4ge1xyXG4gICAgICAgICAgICBwcm9maWxlLm5hbWUgPSAnJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIudXNlcmlkID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5maXJzdE5hbWUgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5lbWFpbCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxpbmVzID0gdGhpcy5saW5lcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdVc2VycyA9IFtdO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZVByb2ZpbGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYXB0dXJlVGVtcGxhdGVMaW5lc1NuYXBzaG90KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVMaW5lc1NuYXBzaG90ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmxpbmVzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXNlckRldGFpbHNGaWVsZChmaWVsZDoga2V5b2YgVXNlckRldGFpbHNGb3JtLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMudXNlckRldGFpbHNGb3JtLFxyXG4gICAgICAgICAgICBbZmllbGRdOiB2YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VXNlckRldGFpbHNGb3JtVmFsdWUoZm9ybVZhbHVlOiBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtVmFsdWUgPSBmb3JtVmFsdWU7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogZm9ybVZhbHVlLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiBmb3JtVmFsdWUuZmlyc3ROYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogZm9ybVZhbHVlLmxhc3ROYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogZm9ybVZhbHVlLmVtYWlsIHx8ICcnLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZvcm1WYWx1ZS5saW5lcz8uZm9yRWFjaCgobGluZVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5saW5lc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICghbGluZT8uZGlyZWN0b3J5TnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGluZS5kaXJlY3RvcnlOdW1iZXIuZGlyZWN0b3J5TnVtYmVyID0gbGluZVZhbHVlLm51bWJlciB8fCAnJztcclxuICAgICAgICAgICAgbGluZS5kaXJlY3RvcnlOdW1iZXIucm91dGVQYXJ0aXRpb25OYW1lID0gbGluZVZhbHVlLnJvdXRlUGFydGl0aW9uIHx8ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmb3JtVmFsdWUuZGV2aWNlcz8uZm9yRWFjaCgoZGV2aWNlVmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRldmljZSA9IHRoaXMuZGV2aWNlc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICghZGV2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGV2aWNlLm5hbWUgPSBkZXZpY2VWYWx1ZS5uYW1lIHx8ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmb3JtVmFsdWUuZGV2aWNlUHJvZmlsZXM/LmZvckVhY2goKHByb2ZpbGVWYWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZGV2aWNlUHJvZmlsZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoIXByb2ZpbGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcm9maWxlLm5hbWUgPSBwcm9maWxlVmFsdWUubmFtZSB8fCAnJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIudXNlcmlkID0gZm9ybVZhbHVlLnVzZXJJZCB8fCAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmZpcnN0TmFtZSA9IGZvcm1WYWx1ZS5maXJzdE5hbWUgfHwgJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sYXN0TmFtZSA9IGZvcm1WYWx1ZS5sYXN0TmFtZSB8fCAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmVtYWlsID0gZm9ybVZhbHVlLmVtYWlsIHx8ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZVByb2ZpbGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGluZVNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgbGluZU51bWJlclxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFJvdXRlUGFydGl0aW9uU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIHJvdXRlUGFydGl0aW9uTmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0sXHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERldmljZU5hbWUoaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0uZGV2aWNlVHlwZSB8fCAnJztcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGRldmljZVR5cGUuaW5jbHVkZXMoJzg4NTEnKVxyXG4gICAgICAgICAgICA/IG5hbWUucmVwbGFjZSgvXlNFUFxccyovaSwgJycpXHJcbiAgICAgICAgICAgIDogbmFtZTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZUVudHJpZXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmICghZW50cnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVudHJ5LmRldmljZVR5cGU/LmluY2x1ZGVzKCc4ODUxJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGBTRVAgJHtlbnRyeS5uYW1lIHx8ICcnfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZU51bWJlciA9IHRoaXMubGluZVNlbGVjdGlvbnNbMF0/LmxpbmVOdW1iZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBsaW5lTnVtYmVyID8gYENTRiR7bGluZU51bWJlcn1gIDogJ0NTRltETl0nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVudHJ5Lm5hbWUgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNpdGVBbGxEYXRhKHNpdGVJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25BcGlTZXJ2aWNlLmdldFNpdGVBbGxEYXRhKHNpdGVJZCkucGlwZShcclxuICAgICAgICAgICAgdGFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXNbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXRlID0gbmV3IFNpdGUocmVzWzBdIGFzIFNpdGVJbnRlcmZhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZS5pZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaXRlRGVmYXVsdHMgPSBuZXcgU2l0ZURlZmF1bHRzKHJlc1sxXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxTaXRlRGVmYXVsdHMgPSBuZXcgU2l0ZURlZmF1bHRzKHJlc1sxXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gWy4uLnRoaXMucm91dGVQYXJ0aXRpb25OYW1lc0xpc3RdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXNbMl0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZVR5cGVzID0gcmVzWzJdIGFzIHN0cmluZ1tdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKHJlcyA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRGV2aWNlRGVmYXVsdHNGb3JEZXZpY2VzKHNpdGVJZCkucGlwZShtYXAoKCkgPT4gcmVzKSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWREZXZpY2VEZWZhdWx0c0ZvckRldmljZXMoc2l0ZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBkZXZpY2VUeXBlcyA9IHRoaXMuZ2V0VW5pcXVlRGV2aWNlVHlwZXMoKTtcclxuICAgICAgICBpZiAoIWRldmljZVR5cGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RzID0gZGV2aWNlVHlwZXMubWFwKGRldmljZVR5cGUgPT5cclxuICAgICAgICAgICAgdGhpcy51c2VyQ3JlYXRpb25BcGlTZXJ2aWNlLmdldERldmljZURlZmF1bHRzKFN0cmluZyhzaXRlSWQpLCBkZXZpY2VUeXBlKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKGRlZmF1bHRzID0+IHRoaXMuYXBwbHlEZXZpY2VEZWZhdWx0c1RvVHlwZShkZXZpY2VUeXBlLCBkZWZhdWx0cykpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cykucGlwZShcclxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuZGV2aWNlRGVmYXVsdHNMb2FkZWRTdWJqZWN0Lm5leHQoKSksXHJcbiAgICAgICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFVuaXF1ZURldmljZVR5cGVzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB0eXBlcyA9IFtcclxuICAgICAgICAgICAgLi4udGhpcy5kZXZpY2VzLm1hcChkZXZpY2UgPT4gZGV2aWNlLmRldmljZVR5cGUpLFxyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZVByb2ZpbGVzLm1hcChwcm9maWxlID0+IHByb2ZpbGUuZGV2aWNlVHlwZSksXHJcbiAgICAgICAgXS5maWx0ZXIoKHR5cGUpOiB0eXBlIGlzIHN0cmluZyA9PiAhIXR5cGUgJiYgdHlwZS50cmltKCkubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KHR5cGVzKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBseURldmljZURlZmF1bHRzVG9UeXBlKGRldmljZVR5cGU6IHN0cmluZywgZGVmYXVsdHM6IERldmljZURlZmF1bHRzSW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb25SZWdleCA9IHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keShkZWZhdWx0cy5kZXZpY2VOYW1lUmVnZXgpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5kZXZpY2VzLCAuLi50aGlzLmRldmljZVByb2ZpbGVzXS5maWx0ZXIoXHJcbiAgICAgICAgICAgIGRldmljZSA9PiBkZXZpY2UuZGV2aWNlVHlwZSA9PT0gZGV2aWNlVHlwZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRhcmdldHMuZm9yRWFjaChkZXZpY2UgPT4ge1xyXG4gICAgICAgICAgICBkZXZpY2UuZGV2aWNlRGVmYXVsdHMgPSBkZWZhdWx0cztcclxuICAgICAgICAgICAgZGV2aWNlLm5hbWVWYWxpZGF0aW9uUmVnZXggPSBuYW1lVmFsaWRhdGlvblJlZ2V4O1xyXG4gICAgICAgICAgICBkZXZpY2UubmFtZVZhbGlkYXRpb25DYXB0aW9uID0gZGVmYXVsdHMuZGV2aWNlTmFtZUV4cGxhaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VOYW1lUHJlZml4KGRldmljZUluZGV4OiBudW1iZXIsIGlzUHJvZmlsZSA9IGZhbHNlKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgZGV2aWNlID0gaXNQcm9maWxlID8gdGhpcy5kZXZpY2VQcm9maWxlc1tkZXZpY2VJbmRleF0gOiB0aGlzLmRldmljZXNbZGV2aWNlSW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGRldmljZT8ucHJlZml4Py50cmltKCk7XHJcbiAgICAgICAgcmV0dXJuIHByZWZpeCB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZU5hbWVWYWxpZGF0aW9uQ2FwdGlvbihkZXZpY2VJbmRleDogbnVtYmVyLCBpc1Byb2ZpbGUgPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZGV2aWNlID0gaXNQcm9maWxlID8gdGhpcy5kZXZpY2VQcm9maWxlc1tkZXZpY2VJbmRleF0gOiB0aGlzLmRldmljZXNbZGV2aWNlSW5kZXhdO1xyXG4gICAgICAgIHJldHVybiBkZXZpY2U/Lm5hbWVWYWxpZGF0aW9uQ2FwdGlvbiB8fCBkZXZpY2U/LmRldmljZURlZmF1bHRzPy5kZXZpY2VOYW1lRXhwbGFpbmVkIHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZU5hbWVWYWxpZGF0aW9uT3B0aW9ucyhkZXZpY2VJbmRleDogbnVtYmVyLCBpc1Byb2ZpbGUgPSBmYWxzZSk6IHtcclxuICAgICAgICByZWdleDogc3RyaW5nO1xyXG4gICAgICAgIGNhcHRpb246IHN0cmluZztcclxuICAgIH0gfCBudWxsIHtcclxuICAgICAgICBjb25zdCBkZXZpY2UgPSBpc1Byb2ZpbGUgPyB0aGlzLmRldmljZVByb2ZpbGVzW2RldmljZUluZGV4XSA6IHRoaXMuZGV2aWNlc1tkZXZpY2VJbmRleF07XHJcbiAgICAgICAgY29uc3QgcmVnZXggPVxyXG4gICAgICAgICAgICBkZXZpY2U/Lm5hbWVWYWxpZGF0aW9uUmVnZXg/LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICBwYXJzZURldmljZU5hbWVSZWdleEJvZHkoZGV2aWNlPy5kZXZpY2VEZWZhdWx0cz8uZGV2aWNlTmFtZVJlZ2V4KTtcclxuICAgICAgICBpZiAoIXJlZ2V4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZWdleCxcclxuICAgICAgICAgICAgY2FwdGlvbjogdGhpcy5nZXREZXZpY2VOYW1lVmFsaWRhdGlvbkNhcHRpb24oZGV2aWNlSW5kZXgsIGlzUHJvZmlsZSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TnVtYmVyUmFuZ2Uoc2l0ZUlkOiBzdHJpbmcsIHJvdXRlUGFydGl0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEF2YWlsYWJsZVJhbmdlSW50ZXJmYWNlPiB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG4gPSB7fTtcclxuICAgICAgICBjb25zdCBwYWdlU2l6ZSA9IDk5OTk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge2RudHlwZTogRG5SYW5nZVR5cGUuZXh0ZW5zaW9uLCByb3V0ZXBhcnRpdGlvbjogcm91dGVQYXJ0aXRpb24sIHNpemU6IHBhZ2VTaXplLCBwYWdlOiAwfTtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZU51bWJlcnMgPSBbXTtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25BcGlTZXJ2aWNlLmdldEF2YWlsYWJsZURuSW5SYW5nZXMoc2l0ZUlkLCBwYXJhbXMpXHJcbiAgICAgICAgLnBpcGUobWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXMuYXZhaWxhYmxlTnVtYmVyTGlzdC5mb3JFYWNoKChhdmFpbGFibGVOdW1iZXI6IEF2YWlsYWJsZVBob25lTnVtYmVyUmFuZ2VJbnRlcmZhY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXZhaWxhYmxlRGlkTWFwcGVkVG9EbihhdmFpbGFibGVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVOdW1iZXJzID0gWy4uLnRoaXMuYXZhaWxhYmxlTnVtYmVycywgLi4udGhpcy5nZXRVbndyYXBOdW1iZXJSYW5nZShhdmFpbGFibGVOdW1iZXIpXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC8vIC5waXBlKHRoaXMuaGFuZGxlRXJyb3IodHJ1ZSwgZmFsc2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld1VzZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVzZXJUZW1wbGF0ZSA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZU5hbWUgfHwgJyc7XHJcbiAgICAgICAgY29uc3QgaGFzVXNlckRhdGEgPSBPYmplY3QudmFsdWVzKHRoaXMudXNlckRldGFpbHNGb3JtKS5zb21lKHZhbHVlID0+IHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuICAgICAgICB0aGlzLm92ZXJ2aWV3VXNlcnMgPSBoYXNVc2VyRGF0YVxyXG4gICAgICAgICAgICA/IFt7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlckRldGFpbHNGb3JtLnVzZXJJZCxcclxuICAgICAgICAgICAgICAgIGZpcnN0TmFtZTogdGhpcy51c2VyRGV0YWlsc0Zvcm0uZmlyc3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgbGFzdE5hbWU6IHRoaXMudXNlckRldGFpbHNGb3JtLmxhc3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgZW1haWw6IHRoaXMudXNlckRldGFpbHNGb3JtLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgdXNlclRlbXBsYXRlXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkT3ZlcnZpZXdMaW5lcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmb3JtTGluZXMgPSB0aGlzLnVzZXJEZXRhaWxzRm9ybVZhbHVlPy5saW5lcztcclxuICAgICAgICBpZiAoZm9ybUxpbmVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5vdmVydmlld0xpbmVzID0gZm9ybUxpbmVzXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gISFsaW5lPy5udW1iZXI/LnRyaW0oKSlcclxuICAgICAgICAgICAgICAgIC5tYXAoKGxpbmVWYWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUxpbmUgPSB0aGlzLmxpbmVzW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjc3MgPSB0aGlzLnZhbHVlVG9TdHJpbmcodGVtcGxhdGVMaW5lPy5jYWxsaW5nU2VhcmNoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcjogbGluZVZhbHVlLm51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlkOiBsaW5lVmFsdWUubGluZU51bWJlciB8fCBsaW5lVmFsdWUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVWYWx1ZS5yb3V0ZVBhcnRpdGlvbiB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52YWx1ZVRvU3RyaW5nKHRlbXBsYXRlTGluZT8uZGVzY3JpcHRpb24pLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdmVydmlld0xpbmVzID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICAubWFwKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbj8ubGluZU51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMaW5lID0gdGhpcy5saW5lT3B0aW9ucy5maW5kKGxpbmUgPT4gbGluZS5udW1iZXIgPT09IHNlbGVjdGlvbi5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogc2VsZWN0ZWRMaW5lLm51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICBkaWQ6IHNlbGVjdGVkTGluZS5kaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBzZWxlY3Rpb24ucm91dGVQYXJ0aXRpb25OYW1lIHx8IHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zWzBdIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNzczogc2VsZWN0ZWRMaW5lLmNzcyxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc2VsZWN0ZWRMaW5lLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKChsaW5lKTogbGluZSBpcyBPdmVydmlld0xpbmVSb3cgPT4gISFsaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0RldmljZXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMaW5lTnVtYmVycyA9IHRoaXMub3ZlcnZpZXdMaW5lcy5tYXAobGluZSA9PiBsaW5lLm51bWJlcikuam9pbignLCAnKTtcclxuICAgICAgICBjb25zdCBmb3JtRGV2aWNlcyA9IHRoaXMudXNlckRldGFpbHNGb3JtVmFsdWU/LmRldmljZXM7XHJcbiAgICAgICAgaWYgKGZvcm1EZXZpY2VzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5vdmVydmlld0RldmljZXMgPSBmb3JtRGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihkZXZpY2UgPT4gISFkZXZpY2UuZGV2aWNlVHlwZT8udHJpbSgpIHx8ICEhZGV2aWNlLm5hbWU/LnRyaW0oKSlcclxuICAgICAgICAgICAgICAgIC5tYXAoZGV2aWNlID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZGV2aWNlLm5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLmRldmljZVR5cGUgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZXM6IHNlbGVjdGVkTGluZU51bWJlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2RldmljZS5wcm90b2NvbCB8fCAnJ30gLyAke2RldmljZS5idXR0b25UZW1wbGF0ZSB8fCAnJ31gLnRyaW0oKSxcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdmVydmlld0RldmljZXMgPSB0aGlzLmRldmljZUVudHJpZXNcclxuICAgICAgICAgICAgLm1hcCgoZGV2aWNlLCBpbmRleCkgPT4gKHtcclxuICAgICAgICAgICAgICAgIGRldmljZSxcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLmdldERldmljZURpc3BsYXlOYW1lKGluZGV4KVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLmZpbHRlcigoeyBkZXZpY2UsIGRpc3BsYXlOYW1lIH0pID0+IGRpc3BsYXlOYW1lLnRyaW0oKS5sZW5ndGggPiAwIHx8IGRldmljZS5kZXZpY2VUeXBlLnRyaW0oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAubWFwKCh7IGRldmljZSwgZGlzcGxheU5hbWUgfSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLmRldmljZVR5cGUsXHJcbiAgICAgICAgICAgICAgICBsaW5lczogc2VsZWN0ZWRMaW5lTnVtYmVycyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtkZXZpY2UucHJvdG9jb2x9IC8gJHtkZXZpY2UuYnV0dG9uVGVtcGxhdGV9YFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkT3ZlcnZpZXdEZXZpY2VQcm9maWxlcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZExpbmVOdW1iZXJzID0gdGhpcy5vdmVydmlld0xpbmVzLm1hcChsaW5lID0+IGxpbmUubnVtYmVyKS5qb2luKCcsICcpO1xyXG4gICAgICAgIGNvbnN0IGZvcm1Qcm9maWxlcyA9IHRoaXMudXNlckRldGFpbHNGb3JtVmFsdWU/LmRldmljZVByb2ZpbGVzO1xyXG4gICAgICAgIGlmICghZm9ybVByb2ZpbGVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5vdmVydmlld0RldmljZVByb2ZpbGVzID0gW107XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdEZXZpY2VQcm9maWxlcyA9IGZvcm1Qcm9maWxlc1xyXG4gICAgICAgICAgICAuZmlsdGVyKHByb2ZpbGUgPT4gISFwcm9maWxlLmRldmljZVR5cGU/LnRyaW0oKSB8fCAhIXByb2ZpbGUubmFtZT8udHJpbSgpKVxyXG4gICAgICAgICAgICAubWFwKHByb2ZpbGUgPT4gKHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHByb2ZpbGUubmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIGRldmljZVR5cGU6IHByb2ZpbGUuZGV2aWNlVHlwZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIGxpbmVzOiBzZWxlY3RlZExpbmVOdW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3Byb2ZpbGUucHJvdG9jb2wgfHwgJyd9IC8gJHtwcm9maWxlLmJ1dHRvblRlbXBsYXRlIHx8ICcnfWAudHJpbSgpLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleHRyYWN0VGVtcGxhdGVGcm9tVG9rZW5QYXlsb2FkKHBheWxvYWQ6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFwYXlsb2FkIHx8IHR5cGVvZiBwYXlsb2FkICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWRbMF0gfHwgbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhwYXlsb2FkKVswXTtcclxuICAgICAgICByZXR1cm4gZmlyc3RLZXkgPyBwYXlsb2FkW2ZpcnN0S2V5XSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bmlxdWVCeU51bWJlcihsaW5lczogTGluZU9wdGlvbltdKTogTGluZU9wdGlvbltdIHtcclxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmVzLmZpbHRlcihsaW5lID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGxpbmUubnVtYmVyKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKGxpbmUubnVtYmVyKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bmlxdWVTdHJpbmdzKGl0ZW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGl0ZW1zKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB2YWx1ZVRvU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRVbndyYXBOdW1iZXJSYW5nZShhdmFpbGFibGVOdW1iZXI6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgdW53cmFwTnVtYmVyUmFuZ2UgPSB0aGlzLnVud3JhcE51bWJlclJhbmdlKGF2YWlsYWJsZU51bWJlci5waG9uZU51bWJlclJhbmdlLmZyb20sIGF2YWlsYWJsZU51bWJlci5waG9uZU51bWJlclJhbmdlLnRvKVxyXG4gICAgICAgICAgICAubWFwKCh1bndyYXBwZWROdW1iZXI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkbiA9IGF2YWlsYWJsZU51bWJlci5waG9uZU51bWJlclJhbmdlLnByZWZpeCArIHVud3JhcHBlZE51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHN0ciA9IGRuO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dICYmIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ10gJiYgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ10ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgICAgICAgIERJRDogICcgKyAodGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ10ubGVuZ3RoID4gMSA/ICdtdWx0aXBsZScgOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsnbWFwcGVkRGlkcyddWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ3ZtJ10pIHtcclxuICAgICAgICAgICAgICAgIHN0ciArPSAnICAgICAgICBJbiBVc2UgLSBWTSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdW53cmFwTnVtYmVyUmFuZ2UgPSB1bndyYXBOdW1iZXJSYW5nZS5maWx0ZXIoKHVud3JhcHBlZE51bWJlcjogc3RyaW5nKSA9PiAhYXZhaWxhYmxlTnVtYmVyLnVzZWROdW1iZXJzLmluY2x1ZGVzKHVud3JhcHBlZE51bWJlcikpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB1bndyYXBOdW1iZXJSYW5nZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVud3JhcE51bWJlclJhbmdlKHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGNvbnN0IHJlZ0V4cCA9IC8oXjArKS87XHJcbiAgICAgICAgbGV0IGxlYWRpbmdaZXJvcyA9ICcnO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBzdGFydC5tYXRjaChyZWdFeHApO1xyXG4gICAgICAgIGlmIChtYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdaZXJvcyA9IG1hdGNoZXNbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXJ0TnVtZXJpYyA9IG5ldyBCaWcoc3RhcnQpO1xyXG4gICAgICAgIGNvbnN0IGVuZE51bWVyaWMgPSBuZXcgQmlnKGVuZCk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDogTnVtYmVyKGVuZE51bWVyaWMubWludXMoc3RhcnROdW1lcmljKS5wbHVzKG5ldyBCaWcoMSkpLnRvRml4ZWQoMCkpfSwgKHYsIGs6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSBTdHJpbmcoc3RhcnROdW1lcmljLnBsdXMobmV3IEJpZyhrLnRvU3RyaW5nKCkpKS50b0ZpeGVkKDApKTtcclxuICAgICAgICAgICAgaWYgKChsZWFkaW5nWmVyb3MgKyBudW1iZXIpLmxlbmd0aCA+IHN0YXJ0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZWFkaW5nWmVyb3MgPSBsZWFkaW5nWmVyb3Muc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nWmVyb3MgKyBudW1iZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEF2YWlsYWJsZURpZE1hcHBlZFRvRG4oYXZhaWxhYmxlTnVtYmVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoYXZhaWxhYmxlTnVtYmVyLnVuVXNlZE51bWJlcnNXaXRoRGlkcyAmJiBhdmFpbGFibGVOdW1iZXIudW5Vc2VkTnVtYmVyc1dpdGhEaWRzLmxlbmd0aCkge1xyXG5cclxuICAgICAgICAgICAgYXZhaWxhYmxlTnVtYmVyLnVuVXNlZE51bWJlcnNXaXRoRGlkcy5mb3JFYWNoKChudW1iZXJXaXRoRGlkczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRuID0gbnVtYmVyV2l0aERpZHNbJ3VuVXNlZE51bWJlciddO1xyXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl0gPSBbe31dO1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyV2l0aERpZHNbJ3RyYW5zbGF0aW9uUGF0dGVybkxpc3QnXSAmJiBudW1iZXJXaXRoRGlkc1sndHJhbnNsYXRpb25QYXR0ZXJuTGlzdCddLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXSA9IG51bWJlcldpdGhEaWRzWyd0cmFuc2xhdGlvblBhdHRlcm5MaXN0J107XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXSA9IFt7fV07XHJcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyV2l0aERpZHNbJ21hcHBlZERpZHMnXSAmJiBudW1iZXJXaXRoRGlkc1snbWFwcGVkRGlkcyddLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsnbWFwcGVkRGlkcyddID0gbnVtYmVyV2l0aERpZHNbJ21hcHBlZERpZHMnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ3ZtJ10gPSBudW1iZXJXaXRoRGlkc1sndm0nXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBBUEkgaW50ZWdyYXRpb24uXHJcbiAgICBsb2FkRGF0YUZyb21BcGkoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gdGhpcy5hcGkuZ2V0V2l6YXJkQm9vdHN0cmFwRGF0YSgpLnN1YnNjcmliZSguLi4pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TGluZVdpdGhTaXRlSW5mbyhsaW5lOiBMaW5lSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgbGluZS5kaXJlY3RvcnlOdW1iZXIucm91dGVQYXJ0aXRpb25OYW1lID0gdGhpcy5zaXRlRGVmYXVsdHM/LnJvdXRlUGFydGl0aW9uIHx8ICcnO1xyXG4gICAgXHJcbiAgICAgICAgbGV0IGNhbGxpbmdTZWFyY2hTcGFjZVZhbCA9IHRoaXMuc2l0ZURlZmF1bHRzPy5saW5lQ3NzIHx8ICcnO1xyXG4gICAgICAgIGxpbmUuY2FsbGluZ1NlYXJjaFNwYWNlID0gY2FsbGluZ1NlYXJjaFNwYWNlVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgaW5pdFRlbXBsYXRlRG5zTmFtZXNGb3JMaW5lcyh1c2VyTGluZXM6IFRlbXBsYXRlTGluZUxpa2VbXSk6IHZvaWQge1xyXG4gICAgLy8gICAgIGNvbnN0IHJvdXRlUGFydGl0aW9uID0gdGhpcy5zaXRlRGVmYXVsdHM/LnJvdXRlUGFydGl0aW9uIHx8ICcnO1xyXG4gICAgLy8gICAgIGlmICh1c2VyTGluZXMgJiYgdXNlckxpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgdXNlckxpbmVzLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBsaW5lICYmIGxpbmUuZGlyZWN0b3J5TnVtYmVyICYmIChsaW5lLmRpcmVjdG9yeU51bWJlci50ZW1wbGF0ZURpcmVjdG9yeU51bWJlciA9IGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlcik7XHJcbiAgICAvLyAgICAgICAgICAgICBsaW5lICYmIGxpbmUuZGlyZWN0b3J5TnVtYmVyICYmIChsaW5lLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXIgPSAnJyk7XHJcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gbGluZTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBjb25zdCByb3V0ZVBhcnRpdGlvbiA9IHRoaXMuc2l0ZURlZmF1bHRzPy5yb3V0ZVBhcnRpdGlvbiB8fCAnJztcclxuICAgIC8vICAgICAgICAgLy8gaWYgKGxpbmUubGluZUFzc29jaWF0aW9ucyAmJiBsaW5lLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIHRoaXMuc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShsaW5lLCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAvLyAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdGhpcy50ZW1wbGF0ZURldmljZXMuZm9yRWFjaChkZXZpY2UgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZiAoZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMgJiYgZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNldExpbmVBc3NvY2lhdGlvbnNGb3JEZXZpY2UoZGV2aWNlLCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICBwcml2YXRlIHNldExpbmVBc3NvY2lhdGlvbnNGb3JEZXZpY2UoZGV2aWNlOiBUZW1wbGF0ZURldmljZUxpa2UsIHJvdXRlUGFydGl0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBsaW5lQXNzb2NpYXRpb25zID0gZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMgfHwgW107XHJcbiAgICAgICAgaWYobGluZUFzc29jaWF0aW9ucyAmJiBsaW5lQXNzb2NpYXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsaW5lQXNzb2NpYXRpb25zLmZvckVhY2gobGluZUFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbiAmJiBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyICYmIChsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXIgfHwgJycpO1xyXG4gICAgICAgICAgICAgICAgbGluZUFzc29jaWF0aW9uICYmIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIucm91dGVQYXJ0aXRpb25OYW1lID0gcm91dGVQYXJ0aXRpb24pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RGV2aWNlV2l0aFNpdGVJbmZvKGRldmljZTogRGV2aWNlSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgZGV2aWNlLm5ld05hbWUgPSBkZXZpY2UubmFtZTtcclxuICAgICAgICBkZXZpY2UubmFtZSA9ICcnO1xyXG4gICAgICAgIGlmICghZGV2aWNlWydlbmFibGVkRXh0ZW5zaW9uTW9iaWxpdHknXSkge1xyXG4gICAgICAgIGRldmljZS5lbmFibGVkRXh0ZW5zaW9uTW9iaWxpdHkgPSB0aGlzLnNpdGVEZWZhdWx0cz8uZW5hYmxlRW0gPz8gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VbJ2VuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSddLnRvU3RyaW5nKCkgPT09ICdZZXMnKSB7XHJcbiAgICAgICAgZGV2aWNlLmVuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VbJ2VuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSddLnRvU3RyaW5nKCkgPT09ICdObycpIHtcclxuICAgICAgICBkZXZpY2UuZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGV2aWNlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkVmFsdWUgPSB0aGlzLnJlcGxhY2VEeW5hbWljVmFsdWVTaXRlSW5mbyhkZXZpY2UubG9jYXRpb24sIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmxvY2F0aW9uID0gcmVwbGFjZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRldmljZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZFZhbHVlID0gdGhpcy5yZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZGV2aWNlLmRldmljZVBvb2xOYW1lLCB0aGlzLmN1cnJlbnRTaXRlPy5zaG9ydE5hbWUgPz8gJycpID8/IG51bGw7XHJcbiAgICAgICAgICAgIGRldmljZS5kZXZpY2VQb29sTmFtZSA9IHJlcGxhY2VkVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkZXZpY2UubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRWYWx1ZSA9IHRoaXMucmVwbGFjZUR5bmFtaWNWYWx1ZVNpdGVJbmZvKGRldmljZS5jYWxsaW5nU2VhcmNoU3BhY2VOYW1lLCB0aGlzLmN1cnJlbnRTaXRlPy5zaG9ydE5hbWUgPz8gJycpID8/IG51bGw7XHJcbiAgICAgICAgICAgIGRldmljZS5jYWxsaW5nU2VhcmNoU3BhY2VOYW1lID0gcmVwbGFjZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRldmljZS5leHRyYU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRWYWx1ZSA9IHRoaXMucmVwbGFjZUR5bmFtaWNWYWx1ZVNpdGVJbmZvKGRldmljZS5leHRyYU9wdGlvbnMuYWFyQ3NzLCB0aGlzLmN1cnJlbnRTaXRlPy5zaG9ydE5hbWUgPz8gJycpID8/IG51bGw7XHJcbiAgICAgICAgICAgIGRldmljZS5leHRyYU9wdGlvbnMuYWFyQ3NzID0gcmVwbGFjZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFkZXZpY2UuZGVzY3JpcHRpb24gJiYgdGhpcy5zaXRlRGVmYXVsdHMpIHtcclxuICAgICAgICAgICAgZGV2aWNlLmRlc2NyaXB0aW9uID0gdGhpcy5zaXRlRGVmYXVsdHMuZGV2aWNlRGVzY3JpcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVwbGFjZUR5bmFtaWNWYWx1ZVNpdGVJbmZvKGZpZWxkVmFsdWU6IGFueSwgc2l0ZVNob3J0TmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUpIHtcclxuICAgICAgICBmaWVsZFZhbHVlID0gdGhpcy5yZXBsYWNlRHluYW1pY1ZhbHVlRm9ybWF0KGZpZWxkVmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtc1RvUmVwbGFjZXMgPSB7ICdTaXRlU2hvcnROYW1lJzogc2l0ZVNob3J0TmFtZSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGxpU3RyaW5nUmVwbGFjZShwYXJhbXNUb1JlcGxhY2VzLCBmaWVsZFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXBsYWNlRHluYW1pY1ZhbHVlRm9ybWF0KHN0cjogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFxbRk5cXF0vaWcsICdbRk5dJykucmVwbGFjZSgvXFxbTE5cXF0vaWcsICdbTE5dJykucmVwbGFjZSgvXFxbSURcXF0vaWcsICdbVXNlcklkXScpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW1VzZXJJZFxcXS9pZywgJ1tVc2VySWRdJykucmVwbGFjZSgvPE1hdGNoIFVzZXIgSUQ+L2lnLCAnW1VzZXJJZF0nKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXFtFbWFpbFxcXS9pZywgJ1tFbWFpbF0nKS5yZXBsYWNlKC9cXFtETlxcKC9pZywgJ1tETignKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXFtTaXRlU2hvcnROYW1lXFxdL2lnLCAnW1NpdGVTaG9ydE5hbWVdJykucmVwbGFjZSgvXFwkXFwoU2l0ZVNob3J0TmFtZVxcKS9pZywgJ1tTaXRlU2hvcnROYW1lXScpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcJFxce1NpdGVTaG9ydE5hbWVcXH0vaWcsICdbU2l0ZVNob3J0TmFtZV0nKS5yZXBsYWNlKC97U2l0ZVNob3J0TmFtZX0vaWcsICdbU2l0ZVNob3J0TmFtZV0nKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXFtGTlxcKC9pZywgJ1tGTignKS5yZXBsYWNlKC9cXFtMTlxcKC9pZywgJ1tMTignKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXFtJRFxcKC9pZywgJ1tJRCgnKTtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtdXRsaVN0cmluZ1JlcGxhY2Uob2JqZWN0OiBhbnksIGlucHV0OiBzdHJpbmcsIGRpcmVjdG9yeU51bWJlcj86IHN0cmluZywgdXNlcj86IGFueSk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHZhbCA9IGlucHV0O1xyXG5cclxuICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdbRE5dJykgJiYgZGlyZWN0b3J5TnVtYmVyICYmICFkaXJlY3RvcnlOdW1iZXIuaW5jbHVkZXMoJ0xpbmUnKSkge1xyXG4gICAgICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgnW0ROXScsIGRpcmVjdG9yeU51bWJlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaW5kZXhPZkROID0gdmFsLmluZGV4T2YoJ1tETignKTtcclxuICAgICAgICBpZiAoaW5kZXhPZkROICE9PSAtMSAmJiBkaXJlY3RvcnlOdW1iZXIpIHtcclxuICAgICAgICAgICAgdmFyIGRpZ2l0ID0gdmFsLnN1YnN0cmluZyhpbmRleE9mRE4gKyA0LCB2YWwuaW5kZXhPZignKScsIGluZGV4T2ZETiArIDQpKTtcclxuICAgICAgICAgICAgdmFyIGRpZ2l0Q291bnQgPSBOdW1iZXIoZGlnaXQpIHx8IDA7XHJcbiAgICAgICAgICAgIHZhciBkbkRpZ2l0ID0gKGRpZ2l0Q291bnQgPiB2YWwubGVuZ3RoKSA/IGRpcmVjdG9yeU51bWJlciA6IGRpcmVjdG9yeU51bWJlci5zdWJzdHJpbmcoZGlyZWN0b3J5TnVtYmVyLmxlbmd0aCAtIGRpZ2l0Q291bnQsIGRpcmVjdG9yeU51bWJlci5sZW5ndGgpO1xyXG4gICAgICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgnW0ROKCcgKyBkaWdpdCArICcpXScsIGRuRGlnaXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGluZGV4T2ZGTiA9IHZhbC5pbmRleE9mKCdbRk4oJyk7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZGTiAhPT0gLTEgJiYgdXNlciAmJiB1c2VyLmZpcnN0TmFtZSkge1xyXG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB2YWwuc3Vic3RyaW5nKGluZGV4T2ZGTiArIDQsIHZhbC5pbmRleE9mKCcpJywgaW5kZXhPZkZOICsgNCkpO1xyXG4gICAgICAgICAgICB2YXIgZm5EaWdpdCA9IHVzZXIuZmlyc3ROYW1lLnN1YnN0cmluZygwLCBkaWdpdCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdbRk4oJyArIGRpZ2l0ICsgJyldJywgZm5EaWdpdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpbmRleE9mTE4gPSB2YWwuaW5kZXhPZignW0xOKCcpO1xyXG4gICAgICAgIGlmIChpbmRleE9mTE4gIT09IC0xICYmIHVzZXIgJiYgdXNlci5sYXN0TmFtZSkge1xyXG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB2YWwuc3Vic3RyaW5nKGluZGV4T2ZMTiArIDQsIHZhbC5pbmRleE9mKCcpJywgaW5kZXhPZkxOICsgNCkpO1xyXG4gICAgICAgICAgICB2YXIgbG5EaWdpdCA9IHVzZXIubGFzdE5hbWUuc3Vic3RyaW5nKDAsIGRpZ2l0KTtcclxuICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1tMTignICsgZGlnaXQgKyAnKV0nLCBsbkRpZ2l0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZGV4T2ZJRCA9IHZhbC5pbmRleE9mKCdbSUQoJyk7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZJRCAhPT0gLTEgJiYgdXNlciAmJiB1c2VyLnVzZXJpZCkge1xyXG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB2YWwuc3Vic3RyaW5nKGluZGV4T2ZJRCArIDQsIHZhbC5pbmRleE9mKCcpJywgaW5kZXhPZklEICsgNCkpO1xyXG4gICAgICAgICAgICB2YXIgaWREaWdpdCA9IHVzZXIudXNlcmlkLnN1YnN0cmluZygwLCBkaWdpdCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdbSUQoJyArIGRpZ2l0ICsgJyldJywgaWREaWdpdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCk7XHJcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChwYXJhKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBmaW5kID0gJ1snICsgcGFyYVswXSArICddJztcclxuICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gcGFyYVsxXSAhPSBudWxsID8gU3RyaW5nKHBhcmFbMV0pIDogJyc7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdChmaW5kKS5qb2luKHJlcGxhY2VtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFRlbXBsYXRlRG5zTmFtZXNGb3JMaW5lcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5saW5lcyAmJiB0aGlzLmxpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5saW5lcy5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGluZS5kaXJlY3RvcnlOdW1iZXIudGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIgPSBsaW5lLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXIgPSAnJztcclxuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUGFydGl0aW9uID0gdGhpcy5zaXRlRGVmYXVsdHM/LnJvdXRlUGFydGl0aW9uIHx8ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmRldmljZXMuZm9yRWFjaChkZXZpY2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRldmljZS5saW5lQXNzb2NpYXRpb25zICYmIGRldmljZS5saW5lQXNzb2NpYXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lQXNzb2NpYXRpb25zRm9yRGV2aWNlKGRldmljZSwgcm91dGVQYXJ0aXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcy5mb3JFYWNoKGRldmljZVByb2ZpbGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRldmljZVByb2ZpbGUubGluZUFzc29jaWF0aW9ucyAmJiBkZXZpY2VQcm9maWxlLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVBc3NvY2lhdGlvbnNGb3JEZXZpY2UoZGV2aWNlUHJvZmlsZSwgcm91dGVQYXJ0aXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVuZFVzZXI/LnNpbmdsZU51bWJlclJlYWNoICYmIHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5hc3NvY2lhdGVkTGluZXMgJiYgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLmFzc29jaWF0ZWRMaW5lcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2guYXNzb2NpYXRlZExpbmVzICYmIHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5hc3NvY2lhdGVkTGluZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLmFzc29jaWF0ZWRMaW5lcy5tYXAobGluZUFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci50ZW1wbGF0ZURpcmVjdG9yeU51bWJlciA9IGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIuZGlyZWN0b3J5TnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnJvdXRlUGFydGl0aW9uTmFtZSA9IHJvdXRlUGFydGl0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5yZW1vdGVEZXN0aW5hdGlvbnMgJiYgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLnJlbW90ZURlc3RpbmF0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2gucmVtb3RlRGVzdGluYXRpb25zLmZvckVhY2gocmVtb3RlRGVzdGluYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3RlRGVzdGluYXRpb24ubGluZUFzc29jaWF0aW9ucyAmJiByZW1vdGVEZXN0aW5hdGlvbi5saW5lQXNzb2NpYXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlRGVzdGluYXRpb24ubGluZUFzc29jaWF0aW9ucy5tYXAobGluZUFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSByb3V0ZVBhcnRpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYnVpbGRTYXZhYmxlRW5kVXNlcigpOiBFbmRVc2VySW50ZXJmYWNlIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRlbXBsYXRlIHVzZXIgbG9hZGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBidWlsZFNhdmFibGVFbmRVc2VyKFxyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIsXHJcbiAgICAgICAgICAgIHRoaXMubGluZXMsXHJcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlcyxcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcyxcclxuICAgICAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVEZXZpY2VOYW1lOiAoaW5kZXgsIGRldmljZSkgPT4gdGhpcy5yZXNvbHZlRGV2aWNlTmFtZUZvclNhdmUoaW5kZXgsIGRldmljZSksXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlRGV2aWNlUHJvZmlsZU5hbWU6IChpbmRleCwgcHJvZmlsZSkgPT4gdGhpcy5yZXNvbHZlRGV2aWNlTmFtZUZvclNhdmUoaW5kZXgsIHByb2ZpbGUpLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc29sdmVEZXZpY2VOYW1lRm9yU2F2ZShfaW5kZXg6IG51bWJlciwgZGV2aWNlOiBEZXZpY2VJbnRlcmZhY2UpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHJhd05hbWUgPSAoZGV2aWNlLm5hbWUgfHwgZGV2aWNlLm5ld05hbWUgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICBpZiAoIXJhd05hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwcmVmaXggPSBkZXZpY2UucHJlZml4Py50cmltKCk7XHJcbiAgICAgICAgaWYgKHByZWZpeCAmJiAhcmF3TmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZml4LnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtyYXdOYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByYXdOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYXZlTmV3VXNlcigpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmJ1aWxkU2F2YWJsZUVuZFVzZXIoKTtcclxuICAgICAgICBjb25zdCBzaXRlSWQgPSBTdHJpbmcodGhpcy5zZWxlY3RlZFNpdGUgPz8gJycpO1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBTdHJpbmcodGhpcy5zZWxlY3RlZFRlbXBsYXRlSWQgPz8gJycpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2Uuc2F2ZVRlbXBsYXRlVXNlcih1c2VyLCB0ZW1wbGF0ZUlkLCBzaXRlSWQpO1xyXG4gICAgfVxyXG59Il19
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7O0FBeUZ6RixNQUFNLE9BQU8seUJBQXlCO0lBOEJsQztRQTdCaUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTdDLHFCQUFnQixHQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLHNCQUFpQixHQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoRSxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsMEJBQXFCLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFDOUIsa0JBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQ3RDLGtCQUFhLEdBQXNCLEVBQUUsQ0FBQztRQUN0QyxvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBb0I7WUFDL0IsTUFBTSxFQUFFLEVBQUU7WUFDVixTQUFTLEVBQUUsRUFBRTtZQUNiLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsbUJBQWMsR0FBc0IsRUFBRSxDQUFDO1FBQ3ZDLGtCQUFhLEdBQWtCLEVBQUUsQ0FBQztRQUVsQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2QkFBd0IsR0FBcUIsTUFBTSxDQUFDO1FBRW5DLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFHbEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFnQjtRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ25CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ3RCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxlQUFlLENBQUMsSUFBbUI7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQXVCO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxPQUFZO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBd0IsUUFBUSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDN0QsTUFBTSxpQkFBaUIsR0FBdUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxNQUFNLG1CQUFtQixHQUF5QixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXhHLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBaUIsaUJBQWlCO2FBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUNsRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLElBQUksRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQ2xHLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUNuQixPQUFPLElBQUksRUFBRSxrQkFBa0IsS0FBSyxRQUFRO2dCQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtnQkFDekIsQ0FBQyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQ3ZDO1lBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQztTQUNyRCxDQUFDLENBQUM7YUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuRCxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUN2QixrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUM3RSxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsSUFBSSxJQUFJO2FBQ2pELENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTTtZQUNILE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE1BQU0scUJBQXFCLEdBQWlCLGdCQUFnQjtpQkFDdkQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxlQUFlLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQztnQkFDbkUsT0FBTztvQkFDSCxNQUFNO29CQUNOLEdBQUcsRUFBRSxNQUFNO29CQUNYLEdBQUcsRUFBRSxFQUFFO29CQUNQLFdBQVcsRUFBRSxFQUFFO2lCQUNsQixDQUFDO1lBQ04sQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRW5ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ3ZCLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQzdFLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixJQUFJLElBQUk7YUFDakQsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzthQUNwQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDakQsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxJQUFzQjtRQUM5QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUE0QixFQUFFLEtBQWE7UUFDM0QsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixHQUFHLElBQUksQ0FBQyxlQUFlO1lBQ3ZCLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSztTQUNqQixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWEsRUFBRSxVQUF5QjtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0IsVUFBVTtTQUNiLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsS0FBYSxFQUFFLGtCQUFpQztRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0Isa0JBQWtCO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE9BQU87U0FDVjtRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3hCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDNUIsSUFBSSxFQUFFLGNBQWM7U0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUM7WUFDdEQsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN0RDtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxtQkFBbUI7UUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2Y7Z0JBQ0ksTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxjQUFjO2dCQUNuQixHQUFHLEVBQUUsc0JBQXNCO2dCQUMzQixXQUFXLEVBQUUsRUFBRTthQUNsQjtZQUNEO2dCQUNJLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsY0FBYztnQkFDbkIsR0FBRyxFQUFFLHNCQUFzQjtnQkFDM0IsV0FBVyxFQUFFLEVBQUU7YUFDbEI7WUFDRDtnQkFDSSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLEdBQUcsRUFBRSxzQkFBc0I7Z0JBQzNCLFdBQVcsRUFBRSxFQUFFO2FBQ2xCO1NBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7WUFDekYsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUU7U0FDbEcsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDbEI7Z0JBQ0ksVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJO2FBQzVEO1NBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDakI7Z0JBQ0ksVUFBVSxFQUFFLFlBQVk7Z0JBQ3hCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLGNBQWMsRUFBRSxtQkFBbUI7Z0JBQ25DLElBQUksRUFBRSxFQUFFO2FBQ1g7WUFDRDtnQkFDSSxVQUFVLEVBQUUseUNBQXlDO2dCQUNyRCxRQUFRLEVBQUUsS0FBSztnQkFDZixjQUFjLEVBQUUsb0NBQW9DO2dCQUNwRCxJQUFJLEVBQUUsRUFBRTthQUNYO1NBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDO1FBQ3RELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVztZQUM1QixDQUFDLENBQUMsQ0FBQztvQkFDQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNO29CQUNuQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTO29CQUN6QyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRO29CQUN2QyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO29CQUNqQyxZQUFZO2lCQUNmLENBQUM7WUFDRixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVPLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQ25DLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFO2dCQUN4QixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxPQUFPO2dCQUNILE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDM0IsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHO2dCQUNyQixrQkFBa0IsRUFBRSxTQUFTLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZGLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2FBQ3hDLENBQUM7UUFDTixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhO2FBQ3BDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckIsTUFBTTtZQUNOLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1NBQ2hELENBQUMsQ0FBQzthQUNGLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDekcsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSSxFQUFFLFdBQVc7WUFDakIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsTUFBTSxNQUFNLENBQUMsY0FBYyxFQUFFO1NBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVPLCtCQUErQixDQUFDLE9BQVk7UUFDaEQsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDekMsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4QixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7U0FDN0I7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQW1CO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQWU7UUFDakMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFjO1FBQ2hDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELGVBQWU7UUFDWCxtREFBbUQ7SUFDdkQsQ0FBQzs7dUhBL1ZRLHlCQUF5QjsySEFBekIseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9zZXJ2aWNlcy91c2VyLWNyZWF0aW9uLWFwaS5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExkYXBVc2VyUm93IHtcclxuICAgIHVzZXJJZDogc3RyaW5nO1xyXG4gICAgZmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgICBsYXN0TmFtZTogc3RyaW5nO1xyXG4gICAgZW1haWw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPdmVydmlld1VzZXJSb3cgZXh0ZW5kcyBMZGFwVXNlclJvdyB7XHJcbiAgICB1c2VyVGVtcGxhdGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPdmVydmlld0xpbmVSb3cge1xyXG4gICAgbnVtYmVyOiBzdHJpbmc7XHJcbiAgICBkaWQ6IHN0cmluZztcclxuICAgIHJvdXRlUGFydGl0aW9uTmFtZTogc3RyaW5nO1xyXG4gICAgY3NzOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJ2aWV3RGV2aWNlUm93IHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGRldmljZVR5cGU6IHN0cmluZztcclxuICAgIGxpbmVzOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBVc2VyQ3JlYXRpb25UeXBlID0gJ0NVQ00nIHwgJ01UJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRldGFpbHNGb3JtIHtcclxuICAgIHVzZXJJZDogc3RyaW5nO1xyXG4gICAgZmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgICBsYXN0TmFtZTogc3RyaW5nO1xyXG4gICAgZW1haWw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMaW5lT3B0aW9uIHtcclxuICAgIG51bWJlcjogc3RyaW5nO1xyXG4gICAgZGlkOiBzdHJpbmc7XHJcbiAgICBjc3M6IHN0cmluZztcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0ZWRMaW5lUm93IHtcclxuICAgIGxpbmVOdW1iZXI6IHN0cmluZyB8IG51bGw7XHJcbiAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlRW50cnkge1xyXG4gICAgZGV2aWNlVHlwZTogc3RyaW5nO1xyXG4gICAgcHJvdG9jb2w6IHN0cmluZztcclxuICAgIGJ1dHRvblRlbXBsYXRlOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUZW1wbGF0ZUxpbmVMaWtlIHtcclxuICAgIGRpcmVjdG9yeU51bWJlcj86IHtcclxuICAgICAgICBkaXJlY3RvcnlOdW1iZXI/OiBzdHJpbmc7XHJcbiAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIH07XHJcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjYWxsaW5nU2VhcmNoU3BhY2U/OiBzdHJpbmcgfCB7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsO1xyXG4gICAgZGlkUGF0dGVybnM/OiBBcnJheTx7IHBhdHRlcm4/OiBzdHJpbmcgfCBudWxsIH0+IHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIFRlbXBsYXRlRGV2aWNlTGlrZSB7XHJcbiAgICBkZXZpY2VUeXBlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIHByb3RvY29sPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGJ1dHRvblRlbXBsYXRlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbGluZUFzc29jaWF0aW9ucz86IEFycmF5PHtcclxuICAgICAgICBkaXJlY3RvcnlOdW1iZXI/OiB7XHJcbiAgICAgICAgICAgIGRpcmVjdG9yeU51bWJlcj86IHN0cmluZztcclxuICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgfT47XHJcbn1cclxuXHJcbmludGVyZmFjZSBUZW1wbGF0ZUVuZFVzZXJMaWtlIHtcclxuICAgIHVzZXJpZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBmaXJzdE5hbWU/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbGFzdE5hbWU/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbGluZXM/OiBUZW1wbGF0ZUxpbmVMaWtlW10gfCBudWxsO1xyXG4gICAgZGV2aWNlcz86IFRlbXBsYXRlRGV2aWNlTGlrZVtdIHwgbnVsbDtcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVXNlckNyZWF0aW9uV2l6YXJkU2VydmljZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaSA9IGluamVjdChVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlKTtcclxuXHJcbiAgICByZWFkb25seSBsZGFwVGFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFsndXNlcklkJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdlbWFpbCcsICdhZGQnXTtcclxuICAgIHJlYWRvbmx5IHVzZXJDcmVhdGlvblR5cGVzOiBVc2VyQ3JlYXRpb25UeXBlW10gPSBbJ0NVQ00nLCAnTVQnXTtcclxuXHJcbiAgICBzaXRlT3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICAgIHRlbXBsYXRlT3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICAgIGxpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBbXTtcclxuICAgIHJvdXRlUGFydGl0aW9uT3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICAgIGRldmljZVJvd3M6IG51bWJlcltdID0gW107XHJcbiAgICBsZGFwVXNlcnM6IExkYXBVc2VyUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3VXNlcnM6IE92ZXJ2aWV3VXNlclJvd1tdID0gW107XHJcbiAgICBvdmVydmlld0xpbmVzOiBPdmVydmlld0xpbmVSb3dbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdEZXZpY2VzOiBPdmVydmlld0RldmljZVJvd1tdID0gW107XHJcbiAgICB1c2VyRGV0YWlsc0Zvcm06IFVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICB1c2VySWQ6ICcnLFxyXG4gICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgIGVtYWlsOiAnJ1xyXG4gICAgfTtcclxuICAgIGxpbmVTZWxlY3Rpb25zOiBTZWxlY3RlZExpbmVSb3dbXSA9IFtdO1xyXG4gICAgZGV2aWNlRW50cmllczogRGV2aWNlRW50cnlbXSA9IFtdO1xyXG5cclxuICAgIHNlbGVjdGVkU2l0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVXNlckNyZWF0aW9uVHlwZTogVXNlckNyZWF0aW9uVHlwZSA9ICdDVUNNJztcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFkZGVkTGRhcFVzZXJJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmxvYWRQbGFjZWhvbGRlckRhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRMZGFwVXNlcihyb3c6IExkYXBVc2VyUm93KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogcm93LnVzZXJJZCxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiByb3cuZmlyc3ROYW1lLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogcm93Lmxhc3ROYW1lLFxyXG4gICAgICAgICAgICBlbWFpbDogcm93LmVtYWlsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFkZGVkTGRhcFVzZXJJZHMuYWRkKHJvdy51c2VySWQpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0xkYXBVc2VyQWRkZWQocm93OiBMZGFwVXNlclJvdyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZGVkTGRhcFVzZXJJZHMuaGFzKHJvdy51c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkU2l0ZShzaXRlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNpdGUgPSBzaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRUZW1wbGF0ZURyaXZlbkRhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlUm93cyA9IFtdO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseVRlbXBsYXRlVG9rZW5QYXlsb2FkKHBheWxvYWQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5leHRyYWN0VGVtcGxhdGVGcm9tVG9rZW5QYXlsb2FkKHBheWxvYWQpO1xyXG4gICAgICAgIGNvbnN0IGVuZFVzZXI6IFRlbXBsYXRlRW5kVXNlckxpa2UgPSB0ZW1wbGF0ZT8uZW5kVXNlciB8fCB7fTtcclxuICAgICAgICBjb25zdCBsaW5lc0Zyb21UZW1wbGF0ZTogVGVtcGxhdGVMaW5lTGlrZVtdID0gQXJyYXkuaXNBcnJheShlbmRVc2VyLmxpbmVzKSA/IGVuZFVzZXIubGluZXMgOiBbXTtcclxuICAgICAgICBjb25zdCBkZXZpY2VzRnJvbVRlbXBsYXRlOiBUZW1wbGF0ZURldmljZUxpa2VbXSA9IEFycmF5LmlzQXJyYXkoZW5kVXNlci5kZXZpY2VzKSA/IGVuZFVzZXIuZGV2aWNlcyA6IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiB0aGlzLnZhbHVlVG9TdHJpbmcoZW5kVXNlci51c2VyaWQpLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IHRoaXMudmFsdWVUb1N0cmluZyhlbmRVc2VyLmZpcnN0TmFtZSksXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcoZW5kVXNlci5sYXN0TmFtZSksXHJcbiAgICAgICAgICAgIGVtYWlsOiB0aGlzLnZhbHVlVG9TdHJpbmcoZW5kVXNlci5lbWFpbClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBtYXBwZWRMaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gbGluZXNGcm9tVGVtcGxhdGVcclxuICAgICAgICAgICAgLm1hcChsaW5lID0+ICh7XHJcbiAgICAgICAgICAgICAgICBudW1iZXI6IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciksXHJcbiAgICAgICAgICAgICAgICBkaWQ6IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kaWRQYXR0ZXJucz8uWzBdPy5wYXR0ZXJuIHx8IGxpbmU/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyKSxcclxuICAgICAgICAgICAgICAgIGNzczogdGhpcy52YWx1ZVRvU3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBsaW5lPy5jYWxsaW5nU2VhcmNoU3BhY2UgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbGluZS5jYWxsaW5nU2VhcmNoU3BhY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBsaW5lPy5jYWxsaW5nU2VhcmNoU3BhY2U/Lm5hbWVcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+IGxpbmUubnVtYmVyLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuXHJcbiAgICAgICAgaWYgKG1hcHBlZExpbmVPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVPcHRpb25zID0gdGhpcy51bmlxdWVCeU51bWJlcihtYXBwZWRMaW5lT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSB0aGlzLmxpbmVPcHRpb25zLm1hcChsaW5lID0+ICh7XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lLm51bWJlcixcclxuICAgICAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogbGluZXNGcm9tVGVtcGxhdGUuZmluZChcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT4gKHNvdXJjZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJycpID09PSBsaW5lLm51bWJlclxyXG4gICAgICAgICAgICAgICAgKT8uZGlyZWN0b3J5TnVtYmVyPy5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgbnVsbFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZUFzc29jaWF0aW9ucyA9IGRldmljZXNGcm9tVGVtcGxhdGUuZmxhdE1hcChkZXZpY2UgPT4gZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMgfHwgW10pO1xyXG4gICAgICAgICAgICBjb25zdCBhc3NvY2lhdGVkTGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IGxpbmVBc3NvY2lhdGlvbnNcclxuICAgICAgICAgICAgICAgIC5tYXAoYXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlciA9IGFzc29jaWF0aW9uPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3M6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLm51bWJlci50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxpbmVPcHRpb25zID0gdGhpcy51bmlxdWVCeU51bWJlcihhc3NvY2lhdGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVBc3NvY2lhdGlvbnMuZmluZChcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT4gKHNvdXJjZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJycpID09PSBsaW5lLm51bWJlclxyXG4gICAgICAgICAgICAgICAgKT8uZGlyZWN0b3J5TnVtYmVyPy5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgbnVsbFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3V0ZVBhcnRpdGlvbnMgPSB0aGlzLmxpbmVTZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnJvdXRlUGFydGl0aW9uTmFtZSlcclxuICAgICAgICAgICAgLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gISF2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSB0aGlzLnVuaXF1ZVN0cmluZ3Mocm91dGVQYXJ0aXRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5kZXZpY2VFbnRyaWVzID0gZGV2aWNlc0Zyb21UZW1wbGF0ZS5tYXAoZGV2aWNlID0+ICh7XHJcbiAgICAgICAgICAgIGRldmljZVR5cGU6IHRoaXMudmFsdWVUb1N0cmluZyhkZXZpY2UuZGV2aWNlVHlwZSksXHJcbiAgICAgICAgICAgIHByb3RvY29sOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLnByb3RvY29sKSxcclxuICAgICAgICAgICAgYnV0dG9uVGVtcGxhdGU6IHRoaXMudmFsdWVUb1N0cmluZyhkZXZpY2UuYnV0dG9uVGVtcGxhdGUpLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLm5hbWUpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlUm93cyA9IHRoaXMuZGV2aWNlRW50cmllcy5tYXAoKF8sIGluZGV4KSA9PiBpbmRleCArIDEpO1xyXG5cclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkVXNlckNyZWF0aW9uVHlwZSh0eXBlOiBVc2VyQ3JlYXRpb25UeXBlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZXJEZXRhaWxzRmllbGQoZmllbGQ6IGtleW9mIFVzZXJEZXRhaWxzRm9ybSwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnVzZXJEZXRhaWxzRm9ybSxcclxuICAgICAgICAgICAgW2ZpZWxkXTogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRMaW5lU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGxpbmVOdW1iZXI6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Um91dGVQYXJ0aXRpb25TZWxlY3Rpb24oaW5kZXg6IG51bWJlciwgcm91dGVQYXJ0aXRpb25OYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGV2aWNlTmFtZShpbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XS5kZXZpY2VUeXBlIHx8ICcnO1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZGV2aWNlVHlwZS5pbmNsdWRlcygnODg1MScpXHJcbiAgICAgICAgICAgID8gbmFtZS5yZXBsYWNlKC9eU0VQXFxzKi9pLCAnJylcclxuICAgICAgICAgICAgOiBuYW1lO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0sXHJcbiAgICAgICAgICAgIG5hbWU6IG5vcm1hbGl6ZWROYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VEaXNwbGF5TmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF07XHJcbiAgICAgICAgaWYgKCFlbnRyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW50cnkuZGV2aWNlVHlwZT8uaW5jbHVkZXMoJzg4NTEnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYFNFUCAke2VudHJ5Lm5hbWUgfHwgJyd9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTnVtYmVyID0gdGhpcy5saW5lU2VsZWN0aW9uc1swXT8ubGluZU51bWJlcjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXIgPyBgQ1NGJHtsaW5lTnVtYmVyfWAgOiAnQ1NGW0ROXSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZW50cnkubmFtZSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBQbGFjZWhvbGRlciBib290c3RyYXAgdW50aWwgYmFja2VuZCBBUElzIGFyZSBjb25uZWN0ZWQuXHJcbiAgICBsb2FkUGxhY2Vob2xkZXJEYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2l0ZU9wdGlvbnMgPSBbJ1NpdGUgMScsICdTaXRlIDInLCAnU2l0ZSAzJ107XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9wdGlvbnMgPSBbJ1VzZXIgODg1MSBPZmZpY2UnXTtcclxuICAgICAgICB0aGlzLmxpbmVPcHRpb25zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBudW1iZXI6ICc1NTcwNDYnLFxyXG4gICAgICAgICAgICAgICAgZGlkOiAnKzEzMTI1NTU3MDQ2JyxcclxuICAgICAgICAgICAgICAgIGNzczogJ0F0bGFudGFfaW50ZXJuYWxfY3NzJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBudW1iZXI6ICc1NTcwNDcnLFxyXG4gICAgICAgICAgICAgICAgZGlkOiAnKzEzMTI1NTU3MDQ3JyxcclxuICAgICAgICAgICAgICAgIGNzczogJ0F0bGFudGFfaW50ZXJuYWxfY3NzJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBudW1iZXI6ICc1NTcwNDgnLFxyXG4gICAgICAgICAgICAgICAgZGlkOiAnKzEzMTI1NTU3MDQ4JyxcclxuICAgICAgICAgICAgICAgIGNzczogJ0F0bGFudGFfaW50ZXJuYWxfY3NzJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IFsnQXRsYW50YV9pbnRlcm5hbF9QVCcsICdCZWlqaW5nX25hdGlvbmFsX1BUJ107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VSb3dzID0gWzEsIDJdO1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzID0gW1xyXG4gICAgICAgICAgICB7IHVzZXJJZDogJ0pvaG4uRG9lJywgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgZW1haWw6ICdqb2huLmRvZUBjYXIud2VzdC5pbycgfSxcclxuICAgICAgICAgICAgeyB1c2VySWQ6ICdKYW5lLlNtaXRoJywgZmlyc3ROYW1lOiAnSmFuZScsIGxhc3ROYW1lOiAnU21pdGgnLCBlbWFpbDogJ2phbmUuc21pdGhAY2FyLndlc3QuaW8nIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zWzBdIHx8IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5kZXZpY2VFbnRyaWVzID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiAnQ2lzY28gODg1MScsXHJcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogJ1NJUCcsXHJcbiAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogJ1N0YW5kYXJkIDg4NTEgU0lQJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRldmljZVR5cGU6ICdDaXNjbyBVbmlmaWVkIENsaWVudCBTZXJ2aWNlcyBGcmFtZXdvcmsnLFxyXG4gICAgICAgICAgICAgICAgcHJvdG9jb2w6ICdTSVAnLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uVGVtcGxhdGU6ICdTdGFuZGFyZCBDbGllbnQgU2VydmljZXMgRnJhbWV3b3JrJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA/PyBudWxsO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkT3ZlcnZpZXdVc2VycygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1c2VyVGVtcGxhdGUgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgfHwgJyc7XHJcbiAgICAgICAgY29uc3QgaGFzVXNlckRhdGEgPSBPYmplY3QudmFsdWVzKHRoaXMudXNlckRldGFpbHNGb3JtKS5zb21lKHZhbHVlID0+IHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuICAgICAgICB0aGlzLm92ZXJ2aWV3VXNlcnMgPSBoYXNVc2VyRGF0YVxyXG4gICAgICAgICAgICA/IFt7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlckRldGFpbHNGb3JtLnVzZXJJZCxcclxuICAgICAgICAgICAgICAgIGZpcnN0TmFtZTogdGhpcy51c2VyRGV0YWlsc0Zvcm0uZmlyc3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgbGFzdE5hbWU6IHRoaXMudXNlckRldGFpbHNGb3JtLmxhc3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgZW1haWw6IHRoaXMudXNlckRldGFpbHNGb3JtLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgdXNlclRlbXBsYXRlXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkT3ZlcnZpZXdMaW5lcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm92ZXJ2aWV3TGluZXMgPSB0aGlzLmxpbmVTZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5tYXAoc2VsZWN0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uPy5saW5lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZExpbmUgPSB0aGlzLmxpbmVPcHRpb25zLmZpbmQobGluZSA9PiBsaW5lLm51bWJlciA9PT0gc2VsZWN0aW9uLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBzZWxlY3RlZExpbmUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpZDogc2VsZWN0ZWRMaW5lLmRpZCxcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHNlbGVjdGlvbi5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnNbMF0gfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3NzOiBzZWxlY3RlZExpbmUuY3NzLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzZWxlY3RlZExpbmUuZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIE92ZXJ2aWV3TGluZVJvdyA9PiAhIWxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZExpbmVOdW1iZXJzID0gdGhpcy5vdmVydmlld0xpbmVzLm1hcChsaW5lID0+IGxpbmUubnVtYmVyKS5qb2luKCcsICcpO1xyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdEZXZpY2VzID0gdGhpcy5kZXZpY2VFbnRyaWVzXHJcbiAgICAgICAgICAgIC5tYXAoKGRldmljZSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBkZXZpY2UsXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy5nZXREZXZpY2VEaXNwbGF5TmFtZShpbmRleClcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgZGV2aWNlLCBkaXNwbGF5TmFtZSB9KSA9PiBkaXNwbGF5TmFtZS50cmltKCkubGVuZ3RoID4gMCB8fCBkZXZpY2UuZGV2aWNlVHlwZS50cmltKCkubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgLm1hcCgoeyBkZXZpY2UsIGRpc3BsYXlOYW1lIH0pID0+ICh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcclxuICAgICAgICAgICAgICAgIGRldmljZVR5cGU6IGRldmljZS5kZXZpY2VUeXBlLFxyXG4gICAgICAgICAgICAgICAgbGluZXM6IHNlbGVjdGVkTGluZU51bWJlcnMsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7ZGV2aWNlLnByb3RvY29sfSAvICR7ZGV2aWNlLmJ1dHRvblRlbXBsYXRlfWBcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICghcGF5bG9hZCB8fCB0eXBlb2YgcGF5bG9hZCAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkWzBdIHx8IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gT2JqZWN0LmtleXMocGF5bG9hZClbMF07XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0S2V5ID8gcGF5bG9hZFtmaXJzdEtleV0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW5pcXVlQnlOdW1iZXIobGluZXM6IExpbmVPcHRpb25bXSk6IExpbmVPcHRpb25bXSB7XHJcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICAgIHJldHVybiBsaW5lcy5maWx0ZXIobGluZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhsaW5lLm51bWJlcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZWVuLmFkZChsaW5lLm51bWJlcik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW5pcXVlU3RyaW5ncyhpdGVtczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChpdGVtcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdmFsdWVUb1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBBUEkgaW50ZWdyYXRpb24uXHJcbiAgICBsb2FkRGF0YUZyb21BcGkoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gdGhpcy5hcGkuZ2V0V2l6YXJkQm9vdHN0cmFwRGF0YSgpLnN1YnNjcmliZSguLi4pXHJcbiAgICB9XHJcbn0iXX0=