@tuki-io/tuki-widgets 0.0.190 → 0.0.192

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 (30) hide show
  1. package/esm2020/user-creation/src/app.constants.mjs +9 -2
  2. package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +19 -0
  3. package/esm2020/user-creation/src/shared/material.module.mjs +35 -7
  4. package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +42 -19
  5. package/esm2020/user-creation/src/user-creation.module.mjs +4 -1
  6. package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +14 -0
  7. package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +147 -0
  8. package/esm2020/user-creation/src/utils/validation.mjs +14 -0
  9. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +429 -20
  10. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-overview-step/user-overview-step.component.mjs +3 -3
  11. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +80 -34
  12. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +61 -11
  13. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +509 -130
  14. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +1446 -300
  15. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  16. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +1408 -287
  17. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  18. package/package.json +1 -1
  19. package/user-creation/src/app.constants.d.ts +7 -0
  20. package/user-creation/src/interfaces/user-creation-wizard.interfaces.d.ts +483 -0
  21. package/user-creation/src/shared/material.module.d.ts +5 -1
  22. package/user-creation/src/shared/services/user-creation-api.service.d.ts +8 -2
  23. package/user-creation/src/user-creation.module.d.ts +11 -10
  24. package/user-creation/src/utils/app-loader/app-loader.d.ts +6 -0
  25. package/user-creation/src/utils/build-savable-end-user.d.ts +23 -0
  26. package/user-creation/src/utils/validation.d.ts +4 -0
  27. package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +75 -7
  28. package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +11 -4
  29. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.d.ts +13 -0
  30. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +57 -56
@@ -1,11 +1,35 @@
1
1
  import { inject, Injectable } from "@angular/core";
2
2
  import { UserCreationApiService } from "../../shared/services/user-creation-api.service";
