@dollhousemcp/mcp-server 2.0.35 → 2.0.37

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 (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  3. package/dist/elements/base/BaseElementManager.js +6 -2
  4. package/dist/elements/memories/Memory.d.ts.map +1 -1
  5. package/dist/elements/memories/Memory.js +9 -2
  6. package/dist/elements/memories/MemoryManager.d.ts +13 -0
  7. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  8. package/dist/elements/memories/MemoryManager.js +57 -44
  9. package/dist/elements/memories/constants.js +2 -2
  10. package/dist/elements/templates/Template.d.ts +2 -0
  11. package/dist/elements/templates/Template.d.ts.map +1 -1
  12. package/dist/elements/templates/Template.js +9 -1
  13. package/dist/generated/version.d.ts +2 -2
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
  16. package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
  17. package/dist/handlers/GitHubAuthHandler.js +303 -60
  18. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  19. package/dist/handlers/element-crud/editElement.js +24 -11
  20. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
  21. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
  23. package/dist/security/contentValidator.d.ts +32 -1
  24. package/dist/security/contentValidator.d.ts.map +1 -1
  25. package/dist/security/contentValidator.js +79 -33
  26. package/dist/security/secureYamlParser.d.ts.map +1 -1
  27. package/dist/security/secureYamlParser.js +5 -2
  28. package/dist/security/tokenManager.d.ts +1 -1
  29. package/dist/security/tokenManager.d.ts.map +1 -1
  30. package/dist/security/tokenManager.js +10 -7
  31. package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
  32. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  33. package/dist/storage/MemoryMetadataExtractor.js +7 -3
  34. package/dist/utils/pathSecurity.d.ts +3 -1
  35. package/dist/utils/pathSecurity.d.ts.map +1 -1
  36. package/dist/utils/pathSecurity.js +38 -2
  37. package/dist/web/routes/setupRoutes.d.ts +23 -7
  38. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  39. package/dist/web/routes/setupRoutes.js +138 -20
  40. package/oauth-helper.mjs +233 -92
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -9,6 +9,7 @@ import { logger } from '../utils/logger.js';
9
9
  import { fileURLToPath } from 'url';
10
10
  import * as path from 'path';
11
11
  import { homedir } from 'os';
12
+ import { randomUUID } from 'node:crypto';
12
13
  import * as child_process from 'child_process';
13
14
  import { SecurityMonitor } from '../security/securityMonitor.js';
14
15
  export class GitHubAuthHandler {
@@ -33,6 +34,7 @@ export class GitHubAuthHandler {
33
34
  async setupGitHubAuth() {
34
35
  await this.ensureInitialized();
35
36
  try {
37
+ await this.cleanupLegacyPendingToken('setupGitHubAuth');
36
38
  // Check current auth status first
37
39
  const currentStatus = await this.githubAuthManager.getAuthStatus();
38
40
  if (currentStatus.isAuthenticated) {
@@ -122,7 +124,8 @@ export class GitHubAuthHandler {
122
124
  clientId: clientId?.substring(0, 8) + '...',
123
125
  deviceCode: deviceResponse.device_code.substring(0, 8) + '...'
124
126
  });
125
- const helper = this.spawnHelperProcess(helperPath, deviceResponse, clientId);
127
+ const flowId = randomUUID();
128
+ const helper = this.spawnHelperProcess(helperPath, deviceResponse, clientId, flowId);
126
129
  helper.unref();
127
130
  logger.debug('OAUTH_STEP_7: Helper process spawned successfully', { pid: helper.pid });
128
131
  logger.info('OAuth helper process spawned', {
@@ -131,11 +134,13 @@ export class GitHubAuthHandler {
131
134
  userCode: deviceResponse.user_code
132
135
  });
133
136
  const stateFile = path.join(this.getDollhouseHomeDir(), '.dollhouse', '.auth', 'oauth-helper-state.json');
137
+ const resultFile = path.join(this.getDollhouseHomeDir(), '.dollhouse', '.auth', 'oauth-helper-result.json');
134
138
  const stateDir = path.dirname(stateFile);
135
139
  await this.fileOperations.createDirectory(stateDir);
140
+ await this.fileOperations.deleteFile(resultFile).catch(() => { });
136
141
  const state = {
137
142
  pid: helper.pid,
138
- deviceCode: deviceResponse.device_code,
143
+ flowId,
139
144
  userCode: deviceResponse.user_code,
140
145
  startTime: new Date().toISOString(),
141
146
  expiresAt: new Date(Date.now() + deviceResponse.expires_in * 1000).toISOString()
@@ -145,12 +150,13 @@ export class GitHubAuthHandler {
145
150
  });
146
151
  }
147
152
  catch (spawnError) {
153
+ const spawnErr = spawnError;
148
154
  logger.error('OAUTH_INDEX_2774: Failed to spawn OAuth helper process', {
149
155
  error: spawnError,
150
156
  helperPath,
151
157
  clientId: clientId?.substring(0, 8) + '...',
152
- errorCode: spawnError?.code,
153
- syscall: spawnError?.syscall
158
+ errorCode: spawnErr.code,
159
+ syscall: spawnErr.syscall
154
160
  });
155
161
  let errorDetail = '';
156
162
  if (spawnError instanceof Error) {
@@ -212,13 +218,16 @@ export class GitHubAuthHandler {
212
218
  async checkGitHubAuth() {
213
219
  await this.ensureInitialized();
214
220
  try {
221
+ const removedLegacyPendingToken = await this.cleanupLegacyPendingToken('checkGitHubAuth');
215
222
  const helperHealth = await this.checkOAuthHelperHealth();
216
223
  const status = await this.githubAuthManager.getAuthStatus();
217
224
  if (status.isAuthenticated) {
218
225
  if (helperHealth.exists) {
219
226
  const stateFile = path.join(this.getDollhouseHomeDir(), '.dollhouse', '.auth', 'oauth-helper-state.json');
227
+ const resultFile = path.join(this.getDollhouseHomeDir(), '.dollhouse', '.auth', 'oauth-helper-result.json');
220
228
  // FileOperationsService.deleteFile already handles ENOENT gracefully
221
229
  await this.fileOperations.deleteFile(stateFile).catch(() => { }); // Preserve error swallowing pattern
230
+ await this.fileOperations.deleteFile(resultFile).catch(() => { });
222
231
  }
223
232
  return {
224
233
  content: [{
@@ -234,6 +243,45 @@ export class GitHubAuthHandler {
234
243
  }]
235
244
  };
236
245
  }
246
+ else if (helperHealth.resultStatus === 'success') {
247
+ const legacyNotice = removedLegacyPendingToken
248
+ ? `\n\nA stale plaintext OAuth fallback file from an earlier failed flow was removed.`
249
+ : '';
250
+ return {
251
+ content: [{
252
+ type: "text",
253
+ text: this.prefix(`✅ **GitHub Authentication Completed**\n\n` +
254
+ `The OAuth helper finished successfully, but the GitHub token is not available to this server process.${legacyNotice}\n\n` +
255
+ `**To fix this:**\n` +
256
+ `1. Run \`check_github_auth\` again after the server refreshes\n` +
257
+ `2. If it still fails, run \`setup_github_auth\` to authenticate again`)
258
+ }]
259
+ };
260
+ }
261
+ else if (helperHealth.resultStatus) {
262
+ const statusLabel = this.formatOAuthHelperTerminalStatus(helperHealth.resultStatus);
263
+ const lines = [
264
+ `${statusLabel.icon} **GitHub Authentication ${statusLabel.title}**`,
265
+ '',
266
+ this.sanitizeOAuthHelperResultMessage(helperHealth.resultMessage) || statusLabel.defaultMessage,
267
+ '',
268
+ '**To try again:**',
269
+ 'Run: `setup_github_auth` to get a new code',
270
+ ''
271
+ ];
272
+ if (removedLegacyPendingToken) {
273
+ lines.push('A stale plaintext OAuth fallback file from an earlier failed flow was removed.', '');
274
+ }
275
+ if (helperHealth.errorLog) {
276
+ lines.push('**Error Log:**', '```', helperHealth.errorLog, '```', '');
277
+ }
278
+ return {
279
+ content: [{
280
+ type: "text",
281
+ text: this.prefix(lines.join('\n'))
282
+ }]
283
+ };
284
+ }
237
285
  else if (helperHealth.isActive) {
238
286
  return {
239
287
  content: [{
@@ -277,26 +325,29 @@ export class GitHubAuthHandler {
277
325
  return {
278
326
  content: [{
279
327
  type: "text",
280
- text: this.prefix(`⚠️ **GitHub Token Invalid**\n\n`) +
328
+ text: this.prefix(`⚠️ **GitHub Token Invalid**\n\n` +
281
329
  `A GitHub token was found but it appears to be invalid or expired.\n\n` +
282
330
  `**To fix this:**\n` +
283
331
  `1. Say "set up GitHub" to authenticate again\n` +
284
332
  `2. Or check your GITHUB_TOKEN environment variable\n\n` +
285
- `Note: Browse and install still work without authentication!`
333
+ `Note: Browse and install still work without authentication!`)
286
334
  }]
287
335
  };
288
336
  }
289
337
  else {
338
+ const legacyNotice = removedLegacyPendingToken
339
+ ? `\n\nA stale plaintext OAuth fallback file from an earlier failed flow was removed. Please run \`setup_github_auth\` again to reconnect.`
340
+ : '';
290
341
  return {
291
342
  content: [{
292
343
  type: "text",
293
- text: this.prefix(`🔒 **Not Connected to GitHub**\n\n`) +
344
+ text: this.prefix(`🔒 **Not Connected to GitHub**\n\n` +
294
345
  `You're not currently authenticated with GitHub.\n\n` +
295
346
  `**What works without auth:**\n` +
296
347
  `✅ Browse the public collection\n` +
297
348
  `✅ Install community content\n` +
298
349
  `❌ Submit your own content (requires auth)\n\n` +
299
- `To connect, just say "set up GitHub" or "connect to GitHub"`
350
+ `To connect, just say "set up GitHub" or "connect to GitHub"${legacyNotice}`)
300
351
  }]
301
352
  };
302
353
  }
@@ -306,8 +357,8 @@ export class GitHubAuthHandler {
306
357
  return {
307
358
  content: [{
308
359
  type: "text",
309
- text: this.prefix(`❌ **Unable to Check Authentication**\n\n`) +
310
- `Error: ${error instanceof Error ? error.message : 'Unknown error'}`
360
+ text: this.prefix(`❌ **Unable to Check Authentication**\n\n` +
361
+ `Error: ${error instanceof Error ? error.message : 'Unknown error'}`)
311
362
  }]
312
363
  };
313
364
  }
@@ -320,12 +371,34 @@ export class GitHubAuthHandler {
320
371
  const stateFile = path.join(homeDir, '.dollhouse', '.auth', 'oauth-helper-state.json');
321
372
  const logFile = path.join(homeDir, '.dollhouse', 'oauth-helper.log');
322
373
  const pidFile = path.join(homeDir, '.dollhouse', '.auth', 'oauth-helper.pid');
374
+ const resultFile = path.join(homeDir, '.dollhouse', '.auth', 'oauth-helper-result.json');
323
375
  let statusText = `📊 **OAuth Helper Process Diagnostics**\n\n`;
324
376
  if (!health.exists) {
325
377
  statusText += `**Status:** No OAuth process detected\n`;
326
378
  statusText += `**State File:** Not found\n\n`;
327
379
  statusText += `No active authentication process. Run \`setup_github_auth\` to start one.\n`;
328
380
  }
381
+ else if (health.resultStatus) {
382
+ const statusLabel = this.formatOAuthHelperTerminalStatus(health.resultStatus);
383
+ statusText += `**Status:** ${statusLabel.icon} ${statusLabel.title.toUpperCase()}\n`;
384
+ if (health.userCode) {
385
+ statusText += `**User Code:** ${health.userCode}\n`;
386
+ }
387
+ if (health.pid) {
388
+ statusText += `**Process ID:** ${health.pid}\n`;
389
+ }
390
+ if (health.completedAt) {
391
+ statusText += `**Completed:** ${health.completedAt.toLocaleString()}\n`;
392
+ }
393
+ if (health.resultAttempts !== undefined) {
394
+ statusText += `**Attempts:** ${health.resultAttempts}\n`;
395
+ }
396
+ const resultMessage = this.sanitizeOAuthHelperResultMessage(health.resultMessage);
397
+ if (resultMessage) {
398
+ statusText += `**Result:** ${resultMessage}\n`;
399
+ }
400
+ statusText += '\n';
401
+ }
329
402
  else if (health.isActive) {
330
403
  statusText += `**Status:** 🟢 ACTIVE - Authentication in progress\n`;
331
404
  statusText += `**User Code:** ${health.userCode}\n`;
@@ -337,9 +410,7 @@ export class GitHubAuthHandler {
337
410
  if (!health.processAlive) {
338
411
  statusText += `⚠️ **WARNING:** Process appears to have stopped!\n`;
339
412
  statusText += `The helper process (PID ${health.pid}) is not responding.\n`;
340
- statusText += `You may need to run
341
- setup_github_auth
342
- again.\n\n`;
413
+ statusText += `You may need to run \`setup_github_auth\` again.\n\n`;
343
414
  }
344
415
  }
345
416
  else if (health.expired) {
@@ -348,12 +419,11 @@ setup_github_auth
348
419
  statusText += `**Process ID:** ${health.pid}\n`;
349
420
  statusText += `**Started:** ${health.startTime?.toLocaleString()}\n`;
350
421
  statusText += `**Expired:** ${health.expiresAt?.toLocaleString()}\n\n`;
351
- statusText += `The authentication request has expired. Run
352
- setup_github_auth
353
- to try again.\n\n`;
422
+ statusText += `The authentication request has expired. Run \`setup_github_auth\` to try again.\n\n`;
354
423
  }
355
424
  statusText += `**📁 File Locations:**\n`;
356
425
  statusText += `• State: ${stateFile}\n`;
426
+ statusText += `• Result: ${resultFile} ${health.hasResult ? '(exists)' : '(not found)'}\n`;
357
427
  statusText += `• Log: ${logFile} ${health.hasLog ? '(exists)' : '(not found)'}\n`;
358
428
  statusText += `• PID: ${pidFile}\n\n`;
359
429
  if (health.errorLog) {
@@ -374,23 +444,29 @@ setup_github_auth
374
444
  statusText += `**📜 Log:** Unable to read log file\n\n`;
375
445
  }
376
446
  }
377
- if (health.exists && !health.processAlive && !health.expired) {
447
+ if (health.exists && !health.processAlive && !health.expired && !health.resultStatus) {
378
448
  statusText += `**🔧 Troubleshooting Tips:**\n`;
379
449
  statusText += `1. The helper process may have crashed\n`;
380
- statusText += `2. Check the log file for errors: ${logFile}\n`;
381
- statusText += `3. Try running
382
- setup_github_auth
383
- again\n`;
384
- statusText += `4. Ensure DOLLHOUSE_GITHUB_CLIENT_ID is set\n`;
385
- statusText += `5. Check your internet connection\n`;
450
+ if (health.hasLog) {
451
+ statusText += `2. Check the log file for errors: ${logFile}\n`;
452
+ statusText += `3. Try running \`setup_github_auth\` again\n`;
453
+ statusText += `4. Ensure DOLLHOUSE_GITHUB_CLIENT_ID is set\n`;
454
+ statusText += `5. Check your internet connection\n`;
455
+ }
456
+ else {
457
+ statusText += `2. Try running \`setup_github_auth\` again\n`;
458
+ statusText += `3. Ensure DOLLHOUSE_GITHUB_CLIENT_ID is set\n`;
459
+ statusText += `4. Check your internet connection\n`;
460
+ }
386
461
  }
387
462
  if (health.exists && (health.expired || !health.processAlive)) {
388
463
  statusText += `\n**🧹 Manual Cleanup (if needed):**\n`;
389
- statusText += '```bash';
464
+ statusText += '```bash\n';
390
465
  statusText += `rm "${stateFile}"\n`;
466
+ statusText += `rm "${resultFile}"\n`;
391
467
  statusText += `rm "${logFile}"\n`;
392
468
  statusText += `rm "${pidFile}"\n`;
393
- statusText += '```';
469
+ statusText += '```\n';
394
470
  }
395
471
  return {
396
472
  content: [{
@@ -404,8 +480,8 @@ setup_github_auth
404
480
  return {
405
481
  content: [{
406
482
  type: "text",
407
- text: this.prefix(`❌ **Failed to Get OAuth Helper Status**\n\n`) +
408
- `Error: ${error instanceof Error ? error.message : 'Unknown error'}`
483
+ text: this.prefix(`❌ **Failed to Get OAuth Helper Status**\n\n` +
484
+ `Error: ${error instanceof Error ? error.message : 'Unknown error'}`)
409
485
  }]
410
486
  };
411
487
  }
@@ -414,31 +490,61 @@ setup_github_auth
414
490
  const homeDir = this.getDollhouseHomeDir();
415
491
  const stateFile = path.join(homeDir, '.dollhouse', '.auth', 'oauth-helper-state.json');
416
492
  const logFile = path.join(homeDir, '.dollhouse', 'oauth-helper.log');
493
+ const resultFile = path.join(homeDir, '.dollhouse', '.auth', 'oauth-helper-result.json');
417
494
  const health = {
418
495
  exists: false,
419
496
  isActive: false,
420
497
  expired: false,
421
498
  processAlive: false,
499
+ hasResult: false,
422
500
  hasLog: false,
423
501
  userCode: '',
424
502
  timeRemaining: 0,
425
503
  pid: 0,
426
504
  startTime: null,
427
505
  expiresAt: null,
506
+ completedAt: null,
507
+ resultStatus: null,
508
+ resultMessage: '',
509
+ resultAttempts: undefined,
428
510
  errorLog: ''
429
511
  };
512
+ let result = null;
513
+ let state = null;
514
+ try {
515
+ const resultData = await this.fileOperations.readFile(resultFile, {
516
+ source: 'GitHubAuthHandler.checkOAuthHelperHealth'
517
+ });
518
+ result = this.normalizeOAuthHelperResult(JSON.parse(resultData));
519
+ }
520
+ catch (error) {
521
+ if (!this.isFileNotFoundError(error)) {
522
+ logger.debug('Error reading OAuth helper result', { error });
523
+ }
524
+ }
430
525
  try {
431
526
  const stateData = await this.fileOperations.readFile(stateFile, {
432
527
  source: 'GitHubAuthHandler.checkOAuthHelperHealth'
433
528
  });
434
- const state = JSON.parse(stateData);
529
+ const parsedState = JSON.parse(stateData);
530
+ if (!this.isOAuthHelperState(parsedState)) {
531
+ logger.debug('OAuth helper state file had invalid shape');
532
+ throw new Error('Invalid OAuth helper state shape');
533
+ }
534
+ state = parsedState;
435
535
  health.exists = true;
436
536
  health.pid = state.pid;
437
537
  health.userCode = state.userCode;
438
538
  health.startTime = new Date(state.startTime);
439
539
  health.expiresAt = new Date(state.expiresAt);
540
+ if (result && this.oauthHelperResultMatchesState(result, state)) {
541
+ this.populateOAuthHelperResult(health, result);
542
+ }
440
543
  const now = new Date();
441
- if (health.expiresAt > now) {
544
+ if (health.resultStatus) {
545
+ health.isActive = false;
546
+ }
547
+ else if (health.expiresAt > now) {
442
548
  health.isActive = true;
443
549
  health.timeRemaining = Math.ceil((health.expiresAt.getTime() - now.getTime()) / 1000);
444
550
  // Check if process is alive (only reliable on non-Windows platforms)
@@ -447,8 +553,8 @@ setup_github_auth
447
553
  process.kill(health.pid, 0); // Signal 0 checks existence without killing
448
554
  health.processAlive = true;
449
555
  }
450
- catch {
451
- health.processAlive = false;
556
+ catch (error) {
557
+ health.processAlive = this.isProcessPermissionError(error);
452
558
  }
453
559
  }
454
560
  else {
@@ -461,39 +567,172 @@ setup_github_auth
461
567
  else {
462
568
  health.expired = true;
463
569
  }
464
- // Check if log file exists
465
- health.hasLog = await this.fileOperations.exists(logFile);
466
- // Read error log if process is dead or expired, or if verbose mode is on
467
- if (health.hasLog && (!health.processAlive || health.expired)) {
468
- try {
469
- const logContent = await this.fileOperations.readFile(logFile, {
470
- source: 'GitHubAuthHandler.checkOAuthHelperHealth'
471
- });
472
- const lines = logContent.split('\n');
473
- const importantLines = lines.filter(line => line.toLowerCase().includes('error') ||
474
- line.toLowerCase().includes('fail') ||
475
- line.includes('❌') ||
476
- line.includes('⚠️')).slice(-10); // Get last 10 relevant lines
477
- if (importantLines.length > 0) {
478
- health.errorLog = importantLines.join('\n');
479
- }
480
- }
481
- catch {
482
- // Intentionally empty - ignore if log file read fails
483
- }
484
- }
485
570
  }
486
571
  catch (error) {
487
- // If state file is not found (ENOENT), it's expected, so don't log as debug
488
- if (error instanceof Error && error.message.includes('ENOENT')) {
489
- // Intentionally empty - ENOENT is expected when state file doesn't exist yet
490
- }
491
- else {
572
+ if (!this.isFileNotFoundError(error)) {
492
573
  logger.debug('Error reading OAuth helper state', { error });
493
574
  }
494
575
  }
576
+ if (result && !state) {
577
+ this.populateOAuthHelperResult(health, result);
578
+ }
579
+ health.hasLog = await this.fileOperations.exists(logFile);
580
+ if (health.hasLog && (!health.processAlive || health.expired || health.resultStatus)) {
581
+ try {
582
+ const logContent = await this.fileOperations.readFile(logFile, {
583
+ source: 'GitHubAuthHandler.checkOAuthHelperHealth'
584
+ });
585
+ const lines = logContent.split('\n');
586
+ const importantLines = lines.filter(line => line.toLowerCase().includes('error') ||
587
+ line.toLowerCase().includes('fail') ||
588
+ line.includes('❌') ||
589
+ line.includes('⚠️')).slice(-10);
590
+ if (importantLines.length > 0) {
591
+ health.errorLog = importantLines.join('\n');
592
+ }
593
+ }
594
+ catch {
595
+ // Intentionally empty - ignore if log file read fails
596
+ }
597
+ }
495
598
  return health;
496
599
  }
600
+ async cleanupLegacyPendingToken(source) {
601
+ const pendingTokenFile = path.join(this.getDollhouseHomeDir(), '.dollhouse', '.auth', 'pending_token.txt');
602
+ try {
603
+ if (!(await this.fileOperations.exists(pendingTokenFile))) {
604
+ return false;
605
+ }
606
+ await this.fileOperations.deleteFile(pendingTokenFile, undefined, {
607
+ source: `GitHubAuthHandler.${source}`
608
+ });
609
+ SecurityMonitor.logSecurityEvent({
610
+ type: 'TOKEN_CACHE_CLEARED',
611
+ severity: 'MEDIUM',
612
+ source: `GitHubAuthHandler.${source}`,
613
+ details: 'Removed stale plaintext OAuth pending token fallback file'
614
+ });
615
+ logger.warn('Removed stale plaintext OAuth pending token fallback file');
616
+ return true;
617
+ }
618
+ catch (error) {
619
+ logger.warn('Failed to remove stale OAuth pending token fallback file', { error });
620
+ return false;
621
+ }
622
+ }
623
+ isOAuthHelperTerminalStatus(status) {
624
+ return status === 'success' ||
625
+ status === 'failed' ||
626
+ status === 'expired' ||
627
+ status === 'denied' ||
628
+ status === 'timeout';
629
+ }
630
+ normalizeOAuthHelperResult(value) {
631
+ if (!this.isRecord(value) || !this.isOAuthHelperTerminalStatus(value.status))
632
+ return null;
633
+ return {
634
+ status: value.status,
635
+ attempts: typeof value.attempts === 'number' ? value.attempts : undefined,
636
+ completedAt: typeof value.completedAt === 'string' ? value.completedAt : undefined,
637
+ errorCode: typeof value.errorCode === 'string' ? value.errorCode : undefined,
638
+ message: typeof value.message === 'string'
639
+ ? this.sanitizeOAuthHelperResultMessage(value.message)
640
+ : undefined,
641
+ flowId: typeof value.flowId === 'string' ? value.flowId : undefined,
642
+ pid: this.isValidOAuthHelperPid(value.pid) ? value.pid : undefined
643
+ };
644
+ }
645
+ isOAuthHelperState(value) {
646
+ if (!this.isRecord(value))
647
+ return false;
648
+ return this.isValidOAuthHelperPid(value.pid) &&
649
+ (value.flowId === undefined || typeof value.flowId === 'string') &&
650
+ typeof value.userCode === 'string' &&
651
+ typeof value.startTime === 'string' &&
652
+ typeof value.expiresAt === 'string' &&
653
+ !Number.isNaN(new Date(value.startTime).getTime()) &&
654
+ !Number.isNaN(new Date(value.expiresAt).getTime());
655
+ }
656
+ sanitizeOAuthHelperResultMessage(message) {
657
+ const withoutControlCharacters = Array.from(message, character => {
658
+ const codePoint = character.codePointAt(0) ?? 0;
659
+ return codePoint <= 31 ||
660
+ codePoint === 127 ||
661
+ (codePoint >= 0xD800 && codePoint <= 0xDFFF)
662
+ ? ' '
663
+ : character;
664
+ }).join('');
665
+ return withoutControlCharacters
666
+ .replace(/\s+/g, ' ')
667
+ .trim()
668
+ .slice(0, 500);
669
+ }
670
+ isRecord(value) {
671
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
672
+ }
673
+ isValidOAuthHelperPid(value) {
674
+ return typeof value === 'number' &&
675
+ Number.isSafeInteger(value) &&
676
+ value > 0;
677
+ }
678
+ isProcessPermissionError(error) {
679
+ return error instanceof Error &&
680
+ 'code' in error &&
681
+ error.code === 'EPERM';
682
+ }
683
+ populateOAuthHelperResult(health, result) {
684
+ health.exists = true;
685
+ health.hasResult = true;
686
+ health.resultStatus = result.status;
687
+ health.resultMessage = result.message ?? '';
688
+ health.resultAttempts = result.attempts;
689
+ health.completedAt = result.completedAt ? new Date(result.completedAt) : null;
690
+ }
691
+ oauthHelperResultMatchesState(result, state) {
692
+ if (!state.flowId)
693
+ return true;
694
+ if (result.flowId !== state.flowId)
695
+ return false;
696
+ return typeof result.pid !== 'number' || result.pid === state.pid;
697
+ }
698
+ isFileNotFoundError(error) {
699
+ return this.isRecord(error) && error.code === 'ENOENT';
700
+ }
701
+ formatOAuthHelperTerminalStatus(status) {
702
+ switch (status) {
703
+ case 'success':
704
+ return {
705
+ icon: '✅',
706
+ title: 'Completed',
707
+ defaultMessage: 'The OAuth helper completed successfully.'
708
+ };
709
+ case 'expired':
710
+ return {
711
+ icon: '⏱️',
712
+ title: 'Expired',
713
+ defaultMessage: 'The GitHub authentication request expired.'
714
+ };
715
+ case 'denied':
716
+ return {
717
+ icon: '🚫',
718
+ title: 'Denied',
719
+ defaultMessage: 'The GitHub authentication request was denied.'
720
+ };
721
+ case 'timeout':
722
+ return {
723
+ icon: '⏱️',
724
+ title: 'Timed Out',
725
+ defaultMessage: 'The GitHub authentication request timed out.'
726
+ };
727
+ case 'failed':
728
+ default:
729
+ return {
730
+ icon: '❌',
731
+ title: 'Failed',
732
+ defaultMessage: 'The OAuth helper failed before authentication completed.'
733
+ };
734
+ }
735
+ }
497
736
  async clearGitHubAuth() {
498
737
  await this.ensureInitialized();
499
738
  try {
@@ -621,7 +860,7 @@ setup_github_auth
621
860
  };
622
861
  }
623
862
  }
624
- spawnHelperProcess(helperPath, deviceResponse, clientId) {
863
+ spawnHelperProcess(helperPath, deviceResponse, clientId, flowId) {
625
864
  return child_process.spawn('node', [
626
865
  helperPath,
627
866
  deviceResponse.device_code,
@@ -631,11 +870,15 @@ setup_github_auth
631
870
  ], {
632
871
  detached: true,
633
872
  stdio: 'ignore',
634
- windowsHide: true
873
+ windowsHide: true,
874
+ env: {
875
+ ...process.env,
876
+ DOLLHOUSE_OAUTH_HELPER_FLOW_ID: flowId
877
+ }
635
878
  });
636
879
  }
637
880
  getDollhouseHomeDir() {
638
881
  return process.env.DOLLHOUSE_HOME_DIR || homedir();
639
882
  }
640
883
  }
641
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQXV0aEhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGFuZGxlcnMvR2l0SHViQXV0aEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7O0dBS0c7QUFHSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssYUFBYSxNQUFNLGVBQWUsQ0FBQztBQUcvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHakUsTUFBTSxPQUFPLGlCQUFpQjtJQUVMO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFMckIsWUFDcUIsaUJBQW9DLEVBQ3BDLGFBQTRCLEVBQzVCLFdBQWtDLEVBQ2xDLGdCQUF5QyxFQUN6QyxjQUFxQztRQUpyQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtJQUN2RCxDQUFDO0lBRUksS0FBSyxDQUFDLGlCQUFpQjtRQUMzQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRU8sTUFBTSxDQUFDLE9BQWU7UUFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxLQUFLLENB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QUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNyRCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDO3dCQUNSLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDOzRCQUNuRCxVQUFVLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsTUFBTTs0QkFDeEUsaUJBQWlCOzRCQUNqQixtREFBbUQ7NEJBQ25ELG1EQUFtRDs0QkFDbkQsd0JBQXdCO3FCQUMvQixDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsVUFBa0IsRUFBRSxjQUFrQyxFQUFFLFFBQWdCO1FBQy9GLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDL0IsVUFBVTtZQUNWLGNBQWMsQ0FBQyxXQUFXO1lBQzFCLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDekMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDcEMsUUFBUTtTQUNYLEVBQUU7WUFDQyxRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxRQUFRO1lBQ2YsV0FBVyxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLG1CQUFtQjtRQUN2QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7SUFDdkQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEZJWDogRE1DUC1TRUMtMDA2IC0gU2VjdXJpdHkgYXVkaXQgc3VwcHJlc3Npb25cbiAqIFRoaXMgaGFuZGxlciBkZWxlZ2F0ZXMgYXV0aGVudGljYXRpb24gb3BlcmF0aW9ucyB0byBHaXRIdWJBdXRoTWFuYWdlci5cbiAqIEF1ZGl0IGxvZ2dpbmcgaGFwcGVucyBpbiBHaXRIdWJBdXRoTWFuYWdlciBmb3IgYXV0aCBvcGVyYXRpb25zLlxuICogQHNlY3VyaXR5LWF1ZGl0LXN1cHByZXNzIERNQ1AtU0VDLTAwNlxuICovXG5cbmltcG9ydCB7IEdpdEh1YkF1dGhNYW5hZ2VyLCBEZXZpY2VDb2RlUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRoL0dpdEh1YkF1dGhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IENvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcvQ29uZmlnTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9Jbml0aWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgUGVyc29uYUluZGljYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9QZXJzb25hSW5kaWNhdG9yU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxuZXhwb3J0IGNsYXNzIEdpdEh1YkF1dGhIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBnaXRodWJBdXRoTWFuYWdlcjogR2l0SHViQXV0aE1hbmFnZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnTWFuYWdlcjogQ29uZmlnTWFuYWdlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbml0U2VydmljZTogSW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvclNlcnZpY2U6IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVmaXgobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuaW5kaWNhdG9yU2VydmljZS5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHttZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0dXBHaXRIdWJBdXRoKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2hlY2sgY3VycmVudCBhdXRoIHN0YXR1cyBmaXJzdFxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLmdldEF1dGhTdGF0dXMoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoXG4gICAgICAgICAgICAgICAgICBg4pyFICoqQWxyZWFkeSBDb25uZWN0ZWQgdG8gR2l0SHViKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHtjdXJyZW50U3RhdHVzLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCflJEgKipQZXJtaXNzaW9uczoqKiAke2N1cnJlbnRTdGF0dXMuc2NvcGVzPy5qb2luKCcsICcpIHx8ICdiYXNpYyBhY2Nlc3MnfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFlvdSdyZSBhbGwgc2V0ISBZb3UgY2FuOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBCcm93c2UgdGhlIGNvbGxlY3Rpb25cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgSW5zdGFsbCBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIFN1Ym1pdCB5b3VyIGNyZWF0aW9uc1xcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFRvIGRpc2Nvbm5lY3QsIHNheSBcImRpc2Nvbm5lY3QgZnJvbSBHaXRIdWJcImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBhdXRoZW50aWNhdGlvbiBpbml0aWF0aW9uXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ0FVVEhfRkxPV19JTklUSUFURUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnR2l0SHViQXV0aEhhbmRsZXIuc2V0dXBHaXRIdWJBdXRoJyxcbiAgICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gZmxvdyBpbml0aWF0ZWQgdmlhIGRldmljZSBjb2RlJyxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGF1dGhGbG93OiAnZGV2aWNlLWNvZGUnIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEluaXRpYXRlIGRldmljZSBmbG93XG4gICAgICAgICAgbGV0IGRldmljZVJlc3BvbnNlOiBEZXZpY2VDb2RlUmVzcG9uc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRldmljZVJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3coKTtcbiAgICAgICAgICB9IGNhdGNoIChkZXZpY2VGbG93RXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignT0FVVEhfSU5ERVhfMjY4MTogRmFpbGVkIHRvIGluaXRpYXRlIGRldmljZSBmbG93JywgeyBlcnJvcjogZGV2aWNlRmxvd0Vycm9yIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9JTkRFWF8yNjgxOiBEZXZpY2UgZmxvdyBpbml0aWF0aW9uIGZhaWxlZCAtICR7ZGV2aWNlRmxvd0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBkZXZpY2VGbG93RXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgaGVscGVyIHByb2Nlc3MgYXBwcm9hY2ggZnJvbSBQUiAjNTE4XG4gICAgICAgICAgLy8gTUNQIHNlcnZlcnMgYXJlIHN0YXRlbGVzcyBhbmQgdGVybWluYXRlIGFmdGVyIHJldHVybmluZyByZXNwb25zZVxuICAgICAgICAgIC8vIFRoZSBoZWxwZXIgcHJvY2VzcyBzdXJ2aXZlcyBNQ1AgdGVybWluYXRpb24gYW5kIGNhbiBjb21wbGV0ZSBPQXV0aCBwb2xsaW5nXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gR2V0IHRoZSBPQXV0aCBjbGllbnQgSUQgLSB1c2UgdGhlIHNhbWUgbWV0aG9kIHRoYXQgaGFzIHRoZSBkZWZhdWx0IGZhbGxiYWNrXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIGdldCB0aGUgZGVmYXVsdCBjbGllbnQgSUQgaWYgbm8gZW52L2NvbmZpZyBpcyBzZXRcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ09BVVRIX1NURVBfNDogR2V0dGluZyBjbGllbnQgSUQgZm9yIGhlbHBlciBwcm9jZXNzJyk7XG4gICAgICAgICAgY29uc3QgY2xpZW50SWQgPSBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLnJlc29sdmVDbGllbnRJZCgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT0FVVEhfU1RFUF81OiBDbGllbnQgSUQgb2J0YWluZWQnLCB7IGNsaWVudElkOiBjbGllbnRJZD8uc3Vic3RyaW5nKDAsIDgpICsgJy4uLicgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKCFjbGllbnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICAgIGDinYwgKipHaXRIdWIgT0F1dGggQ29uZmlndXJhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIG9idGFpbiBHaXRIdWIgT0F1dGggY2xpZW50IElELlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFRoaXMgaXMgdW5leHBlY3RlZCAtIHBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZS5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKldvcmthcm91bmQ6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlOiBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRFxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBPciB1c2UgR2l0SHViIENMSTogZ2ggYXV0aCBsb2dpbiAtLXdlYmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBsZXQgaGVscGVyUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG4gICAgICAgICAgICBjb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlSGVscGVyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX09BVVRIX0hFTFBFUjtcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdvYXV0aC1oZWxwZXIubWpzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnb2F1dGgtaGVscGVyLm1qcycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnb2F1dGgtaGVscGVyLm1qcycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnb2F1dGgtaGVscGVyLm1qcycpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlSGVscGVyKSB7XG4gICAgICAgICAgICAgIHBvc3NpYmxlUGF0aHMudW5zaGlmdChvdmVycmlkZUhlbHBlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGhlbHBlclBhdGggPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0UGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0ZXN0UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBoZWxwZXJQYXRoID0gdGVzdFBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFoZWxwZXJQYXRoKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignT0FVVEhfSU5ERVhfMjczNDogb2F1dGgtaGVscGVyLm1qcyBub3QgZm91bmQnLCB7IFxuICAgICAgICAgICAgICAgIHNlYXJjaGVkUGF0aHM6IHBvc3NpYmxlUGF0aHMsXG4gICAgICAgICAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIGRpcm5hbWU6IF9fZGlybmFtZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9IRUxQRVJfTk9UX0ZPVU5EOiBvYXV0aC1oZWxwZXIubWpzIG5vdCBmb3VuZCBhdCBsaW5lIDI3MzQuIFNlYXJjaGVkOiAke3Bvc3NpYmxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPQVVUSF9TVEVQXzY6IFNwYXduaW5nIGhlbHBlciBwcm9jZXNzJywgeyBcbiAgICAgICAgICAgICAgaGVscGVyUGF0aCxcbiAgICAgICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkPy5zdWJzdHJpbmcoMCwgOCkgKyAnLi4uJyxcbiAgICAgICAgICAgICAgZGV2aWNlQ29kZTogZGV2aWNlUmVzcG9uc2UuZGV2aWNlX2NvZGUuc3Vic3RyaW5nKDAsIDgpICsgJy4uLicgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gdGhpcy5zcGF3bkhlbHBlclByb2Nlc3MoaGVscGVyUGF0aCwgZGV2aWNlUmVzcG9uc2UsIGNsaWVudElkKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaGVscGVyLnVucmVmKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT0FVVEhfU1RFUF83OiBIZWxwZXIgcHJvY2VzcyBzcGF3bmVkIHN1Y2Nlc3NmdWxseScsIHsgcGlkOiBoZWxwZXIucGlkIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnT0F1dGggaGVscGVyIHByb2Nlc3Mgc3Bhd25lZCcsIHtcbiAgICAgICAgICAgICAgcGlkOiBoZWxwZXIucGlkLFxuICAgICAgICAgICAgICBleHBpcmVzSW46IGRldmljZVJlc3BvbnNlLmV4cGlyZXNfaW4sXG4gICAgICAgICAgICAgIHVzZXJDb2RlOiBkZXZpY2VSZXNwb25zZS51c2VyX2NvZGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5nZXREb2xsaG91c2VIb21lRGlyKCksICcuZG9sbGhvdXNlJywgJy5hdXRoJywgJ29hdXRoLWhlbHBlci1zdGF0ZS5qc29uJyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZURpciA9IHBhdGguZGlybmFtZShzdGF0ZUZpbGUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3Rvcnkoc3RhdGVEaXIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICAgICAgcGlkOiBoZWxwZXIucGlkLFxuICAgICAgICAgICAgICBkZXZpY2VDb2RlOiBkZXZpY2VSZXNwb25zZS5kZXZpY2VfY29kZSxcbiAgICAgICAgICAgICAgdXNlckNvZGU6IGRldmljZVJlc3BvbnNlLnVzZXJfY29kZSxcbiAgICAgICAgICAgICAgc3RhcnRUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoRGF0ZS5ub3coKSArIGRldmljZVJlc3BvbnNlLmV4cGlyZXNfaW4gKiAxMDAwKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShzdGF0ZUZpbGUsIEpTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKSwge1xuICAgICAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoSGFuZGxlci5zZXR1cEdpdEh1YkF1dGgnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKHNwYXduRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignT0FVVEhfSU5ERVhfMjc3NDogRmFpbGVkIHRvIHNwYXduIE9BdXRoIGhlbHBlciBwcm9jZXNzJywgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IHNwYXduRXJyb3IsXG4gICAgICAgICAgICAgIGhlbHBlclBhdGgsXG4gICAgICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZD8uc3Vic3RyaW5nKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogKHNwYXduRXJyb3IgYXMgYW55KT8uY29kZSxcbiAgICAgICAgICAgICAgc3lzY2FsbDogKHNwYXduRXJyb3IgYXMgYW55KT8uc3lzY2FsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBlcnJvckRldGFpbCA9ICcnO1xuICAgICAgICAgICAgaWYgKHNwYXduRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICBpZiAoc3Bhd25FcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFTk9FTlQnKSkge1xuICAgICAgICAgICAgICAgIGVycm9yRGV0YWlsID0gYE9BVVRIX0hFTFBFUl9TUEFXTl9FTk9FTlQ6IE5vZGUuanMgZXhlY3V0YWJsZSBub3QgZm91bmQgb3IgaGVscGVyIHNjcmlwdCBtaXNzaW5nIGF0ICR7aGVscGVyUGF0aH1gO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwYXduRXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUFDQ0VTJykpIHtcbiAgICAgICAgICAgICAgICBlcnJvckRldGFpbCA9IGBPQVVUSF9IRUxQRVJfU1BBV05fRUFDQ0VTOiBQZXJtaXNzaW9uIGRlbmllZCB3aGVuIHRyeWluZyB0byBleGVjdXRlICR7aGVscGVyUGF0aH1gO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwYXduRXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRTJCSUcnKSkge1xuICAgICAgICAgICAgICAgIGVycm9yRGV0YWlsID0gYE9BVVRIX0hFTFBFUl9TUEFXTl9FMkJJRzogQXJndW1lbnQgbGlzdCB0b28gbG9uZyBmb3IgaGVscGVyIHByb2Nlc3NgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yRGV0YWlsID0gYE9BVVRIX0hFTFBFUl9TUEFXTl9GQUlMRUQ6IENvdWxkIG5vdCBzdGFydCBiYWNrZ3JvdW5kIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgYXQgbGluZSAyNzc0IC0gJHtzcGF3bkVycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXJyb3JEZXRhaWwgPSBgT0FVVEhfSEVMUEVSX1NQQVdOX1VOS05PV046IFVua25vd24gc3Bhd24gZXJyb3IgYXQgbGluZSAyNzc0YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICAgIGDimqDvuI8gKipPQXV0aCBIZWxwZXIgTGF1bmNoIEZhaWxlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgJHtlcnJvckRldGFpbH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKkFsdGVybmF0aXZlIE9wdGlvbnM6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAxLiBUcnkgYWdhaW46IFJ1biBzZXR1cF9naXRodWJfYXV0aCBhZ2FpblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDIuIFVzZSBHaXRIdWIgQ0xJOiBnaCBhdXRoIGxvZ2luIC0td2ViXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMy4gU2V0IHRva2VuIG1hbnVhbGx5OiBleHBvcnQgR0lUSFVCX1RPS0VOPXlvdXJfdG9rZW5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLmZvcm1hdEF1dGhJbnN0cnVjdGlvbnMoZGV2aWNlUmVzcG9uc2UpICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcblxcbvCfk50gKipOb3RlKio6IEF1dGhlbnRpY2F0aW9uIHdpbGwgY29tcGxldGUgYXV0b21hdGljYWxseSBvbmNlIHlvdSBhdXRob3JpemUuICcgK1xuICAgICAgICAgICAgICAgICAgICAnWW91ciB0b2tlbiB3aWxsIGJlIHN0b3JlZCBzZWN1cmVseSBmb3IgZnV0dXJlIHVzZSEnXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdPQVVUSF9JTkRFWF8yODA2OiBNYWluIGNhdGNoIGJsb2NrIC0gYXV0aGVudGljYXRpb24gc2V0dXAgZmFpbGVkJywgeyBcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24nXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgY29uc3QgaGFzRXJyb3JDb2RlID0gZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdPQVVUSF8nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KFxuICAgICAgICAgICAgICAgIGDinYwgKipBdXRoZW50aWNhdGlvbiBTZXR1cCBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGAke2hhc0Vycm9yQ29kZSA/IGVycm9yTWVzc2FnZSA6IGBPQVVUSF9JTkRFWF8yODA2OiBVbmFibGUgdG8gc3RhcnQgR2l0SHViIGF1dGhlbnRpY2F0aW9uIC0gJHtlcnJvck1lc3NhZ2V9YH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgJHshZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdPQVVUSF9ORVRXT1JLJykgPyAnUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLicgOiAnJ31gXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrR2l0SHViQXV0aCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlbHBlckhlYWx0aCA9IGF3YWl0IHRoaXMuY2hlY2tPQXV0aEhlbHBlckhlYWx0aCgpO1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChzdGF0dXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVySGVhbHRoLmV4aXN0cykge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5nZXREb2xsaG91c2VIb21lRGlyKCksICcuZG9sbGhvdXNlJywgJy5hdXRoJywgJ29hdXRoLWhlbHBlci1zdGF0ZS5qc29uJyk7XG4gICAgICAgICAgICAgIC8vIEZpbGVPcGVyYXRpb25zU2VydmljZS5kZWxldGVGaWxlIGFscmVhZHkgaGFuZGxlcyBFTk9FTlQgZ3JhY2VmdWxseVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVGaWxlKS5jYXRjaCgoKSA9PiB7fSk7IC8vIFByZXNlcnZlIGVycm9yIHN3YWxsb3dpbmcgcGF0dGVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KFxuICAgICAgICAgICAgICAgICAgYOKchSAqKkdpdEh1YiBDb25uZWN0ZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCfkaQgKipVc2VybmFtZToqKiAke3N0YXR1cy51c2VybmFtZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5SRICoqUGVybWlzc2lvbnM6KiogJHtzdGF0dXMuc2NvcGVzPy5qb2luKCcsICcpIHx8ICdiYXNpYyBhY2Nlc3MnfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqQXZhaWxhYmxlIEFjdGlvbnM6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinIUgQnJvd3NlIGNvbGxlY3Rpb25cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinIUgSW5zdGFsbCBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgICBg4pyFIFN1Ym1pdCBjb250ZW50XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgRXZlcnl0aGluZyBpcyB3b3JraW5nIHByb3Blcmx5IWBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySGVhbHRoLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KFxuICAgICAgICAgICAgICAgICAgYOKPsyAqKkdpdEh1YiBBdXRoZW50aWNhdGlvbiBJbiBQcm9ncmVzcyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+UkSAqKlVzZXIgQ29kZToqKiAke2hlbHBlckhlYWx0aC51c2VyQ29kZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDij7HvuI8gKipUaW1lIFJlbWFpbmluZzoqKiAke01hdGguZmxvb3IoaGVscGVySGVhbHRoLnRpbWVSZW1haW5pbmcgLyA2MCl9bSAke2hlbHBlckhlYWx0aC50aW1lUmVtYWluaW5nICUgNjB9c1xcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCflIQgKipQcm9jZXNzIFN0YXR1czoqKiAke2hlbHBlckhlYWx0aC5wcm9jZXNzQWxpdmUgPyAn4pyFIFJ1bm5pbmcnIDogJ+KaoO+4jyBNYXkgaGF2ZSBzdG9wcGVkJ31cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5OBICoqTG9nIEF2YWlsYWJsZToqKiAke2hlbHBlckhlYWx0aC5oYXNMb2cgPyAnWWVzJyA6ICdObyd9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipXYWl0aW5nIGZvciB5b3UgdG86KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAxLiBHbyB0bzogaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDIuIEVudGVyIGNvZGU6ICoqJHtoZWxwZXJIZWFsdGgudXNlckNvZGV9KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAzLiBBdXRob3JpemUgdGhlIGFwcGxpY2F0aW9uXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVGhlIGF1dGhlbnRpY2F0aW9uIHdpbGwgY29tcGxldGUgYXV0b21hdGljYWxseSBvbmNlIHlvdSBhdXRob3JpemUuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgUnVuIHRoaXMgY29tbWFuZCBhZ2FpbiB0byBjaGVjayBzdGF0dXMuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJIZWFsdGguZXhpc3RzICYmIGhlbHBlckhlYWx0aC5leHBpcmVkKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgICAgICAgJ+KPse+4jyAqKkF1dGhlbnRpY2F0aW9uIEV4cGlyZWQqKicsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAnVGhlIEdpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGhhcyBleHBpcmVkLicsXG4gICAgICAgICAgICAgIGBVc2VyIGNvZGU6ICR7aGVscGVySGVhbHRoLnVzZXJDb2RlfSAoZXhwaXJlZClgLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJyoqVG8gdHJ5IGFnYWluOioqJyxcbiAgICAgICAgICAgICAgJ1J1bjogYHNldHVwX2dpdGh1Yl9hdXRoYCB0byBnZXQgYSBuZXcgY29kZScsXG4gICAgICAgICAgICAgICcnXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBpZiAoaGVscGVySGVhbHRoLmVycm9yTG9nKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goJyoqRXJyb3IgTG9nOioqJywgJ2BgYCcsIGhlbHBlckhlYWx0aC5lcnJvckxvZywgJ2BgYCcsICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChsaW5lcy5qb2luKCdcXG4nKSlcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMuaGFzVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKaoO+4jyAqKkdpdEh1YiBUb2tlbiBJbnZhbGlkKipcXG5cXG5gKSArXG4gICAgICAgICAgICAgICAgICAgICAgYEEgR2l0SHViIHRva2VuIHdhcyBmb3VuZCBidXQgaXQgYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIGV4cGlyZWQuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCoqVG8gZml4IHRoaXM6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICBgMS4gU2F5IFwic2V0IHVwIEdpdEh1YlwiIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAyLiBPciBjaGVjayB5b3VyIEdJVEhVQl9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBOb3RlOiBCcm93c2UgYW5kIGluc3RhbGwgc3RpbGwgd29yayB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIWBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYPCflJIgKipOb3QgQ29ubmVjdGVkIHRvIEdpdEh1YioqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICAgIGBZb3UncmUgbm90IGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAqKldoYXQgd29ya3Mgd2l0aG91dCBhdXRoOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYOKdjCBTdWJtaXQgeW91ciBvd24gY29udGVudCAocmVxdWlyZXMgYXV0aClcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICBgVG8gY29ubmVjdCwganVzdCBzYXkgXCJzZXQgdXAgR2l0SHViXCIgb3IgXCJjb25uZWN0IHRvIEdpdEh1YlwiYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2hlY2sgR2l0SHViIGF1dGgnLCB7IGVycm9yIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKdjCAqKlVuYWJsZSB0byBDaGVjayBBdXRoZW50aWNhdGlvbioqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T0F1dGhIZWxwZXJTdGF0dXModmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFsdGggPSBhd2FpdCB0aGlzLmNoZWNrT0F1dGhIZWxwZXJIZWFsdGgoKTtcbiAgICAgICAgICBjb25zdCBob21lRGlyID0gdGhpcy5nZXREb2xsaG91c2VIb21lRGlyKCk7XG4gICAgICAgICAgY29uc3Qgc3RhdGVGaWxlID0gcGF0aC5qb2luKGhvbWVEaXIsICcuZG9sbGhvdXNlJywgJy5hdXRoJywgJ29hdXRoLWhlbHBlci1zdGF0ZS5qc29uJyk7XG4gICAgICAgICAgY29uc3QgbG9nRmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScsICdvYXV0aC1oZWxwZXIubG9nJyk7XG4gICAgICAgICAgY29uc3QgcGlkRmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXIucGlkJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHN0YXR1c1RleHQgPSBg8J+TiiAqKk9BdXRoIEhlbHBlciBQcm9jZXNzIERpYWdub3N0aWNzKipcXG5cXG5gO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICghaGVhbHRoLmV4aXN0cykge1xuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipTdGF0dXM6KiogTm8gT0F1dGggcHJvY2VzcyBkZXRlY3RlZFxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqU3RhdGUgRmlsZToqKiBOb3QgZm91bmRcXG5cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBObyBhY3RpdmUgYXV0aGVudGljYXRpb24gcHJvY2Vzcy4gUnVuIFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIHRvIHN0YXJ0IG9uZS5cXG5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVhbHRoLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXR1czoqKiDwn5+iIEFDVElWRSAtIEF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipVc2VyIENvZGU6KiogJHtoZWFsdGgudXNlckNvZGV9XFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipQcm9jZXNzIElEOioqICR7aGVhbHRoLnBpZH1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlByb2Nlc3MgQWxpdmU6KiogJHtoZWFsdGgucHJvY2Vzc0FsaXZlID8gJ+KchSBZZXMnIDogJ+KdjCBObyAobWF5IGhhdmUgY3Jhc2hlZCknfVxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqU3RhcnRlZDoqKiAke2hlYWx0aC5zdGFydFRpbWU/LnRvTG9jYWxlU3RyaW5nKCl9XFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipFeHBpcmVzOioqICR7aGVhbHRoLmV4cGlyZXNBdD8udG9Mb2NhbGVTdHJpbmcoKX1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlRpbWUgUmVtYWluaW5nOioqICR7TWF0aC5mbG9vcihoZWFsdGgudGltZVJlbWFpbmluZyAvIDYwKX1tICR7aGVhbHRoLnRpbWVSZW1haW5pbmcgJSA2MH1zXFxuXFxuYFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWhlYWx0aC5wcm9jZXNzQWxpdmUpIHtcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBg4pqg77iPICoqV0FSTklORzoqKiBQcm9jZXNzIGFwcGVhcnMgdG8gaGF2ZSBzdG9wcGVkIVxcbmBcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgVGhlIGhlbHBlciBwcm9jZXNzIChQSUQgJHtoZWFsdGgucGlkfSkgaXMgbm90IHJlc3BvbmRpbmcuXFxuYFxuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBZb3UgbWF5IG5lZWQgdG8gcnVuIFxuc2V0dXBfZ2l0aHViX2F1dGhcbiBhZ2Fpbi5cXG5cXG5gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWFsdGguZXhwaXJlZCkge1xuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipTdGF0dXM6Kiog8J+UtCBFWFBJUkVEXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipVc2VyIENvZGU6KiogJHtoZWFsdGgudXNlckNvZGV9IChleHBpcmVkKVxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqUHJvY2VzcyBJRDoqKiAke2hlYWx0aC5waWR9XFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipTdGFydGVkOioqICR7aGVhbHRoLnN0YXJ0VGltZT8udG9Mb2NhbGVTdHJpbmcoKX1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKkV4cGlyZWQ6KiogJHtoZWFsdGguZXhwaXJlc0F0Py50b0xvY2FsZVN0cmluZygpfVxcblxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYFRoZSBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGhhcyBleHBpcmVkLiBSdW4gXG5zZXR1cF9naXRodWJfYXV0aFxuIHRvIHRyeSBhZ2Fpbi5cXG5cXG5gXG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+TgSBGaWxlIExvY2F0aW9uczoqKlxcbmBcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGDigKIgU3RhdGU6ICR7c3RhdGVGaWxlfVxcbmBcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGDigKIgTG9nOiAke2xvZ0ZpbGV9ICR7aGVhbHRoLmhhc0xvZyA/ICcoZXhpc3RzKScgOiAnKG5vdCBmb3VuZCknfVxcbmBcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGDigKIgUElEOiAke3BpZEZpbGV9XFxuXFxuYFxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChoZWFsdGguZXJyb3JMb2cpIHtcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoq4pqg77iPIFJlY2VudCBFcnJvcnM6KipcXG5cXGBcXGBcXGBcXG4ke2hlYWx0aC5lcnJvckxvZ31cXG5cXGBcXGBcXGBcXG5cXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodmVyYm9zZSAmJiBoZWFsdGguaGFzTG9nKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBmdWxsTG9nID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShsb2dGaWxlLCB7XG4gICAgICAgICAgICAgICAgc291cmNlOiAnR2l0SHViQXV0aEhhbmRsZXIuZ2V0T0F1dGhIZWxwZXJTdGF0dXMnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGZ1bGxMb2cuc3BsaXQoJ1xcbicpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVjZW50TGluZXMgPSBsaW5lcy5zbGljZSgtMjApO1xuXG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+TnCBSZWNlbnQgTG9nIE91dHB1dCAobGFzdCAyMCBsaW5lcyk6KipcXG5cXGBcXGBcXGBcXG5gO1xuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IHJlY2VudExpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBcXG5cXGBcXGBcXGBcXG5cXG5gO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+TnCBMb2c6KiogVW5hYmxlIHRvIHJlYWQgbG9nIGZpbGVcXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaGVhbHRoLmV4aXN0cyAmJiAhaGVhbHRoLnByb2Nlc3NBbGl2ZSAmJiAhaGVhbHRoLmV4cGlyZWQpIHtcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+UpyBUcm91Ymxlc2hvb3RpbmcgVGlwczoqKlxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYDEuIFRoZSBoZWxwZXIgcHJvY2VzcyBtYXkgaGF2ZSBjcmFzaGVkXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgMi4gQ2hlY2sgdGhlIGxvZyBmaWxlIGZvciBlcnJvcnM6ICR7bG9nRmlsZX1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAzLiBUcnkgcnVubmluZyBcbnNldHVwX2dpdGh1Yl9hdXRoXG4gYWdhaW5cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGA0LiBFbnN1cmUgRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQgaXMgc2V0XFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgNS4gQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uXFxuYFxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaGVhbHRoLmV4aXN0cyAmJiAoaGVhbHRoLmV4cGlyZWQgfHwgIWhlYWx0aC5wcm9jZXNzQWxpdmUpKSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBcXG4qKvCfp7kgTWFudWFsIENsZWFudXAgKGlmIG5lZWRlZCk6KipcXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9ICdgYGBiYXNoJ1xuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgcm0gXCIke3N0YXRlRmlsZX1cIlxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYHJtIFwiJHtsb2dGaWxlfVwiXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgcm0gXCIke3BpZEZpbGV9XCJcXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9ICdgYGAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KHN0YXR1c1RleHQpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZ2V0IE9BdXRoIGhlbHBlciBzdGF0dXMnLCB7IGVycm9yIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKdjCAqKkZhaWxlZCB0byBHZXQgT0F1dGggSGVscGVyIFN0YXR1cyoqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja09BdXRoSGVscGVySGVhbHRoKCkge1xuICAgICAgICBjb25zdCBob21lRGlyID0gdGhpcy5nZXREb2xsaG91c2VIb21lRGlyKCk7XG4gICAgICAgIGNvbnN0IHN0YXRlRmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItc3RhdGUuanNvbicpO1xuICAgICAgICBjb25zdCBsb2dGaWxlID0gcGF0aC5qb2luKGhvbWVEaXIsICcuZG9sbGhvdXNlJywgJ29hdXRoLWhlbHBlci5sb2cnKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGhlYWx0aCA9IHtcbiAgICAgICAgICBleGlzdHM6IGZhbHNlLFxuICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICBleHBpcmVkOiBmYWxzZSxcbiAgICAgICAgICBwcm9jZXNzQWxpdmU6IGZhbHNlLFxuICAgICAgICAgIGhhc0xvZzogZmFsc2UsXG4gICAgICAgICAgdXNlckNvZGU6ICcnLFxuICAgICAgICAgIHRpbWVSZW1haW5pbmc6IDAsXG4gICAgICAgICAgcGlkOiAwLFxuICAgICAgICAgIHN0YXJ0VGltZTogbnVsbCBhcyBEYXRlIHwgbnVsbCxcbiAgICAgICAgICBleHBpcmVzQXQ6IG51bGwgYXMgRGF0ZSB8IG51bGwsXG4gICAgICAgICAgZXJyb3JMb2c6ICcnXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXRlRGF0YSA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc3RhdGVGaWxlLCB7XG4gICAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoSGFuZGxlci5jaGVja09BdXRoSGVscGVySGVhbHRoJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZURhdGEpO1xuICAgICAgICAgIGhlYWx0aC5leGlzdHMgPSB0cnVlO1xuICAgICAgICAgIGhlYWx0aC5waWQgPSBzdGF0ZS5waWQ7XG4gICAgICAgICAgaGVhbHRoLnVzZXJDb2RlID0gc3RhdGUudXNlckNvZGU7XG4gICAgICAgICAgaGVhbHRoLnN0YXJ0VGltZSA9IG5ldyBEYXRlKHN0YXRlLnN0YXJ0VGltZSk7XG4gICAgICAgICAgaGVhbHRoLmV4cGlyZXNBdCA9IG5ldyBEYXRlKHN0YXRlLmV4cGlyZXNBdCk7XG5cbiAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGlmIChoZWFsdGguZXhwaXJlc0F0ID4gbm93KSB7XG4gICAgICAgICAgICBoZWFsdGguaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgaGVhbHRoLnRpbWVSZW1haW5pbmcgPSBNYXRoLmNlaWwoKGhlYWx0aC5leHBpcmVzQXQuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKSkgLyAxMDAwKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcHJvY2VzcyBpcyBhbGl2ZSAob25seSByZWxpYWJsZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMpXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChoZWFsdGgucGlkLCAwKTsgLy8gU2lnbmFsIDAgY2hlY2tzIGV4aXN0ZW5jZSB3aXRob3V0IGtpbGxpbmdcbiAgICAgICAgICAgICAgICBoZWFsdGgucHJvY2Vzc0FsaXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgaGVhbHRoLnByb2Nlc3NBbGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBPbiBXaW5kb3dzLCBwcm9jZXNzLmtpbGwocGlkLCAwKSBpcyBub3QgcmVsaWFibGUgZm9yIGNoZWNraW5nIGV4aXN0ZW5jZS5cbiAgICAgICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIGl0J3MgYWxpdmUgaWYgdGhlIHN0YXRlIGZpbGUgZXhpc3RzIGFuZCBoYXNuJ3QgZXhwaXJlZC5cbiAgICAgICAgICAgICAgLy8gQSBtb3JlIHJvYnVzdCBjaGVjayB3b3VsZCBpbnZvbHZlIHBsYXRmb3JtLXNwZWNpZmljIHByb2Nlc3MgbWFuYWdlbWVudC5cbiAgICAgICAgICAgICAgaGVhbHRoLnByb2Nlc3NBbGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlYWx0aC5leHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBsb2cgZmlsZSBleGlzdHNcbiAgICAgICAgICBoZWFsdGguaGFzTG9nID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMobG9nRmlsZSk7XG5cbiAgICAgICAgICAvLyBSZWFkIGVycm9yIGxvZyBpZiBwcm9jZXNzIGlzIGRlYWQgb3IgZXhwaXJlZCwgb3IgaWYgdmVyYm9zZSBtb2RlIGlzIG9uXG4gICAgICAgICAgaWYgKGhlYWx0aC5oYXNMb2cgJiYgKCFoZWFsdGgucHJvY2Vzc0FsaXZlIHx8IGhlYWx0aC5leHBpcmVkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgbG9nQ29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUobG9nRmlsZSwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhIYW5kbGVyLmNoZWNrT0F1dGhIZWxwZXJIZWFsdGgnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGxvZ0NvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICBjb25zdCBpbXBvcnRhbnRMaW5lcyA9IGxpbmVzLmZpbHRlcihsaW5lID0+XG4gICAgICAgICAgICAgICAgbGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdlcnJvcicpIHx8XG4gICAgICAgICAgICAgICAgbGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmYWlsJykgfHxcbiAgICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCfinYwnKSB8fFxuICAgICAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ+KaoO+4jycpXG4gICAgICAgICAgICAgICkuc2xpY2UoLTEwKTsgLy8gR2V0IGxhc3QgMTAgcmVsZXZhbnQgbGluZXNcblxuICAgICAgICAgICAgICBpZiAoaW1wb3J0YW50TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGhlYWx0aC5lcnJvckxvZyA9IGltcG9ydGFudExpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eSAtIGlnbm9yZSBpZiBsb2cgZmlsZSByZWFkIGZhaWxzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgc3RhdGUgZmlsZSBpcyBub3QgZm91bmQgKEVOT0VOVCksIGl0J3MgZXhwZWN0ZWQsIHNvIGRvbid0IGxvZyBhcyBkZWJ1Z1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT0VOVCcpKSB7XG4gICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5IC0gRU5PRU5UIGlzIGV4cGVjdGVkIHdoZW4gc3RhdGUgZmlsZSBkb2Vzbid0IGV4aXN0IHlldFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Vycm9yIHJlYWRpbmcgT0F1dGggaGVscGVyIHN0YXRlJywgeyBlcnJvciB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBoZWFsdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXJHaXRIdWJBdXRoKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBZGQgc2VjdXJpdHkgYXVkaXQgbG9nZ2luZyBmb3IgYXV0aGVudGljYXRpb24gY2xlYXJpbmdcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoSGFuZGxlci5jbGVhckdpdEh1YkF1dGgnLFxuICAgICAgICAgICAgZGV0YWlsczogJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBjbGVhcmVkJ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5jbGVhckF1dGhlbnRpY2F0aW9uKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChg4pyFICoqR2l0SHViIERpc2Nvbm5lY3RlZCoqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICBgWW91ciBHaXRIdWIgY29ubmVjdGlvbiBoYXMgYmVlbiBjbGVhcmVkLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipXaGF0IHN0aWxsIHdvcmtzOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDinIUgQnJvd3NlIHRoZSBwdWJsaWMgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4pyFIEluc3RhbGwgY29tbXVuaXR5IGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKdjCBTdWJtaXQgY29udGVudCAocmVxdWlyZXMgcmVjb25uZWN0aW9uKVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgVG8gcmVjb25uZWN0IGxhdGVyLCBqdXN0IHNheSBcImNvbm5lY3QgdG8gR2l0SHViXCJcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKaoO+4jyAqKk5vdGU6KiogVG8gZnVsbHkgcmVtb3ZlIGF1dGhlbnRpY2F0aW9uLCBhbHNvIHVuc2V0IHRoZSBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUuYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFyIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KGDinYwgKipGYWlsZWQgdG8gQ2xlYXIgQXV0aGVudGljYXRpb24qKlxcblxcbmApICtcbiAgICAgICAgICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNvbmZpZ3VyZU9BdXRoKGNsaWVudF9pZD86IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IHRoaXMuY29uZmlnTWFuYWdlcjtcbiAgICAgICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoIWNsaWVudF9pZCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENsaWVudElkID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5yZXNvbHZlQ2xpZW50SWQoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGllbnRJZCkge1xuICAgICAgICAgICAgICBjb25zdCBjb25maWd1cmVkQ2xpZW50SWQgPSBjb25maWdNYW5hZ2VyLmdldEdpdEh1YkNsaWVudElkKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzVXNpbmdEZWZhdWx0ID0gIWNvbmZpZ3VyZWRDbGllbnRJZDtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNvbnN0IG1hc2tlZENsaWVudElkID0gY3VycmVudENsaWVudElkLnN1YnN0cmluZygwLCAxMCkgKyAnLi4uJztcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKchSAqKkdpdEh1YiBPQXV0aCBDb25maWd1cmF0aW9uKipcXG5cXG5gKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKipDdXJyZW50IFN0YXR1czoqKiAke2lzVXNpbmdEZWZhdWx0ID8gJ1VzaW5nIERlZmF1bHQnIDogJ0NvbmZpZ3VyZWQnfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCoqQ2xpZW50IElEOioqICR7bWFza2VkQ2xpZW50SWR9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKipTb3VyY2U6KiogJHtpc1VzaW5nRGVmYXVsdCA/ICdCdWlsdC1pbiBEb2xsaG91c2VNQ1AgT0F1dGggQXBwJyA6ICdDdXN0b20gQ29uZmlndXJhdGlvbid9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgWW91ciBHaXRIdWIgT0F1dGggaXMgcmVhZHkgdG8gdXNlISBZb3UgY2FuIG5vdzpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGDigKIgUnVuIHNldHVwX2dpdGh1Yl9hdXRoIHRvIGNvbm5lY3RcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGDigKIgU3VibWl0IGNvbnRlbnQgdG8gdGhlIGNvbGxlY3Rpb25cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGDigKIgQWNjZXNzIGF1dGhlbnRpY2F0ZWQgZmVhdHVyZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc1VzaW5nRGVmYXVsdCA/IFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgKipOb3RlOioqIFVzaW5nIHRoZSBkZWZhdWx0IERvbGxob3VzZU1DUCBPQXV0aCBhcHAuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBUbyB1c2UgeW91ciBvd24gT0F1dGggYXBwLCBwcm92aWRlIGEgY2xpZW50X2lkIHBhcmFtZXRlci5cXG5cXG5gIDogXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBUbyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24sIHByb3ZpZGUgYSBuZXcgY2xpZW50X2lkIHBhcmFtZXRlci5cXG5cXG5gKVxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KGDimqDvuI8gKipHaXRIdWIgT0F1dGggTm90IENvbmZpZ3VyZWQqKlxcblxcbmApICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBObyBHaXRIdWIgT0F1dGggY2xpZW50IElEIGlzIGN1cnJlbnRseSBjb25maWd1cmVkLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCoqVG8gc2V0IHVwIE9BdXRoOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgMS4gQ3JlYXRlIGEgR2l0SHViIE9BdXRoIGFwcCBhdDogaHR0cHM6Ly9naXRodWIuY29tL3NldHRpbmdzL2FwcGxpY2F0aW9ucy9uZXdcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAyLiBVc2UgdGhlc2Ugc2V0dGluZ3M6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAg4oCiIEhvbWVwYWdlIFVSTDogaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCAgIOKAoiBBdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTDogaHR0cDovL2xvY2FsaG9zdDozMDAwL2NhbGxiYWNrXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgMy4gQ29weSB5b3VyIENsaWVudCBJRCAoc3RhcnRzIHdpdGggXCJPdjIzbGlcIilcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGA0LiBSdW46IGNvbmZpZ3VyZV9vYXV0aCB3aXRoIHlvdXIgY2xpZW50X2lkIHBhcmFtZXRlclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCoqTmVlZCBoZWxwPyoqIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxlZCBzZXR1cCBpbnN0cnVjdGlvbnMuYFxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmICghQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKGNsaWVudF9pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKdjCAqKkludmFsaWQgQ2xpZW50IElEIEZvcm1hdCoqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICAgIGBHaXRIdWIgT0F1dGggQ2xpZW50IElEcyBtdXN0OlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGDigKIgU3RhcnQgd2l0aCBcIk92MjNsaVwiXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYOKAoiBCZSBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAqKkV4YW1wbGU6KiogT3YyM2xpQUJDREVGR0hJSktMTU5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHlvdXIgY2xpZW50IElEIGFuZCB0cnkgYWdhaW4uYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zZXRHaXRIdWJDbGllbnRJZChjbGllbnRfaWQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG1hc2tlZENsaWVudElkID0gY2xpZW50X2lkLnN1YnN0cmluZygwLCAxMCkgKyAnLi4uJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KGDinIUgKipHaXRIdWIgT0F1dGggQ29uZmlndXJlZCBTdWNjZXNzZnVsbHkqKlxcblxcbmApICtcbiAgICAgICAgICAgICAgICAgICAgYCoqQ2xpZW50IElEOioqICR7bWFza2VkQ2xpZW50SWR9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKlNhdmVkIHRvOioqIH4vLmRvbGxob3VzZS9jb25maWcuanNvblxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgWW91ciBHaXRIdWIgT0F1dGggaXMgbm93IHJlYWR5ISBOZXh0IHN0ZXBzOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFJ1biBzZXR1cF9naXRodWJfYXV0aCB0byBjb25uZWN0IHlvdXIgYWNjb3VudFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFN0YXJ0IHN1Ym1pdHRpbmcgY29udGVudCB0byB0aGUgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIEFjY2VzcyBhdXRoZW50aWNhdGVkIGZlYXR1cmVzXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKk5vdGU6KiogWW91ciBjbGllbnQgSUQgaXMgc2VjdXJlbHkgc3RvcmVkIGluIHlvdXIgbG9jYWwgY29uZmlnIGZpbGUuYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNvbmZpZ3VyZSBPQXV0aCcsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChg4p2MICoqT0F1dGggQ29uZmlndXJhdGlvbiBGYWlsZWQqKlxcblxcbmApICtcbiAgICAgICAgICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIEZpbGUgcGVybWlzc2lvbnMgZm9yIH4vLmRvbGxob3VzZS9jb25maWcuanNvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFZhbGlkIGNsaWVudCBJRCBmb3JtYXQgKHN0YXJ0cyB3aXRoIFwiT3YyM2xpXCIpXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQXZhaWxhYmxlIGRpc2sgc3BhY2VgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNwYXduSGVscGVyUHJvY2VzcyhoZWxwZXJQYXRoOiBzdHJpbmcsIGRldmljZVJlc3BvbnNlOiBEZXZpY2VDb2RlUmVzcG9uc2UsIGNsaWVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ25vZGUnLCBbXG4gICAgICAgICAgICBoZWxwZXJQYXRoLFxuICAgICAgICAgICAgZGV2aWNlUmVzcG9uc2UuZGV2aWNlX2NvZGUsXG4gICAgICAgICAgICAoZGV2aWNlUmVzcG9uc2UuaW50ZXJ2YWwgfHwgNSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRldmljZVJlc3BvbnNlLmV4cGlyZXNfaW4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNsaWVudElkXG4gICAgICAgIF0sIHtcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREb2xsaG91c2VIb21lRGlyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfSE9NRV9ESVIgfHwgaG9tZWRpcigpO1xuICAgIH1cbn1cbiJdfQ==
884
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQXV0aEhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGFuZGxlcnMvR2l0SHViQXV0aEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7O0dBS0c7QUFHSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxhQUFhLE1BQU0sZUFBZSxDQUFDO0FBRy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQTBDakUsTUFBTSxPQUFPLGlCQUFpQjtJQUVMO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFMckIsWUFDcUIsaUJBQW9DLEVBQ3BDLGFBQTRCLEVBQzVCLFdBQWtDLEVBQ2xDLGdCQUF5QyxFQUN6QyxjQUFxQztRQUpyQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtJQUN2RCxDQUFDO0lBRUksS0FBSyxDQUFDLGlCQUFpQjtRQUMzQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRU8sTUFBTSxDQUFDLE9BQWU7UUFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxH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QUFFO1lBQ0MsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsUUFBUTtZQUNmLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEdBQUcsRUFBRTtnQkFDRCxHQUFHLE9BQU8sQ0FBQyxHQUFHO2dCQUNkLDhCQUE4QixFQUFFLE1BQU07YUFDekM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBhdXRoZW50aWNhdGlvbiBvcGVyYXRpb25zIHRvIEdpdEh1YkF1dGhNYW5hZ2VyLlxuICogQXVkaXQgbG9nZ2luZyBoYXBwZW5zIGluIEdpdEh1YkF1dGhNYW5hZ2VyIGZvciBhdXRoIG9wZXJhdGlvbnMuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIsIERldmljZUNvZGVSZXNwb25zZSB9IGZyb20gJy4uL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9Jbml0aWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgUGVyc29uYUluZGljYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9QZXJzb25hSW5kaWNhdG9yU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxudHlwZSBPQXV0aEhlbHBlclRlcm1pbmFsU3RhdHVzID0gJ3N1Y2Nlc3MnIHwgJ2ZhaWxlZCcgfCAnZXhwaXJlZCcgfCAnZGVuaWVkJyB8ICd0aW1lb3V0JztcblxuaW50ZXJmYWNlIE9BdXRoSGVscGVyVGVybWluYWxSZXN1bHQge1xuICAgIHN0YXR1czogT0F1dGhIZWxwZXJUZXJtaW5hbFN0YXR1cztcbiAgICBhdHRlbXB0cz86IG51bWJlcjtcbiAgICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBmbG93SWQ/OiBzdHJpbmc7XG4gICAgcGlkPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgT0F1dGhIZWxwZXJTdGF0ZSB7XG4gICAgcGlkOiBudW1iZXI7XG4gICAgZmxvd0lkPzogc3RyaW5nO1xuICAgIHVzZXJDb2RlOiBzdHJpbmc7XG4gICAgc3RhcnRUaW1lOiBzdHJpbmc7XG4gICAgZXhwaXJlc0F0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBPQXV0aEhlbHBlckhlYWx0aCB7XG4gICAgZXhpc3RzOiBib29sZWFuO1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIGV4cGlyZWQ6IGJvb2xlYW47XG4gICAgcHJvY2Vzc0FsaXZlOiBib29sZWFuO1xuICAgIGhhc1Jlc3VsdDogYm9vbGVhbjtcbiAgICBoYXNMb2c6IGJvb2xlYW47XG4gICAgdXNlckNvZGU6IHN0cmluZztcbiAgICB0aW1lUmVtYWluaW5nOiBudW1iZXI7XG4gICAgcGlkOiBudW1iZXI7XG4gICAgc3RhcnRUaW1lOiBEYXRlIHwgbnVsbDtcbiAgICBleHBpcmVzQXQ6IERhdGUgfCBudWxsO1xuICAgIGNvbXBsZXRlZEF0OiBEYXRlIHwgbnVsbDtcbiAgICByZXN1bHRTdGF0dXM6IE9BdXRoSGVscGVyVGVybWluYWxTdGF0dXMgfCBudWxsO1xuICAgIHJlc3VsdE1lc3NhZ2U6IHN0cmluZztcbiAgICByZXN1bHRBdHRlbXB0cz86IG51bWJlcjtcbiAgICBlcnJvckxvZzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0SHViQXV0aEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGdpdGh1YkF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdNYW5hZ2VyOiBDb25maWdNYW5hZ2VyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluaXRTZXJ2aWNlOiBJbml0aWFsaXphdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yU2VydmljZTogUGVyc29uYUluZGljYXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM6IEZpbGVPcGVyYXRpb25zU2VydmljZVxuICAgICkge31cblxuICAgIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdFNlcnZpY2UuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZWZpeChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pbmRpY2F0b3JTZXJ2aWNlLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke21lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBhc3luYyBzZXR1cEdpdEh1YkF1dGgoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBMZWdhY3lQZW5kaW5nVG9rZW4oJ3NldHVwR2l0SHViQXV0aCcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgY3VycmVudCBhdXRoIHN0YXR1cyBmaXJzdFxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLmdldEF1dGhTdGF0dXMoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoXG4gICAgICAgICAgICAgICAgICBg4pyFICoqQWxyZWFkeSBDb25uZWN0ZWQgdG8gR2l0SHViKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHtjdXJyZW50U3RhdHVzLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCflJEgKipQZXJtaXNzaW9uczoqKiAke2N1cnJlbnRTdGF0dXMuc2NvcGVzPy5qb2luKCcsICcpIHx8ICdiYXNpYyBhY2Nlc3MnfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFlvdSdyZSBhbGwgc2V0ISBZb3UgY2FuOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBCcm93c2UgdGhlIGNvbGxlY3Rpb25cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgSW5zdGFsbCBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIFN1Ym1pdCB5b3VyIGNyZWF0aW9uc1xcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFRvIGRpc2Nvbm5lY3QsIHNheSBcImRpc2Nvbm5lY3QgZnJvbSBHaXRIdWJcImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBhdXRoZW50aWNhdGlvbiBpbml0aWF0aW9uXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ0FVVEhfRkxPV19JTklUSUFURUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnR2l0SHViQXV0aEhhbmRsZXIuc2V0dXBHaXRIdWJBdXRoJyxcbiAgICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gZmxvdyBpbml0aWF0ZWQgdmlhIGRldmljZSBjb2RlJyxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGF1dGhGbG93OiAnZGV2aWNlLWNvZGUnIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEluaXRpYXRlIGRldmljZSBmbG93XG4gICAgICAgICAgbGV0IGRldmljZVJlc3BvbnNlOiBEZXZpY2VDb2RlUmVzcG9uc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRldmljZVJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3coKTtcbiAgICAgICAgICB9IGNhdGNoIChkZXZpY2VGbG93RXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignT0FVVEhfSU5ERVhfMjY4MTogRmFpbGVkIHRvIGluaXRpYXRlIGRldmljZSBmbG93JywgeyBlcnJvcjogZGV2aWNlRmxvd0Vycm9yIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9JTkRFWF8yNjgxOiBEZXZpY2UgZmxvdyBpbml0aWF0aW9uIGZhaWxlZCAtICR7ZGV2aWNlRmxvd0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBkZXZpY2VGbG93RXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgaGVscGVyIHByb2Nlc3MgYXBwcm9hY2ggZnJvbSBQUiAjNTE4XG4gICAgICAgICAgLy8gTUNQIHNlcnZlcnMgYXJlIHN0YXRlbGVzcyBhbmQgdGVybWluYXRlIGFmdGVyIHJldHVybmluZyByZXNwb25zZVxuICAgICAgICAgIC8vIFRoZSBoZWxwZXIgcHJvY2VzcyBzdXJ2aXZlcyBNQ1AgdGVybWluYXRpb24gYW5kIGNhbiBjb21wbGV0ZSBPQXV0aCBwb2xsaW5nXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gR2V0IHRoZSBPQXV0aCBjbGllbnQgSUQgLSB1c2UgdGhlIHNhbWUgbWV0aG9kIHRoYXQgaGFzIHRoZSBkZWZhdWx0IGZhbGxiYWNrXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIGdldCB0aGUgZGVmYXVsdCBjbGllbnQgSUQgaWYgbm8gZW52L2NvbmZpZyBpcyBzZXRcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ09BVVRIX1NURVBfNDogR2V0dGluZyBjbGllbnQgSUQgZm9yIGhlbHBlciBwcm9jZXNzJyk7XG4gICAgICAgICAgY29uc3QgY2xpZW50SWQgPSBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLnJlc29sdmVDbGllbnRJZCgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT0FVVEhfU1RFUF81OiBDbGllbnQgSUQgb2J0YWluZWQnLCB7IGNsaWVudElkOiBjbGllbnRJZD8uc3Vic3RyaW5nKDAsIDgpICsgJy4uLicgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKCFjbGllbnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICAgIGDinYwgKipHaXRIdWIgT0F1dGggQ29uZmlndXJhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIG9idGFpbiBHaXRIdWIgT0F1dGggY2xpZW50IElELlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFRoaXMgaXMgdW5leHBlY3RlZCAtIHBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZS5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKldvcmthcm91bmQ6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlOiBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRFxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBPciB1c2UgR2l0SHViIENMSTogZ2ggYXV0aCBsb2dpbiAtLXdlYmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBsZXQgaGVscGVyUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG4gICAgICAgICAgICBjb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlSGVscGVyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX09BVVRIX0hFTFBFUjtcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdvYXV0aC1oZWxwZXIubWpzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnb2F1dGgtaGVscGVyLm1qcycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnb2F1dGgtaGVscGVyLm1qcycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnb2F1dGgtaGVscGVyLm1qcycpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlSGVscGVyKSB7XG4gICAgICAgICAgICAgIHBvc3NpYmxlUGF0aHMudW5zaGlmdChvdmVycmlkZUhlbHBlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGhlbHBlclBhdGggPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0UGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0ZXN0UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBoZWxwZXJQYXRoID0gdGVzdFBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFoZWxwZXJQYXRoKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignT0FVVEhfSU5ERVhfMjczNDogb2F1dGgtaGVscGVyLm1qcyBub3QgZm91bmQnLCB7IFxuICAgICAgICAgICAgICAgIHNlYXJjaGVkUGF0aHM6IHBvc3NpYmxlUGF0aHMsXG4gICAgICAgICAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIGRpcm5hbWU6IF9fZGlybmFtZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9IRUxQRVJfTk9UX0ZPVU5EOiBvYXV0aC1oZWxwZXIubWpzIG5vdCBmb3VuZCBhdCBsaW5lIDI3MzQuIFNlYXJjaGVkOiAke3Bvc3NpYmxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPQVVUSF9TVEVQXzY6IFNwYXduaW5nIGhlbHBlciBwcm9jZXNzJywgeyBcbiAgICAgICAgICAgICAgaGVscGVyUGF0aCxcbiAgICAgICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkPy5zdWJzdHJpbmcoMCwgOCkgKyAnLi4uJyxcbiAgICAgICAgICAgICAgZGV2aWNlQ29kZTogZGV2aWNlUmVzcG9uc2UuZGV2aWNlX2NvZGUuc3Vic3RyaW5nKDAsIDgpICsgJy4uLicgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZmxvd0lkID0gcmFuZG9tVVVJRCgpO1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gdGhpcy5zcGF3bkhlbHBlclByb2Nlc3MoaGVscGVyUGF0aCwgZGV2aWNlUmVzcG9uc2UsIGNsaWVudElkLCBmbG93SWQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBoZWxwZXIudW5yZWYoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPQVVUSF9TVEVQXzc6IEhlbHBlciBwcm9jZXNzIHNwYXduZWQgc3VjY2Vzc2Z1bGx5JywgeyBwaWQ6IGhlbHBlci5waWQgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdPQXV0aCBoZWxwZXIgcHJvY2VzcyBzcGF3bmVkJywge1xuICAgICAgICAgICAgICBwaWQ6IGhlbHBlci5waWQsXG4gICAgICAgICAgICAgIGV4cGlyZXNJbjogZGV2aWNlUmVzcG9uc2UuZXhwaXJlc19pbixcbiAgICAgICAgICAgICAgdXNlckNvZGU6IGRldmljZVJlc3BvbnNlLnVzZXJfY29kZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlRmlsZSA9IHBhdGguam9pbih0aGlzLmdldERvbGxob3VzZUhvbWVEaXIoKSwgJy5kb2xsaG91c2UnLCAnLmF1dGgnLCAnb2F1dGgtaGVscGVyLXN0YXRlLmpzb24nKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEZpbGUgPSBwYXRoLmpvaW4odGhpcy5nZXREb2xsaG91c2VIb21lRGlyKCksICcuZG9sbGhvdXNlJywgJy5hdXRoJywgJ29hdXRoLWhlbHBlci1yZXN1bHQuanNvbicpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSBwYXRoLmRpcm5hbWUoc3RhdGVGaWxlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHN0YXRlRGlyKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShyZXN1bHRGaWxlKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgICBwaWQ6IGhlbHBlci5waWQsXG4gICAgICAgICAgICAgIGZsb3dJZCxcbiAgICAgICAgICAgICAgdXNlckNvZGU6IGRldmljZVJlc3BvbnNlLnVzZXJfY29kZSxcbiAgICAgICAgICAgICAgc3RhcnRUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoRGF0ZS5ub3coKSArIGRldmljZVJlc3BvbnNlLmV4cGlyZXNfaW4gKiAxMDAwKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShzdGF0ZUZpbGUsIEpTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKSwge1xuICAgICAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoSGFuZGxlci5zZXR1cEdpdEh1YkF1dGgnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKHNwYXduRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYXduRXJyID0gc3Bhd25FcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ09BVVRIX0lOREVYXzI3NzQ6IEZhaWxlZCB0byBzcGF3biBPQXV0aCBoZWxwZXIgcHJvY2VzcycsIHsgXG4gICAgICAgICAgICAgIGVycm9yOiBzcGF3bkVycm9yLFxuICAgICAgICAgICAgICBoZWxwZXJQYXRoLFxuICAgICAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IHNwYXduRXJyLmNvZGUsXG4gICAgICAgICAgICAgIHN5c2NhbGw6IHNwYXduRXJyLnN5c2NhbGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgZXJyb3JEZXRhaWwgPSAnJztcbiAgICAgICAgICAgIGlmIChzcGF3bkVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKHNwYXduRXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRU5PRU5UJykpIHtcbiAgICAgICAgICAgICAgICBlcnJvckRldGFpbCA9IGBPQVVUSF9IRUxQRVJfU1BBV05fRU5PRU5UOiBOb2RlLmpzIGV4ZWN1dGFibGUgbm90IGZvdW5kIG9yIGhlbHBlciBzY3JpcHQgbWlzc2luZyBhdCAke2hlbHBlclBhdGh9YDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcGF3bkVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VBQ0NFUycpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JEZXRhaWwgPSBgT0FVVEhfSEVMUEVSX1NQQVdOX0VBQ0NFUzogUGVybWlzc2lvbiBkZW5pZWQgd2hlbiB0cnlpbmcgdG8gZXhlY3V0ZSAke2hlbHBlclBhdGh9YDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcGF3bkVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0UyQklHJykpIHtcbiAgICAgICAgICAgICAgICBlcnJvckRldGFpbCA9IGBPQVVUSF9IRUxQRVJfU1BBV05fRTJCSUc6IEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcgZm9yIGhlbHBlciBwcm9jZXNzYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlcnJvckRldGFpbCA9IGBPQVVUSF9IRUxQRVJfU1BBV05fRkFJTEVEOiBDb3VsZCBub3Qgc3RhcnQgYmFja2dyb3VuZCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGF0IGxpbmUgMjc3NCAtICR7c3Bhd25FcnJvci5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVycm9yRGV0YWlsID0gYE9BVVRIX0hFTFBFUl9TUEFXTl9VTktOT1dOOiBVbmtub3duIHNwYXduIGVycm9yIGF0IGxpbmUgMjc3NGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoXG4gICAgICAgICAgICAgICAgICBg4pqg77iPICoqT0F1dGggSGVscGVyIExhdW5jaCBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCR7ZXJyb3JEZXRhaWx9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipBbHRlcm5hdGl2ZSBPcHRpb25zOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMS4gVHJ5IGFnYWluOiBSdW4gc2V0dXBfZ2l0aHViX2F1dGggYWdhaW5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAyLiBVc2UgR2l0SHViIENMSTogZ2ggYXV0aCBsb2dpbiAtLXdlYlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDMuIFNldCB0b2tlbiBtYW51YWxseTogZXhwb3J0IEdJVEhVQl9UT0tFTj15b3VyX3Rva2VuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5naXRodWJBdXRoTWFuYWdlci5mb3JtYXRBdXRoSW5zdHJ1Y3Rpb25zKGRldmljZVJlc3BvbnNlKSArXG4gICAgICAgICAgICAgICAgICAgICdcXG5cXG7wn5OdICoqTm90ZSoqOiBBdXRoZW50aWNhdGlvbiB3aWxsIGNvbXBsZXRlIGF1dG9tYXRpY2FsbHkgb25jZSB5b3UgYXV0aG9yaXplLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1lvdXIgdG9rZW4gd2lsbCBiZSBzdG9yZWQgc2VjdXJlbHkgZm9yIGZ1dHVyZSB1c2UhJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignT0FVVEhfSU5ERVhfMjgwNjogTWFpbiBjYXRjaCBibG9jayAtIGF1dGhlbnRpY2F0aW9uIHNldHVwIGZhaWxlZCcsIHsgXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGVycm9yVHlwZTogZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InO1xuICAgICAgICAgIGNvbnN0IGhhc0Vycm9yQ29kZSA9IGVycm9yTWVzc2FnZS5pbmNsdWRlcygnT0FVVEhfJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICBg4p2MICoqQXV0aGVudGljYXRpb24gU2V0dXAgRmFpbGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgJHtoYXNFcnJvckNvZGUgPyBlcnJvck1lc3NhZ2UgOiBgT0FVVEhfSU5ERVhfMjgwNjogVW5hYmxlIHRvIHN0YXJ0IEdpdEh1YiBhdXRoZW50aWNhdGlvbiAtICR7ZXJyb3JNZXNzYWdlfWB9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYCR7IWVycm9yTWVzc2FnZS5pbmNsdWRlcygnT0FVVEhfTkVUV09SSycpID8gJ1BsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nIDogJyd9YFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0dpdEh1YkF1dGgoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTGVnYWN5UGVuZGluZ1Rva2VuID0gYXdhaXQgdGhpcy5jbGVhbnVwTGVnYWN5UGVuZGluZ1Rva2VuKCdjaGVja0dpdEh1YkF1dGgnKTtcbiAgICAgICAgICBjb25zdCBoZWxwZXJIZWFsdGggPSBhd2FpdCB0aGlzLmNoZWNrT0F1dGhIZWxwZXJIZWFsdGgoKTtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLmdldEF1dGhTdGF0dXMoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgaWYgKGhlbHBlckhlYWx0aC5leGlzdHMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGVGaWxlID0gcGF0aC5qb2luKHRoaXMuZ2V0RG9sbGhvdXNlSG9tZURpcigpLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItc3RhdGUuanNvbicpO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHRGaWxlID0gcGF0aC5qb2luKHRoaXMuZ2V0RG9sbGhvdXNlSG9tZURpcigpLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItcmVzdWx0Lmpzb24nKTtcbiAgICAgICAgICAgICAgLy8gRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmRlbGV0ZUZpbGUgYWxyZWFkeSBoYW5kbGVzIEVOT0VOVCBncmFjZWZ1bGx5XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShzdGF0ZUZpbGUpLmNhdGNoKCgpID0+IHt9KTsgLy8gUHJlc2VydmUgZXJyb3Igc3dhbGxvd2luZyBwYXR0ZXJuXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShyZXN1bHRGaWxlKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoXG4gICAgICAgICAgICAgICAgICBg4pyFICoqR2l0SHViIENvbm5lY3RlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7c3RhdHVzLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCflJEgKipQZXJtaXNzaW9uczoqKiAke3N0YXR1cy5zY29wZXM/LmpvaW4oJywgJykgfHwgJ2Jhc2ljIGFjY2Vzcyd9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipBdmFpbGFibGUgQWN0aW9uczoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinIUgU3VibWl0IGNvbnRlbnRcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBFdmVyeXRoaW5nIGlzIHdvcmtpbmcgcHJvcGVybHkhYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJIZWFsdGgucmVzdWx0U3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeU5vdGljZSA9IHJlbW92ZWRMZWdhY3lQZW5kaW5nVG9rZW5cbiAgICAgICAgICAgICAgPyBgXFxuXFxuQSBzdGFsZSBwbGFpbnRleHQgT0F1dGggZmFsbGJhY2sgZmlsZSBmcm9tIGFuIGVhcmxpZXIgZmFpbGVkIGZsb3cgd2FzIHJlbW92ZWQuYFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICAgIGDinIUgKipHaXRIdWIgQXV0aGVudGljYXRpb24gQ29tcGxldGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBUaGUgT0F1dGggaGVscGVyIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHRoZSBHaXRIdWIgdG9rZW4gaXMgbm90IGF2YWlsYWJsZSB0byB0aGlzIHNlcnZlciBwcm9jZXNzLiR7bGVnYWN5Tm90aWNlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqVG8gZml4IHRoaXM6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAxLiBSdW4gXFxgY2hlY2tfZ2l0aHViX2F1dGhcXGAgYWdhaW4gYWZ0ZXIgdGhlIHNlcnZlciByZWZyZXNoZXNcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAyLiBJZiBpdCBzdGlsbCBmYWlscywgcnVuIFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySGVhbHRoLnJlc3VsdFN0YXR1cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzTGFiZWwgPSB0aGlzLmZvcm1hdE9BdXRoSGVscGVyVGVybWluYWxTdGF0dXMoaGVscGVySGVhbHRoLnJlc3VsdFN0YXR1cyk7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgICAgICAgYCR7c3RhdHVzTGFiZWwuaWNvbn0gKipHaXRIdWIgQXV0aGVudGljYXRpb24gJHtzdGF0dXNMYWJlbC50aXRsZX0qKmAsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICB0aGlzLnNhbml0aXplT0F1dGhIZWxwZXJSZXN1bHRNZXNzYWdlKGhlbHBlckhlYWx0aC5yZXN1bHRNZXNzYWdlKSB8fCBzdGF0dXNMYWJlbC5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICcqKlRvIHRyeSBhZ2FpbjoqKicsXG4gICAgICAgICAgICAgICdSdW46IGBzZXR1cF9naXRodWJfYXV0aGAgdG8gZ2V0IGEgbmV3IGNvZGUnLFxuICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKHJlbW92ZWRMZWdhY3lQZW5kaW5nVG9rZW4pIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaCgnQSBzdGFsZSBwbGFpbnRleHQgT0F1dGggZmFsbGJhY2sgZmlsZSBmcm9tIGFuIGVhcmxpZXIgZmFpbGVkIGZsb3cgd2FzIHJlbW92ZWQuJywgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGVscGVySGVhbHRoLmVycm9yTG9nKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goJyoqRXJyb3IgTG9nOioqJywgJ2BgYCcsIGhlbHBlckhlYWx0aC5lcnJvckxvZywgJ2BgYCcsICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChsaW5lcy5qb2luKCdcXG4nKSlcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJIZWFsdGguaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoXG4gICAgICAgICAgICAgICAgICBg4o+zICoqR2l0SHViIEF1dGhlbnRpY2F0aW9uIEluIFByb2dyZXNzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5SRICoqVXNlciBDb2RlOioqICR7aGVscGVySGVhbHRoLnVzZXJDb2RlfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKPse+4jyAqKlRpbWUgUmVtYWluaW5nOioqICR7TWF0aC5mbG9vcihoZWxwZXJIZWFsdGgudGltZVJlbWFpbmluZyAvIDYwKX1tICR7aGVscGVySGVhbHRoLnRpbWVSZW1haW5pbmcgJSA2MH1zXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+UhCAqKlByb2Nlc3MgU3RhdHVzOioqICR7aGVscGVySGVhbHRoLnByb2Nlc3NBbGl2ZSA/ICfinIUgUnVubmluZycgOiAn4pqg77iPIE1heSBoYXZlIHN0b3BwZWQnfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCfk4EgKipMb2cgQXZhaWxhYmxlOioqICR7aGVscGVySGVhbHRoLmhhc0xvZyA/ICdZZXMnIDogJ05vJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKldhaXRpbmcgZm9yIHlvdSB0bzoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDEuIEdvIHRvOiBodHRwczovL2dpdGh1Yi5jb20vbG9naW4vZGV2aWNlXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMi4gRW50ZXIgY29kZTogKioke2hlbHBlckhlYWx0aC51c2VyQ29kZX0qKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDMuIEF1dGhvcml6ZSB0aGUgYXBwbGljYXRpb25cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBUaGUgYXV0aGVudGljYXRpb24gd2lsbCBjb21wbGV0ZSBhdXRvbWF0aWNhbGx5IG9uY2UgeW91IGF1dGhvcml6ZS5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBSdW4gdGhpcyBjb21tYW5kIGFnYWluIHRvIGNoZWNrIHN0YXR1cy5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlckhlYWx0aC5leGlzdHMgJiYgaGVscGVySGVhbHRoLmV4cGlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgICAgICAgICAn4o+x77iPICoqQXV0aGVudGljYXRpb24gRXhwaXJlZCoqJyxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdUaGUgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgaGFzIGV4cGlyZWQuJyxcbiAgICAgICAgICAgICAgYFVzZXIgY29kZTogJHtoZWxwZXJIZWFsdGgudXNlckNvZGV9IChleHBpcmVkKWAsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAnKipUbyB0cnkgYWdhaW46KionLFxuICAgICAgICAgICAgICAnUnVuOiBgc2V0dXBfZ2l0aHViX2F1dGhgIHRvIGdldCBhIG5ldyBjb2RlJyxcbiAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmIChoZWxwZXJIZWFsdGguZXJyb3JMb2cpIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaCgnKipFcnJvciBMb2c6KionLCAnYGBgJywgaGVscGVySGVhbHRoLmVycm9yTG9nLCAnYGBgJywgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KGxpbmVzLmpvaW4oJ1xcbicpKVxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5oYXNUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICAgIGDimqDvuI8gKipHaXRIdWIgVG9rZW4gSW52YWxpZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgQSBHaXRIdWIgdG9rZW4gd2FzIGZvdW5kIGJ1dCBpdCBhcHBlYXJzIHRvIGJlIGludmFsaWQgb3IgZXhwaXJlZC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKlRvIGZpeCB0aGlzOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMS4gU2F5IFwic2V0IHVwIEdpdEh1YlwiIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDIuIE9yIGNoZWNrIHlvdXIgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgTm90ZTogQnJvd3NlIGFuZCBpbnN0YWxsIHN0aWxsIHdvcmsgd2l0aG91dCBhdXRoZW50aWNhdGlvbiFgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVnYWN5Tm90aWNlID0gcmVtb3ZlZExlZ2FjeVBlbmRpbmdUb2tlblxuICAgICAgICAgICAgICA/IGBcXG5cXG5BIHN0YWxlIHBsYWludGV4dCBPQXV0aCBmYWxsYmFjayBmaWxlIGZyb20gYW4gZWFybGllciBmYWlsZWQgZmxvdyB3YXMgcmVtb3ZlZC4gUGxlYXNlIHJ1biBcXGBzZXR1cF9naXRodWJfYXV0aFxcYCBhZ2FpbiB0byByZWNvbm5lY3QuYFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChcbiAgICAgICAgICAgICAgICAgIGDwn5SSICoqTm90IENvbm5lY3RlZCB0byBHaXRIdWIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFlvdSdyZSBub3QgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWIuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipXaGF0IHdvcmtzIHdpdGhvdXQgYXV0aDoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4pyFIEluc3RhbGwgY29tbXVuaXR5IGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinYwgU3VibWl0IHlvdXIgb3duIGNvbnRlbnQgKHJlcXVpcmVzIGF1dGgpXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVG8gY29ubmVjdCwganVzdCBzYXkgXCJzZXQgdXAgR2l0SHViXCIgb3IgXCJjb25uZWN0IHRvIEdpdEh1YlwiJHtsZWdhY3lOb3RpY2V9YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNoZWNrIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KFxuICAgICAgICAgICAgICAgIGDinYwgKipVbmFibGUgdG8gQ2hlY2sgQXV0aGVudGljYXRpb24qKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBFcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldE9BdXRoSGVscGVyU3RhdHVzKHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhbHRoID0gYXdhaXQgdGhpcy5jaGVja09BdXRoSGVscGVySGVhbHRoKCk7XG4gICAgICAgICAgY29uc3QgaG9tZURpciA9IHRoaXMuZ2V0RG9sbGhvdXNlSG9tZURpcigpO1xuICAgICAgICAgIGNvbnN0IHN0YXRlRmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItc3RhdGUuanNvbicpO1xuICAgICAgICAgIGNvbnN0IGxvZ0ZpbGUgPSBwYXRoLmpvaW4oaG9tZURpciwgJy5kb2xsaG91c2UnLCAnb2F1dGgtaGVscGVyLmxvZycpO1xuICAgICAgICAgIGNvbnN0IHBpZEZpbGUgPSBwYXRoLmpvaW4oaG9tZURpciwgJy5kb2xsaG91c2UnLCAnLmF1dGgnLCAnb2F1dGgtaGVscGVyLnBpZCcpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEZpbGUgPSBwYXRoLmpvaW4oaG9tZURpciwgJy5kb2xsaG91c2UnLCAnLmF1dGgnLCAnb2F1dGgtaGVscGVyLXJlc3VsdC5qc29uJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHN0YXR1c1RleHQgPSBg8J+TiiAqKk9BdXRoIEhlbHBlciBQcm9jZXNzIERpYWdub3N0aWNzKipcXG5cXG5gO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICghaGVhbHRoLmV4aXN0cykge1xuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipTdGF0dXM6KiogTm8gT0F1dGggcHJvY2VzcyBkZXRlY3RlZFxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqU3RhdGUgRmlsZToqKiBOb3QgZm91bmRcXG5cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBObyBhY3RpdmUgYXV0aGVudGljYXRpb24gcHJvY2Vzcy4gUnVuIFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIHRvIHN0YXJ0IG9uZS5cXG5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVhbHRoLnJlc3VsdFN0YXR1cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzTGFiZWwgPSB0aGlzLmZvcm1hdE9BdXRoSGVscGVyVGVybWluYWxTdGF0dXMoaGVhbHRoLnJlc3VsdFN0YXR1cyk7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXR1czoqKiAke3N0YXR1c0xhYmVsLmljb259ICR7c3RhdHVzTGFiZWwudGl0bGUudG9VcHBlckNhc2UoKX1cXG5gXG4gICAgICAgICAgICBpZiAoaGVhbHRoLnVzZXJDb2RlKSB7XG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqVXNlciBDb2RlOioqICR7aGVhbHRoLnVzZXJDb2RlfVxcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFsdGgucGlkKSB7XG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqUHJvY2VzcyBJRDoqKiAke2hlYWx0aC5waWR9XFxuYFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhlYWx0aC5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKkNvbXBsZXRlZDoqKiAke2hlYWx0aC5jb21wbGV0ZWRBdC50b0xvY2FsZVN0cmluZygpfVxcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFsdGgucmVzdWx0QXR0ZW1wdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKkF0dGVtcHRzOioqICR7aGVhbHRoLnJlc3VsdEF0dGVtcHRzfVxcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplT0F1dGhIZWxwZXJSZXN1bHRNZXNzYWdlKGhlYWx0aC5yZXN1bHRNZXNzYWdlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqUmVzdWx0OioqICR7cmVzdWx0TWVzc2FnZX1cXG5gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9ICdcXG4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVhbHRoLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXR1czoqKiDwn5+iIEFDVElWRSAtIEF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipVc2VyIENvZGU6KiogJHtoZWFsdGgudXNlckNvZGV9XFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipQcm9jZXNzIElEOioqICR7aGVhbHRoLnBpZH1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlByb2Nlc3MgQWxpdmU6KiogJHtoZWFsdGgucHJvY2Vzc0FsaXZlID8gJ+KchSBZZXMnIDogJ+KdjCBObyAobWF5IGhhdmUgY3Jhc2hlZCknfVxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqU3RhcnRlZDoqKiAke2hlYWx0aC5zdGFydFRpbWU/LnRvTG9jYWxlU3RyaW5nKCl9XFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipFeHBpcmVzOioqICR7aGVhbHRoLmV4cGlyZXNBdD8udG9Mb2NhbGVTdHJpbmcoKX1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlRpbWUgUmVtYWluaW5nOioqICR7TWF0aC5mbG9vcihoZWFsdGgudGltZVJlbWFpbmluZyAvIDYwKX1tICR7aGVhbHRoLnRpbWVSZW1haW5pbmcgJSA2MH1zXFxuXFxuYFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWhlYWx0aC5wcm9jZXNzQWxpdmUpIHtcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBg4pqg77iPICoqV0FSTklORzoqKiBQcm9jZXNzIGFwcGVhcnMgdG8gaGF2ZSBzdG9wcGVkIVxcbmBcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgVGhlIGhlbHBlciBwcm9jZXNzIChQSUQgJHtoZWFsdGgucGlkfSkgaXMgbm90IHJlc3BvbmRpbmcuXFxuYFxuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBZb3UgbWF5IG5lZWQgdG8gcnVuIFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIGFnYWluLlxcblxcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGhlYWx0aC5leHBpcmVkKSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXR1czoqKiDwn5S0IEVYUElSRURcXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlVzZXIgQ29kZToqKiAke2hlYWx0aC51c2VyQ29kZX0gKGV4cGlyZWQpXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgKipQcm9jZXNzIElEOioqICR7aGVhbHRoLnBpZH1cXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXJ0ZWQ6KiogJHtoZWFsdGguc3RhcnRUaW1lPy50b0xvY2FsZVN0cmluZygpfVxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoqRXhwaXJlZDoqKiAke2hlYWx0aC5leHBpcmVzQXQ/LnRvTG9jYWxlU3RyaW5nKCl9XFxuXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgVGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgaGFzIGV4cGlyZWQuIFJ1biBcXGBzZXR1cF9naXRodWJfYXV0aFxcYCB0byB0cnkgYWdhaW4uXFxuXFxuYFxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKvCfk4EgRmlsZSBMb2NhdGlvbnM6KipcXG5gXG4gICAgICAgICAgc3RhdHVzVGV4dCArPSBg4oCiIFN0YXRlOiAke3N0YXRlRmlsZX1cXG5gXG4gICAgICAgICAgc3RhdHVzVGV4dCArPSBg4oCiIFJlc3VsdDogJHtyZXN1bHRGaWxlfSAke2hlYWx0aC5oYXNSZXN1bHQgPyAnKGV4aXN0cyknIDogJyhub3QgZm91bmQpJ31cXG5gXG4gICAgICAgICAgc3RhdHVzVGV4dCArPSBg4oCiIExvZzogJHtsb2dGaWxlfSAke2hlYWx0aC5oYXNMb2cgPyAnKGV4aXN0cyknIDogJyhub3QgZm91bmQpJ31cXG5gXG4gICAgICAgICAgc3RhdHVzVGV4dCArPSBg4oCiIFBJRDogJHtwaWRGaWxlfVxcblxcbmBcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaGVhbHRoLmVycm9yTG9nKSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKuKaoO+4jyBSZWNlbnQgRXJyb3JzOioqXFxuXFxgXFxgXFxgXFxuJHtoZWFsdGguZXJyb3JMb2d9XFxuXFxgXFxgXFxgXFxuXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHZlcmJvc2UgJiYgaGVhbHRoLmhhc0xvZykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZnVsbExvZyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUobG9nRmlsZSwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhIYW5kbGVyLmdldE9BdXRoSGVscGVyU3RhdHVzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBmdWxsTG9nLnNwbGl0KCdcXG4nKS5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlY2VudExpbmVzID0gbGluZXMuc2xpY2UoLTIwKTtcblxuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKvCfk5wgUmVjZW50IExvZyBPdXRwdXQgKGxhc3QgMjAgbGluZXMpOioqXFxuXFxgXFxgXFxgXFxuYDtcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSByZWNlbnRMaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgXFxuXFxgXFxgXFxgXFxuXFxuYDtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKvCfk5wgTG9nOioqIFVuYWJsZSB0byByZWFkIGxvZyBmaWxlXFxuXFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGhlYWx0aC5leGlzdHMgJiYgIWhlYWx0aC5wcm9jZXNzQWxpdmUgJiYgIWhlYWx0aC5leHBpcmVkICYmICFoZWFsdGgucmVzdWx0U3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKvCflKcgVHJvdWJsZXNob290aW5nIFRpcHM6KipcXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAxLiBUaGUgaGVscGVyIHByb2Nlc3MgbWF5IGhhdmUgY3Jhc2hlZFxcbmBcbiAgICAgICAgICAgIGlmIChoZWFsdGguaGFzTG9nKSB7XG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYDIuIENoZWNrIHRoZSBsb2cgZmlsZSBmb3IgZXJyb3JzOiAke2xvZ0ZpbGV9XFxuYFxuICAgICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAzLiBUcnkgcnVubmluZyBcXGBzZXR1cF9naXRodWJfYXV0aFxcYCBhZ2FpblxcbmBcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgNC4gRW5zdXJlIERPTExIT1VTRV9HSVRIVUJfQ0xJRU5UX0lEIGlzIHNldFxcbmBcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgNS4gQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uXFxuYFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgMi4gVHJ5IHJ1bm5pbmcgXFxgc2V0dXBfZ2l0aHViX2F1dGhcXGAgYWdhaW5cXG5gXG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYDMuIEVuc3VyZSBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRCBpcyBzZXRcXG5gXG4gICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYDQuIENoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvblxcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGhlYWx0aC5leGlzdHMgJiYgKGhlYWx0aC5leHBpcmVkIHx8ICFoZWFsdGgucHJvY2Vzc0FsaXZlKSkge1xuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgXFxuKirwn6e5IE1hbnVhbCBDbGVhbnVwIChpZiBuZWVkZWQpOioqXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSAnYGBgYmFzaFxcbidcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYHJtIFwiJHtzdGF0ZUZpbGV9XCJcXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBybSBcIiR7cmVzdWx0RmlsZX1cIlxcbmBcbiAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gYHJtIFwiJHtsb2dGaWxlfVwiXFxuYFxuICAgICAgICAgICAgc3RhdHVzVGV4dCArPSBgcm0gXCIke3BpZEZpbGV9XCJcXG5gXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICs9ICdgYGBcXG4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KHN0YXR1c1RleHQpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZ2V0IE9BdXRoIGhlbHBlciBzdGF0dXMnLCB7IGVycm9yIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoXG4gICAgICAgICAgICAgICAgYOKdjCAqKkZhaWxlZCB0byBHZXQgT0F1dGggSGVscGVyIFN0YXR1cyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja09BdXRoSGVscGVySGVhbHRoKCkge1xuICAgICAgICBjb25zdCBob21lRGlyID0gdGhpcy5nZXREb2xsaG91c2VIb21lRGlyKCk7XG4gICAgICAgIGNvbnN0IHN0YXRlRmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItc3RhdGUuanNvbicpO1xuICAgICAgICBjb25zdCBsb2dGaWxlID0gcGF0aC5qb2luKGhvbWVEaXIsICcuZG9sbGhvdXNlJywgJ29hdXRoLWhlbHBlci5sb2cnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0RmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItcmVzdWx0Lmpzb24nKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGhlYWx0aDogT0F1dGhIZWxwZXJIZWFsdGggPSB7XG4gICAgICAgICAgZXhpc3RzOiBmYWxzZSxcbiAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgZXhwaXJlZDogZmFsc2UsXG4gICAgICAgICAgcHJvY2Vzc0FsaXZlOiBmYWxzZSxcbiAgICAgICAgICBoYXNSZXN1bHQ6IGZhbHNlLFxuICAgICAgICAgIGhhc0xvZzogZmFsc2UsXG4gICAgICAgICAgdXNlckNvZGU6ICcnLFxuICAgICAgICAgIHRpbWVSZW1haW5pbmc6IDAsXG4gICAgICAgICAgcGlkOiAwLFxuICAgICAgICAgIHN0YXJ0VGltZTogbnVsbCBhcyBEYXRlIHwgbnVsbCxcbiAgICAgICAgICBleHBpcmVzQXQ6IG51bGwgYXMgRGF0ZSB8IG51bGwsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IG51bGwgYXMgRGF0ZSB8IG51bGwsXG4gICAgICAgICAgcmVzdWx0U3RhdHVzOiBudWxsIGFzIE9BdXRoSGVscGVyVGVybWluYWxTdGF0dXMgfCBudWxsLFxuICAgICAgICAgIHJlc3VsdE1lc3NhZ2U6ICcnLFxuICAgICAgICAgIHJlc3VsdEF0dGVtcHRzOiB1bmRlZmluZWQgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVycm9yTG9nOiAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCByZXN1bHQ6IE9BdXRoSGVscGVyVGVybWluYWxSZXN1bHQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHN0YXRlOiBPQXV0aEhlbHBlclN0YXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHREYXRhID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShyZXN1bHRGaWxlLCB7XG4gICAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoSGFuZGxlci5jaGVja09BdXRoSGVscGVySGVhbHRoJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMubm9ybWFsaXplT0F1dGhIZWxwZXJSZXN1bHQoSlNPTi5wYXJzZShyZXN1bHREYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzRmlsZU5vdEZvdW5kRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Vycm9yIHJlYWRpbmcgT0F1dGggaGVscGVyIHJlc3VsdCcsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXRlRGF0YSA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc3RhdGVGaWxlLCB7XG4gICAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoSGFuZGxlci5jaGVja09BdXRoSGVscGVySGVhbHRoJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhcnNlZFN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZURhdGEpO1xuICAgICAgICAgIGlmICghdGhpcy5pc09BdXRoSGVscGVyU3RhdGUocGFyc2VkU3RhdGUpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ09BdXRoIGhlbHBlciBzdGF0ZSBmaWxlIGhhZCBpbnZhbGlkIHNoYXBlJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgT0F1dGggaGVscGVyIHN0YXRlIHNoYXBlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gcGFyc2VkU3RhdGU7XG4gICAgICAgICAgaGVhbHRoLmV4aXN0cyA9IHRydWU7XG4gICAgICAgICAgaGVhbHRoLnBpZCA9IHN0YXRlLnBpZDtcbiAgICAgICAgICBoZWFsdGgudXNlckNvZGUgPSBzdGF0ZS51c2VyQ29kZTtcbiAgICAgICAgICBoZWFsdGguc3RhcnRUaW1lID0gbmV3IERhdGUoc3RhdGUuc3RhcnRUaW1lKTtcbiAgICAgICAgICBoZWFsdGguZXhwaXJlc0F0ID0gbmV3IERhdGUoc3RhdGUuZXhwaXJlc0F0KTtcblxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgdGhpcy5vYXV0aEhlbHBlclJlc3VsdE1hdGNoZXNTdGF0ZShyZXN1bHQsIHN0YXRlKSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZU9BdXRoSGVscGVyUmVzdWx0KGhlYWx0aCwgcmVzdWx0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGlmIChoZWFsdGgucmVzdWx0U3RhdHVzKSB7XG4gICAgICAgICAgICBoZWFsdGguaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlYWx0aC5leHBpcmVzQXQgPiBub3cpIHtcbiAgICAgICAgICAgIGhlYWx0aC5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBoZWFsdGgudGltZVJlbWFpbmluZyA9IE1hdGguY2VpbCgoaGVhbHRoLmV4cGlyZXNBdC5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpKSAvIDEwMDApO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBwcm9jZXNzIGlzIGFsaXZlIChvbmx5IHJlbGlhYmxlIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcylcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKGhlYWx0aC5waWQsIDApOyAvLyBTaWduYWwgMCBjaGVja3MgZXhpc3RlbmNlIHdpdGhvdXQga2lsbGluZ1xuICAgICAgICAgICAgICAgIGhlYWx0aC5wcm9jZXNzQWxpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGhlYWx0aC5wcm9jZXNzQWxpdmUgPSB0aGlzLmlzUHJvY2Vzc1Blcm1pc3Npb25FcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE9uIFdpbmRvd3MsIHByb2Nlc3Mua2lsbChwaWQsIDApIGlzIG5vdCByZWxpYWJsZSBmb3IgY2hlY2tpbmcgZXhpc3RlbmNlLlxuICAgICAgICAgICAgICAvLyBXZSdsbCBhc3N1bWUgaXQncyBhbGl2ZSBpZiB0aGUgc3RhdGUgZmlsZSBleGlzdHMgYW5kIGhhc24ndCBleHBpcmVkLlxuICAgICAgICAgICAgICAvLyBBIG1vcmUgcm9idXN0IGNoZWNrIHdvdWxkIGludm9sdmUgcGxhdGZvcm0tc3BlY2lmaWMgcHJvY2VzcyBtYW5hZ2VtZW50LlxuICAgICAgICAgICAgICBoZWFsdGgucHJvY2Vzc0FsaXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVhbHRoLmV4cGlyZWQgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghdGhpcy5pc0ZpbGVOb3RGb3VuZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFcnJvciByZWFkaW5nIE9BdXRoIGhlbHBlciBzdGF0ZScsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhc3RhdGUpIHtcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlT0F1dGhIZWxwZXJSZXN1bHQoaGVhbHRoLCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaGVhbHRoLmhhc0xvZyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGxvZ0ZpbGUpO1xuXG4gICAgICAgIGlmIChoZWFsdGguaGFzTG9nICYmICghaGVhbHRoLnByb2Nlc3NBbGl2ZSB8fCBoZWFsdGguZXhwaXJlZCB8fCBoZWFsdGgucmVzdWx0U3RhdHVzKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsb2dDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShsb2dGaWxlLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhIYW5kbGVyLmNoZWNrT0F1dGhIZWxwZXJIZWFsdGgnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gbG9nQ29udGVudC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRhbnRMaW5lcyA9IGxpbmVzLmZpbHRlcihsaW5lID0+XG4gICAgICAgICAgICAgIGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZXJyb3InKSB8fFxuICAgICAgICAgICAgICBsaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZhaWwnKSB8fFxuICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCfinYwnKSB8fFxuICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCfimqDvuI8nKVxuICAgICAgICAgICAgKS5zbGljZSgtMTApO1xuXG4gICAgICAgICAgICBpZiAoaW1wb3J0YW50TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBoZWFsdGguZXJyb3JMb2cgPSBpbXBvcnRhbnRMaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHkgLSBpZ25vcmUgaWYgbG9nIGZpbGUgcmVhZCBmYWlsc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGhlYWx0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBMZWdhY3lQZW5kaW5nVG9rZW4oc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgcGVuZGluZ1Rva2VuRmlsZSA9IHBhdGguam9pbih0aGlzLmdldERvbGxob3VzZUhvbWVEaXIoKSwgJy5kb2xsaG91c2UnLCAnLmF1dGgnLCAncGVuZGluZ190b2tlbi50eHQnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhwZW5kaW5nVG9rZW5GaWxlKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUocGVuZGluZ1Rva2VuRmlsZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBzb3VyY2U6IGBHaXRIdWJBdXRoSGFuZGxlci4ke3NvdXJjZX1gXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6IGBHaXRIdWJBdXRoSGFuZGxlci4ke3NvdXJjZX1gLFxuICAgICAgICAgICAgZGV0YWlsczogJ1JlbW92ZWQgc3RhbGUgcGxhaW50ZXh0IE9BdXRoIHBlbmRpbmcgdG9rZW4gZmFsbGJhY2sgZmlsZSdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVtb3ZlZCBzdGFsZSBwbGFpbnRleHQgT0F1dGggcGVuZGluZyB0b2tlbiBmYWxsYmFjayBmaWxlJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZW1vdmUgc3RhbGUgT0F1dGggcGVuZGluZyB0b2tlbiBmYWxsYmFjayBmaWxlJywgeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzT0F1dGhIZWxwZXJUZXJtaW5hbFN0YXR1cyhzdGF0dXM6IHVua25vd24pOiBzdGF0dXMgaXMgT0F1dGhIZWxwZXJUZXJtaW5hbFN0YXR1cyB7XG4gICAgICAgIHJldHVybiBzdGF0dXMgPT09ICdzdWNjZXNzJyB8fFxuICAgICAgICAgICAgICAgc3RhdHVzID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgc3RhdHVzID09PSAnZXhwaXJlZCcgfHxcbiAgICAgICAgICAgICAgIHN0YXR1cyA9PT0gJ2RlbmllZCcgfHxcbiAgICAgICAgICAgICAgIHN0YXR1cyA9PT0gJ3RpbWVvdXQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplT0F1dGhIZWxwZXJSZXN1bHQodmFsdWU6IHVua25vd24pOiBPQXV0aEhlbHBlclRlcm1pbmFsUmVzdWx0IHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5pc1JlY29yZCh2YWx1ZSkgfHwgIXRoaXMuaXNPQXV0aEhlbHBlclRlcm1pbmFsU3RhdHVzKHZhbHVlLnN0YXR1cykpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICAgIGF0dGVtcHRzOiB0eXBlb2YgdmFsdWUuYXR0ZW1wdHMgPT09ICdudW1iZXInID8gdmFsdWUuYXR0ZW1wdHMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IHR5cGVvZiB2YWx1ZS5jb21wbGV0ZWRBdCA9PT0gJ3N0cmluZycgPyB2YWx1ZS5jb21wbGV0ZWRBdCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlcnJvckNvZGU6IHR5cGVvZiB2YWx1ZS5lcnJvckNvZGUgPT09ICdzdHJpbmcnID8gdmFsdWUuZXJyb3JDb2RlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1lc3NhZ2U6IHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyB0aGlzLnNhbml0aXplT0F1dGhIZWxwZXJSZXN1bHRNZXNzYWdlKHZhbHVlLm1lc3NhZ2UpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBmbG93SWQ6IHR5cGVvZiB2YWx1ZS5mbG93SWQgPT09ICdzdHJpbmcnID8gdmFsdWUuZmxvd0lkIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBpZDogdGhpcy5pc1ZhbGlkT0F1dGhIZWxwZXJQaWQodmFsdWUucGlkKSA/IHZhbHVlLnBpZCA6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNPQXV0aEhlbHBlclN0YXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgT0F1dGhIZWxwZXJTdGF0ZSB7XG4gICAgICAgIGlmICghdGhpcy5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZE9BdXRoSGVscGVyUGlkKHZhbHVlLnBpZCkgJiZcbiAgICAgICAgICAodmFsdWUuZmxvd0lkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlLmZsb3dJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnVzZXJDb2RlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS5zdGFydFRpbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLmV4cGlyZXNBdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAhTnVtYmVyLmlzTmFOKG5ldyBEYXRlKHZhbHVlLnN0YXJ0VGltZSkuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICFOdW1iZXIuaXNOYU4obmV3IERhdGUodmFsdWUuZXhwaXJlc0F0KS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2FuaXRpemVPQXV0aEhlbHBlclJlc3VsdE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgd2l0aG91dENvbnRyb2xDaGFyYWN0ZXJzID0gQXJyYXkuZnJvbShtZXNzYWdlLCBjaGFyYWN0ZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSA/PyAwO1xuICAgICAgICAgIHJldHVybiBjb2RlUG9pbnQgPD0gMzEgfHxcbiAgICAgICAgICAgIGNvZGVQb2ludCA9PT0gMTI3IHx8XG4gICAgICAgICAgICAoY29kZVBvaW50ID49IDB4RDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhERkZGKVxuICAgICAgICAgICAgPyAnICdcbiAgICAgICAgICAgIDogY2hhcmFjdGVyO1xuICAgICAgICB9KS5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gd2l0aG91dENvbnRyb2xDaGFyYWN0ZXJzXG4gICAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc2xpY2UoMCwgNTAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkT0F1dGhIZWxwZXJQaWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSAmJlxuICAgICAgICAgIHZhbHVlID4gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHJvY2Vzc1Blcm1pc3Npb25FcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAgICdjb2RlJyBpbiBlcnJvciAmJlxuICAgICAgICAgIChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFUEVSTSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3B1bGF0ZU9BdXRoSGVscGVyUmVzdWx0KFxuICAgICAgICBoZWFsdGg6IE9BdXRoSGVscGVySGVhbHRoLFxuICAgICAgICByZXN1bHQ6IE9BdXRoSGVscGVyVGVybWluYWxSZXN1bHQsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGhlYWx0aC5leGlzdHMgPSB0cnVlO1xuICAgICAgICBoZWFsdGguaGFzUmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgaGVhbHRoLnJlc3VsdFN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gICAgICAgIGhlYWx0aC5yZXN1bHRNZXNzYWdlID0gcmVzdWx0Lm1lc3NhZ2UgPz8gJyc7XG4gICAgICAgIGhlYWx0aC5yZXN1bHRBdHRlbXB0cyA9IHJlc3VsdC5hdHRlbXB0cztcbiAgICAgICAgaGVhbHRoLmNvbXBsZXRlZEF0ID0gcmVzdWx0LmNvbXBsZXRlZEF0ID8gbmV3IERhdGUocmVzdWx0LmNvbXBsZXRlZEF0KSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYXV0aEhlbHBlclJlc3VsdE1hdGNoZXNTdGF0ZShyZXN1bHQ6IE9BdXRoSGVscGVyVGVybWluYWxSZXN1bHQsIHN0YXRlOiBPQXV0aEhlbHBlclN0YXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghc3RhdGUuZmxvd0lkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHJlc3VsdC5mbG93SWQgIT09IHN0YXRlLmZsb3dJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdC5waWQgIT09ICdudW1iZXInIHx8IHJlc3VsdC5waWQgPT09IHN0YXRlLnBpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRmlsZU5vdEZvdW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNSZWNvcmQoZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0T0F1dGhIZWxwZXJUZXJtaW5hbFN0YXR1cyhzdGF0dXM6IE9BdXRoSGVscGVyVGVybWluYWxTdGF0dXMpIHtcbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGljb246ICfinIUnLFxuICAgICAgICAgICAgICB0aXRsZTogJ0NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIE9BdXRoIGhlbHBlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LidcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgY2FzZSAnZXhwaXJlZCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpY29uOiAn4o+x77iPJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmVkJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZXhwaXJlZC4nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIGNhc2UgJ2RlbmllZCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpY29uOiAn8J+aqycsXG4gICAgICAgICAgICAgIHRpdGxlOiAnRGVuaWVkJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3Qgd2FzIGRlbmllZC4nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIGNhc2UgJ3RpbWVvdXQnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWNvbjogJ+KPse+4jycsXG4gICAgICAgICAgICAgIHRpdGxlOiAnVGltZWQgT3V0JyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgdGltZWQgb3V0LidcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWNvbjogJ+KdjCcsXG4gICAgICAgICAgICAgIHRpdGxlOiAnRmFpbGVkJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgT0F1dGggaGVscGVyIGZhaWxlZCBiZWZvcmUgYXV0aGVudGljYXRpb24gY29tcGxldGVkLidcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjbGVhckdpdEh1YkF1dGgoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBhdXRoZW50aWNhdGlvbiBjbGVhcmluZ1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdUT0tFTl9DQUNIRV9DTEVBUkVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhIYW5kbGVyLmNsZWFyR2l0SHViQXV0aCcsXG4gICAgICAgICAgICBkZXRhaWxzOiAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGNsZWFyZWQnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLmNsZWFyQXV0aGVudGljYXRpb24oKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KGDinIUgKipHaXRIdWIgRGlzY29ubmVjdGVkKipcXG5cXG5gKSArXG4gICAgICAgICAgICAgICAgICAgIGBZb3VyIEdpdEh1YiBjb25uZWN0aW9uIGhhcyBiZWVuIGNsZWFyZWQuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKldoYXQgc3RpbGwgd29ya3M6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDinIUgSW5zdGFsbCBjb21tdW5pdHkgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4p2MIFN1Ym1pdCBjb250ZW50IChyZXF1aXJlcyByZWNvbm5lY3Rpb24pXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBUbyByZWNvbm5lY3QgbGF0ZXIsIGp1c3Qgc2F5IFwiY29ubmVjdCB0byBHaXRIdWJcIlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4pqg77iPICoqTm90ZToqKiBUbyBmdWxseSByZW1vdmUgYXV0aGVudGljYXRpb24sIGFsc28gdW5zZXQgdGhlIEdJVEhVQl9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZS5gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYXIgR2l0SHViIGF1dGgnLCB7IGVycm9yIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKdjCAqKkZhaWxlZCB0byBDbGVhciBBdXRoZW50aWNhdGlvbioqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY29uZmlndXJlT0F1dGgoY2xpZW50X2lkPzogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gdGhpcy5jb25maWdNYW5hZ2VyO1xuICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICghY2xpZW50X2lkKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2xpZW50SWQgPSBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLnJlc29sdmVDbGllbnRJZCgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY3VycmVudENsaWVudElkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyZWRDbGllbnRJZCA9IGNvbmZpZ01hbmFnZXIuZ2V0R2l0SHViQ2xpZW50SWQoKTtcbiAgICAgICAgICAgICAgY29uc3QgaXNVc2luZ0RlZmF1bHQgPSAhY29uZmlndXJlZENsaWVudElkO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgY29uc3QgbWFza2VkQ2xpZW50SWQgPSBjdXJyZW50Q2xpZW50SWQuc3Vic3RyaW5nKDAsIDEwKSArICcuLi4nO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChg4pyFICoqR2l0SHViIE9BdXRoIENvbmZpZ3VyYXRpb24qKlxcblxcbmApICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAqKkN1cnJlbnQgU3RhdHVzOioqICR7aXNVc2luZ0RlZmF1bHQgPyAnVXNpbmcgRGVmYXVsdCcgOiAnQ29uZmlndXJlZCd9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKipDbGllbnQgSUQ6KiogJHttYXNrZWRDbGllbnRJZH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAqKlNvdXJjZToqKiAke2lzVXNpbmdEZWZhdWx0ID8gJ0J1aWx0LWluIERvbGxob3VzZU1DUCBPQXV0aCBBcHAnIDogJ0N1c3RvbSBDb25maWd1cmF0aW9uJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBZb3VyIEdpdEh1YiBPQXV0aCBpcyByZWFkeSB0byB1c2UhIFlvdSBjYW4gbm93OlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYOKAoiBSdW4gc2V0dXBfZ2l0aHViX2F1dGggdG8gY29ubmVjdFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYOKAoiBTdWJtaXQgY29udGVudCB0byB0aGUgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYOKAoiBBY2Nlc3MgYXV0aGVudGljYXRlZCBmZWF0dXJlc1xcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGlzVXNpbmdEZWZhdWx0ID8gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAqKk5vdGU6KiogVXNpbmcgdGhlIGRlZmF1bHQgRG9sbGhvdXNlTUNQIE9BdXRoIGFwcC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYFRvIHVzZSB5b3VyIG93biBPQXV0aCBhcHAsIHByb3ZpZGUgYSBjbGllbnRfaWQgcGFyYW1ldGVyLlxcblxcbmAgOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYFRvIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiwgcHJvdmlkZSBhIG5ldyBjbGllbnRfaWQgcGFyYW1ldGVyLlxcblxcbmApXG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKaoO+4jyAqKkdpdEh1YiBPQXV0aCBOb3QgQ29uZmlndXJlZCoqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIEdpdEh1YiBPQXV0aCBjbGllbnQgSUQgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKipUbyBzZXQgdXAgT0F1dGg6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAxLiBDcmVhdGUgYSBHaXRIdWIgT0F1dGggYXBwIGF0OiBodHRwczovL2dpdGh1Yi5jb20vc2V0dGluZ3MvYXBwbGljYXRpb25zL25ld1xcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYDIuIFVzZSB0aGVzZSBzZXR0aW5nczpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgICDigKIgSG9tZXBhZ2UgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAg4oCiIEF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMOiBodHRwOi8vbG9jYWxob3N0OjMwMDAvY2FsbGJhY2tcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAzLiBDb3B5IHlvdXIgQ2xpZW50IElEIChzdGFydHMgd2l0aCBcIk92MjNsaVwiKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYDQuIFJ1bjogY29uZmlndXJlX29hdXRoIHdpdGggeW91ciBjbGllbnRfaWQgcGFyYW1ldGVyXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKipOZWVkIGhlbHA/KiogQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbGVkIHNldHVwIGluc3RydWN0aW9ucy5gXG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKCFDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoY2xpZW50X2lkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChg4p2MICoqSW52YWxpZCBDbGllbnQgSUQgRm9ybWF0KipcXG5cXG5gKSArXG4gICAgICAgICAgICAgICAgICAgICAgYEdpdEh1YiBPQXV0aCBDbGllbnQgSURzIG11c3Q6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYOKAoiBTdGFydCB3aXRoIFwiT3YyM2xpXCJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICBg4oCiIEJlIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IDE0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCoqRXhhbXBsZToqKiBPdjIzbGlBQkNERUZHSElKS0xNTlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgeW91ciBjbGllbnQgSUQgYW5kIHRyeSBhZ2Fpbi5gXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLnNldEdpdEh1YkNsaWVudElkKGNsaWVudF9pZCk7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbWFza2VkQ2xpZW50SWQgPSBjbGllbnRfaWQuc3Vic3RyaW5nKDAsIDEwKSArICcuLi4nO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKchSAqKkdpdEh1YiBPQXV0aCBDb25maWd1cmVkIFN1Y2Nlc3NmdWxseSoqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICBgKipDbGllbnQgSUQ6KiogJHttYXNrZWRDbGllbnRJZH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqU2F2ZWQgdG86Kiogfi8uZG9sbGhvdXNlL2NvbmZpZy5qc29uXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBZb3VyIEdpdEh1YiBPQXV0aCBpcyBub3cgcmVhZHkhIE5leHQgc3RlcHM6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgUnVuIHNldHVwX2dpdGh1Yl9hdXRoIHRvIGNvbm5lY3QgeW91ciBhY2NvdW50XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgU3RhcnQgc3VibWl0dGluZyBjb250ZW50IHRvIHRoZSBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQWNjZXNzIGF1dGhlbnRpY2F0ZWQgZmVhdHVyZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqTm90ZToqKiBZb3VyIGNsaWVudCBJRCBpcyBzZWN1cmVseSBzdG9yZWQgaW4geW91ciBsb2NhbCBjb25maWcgZmlsZS5gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY29uZmlndXJlIE9BdXRoJywgeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMucHJlZml4KGDinYwgKipPQXV0aCBDb25maWd1cmF0aW9uIEZhaWxlZCoqXFxuXFxuYCkgK1xuICAgICAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2s6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgRmlsZSBwZXJtaXNzaW9ucyBmb3Igfi8uZG9sbGhvdXNlL2NvbmZpZy5qc29uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgVmFsaWQgY2xpZW50IElEIGZvcm1hdCAoc3RhcnRzIHdpdGggXCJPdjIzbGlcIilcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBBdmFpbGFibGUgZGlzayBzcGFjZWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3Bhd25IZWxwZXJQcm9jZXNzKGhlbHBlclBhdGg6IHN0cmluZywgZGV2aWNlUmVzcG9uc2U6IERldmljZUNvZGVSZXNwb25zZSwgY2xpZW50SWQ6IHN0cmluZywgZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ25vZGUnLCBbXG4gICAgICAgICAgICBoZWxwZXJQYXRoLFxuICAgICAgICAgICAgZGV2aWNlUmVzcG9uc2UuZGV2aWNlX2NvZGUsXG4gICAgICAgICAgICAoZGV2aWNlUmVzcG9uc2UuaW50ZXJ2YWwgfHwgNSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRldmljZVJlc3BvbnNlLmV4cGlyZXNfaW4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNsaWVudElkXG4gICAgICAgIF0sIHtcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICAgICAgICBET0xMSE9VU0VfT0FVVEhfSEVMUEVSX0ZMT1dfSUQ6IGZsb3dJZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERvbGxob3VzZUhvbWVEaXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkRPTExIT1VTRV9IT01FX0RJUiB8fCBob21lZGlyKCk7XG4gICAgfVxufVxuIl19