3
+ import { map, 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";
3
9
  import * as i0 from "@angular/core";
4
10
  export class UserCreationWizardService {
11
+ get currentSite() {
12
+ return this._currentSite;
13
+ }
14
+ get firstLineRoutePartition() {
15
+ return this.lines[0]?.directoryNumber?.routePartitionName ?? '';
16
+ }
17
+ get siteDefaultRoutePartition() {
18
+ return this.siteDefaults?.routePartition || '';
19
+ }
20
+ get routePartitionNamesList() {
21
+ return this.siteDefaults ? this.siteDefaults.routePartitionFilter : [];
22
+ }
5
23
  constructor() {
6
- this.api = inject(UserCreationApiService);
24
+ this.userCreationApiService = inject(UserCreationApiService);
7
25
  this.ldapTableColumns = ['userId', 'firstName', 'lastName', 'email', 'add'];
8
26
  this.userCreationTypes = ['CUCM', 'MT'];
27
+ this.template = null;
28
+ this.endUser = null;
29
+ this.lines = [];
30
+ this.devices = [];
31
+ this.deviceProfiles = [];
32
+ this._currentSite = null;
9
33
  this.siteOptions = [];
10
34
  this.templateOptions = [];
11
35
  this.lineOptions = [];
@@ -15,41 +39,87 @@ export class UserCreationWizardService {
15
39
  this.overviewUsers = [];
16
40
  this.overviewLines = [];
17
41
  this.overviewDevices = [];
42
+ this.overviewDeviceProfiles = [];
43
+ this.userDetailsFormValue = null;
18
44
  this.userDetailsForm = {
19
45
  userId: '',
20
46
  firstName: '',
21
47
  lastName: '',
22
- email: ''
48
+ email: '',
23
49
  };
24
50
  this.lineSelections = [];
25
51
  this.deviceEntries = [];
52
+ this.availableNumbers = [];
53
+ this.deviceTypes = [];
54
+ this.siteDefaults = null;
55
+ this.originalSiteDefaults = null;
56
+ this.templateLines = [];
57
+ this.templateDevices = [];
58
+ this.templateUserDetails = {};
26
59
  this.selectedSite = null;
27
- this.selectedTemplate = null;
60
+ this.selectedTemplateName = null;
61
+ this.selectedTemplateId = null;
28
62
  this.selectedUserCreationType = 'CUCM';
29
- this.addedLdapUserIds = new Set();
30
- this.loadPlaceholderData();
63
+ this.availableDidPatternsMappedToDn = {};
64
+ this.selectedLdapUser = null;
65
+ this.ldapUsersTotal = 0;
66
+ // this.loadPlaceholderData();
31
67
  }
32
- addLdapUser(row) {
68
+ get isLdapIntegrated() {
69
+ return !!this.endUser?.ldapIntegrated;
70
+ }
71
+ selectLdapUser(user) {
72
+ this.selectedLdapUser = user;
73
+ if (this.endUser) {
74
+ this.endUser.ldapIntegrated = true;
75
+ this.endUser.userid = user.userid;
76
+ this.endUser.firstName = user.firstName ?? '';
77
+ this.endUser.lastName = user.lastName ?? '';
78
+ this.endUser.email = user.email ?? '';
79
+ }
33
80
  this.userDetailsForm = {
34
- userId: row.userId,
35
- firstName: row.firstName,
36
- lastName: row.lastName,
37
- email: row.email
81
+ userId: user.userid,
82
+ firstName: user.firstName ?? '',
83
+ lastName: user.lastName ?? '',
84
+ email: user.email ?? '',
38
85
  };
39
- this.addedLdapUserIds.clear();
40
- this.addedLdapUserIds.add(row.userId);
41
86
  this.rebuildOverviewUsers();
42
87
  }
43
- isLdapUserAdded(row) {
44
- return this.addedLdapUserIds.has(row.userId);
88
+ clearLdapUserSelection() {
89
+ this.selectedLdapUser = null;
90
+ if (this.endUser) {
91
+ this.endUser.ldapIntegrated = false;
92
+ this.endUser.userid = '';
93
+ this.endUser.firstName = '';
94
+ this.endUser.lastName = '';
95
+ this.endUser.email = '';
96
+ }
97
+ this.userDetailsForm = {
98
+ userId: '',
99
+ firstName: '',
100
+ lastName: '',
101
+ email: '',
102
+ };
103
+ this.rebuildOverviewUsers();
104
+ }
105
+ isLdapUserRowSelected(row) {
106
+ return this.selectedLdapUser?.userid === row.userid;
107
+ }
108
+ setLdapUsersResult(users, total) {
109
+ this.ldapUsers = users;
110
+ this.ldapUsersTotal = total;
45
111
  }
46
112
  setSelectedSite(site) {
47
- this.selectedSite = site;
113
+ this.selectedSite = site || null;
48
114
  }
49
115
  setSelectedTemplate(template) {
50
- this.selectedTemplate = template;
116
+ this.selectedTemplateName = template?.name || null;
117
+ this.selectedTemplateId = template?.id || null;
51
118
  this.rebuildOverviewUsers();
52
119
  }
120
+ setCurrentSite(site) {
121
+ this._currentSite = site;
122
+ }
53
123
  resetTemplateDrivenData() {
54
124
  this.lineOptions = [];
55
125
  this.routePartitionOptions = [];
@@ -60,66 +130,78 @@ export class UserCreationWizardService {
60
130
  this.rebuildOverviewDevices();
61
131
  }
62
132
  applyTemplateTokenPayload(payload) {
63
- const template = this.extractTemplateFromTokenPayload(payload);
64
- const endUser = template?.endUser || {};
65
- const linesFromTemplate = Array.isArray(endUser.lines) ? endUser.lines : [];
66
- const devicesFromTemplate = Array.isArray(endUser.devices) ? endUser.devices : [];
67
- this.userDetailsForm = {
68
- userId: this.valueToString(endUser.userid),
69
- firstName: this.valueToString(endUser.firstName),
70
- lastName: this.valueToString(endUser.lastName),
71
- email: this.valueToString(endUser.email)
72
- };
73
- const mappedLineOptions = linesFromTemplate
74
- .map(line => ({
75
- number: this.valueToString(line?.directoryNumber?.directoryNumber),
76
- did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
77
- css: this.valueToString(typeof line?.callingSearchSpace === 'string'
78
- ? line.callingSearchSpace
79
- : line?.callingSearchSpace?.name),
80
- description: this.valueToString(line?.description)
81
- }))
82
- .filter(line => line.number.trim().length > 0);
83
- if (mappedLineOptions.length) {
84
- this.lineOptions = this.uniqueByNumber(mappedLineOptions);
85
- this.lineSelections = this.lineOptions.map(line => ({
86
- lineNumber: line.number,
87
- routePartitionName: linesFromTemplate.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
88
- }));
89
- }
90
- else {
91
- const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
92
- const associatedLineOptions = lineAssociations
93
- .map(association => {
94
- const number = association?.directoryNumber?.directoryNumber || '';
95
- return {
96
- number,
97
- did: number,
98
- css: '',
99
- description: ''
100
- };
101
- })
102
- .filter(line => line.number.trim().length > 0);
103
- this.lineOptions = this.uniqueByNumber(associatedLineOptions);
104
- this.lineSelections = this.lineOptions.map(line => ({
105
- lineNumber: line.number,
106
- routePartitionName: lineAssociations.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
107
- }));
108
- }
109
- const routePartitions = this.lineSelections
110
- .map(line => line.routePartitionName)
111
- .filter((value) => !!value && value.trim().length > 0);
112
- this.routePartitionOptions = this.uniqueStrings(routePartitions);
113
- this.deviceEntries = devicesFromTemplate.map(device => ({
114
- deviceType: this.valueToString(device.deviceType),
115
- protocol: this.valueToString(device.protocol),
116
- buttonTemplate: this.valueToString(device.buttonTemplate),
117
- name: this.valueToString(device.name)
118
- }));
119
- this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
120
- this.rebuildOverviewUsers();
121
- this.rebuildOverviewLines();
122
- this.rebuildOverviewDevices();
133
+ this.template = this.extractTemplateFromTokenPayload(payload);
134
+ this.endUser = this.template?.endUser || null;
135
+ this.lines = this.endUser && Array.isArray(this.endUser?.lines) ? this.endUser.lines : [];
136
+ this.devices = this.endUser && Array.isArray(this.endUser?.devices) ? this.endUser.devices : [];
137
+ this.deviceProfiles = this.endUser && Array.isArray(this.endUser?.deviceProfiles) ? this.endUser.deviceProfiles : [];
138
+ this.initTemplateDnsNamesForLines();
139
+ // this.userDetailsForm = {
140
+ // userId: this.valueToString(this.endUser?.userid ?? ''),
141
+ // firstName: this.valueToString(this.endUser?.firstName ?? ''),
142
+ // lastName: this.valueToString(this.endUser?.lastName ?? ''),
143
+ // email: this.valueToString(this.endUser?.email ?? '')
144
+ // };
145
+ // const mappedLineOptions: LineOption[] = linesFromTemplate
146
+ // .map(line => ({
147
+ // number: this.valueToString(line?.directoryNumber?.directoryNumber),
148
+ // did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
149
+ // css: this.valueToString(
150
+ // typeof line?.callingSearchSpace === 'string'
151
+ // ? line.callingSearchSpace
152
+ // : line?.callingSearchSpace?.name
153
+ // ),
154
+ // description: this.valueToString(line?.description)
155
+ // }))
156
+ // .filter(line => line.number.trim().length > 0);
157
+ this.devices.forEach(device => this.initDeviceWithSiteInfo(device));
158
+ this.deviceProfiles.forEach(device => this.initDeviceWithSiteInfo(device));
159
+ this.lines.forEach(line => this.initLineWithSiteInfo(line));
160
+ // if (mappedLineOptions.length) {
161
+ // this.lineOptions = this.uniqueByNumber(mappedLineOptions);
162
+ // this.lineSelections = this.lineOptions.map(line => ({
163
+ // lineNumber: line.number,
164
+ // routePartitionName: linesFromTemplate.find(
165
+ // source => (source?.directoryNumber?.directoryNumber || '') === line.number
166
+ // )?.directoryNumber?.routePartitionName || null
167
+ // }));
168
+ // } else {
169
+ // const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
170
+ // const associatedLineOptions: LineOption[] = lineAssociations
171
+ // .map(association => {
172
+ // const number = association?.directoryNumber?.directoryNumber || '';
173
+ // return {
174
+ // number,
175
+ // did: number,
176
+ // css: '',
177
+ // description: ''
178
+ // };
179
+ // })
180
+ // .filter(line => line.number.trim().length > 0);
181
+ // this.lineOptions = this.uniqueByNumber(associatedLineOptions);
182
+ // this.lineSelections = this.lineOptions.map(line => ({
183
+ // lineNumber: line.number,
184
+ // routePartitionName: lineAssociations.find(
185
+ // source => (source?.directoryNumber?.directoryNumber || '') === line.number
186
+ // )?.directoryNumber?.routePartitionName || null
187
+ // }));
188
+ // this.templateLines.forEach((line: any) => this.initLineWithSiteInfo(line));
189
+ // this.initTemplateDnsNamesForLines(this.templateLines);
190
+ // }
191
+ // const routePartitions = this.lineSelections
192
+ // .map(line => line.routePartitionName)
193
+ // .filter((value): value is string => !!value && value.trim().length > 0);
194
+ // this.routePartitionOptions = this.uniqueStrings(routePartitions);
195
+ // this.deviceEntries = devicesFromTemplate.map(device => ({
196
+ // deviceType: this.valueToString(device.deviceType),
197
+ // protocol: this.valueToString(device.protocol),
198
+ // buttonTemplate: this.valueToString(device.buttonTemplate),
199
+ // name: this.valueToString(device.name)
200
+ // }));
201
+ // this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
202
+ // this.rebuildOverviewUsers();
203
+ // this.rebuildOverviewLines();
204
+ // this.rebuildOverviewDevices();
123
205
  }
124
206
  setSelectedUserCreationType(type) {
125
207
  this.selectedUserCreationType = type;
@@ -131,6 +213,41 @@ export class UserCreationWizardService {
131
213
  };
132
214
  this.rebuildOverviewUsers();
133
215
  }
216
+ applyUserDetailsFormValue(formValue) {
217
+ this.userDetailsFormValue = formValue;
218
+ this.userDetailsForm = {
219
+ userId: formValue.userId || '',
220
+ firstName: formValue.firstName || '',
221
+ lastName: formValue.lastName || '',
222
+ email: formValue.email || '',
223
+ };
224
+ formValue.lines?.forEach((lineValue, index) => {
225
+ const line = this.lines[index];
226
+ if (!line?.directoryNumber) {
227
+ return;
228
+ }
229
+ line.directoryNumber.directoryNumber = lineValue.number || '';
230
+ line.directoryNumber.routePartitionName = lineValue.routePartition || '';
231
+ });
232
+ formValue.devices?.forEach((deviceValue, index) => {
233
+ const device = this.devices[index];
234
+ if (!device) {
235
+ return;
236
+ }
237
+ device.name = deviceValue.name || '';
238
+ });
239
+ formValue.deviceProfiles?.forEach((profileValue, index) => {
240
+ const profile = this.deviceProfiles[index];
241
+ if (!profile) {
242
+ return;
243
+ }
244
+ profile.name = profileValue.name || '';
245
+ });
246
+ this.rebuildOverviewUsers();
247
+ this.rebuildOverviewLines();
248
+ this.rebuildOverviewDevices();
249
+ this.rebuildOverviewDeviceProfiles();
250
+ }
134
251
  setLineSelection(index, lineNumber) {
135
252
  if (!this.lineSelections[index]) {
136
253
  return;
@@ -180,64 +297,47 @@ export class UserCreationWizardService {
180
297
  }
181
298
  return entry.name || '';
182
299
  }
183
- // Placeholder bootstrap until backend APIs are connected.
184
- loadPlaceholderData() {
185
- this.siteOptions = ['Site 1', 'Site 2', 'Site 3'];
186
- this.templateOptions = ['User 8851 Office'];
187
- this.lineOptions = [
188
- {
189
- number: '557046',
190
- did: '+13125557046',
191
- css: 'Atlanta_internal_css',
192
- description: ''
193
- },
194
- {
195
- number: '557047',
196
- did: '+13125557047',
197
- css: 'Atlanta_internal_css',
198
- description: ''
199
- },
200
- {
201
- number: '557048',
202
- did: '+13125557048',
203
- css: 'Atlanta_internal_css',
204
- description: ''
300
+ getSiteAllData(siteId) {
301
+ return this.userCreationApiService.getSiteAllData(siteId)
302
+ .pipe(tap((res) => {
303
+ let site = null;
304
+ if (res && res[0]) {
305
+ const site = new Site(res[0]);
306
+ this.selectedSite = site.id;
205
307
  }
206
- ];
207
- this.routePartitionOptions = ['Atlanta_internal_PT', 'Beijing_national_PT'];
208
- this.deviceRows = [1, 2];
209
- this.ldapUsers = [
210
- { userId: 'John.Smith', firstName: 'John', lastName: 'Smith', email: 'john.smith@car-west.com' },
211
- { userId: 'John.Doe', firstName: 'John', lastName: 'Doe', email: 'john.doe@car-west.com' },
212
- { userId: 'Jane.Smith', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@car-west.com' }
213
- ];
214
- this.lineSelections = [
215
- {
216
- lineNumber: null,
217
- routePartitionName: this.routePartitionOptions[0] || null
308
+ if (res && res[1]) {
309
+ this.siteDefaults = new SiteDefaults(res[1], false);
310
+ this.originalSiteDefaults = new SiteDefaults(res[1], false);
311
+ this.routePartitionOptions = [...this.routePartitionNamesList];
218
312
  }
219
- ];
220
- this.deviceEntries = [
221
- {
222
- deviceType: 'Cisco 8851',
223
- protocol: 'SIP',
224
- buttonTemplate: 'Standard 8851 SIP',
225
- name: ''
226
- },
227
- {
228
- deviceType: 'Cisco Unified Client Services Framework',
229
- protocol: 'SIP',
230
- buttonTemplate: 'Standard Client Services Framework',
231
- name: ''
313
+ if (res && res[2]) {
314
+ this.deviceTypes = res[2];
232
315
  }
233
- ];
234
- this.selectedTemplate = this.selectedTemplate ?? null;
235
- this.rebuildOverviewUsers();
236
- this.rebuildOverviewLines();
237
- this.rebuildOverviewDevices();
316
+ // this.routePartitionOptions = this.siteDefaults?.routePartition || [];
317
+ // this.devicePoolOptions = this.siteDefaults?.devicePool || [];
318
+ // this.cssOptions = this.siteDefaults?.cssFilter || [];
319
+ // this.voicemailProfileOptions = this.siteDefaults?.voicemailProfile || [];
320
+ // this.lineCss = this.siteDefaults?.lineCss || '';
321
+ // this.deviceCss = this.siteDefaults?.deviceCss || '';
322
+ // this.callForwardAllCss = this.siteDefaults?.callForwardAllCss || '';
323
+ }));
324
+ }
325
+ getNumberRange(siteId, routePartition) {
326
+ this.availableDidPatternsMappedToDn = {};
327
+ const pageSize = 9999;
328
+ const params = { dntype: DnRangeType.extension, routepartition: routePartition, size: pageSize, page: 0 };
329
+ this.availableNumbers = [];
330
+ return this.userCreationApiService.getAvailableDnInRanges(siteId, params)
331
+ .pipe(map((res) => {
332
+ res.availableNumberList.forEach((availableNumber) => {
333
+ this.setAvailableDidMappedToDn(availableNumber);
334
+ this.availableNumbers = [...this.availableNumbers, ...this.getUnwrapNumberRange(availableNumber)];
335
+ });
336
+ }));
337
+ // .pipe(this.handleError(true, false));
238
338
  }
239
339
  rebuildOverviewUsers() {
240
- const userTemplate = this.selectedTemplate || '';
340
+ const userTemplate = this.selectedTemplateName || '';
241
341
  const hasUserData = Object.values(this.userDetailsForm).some(value => value.trim().length > 0);
242
342
  this.overviewUsers = hasUserData
243
343
  ? [{
@@ -250,6 +350,23 @@ export class UserCreationWizardService {
250
350
  : [];
251
351
  }
252
352
  rebuildOverviewLines() {
353
+ const formLines = this.userDetailsFormValue?.lines;
354
+ if (formLines?.length) {
355
+ this.overviewLines = formLines
356
+ .filter(line => !!line?.number?.trim())
357
+ .map((lineValue, index) => {
358
+ const templateLine = this.lines[index];
359
+ const css = this.valueToString(templateLine?.callingSearchSpace);
360
+ return {
361
+ number: lineValue.number,
362
+ did: lineValue.lineNumber || lineValue.number,
363
+ routePartitionName: lineValue.routePartition || '',
364
+ css,
365
+ description: this.valueToString(templateLine?.description),
366
+ };
367
+ });
368
+ return;
369
+ }
253
370
  this.overviewLines = this.lineSelections
254
371
  .map(selection => {
255
372
  if (!selection?.lineNumber) {
@@ -271,6 +388,18 @@ export class UserCreationWizardService {
271
388
  }
272
389
  rebuildOverviewDevices() {
273
390
  const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
391
+ const formDevices = this.userDetailsFormValue?.devices;
392
+ if (formDevices?.length) {
393
+ this.overviewDevices = formDevices
394
+ .filter(device => !!device.deviceType?.trim() || !!device.name?.trim())
395
+ .map(device => ({
396
+ name: device.name || '',
397
+ deviceType: device.deviceType || '',
398
+ lines: selectedLineNumbers,
399
+ description: `${device.protocol || ''} / ${device.buttonTemplate || ''}`.trim(),
400
+ }));
401
+ return;
402
+ }
274
403
  this.overviewDevices = this.deviceEntries
275
404
  .map((device, index) => ({
276
405
  device,
@@ -284,6 +413,22 @@ export class UserCreationWizardService {
284
413
  description: `${device.protocol} / ${device.buttonTemplate}`
285
414
  }));
286
415
  }
416
+ rebuildOverviewDeviceProfiles() {
417
+ const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
418
+ const formProfiles = this.userDetailsFormValue?.deviceProfiles;
419
+ if (!formProfiles?.length) {
420
+ this.overviewDeviceProfiles = [];
421
+ return;
422
+ }
423
+ this.overviewDeviceProfiles = formProfiles
424
+ .filter(profile => !!profile.deviceType?.trim() || !!profile.name?.trim())
425
+ .map(profile => ({
426
+ name: profile.name || '',
427
+ deviceType: profile.deviceType || '',
428
+ lines: selectedLineNumbers,
429
+ description: `${profile.protocol || ''} / ${profile.buttonTemplate || ''}`.trim(),
430
+ }));
431
+ }
287
432
  extractTemplateFromTokenPayload(payload) {
288
433
  if (!payload || typeof payload !== 'object') {
289
434
  return null;
@@ -310,14 +455,248 @@ export class UserCreationWizardService {
310
455
  valueToString(value) {
311
456
  return typeof value === 'string' ? value : '';
312
457
  }
458
+ getUnwrapNumberRange(availableNumber) {
459
+ let unwrapNumberRange = this.unwrapNumberRange(availableNumber.phoneNumberRange.from, availableNumber.phoneNumberRange.to)
460
+ .map((unwrappedNumber) => {
461
+ const dn = availableNumber.phoneNumberRange.prefix + unwrappedNumber;
462
+ let str = dn;
463
+ if (this.availableDidPatternsMappedToDn[dn] && this.availableDidPatternsMappedToDn[dn].length > 0) {
464
+ if (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] && this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 0) {
465
+ str += ' DID: ' + (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 1 ? 'multiple' :
466
+ this.availableDidPatternsMappedToDn[dn][0]['mappedDids'][0]);
467
+ }
468
+ if (this.availableDidPatternsMappedToDn[dn][0]['vm']) {
469
+ str += ' In Use - VM';
470
+ }
471
+ }
472
+ return str;
473
+ });
474
+ unwrapNumberRange = unwrapNumberRange.filter((unwrappedNumber) => !availableNumber.usedNumbers.includes(unwrappedNumber));
475
+ return unwrapNumberRange;
476
+ }
477
+ unwrapNumberRange(start, end) {
478
+ const regExp = /(^0+)/;
479
+ let leadingZeros = '';
480
+ const matches = start.match(regExp);
481
+ if (matches) {
482
+ leadingZeros = matches[1];
483
+ }
484
+ const startNumeric = new Big(start);
485
+ const endNumeric = new Big(end);
486
+ return Array.from({ length: Number(endNumeric.minus(startNumeric).plus(new Big(1)).toFixed(0)) }, (v, k) => {
487
+ const number = String(startNumeric.plus(new Big(k.toString())).toFixed(0));
488
+ if ((leadingZeros + number).length > start.length) {
489
+ leadingZeros = leadingZeros.substr(1);
490
+ }
491
+ return leadingZeros + number;
492
+ });
493
+ }
494
+ setAvailableDidMappedToDn(availableNumber) {
495
+ if (availableNumber.unUsedNumbersWithDids && availableNumber.unUsedNumbersWithDids.length) {
496
+ availableNumber.unUsedNumbersWithDids.forEach((numberWithDids) => {
497
+ const dn = numberWithDids['unUsedNumber'];
498
+ this.availableDidPatternsMappedToDn[dn] = [{}];
499
+ if (numberWithDids['translationPatternList'] && numberWithDids['translationPatternList'].length > 0) {
500
+ this.availableDidPatternsMappedToDn[dn] = numberWithDids['translationPatternList'];
501
+ this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = [{}];
502
+ if (numberWithDids['mappedDids'] && numberWithDids['mappedDids'].length > 0) {
503
+ this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = numberWithDids['mappedDids'];
504
+ }
505
+ }
506
+ this.availableDidPatternsMappedToDn[dn][0]['vm'] = numberWithDids['vm'];
507
+ });
508
+ }
509
+ }
313
510
  // TODO: replace placeholders with real API integration.
314
511
  loadDataFromApi() {
315
512
  // this.api.getWizardBootstrapData().subscribe(...)
316
513
  }
514
+ initLineWithSiteInfo(line) {
515
+ line.directoryNumber.routePartitionName = this.siteDefaults?.routePartition || '';
516
+ let callingSearchSpaceVal = this.siteDefaults?.lineCss || '';
517
+ line.callingSearchSpace = callingSearchSpaceVal;
518
+ }
519
+ // private initTemplateDnsNamesForLines(userLines: TemplateLineLike[]): void {
520
+ // const routePartition = this.siteDefaults?.routePartition || '';
521
+ // if (userLines && userLines.length > 0) {
522
+ // userLines.forEach((line, index) => {
523
+ // line && line.directoryNumber && (line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber);
524
+ // line && line.directoryNumber && (line.directoryNumber.directoryNumber = '');
525
+ // return line;
526
+ // });
527
+ // // const routePartition = this.siteDefaults?.routePartition || '';
528
+ // // if (line.lineAssociations && line.lineAssociations.length) {
529
+ // // this.setLineAssociationsForDevice(line, routePartition);
530
+ // // }
531
+ // }
532
+ // this.templateDevices.forEach(device => {
533
+ // if (device.lineAssociations && device.lineAssociations.length) {
534
+ // this.setLineAssociationsForDevice(device, routePartition);
535
+ // }
536
+ // });
537
+ // }
538
+ setLineAssociationsForDevice(device, routePartition) {
539
+ const lineAssociations = device.lineAssociations || [];
540
+ if (lineAssociations && lineAssociations.length) {
541
+ lineAssociations.forEach(lineAssociation => {
542
+ lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber || '');
543
+ lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.routePartitionName = routePartition);
544
+ });
545
+ }
546
+ }
547
+ initDeviceWithSiteInfo(device) {
548
+ device.newName = device.name;
549
+ device.name = '';
550
+ if (!device['enabledExtensionMobility']) {
551
+ device.enabledExtensionMobility = this.siteDefaults?.enableEm ?? false;
552
+ }
553
+ else if (device['enabledExtensionMobility'].toString() === 'Yes') {
554
+ device.enabledExtensionMobility = true;
555
+ }
556
+ else if (device['enabledExtensionMobility'].toString() === 'No') {
557
+ device.enabledExtensionMobility = false;
558
+ }
559
+ if (device.location) {
560
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.location, this.currentSite?.shortName ?? '') ?? null;
561
+ device.location = replacedValue;
562
+ }
563
+ if (device.location) {
564
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.devicePoolName, this.currentSite?.shortName ?? '') ?? null;
565
+ device.devicePoolName = replacedValue;
566
+ }
567
+ if (device.location) {
568
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.callingSearchSpaceName, this.currentSite?.shortName ?? '') ?? null;
569
+ device.callingSearchSpaceName = replacedValue;
570
+ }
571
+ if (device.extraOptions) {
572
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.extraOptions.aarCss, this.currentSite?.shortName ?? '') ?? null;
573
+ device.extraOptions.aarCss = replacedValue;
574
+ }
575
+ if (!device.description && this.siteDefaults) {
576
+ device.description = this.siteDefaults.deviceDescription;
577
+ }
578
+ }
579
+ replaceDynamicValueSiteInfo(fieldValue, siteShortName) {
580
+ if (fieldValue) {
581
+ fieldValue = this.replaceDynamicValueFormat(fieldValue);
582
+ const paramsToReplaces = { 'SiteShortName': siteShortName };
583
+ return this.mutliStringReplace(paramsToReplaces, fieldValue);
584
+ }
585
+ return null;
586
+ }
587
+ replaceDynamicValueFormat(str) {
588
+ str = str.replace(/\[FN\]/ig, '[FN]').replace(/\[LN\]/ig, '[LN]').replace(/\[ID\]/ig, '[UserId]')
589
+ .replace(/\[UserId\]/ig, '[UserId]').replace(/<Match User ID>/ig, '[UserId]')
590
+ .replace(/\[Email\]/ig, '[Email]').replace(/\[DN\(/ig, '[DN(')
591
+ .replace(/\[SiteShortName\]/ig, '[SiteShortName]').replace(/\$\(SiteShortName\)/ig, '[SiteShortName]')
592
+ .replace(/\$\{SiteShortName\}/ig, '[SiteShortName]').replace(/{SiteShortName}/ig, '[SiteShortName]')
593
+ .replace(/\[FN\(/ig, '[FN(').replace(/\[LN\(/ig, '[LN(')
594
+ .replace(/\[ID\(/ig, '[ID(');
595
+ return str;
596
+ }
597
+ mutliStringReplace(object, input, directoryNumber, user) {
598
+ var val = input;
599
+ if (val.includes('[DN]') && directoryNumber && !directoryNumber.includes('Line')) {
600
+ val = val.replace('[DN]', directoryNumber);
601
+ }
602
+ var indexOfDN = val.indexOf('[DN(');
603
+ if (indexOfDN !== -1 && directoryNumber) {
604
+ var digit = val.substring(indexOfDN + 4, val.indexOf(')', indexOfDN + 4));
605
+ var digitCount = Number(digit) || 0;
606
+ var dnDigit = (digitCount > val.length) ? directoryNumber : directoryNumber.substring(directoryNumber.length - digitCount, directoryNumber.length);
607
+ val = val.replace('[DN(' + digit + ')]', dnDigit);
608
+ }
609
+ var indexOfFN = val.indexOf('[FN(');
610
+ if (indexOfFN !== -1 && user && user.firstName) {
611
+ var digit = val.substring(indexOfFN + 4, val.indexOf(')', indexOfFN + 4));
612
+ var fnDigit = user.firstName.substring(0, digit);
613
+ val = val.replace('[FN(' + digit + ')]', fnDigit);
614
+ }
615
+ var indexOfLN = val.indexOf('[LN(');
616
+ if (indexOfLN !== -1 && user && user.lastName) {
617
+ var digit = val.substring(indexOfLN + 4, val.indexOf(')', indexOfLN + 4));
618
+ var lnDigit = user.lastName.substring(0, digit);
619
+ val = val.replace('[LN(' + digit + ')]', lnDigit);
620
+ }
621
+ var indexOfID = val.indexOf('[ID(');
622
+ if (indexOfID !== -1 && user && user.userid) {
623
+ var digit = val.substring(indexOfID + 4, val.indexOf(')', indexOfID + 4));
624
+ var idDigit = user.userid.substring(0, digit);
625
+ val = val.replace('[ID(' + digit + ')]', idDigit);
626
+ }
627
+ var entries = Object.entries(object);
628
+ entries.forEach((para) => {
629
+ var find = '[' + para[0] + ']';
630
+ var replacement = para[1] != null ? String(para[1]) : '';
631
+ val = val.split(find).join(replacement);
632
+ });
633
+ return val;
634
+ }
635
+ initTemplateDnsNamesForLines() {
636
+ if (this.lines && this.lines.length > 0) {
637
+ this.lines.forEach((line, index) => {
638
+ line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber;
639
+ line.directoryNumber.directoryNumber = '';
640
+ return line;
641
+ });
642
+ const routePartition = this.siteDefaults?.routePartition || '';
643
+ this.devices.forEach(device => {
644
+ if (device.lineAssociations && device.lineAssociations.length) {
645
+ this.setLineAssociationsForDevice(device, routePartition);
646
+ }
647
+ });
648
+ this.deviceProfiles.forEach(deviceProfile => {
649
+ if (deviceProfile.lineAssociations && deviceProfile.lineAssociations.length) {
650
+ this.setLineAssociationsForDevice(deviceProfile, routePartition);
651
+ }
652
+ });
653
+ if (this.endUser?.singleNumberReach && this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
654
+ if (this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
655
+ this.endUser.singleNumberReach.associatedLines.map(lineAssociation => {
656
+ lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
657
+ lineAssociation.directoryNumber.routePartitionName = routePartition;
658
+ });
659
+ }
660
+ if (this.endUser.singleNumberReach.remoteDestinations && this.endUser.singleNumberReach.remoteDestinations.length) {
661
+ this.endUser.singleNumberReach.remoteDestinations.forEach(remoteDestination => {
662
+ if (remoteDestination.lineAssociations && remoteDestination.lineAssociations.length) {
663
+ remoteDestination.lineAssociations.map(lineAssociation => {
664
+ lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
665
+ lineAssociation.directoryNumber.routePartitionName = routePartition;
666
+ });
667
+ }
668
+ });
669
+ }
670
+ }
671
+ }
672
+ }
673
+ buildSavableEndUser() {
674
+ if (!this.endUser) {
675
+ throw new Error('No template user loaded');
676
+ }
677
+ return buildSavableEndUser(this.endUser, this.lines, this.devices, this.deviceProfiles, this.userDetailsForm, {
678
+ resolveDeviceName: (index, device) => this.resolveDeviceNameForSave(index, device),
679
+ resolveDeviceProfileName: (index, profile) => this.resolveDeviceNameForSave(index, profile),
680
+ });
681
+ }
682
+ resolveDeviceNameForSave(_index, device) {
683
+ const rawName = (device.name || device.newName || '').trim();
684
+ if (device.deviceType?.includes('8851')) {
685
+ const withoutSep = rawName.replace(/^SEP\s*/i, '').trim();
686
+ return withoutSep ? `SEP ${withoutSep}` : '';
687
+ }
688
+ return rawName;
689
+ }
690
+ saveNewUser() {
691
+ const user = this.buildSavableEndUser();
692
+ const siteId = String(this.selectedSite ?? '');
693
+ const templateId = String(this.selectedTemplateId ?? '');
694
+ return this.userCreationApiService.saveTemplateUser(user, templateId, siteId);
695
+ }
317
696
  }
318
697
  UserCreationWizardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
319
698
  UserCreationWizardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService });
320
699
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, decorators: [{
321
700
  type: Injectable
322
701
  }], ctorParameters: function () { return []; } });
323
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7O0FBeUZ6RixNQUFNLE9BQU8seUJBQXlCO0lBOEJsQztRQTdCaUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTdDLHFCQUFnQixHQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLHNCQUFpQixHQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoRSxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsMEJBQXFCLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFDOUIsa0JBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQ3RDLGtCQUFhLEdBQXNCLEVBQUUsQ0FBQztRQUN0QyxvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBb0I7WUFDL0IsTUFBTSxFQUFFLEVBQUU7WUFDVixTQUFTLEVBQUUsRUFBRTtZQUNiLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsbUJBQWMsR0FB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Q0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFlO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYztRQUNoQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxlQUFlO1FBQ1gsbURBQW1EO0lBQ3ZELENBQUM7O3VIQWpXUSx5QkFBeUI7MkhBQXpCLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlckNyZWF0aW9uQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvdXNlci1jcmVhdGlvbi1hcGkuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMZGFwVXNlclJvdyB7XHJcbiAgICB1c2VySWQ6IHN0cmluZztcclxuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xyXG4gICAgbGFzdE5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnZpZXdVc2VyUm93IGV4dGVuZHMgTGRhcFVzZXJSb3cge1xyXG4gICAgdXNlclRlbXBsYXRlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnZpZXdMaW5lUm93IHtcclxuICAgIG51bWJlcjogc3RyaW5nO1xyXG4gICAgZGlkOiBzdHJpbmc7XHJcbiAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHN0cmluZztcclxuICAgIGNzczogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPdmVydmlld0RldmljZVJvdyB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBkZXZpY2VUeXBlOiBzdHJpbmc7XHJcbiAgICBsaW5lczogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVXNlckNyZWF0aW9uVHlwZSA9ICdDVUNNJyB8ICdNVCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJEZXRhaWxzRm9ybSB7XHJcbiAgICB1c2VySWQ6IHN0cmluZztcclxuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xyXG4gICAgbGFzdE5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGluZU9wdGlvbiB7XHJcbiAgICBudW1iZXI6IHN0cmluZztcclxuICAgIGRpZDogc3RyaW5nO1xyXG4gICAgY3NzOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGVkTGluZVJvdyB7XHJcbiAgICBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcm91dGVQYXJ0aXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUVudHJ5IHtcclxuICAgIGRldmljZVR5cGU6IHN0cmluZztcclxuICAgIHByb3RvY29sOiBzdHJpbmc7XHJcbiAgICBidXR0b25UZW1wbGF0ZTogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGVtcGxhdGVMaW5lTGlrZSB7XHJcbiAgICBkaXJlY3RvcnlOdW1iZXI/OiB7XHJcbiAgICAgICAgZGlyZWN0b3J5TnVtYmVyPzogc3RyaW5nO1xyXG4gICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICB9O1xyXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgY2FsbGluZ1NlYXJjaFNwYWNlPzogc3RyaW5nIHwgeyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbDtcclxuICAgIGRpZFBhdHRlcm5zPzogQXJyYXk8eyBwYXR0ZXJuPzogc3RyaW5nIHwgbnVsbCB9PiB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUZW1wbGF0ZURldmljZUxpa2Uge1xyXG4gICAgZGV2aWNlVHlwZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBidXR0b25UZW1wbGF0ZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxpbmVBc3NvY2lhdGlvbnM/OiBBcnJheTx7XHJcbiAgICAgICAgZGlyZWN0b3J5TnVtYmVyPzoge1xyXG4gICAgICAgICAgICBkaXJlY3RvcnlOdW1iZXI/OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgIH0+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGVtcGxhdGVFbmRVc2VyTGlrZSB7XHJcbiAgICB1c2VyaWQ/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZmlyc3ROYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxhc3ROYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxpbmVzPzogVGVtcGxhdGVMaW5lTGlrZVtdIHwgbnVsbDtcclxuICAgIGRldmljZXM/OiBUZW1wbGF0ZURldmljZUxpa2VbXSB8IG51bGw7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGkgPSBpbmplY3QoVXNlckNyZWF0aW9uQXBpU2VydmljZSk7XHJcblxyXG4gICAgcmVhZG9ubHkgbGRhcFRhYmxlQ29sdW1uczogc3RyaW5nW10gPSBbJ3VzZXJJZCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnZW1haWwnLCAnYWRkJ107XHJcbiAgICByZWFkb25seSB1c2VyQ3JlYXRpb25UeXBlczogVXNlckNyZWF0aW9uVHlwZVtdID0gWydDVUNNJywgJ01UJ107XHJcblxyXG4gICAgc2l0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gW107XHJcbiAgICByb3V0ZVBhcnRpdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBkZXZpY2VSb3dzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgbGRhcFVzZXJzOiBMZGFwVXNlclJvd1tdID0gW107XHJcbiAgICBvdmVydmlld1VzZXJzOiBPdmVydmlld1VzZXJSb3dbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdMaW5lczogT3ZlcnZpZXdMaW5lUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlczogT3ZlcnZpZXdEZXZpY2VSb3dbXSA9IFtdO1xyXG4gICAgdXNlckRldGFpbHNGb3JtOiBVc2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICBmaXJzdE5hbWU6ICcnLFxyXG4gICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICBlbWFpbDogJydcclxuICAgIH07XHJcbiAgICBsaW5lU2VsZWN0aW9uczogU2VsZWN0ZWRMaW5lUm93W10gPSBbXTtcclxuICAgIGRldmljZUVudHJpZXM6IERldmljZUVudHJ5W10gPSBbXTtcclxuXHJcbiAgICBzZWxlY3RlZFNpdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFVzZXJDcmVhdGlvblR5cGU6IFVzZXJDcmVhdGlvblR5cGUgPSAnQ1VDTSc7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRlZExkYXBVc2VySWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkUGxhY2Vob2xkZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTGRhcFVzZXIocm93OiBMZGFwVXNlclJvdyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgICAgICB1c2VySWQ6IHJvdy51c2VySWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogcm93LmZpcnN0TmFtZSxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IHJvdy5sYXN0TmFtZSxcclxuICAgICAgICAgICAgZW1haWw6IHJvdy5lbWFpbFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hZGRlZExkYXBVc2VySWRzLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5hZGRlZExkYXBVc2VySWRzLmFkZChyb3cudXNlcklkKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZGFwVXNlckFkZGVkKHJvdzogTGRhcFVzZXJSb3cpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRlZExkYXBVc2VySWRzLmhhcyhyb3cudXNlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFNpdGUoc2l0ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0VGVtcGxhdGVEcml2ZW5EYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGluZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSBbXTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlUZW1wbGF0ZVRva2VuUGF5bG9hZChwYXlsb2FkOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkKTtcclxuICAgICAgICBjb25zdCBlbmRVc2VyOiBUZW1wbGF0ZUVuZFVzZXJMaWtlID0gdGVtcGxhdGU/LmVuZFVzZXIgfHwge307XHJcbiAgICAgICAgY29uc3QgbGluZXNGcm9tVGVtcGxhdGU6IFRlbXBsYXRlTGluZUxpa2VbXSA9IEFycmF5LmlzQXJyYXkoZW5kVXNlci5saW5lcykgPyBlbmRVc2VyLmxpbmVzIDogW107XHJcbiAgICAgICAgY29uc3QgZGV2aWNlc0Zyb21UZW1wbGF0ZTogVGVtcGxhdGVEZXZpY2VMaWtlW10gPSBBcnJheS5pc0FycmF5KGVuZFVzZXIuZGV2aWNlcykgPyBlbmRVc2VyLmRldmljZXMgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIudXNlcmlkKSxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcoZW5kVXNlci5maXJzdE5hbWUpLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIubGFzdE5hbWUpLFxyXG4gICAgICAgICAgICBlbWFpbDogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIuZW1haWwpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbWFwcGVkTGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IGxpbmVzRnJvbVRlbXBsYXRlXHJcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIpLFxyXG4gICAgICAgICAgICAgICAgZGlkOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGlkUGF0dGVybnM/LlswXT8ucGF0dGVybiB8fCBsaW5lPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciksXHJcbiAgICAgICAgICAgICAgICBjc3M6IHRoaXMudmFsdWVUb1N0cmluZyhcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgbGluZT8uY2FsbGluZ1NlYXJjaFNwYWNlID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGxpbmUuY2FsbGluZ1NlYXJjaFNwYWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbGluZT8uY2FsbGluZ1NlYXJjaFNwYWNlPy5uYW1lXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLm51bWJlci50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIGlmIChtYXBwZWRMaW5lT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIobWFwcGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVzRnJvbVRlbXBsYXRlLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2VzRnJvbVRlbXBsYXRlLmZsYXRNYXAoZGV2aWNlID0+IGRldmljZS5saW5lQXNzb2NpYXRpb25zIHx8IFtdKTtcclxuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lQXNzb2NpYXRpb25zXHJcbiAgICAgICAgICAgICAgICAubWFwKGFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSBhc3NvY2lhdGlvbj8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWQ6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIoYXNzb2NpYXRlZExpbmVPcHRpb25zKTtcclxuICAgICAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IHRoaXMubGluZU9wdGlvbnMubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBsaW5lQXNzb2NpYXRpb25zLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb25zID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS5yb3V0ZVBhcnRpdGlvbk5hbWUpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+ICEhdmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gdGhpcy51bmlxdWVTdHJpbmdzKHJvdXRlUGFydGl0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllcyA9IGRldmljZXNGcm9tVGVtcGxhdGUubWFwKGRldmljZSA9PiAoe1xyXG4gICAgICAgICAgICBkZXZpY2VUeXBlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmRldmljZVR5cGUpLFxyXG4gICAgICAgICAgICBwcm90b2NvbDogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5wcm90b2NvbCksXHJcbiAgICAgICAgICAgIGJ1dHRvblRlbXBsYXRlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmJ1dHRvblRlbXBsYXRlKSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5uYW1lKVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSB0aGlzLmRldmljZUVudHJpZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUodHlwZTogVXNlckNyZWF0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyQ3JlYXRpb25UeXBlID0gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VyRGV0YWlsc0ZpZWxkKGZpZWxkOiBrZXlvZiBVc2VyRGV0YWlsc0Zvcm0sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIFtmaWVsZF06IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGluZVNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgbGluZU51bWJlclxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFJvdXRlUGFydGl0aW9uU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIHJvdXRlUGFydGl0aW9uTmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0sXHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERldmljZU5hbWUoaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0uZGV2aWNlVHlwZSB8fCAnJztcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGRldmljZVR5cGUuaW5jbHVkZXMoJzg4NTEnKVxyXG4gICAgICAgICAgICA/IG5hbWUucmVwbGFjZSgvXlNFUFxccyovaSwgJycpXHJcbiAgICAgICAgICAgIDogbmFtZTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZUVudHJpZXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmICghZW50cnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVudHJ5LmRldmljZVR5cGU/LmluY2x1ZGVzKCc4ODUxJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGBTRVAgJHtlbnRyeS5uYW1lIHx8ICcnfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZU51bWJlciA9IHRoaXMubGluZVNlbGVjdGlvbnNbMF0/LmxpbmVOdW1iZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBsaW5lTnVtYmVyID8gYENTRiR7bGluZU51bWJlcn1gIDogJ0NTRltETl0nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVudHJ5Lm5hbWUgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGxhY2Vob2xkZXIgYm9vdHN0cmFwIHVudGlsIGJhY2tlbmQgQVBJcyBhcmUgY29ubmVjdGVkLlxyXG4gICAgbG9hZFBsYWNlaG9sZGVyRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNpdGVPcHRpb25zID0gWydTaXRlIDEnLCAnU2l0ZSAyJywgJ1NpdGUgMyddO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zID0gWydVc2VyIDg4NTEgT2ZmaWNlJ107XHJcbiAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ2JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0NicsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ3JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0NycsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ4JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0OCcsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbJ0F0bGFudGFfaW50ZXJuYWxfUFQnLCAnQmVpamluZ19uYXRpb25hbF9QVCddO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlUm93cyA9IFsxLCAyXTtcclxuICAgICAgICB0aGlzLmxkYXBVc2VycyA9IFtcclxuICAgICAgICAgICAgeyB1c2VySWQ6ICdKb2huLlNtaXRoJywgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnU21pdGgnLCBlbWFpbDogJ2pvaG4uc21pdGhAY2FyLXdlc3QuY29tJyB9LFxyXG4gICAgICAgICAgICB7IHVzZXJJZDogJ0pvaG4uRG9lJywgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgZW1haWw6ICdqb2huLmRvZUBjYXItd2VzdC5jb20nIH0sXHJcbiAgICAgICAgICAgIHsgdXNlcklkOiAnSmFuZS5TbWl0aCcsIGZpcnN0TmFtZTogJ0phbmUnLCBsYXN0TmFtZTogJ1NtaXRoJywgZW1haWw6ICdqYW5lLnNtaXRoQGNhci13ZXN0LmNvbScgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbnVsbCxcclxuICAgICAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnNbMF0gfHwgbnVsbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRldmljZVR5cGU6ICdDaXNjbyA4ODUxJyxcclxuICAgICAgICAgICAgICAgIHByb3RvY29sOiAnU0lQJyxcclxuICAgICAgICAgICAgICAgIGJ1dHRvblRlbXBsYXRlOiAnU3RhbmRhcmQgODg1MSBTSVAnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogJ0Npc2NvIFVuaWZpZWQgQ2xpZW50IFNlcnZpY2VzIEZyYW1ld29yaycsXHJcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogJ1NJUCcsXHJcbiAgICAgICAgICAgICAgICBidXR0b25UZW1wbGF0ZTogJ1N0YW5kYXJkIENsaWVudCBTZXJ2aWNlcyBGcmFtZXdvcmsnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlID8/IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld1VzZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVzZXJUZW1wbGF0ZSA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSB8fCAnJztcclxuICAgICAgICBjb25zdCBoYXNVc2VyRGF0YSA9IE9iamVjdC52YWx1ZXModGhpcy51c2VyRGV0YWlsc0Zvcm0pLnNvbWUodmFsdWUgPT4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdVc2VycyA9IGhhc1VzZXJEYXRhXHJcbiAgICAgICAgICAgID8gW3tcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VyRGV0YWlsc0Zvcm0udXNlcklkLFxyXG4gICAgICAgICAgICAgICAgZmlyc3ROYW1lOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5maXJzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBsYXN0TmFtZTogdGhpcy51c2VyRGV0YWlsc0Zvcm0ubGFzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy51c2VyRGV0YWlsc0Zvcm0uZW1haWwsXHJcbiAgICAgICAgICAgICAgICB1c2VyVGVtcGxhdGVcclxuICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0xpbmVzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdMaW5lcyA9IHRoaXMubGluZVNlbGVjdGlvbnNcclxuICAgICAgICAgICAgLm1hcChzZWxlY3Rpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24/LmxpbmVOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTGluZSA9IHRoaXMubGluZU9wdGlvbnMuZmluZChsaW5lID0+IGxpbmUubnVtYmVyID09PSBzZWxlY3Rpb24ubGluZU51bWJlcik7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkTGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXI6IHNlbGVjdGVkTGluZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgZGlkOiBzZWxlY3RlZExpbmUuZGlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogc2VsZWN0aW9uLnJvdXRlUGFydGl0aW9uTmFtZSB8fCB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9uc1swXSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBjc3M6IHNlbGVjdGVkTGluZS5jc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHNlbGVjdGVkTGluZS5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcigobGluZSk6IGxpbmUgaXMgT3ZlcnZpZXdMaW5lUm93ID0+ICEhbGluZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGluZU51bWJlcnMgPSB0aGlzLm92ZXJ2aWV3TGluZXMubWFwKGxpbmUgPT4gbGluZS5udW1iZXIpLmpvaW4oJywgJyk7XHJcbiAgICAgICAgdGhpcy5vdmVydmlld0RldmljZXMgPSB0aGlzLmRldmljZUVudHJpZXNcclxuICAgICAgICAgICAgLm1hcCgoZGV2aWNlLCBpbmRleCkgPT4gKHtcclxuICAgICAgICAgICAgICAgIGRldmljZSxcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLmdldERldmljZURpc3BsYXlOYW1lKGluZGV4KVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLmZpbHRlcigoeyBkZXZpY2UsIGRpc3BsYXlOYW1lIH0pID0+IGRpc3BsYXlOYW1lLnRyaW0oKS5sZW5ndGggPiAwIHx8IGRldmljZS5kZXZpY2VUeXBlLnRyaW0oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAubWFwKCh7IGRldmljZSwgZGlzcGxheU5hbWUgfSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLmRldmljZVR5cGUsXHJcbiAgICAgICAgICAgICAgICBsaW5lczogc2VsZWN0ZWRMaW5lTnVtYmVycyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtkZXZpY2UucHJvdG9jb2x9IC8gJHtkZXZpY2UuYnV0dG9uVGVtcGxhdGV9YFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleHRyYWN0VGVtcGxhdGVGcm9tVG9rZW5QYXlsb2FkKHBheWxvYWQ6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFwYXlsb2FkIHx8IHR5cGVvZiBwYXlsb2FkICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWRbMF0gfHwgbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhwYXlsb2FkKVswXTtcclxuICAgICAgICByZXR1cm4gZmlyc3RLZXkgPyBwYXlsb2FkW2ZpcnN0S2V5XSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bmlxdWVCeU51bWJlcihsaW5lczogTGluZU9wdGlvbltdKTogTGluZU9wdGlvbltdIHtcclxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmVzLmZpbHRlcihsaW5lID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGxpbmUubnVtYmVyKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKGxpbmUubnVtYmVyKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bmlxdWVTdHJpbmdzKGl0ZW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGl0ZW1zKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB2YWx1ZVRvU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogcmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIEFQSSBpbnRlZ3JhdGlvbi5cclxuICAgIGxvYWREYXRhRnJvbUFwaSgpOiB2b2lkIHtcclxuICAgICAgICAvLyB0aGlzLmFwaS5nZXRXaXphcmRCb290c3RyYXBEYXRhKCkuc3Vic2NyaWJlKC4uLilcclxuICAgIH1cclxufSJdfQ==
702
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFJekYsT0FBTyxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hGLE9BQU8sRUFtQkgsV0FBVyxHQUVkLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBR3pFLE1BQU0sT0FBTyx5QkFBeUI7SUFhbEMsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFtQ0QsSUFBSSx1QkFBdUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsSUFBSSxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUkseUJBQXlCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBS0Q7UUFoRWlCLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRWhFLHFCQUFnQixHQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLHNCQUFpQixHQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RCxhQUFRLEdBQWlDLElBQUksQ0FBQztRQUMvQyxZQUFPLEdBQTRCLElBQUksQ0FBQztRQUN4QyxVQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUM1QixZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFzQixFQUFFLENBQUM7UUFDdEMsaUJBQVksR0FBZ0IsSUFBSSxDQUFDO1FBTXpDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUMvQiwwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFDckMsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixjQUFTLEdBQXdCLEVBQUUsQ0FBQztRQUNwQyxrQkFBYSxHQUFzQixFQUFFLENBQUM7UUFDdEMsa0JBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQ3RDLG9CQUFlLEdBQXdCLEVBQUUsQ0FBQztRQUMxQywyQkFBc0IsR0FBd0IsRUFBRSxDQUFDO1FBQ2pELHlCQUFvQixHQUFnQyxJQUFJLENBQUM7UUFDekQsb0JBQWUsR0FBb0I7WUFDL0IsTUFBTSxFQUFFLEVBQUU7WUFDVixTQUFTLEVBQUUsRUFBRTtZQUNiLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsbUJBQWMsR0FBc0IsRUFBRSxDQUFDO1FBQ3ZDLGtCQUFhLEdBQWtCLEVBQUUsQ0FBQztRQUNsQyxxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBd0IsSUFBSSxDQUFDO1FBQ3pDLHlCQUFvQixHQUF3QixJQUFJLENBQUM7UUFDakQsa0JBQWEsR0FBdUIsRUFBRSxDQUFDO1FBQ3ZDLG9CQUFlLEdBQXlCLEVBQUUsQ0FBQztRQUMzQyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBRTlDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyx5QkFBb0IsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLHVCQUFrQixHQUFrQixJQUFJLENBQUM7UUFDekMsNkJBQXdCLEdBQXFCLE1BQU0sQ0FBQztRQUNwRCxtQ0FBOEIsR0FBUSxFQUFFLENBQUM7UUFjekMscUJBQWdCLEdBQTZCLElBQUksQ0FBQztRQUNsRCxtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUdmLDhCQUE4QjtJQUNsQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUM7SUFDMUMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUF1QjtRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRTtZQUMvQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7U0FDMUIsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxzQkFBc0I7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixNQUFNLEVBQUUsRUFBRTtZQUNWLFNBQVMsRUFBRSxFQUFFO1lBQ2IsUUFBUSxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQscUJBQXFCLENBQUMsR0FBc0I7UUFDeEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQTBCLEVBQUUsS0FBYTtRQUN4RCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRU0sZUFBZSxDQUFDLElBQW1CO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQztJQUNyQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBNEM7UUFDNUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztRQUMvQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU0sY0FBYyxDQUFDLElBQVU7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxPQUE4QjtRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVySCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwQywyQkFBMkI7UUFDM0IsOERBQThEO1FBQzlELG9FQUFvRTtRQUNwRSxrRUFBa0U7UUFDbEUsMkRBQTJEO1FBQzNELEtBQUs7UUFFTCw0REFBNEQ7UUFDNUQsc0JBQXNCO1FBQ3RCLDhFQUE4RTtRQUM5RSw4R0FBOEc7UUFDOUcsbUNBQW1DO1FBQ25DLDJEQUEyRDtRQUMzRCw0Q0FBNEM7UUFDNUMsbURBQW1EO1FBQ25ELGFBQWE7UUFDYiw2REFBNkQ7UUFDN0QsVUFBVTtRQUNWLHNEQUFzRDtRQUV0RCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUU1RCxrQ0FBa0M7UUFDbEMsaUVBQWlFO1FBQ2pFLDREQUE0RDtRQUM1RCxtQ0FBbUM7UUFDbkMsc0RBQXNEO1FBQ3RELHlGQUF5RjtRQUN6Rix5REFBeUQ7UUFDekQsV0FBVztRQUNYLFdBQVc7UUFDWCxxR0FBcUc7UUFDckcsbUVBQW1FO1FBQ25FLGdDQUFnQztRQUNoQyxrRkFBa0Y7UUFDbEYsdUJBQXVCO1FBQ3ZCLDBCQUEwQjtRQUMxQiwrQkFBK0I7UUFDL0IsMkJBQTJCO1FBQzNCLGtDQUFrQztRQUNsQyxpQkFBaUI7UUFDakIsYUFBYTtRQUNiLDBEQUEwRDtRQUUxRCxxRUFBcUU7UUFDckUsNERBQTREO1FBQzVELG1DQUFtQztRQUNuQyxxREFBcUQ7UUFDckQseUZBQXlGO1FBQ3pGLHlEQUF5RDtRQUN6RCxXQUFXO1FBRVgsa0ZBQWtGO1FBQ2xGLDZEQUE2RDtRQUM3RCxJQUFJO1FBRUosOENBQThDO1FBQzlDLDRDQUE0QztRQUM1QywrRUFBK0U7UUFDL0Usb0VBQW9FO1FBRXBFLDREQUE0RDtRQUM1RCx5REFBeUQ7UUFDekQscURBQXFEO1FBQ3JELGlFQUFpRTtRQUNqRSw0Q0FBNEM7UUFDNUMsT0FBTztRQUNQLHFFQUFxRTtRQUVyRSwrQkFBK0I7UUFDL0IsK0JBQStCO1FBQy9CLGlDQUFpQztJQUNyQyxDQUFDO0lBRUQsMkJBQTJCLENBQUMsSUFBc0I7UUFDOUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBNEIsRUFBRSxLQUFhO1FBQzNELElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDbkIsR0FBRyxJQUFJLENBQUMsZUFBZTtZQUN2QixDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUs7U0FDakIsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxTQUErQjtRQUNyRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDbkIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRTtZQUM5QixTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFO1lBQ3BDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDbEMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtTQUMvQixDQUFDO1FBRUYsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtnQkFDeEIsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDVCxPQUFPO2FBQ1Y7WUFDRCxNQUFNLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE9BQU87YUFDVjtZQUNELE9BQU8sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFVBQXlCO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDekIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUM3QixVQUFVO1NBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxLQUFhLEVBQUUsa0JBQWlDO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDekIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUM3QixrQkFBa0I7U0FDckIsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUIsT0FBTztTQUNWO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQzlELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDeEIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsY0FBYztTQUN2QixDQUFDO1FBQ0YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWE7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7U0FDcEM7UUFFRCxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDYixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQztZQUN0RCxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sY0FBYyxDQUFDLE1BQWM7UUFDaEMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQzthQUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDbkIsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQztZQUM3QixJQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBa0IsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDL0I7WUFDRCxJQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7YUFDbEU7WUFDRCxJQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFhLENBQUM7YUFDekM7WUFDRCx3RUFBd0U7WUFDeEUsZ0VBQWdFO1lBQ2hFLHdEQUF3RDtZQUN4RCw0RUFBNEU7WUFDNUUsbURBQW1EO1lBQ25ELHVEQUF1RDtZQUN2RCx3RUFBd0U7UUFDNUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFTSxjQUFjLENBQUMsTUFBYyxFQUFFLGNBQXNCO1FBQ3hELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLEVBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUN4RyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7YUFDeEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ25CLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFtRCxFQUFFLEVBQUU7Z0JBQ3BGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUN0RyxDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNMLENBQUE7UUFDRCx3Q0FBd0M7SUFDNUMsQ0FBQztJQUVPLG9CQUFvQjtRQUN4QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXO1lBQzVCLENBQUMsQ0FBQyxDQUFDO29CQUNDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU07b0JBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVM7b0JBQ3pDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVE7b0JBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUs7b0JBQ2pDLFlBQVk7aUJBQ2YsQ0FBQztZQUNGLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDYixDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUM7UUFDbkQsSUFBSSxTQUFTLEVBQUUsTUFBTSxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUztpQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3RDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFDakUsT0FBTztvQkFDSCxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07b0JBQ3hCLEdBQUcsRUFBRSxTQUFTLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxNQUFNO29CQUM3QyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsY0FBYyxJQUFJLEVBQUU7b0JBQ2xELEdBQUc7b0JBQ0gsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztpQkFDN0QsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUFDO1lBQ1AsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYzthQUNuQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRTtnQkFDeEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekYsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsT0FBTztnQkFDSCxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07Z0JBQzNCLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN2RixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7Z0JBQ3JCLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVzthQUN4QyxDQUFDO1FBQ04sQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQztRQUN2RCxJQUFJLFdBQVcsRUFBRSxNQUFNLEVBQUU7WUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXO2lCQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDdEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUN2QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFO2dCQUNuQyxLQUFLLEVBQUUsbUJBQW1CO2dCQUMxQixXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRTthQUNsRixDQUFDLENBQUMsQ0FBQztZQUNSLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDcEMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyQixNQUFNO1lBQ04sV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7U0FDaEQsQ0FBQyxDQUFDO2FBQ0YsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUN6RyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvQixJQUFJLEVBQUUsV0FBVztZQUNqQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxNQUFNLE1BQU0sQ0FBQyxjQUFjLEVBQUU7U0FDL0QsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRU8sNkJBQTZCO1FBQ2pDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25GLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxjQUFjLENBQUM7UUFDL0QsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUU7WUFDdkIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsWUFBWTthQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN6RSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRTtZQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFO1lBQ3BDLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUU7U0FDcEYsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRU8sK0JBQStCLENBQUMsT0FBWTtRQUNoRCxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUN6QyxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztTQUM3QjtRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9DLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBbUI7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMvQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdkIsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBZTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQWM7UUFDaEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxlQUFvQjtRQUM3QyxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7YUFDckgsR0FBRyxDQUFDLENBQUMsZUFBdUIsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDO1lBQ3JFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRixJQUFJLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckksR0FBRyxJQUFJLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN6RyxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEU7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3RELEdBQUcsSUFBSSxxQkFBcUIsQ0FBQztpQkFDNUI7YUFDSjtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDUCxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFbEksT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBYSxFQUFFLEdBQVc7UUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksT0FBTyxFQUFFO1lBQ1QsWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzdHLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDbkQsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckM7WUFDRCxPQUFPLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0seUJBQXlCLENBQUMsZUFBb0I7UUFDakQsSUFBSSxlQUFlLENBQUMscUJBQXFCLElBQUksZUFBZSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRTtZQUV2RixlQUFlLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsY0FBbUIsRUFBRSxFQUFFO2dCQUN0RSxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsd0JBQXdCLENBQUMsQ0FBQztvQkFDbkYsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2hFLElBQUksY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUM3RSxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUN2RjtpQkFDSjtnQkFDRCxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELGVBQWU7UUFDWCxtREFBbUQ7SUFDdkQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBRWxGLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztJQUNwRCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLHNFQUFzRTtJQUN0RSwrQ0FBK0M7SUFDL0MsK0NBQStDO0lBQy9DLHFJQUFxSTtJQUNySSwyRkFBMkY7SUFDM0YsMkJBQTJCO0lBQzNCLGNBQWM7SUFFZCw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLHNFQUFzRTtJQUN0RSxlQUFlO0lBQ2YsUUFBUTtJQUNSLCtDQUErQztJQUMvQywyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLFlBQVk7SUFDWixVQUFVO0lBQ1YsSUFBSTtJQUdJLDRCQUE0QixDQUFDLE1BQTBCLEVBQUUsY0FBc0I7UUFDbkYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1FBQ3ZELElBQUcsZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQzVDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDdkMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLHVCQUF1QixHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN4SyxlQUFlLElBQUksZUFBZSxDQUFDLGVBQWUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDLENBQUM7WUFDaEksQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUF1QjtRQUNsRCxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7U0FDdEU7YUFBTSxJQUFJLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUNwRSxNQUFNLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkUsTUFBTSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztTQUN2QztRQUVELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDbkgsTUFBTSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7U0FDbkM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDakIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ3pILE1BQU0sQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ2pJLE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxhQUFhLENBQUM7U0FDakQ7UUFDRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDckIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUM5SCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztTQUM1RDtJQUNMLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxVQUFlLEVBQUUsYUFBcUI7UUFDdEUsSUFBSSxVQUFVLEVBQUU7WUFDaEIsVUFBVSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4RCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEdBQVE7UUFDdEMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7YUFDaEcsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDO2FBQzVFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7YUFDN0QsT0FBTyxDQUFDLHFCQUFxQixFQUFFLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLGlCQUFpQixDQUFDO2FBQ3JHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQzthQUNuRyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO2FBQ3ZELE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU0sa0JBQWtCLENBQUMsTUFBVyxFQUFFLEtBQWEsRUFBRSxlQUF3QixFQUFFLElBQVU7UUFDdEYsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBRWhCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlFLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztTQUM5QztRQUVELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFO1lBQ3JDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUksT0FBTyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuSixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDNUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0MsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxT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bmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlckNyZWF0aW9uQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvdXNlci1jcmVhdGlvbi1hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBUEkgfSBmcm9tIFwiLi4vLi4vYXBwLmNvbnN0YW50c1wiO1xyXG4vLyBpbXBvcnQgeyBBdmFpbGFibGVQaG9uZU51bWJlclJhbmdlSW50ZXJmYWNlLCBBdmFpbGFibGVSYW5nZUludGVyZmFjZSwgRG5SYW5nZVR5cGUsIExpbmVJbnRlcmZhY2UgfSBmcm9tIFwicHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXJzLWxpc3Qvc3JjL2NsYXNzZXMvbGluZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9hcGkvYXBpLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgQmlnIGZyb20gXCJiaWcuanNcIjtcclxuaW1wb3J0IHsgU2l0ZURlZmF1bHRzIH0gZnJvbSBcIi4uLy4uL2NsYXNzZXMvc2l0ZVwiO1xyXG5pbXBvcnQgeyBTaXRlLCBTaXRlSW50ZXJmYWNlLCBTaXRlVGVtcGxhdGVJbnRlcmZhY2UgfSBmcm9tIFwiLi4vLi4vY2xhc3Nlcy9zaXRlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBEZXZpY2VFbnRyeSxcclxuICAgIEVuZFVzZXJJbnRlcmZhY2UsXHJcbiAgICBMaW5lT3B0aW9uLFxyXG4gICAgT3ZlcnZpZXdEZXZpY2VSb3csXHJcbiAgICBPdmVydmlld0xpbmVSb3csXHJcbiAgICBPdmVydmlld1VzZXJSb3csXHJcbiAgICBTZWxlY3RlZExpbmVSb3csXHJcbiAgICBUZW1wbGF0ZURldmljZUxpa2UsXHJcbiAgICBUZW1wbGF0ZUVuZFVzZXJMaWtlLFxyXG4gICAgVGVtcGxhdGVMaW5lTGlrZSxcclxuICAgIFVzZXJDcmVhdGlvblR5cGUsXHJcbiAgICBVc2VyRGV0YWlsc0Zvcm0sXHJcbiAgICBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSxcclxuICAgIFVzZXJUZW1wbGF0ZUludGVyZmFjZSxcclxuICAgIExpbmVJbnRlcmZhY2UsXHJcbiAgICBEZXZpY2VJbnRlcmZhY2UsXHJcbiAgICBBdmFpbGFibGVQaG9uZU51bWJlclJhbmdlSW50ZXJmYWNlLFxyXG4gICAgQXZhaWxhYmxlUmFuZ2VJbnRlcmZhY2UsXHJcbiAgICBEblJhbmdlVHlwZSxcclxuICAgIExpc3RVc2VySW50ZXJmYWNlLFxyXG59IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3VzZXItY3JlYXRpb24td2l6YXJkLmludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgYnVpbGRTYXZhYmxlRW5kVXNlciB9IGZyb20gXCIuLi8uLi91dGlscy9idWlsZC1zYXZhYmxlLWVuZC11c2VyXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlckNyZWF0aW9uQXBpU2VydmljZSA9IGluamVjdChVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlKTtcclxuXHJcbiAgICByZWFkb25seSBsZGFwVGFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFsndXNlcklkJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdlbWFpbCcsICdhZGQnXTtcclxuICAgIHJlYWRvbmx5IHVzZXJDcmVhdGlvblR5cGVzOiBVc2VyQ3JlYXRpb25UeXBlW10gPSBbJ0NVQ00nLCAnTVQnXTtcclxuXHJcbiAgICBwcml2YXRlIHRlbXBsYXRlOiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcclxuICAgIHB1YmxpYyBlbmRVc2VyOiBFbmRVc2VySW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwdWJsaWMgbGluZXM6IExpbmVJbnRlcmZhY2VbXSA9IFtdO1xyXG4gICAgcHVibGljIGRldmljZXM6IERldmljZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwdWJsaWMgZGV2aWNlUHJvZmlsZXM6IERldmljZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwcml2YXRlIF9jdXJyZW50U2l0ZTogU2l0ZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGdldCBjdXJyZW50U2l0ZSgpOiBTaXRlIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNpdGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgdGVtcGxhdGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IFtdO1xyXG4gICAgcm91dGVQYXJ0aXRpb25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZGV2aWNlUm93czogbnVtYmVyW10gPSBbXTtcclxuICAgIGxkYXBVc2VyczogTGlzdFVzZXJJbnRlcmZhY2VbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdVc2VyczogT3ZlcnZpZXdVc2VyUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3TGluZXM6IE92ZXJ2aWV3TGluZVJvd1tdID0gW107XHJcbiAgICBvdmVydmlld0RldmljZXM6IE92ZXJ2aWV3RGV2aWNlUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlUHJvZmlsZXM6IE92ZXJ2aWV3RGV2aWNlUm93W10gPSBbXTtcclxuICAgIHVzZXJEZXRhaWxzRm9ybVZhbHVlOiBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgdXNlckRldGFpbHNGb3JtOiBVc2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICBmaXJzdE5hbWU6ICcnLFxyXG4gICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICBlbWFpbDogJycsXHJcbiAgICB9O1xyXG4gICAgbGluZVNlbGVjdGlvbnM6IFNlbGVjdGVkTGluZVJvd1tdID0gW107XHJcbiAgICBkZXZpY2VFbnRyaWVzOiBEZXZpY2VFbnRyeVtdID0gW107XHJcbiAgICBhdmFpbGFibGVOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZGV2aWNlVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBzaXRlRGVmYXVsdHM6IFNpdGVEZWZhdWx0cyB8IG51bGwgPSBudWxsO1xyXG4gICAgb3JpZ2luYWxTaXRlRGVmYXVsdHM6IFNpdGVEZWZhdWx0cyB8IG51bGwgPSBudWxsO1xyXG4gICAgdGVtcGxhdGVMaW5lczogVGVtcGxhdGVMaW5lTGlrZVtdID0gW107XHJcbiAgICB0ZW1wbGF0ZURldmljZXM6IFRlbXBsYXRlRGV2aWNlTGlrZVtdID0gW107XHJcbiAgICB0ZW1wbGF0ZVVzZXJEZXRhaWxzOiBUZW1wbGF0ZUVuZFVzZXJMaWtlID0ge307XHJcblxyXG4gICAgc2VsZWN0ZWRTaXRlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVGVtcGxhdGVOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVGVtcGxhdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFVzZXJDcmVhdGlvblR5cGU6IFVzZXJDcmVhdGlvblR5cGUgPSAnQ1VDTSc7XHJcbiAgICBhdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG46IGFueSA9IHt9O1xyXG5cclxuICAgIGdldCBmaXJzdExpbmVSb3V0ZVBhcnRpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzWzBdPy5kaXJlY3RvcnlOdW1iZXI/LnJvdXRlUGFydGl0aW9uTmFtZSA/PyAnJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2l0ZURlZmF1bHRSb3V0ZVBhcnRpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvdXRlUGFydGl0aW9uTmFtZXNMaXN0KCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXRlRGVmYXVsdHMgPyB0aGlzLnNpdGVEZWZhdWx0cy5yb3V0ZVBhcnRpdGlvbkZpbHRlciA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGVkTGRhcFVzZXI6IExpc3RVc2VySW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZGFwVXNlcnNUb3RhbCA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkUGxhY2Vob2xkZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzTGRhcEludGVncmF0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5lbmRVc2VyPy5sZGFwSW50ZWdyYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RMZGFwVXNlcih1c2VyOiBMaXN0VXNlckludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZGFwVXNlciA9IHVzZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIudXNlcmlkID0gdXNlci51c2VyaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5maXJzdE5hbWUgPSB1c2VyLmZpcnN0TmFtZSA/PyAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gdXNlci5sYXN0TmFtZSA/PyAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmVtYWlsID0gdXNlci5lbWFpbCA/PyAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlci51c2VyaWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogdXNlci5maXJzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lID8/ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCA/PyAnJyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckxkYXBVc2VyU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZGFwVXNlciA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLnVzZXJpZCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZmlyc3ROYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sYXN0TmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZW1haWwgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgZW1haWw6ICcnLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3c6IExpc3RVc2VySW50ZXJmYWNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMZGFwVXNlcj8udXNlcmlkID09PSByb3cudXNlcmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExkYXBVc2Vyc1Jlc3VsdCh1c2VyczogTGlzdFVzZXJJbnRlcmZhY2VbXSwgdG90YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzID0gdXNlcnM7XHJcbiAgICAgICAgdGhpcy5sZGFwVXNlcnNUb3RhbCA9IHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRTZWxlY3RlZFNpdGUoc2l0ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkVGVtcGxhdGUodGVtcGxhdGU/OiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGU/Lm5hbWUgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVJZCA9IHRlbXBsYXRlPy5pZCB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q3VycmVudFNpdGUoc2l0ZTogU2l0ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTaXRlID0gc2l0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFRlbXBsYXRlRHJpdmVuRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxpbmVPcHRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VFbnRyaWVzID0gW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VSb3dzID0gW107XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VGVtcGxhdGVUb2tlblBheWxvYWQocGF5bG9hZDogVXNlclRlbXBsYXRlSW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkKTtcclxuICAgICAgICB0aGlzLmVuZFVzZXIgPSB0aGlzLnRlbXBsYXRlPy5lbmRVc2VyIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5saW5lcyA9IHRoaXMuZW5kVXNlciAmJiBBcnJheS5pc0FycmF5KHRoaXMuZW5kVXNlcj8ubGluZXMpID8gdGhpcy5lbmRVc2VyLmxpbmVzIDogW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VzID0gdGhpcy5lbmRVc2VyICYmIEFycmF5LmlzQXJyYXkodGhpcy5lbmRVc2VyPy5kZXZpY2VzKSA/IHRoaXMuZW5kVXNlci5kZXZpY2VzIDogW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcyA9IHRoaXMuZW5kVXNlciAmJiBBcnJheS5pc0FycmF5KHRoaXMuZW5kVXNlcj8uZGV2aWNlUHJvZmlsZXMpID8gdGhpcy5lbmRVc2VyLmRldmljZVByb2ZpbGVzIDogW107XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRG5zTmFtZXNGb3JMaW5lcygpO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAvLyAgICAgdXNlcklkOiB0aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5lbmRVc2VyPy51c2VyaWQgPz8gJycpLFxyXG4gICAgICAgIC8vICAgICBmaXJzdE5hbWU6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LmZpcnN0TmFtZSA/PyAnJyksXHJcbiAgICAgICAgLy8gICAgIGxhc3ROYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5lbmRVc2VyPy5sYXN0TmFtZSA/PyAnJyksXHJcbiAgICAgICAgLy8gICAgIGVtYWlsOiB0aGlzLnZhbHVlVG9TdHJpbmcodGhpcy5lbmRVc2VyPy5lbWFpbCA/PyAnJylcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyBjb25zdCBtYXBwZWRMaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gbGluZXNGcm9tVGVtcGxhdGVcclxuICAgICAgICAvLyAgICAgLm1hcChsaW5lID0+ICh7XHJcbiAgICAgICAgLy8gICAgICAgICBudW1iZXI6IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciksXHJcbiAgICAgICAgLy8gICAgICAgICBkaWQ6IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kaWRQYXR0ZXJucz8uWzBdPy5wYXR0ZXJuIHx8IGxpbmU/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyKSxcclxuICAgICAgICAvLyAgICAgICAgIGNzczogdGhpcy52YWx1ZVRvU3RyaW5nKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHR5cGVvZiBsaW5lPy5jYWxsaW5nU2VhcmNoU3BhY2UgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgID8gbGluZS5jYWxsaW5nU2VhcmNoU3BhY2VcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgOiBsaW5lPy5jYWxsaW5nU2VhcmNoU3BhY2U/Lm5hbWVcclxuICAgICAgICAvLyAgICAgICAgICksXHJcbiAgICAgICAgLy8gICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRlc2NyaXB0aW9uKVxyXG4gICAgICAgIC8vICAgICB9KSlcclxuICAgICAgICAvLyAgICAgLmZpbHRlcihsaW5lID0+IGxpbmUubnVtYmVyLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5kZXZpY2VzLmZvckVhY2goZGV2aWNlID0+IHRoaXMuaW5pdERldmljZVdpdGhTaXRlSW5mbyhkZXZpY2UpKTtcclxuICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLmZvckVhY2goZGV2aWNlID0+IHRoaXMuaW5pdERldmljZVdpdGhTaXRlSW5mbyhkZXZpY2UpKTtcclxuICAgICAgICB0aGlzLmxpbmVzLmZvckVhY2gobGluZSA9PiB0aGlzLmluaXRMaW5lV2l0aFNpdGVJbmZvKGxpbmUpKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKG1hcHBlZExpbmVPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmxpbmVPcHRpb25zID0gdGhpcy51bmlxdWVCeU51bWJlcihtYXBwZWRMaW5lT3B0aW9ucyk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSB0aGlzLmxpbmVPcHRpb25zLm1hcChsaW5lID0+ICh7XHJcbiAgICAgICAgLy8gICAgICAgICBsaW5lTnVtYmVyOiBsaW5lLm51bWJlcixcclxuICAgICAgICAvLyAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogbGluZXNGcm9tVGVtcGxhdGUuZmluZChcclxuICAgICAgICAvLyAgICAgICAgICAgICBzb3VyY2UgPT4gKHNvdXJjZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJycpID09PSBsaW5lLm51bWJlclxyXG4gICAgICAgIC8vICAgICAgICAgKT8uZGlyZWN0b3J5TnVtYmVyPy5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgbnVsbFxyXG4gICAgICAgIC8vICAgICB9KSk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgbGluZUFzc29jaWF0aW9ucyA9IGRldmljZXNGcm9tVGVtcGxhdGUuZmxhdE1hcChkZXZpY2UgPT4gZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMgfHwgW10pO1xyXG4gICAgICAgIC8vICAgICBjb25zdCBhc3NvY2lhdGVkTGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IGxpbmVBc3NvY2lhdGlvbnNcclxuICAgICAgICAvLyAgICAgICAgIC5tYXAoYXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IG51bWJlciA9IGFzc29jaWF0aW9uPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciB8fCAnJztcclxuICAgICAgICAvLyAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRpZDogbnVtYmVyLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBjc3M6ICcnLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAvLyAgICAgICAgICAgICB9O1xyXG4gICAgICAgIC8vICAgICAgICAgfSlcclxuICAgICAgICAvLyAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLm51bWJlci50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIC8vICAgICB0aGlzLmxpbmVPcHRpb25zID0gdGhpcy51bmlxdWVCeU51bWJlcihhc3NvY2lhdGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgIC8vICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgLy8gICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVBc3NvY2lhdGlvbnMuZmluZChcclxuICAgICAgICAvLyAgICAgICAgICAgICBzb3VyY2UgPT4gKHNvdXJjZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJycpID09PSBsaW5lLm51bWJlclxyXG4gICAgICAgIC8vICAgICAgICAgKT8uZGlyZWN0b3J5TnVtYmVyPy5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgbnVsbFxyXG4gICAgICAgIC8vICAgICB9KSk7XHJcblxyXG4gICAgICAgIC8vICAgICB0aGlzLnRlbXBsYXRlTGluZXMuZm9yRWFjaCgobGluZTogYW55KSA9PiB0aGlzLmluaXRMaW5lV2l0aFNpdGVJbmZvKGxpbmUpKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKHRoaXMudGVtcGxhdGVMaW5lcyk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBjb25zdCByb3V0ZVBhcnRpdGlvbnMgPSB0aGlzLmxpbmVTZWxlY3Rpb25zXHJcbiAgICAgICAgLy8gICAgIC5tYXAobGluZSA9PiBsaW5lLnJvdXRlUGFydGl0aW9uTmFtZSlcclxuICAgICAgICAvLyAgICAgLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gISF2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgLy8gdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSB0aGlzLnVuaXF1ZVN0cmluZ3Mocm91dGVQYXJ0aXRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5kZXZpY2VFbnRyaWVzID0gZGV2aWNlc0Zyb21UZW1wbGF0ZS5tYXAoZGV2aWNlID0+ICh7XHJcbiAgICAgICAgLy8gICAgIGRldmljZVR5cGU6IHRoaXMudmFsdWVUb1N0cmluZyhkZXZpY2UuZGV2aWNlVHlwZSksXHJcbiAgICAgICAgLy8gICAgIHByb3RvY29sOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLnByb3RvY29sKSxcclxuICAgICAgICAvLyAgICAgYnV0dG9uVGVtcGxhdGU6IHRoaXMudmFsdWVUb1N0cmluZyhkZXZpY2UuYnV0dG9uVGVtcGxhdGUpLFxyXG4gICAgICAgIC8vICAgICBuYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLm5hbWUpXHJcbiAgICAgICAgLy8gfSkpO1xyXG4gICAgICAgIC8vIHRoaXMuZGV2aWNlUm93cyA9IHRoaXMuZGV2aWNlRW50cmllcy5tYXAoKF8sIGluZGV4KSA9PiBpbmRleCArIDEpO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICAgICAgLy8gdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIC8vIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkVXNlckNyZWF0aW9uVHlwZSh0eXBlOiBVc2VyQ3JlYXRpb25UeXBlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZXJEZXRhaWxzRmllbGQoZmllbGQ6IGtleW9mIFVzZXJEZXRhaWxzRm9ybSwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnVzZXJEZXRhaWxzRm9ybSxcclxuICAgICAgICAgICAgW2ZpZWxkXTogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseVVzZXJEZXRhaWxzRm9ybVZhbHVlKGZvcm1WYWx1ZTogVXNlckRldGFpbHNGb3JtVmFsdWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybVZhbHVlID0gZm9ybVZhbHVlO1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgICAgICB1c2VySWQ6IGZvcm1WYWx1ZS51c2VySWQgfHwgJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogZm9ybVZhbHVlLmZpcnN0TmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IGZvcm1WYWx1ZS5sYXN0TmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgZW1haWw6IGZvcm1WYWx1ZS5lbWFpbCB8fCAnJyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmb3JtVmFsdWUubGluZXM/LmZvckVhY2goKGxpbmVWYWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGluZSA9IHRoaXMubGluZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoIWxpbmU/LmRpcmVjdG9yeU51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciA9IGxpbmVWYWx1ZS5udW1iZXIgfHwgJyc7XHJcbiAgICAgICAgICAgIGxpbmUuZGlyZWN0b3J5TnVtYmVyLnJvdXRlUGFydGl0aW9uTmFtZSA9IGxpbmVWYWx1ZS5yb3V0ZVBhcnRpdGlvbiB8fCAnJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9ybVZhbHVlLmRldmljZXM/LmZvckVhY2goKGRldmljZVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkZXZpY2UgPSB0aGlzLmRldmljZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoIWRldmljZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRldmljZS5uYW1lID0gZGV2aWNlVmFsdWUubmFtZSB8fCAnJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9ybVZhbHVlLmRldmljZVByb2ZpbGVzPy5mb3JFYWNoKChwcm9maWxlVmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmRldmljZVByb2ZpbGVzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKCFwcm9maWxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJvZmlsZS5uYW1lID0gcHJvZmlsZVZhbHVlLm5hbWUgfHwgJyc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VQcm9maWxlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExpbmVTZWxlY3Rpb24oaW5kZXg6IG51bWJlciwgbGluZU51bWJlcjogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0sXHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRSb3V0ZVBhcnRpdGlvblNlbGVjdGlvbihpbmRleDogbnVtYmVyLCByb3V0ZVBhcnRpdGlvbk5hbWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdLFxyXG4gICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREZXZpY2VOYW1lKGluZGV4OiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdLmRldmljZVR5cGUgfHwgJyc7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBkZXZpY2VUeXBlLmluY2x1ZGVzKCc4ODUxJylcclxuICAgICAgICAgICAgPyBuYW1lLnJlcGxhY2UoL15TRVBcXHMqL2ksICcnKVxyXG4gICAgICAgICAgICA6IG5hbWU7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XSxcclxuICAgICAgICAgICAgbmFtZTogbm9ybWFsaXplZE5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZURpc3BsYXlOYW1lKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XTtcclxuICAgICAgICBpZiAoIWVudHJ5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbnRyeS5kZXZpY2VUeXBlPy5pbmNsdWRlcygnODg1MScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgU0VQICR7ZW50cnkubmFtZSB8fCAnJ31gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSB0aGlzLmxpbmVTZWxlY3Rpb25zWzBdPy5saW5lTnVtYmVyO1xyXG4gICAgICAgICAgICByZXR1cm4gbGluZU51bWJlciA/IGBDU0Yke2xpbmVOdW1iZXJ9YCA6ICdDU0ZbRE5dJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbnRyeS5uYW1lIHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaXRlQWxsRGF0YShzaXRlSWQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uQXBpU2VydmljZS5nZXRTaXRlQWxsRGF0YShzaXRlSWQpXHJcbiAgICAgICAgLnBpcGUodGFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2l0ZTogU2l0ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICBpZihyZXMgJiYgcmVzWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaXRlID0gbmV3IFNpdGUocmVzWzBdIGFzIFNpdGVJbnRlcmZhY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNpdGUgPSBzaXRlLmlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHJlcyAmJiByZXNbMV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2l0ZURlZmF1bHRzID0gbmV3IFNpdGVEZWZhdWx0cyhyZXNbMV0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxTaXRlRGVmYXVsdHMgPSBuZXcgU2l0ZURlZmF1bHRzKHJlc1sxXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbLi4udGhpcy5yb3V0ZVBhcnRpdGlvbk5hbWVzTGlzdF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYocmVzICYmIHJlc1syXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2VUeXBlcyA9IHJlc1syXSBhcyBzdHJpbmdbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IHRoaXMuc2l0ZURlZmF1bHRzPy5yb3V0ZVBhcnRpdGlvbiB8fCBbXTtcclxuICAgICAgICAgICAgLy8gdGhpcy5kZXZpY2VQb29sT3B0aW9ucyA9IHRoaXMuc2l0ZURlZmF1bHRzPy5kZXZpY2VQb29sIHx8IFtdO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNzc09wdGlvbnMgPSB0aGlzLnNpdGVEZWZhdWx0cz8uY3NzRmlsdGVyIHx8IFtdO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnZvaWNlbWFpbFByb2ZpbGVPcHRpb25zID0gdGhpcy5zaXRlRGVmYXVsdHM/LnZvaWNlbWFpbFByb2ZpbGUgfHwgW107XHJcbiAgICAgICAgICAgIC8vIHRoaXMubGluZUNzcyA9IHRoaXMuc2l0ZURlZmF1bHRzPy5saW5lQ3NzIHx8ICcnO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRldmljZUNzcyA9IHRoaXMuc2l0ZURlZmF1bHRzPy5kZXZpY2VDc3MgfHwgJyc7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY2FsbEZvcndhcmRBbGxDc3MgPSB0aGlzLnNpdGVEZWZhdWx0cz8uY2FsbEZvcndhcmRBbGxDc3MgfHwgJyc7IFxyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TnVtYmVyUmFuZ2Uoc2l0ZUlkOiBzdHJpbmcsIHJvdXRlUGFydGl0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEF2YWlsYWJsZVJhbmdlSW50ZXJmYWNlPiB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG4gPSB7fTtcclxuICAgICAgICBjb25zdCBwYWdlU2l6ZSA9IDk5OTk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge2RudHlwZTogRG5SYW5nZVR5cGUuZXh0ZW5zaW9uLCByb3V0ZXBhcnRpdGlvbjogcm91dGVQYXJ0aXRpb24sIHNpemU6IHBhZ2VTaXplLCBwYWdlOiAwfTtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZU51bWJlcnMgPSBbXTtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyQ3JlYXRpb25BcGlTZXJ2aWNlLmdldEF2YWlsYWJsZURuSW5SYW5nZXMoc2l0ZUlkLCBwYXJhbXMpXHJcbiAgICAgICAgLnBpcGUobWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXMuYXZhaWxhYmxlTnVtYmVyTGlzdC5mb3JFYWNoKChhdmFpbGFibGVOdW1iZXI6IEF2YWlsYWJsZVBob25lTnVtYmVyUmFuZ2VJbnRlcmZhY2UpID0+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+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSByb3V0ZVBhcnRpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYnVpbGRTYXZhYmxlRW5kVXNlcigpOiBFbmRVc2VySW50ZXJmYWNlIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRlbXBsYXRlIHVzZXIgbG9hZGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBidWlsZFNhdmFibGVFbmRVc2VyKFxyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIsXHJcbiAgICAgICAgICAgIHRoaXMubGluZXMsXHJcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlcyxcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcyxcclxuICAgICAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVEZXZpY2VOYW1lOiAoaW5kZXgsIGRldmljZSkgPT4gdGhpcy5yZXNvbHZlRGV2aWNlTmFtZUZvclNhdmUoaW5kZXgsIGRldmljZSksXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlRGV2aWNlUHJvZmlsZU5hbWU6IChpbmRleCwgcHJvZmlsZSkgPT4gdGhpcy5yZXNvbHZlRGV2aWNlTmFtZUZvclNhdmUoaW5kZXgsIHByb2ZpbGUpLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc29sdmVEZXZpY2VOYW1lRm9yU2F2ZShfaW5kZXg6IG51bWJlciwgZGV2aWNlOiBEZXZpY2VJbnRlcmZhY2UpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHJhd05hbWUgPSAoZGV2aWNlLm5hbWUgfHwgZGV2aWNlLm5ld05hbWUgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICBpZiAoZGV2aWNlLmRldmljZVR5cGU/LmluY2x1ZGVzKCc4ODUxJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2l0aG91dFNlcCA9IHJhd05hbWUucmVwbGFjZSgvXlNFUFxccyovaSwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTZXAgPyBgU0VQICR7d2l0aG91dFNlcH1gIDogJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByYXdOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYXZlTmV3VXNlcigpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmJ1aWxkU2F2YWJsZUVuZFVzZXIoKTtcclxuICAgICAgICBjb25zdCBzaXRlSWQgPSBTdHJpbmcodGhpcy5zZWxlY3RlZFNpdGUgPz8gJycpO1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBTdHJpbmcodGhpcy5zZWxlY3RlZFRlbXBsYXRlSWQgPz8gJycpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2Uuc2F2ZVRlbXBsYXRlVXNlcih1c2VyLCB0ZW1wbGF0ZUlkLCBzaXRlSWQpO1xyXG4gICAgfVxyXG59Il19