@dollhousemcp/mcp-server 2.0.39 → 2.0.40

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 (55) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cache/CollectionCache.d.ts +1 -0
  3. package/dist/cache/CollectionCache.d.ts.map +1 -1
  4. package/dist/cache/CollectionCache.js +7 -16
  5. package/dist/cache/CollectionIndexCache.d.ts +1 -1
  6. package/dist/cache/CollectionIndexCache.d.ts.map +1 -1
  7. package/dist/cache/CollectionIndexCache.js +3 -2
  8. package/dist/cache/cachePaths.d.ts +7 -0
  9. package/dist/cache/cachePaths.d.ts.map +1 -0
  10. package/dist/cache/cachePaths.js +15 -0
  11. package/dist/di/Container.js +2 -2
  12. package/dist/elements/agents/AgentManager.d.ts +121 -1
  13. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  14. package/dist/elements/agents/AgentManager.js +203 -31
  15. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  16. package/dist/elements/base/BaseElementManager.js +4 -18
  17. package/dist/elements/memories/Memory.d.ts +7 -0
  18. package/dist/elements/memories/Memory.d.ts.map +1 -1
  19. package/dist/elements/memories/Memory.js +68 -34
  20. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  21. package/dist/elements/memories/MemoryManager.js +10 -2
  22. package/dist/elements/memories/memoryYamlValidation.d.ts +6 -0
  23. package/dist/elements/memories/memoryYamlValidation.d.ts.map +1 -0
  24. package/dist/elements/memories/memoryYamlValidation.js +25 -0
  25. package/dist/generated/version.d.ts +2 -2
  26. package/dist/generated/version.js +3 -3
  27. package/dist/handlers/CollectionHandler.d.ts.map +1 -1
  28. package/dist/handlers/CollectionHandler.js +2 -3
  29. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -1
  30. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  31. package/dist/handlers/mcp-aql/MCPAQLHandler.js +135 -71
  32. package/dist/handlers/mcp-aql/OperationSchema.js +4 -4
  33. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +7 -5
  35. package/dist/portfolio/PortfolioManager.d.ts +5 -1
  36. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  37. package/dist/portfolio/PortfolioManager.js +9 -3
  38. package/dist/security/contentValidator.d.ts +9 -1
  39. package/dist/security/contentValidator.d.ts.map +1 -1
  40. package/dist/security/contentValidator.js +24 -3
  41. package/dist/security/secureYamlParser.d.ts +3 -1
  42. package/dist/security/secureYamlParser.d.ts.map +1 -1
  43. package/dist/security/secureYamlParser.js +3 -3
  44. package/dist/security/securityMonitor.d.ts +1 -1
  45. package/dist/security/securityMonitor.d.ts.map +1 -1
  46. package/dist/security/securityMonitor.js +1 -1
  47. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  48. package/dist/security/validation/BackgroundValidator.js +6 -4
  49. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  50. package/dist/storage/MemoryMetadataExtractor.js +7 -2
  51. package/dist/utils/filesystem.d.ts +6 -0
  52. package/dist/utils/filesystem.d.ts.map +1 -1
  53. package/dist/utils/filesystem.js +22 -1
  54. package/package.json +9 -9
  55. package/server.json +2 -2
@@ -44,6 +44,7 @@ import { env } from '../../config/env.js';
44
44
  import { STORAGE_LAYER_CONFIG } from '../../config/performance-constants.js';
45
45
  import { generateDisplayCode } from '@dollhousemcp/safety';
46
46
  import { randomUUID } from 'node:crypto';
47
+ import { normalizeAgentExecutionIdentity } from '../../elements/agents/AgentManager.js';
47
48
  import { evaluateResiliencePolicy, circuitBreaker } from '../../elements/agents/resilienceEvaluator.js';
48
49
  import { resilienceMetrics } from '../../elements/agents/resilienceMetrics.js';
49
50
  import { aggregateElements, validateAggregationOptions } from '../../services/query/AggregationService.js';
@@ -52,6 +53,7 @@ import { PERMISSION_AUTHORITY_HOSTS, PERMISSION_AUTHORITY_MODES, readPermissionA
52
53
  import { ElementType } from '../../portfolio/PortfolioManager.js';
53
54
  import { prepareHandoffState, parseHandoffBlock, generateHandoffBlock } from '../../elements/agents/handoff.js';
54
55
  import { getAutonomyMetrics } from '../../elements/agents/autonomyEvaluator.js';
56
+ import { ElementNotFoundError } from '../../utils/ErrorHandler.js';
55
57
  // ============================================================================
56
58
  // Parameter Validation Utilities (Issue #323)
57
59
  // ============================================================================
@@ -747,7 +749,10 @@ export class MCPAQLHandler {
747
749
  else {
748
750
  // Hard deny — operation is blocked by policy, no confirmation can help
749
751
  this.recordGatekeeperBlockForAgents(operation, elementType, decision.reason ?? 'Operation blocked by policy', decision.permissionLevel);
750
- throw new Error(`[Gatekeeper] ${decision.reason}`);
752
+ const suggestion = decision.suggestion
753
+ ? ` Suggestion: ${decision.suggestion}`
754
+ : '';
755
+ throw new Error(`[Gatekeeper] ${decision.reason}${suggestion}`);
751
756
  }
752
757
  }
753
758
  // Issue #673: Protect gatekeeper policy fields from element-policy elevation.
@@ -1558,7 +1563,14 @@ export class MCPAQLHandler {
1558
1563
  // Issue #656: Debounce saves to prevent FD exhaustion from rapid addEntry calls.
1559
1564
  // The entry is already in memory — disk write is deferred and coalesced.
1560
1565
  this.debouncedMemorySave(memoryName, targetMemory, manager);
1561
- return entryResult;
1566
+ // Entry prose begins as UNTRUSTED and is validated asynchronously. Return
1567
+ // only server-generated receipt fields so the mutation response cannot
1568
+ // bypass the sandbox used when memory content is rendered later.
1569
+ return {
1570
+ id: entryResult.id,
1571
+ timestamp: entryResult.timestamp.toISOString(),
1572
+ trustLevel: entryResult.trustLevel,
1573
+ };
1562
1574
  }
1563
1575
  /**
1564
1576
  * Dispatch Agent operations to AgentManager
@@ -3016,11 +3028,13 @@ export class MCPAQLHandler {
3016
3028
  // Issue #323: Validate element_name parameter (was incorrectly using 'name')
3017
3029
  // All execute operations require element_name to identify the target
3018
3030
  const elementName = validateExecutionElementName(method, params);
3031
+ const executionKey = normalizeAgentExecutionIdentity(elementName);
3019
3032
  // Issue #110: Programmatic enforcement for DANGER_ZONE tier
3020
3033
  // Issue #402: Use DI-injected enforcer instead of singleton
3021
- // Check if the agent is blocked due to danger zone trigger
3022
- // Only allow 'getState' operation for blocked agents (read-only, needed for diagnostics)
3023
- if (method !== 'getState' && this.handlers.dangerZoneEnforcer) {
3034
+ // Check if the agent is blocked due to danger zone trigger. State reads and
3035
+ // abort remain available for diagnostics and safe execution shutdown. Abort
3036
+ // deliberately preserves the independent DangerZone block below.
3037
+ if (method !== 'getState' && method !== 'abort' && this.handlers.dangerZoneEnforcer) {
3024
3038
  const blockCheck = this.handlers.dangerZoneEnforcer.check(elementName);
3025
3039
  if (blockCheck.blocked) {
3026
3040
  logger.warn(`Agent '${elementName}' blocked from executing '${method}': ${blockCheck.reason}`, {
@@ -3075,7 +3089,7 @@ export class MCPAQLHandler {
3075
3089
  const resiliencePolicy = agentMeta.resilience;
3076
3090
  // Always track if there's a gatekeeper policy, runtime override, or resilience policy
3077
3091
  if (gatekeeperPolicy || runtimeMaxSteps !== undefined || resiliencePolicy) {
3078
- this.executingAgents.set(elementName, {
3092
+ this.executingAgents.set(executionKey, {
3079
3093
  name: elementName,
3080
3094
  metadata: {
3081
3095
  ...(gatekeeperPolicy ? { gatekeeper: gatekeeperPolicy } : {}),
@@ -3092,7 +3106,7 @@ export class MCPAQLHandler {
3092
3106
  }
3093
3107
  else if (runtimeMaxSteps !== undefined) {
3094
3108
  // No agent element to read, but we still need to store the override
3095
- this.executingAgents.set(elementName, {
3109
+ this.executingAgents.set(executionKey, {
3096
3110
  name: elementName,
3097
3111
  metadata: { maxAutonomousSteps: runtimeMaxSteps },
3098
3112
  startedAt: Date.now(),
@@ -3138,7 +3152,7 @@ export class MCPAQLHandler {
3138
3152
  }
3139
3153
  }
3140
3154
  // Issue #447: Apply runtime maxAutonomousSteps override if stored for this agent
3141
- const executingAgent = this.executingAgents.get(elementName);
3155
+ const executingAgent = this.executingAgents.get(executionKey);
3142
3156
  const maxStepsOverride = executingAgent?.metadata?.maxAutonomousSteps;
3143
3157
  const updateResult = await manager.recordAgentStep({
3144
3158
  agentName: elementName,
@@ -3151,12 +3165,12 @@ export class MCPAQLHandler {
3151
3165
  maxStepsOverride,
3152
3166
  });
3153
3167
  // Issue #526: Evaluate resilience policy when autonomy says pause
3154
- const resilienceResult = this.evaluateResilience(elementName, updateResult, params.outcome);
3168
+ const resilienceResult = this.evaluateResilience(elementName, executionKey, updateResult, params.outcome);
3155
3169
  // Agent Notification System: collect and attach notifications
3156
3170
  const finalResult = resilienceResult ?? updateResult;
3157
3171
  const autonomy = finalResult.autonomy;
3158
3172
  if (autonomy) {
3159
- const notifications = this.collectNotifications(elementName, autonomy);
3173
+ const notifications = this.collectNotifications(executionKey, autonomy);
3160
3174
  if (notifications.length > 0) {
3161
3175
  autonomy.notifications = notifications;
3162
3176
  }
@@ -3173,7 +3187,7 @@ export class MCPAQLHandler {
3173
3187
  goalId: params.goalId,
3174
3188
  });
3175
3189
  // Issue #526: Track resilience outcome and reset circuit breaker on success
3176
- const completedAgent = this.executingAgents.get(elementName);
3190
+ const completedAgent = this.executingAgents.get(executionKey);
3177
3191
  if (completedAgent?.resiliencePolicy && (completedAgent.continuationCount > 0 || completedAgent.retryCount > 0)) {
3178
3192
  const isSuccess = params.outcome === 'success';
3179
3193
  resilienceMetrics.recordCompletionAfterResilience(isSuccess);
@@ -3182,7 +3196,7 @@ export class MCPAQLHandler {
3182
3196
  }
3183
3197
  }
3184
3198
  // Issue #449: Remove agent from executing set so its policies stop applying
3185
- this.executingAgents.delete(elementName);
3199
+ this.executingAgents.delete(executionKey);
3186
3200
  // Issue #125: Return structured JSON with type discriminator
3187
3201
  return { _type: 'CompletionResult', ...completeResult };
3188
3202
  }
@@ -3200,63 +3214,103 @@ export class MCPAQLHandler {
3200
3214
  // Issue #249: Abort a running agent execution
3201
3215
  const reason = params.reason || 'Aborted by user';
3202
3216
  // Find the active goal for this agent
3203
- const activeGoalIds = await this.getActiveGoalIds(manager, elementName);
3204
- if (activeGoalIds.length === 0) {
3205
- throw new Error(`No active execution found for agent '${elementName}'. ` +
3206
- `Nothing to abort.`);
3207
- }
3208
- // Mark all active goals as aborted
3209
- for (const goalId of activeGoalIds) {
3210
- this.abortedGoals.add(goalId);
3211
- }
3212
- // Complete the agent goal with 'failure' outcome to persist the aborted state
3217
+ const executionPolicyAtLookupStart = this.executingAgents.get(executionKey);
3218
+ const generationObservation = manager.observeExecutionGeneration(elementName);
3213
3219
  try {
3214
- await manager.completeAgentGoal({
3215
- agentName: elementName,
3216
- outcome: 'failure',
3217
- summary: `Execution aborted: ${reason}`,
3218
- });
3219
- }
3220
- catch {
3221
- // Non-fatal: goal may already be completed or agent state may be inconsistent
3222
- logger.warn('Failed to mark aborted agent goal as failed', { agentName: elementName });
3223
- }
3224
- // Issue #526: Track resilience outcome (abort = failure after resilience)
3225
- const abortedAgent = this.executingAgents.get(elementName);
3226
- if (abortedAgent?.resiliencePolicy && (abortedAgent.continuationCount > 0 || abortedAgent.retryCount > 0)) {
3227
- resilienceMetrics.recordCompletionAfterResilience(false);
3228
- }
3229
- // Clean up executingAgents Map (stop Gatekeeper policy enforcement)
3230
- this.executingAgents.delete(elementName);
3231
- // Clean up DangerZoneEnforcer blocks for this agent
3232
- if (this.handlers.dangerZoneEnforcer) {
3233
- try {
3234
- this.handlers.dangerZoneEnforcer.unblock(elementName);
3220
+ const activeGoalIds = await this.getActiveGoalIds(manager, elementName, false);
3221
+ if (activeGoalIds.length === 0) {
3222
+ // Issue #2427: the durable goal may already be gone while the in-memory
3223
+ // execution policy remains. Explicit abort is safer and narrower than
3224
+ // clearing every active element through release_deadlock.
3225
+ // Re-read durable state immediately before cleanup. A concurrent
3226
+ // execute_agent can persist a new goal while policy tracking fails,
3227
+ // leaving the old map object unchanged and defeating identity checks
3228
+ // by themselves.
3229
+ const revalidatedGoalIds = await this.getActiveGoalIds(manager, elementName, false);
3230
+ const currentExecutionPolicy = this.executingAgents.get(executionKey);
3231
+ if (revalidatedGoalIds.length > 0 ||
3232
+ manager.hasExecutionGenerationChanged(elementName, generationObservation.token) ||
3233
+ (currentExecutionPolicy && currentExecutionPolicy !== executionPolicyAtLookupStart)) {
3234
+ throw new Error(`Execution state changed while recovering agent '${elementName}'. ` +
3235
+ `The newer execution policy was preserved; retry abort_execution to abort it.`);
3236
+ }
3237
+ if (executionPolicyAtLookupStart && currentExecutionPolicy === executionPolicyAtLookupStart) {
3238
+ this.executingAgents.delete(executionKey);
3239
+ SecurityMonitor.logSecurityEvent({
3240
+ type: 'AGENT_POLICY_RECOVERED',
3241
+ severity: 'MEDIUM',
3242
+ source: 'MCPAQLHandler.dispatchExecute.abort',
3243
+ details: `Recovered stale execution policy for agent: ${elementName}`,
3244
+ additionalData: { agentName: elementName, reason: 'stale_execution_policy' },
3245
+ });
3246
+ return {
3247
+ _type: 'AbortResult',
3248
+ success: true,
3249
+ agentName: elementName,
3250
+ abortedGoalIds: [],
3251
+ recoveredStalePolicy: true,
3252
+ reason,
3253
+ message: `Removed stale execution policy for agent '${elementName}'. No active goal remained.`,
3254
+ };
3255
+ }
3256
+ throw new Error(`No active execution found for agent '${elementName}'. ` +
3257
+ `Nothing to abort.`);
3235
3258
  }
3236
- catch {
3237
- // Non-fatal: agent may not have been blocked
3259
+ // Complete each exact goal from the strict snapshot before dropping policy.
3260
+ // Any storage or version conflict fails closed and preserves the sandbox.
3261
+ for (const goalId of activeGoalIds) {
3262
+ await manager.completeAgentGoalForRecovery({
3263
+ agentName: elementName,
3264
+ goalId,
3265
+ outcome: 'failure',
3266
+ summary: `Execution aborted: ${reason}`,
3267
+ });
3268
+ this.abortedGoals.add(goalId);
3238
3269
  }
3239
- }
3240
- SecurityMonitor.logSecurityEvent({
3241
- type: 'AGENT_EXECUTED',
3242
- severity: 'MEDIUM',
3243
- source: 'MCPAQLHandler.dispatchExecute.abort',
3244
- details: `Agent execution aborted: ${elementName} — ${reason}`,
3245
- additionalData: {
3270
+ // A new execution may begin after the active-goal snapshot or after the
3271
+ // old goals are completed. Preserve its policy unless durable state,
3272
+ // generation, and map identity still describe the original execution.
3273
+ const remainingActiveGoalIds = await this.getActiveGoalIds(manager, elementName, false);
3274
+ const currentExecutionPolicy = this.executingAgents.get(executionKey);
3275
+ if (remainingActiveGoalIds.length > 0 ||
3276
+ manager.hasExecutionGenerationChanged(elementName, generationObservation.token) ||
3277
+ (currentExecutionPolicy && currentExecutionPolicy !== executionPolicyAtLookupStart)) {
3278
+ throw new Error(`Execution state changed while aborting agent '${elementName}'. ` +
3279
+ `The newer execution policy was preserved; retry abort_execution to abort it.`);
3280
+ }
3281
+ // Issue #526: Track resilience outcome (abort = failure after resilience)
3282
+ const abortedAgent = executionPolicyAtLookupStart;
3283
+ if (abortedAgent?.resiliencePolicy && (abortedAgent.continuationCount > 0 || abortedAgent.retryCount > 0)) {
3284
+ resilienceMetrics.recordCompletionAfterResilience(false);
3285
+ }
3286
+ // Delete only the policy that was present when this abort began.
3287
+ if (currentExecutionPolicy === executionPolicyAtLookupStart) {
3288
+ this.executingAgents.delete(executionKey);
3289
+ }
3290
+ SecurityMonitor.logSecurityEvent({
3291
+ type: 'AGENT_EXECUTED',
3292
+ severity: 'MEDIUM',
3293
+ source: 'MCPAQLHandler.dispatchExecute.abort',
3294
+ details: `Agent execution aborted: ${elementName} — ${reason}`,
3295
+ additionalData: {
3296
+ agentName: elementName,
3297
+ abortedGoalIds: activeGoalIds,
3298
+ reason,
3299
+ },
3300
+ });
3301
+ // Issue #125: Return structured JSON with type discriminator
3302
+ return {
3303
+ _type: 'AbortResult',
3304
+ success: true,
3246
3305
  agentName: elementName,
3247
3306
  abortedGoalIds: activeGoalIds,
3248
3307
  reason,
3249
- },
3250
- });
3251
- // Issue #125: Return structured JSON with type discriminator
3252
- return {
3253
- _type: 'AbortResult',
3254
- success: true,
3255
- agentName: elementName,
3256
- abortedGoalIds: activeGoalIds,
3257
- reason,
3258
- message: `Agent '${elementName}' execution aborted. ${activeGoalIds.length} goal(s) terminated.`,
3259
- };
3308
+ message: `Agent '${elementName}' execution aborted. ${activeGoalIds.length} goal(s) terminated.`,
3309
+ };
3310
+ }
3311
+ finally {
3312
+ generationObservation.release();
3313
+ }
3260
3314
  }
3261
3315
  case 'getGatheredData': {
3262
3316
  // Issue #68: Get aggregated execution data for a specific goal
@@ -3411,9 +3465,9 @@ export class MCPAQLHandler {
3411
3465
  * @since v2.1.0 - Agent Notification System
3412
3466
  * @private
3413
3467
  */
3414
- collectNotifications(agentName, autonomy) {
3468
+ collectNotifications(executionKey, autonomy) {
3415
3469
  const notifications = [];
3416
- const executingAgent = this.executingAgents.get(agentName);
3470
+ const executingAgent = this.executingAgents.get(executionKey);
3417
3471
  // Source 1: Unreported gatekeeper blocks
3418
3472
  if (executingAgent?.recentBlocks) {
3419
3473
  for (const block of executingAgent.recentBlocks) {
@@ -3481,13 +3535,13 @@ export class MCPAQLHandler {
3481
3535
  * @since v2.1.0 - Agent Execution Resilience (Issue #526)
3482
3536
  * @private
3483
3537
  */
3484
- evaluateResilience(agentName, updateResult, stepOutcome) {
3538
+ evaluateResilience(agentName, executionKey, updateResult, stepOutcome) {
3485
3539
  // Only evaluate when autonomy says pause
3486
3540
  const autonomy = updateResult.autonomy;
3487
3541
  if (!autonomy || autonomy.continue === true)
3488
3542
  return null;
3489
3543
  // Look up the executing agent's resilience tracking state
3490
- const executingAgent = this.executingAgents.get(agentName);
3544
+ const executingAgent = this.executingAgents.get(executionKey);
3491
3545
  if (!executingAgent?.resiliencePolicy)
3492
3546
  return null;
3493
3547
  // Determine what triggered the pause
@@ -3606,16 +3660,26 @@ export class MCPAQLHandler {
3606
3660
  * Queries the agent's state to find in-progress goals.
3607
3661
  * @private
3608
3662
  */
3609
- async getActiveGoalIds(manager, agentName) {
3663
+ async getActiveGoalIds(manager, agentName, suppressLookupErrors = true) {
3610
3664
  try {
3611
- const stateResult = await manager.getAgentState({ agentName });
3665
+ const stateResult = suppressLookupErrors
3666
+ ? await manager.getAgentState({ agentName })
3667
+ : await manager.getAgentStateForRecovery({ agentName });
3612
3668
  if (stateResult?.state?.goals) {
3613
3669
  return stateResult.state.goals
3614
3670
  .filter((g) => g.status === 'in_progress')
3615
3671
  .map((g) => g.id);
3616
3672
  }
3617
3673
  }
3618
- catch {
3674
+ catch (error) {
3675
+ // A deleted agent is definitive stale state. Other lookup failures may be
3676
+ // transient and must still fail closed when suppression is disabled.
3677
+ if (error instanceof ElementNotFoundError) {
3678
+ return [];
3679
+ }
3680
+ if (!suppressLookupErrors) {
3681
+ throw error;
3682
+ }
3619
3683
  // Agent may not have state yet
3620
3684
  }
3621
3685
  return [];
@@ -3856,4 +3920,4 @@ function resolveCliApprovalPolicy(activeElements) {
3856
3920
  ttlSeconds,
3857
3921
  };
3858
3922
  }
3859
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNCLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0osT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFNTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBSXBCLGNBQWMsRUFDZCwwQkFBMEIsR0FDM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMs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LENBQUM7SUFDSCxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQUksZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDO1FBQzVELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQzFHLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBaUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxlQUFlLEVBQUUsZUFBZSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbkYsWUFBWTtRQUNaLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUNQQVFMSGFuZGxlciAtIFVuaWZpZWQgaGFuZGxlciBmb3IgYWxsIE1DUC1BUUwgb3BlcmF0aW9uc1xuICpcbiAqIEFSQ0hJVEVDVFVSRTpcbiAqIC0gVGhpbiByZXNvbHZlciBwYXR0ZXJuOiB2YWxpZGF0ZXMg4oaSIHJvdXRlcyDihpIgZGlzcGF0Y2hlc1xuICogLSBTT0xJRCBwcmluY2lwbGVzOiBkZXBlbmRzIG9uIGFic3RyYWN0aW9ucyAoSGFuZGxlclJlZ2lzdHJ5IGludGVyZmFjZSlcbiAqIC0gRGVmZW5zZSBpbiBkZXB0aDogR2F0ZWtlZXBlciB2YWxpZGF0ZXMgZW5kcG9pbnQvb3BlcmF0aW9uIG1hdGNoaW5nIGFuZCBlbmZvcmNlcyBwb2xpY2llc1xuICogLSBEaXNwYXRjaCBwYXR0ZXJuOiByb3V0ZXMgaGFuZGxlciByZWZlcmVuY2VzIHRvIGFjdHVhbCBtZXRob2QgY2FsbHNcbiAqXG4gKiBPUEVSQVRJT04gRkxPVzpcbiAqIDEuIFZhbGlkYXRlIGlucHV0IHN0cnVjdHVyZSAodHlwZSBndWFyZHMpXG4gKiAyLiBWYWxpZGF0ZSBwZXJtaXNzaW9ucyAoR2F0ZWtlZXBlcilcbiAqIDMuIFJvdXRlIG9wZXJhdGlvbiAoT3BlcmF0aW9uUm91dGVyKVxuICogNC4gRGlzcGF0Y2ggdG8gaGFuZGxlciAocmVzb2x2ZUhhbmRsZXJSZWZlcmVuY2UpXG4gKiA1LiBSZXR1cm4gc3RhbmRhcmRpemVkIHJlc3VsdCAoT3BlcmF0aW9uUmVzdWx0KVxuICpcbiAqIEVSUk9SIEhBTkRMSU5HOlxuICogQWxsIGVycm9ycyBhcmUgY2F1Z2h0IGFuZCByZXR1cm5lZCBhcyBPcGVyYXRpb25GYWlsdXJlIHdpdGg6XG4gKiAtIHN1Y2Nlc3M6IGZhbHNlXG4gKiAtIGVycm9yOiBodW1hbi1yZWFkYWJsZSBtZXNzYWdlXG4gKiAtIGRhdGE6IG5ldmVyIChkaXNjcmltaW5hdGVkIHVuaW9uIGVuZm9yY2VzIHRoaXMpXG4gKi9cblxuaW1wb3J0IHsgQ1JVREVuZHBvaW50IH0gZnJvbSAnLi9PcGVyYXRpb25Sb3V0ZXIuanMnO1xuaW1wb3J0IHsgR2F0ZWtlZXBlciB9IGZyb20gJy4vR2F0ZWtlZXBlci5qcyc7XG5pbXBvcnQgeyB0eXBlIEFjdGl2ZUVsZW1lbnQsIHRyYW5zbGF0ZVRvb2xDb25maWdUb1BvbGljeSwgY2FuT3BlcmF0aW9uQmVFbGV2YXRlZCB9IGZyb20gJy4vcG9saWNpZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgaXNHYXRla2VlcGVySW5mcmFPcGVyYXRpb24sIGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQsIGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cywgZ2V0R2F0ZWtlZXBlckRpYWdub3N0aWNzIH0gZnJvbSAnLi9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkxldmVsLCBHYXRla2VlcGVyRXJyb3JDb2RlIH0gZnJvbSAnLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0Um91dGUgfSBmcm9tICcuL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBBTExfT1BFUkFUSU9OX1NDSEVNQVMgfSBmcm9tICcuL09wZXJhdGlvblNjaGVtYS5qcyc7XG5pbXBvcnQgeyBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIgfSBmcm9tICcuL0ludHJvc3BlY3Rpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBTY2hlbWFEaXNwYXRjaGVyIH0gZnJvbSAnLi9TY2hlbWFEaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IGluaXRpYWxpemVOb3JtYWxpemVycyB9IGZyb20gJy4vbm9ybWFsaXplcnMvaW5kZXguanMnO1xuaW1wb3J0IHsgZmlsdGVyRmllbGRzLCBpc1ZhbGlkUHJlc2V0LCBub3JtYWxpemVGaWVsZE5hbWVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvRmllbGRGaWx0ZXIuanMnO1xuaW1wb3J0IHtcbiAgT3BlcmF0aW9uSW5wdXQsXG4gIE9wZXJhdGlvblJlc3VsdCxcbiAgT3BlcmF0aW9uU3VjY2VzcyxcbiAgT3BlcmF0aW9uRmFpbHVyZSxcbiAgUmVzcG9uc2VNZXRhLFxuICBwYXJzZU9wZXJhdGlvbklucHV0LFxuICBkZXNjcmliZUludmFsaWRJbnB1dCxcbiAgQmF0Y2hSZXF1ZXN0LFxuICBCYXRjaFJlc3VsdCxcbiAgQmF0Y2hPcGVyYXRpb25SZXN1bHQsXG4gIGlzQmF0Y2hSZXF1ZXN0LFxuICBub3JtYWxpemVNQ1BBUUxFbGVtZW50VHlwZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaXNTZWFyY2hNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWxzL3NlYXJjaFV0aWxzLmpzJztcbmltcG9ydCB7IFBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlcnkvUGFnaW5hdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplRWxlbWVudFR5cGUsIEFMTF9FTEVNRU5UX1RZUEVTLCBmb3JtYXRFbGVtZW50VHlwZXNMaXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5VG9vbCwgZXZhbHVhdGVDbGlUb29sUG9saWN5LCBhc3Nlc3NSaXNrIH0gZnJvbSAnLi9wb2xpY2llcy9Ub29sQ2xhc3NpZmljYXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBDbGlBcHByb3ZhbFNjb3BlLCBDbGlBcHByb3ZhbFBvbGljeSB9IGZyb20gJy4vR2F0ZWtlZXBlclR5cGVzLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uL3V0aWxzL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHsgU1RPUkFHRV9MQVlFUl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgRGFuZ2VyWm9uZUVuZm9yY2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvRGFuZ2VyWm9uZUVuZm9yY2VyLmpzJztcbmltcG9ydCB0eXBlIHsgVmVyaWZpY2F0aW9uU3RvcmUgfSBmcm9tICdAZG9sbGhvdXNlbWNwL3NhZmV0eSc7XG5pbXBvcnQgdHlwZSB7IElWZXJpZmljYXRpb25Ob3RpZmllciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1ZlcmlmaWNhdGlvbk5vdGlmaWVyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGlzcGxheUNvZGUgfSBmcm9tICdAZG9sbGhvdXNlbWNwL3NhZmV0eSc7XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50Q1JVREhhbmRsZXIgfSBmcm9tICcuLi9FbGVtZW50Q1JVREhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFnZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE1ldGFkYXRhVjIsIEFnZW50UmVzaWxpZW5jZVBvbGljeSwgQWdlbnROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvdHlwZXMuanMnO1xuaW1wb3J0IHsgZXZhbHVhdGVSZXNpbGllbmNlUG9saWN5LCBjaXJjdWl0QnJlYWtlciwgdHlwZSBSZXNpbGllbmNlQ29udGV4dCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9yZXNpbGllbmNlRXZhbHVhdG9yLmpzJztcbmltcG9ydCB7IHJlc2lsaWVuY2VNZXRyaWNzIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL3Jlc2lsaWVuY2VNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZW5kZXJlciB9IGZyb20gJy4uLy4uL3V0aWxzL1RlbXBsYXRlUmVuZGVyZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50UXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlcnkvRWxlbWVudFF1ZXJ5U2VydmljZS5qcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVFbGVtZW50cywgdmFsaWRhdGVBZ2dyZWdhdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9BZ2dyZWdhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBJRWxlbWVudCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcnRmb2xpb0hhbmRsZXIgfSBmcm9tICcuLi9Qb3J0Zm9saW9IYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgR2l0SHViQXV0aEhhbmRsZXIgfSBmcm9tICcuLi9HaXRIdWJBdXRoSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ0hhbmRsZXIgfSBmcm9tICcuLi9Db25maWdIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRJbmRleEhhbmRsZXIgfSBmcm9tICcuLi9FbmhhbmNlZEluZGV4SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBnZXRQZXJtaXNzaW9uSG9va1N0YXR1cyB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5pbXBvcnQge1xuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25BdXRob3JpdHkuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJzb25hSGFuZGxlciB9IGZyb20gJy4uL1BlcnNvbmFIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3luY0hhbmRsZXIgfSBmcm9tICcuLi9TeW5jSGFuZGxlclYyLmpzJztcbmltcG9ydCB0eXBlIHsgQnVpbGRJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0J1aWxkSW5mb1NlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTG9nUXVlcnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1F1ZXJ5T3B0aW9ucywgTWV0cmljVHlwZSB9IGZyb20gJy4uLy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJmb3JtYW5jZU1vbml0b3IgfSBmcm9tICcuLi8uLi91dGlscy9QZXJmb3JtYW5jZU1vbml0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25NZXRyaWNzVHJhY2tlciB9IGZyb20gJy4uLy4uL21ldHJpY3MvT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXIgfSBmcm9tICcuLi8uLi9tZXRyaWNzL0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IHByZXBhcmVIYW5kb2ZmU3RhdGUsIHBhcnNlSGFuZG9mZkJsb2NrLCBnZW5lcmF0ZUhhbmRvZmZCbG9jayB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9oYW5kb2ZmLmpzJztcbmltcG9ydCB7IGdldEF1dG9ub215TWV0cmljcyB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEF1dG9ub215TWV0cmljc1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL2F1dG9ub215RXZhbHVhdG9yLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGFyYW1ldGVyIFZhbGlkYXRpb24gVXRpbGl0aWVzIChJc3N1ZSAjMzIzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBleHRyYWN0IGEgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBmcm9tIHBhcmFtcy5cbiAqIFRocm93cyBhIHVzZXItZnJpZW5kbHkgZXJyb3IgaWYgdGhlIHBhcmFtZXRlciBpcyBtaXNzaW5nIG9yIG5vdCBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0IHRvIGV4dHJhY3QgZnJvbVxuICogQHBhcmFtIHBhcmFtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBzdHJpbmcgdmFsdWVcbiAqIEB0aHJvd3MgRXJyb3Igd2l0aCB1c2VyLWZyaWVuZGx5IG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwYXJhbU5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJhbXNbcGFyYW1OYW1lXTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICcke3BhcmFtTmFtZX0nLiBFeHBlY3RlZDogc3RyaW5nICgke2Rlc2NyaXB0aW9ufSlgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmNvbnN0IEVYRUNVVElPTl9PUEVSQVRJT05fTkFNRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGV4ZWN1dGU6ICdleGVjdXRlX2FnZW50JyxcbiAgZ2V0U3RhdGU6ICdnZXRfZXhlY3V0aW9uX3N0YXRlJyxcbiAgdXBkYXRlU3RhdGU6ICdyZWNvcmRfZXhlY3V0aW9uX3N0ZXAnLFxuICBjb21wbGV0ZTogJ2NvbXBsZXRlX2V4ZWN1dGlvbicsXG4gIGNvbnRpbnVlOiAnY29udGludWVfZXhlY3V0aW9uJyxcbiAgYWJvcnQ6ICdhYm9ydF9leGVjdXRpb24nLFxuICBnZXRHYXRoZXJlZERhdGE6ICdnZXRfZ2F0aGVyZWRfZGF0YScsXG4gIHByZXBhcmVIYW5kb2ZmOiAncHJlcGFyZV9oYW5kb2ZmJyxcbiAgcmVzdW1lRnJvbUhhbmRvZmY6ICdyZXN1bWVfZnJvbV9oYW5kb2ZmJyxcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhlY3V0aW9uRWxlbWVudE5hbWUoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtcy5lbGVtZW50X25hbWU7XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBFWEVDVVRJT05fT1BFUkFUSU9OX05BTUVTW21ldGhvZF0gfHwgJ2V4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9uJztcblxuICBpZiAobWV0aG9kID09PSAnZ2V0U3RhdGUnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICdlbGVtZW50X25hbWUnLiBFeHBlY3RlZDogc3RyaW5nIGAgK1xuICAgICAgYCh0aGUgbmFtZSBvZiB0aGUgYWdlbnQvZXhlY3V0YWJsZSBlbGVtZW50IHdob3NlIGV4ZWN1dGlvbiBzdGF0ZSB5b3Ugd2FudCB0byBpbnNwZWN0KS4gYCArXG4gICAgICBgVXNlIHRoZSBzYW1lIGVsZW1lbnRfbmFtZSB5b3UgcGFzc2VkIHRvIGV4ZWN1dGVfYWdlbnQuIGAgK1xuICAgICAgYFJldHJ5IHdpdGg6IHsgb3BlcmF0aW9uOiBcImdldF9leGVjdXRpb25fc3RhdGVcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk6IHRydWUgfSB9LiBgICtcbiAgICAgIGBJZiB5b3UncmUgdW5zdXJlIHdoaWNoIG5hbWUgdG8gdXNlLCBjYWxsIGludHJvc3BlY3QgZm9yIFwiZ2V0X2V4ZWN1dGlvbl9zdGF0ZVwiIG9yIGxpc3QgYWN0aXZlIGFnZW50cyBmaXJzdC5gXG4gICAgKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2VsZW1lbnRfbmFtZScuIEV4cGVjdGVkOiBzdHJpbmcgYCArXG4gICAgYCh0aGUgbmFtZSBvZiB0aGUgYWdlbnQvZXhlY3V0YWJsZSBlbGVtZW50IGZvciAke29wZXJhdGlvbk5hbWV9KS4gYCArXG4gICAgYElmIHRoaXMgaXMgcGFydCBvZiBhbiBleGlzdGluZyBleGVjdXRpb24gbGlmZWN5Y2xlLCByZXVzZSB0aGUgc2FtZSBlbGVtZW50X25hbWUgeW91IHBhc3NlZCB0byBleGVjdXRlX2FnZW50LiBgICtcbiAgICBgSWYgeW91J3JlIHVuc3VyZSB3aGljaCBuYW1lIHRvIHVzZSwgY2FsbCBpbnRyb3NwZWN0IGZvciBcIiR7b3BlcmF0aW9uTmFtZX1cIiBvciBsaXN0IGFjdGl2ZSBhZ2VudHMgZmlyc3QuYFxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIGludG8gYSB7IHBhZ2UsIHBhZ2VTaXplIH0gb2JqZWN0LlxuICpcbiAqIElzc3VlICM1MDA6IHF1ZXJ5X2VsZW1lbnRzIGFuZCBzZWFyY2hfZWxlbWVudHMgc2lsZW50bHkgaWdub3JlZCBmbGF0XG4gKiBwYWdlU2l6ZS9wYWdlL2xpbWl0L29mZnNldCBwYXJhbXMuIFRoaXMgaGVscGVyIGRldGVjdHMgdGhlc2UgYXQgdGhlXG4gKiB0b3AgbGV2ZWwgYW5kIG5vcm1hbGl6ZXMgdGhlbSwgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gdXNlZCBieSBsaXN0RWxlbWVudHMuXG4gKlxuICogUHJpb3JpdHk6IG5lc3RlZCBwYWdpbmF0aW9uID4gbGltaXQvb2Zmc2V0ID4gZmxhdCBwYWdlL3BhZ2VTaXplID4gZGVmYXVsdHNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhcbiAgcGFyYW1zOiB7XG4gICAgcGFnaW5hdGlvbj86IHsgcGFnZT86IG51bWJlcjsgcGFnZVNpemU/OiBudW1iZXIgfTtcbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIHBhZ2VTaXplPzogbnVtYmVyO1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9XG4pOiB7IHBhZ2U6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9IHtcbiAgLy8gSWYgbmVzdGVkIHBhZ2luYXRpb24gaXMgcHJlc2VudCwgdXNlIGl0IGRpcmVjdGx5XG4gIGlmIChwYXJhbXMucGFnaW5hdGlvbiAmJiB0eXBlb2YgcGFyYW1zLnBhZ2luYXRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcCA9IHBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlOiAodHlwZW9mIHAucGFnZSA9PT0gJ251bWJlcicgJiYgcC5wYWdlID4gMCkgPyBwLnBhZ2UgOiAxLFxuICAgICAgcGFnZVNpemU6ICh0eXBlb2YgcC5wYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgcC5wYWdlU2l6ZSA+IDApID8gcC5wYWdlU2l6ZSA6IDIwLFxuICAgIH07XG4gIH1cblxuICBsZXQgcGFnZSA9IDE7XG4gIGxldCBwYWdlU2l6ZSA9IDIwO1xuXG4gIC8vIFN1cHBvcnQgbGltaXQvb2Zmc2V0IHN0eWxlIChjb252ZXJ0IHRvIHBhZ2UvcGFnZVNpemUpXG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBwYXJhbXMubGltaXQgPiAwKSB7XG4gICAgcGFnZVNpemUgPSBwYXJhbXMubGltaXQ7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBwYXJhbXMub2Zmc2V0ID49IDApIHtcbiAgICAgIHBhZ2UgPSBNYXRoLmZsb29yKHBhcmFtcy5vZmZzZXQgLyBwYXJhbXMubGltaXQpICsgMTtcbiAgICB9XG4gIH1cblxuICAvLyBTdXBwb3J0IGZsYXQgcGFnZS9wYWdlU2l6ZSAob3ZlcnJpZGVzIGxpbWl0L29mZnNldCBpZiBib3RoIHByZXNlbnQpXG4gIGlmICh0eXBlb2YgcGFyYW1zLnBhZ2UgPT09ICdudW1iZXInICYmIHBhcmFtcy5wYWdlID4gMCkge1xuICAgIHBhZ2UgPSBwYXJhbXMucGFnZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5wYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgcGFyYW1zLnBhZ2VTaXplID4gMCkge1xuICAgIHBhZ2VTaXplID0gcGFyYW1zLnBhZ2VTaXplO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFnZSwgcGFnZVNpemUgfTtcbn1cblxuLyoqXG4gKiBWYWxpZCBsb2cgY2F0ZWdvcmllcyBhY2NlcHRlZCBieSBMb2dRdWVyeU9wdGlvbnMuXG4gKiBNYXRjaGVzIHRoZSBMb2dDYXRlZ29yeSB1bmlvbiB0eXBlIHBsdXMgdGhlICdhbGwnIHdpbGRjYXJkLlxuICovXG5jb25zdCBWQUxJRF9MT0dfQ0FURUdPUklFUyA9IG5ldyBTZXQoWydhcHBsaWNhdGlvbicsICdzZWN1cml0eScsICdwZXJmb3JtYW5jZScsICd0ZWxlbWV0cnknLCAnYWxsJ10pO1xuXG4vKipcbiAqIFZhbGlkIGxvZyBsZXZlbHMgYWNjZXB0ZWQgYnkgTG9nUXVlcnlPcHRpb25zLlxuICogTWF0Y2hlcyB0aGUgTG9nTGV2ZWwgdW5pb24gdHlwZS5cbiAqL1xuY29uc3QgVkFMSURfTE9HX0xFVkVMUyA9IG5ldyBTZXQoWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSk7XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIHJhdyBwYXJhbXMgaW50byBhIHNhZmUgTG9nUXVlcnlPcHRpb25zIG9iamVjdC5cbiAqIFN0cmlwcyB1bmtub3duIGtleXMsIHZhbGlkYXRlcyB0eXBlcyBvZiBrbm93biBmaWVsZHMsIGFuZCByZXR1cm5zXG4gKiBvbmx5IHdlbGwtdHlwZWQgdmFsdWVzLiBJbnZhbGlkIGZpZWxkcyBhcmUgc2lsZW50bHkgZHJvcHBlZCBzaW5jZVxuICogYWxsIExvZ1F1ZXJ5T3B0aW9ucyBmaWVsZHMgYXJlIG9wdGlvbmFsLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBSYXcgcGFyYW1zIGZyb20gdGhlIE1DUCByZXF1ZXN0XG4gKiBAcmV0dXJucyBWYWxpZGF0ZWQgTG9nUXVlcnlPcHRpb25zIHdpdGggb25seSB2YWxpZCBmaWVsZHNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2dRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTG9nUXVlcnlPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogTG9nUXVlcnlPcHRpb25zID0ge307XG5cbiAgaWYgKHR5cGVvZiBwYXJhbXMuY2F0ZWdvcnkgPT09ICdzdHJpbmcnICYmIFZBTElEX0xPR19DQVRFR09SSUVTLmhhcyhwYXJhbXMuY2F0ZWdvcnkpKSB7XG4gICAgb3B0aW9ucy5jYXRlZ29yeSA9IHBhcmFtcy5jYXRlZ29yeSBhcyBMb2dRdWVyeU9wdGlvbnNbJ2NhdGVnb3J5J107XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGV2ZWwgPT09ICdzdHJpbmcnICYmIFZBTElEX0xPR19MRVZFTFMuaGFzKHBhcmFtcy5sZXZlbCkpIHtcbiAgICBvcHRpb25zLmxldmVsID0gcGFyYW1zLmxldmVsIGFzIExvZ1F1ZXJ5T3B0aW9uc1snbGV2ZWwnXTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zb3VyY2UgPSBwYXJhbXMuc291cmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc2luY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zaW5jZSA9IHBhcmFtcy5zaW5jZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy51bnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnVudGlsID0gcGFyYW1zLnVudGlsO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLmxpbWl0KSkge1xuICAgIG9wdGlvbnMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLm9mZnNldCkpIHtcbiAgICBvcHRpb25zLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLmNvcnJlbGF0aW9uSWQgPSBwYXJhbXMuY29ycmVsYXRpb25JZDtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5jb25zdCBWQUxJRF9NRVRSSUNfVFlQRVMgPSBuZXcgU2V0PE1ldHJpY1R5cGU+KFsnY291bnRlcicsICdnYXVnZScsICdoaXN0b2dyYW0nXSk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWV0cmljUXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IE1ldHJpY1F1ZXJ5T3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IE1ldHJpY1F1ZXJ5T3B0aW9ucyA9IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5uYW1lcykpIHtcbiAgICBvcHRpb25zLm5hbWVzID0gcGFyYW1zLm5hbWVzLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IHR5cGVvZiBuID09PSAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy50eXBlID09PSAnc3RyaW5nJyAmJiBWQUxJRF9NRVRSSUNfVFlQRVMuaGFzKHBhcmFtcy50eXBlIGFzIE1ldHJpY1R5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gcGFyYW1zLnR5cGUgYXMgTWV0cmljVHlwZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zaW5jZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNpbmNlID0gcGFyYW1zLnNpbmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnVudGlsID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMudW50aWwgPSBwYXJhbXMudW50aWw7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGF0ZXN0ID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRpb25zLmxhdGVzdCA9IHBhcmFtcy5sYXRlc3Q7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGltaXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMubGltaXQpKSB7XG4gICAgb3B0aW9ucy5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5vZmZzZXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMub2Zmc2V0KSkge1xuICAgIG9wdGlvbnMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldDtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWZXJpZmljYXRpb24gU2VjdXJpdHkgVXRpbGl0aWVzIChJc3N1ZSAjMTQyIOKAlCBQUiAjNDc4IHJldmlldyBmb2xsb3ctdXBzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogVVVJRCB2NCBmb3JtYXQ6IDgtNC00LTQtMTIgaGV4IGRpZ2l0cyB3aXRoIHZlcnNpb24gNCBtYXJrZXIgYW5kIHZhcmlhbnQgYml0cyAqL1xuY29uc3QgVVVJRF9WNF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tNFswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvaTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgY2hhbGxlbmdlIElEIGlzIGEgdmFsaWQgVVVJRCB2NCBmb3JtYXQuXG4gKiBDaGFsbGVuZ2UgSURzIGFyZSBnZW5lcmF0ZWQgYnkgY3J5cHRvLnJhbmRvbVVVSUQoKSBhbmQgbXVzdCBjb25mb3JtLlxuICogUmVqZWN0cyBvYnZpb3VzbHkgaW52YWxpZCBJRHMgYmVmb3JlIGhpdHRpbmcgdGhlIHN0b3JlIHRvIHByZXZlbnQgZW51bWVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIVVVSURfVjRfUkVHRVgudGVzdChjaGFsbGVuZ2VJZCkpIHtcbiAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICBgSW52YWxpZCBjaGFsbGVuZ2VfaWQgZm9ybWF0LiBFeHBlY3RlZCBVVUlEIHY0IChlLmcuLCBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiKS5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cnVjdHVyZWQgdmVyaWZpY2F0aW9uIGVycm9yIHdpdGggR2F0ZWtlZXBlciBlcnJvciBjb2RlLlxuICogRW5hYmxlcyBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nIGFsaWduZWQgd2l0aCBleGlzdGluZyBHYXRla2VlcGVyIHBhdHRlcm5zLlxuICovXG5jbGFzcyBWZXJpZmljYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdWZXJpZmljYXRpb25FcnJvcic7XG4gIH1cbn1cblxuY29uc3QgREVBRExPQ0tfUkVMSUVGX1JFQVNPTiA9ICdEZWFkbG9jayByZWxpZWYgcmVxdWVzdGVkJztcbmNvbnN0IERFQURMT0NLX1JFTElFRl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IERFQURMT0NLX1JFTElFRl9ESUFMT0dfUkVBU09OID1cbiAgJ0RlYWRsb2NrIHJlbGllZiByZXF1ZXN0ZWQuXFxuXFxuVGhpcyB3aWxsIGRlYWN0aXZhdGUgYWxsIGFjdGl2ZSBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgY2xlYXIgcGVyc2lzdGVkIGFjdGl2YXRpb24gc3RhdGUuJztcblxuLyoqXG4gKiBHbG9iYWwgcmF0ZSBsaW1pdGVyIGZvciB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuXG4gKiBUcmFja3MgZmFpbGVkIGF0dGVtcHRzIHdpdGhpbiBhIHNsaWRpbmcgd2luZG93IHRvIHByZXZlbnQgYnJ1dGUtZm9yY2UgYXR0YWNrcy5cbiAqXG4gKiBEZXNpZ246IFNpbmNlIHZlcmlmaWNhdGlvbiBjb2RlcyBhcmUgb25lLXRpbWUtdXNlIChkZWxldGVkIG9uIGFueSBhdHRlbXB0KSxcbiAqIHRoZSByZWFsIGF0dGFjayB2ZWN0b3IgaXMgcmVwZWF0ZWQgY2hhbGxlbmdlIGNyZWF0aW9uICsgaW1tZWRpYXRlIGF0dGVtcHQuXG4gKiBUaGlzIGxpbWl0ZXIgY2FwcyB0b3RhbCBmYWlsdXJlcyBhY3Jvc3MgYWxsIGNoYWxsZW5nZXMgd2l0aGluIGEgdGltZSB3aW5kb3cuXG4gKi9cbmNsYXNzIFZlcmlmaWNhdGlvblJhdGVMaW1pdGVyIHtcbiAgcHJpdmF0ZSBmYWlsdXJlczogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heEZhaWx1cmVzOiBudW1iZXIgPSAxMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd01zOiBudW1iZXIgPSA2MF8wMDAsXG4gICkge31cblxuICAvKiogUmVjb3JkIGEgZmFpbGVkIHZlcmlmaWNhdGlvbiBhdHRlbXB0LiBSZXR1cm5zIHRydWUgaWYgcmF0ZSBsaW1pdCBpcyBleGNlZWRlZC4gKi9cbiAgcmVjb3JkRmFpbHVyZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuZmFpbHVyZXMucHVzaChub3cpO1xuICAgIHRoaXMucHJ1bmUobm93KTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGggPiB0aGlzLm1heEZhaWx1cmVzO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHJhdGUgbGltaXQgaXMgY3VycmVudGx5IGV4Y2VlZGVkIHdpdGhvdXQgcmVjb3JkaW5nLiAqL1xuICBpc0xpbWl0ZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5wcnVuZShEYXRlLm5vdygpKTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGggPiB0aGlzLm1heEZhaWx1cmVzO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBlbnRyaWVzIG91dHNpZGUgdGhlIHNsaWRpbmcgd2luZG93LiAqL1xuICBwcml2YXRlIHBydW5lKG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3V0b2ZmID0gbm93IC0gdGhpcy53aW5kb3dNcztcbiAgICB3aGlsZSAodGhpcy5mYWlsdXJlcy5sZW5ndGggPiAwICYmIHRoaXMuZmFpbHVyZXNbMF0gPCBjdXRvZmYpIHtcbiAgICAgIHRoaXMuZmFpbHVyZXMuc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3VycmVudCBmYWlsdXJlIGNvdW50IGluIHdpbmRvdyAoZm9yIG1ldHJpY3MpLiAqL1xuICBnZXQgZmFpbHVyZXNJbldpbmRvdygpOiBudW1iZXIge1xuICAgIHRoaXMucHJ1bmUoRGF0ZS5ub3coKSk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJlc2V0IChmb3IgdGVzdGluZykuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZmFpbHVyZXMgPSBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWNhdGlvbiBtZXRyaWNzIHRyYWNrZXIgZm9sbG93aW5nIERhbmdlclpvbmVFbmZvcmNlci5nZXRNZXRyaWNzKCkgcGF0dGVybi5cbiAqIFRyYWNrcyBzdWNjZXNzL2ZhaWx1cmUvZXhwaXJ5IHJhdGVzIGFuZCB0aW1lLXRvLXZlcmlmeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgLyoqIFRvdGFsIHZlcmlmeV9jaGFsbGVuZ2UgY2FsbHMgc2luY2Ugc3RhcnR1cCAqL1xuICB0b3RhbEF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKiBTdWNjZXNzZnVsIHZlcmlmaWNhdGlvbnMgKi9cbiAgdG90YWxTdWNjZXNzZXM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCB2ZXJpZmljYXRpb25zICh3cm9uZyBjb2RlKSAqL1xuICB0b3RhbEZhaWx1cmVzOiBudW1iZXI7XG4gIC8qKiBFeHBpcmVkIGNoYWxsZW5nZSBhdHRlbXB0cyAqL1xuICB0b3RhbEV4cGlyZWQ6IG51bWJlcjtcbiAgLyoqIEludmFsaWQgZm9ybWF0IGF0dGVtcHRzIChyZWplY3RlZCBiZWZvcmUgc3RvcmUgbG9va3VwKSAqL1xuICB0b3RhbEludmFsaWRGb3JtYXQ6IG51bWJlcjtcbiAgLyoqIFJhdGUtbGltaXRlZCBhdHRlbXB0cyAqL1xuICB0b3RhbFJhdGVMaW1pdGVkOiBudW1iZXI7XG4gIC8qKiBBdmVyYWdlIHRpbWUgZnJvbSBjaGFsbGVuZ2UgY3JlYXRpb24gdG8gc3VjY2Vzc2Z1bCB2ZXJpZnkgKG1zKSAqL1xuICBhdmVyYWdlVGltZVRvVmVyaWZ5TXM6IG51bWJlcjtcbiAgLyoqIEN1cnJlbnQgZmFpbHVyZXMgaW4gcmF0ZS1saW1pdCB3aW5kb3cgKi9cbiAgZmFpbHVyZXNJbkN1cnJlbnRXaW5kb3c6IG51bWJlcjtcbn1cblxuY2xhc3MgVmVyaWZpY2F0aW9uTWV0cmljc1RyYWNrZXIge1xuICBwcml2YXRlIF90b3RhbEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxTdWNjZXNzZXMgPSAwO1xuICBwcml2YXRlIF90b3RhbEZhaWx1cmVzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxFeHBpcmVkID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxJbnZhbGlkRm9ybWF0ID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxSYXRlTGltaXRlZCA9IDA7XG4gIHByaXZhdGUgdmVyaWZ5RHVyYXRpb25zOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfRFVSQVRJT05TID0gMTAwMDtcblxuICByZWNvcmRBdHRlbXB0KCk6IHZvaWQgeyB0aGlzLl90b3RhbEF0dGVtcHRzKys7IH1cbiAgcmVjb3JkU3VjY2VzcyhkdXJhdGlvbk1zPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG90YWxTdWNjZXNzZXMrKztcbiAgICBpZiAoZHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkICYmIGR1cmF0aW9uTXMgPj0gMCkge1xuICAgICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMucHVzaChkdXJhdGlvbk1zKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmeUR1cmF0aW9ucy5sZW5ndGggPiBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlci5NQVhfRFVSQVRJT05TKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5RHVyYXRpb25zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlY29yZEZhaWx1cmUoKTogdm9pZCB7IHRoaXMuX3RvdGFsRmFpbHVyZXMrKzsgfVxuICByZWNvcmRFeHBpcmVkKCk6IHZvaWQgeyB0aGlzLl90b3RhbEV4cGlyZWQrKzsgfVxuICByZWNvcmRJbnZhbGlkRm9ybWF0KCk6IHZvaWQgeyB0aGlzLl90b3RhbEludmFsaWRGb3JtYXQrKzsgfVxuICByZWNvcmRSYXRlTGltaXRlZCgpOiB2b2lkIHsgdGhpcy5fdG90YWxSYXRlTGltaXRlZCsrOyB9XG5cbiAgZ2V0TWV0cmljcyhyYXRlTGltaXRlcjogVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIpOiBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgICBjb25zdCBhdmdEdXJhdGlvbiA9IHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gTWF0aC5yb3VuZCh0aGlzLnZlcmlmeUR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aClcbiAgICAgIDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxBdHRlbXB0czogdGhpcy5fdG90YWxBdHRlbXB0cyxcbiAgICAgIHRvdGFsU3VjY2Vzc2VzOiB0aGlzLl90b3RhbFN1Y2Nlc3NlcyxcbiAgICAgIHRvdGFsRmFpbHVyZXM6IHRoaXMuX3RvdGFsRmFpbHVyZXMsXG4gICAgICB0b3RhbEV4cGlyZWQ6IHRoaXMuX3RvdGFsRXhwaXJlZCxcbiAgICAgIHRvdGFsSW52YWxpZEZvcm1hdDogdGhpcy5fdG90YWxJbnZhbGlkRm9ybWF0LFxuICAgICAgdG90YWxSYXRlTGltaXRlZDogdGhpcy5fdG90YWxSYXRlTGltaXRlZCxcbiAgICAgIGF2ZXJhZ2VUaW1lVG9WZXJpZnlNczogYXZnRHVyYXRpb24sXG4gICAgICBmYWlsdXJlc0luQ3VycmVudFdpbmRvdzogcmF0ZUxpbWl0ZXIuZmFpbHVyZXNJbldpbmRvdyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlc2V0IChmb3IgdGVzdGluZykuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3RvdGFsQXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMuX3RvdGFsU3VjY2Vzc2VzID0gMDtcbiAgICB0aGlzLl90b3RhbEZhaWx1cmVzID0gMDtcbiAgICB0aGlzLl90b3RhbEV4cGlyZWQgPSAwO1xuICAgIHRoaXMuX3RvdGFsSW52YWxpZEZvcm1hdCA9IDA7XG4gICAgdGhpcy5fdG90YWxSYXRlTGltaXRlZCA9IDA7XG4gICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMgPSBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXIgcmVnaXN0cnkgaW50ZXJmYWNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEFic3RyYWN0cyB0aGUgY29uY3JldGUgaGFuZGxlciB0eXBlcyBmb3IgYmV0dGVyIHRlc3RhYmlsaXR5IGFuZCBkZWNvdXBsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJSZWdpc3RyeSB7XG4gIGVsZW1lbnRDUlVEOiBFbGVtZW50Q1JVREhhbmRsZXI7XG4gIG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIGFnZW50TWFuYWdlcjogQWdlbnRNYW5hZ2VyO1xuICB0ZW1wbGF0ZVJlbmRlcmVyOiBUZW1wbGF0ZVJlbmRlcmVyO1xuICBlbGVtZW50UXVlcnlTZXJ2aWNlOiBFbGVtZW50UXVlcnlTZXJ2aWNlO1xuICAvLyBNQ1AtQVFMIGV4dGVuc2lvbiBoYW5kbGVycyAoSXNzdWUgIzI0MSlcbiAgY29sbGVjdGlvbkhhbmRsZXI/OiBDb2xsZWN0aW9uSGFuZGxlcjtcbiAgcG9ydGZvbGlvSGFuZGxlcj86IFBvcnRmb2xpb0hhbmRsZXI7XG4gIGF1dGhIYW5kbGVyPzogR2l0SHViQXV0aEhhbmRsZXI7XG4gIGNvbmZpZ0hhbmRsZXI/OiBDb25maWdIYW5kbGVyO1xuICBlbmhhbmNlZEluZGV4SGFuZGxlcj86IEVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICBwZXJzb25hSGFuZGxlcj86IFBlcnNvbmFIYW5kbGVyO1xuICBzeW5jSGFuZGxlcj86IFN5bmNIYW5kbGVyO1xuICBidWlsZEluZm9TZXJ2aWNlPzogQnVpbGRJbmZvU2VydmljZTtcbiAgY2FjaGVNZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGdhdGVrZWVwZXI6IEdhdGVrZWVwZXI7XG4gIC8vIElzc3VlICM0MDI6IERJLWluamVjdGVkIGRhbmdlciB6b25lIGVuZm9yY2VyIChyZXBsYWNlcyBzaW5nbGV0b24gaW1wb3J0KVxuICBkYW5nZXJab25lRW5mb3JjZXI/OiBEYW5nZXJab25lRW5mb3JjZXI7XG4gIC8vIElzc3VlICMxNDI6IFNlcnZlci1zaWRlIHZlcmlmaWNhdGlvbiBzdG9yZSBmb3IgY2hhbGxlbmdlIGNvZGVzXG4gIHZlcmlmaWNhdGlvblN0b3JlPzogVmVyaWZpY2F0aW9uU3RvcmU7XG4gIC8vIElzc3VlICM1MjI6IE5vbi1ibG9ja2luZyBPUyBkaWFsb2cgZm9yIHZlcmlmaWNhdGlvbiBjb2RlcyAocmVwbGFjZXMgcmV0dXJuaW5nIGNvZGUgdG8gTExNKVxuICB2ZXJpZmljYXRpb25Ob3RpZmllcj86IElWZXJpZmljYXRpb25Ob3RpZmllcjtcbiAgLy8gSXNzdWUgIzUyODogTWVtb3J5TG9nU2luayBmb3IgQ1JVREUtcm91dGVkIHF1ZXJ5X2xvZ3NcbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIC8vIE1ldHJpY3M6IE1lbW9yeU1ldHJpY3NTaW5rIGZvciBDUlVERS1yb3V0ZWQgcXVlcnlfbWV0cmljc1xuICBtZXRyaWNzU2luaz86IGltcG9ydCgnLi4vLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpLk1lbW9yeU1ldHJpY3NTaW5rO1xuICAvLyBTZWFyY2ggbWV0cmljczogUGVyZm9ybWFuY2VNb25pdG9yIGZvciByZWNvcmRTZWFyY2goKVxuICBwZXJmb3JtYW5jZU1vbml0b3I/OiBQZXJmb3JtYW5jZU1vbml0b3I7XG4gIC8vIE9wZXJhdGlvbiBtZXRyaWNzOiBPcGVyYXRpb25NZXRyaWNzVHJhY2tlciBmb3IgQ1JVRCBvcGVyYXRpb24gc3RhdHNcbiAgb3BlcmF0aW9uTWV0cmljc1RyYWNrZXI/OiBPcGVyYXRpb25NZXRyaWNzVHJhY2tlcjtcbiAgLy8gR2F0ZWtlZXBlciBtZXRyaWNzOiBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXIgZm9yIHBvbGljeSBlbmZvcmNlbWVudCBzdGF0c1xuICBnYXRla2VlcGVyTWV0cmljc1RyYWNrZXI/OiBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXI7XG59XG5cbi8qKlxuICogRXhwb3J0IHBhY2thZ2Ugc3RydWN0dXJlIGZvciBlbGVtZW50IGltcG9ydC9leHBvcnQgb3BlcmF0aW9uc1xuICovXG5pbnRlcmZhY2UgRXhwb3J0UGFja2FnZSB7XG4gIGV4cG9ydFZlcnNpb246IHN0cmluZztcbiAgZXhwb3J0ZWRBdDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogc3RyaW5nO1xuICBlbGVtZW50TmFtZT86IHN0cmluZztcbiAgZm9ybWF0OiAnanNvbicgfCAneWFtbCc7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBNQ1BBUUxIYW5kbGVyIC0gVW5pZmllZCBlbnRyeSBwb2ludCBmb3IgYWxsIE1DUC1BUUwgb3BlcmF0aW9uc1xuICpcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSB0aGluIHJlc29sdmVyIHBhdHRlcm46XG4gKiAxLiBWYWxpZGF0ZXMgdGhhdCBvcGVyYXRpb25zIGFyZSBjYWxsZWQgdmlhIGNvcnJlY3QgQ1JVRCBlbmRwb2ludHNcbiAqIDIuIFJvdXRlcyBvcGVyYXRpb25zIHRvIHRoZWlyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICogMy4gRGlzcGF0Y2hlcyB0byBhY3R1YWwgaGFuZGxlciBtZXRob2RzXG4gKiA0LiBSZXR1cm5zIHN0YW5kYXJkaXplZCBPcGVyYXRpb25SZXN1bHRcbiAqXG4gKiBERVNJR04gUkFUSU9OQUxFOlxuICogLSBTaW5nbGUgUmVzcG9uc2liaWxpdHk6IE9ubHkgb3JjaGVzdHJhdGVzLCBkZWxlZ2F0ZXMgYWN0dWFsIHdvcmtcbiAqIC0gRGVwZW5kZW5jeSBJbnZlcnNpb246IERlcGVuZHMgb24gSGFuZGxlclJlZ2lzdHJ5IGludGVyZmFjZVxuICogLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IEhhbmRsZXJSZWdpc3RyeSBleHBvc2VzIG9ubHkgd2hhdCdzIG5lZWRlZFxuICogLSBPcGVuL0Nsb3NlZDogTmV3IG9wZXJhdGlvbnMgYWRkZWQgdG8gcm91dGVyLCBub3QgdGhpcyBjbGFzc1xuICovXG4vKipcbiAqIE1pbmltYWwgaW50ZXJmYWNlIGZvciBjb3JyZWxhdGlvbiBJRCByZXRyaWV2YWwuXG4gKiBLZWVwcyBjb3VwbGluZyBsb29zZSDigJQgb25seSByZXF1aXJlcyB3aGF0IE1DUEFRTEhhbmRsZXIgYWN0dWFsbHkgbmVlZHMuXG4gKiBJc3N1ZSAjMzAxOiBSZXF1ZXN0IGNvcnJlbGF0aW9uIHN1cHBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ycmVsYXRpb25JZFByb3ZpZGVyIHtcbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNQ1BBUUxIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXRla2VlcGVyOiBHYXRla2VlcGVyO1xuICAvKipcbiAgICogSXNzdWUgIzY1NjogUGVyLW1lbW9yeSBzYXZlIGRlYm91bmNlIHRpbWVycy5cbiAgICogV2hlbiBhZGRFbnRyeSBpcyBjYWxsZWQgcmFwaWRseSwgd2UgY29hbGVzY2Ugc2F2ZXMg4oCUIG9ubHkgdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBpcyB3cml0dGVuIHRvIGRpc2sgYWZ0ZXIgdGhlIGRlYm91bmNlIHdpbmRvdyBleHBpcmVzLlxuICAgKiBLZXk6IG5vcm1hbGl6ZWQgbWVtb3J5IG5hbWUsIFZhbHVlOiB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nU2F2ZXMgPSBuZXcgTWFwPHN0cmluZywge1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5O1xuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIH0+KCk7XG4gIC8qKiBJc3N1ZSAjNjU2OiBEZWJvdW5jZSBtZXRyaWNzIOKAlCB0cmFja3Mgc2F2ZXMgY29hbGVzY2VkIHZzIGFjdHVhbGx5IHdyaXR0ZW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VNZXRyaWNzID0geyBjb2FsZXNjZWQ6IDAsIHdyaXR0ZW46IDAgfTtcbiAgLyoqXG4gICAqIElzc3VlICMyMzI5OiBNZW1vcmllcyB3aG9zZSBtb3N0IHJlY2VudCBzYXZlIGF0dGVtcHQgZmFpbGVkLlxuICAgKiBLZXk6IG5vcm1hbGl6ZWQgbWVtb3J5IG5hbWUgKG1lbW9yeVNhdmVLZXkpLiBIb2xkcyB0aGUgZmFpbGluZyBNZW1vcnlcbiAgICogaW5zdGFuY2UgYW5kIGl0cyBtYW5hZ2VyIOKAlCB0aGUgdW5wZXJzaXN0ZWQgZW50cmllcyBleGlzdCBvbmx5IGluIHRoYXRcbiAgICogaW5zdGFuY2UsIHNvIHJlY292ZXJ5IG11c3QgcmV0cnkgaXQgKGEgZnJlc2hseSBsb2FkZWQgaW5zdGFuY2Ugd291bGQgbGFja1xuICAgKiB0aGVtKSwgYW5kIGhvbGRpbmcgdGhlIHJlZmVyZW5jZSBrZWVwcyBpdCBhbGl2ZSBhY3Jvc3MgY2FjaGUgZXZpY3Rpb24uXG4gICAqIFRoZSBuZXh0IGFkZEVudHJ5IHJldHJpZXMgdGhlIHNhdmUgc3luY2hyb25vdXNseSBhbmQgcmVwb3J0cyB0aGUgZXJyb3IgdG9cbiAgICogdGhlIGNhbGxlciBpbnN0ZWFkIG9mIHNpbGVudGx5IGFjY2VwdGluZyBtb3JlIGVudHJpZXM7IGRpc3Bvc2UoKSBmbHVzaGVzXG4gICAqIHRoZXNlIGFzIGEgbGFzdCByZXNvcnQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZhaWxlZE1lbW9yeVNhdmVzID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICBlcnJvcjogRXJyb3I7XG4gICAgbWVtb3J5OiBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcycpLk1lbW9yeTtcbiAgICBtYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyO1xuICB9PigpO1xuICAvKipcbiAgICogSXNzdWUgIzIzMjk6IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBzYXZlLWF0dGVtcHQgY291bnRlciBwZXIgbWVtb3J5IGtleS5cbiAgICogR3VhcmRzIHRoZSBmYWlsdXJlIGxlZGdlciBhZ2FpbnN0IHJlb3JkZXJpbmc6IGFuIG9sZGVyIGluLWZsaWdodCBzYXZlIHRoYXRcbiAgICogcmVzb2x2ZXMgYWZ0ZXIgYSBuZXdlciBvbmUgc3RhcnRlZCBtdXN0IG5vdCBvdmVyd3JpdGUgdGhlIG5ld2VyIGF0dGVtcHQnc1xuICAgKiBvdXRjb21lLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlTYXZlQXR0ZW1wdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKipcbiAgICogSXNzdWUgIzY1NzogUGVyLW1lbW9yeSBzYXZlIGZyZXF1ZW5jeSB0cmFja2VyLlxuICAgKiBTbGlkaW5nIHdpbmRvdyBjb3VudGVyOiB0cmFja3MgYWRkRW50cnkgY2FsbHMgcGVyIG1lbW9yeSB3aXRoaW4gdGhlIG1vbml0b3Igd2luZG93LlxuICAgKiBMb2dzIHdhcm5pbmdzIGF0IGNvbmZpZ3VyYWJsZSB0aHJlc2hvbGRzIHRvIGNhdGNoIHJ1bmF3YXkgbG9vcHMgZWFybHkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVGcmVxdWVuY3lDb3VudGVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IHRpbWVzdGFtcHM6IG51bWJlcltdOyB3YXJuZWQ6IGJvb2xlYW47IGNyaXRpY2FsOiBib29sZWFuIH0+KCk7XG4gIC8qKiBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXRlciBmb3IgcGVybWlzc2lvbl9wcm9tcHQgZXZhbHVhdGlvbnMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyID0gUmF0ZUxpbWl0ZXJGYWN0b3J5LmNyZWF0ZVBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyKFxuICAgIGVudi5ET0xMSE9VU0VfUEVSTUlTU0lPTl9QUk9NUFRfUkFURV9MSU1JVCwgZW52LkRPTExIT1VTRV9QRVJNSVNTSU9OX1JBVEVfV0lORE9XX01TXG4gICk7XG4gIC8qKiBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXRlciBmb3IgQ0xJIGFwcHJvdmFsIHJlY29yZCBjcmVhdGlvbiAoY29uZmlndXJhYmxlIHZpYSBlbnYpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpQXBwcm92YWxMaW1pdGVyID0gUmF0ZUxpbWl0ZXJGYWN0b3J5LmNyZWF0ZUNsaUFwcHJvdmFsTGltaXRlcihcbiAgICBlbnYuRE9MTEhPVVNFX0NMSV9BUFBST1ZBTF9SQVRFX0xJTUlULCBlbnYuRE9MTEhPVVNFX1BFUk1JU1NJT05fUkFURV9XSU5ET1dfTVNcbiAgKTtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgc3RhbmRhcmRpemVkIHJhdGUtbGltaXQgZGVueSByZXNwb25zZSBmb3IgcGVybWlzc2lvbl9wcm9tcHQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmF0ZUxpbWl0RGVueShcbiAgICBsaW1pdGVyTmFtZTogc3RyaW5nLFxuICAgIHRvb2xOYW1lOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBpbXBvcnQoJy4uLy4uL3V0aWxzL1JhdGVMaW1pdGVyLmpzJykuUmF0ZUxpbWl0U3RhdHVzLFxuICAgIHJpc2tMZXZlbCA9ICdibG9ja2VkJyxcbiAgICByZWFzb24gPSAnUmF0ZSBsaW1pdCBleGNlZWRlZCcsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIucGVybWlzc2lvblByb21wdCcsXG4gICAgICBkZXRhaWxzOiBgJHtsaW1pdGVyTmFtZX0gcmF0ZSBsaW1pdCBleGNlZWRlZCBmb3IgJHt0b29sTmFtZX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIGxpbWl0ZXI6IGxpbWl0ZXJOYW1lLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2Vuczogc3RhdHVzLnJlbWFpbmluZ1Rva2VucyxcbiAgICAgICAgcmVzZXRUaW1lOiBzdGF0dXMucmVzZXRUaW1lLnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgbWVzc2FnZTogYFJhdGUgbGltaXQgZXhjZWVkZWQgZm9yICR7bGltaXRlck5hbWV9LiBSZXRyeSBhZnRlciAke3N0YXR1cy5yZXRyeUFmdGVyTXN9bXMuYCxcbiAgICAgIGNsYXNzaWZpY2F0aW9uOiB7IHJpc2tMZXZlbCwgcmVhc29uLCBzdGFnZTogJ3JhdGVfbGltaXQnIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBJc3N1ZSAjMTQyOiBSYXRlIGxpbWl0ZXIgZm9yIHZlcmlmeV9jaGFsbGVuZ2UgYXR0ZW1wdHMgKG1heCAxMCBmYWlsdXJlcyBwZXIgNjBzIHdpbmRvdykgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZmljYXRpb25SYXRlTGltaXRlciA9IG5ldyBWZXJpZmljYXRpb25SYXRlTGltaXRlcigpO1xuICAvKiogSXNzdWUgIzE0MjogTWV0cmljcyB0cmFja2VyIGZvciB2ZXJpZmljYXRpb24gb3BlcmF0aW9ucyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmaWNhdGlvbk1ldHJpY3MgPSBuZXcgVmVyaWZpY2F0aW9uTWV0cmljc1RyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFRyYWNrcyBhZ2VudHMgY3VycmVudGx5IGluIGFuIGV4ZWN1dGlvbiBsb29wIGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudC5cbiAgICpcbiAgICogKipMaWZlY3ljbGU6KiogRW50cmllcyBhcmUgYWRkZWQgaW4gYGRpc3BhdGNoRXhlY3V0ZSgpYCBvbiBgZXhlY3V0ZV9hZ2VudGAgYW5kXG4gICAqIHJlbW92ZWQgb24gYGNvbXBsZXRlX2V4ZWN1dGlvbmAuIE9ubHkgYWdlbnRzIHdpdGggYSBnYXRla2VlcGVyIHBvbGljeSAoZXhwbGljaXRcbiAgICogb3Igc3ludGhlc2l6ZWQgZnJvbSBgdG9vbHNgIGNvbmZpZykgYXJlIHRyYWNrZWQuXG4gICAqXG4gICAqICoqUG9saWN5IHJlc29sdXRpb246KiogRW50cmllcyBhcmUgaW5jbHVkZWQgaW4gYGdldEFjdGl2ZUVsZW1lbnRzKClgIHNvIHRoZVxuICAgKiBHYXRla2VlcGVyIGV2YWx1YXRlcyBhZ2VudCBwb2xpY2llcyBhbG9uZ3NpZGUgcGVyc29uYS9za2lsbC9lbnNlbWJsZSBwb2xpY2llcy5cbiAgICogVGhlIHN0YW5kYXJkIHByaW9yaXR5IGFwcGxpZXM6IGRlbnkgPiBzY29wZV9yZXN0cmljdGlvbiA+IGNvbmZpcm0gPiBhbGxvdy5cbiAgICpcbiAgICogKipNZW1vcnkgc2FmZXR5OioqIFRoZSBNYXAgaXMgYm91bmRlZCBieSBjb25jdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cy4gSWYgYVxuICAgKiBzZXNzaW9uIGVuZHMgd2l0aG91dCBgY29tcGxldGVfZXhlY3V0aW9uYCwgdGhlIE1hcCBpcyBnYXJiYWdlIGNvbGxlY3RlZCB3aXRoXG4gICAqIHRoZSBNQ1BBUUxIYW5kbGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBJc3N1ZSAjNDQ5XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGluZ0FnZW50cyA9IG5ldyBNYXA8c3RyaW5nLCB7XG4gICAgLyoqIEFnZW50IGVsZW1lbnQgbmFtZSAobWF0Y2hlcyB0aGUgTWFwIGtleSkgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIE1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIHJlc29sdmVkIGdhdGVrZWVwZXIgcG9saWN5ICovXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8qKiBUaW1lc3RhbXAgd2hlbiBleGVjdXRpb24gc3RhcnRlZCAoZm9yIGRpYWdub3N0aWNzKSAqL1xuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBudW1iZXIgb2YgYXV0by1jb250aW51YXRpb25zIHBlcmZvcm1lZCAoSXNzdWUgIzUyNikgKi9cbiAgICBjb250aW51YXRpb25Db3VudDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBudW1iZXIgb2YgcmV0cmllcyBmb3IgdGhlIGN1cnJlbnQgc3RlcCAoSXNzdWUgIzUyNikgKi9cbiAgICByZXRyeUNvdW50OiBudW1iZXI7XG4gICAgLyoqIFJlc2lsaWVuY2UgdHJhY2tpbmc6IG9yaWdpbmFsIHBhcmFtZXRlcnMgZnJvbSBleGVjdXRlX2FnZW50IChJc3N1ZSAjNTI2KSAqL1xuICAgIG9yaWdpbmFsUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiByZXNvbHZlZCBwb2xpY3kgZnJvbSBhZ2VudCBtZXRhZGF0YSAoSXNzdWUgIzUyNikgKi9cbiAgICByZXNpbGllbmNlUG9saWN5PzogQWdlbnRSZXNpbGllbmNlUG9saWN5O1xuICAgIC8qKiBSZWNlbnQgZ2F0ZWtlZXBlciBibG9ja3MgZHVyaW5nIHRoaXMgYWdlbnQncyBleGVjdXRpb24gKEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW0pICovXG4gICAgcmVjZW50QmxvY2tzOiBBcnJheTx7XG4gICAgICBvcGVyYXRpb246IHN0cmluZztcbiAgICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nO1xuICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAvKiogUGVybWlzc2lvbiBsZXZlbCB0aGF0IGNhdXNlZCB0aGUgYmxvY2sgKERFTlksIENPTkZJUk1fU0VTU0lPTiwgQ09ORklSTV9TSU5HTEVfVVNFKSAqL1xuICAgICAgbGV2ZWw6IHN0cmluZztcbiAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgLyoqIFdoZXRoZXIgdGhpcyBibG9jayBoYXMgYmVlbiByZXBvcnRlZCBpbiBhIG5vdGlmaWNhdGlvbiAqL1xuICAgICAgcmVwb3J0ZWQ6IGJvb2xlYW47XG4gICAgfT47XG4gIH0+KCk7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBhYm9ydGVkIGdvYWxJZHMuIE9uY2UgYSBnb2FsSWQgaXMgYWJvcnRlZCwgYWxsIGZ1cnRoZXIgZXhlY3V0aW9uXG4gICAqIG9wZXJhdGlvbnMgKHJlY29yZF9leGVjdXRpb25fc3RlcCwgY29tcGxldGVfZXhlY3V0aW9uLCBjb250aW51ZV9leGVjdXRpb24pXG4gICAqIGZvciB0aGF0IGdvYWxJZCBhcmUgcmVqZWN0ZWQgYXQgdGhlIGRpc3BhdGNoIGxheWVyLlxuICAgKlxuICAgKiBJc3N1ZSAjMjQ5OiBBYm9ydC9jYW5jZWxsYXRpb24gaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0ZWRHb2FscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRUcmFja2VyPzogQ29ycmVsYXRpb25JZFByb3ZpZGVyLFxuICApIHtcbiAgICAvLyBJbml0aWFsaXplIG5vcm1hbGl6ZXJzIGZvciBzY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpXG4gICAgaW5pdGlhbGl6ZU5vcm1hbGl6ZXJzKCk7XG4gICAgLy8gSXNzdWUgIzQ1MjogU3RvcmUgR2F0ZWtlZXBlciBpbnN0YW5jZSBmb3IgcG9saWN5IGVuZm9yY2VtZW50XG4gICAgaWYgKCFoYW5kbGVycy5nYXRla2VlcGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dhdGVrZWVwZXIgaW5zdGFuY2UgaXMgcmVxdWlyZWQgaW4gSGFuZGxlclJlZ2lzdHJ5LiBQcm92aWRlIG9uZSB2aWEgdGhlIERJIGNvbnRhaW5lci4nKTtcbiAgICB9XG4gICAgdGhpcy5nYXRla2VlcGVyID0gaGFuZGxlcnMuZ2F0ZWtlZXBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmVyaWZpY2F0aW9uIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcvZGlhZ25vc3RpY3MuXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBEYW5nZXJab25lRW5mb3JjZXIuZ2V0TWV0cmljcygpLlxuICAgKi9cbiAgZ2V0VmVyaWZpY2F0aW9uTWV0cmljcygpOiBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgICByZXR1cm4gdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLmdldE1ldHJpY3ModGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1dG9ub215IGV2YWx1YXRpb24gbWV0cmljcyBmb3IgbW9uaXRvcmluZy9kaWFnbm9zdGljcy5cbiAgICogSXNzdWUgIzM5MTogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIGdldFZlcmlmaWNhdGlvbk1ldHJpY3MoKS5cbiAgICovXG4gIGdldEF1dG9ub215TWV0cmljcygpOiBBdXRvbm9teU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgcmV0dXJuIGdldEF1dG9ub215TWV0cmljcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdhdGhlciBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzIGZvciBHYXRla2VlcGVyIHBvbGljeSBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBRdWVyaWVzIFBlcnNvbmFNYW5hZ2VyLCBTa2lsbE1hbmFnZXIsIGFuZCBFbnNlbWJsZU1hbmFnZXIgZm9yIGFjdGl2ZSBlbGVtZW50cyxcbiAgICogdGhlbiBhcHBlbmRzIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cyB3aXRoIGdhdGVrZWVwZXIgcG9saWNpZXMuIEFsbFxuICAgKiBlbGVtZW50cyBhcmUgbWFwcGVkIHRvIHRoZSB7QGxpbmsgQWN0aXZlRWxlbWVudH0gaW50ZXJmYWNlIGV4cGVjdGVkIGJ5XG4gICAqIGBHYXRla2VlcGVyLmVuZm9yY2UoKWAuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGVsZW1lbnQgY29udGV4dCBmb3IgTGF5ZXIgMiAoZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbikuXG4gICAqIElzc3VlICM0NDk6IEluY2x1ZGVzIGV4ZWN1dGluZyBhZ2VudHMgYWxvbmdzaWRlIHBlcnNvbmFzL3NraWxscy9lbnNlbWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGFjdGl2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIGdhdGVrZWVwZXIgcG9saWNpZXMsIG9yIGVtcHR5XG4gICAqICAgICAgICAgIGFycmF5IGlmIGdhdGhlcmluZyBmYWlscyAoZmFpbC1vcGVuOiBvbmx5IHJvdXRlIHBvbGljaWVzIGFwcGx5KS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHMoc2Vzc2lvbklkPzogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVFbGVtZW50W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3RWxlbWVudHMgPSBzZXNzaW9uSWRcbiAgICAgICAgPyBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldFBvbGljeUVsZW1lbnRzRm9yUmVwb3J0KHNlc3Npb25JZClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdID0gcmF3RWxlbWVudHMubWFwKChlbCkgPT4gKHtcbiAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAoZWwubWV0YWRhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZ2F0ZWtlZXBlcjogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXIgYXMgQWN0aXZlRWxlbWVudFsnbWV0YWRhdGEnXVsnZ2F0ZWtlZXBlciddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi50aGlzLmNvcHlHYXRla2VlcGVyRGlhZ25vc3RpY3MoZWwubWV0YWRhdGEpLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBJc3N1ZSAjNDQ5OiBJbmNsdWRlIGV4ZWN1dGluZyBhZ2VudHMgd2l0aCBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFssIGFnZW50RW50cnldIG9mIHRoaXMuZXhlY3V0aW5nQWdlbnRzKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWdlbnQnLFxuICAgICAgICAgICAgbmFtZTogYWdlbnRFbnRyeS5uYW1lLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnRFbnRyeS5uYW1lLFxuICAgICAgICAgICAgICBnYXRla2VlcGVyOiBhZ2VudEVudHJ5Lm1ldGFkYXRhLmdhdGVrZWVwZXIgYXMgQWN0aXZlRWxlbWVudFsnbWV0YWRhdGEnXVsnZ2F0ZWtlZXBlciddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWN0aXZlRWxlbWVudHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgb3BlbiDigJQgaWYgd2UgY2FuJ3QgZ2F0aGVyIGFjdGl2ZSBlbGVtZW50cywgZW5mb3JjZSB3aXRob3V0IHRoZW1cbiAgICAgIC8vIFRoaXMgbWVhbnMgb25seSByb3V0ZSB2YWxpZGF0aW9uIGFuZCBkZWZhdWx0IHBvbGljaWVzIHdpbGwgYXBwbHlcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBlbGVtZW50cyBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IsIHNlc3Npb25JZCB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFBvbGljeVJlcG9ydEVsZW1lbnRzKHNlc3Npb25JZD86IHN0cmluZyk6IFByb21pc2U8QWN0aXZlRWxlbWVudFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQpO1xuICAgICAgcmV0dXJuIHJhd0VsZW1lbnRzLm1hcCgoZWwpID0+ICh7XG4gICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogKGVsLm1ldGFkYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGdhdGVrZWVwZXI6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIEFjdGl2ZUVsZW1lbnRbJ21ldGFkYXRhJ11bJ2dhdGVrZWVwZXInXSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgLi4udGhpcy5jb3B5R2F0ZWtlZXBlckRpYWdub3N0aWNzKGVsLm1ldGFkYXRhKSxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheSgoZWwgYXMgeyBzZXNzaW9uSWRzPzogc3RyaW5nW10gfSkuc2Vzc2lvbklkcylcbiAgICAgICAgICAgID8geyBzZXNzaW9uSWRzOiAoZWwgYXMgeyBzZXNzaW9uSWRzPzogc3RyaW5nW10gfSkuc2Vzc2lvbklkcyB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgcG9saWN5IGVsZW1lbnRzIGZvciBkYXNoYm9hcmQgcmVwb3J0aW5nJywgeyBlcnJvciwgc2Vzc2lvbklkIH0pO1xuICAgICAgcmV0dXJuIHNlc3Npb25JZCA/IFtdIDogdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29weUdhdGVrZWVwZXJEaWFnbm9zdGljcyhtZXRhZGF0YTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IGdldEdhdGVrZWVwZXJEaWFnbm9zdGljcyhtZXRhZGF0YSk7XG4gICAgcmV0dXJuIGRpYWdub3N0aWNzID8geyBnYXRla2VlcGVyRGlhZ25vc3RpY3M6IGRpYWdub3N0aWNzIH0gOiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgQ1JFQVRFIG9wZXJhdGlvbnMgKGFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUpXG4gICAqXG4gICAqIENSRUFURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGNyZWF0ZV9lbGVtZW50OiBDcmVhdGUgbmV3IGVsZW1lbnRzXG4gICAqIC0gaW1wb3J0X2VsZW1lbnQ6IEltcG9ydCBlbGVtZW50cyBmcm9tIGV4cG9ydGVkIGRhdGFcbiAgICogLSBhZGRFbnRyeTogQWRkIGVudHJpZXMgdG8gbWVtb3J5IGVsZW1lbnRzXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ0NSRUFURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnQ1JFQVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIFJFQUQgb3BlcmF0aW9ucyAocmVhZC1vbmx5LCBzYWZlKVxuICAgKlxuICAgKiBSRUFEIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gbGlzdF9lbGVtZW50czogTGlzdCBlbGVtZW50cyB3aXRoIGZpbHRlcmluZ1xuICAgKiAtIGdldF9lbGVtZW50OiBHZXQgZWxlbWVudCBieSBuYW1lXG4gICAqIC0gZ2V0X2VsZW1lbnRfZGV0YWlsczogR2V0IGRldGFpbGVkIGVsZW1lbnQgaW5mb3JtYXRpb25cbiAgICogLSBzZWFyY2hfZWxlbWVudHM6IEZ1bGwtdGV4dCBzZWFyY2hcbiAgICogLSBxdWVyeV9lbGVtZW50czogUXVlcnkgd2l0aCBwYWdpbmF0aW9uXG4gICAqIC0gZ2V0X2FjdGl2ZV9lbGVtZW50czogR2V0IGFjdGl2ZSBlbGVtZW50c1xuICAgKiAtIHZhbGlkYXRlX2VsZW1lbnQ6IFZhbGlkYXRlIGVsZW1lbnRcbiAgICogLSByZW5kZXI6IFJlbmRlciB0ZW1wbGF0ZVxuICAgKiAtIGV4cG9ydF9lbGVtZW50OiBFeHBvcnQgZWxlbWVudFxuICAgKiAtIGFjdGl2YXRlX2VsZW1lbnQ6IEFjdGl2YXRlIGVsZW1lbnRzIGZvciB1c2VcbiAgICogLSBkZWFjdGl2YXRlX2VsZW1lbnQ6IERlYWN0aXZhdGUgZWxlbWVudFxuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZVJlYWQoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnUkVBRCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnUkVBRCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVUERBVEUgb3BlcmF0aW9ucyAobW9kaWZ5aW5nIGV4aXN0aW5nIHN0YXRlKVxuICAgKlxuICAgKiBVUERBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBlZGl0X2VsZW1lbnQ6IE1vZGlmeSBleGlzdGluZyBlbGVtZW50c1xuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZVVwZGF0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdVUERBVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ1VQREFURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBERUxFVEUgb3BlcmF0aW9ucyAoZGVzdHJ1Y3RpdmUgYWN0aW9ucylcbiAgICpcbiAgICogREVMRVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gZGVsZXRlX2VsZW1lbnQ6IERlbGV0ZSBlbGVtZW50c1xuICAgKiAtIGNsZWFyOiBDbGVhciBtZW1vcnkgZW50cmllc1xuICAgKiAtIGNsZWFyX2dpdGh1Yl9hdXRoOiBSZW1vdmUgR2l0SHViIGF1dGhlbnRpY2F0aW9uXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlRGVsZXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ0RFTEVURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnREVMRVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEVYRUNVVEUgb3BlcmF0aW9ucyAocnVudGltZSBleGVjdXRpb24gbGlmZWN5Y2xlKVxuICAgKlxuICAgKiBFWEVDVVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gZXhlY3V0ZV9hZ2VudDogU3RhcnQgZXhlY3V0aW9uIG9mIGFuIGFnZW50IG9yIGV4ZWN1dGFibGUgZWxlbWVudFxuICAgKiAtIGdldF9leGVjdXRpb25fc3RhdGU6IFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAqIC0gcmVjb3JkX2V4ZWN1dGlvbl9zdGVwOiBSZWNvcmQgZXhlY3V0aW9uIHByb2dyZXNzIG9yIGZpbmRpbmdzXG4gICAqIC0gY29tcGxldGVfZXhlY3V0aW9uOiBTaWduYWwgZXhlY3V0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseVxuICAgKiAtIGNvbnRpbnVlX2V4ZWN1dGlvbjogUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIHNhdmVkIHN0YXRlXG4gICAqIC0gYWJvcnRfZXhlY3V0aW9uOiBDYW5jZWwgYW4gb25nb2luZyBleGVjdXRpb25cbiAgICpcbiAgICogVW5saWtlIENSVUQgb3BlcmF0aW9ucyAod2hpY2ggYXJlIGlkZW1wb3RlbnQpLCBFWEVDVVRFIG9wZXJhdGlvbnMgbWFuYWdlXG4gICAqIHJ1bnRpbWUgc3RhdGUgYW5kIGFyZSBpbmhlcmVudGx5IG5vbi1pZGVtcG90ZW50LiBDYWxsaW5nIGV4ZWN1dGUgdHdpY2VcbiAgICogY3JlYXRlcyB0d28gc2VwYXJhdGUgZXhlY3V0aW9ucy5cbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVFeGVjdXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ0VYRUNVVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ0VYRUNVVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIGV4ZWN1dGlvbiBsb2dpYyBzaGFyZWQgYnkgYWxsIENSVUQgZW5kcG9pbnRzLlxuICAgKiBJbXBsZW1lbnRzIHRoZSB0aGluIHJlc29sdmVyIHBhdHRlcm46IHZhbGlkYXRlIOKGkiByb3V0ZSDihpIgZGlzcGF0Y2gg4oaSIHJldHVybi5cbiAgICpcbiAgICogT1BFUkFUSU9OIEZMT1c6XG4gICAqIDEuIFZhbGlkYXRlIGlucHV0IHN0cnVjdHVyZVxuICAgKiAyLiBWYWxpZGF0ZSBwZXJtaXNzaW9ucyAoUGVybWlzc2lvbkd1YXJkKVxuICAgKiAzLiBSb3V0ZSBvcGVyYXRpb24gKE9wZXJhdGlvblJvdXRlcilcbiAgICogNC4gRGlzcGF0Y2ggdG8gaGFuZGxlclxuICAgKiA1LiBSZXR1cm4gc3RhbmRhcmRpemVkIHJlc3VsdFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBSYXcgaW5wdXQgdG8gdmFsaWRhdGUgYW5kIHByb2Nlc3NcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQ1JVRCBlbmRwb2ludCBiZWluZyBjYWxsZWRcbiAgICogQHJldHVybnMgU3RhbmRhcmRpemVkIE9wZXJhdGlvblJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlT3BlcmF0aW9uKFxuICAgIGlucHV0OiB1bmtub3duLFxuICAgIGVuZHBvaW50OiBDUlVERW5kcG9pbnRcbiAgKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICAvLyBJc3N1ZSAjMzAxOiBDYXB0dXJlIHN0YXJ0IHRpbWUgZm9yIHJlc3BvbnNlIHRpbWluZyBtZXRhZGF0YVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgLy8gU3RlcCAxOiBQYXJzZSBhbmQgbm9ybWFsaXplIGlucHV0IChoYW5kbGVzIGJvdGggcHJvcGVyIGFuZCBsZWdhY3kgZm9ybWF0cylcbiAgICAvLyBJc3N1ZSAjMjA1OiBTaWxlbnQgSlNPTiBmYWxsYmFjayBmb3IgZWRnZSBjYXNlc1xuICAgIGNvbnN0IHBhcnNlZElucHV0ID0gcGFyc2VPcGVyYXRpb25JbnB1dChpbnB1dCk7XG5cbiAgICAvLyBFeHRyYWN0IG9wZXJhdGlvbiBuYW1lIGZvciBsb2dnaW5nXG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IHBhcnNlZElucHV0Py5vcGVyYXRpb24gPz8gJ3Vua25vd24nO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIHBhcnNpbmcgc3VjY2VlZGVkXG4gICAgICBpZiAoIXBhcnNlZElucHV0KSB7XG4gICAgICAgIC8vIFByb3ZpZGUgc3BlY2lmaWMgZGlhZ25vc3RpY3MgZGVwZW5kaW5nIG9uIHdoYXQgd2VudCB3cm9uZ1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljID0gZGVzY3JpYmVJbnZhbGlkSW5wdXQoaW5wdXQpO1xuICAgICAgICBjb25zdCBoYXNPcGVyYXRpb24gPSBpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiAoaW5wdXQgYXMgYW55KS5vcGVyYXRpb24gPT09ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCBoaW50ID0gaGFzT3BlcmF0aW9uXG4gICAgICAgICAgPyAnVGhlIGlucHV0IHN0cnVjdHVyZSBsb29rcyBjb3JyZWN0IGJ1dCB2YWxpZGF0aW9uIGZhaWxlZC4gSWYgY29udGVudCBjb250YWlucyBtYXJrZG93biBvciBzcGVjaWFsIGNoYXJhY3RlcnMsIGVuc3VyZSB0aGUgSlNPTiBpcyBwcm9wZXJseSBlc2NhcGVkLidcbiAgICAgICAgICA6ICdVc2UgZm9ybWF0OiB7IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIHBhcmFtczogeyB0eXBlOiBcInBlcnNvbmFzXCIgfSB9JztcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShcbiAgICAgICAgICBgSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgT3BlcmF0aW9uSW5wdXQgd2l0aCBcIm9wZXJhdGlvblwiIGFuZCBvcHRpb25hbCBcInBhcmFtc1wiLiAke2RpYWdub3N0aWN9LiAke2hpbnR9YCxcbiAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IHBhcnNlZElucHV0O1xuXG4gICAgICAvLyBTdGVwIDI6IEVuZm9yY2UgR2F0ZWtlZXBlciBwb2xpY3kgKElzc3VlICM0NTIpXG4gICAgICBpZiAoZW52LkRPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQpIHtcbiAgICAgICAgLy8gRnVsbCA0LWxheWVyIGNoZWNrOiByb3V0ZSB2YWxpZGF0aW9uIOKGkiBlbGVtZW50IHBvbGljaWVzIOKGkiBzZXNzaW9uIGNvbmZpcm1hdGlvbnMg4oaSIGRlZmF1bHRzXG4gICAgICAgIC8vIElzc3VlICM3NTg6IEdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyAoY29uZmlybV9vcGVyYXRpb24sIHZlcmlmeV9jaGFsbGVuZ2UsIGV0Yy4pXG4gICAgICAgIC8vIHNraXAgZWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvbiBpbiB0aGUgcHJpbWFyeSBlbmZvcmNlbWVudCBwYXRoIHRvIHByZXZlbnQgY2FzY2FkaW5nXG4gICAgICAgIC8vIGNvbmZpcm1hdGlvbiBsb29wcy4gRWxlbWVudCBwb2xpY2llcyBmb3IgdGhlIFRBUkdFVCBvcGVyYXRpb24gYXJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5XG4gICAgICAgIC8vIGluc2lkZSB0aGUgY29uZmlybSBoYW5kbGVyLCBhbmQgZGVueTogWydjb25maXJtX29wZXJhdGlvbiddIGlzIGVuZm9yY2VkIGFzIGEgc2FuZGJveC5cbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gdGhpcy5nYXRla2VlcGVyLmVuZm9yY2Uoe1xuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBza2lwRWxlbWVudFBvbGljaWVzOiBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbihvcGVyYXRpb24pLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZWNvcmQgR2F0ZWtlZXBlciBkZWNpc2lvbiBmb3IgbWV0cmljc1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcj8ucmVjb3JkKHtcbiAgICAgICAgICBhbGxvd2VkOiBkZWNpc2lvbi5hbGxvd2VkLFxuICAgICAgICAgIHBlcm1pc3Npb25MZXZlbDogZGVjaXNpb24ucGVybWlzc2lvbkxldmVsLFxuICAgICAgICAgIHBvbGljeVNvdXJjZTogZGVjaXNpb24ucG9saWN5U291cmNlLFxuICAgICAgICAgIGNvbmZpcm1hdGlvblBlbmRpbmc6IGRlY2lzaW9uLmNvbmZpcm1hdGlvblBlbmRpbmcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZGVjaXNpb24uYWxsb3dlZCkge1xuICAgICAgICAgIGlmIChkZWNpc2lvbi5jb25maXJtYXRpb25QZW5kaW5nKSB7XG4gICAgICAgICAgICAvLyBJc3N1ZSAjMTY1MzogQXV0by1jb25maXJtIHdoZW4gdGhlIGhvc3QgKENsYXVkZSBDb2RlLCBldGMuKSBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgLy8gYXBwcm92ZWQgdGhpcyBNQ1AgdG9vbCBjYWxsLiBUaGUgaG9zdCdzIHRvb2wtbGV2ZWwgYXBwcm92YWwgaXMgdGhlIHByaW1hcnlcbiAgICAgICAgICAgIC8vIGh1bWFuIGdhdGU7IHRoZSBnYXRla2VlcGVyJ3MgY29uZmlybV9vcGVyYXRpb24gcm91bmQtdHJpcCBpcyByZWR1bmRhbnQgd2hlblxuICAgICAgICAgICAgLy8gdGhlIGhvc3QgZ2F0ZXMgZXZlcnkgY2FsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTYWZldHkgbGF5ZXJzIHRoYXQgcmVtYWluIGFjdGl2ZSAocHJvdmVuIGJ5IHBlcm1pc3Npb24tZmxvdy1oYXJuZXNzIHRlc3RzKTpcbiAgICAgICAgICAgIC8vIC0gRWxlbWVudCBkZW55IHBvbGljaWVzIChoYXJkIGRlbnksIG5vIGNvbmZpcm1hdGlvblBlbmRpbmcgZmxhZylcbiAgICAgICAgICAgIC8vIC0gY2FuQmVFbGV2YXRlZDogZmFsc2UgY29uc3RyYWludHNcbiAgICAgICAgICAgIC8vIC0gU2FmZXR5IHRpZXIgZXZhbHVhdGlvbiAocnVucyBiZWZvcmUgY29uZmlybWF0aW9uIGNoZWNrKVxuICAgICAgICAgICAgLy8gLSBEYW5nZXJab25lIHZlcmlmaWNhdGlvbiAoc2VwYXJhdGUgZmxvdylcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgY29uZmlybWF0aW9uIGlzIHJlY29yZGVkIGluIHRoZSBzZXNzaW9uIHNvIHN1YnNlcXVlbnQgZW5mb3JjZSgpIGNhbGxzXG4gICAgICAgICAgICAvLyBmb3IgdGhlIHNhbWUgb3BlcmF0aW9uIHBhc3Mgd2l0aG91dCByZS1jb25maXJtaW5nLlxuICAgICAgICAgICAgY29uc3QgY29uZmlybUxldmVsID0gZGVjaXNpb24ucGVybWlzc2lvbkxldmVsIGFzXG4gICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT04gfCBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFO1xuXG4gICAgICAgICAgICAvLyBSaXNrIHNjb3JpbmcgZm9yIGRlc3RydWN0aXZlL2hpZ2gtaW1wYWN0IG9wZXJhdGlvbnMuXG4gICAgICAgICAgICAvLyBBc3NpZ25zIGEgcmlzayBzY29yZSAoMC0xMDApIGJhc2VkIG9uIG9wZXJhdGlvbiBjaGFyYWN0ZXJpc3RpY3MuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBNQ1AtQVFMIGVxdWl2YWxlbnQgb2YgYXNzZXNzUmlzaygpIGZvciBDTEkgdG9vbHMuXG4gICAgICAgICAgICBjb25zdCByaXNrU2NvcmUgPSB0aGlzLnNjb3JlT3BlcmF0aW9uUmlzayhvcGVyYXRpb24sIGVuZHBvaW50LCBwYXJhbXMpO1xuXG4gICAgICAgICAgICB0aGlzLmdhdGVrZWVwZXIucmVjb3JkQ29uZmlybWF0aW9uKG9wZXJhdGlvbiwgY29uZmlybUxldmVsLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuZCBsb2cgYSBkZXRhaWxlZCBzdW1tYXJ5IGZvciBzZXNzaW9uIHJldmlldy5cbiAgICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIG5vIGh1bWFuIGlzIHByb21wdGVkLCB0aGlzIGFwcGVhcnMgaW4gcXVlcnlfbG9nc1xuICAgICAgICAgICAgLy8gc28gb3BlcmF0b3JzIGNhbiB0cmFjZSB3aGF0IHdhcyBhdXRvLWNvbmZpcm1lZCBhbmQgd2h5LlxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuYnVpbGRPcGVyYXRpb25TdW1tYXJ5KG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICBjb25zdCBzY29wZSA9IGVsZW1lbnRUeXBlID8gJyBbJy5jb25jYXQoZWxlbWVudFR5cGUsICddJykgOiAnJztcbiAgICAgICAgICAgIGxldCByaXNrTGFiZWwgPSAnTE9XJztcbiAgICAgICAgICAgIGlmIChyaXNrU2NvcmUgPj0gODApIHJpc2tMYWJlbCA9ICdISUdIJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHJpc2tTY29yZSA+PSA0MCkgcmlza0xhYmVsID0gJ01PREVSQVRFJztcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gWydbR2F0ZWtlZXBlcl0gQXV0by1jb25maXJtZWQgKCcsIHJpc2tMYWJlbCwgJyByaXNrPScsIFN0cmluZyhyaXNrU2NvcmUpLFxuICAgICAgICAgICAgICAnKTogJywgc3VtbWFyeSwgc2NvcGUsICcuIFJlYXNvbjogJywgZGVjaXNpb24ucmVhc29uXTtcbiAgICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBwYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICAgICAgLy8gQ09ORklSTV9TSU5HTEVfVVNFIG9wZXJhdGlvbnMgKGRlbGV0ZSwgZXhlY3V0ZV9hZ2VudCwgZWRpdCwgYWJvcnQpXG4gICAgICAgICAgICAvLyBhcmUgaGlnaGVyLXJpc2sg4oCUIGxvZyBhdCB3YXJuIGxldmVsIGZvciB2aXNpYmlsaXR5IGluIGF1ZGl0IHRyYWlscy5cbiAgICAgICAgICAgIGlmIChjb25maXJtTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0UpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obG9nTWVzc2FnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcobG9nTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEhhcmQgZGVueSDigJQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgcG9saWN5LCBubyBjb25maXJtYXRpb24gY2FuIGhlbHBcbiAgICAgICAgICAgIHRoaXMucmVjb3JkR2F0ZWtlZXBlckJsb2NrRm9yQWdlbnRzKG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIGRlY2lzaW9uLnJlYXNvbiA/PyAnT3BlcmF0aW9uIGJsb2NrZWQgYnkgcG9saWN5JywgZGVjaXNpb24ucGVybWlzc2lvbkxldmVsKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW0dhdGVrZWVwZXJdICR7ZGVjaXNpb24ucmVhc29ufWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM2NzM6IFByb3RlY3QgZ2F0ZWtlZXBlciBwb2xpY3kgZmllbGRzIGZyb20gZWxlbWVudC1wb2xpY3kgZWxldmF0aW9uLlxuICAgICAgICAvLyBlZGl0X2VsZW1lbnQgaXMgZWxldmF0YWJsZSBmb3Igbm9ybWFsIGZpZWxkcyAoZGVzY3JpcHRpb24sIHRhZ3MsIGV0Yy4pLCBidXRcbiAgICAgICAgLy8gZWRpdGluZyBnYXRla2VlcGVyIHBvbGljaWVzIGFsd2F5cyByZXF1aXJlcyBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbi5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhbiBlbGVtZW50IGZyb20gYXV0by1hcHByb3ZpbmcgY2hhbmdlcyB0byBzZWN1cml0eSBwb2xpY2llc1xuICAgICAgICAvLyBvbiBvdGhlciBlbGVtZW50cyAodGhlIHByaW1hcnkgcHJpdmlsZWdlIGVzY2FsYXRpb24gdmVjdG9yKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9wZXJhdGlvbiA9PT0gJ2VkaXRfZWxlbWVudCcgJiZcbiAgICAgICAgICBkZWNpc2lvbi5wb2xpY3lTb3VyY2UgPT09ICdlbGVtZW50X3BvbGljeScgJiZcbiAgICAgICAgICBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5BVVRPX0FQUFJPVkUgJiZcbiAgICAgICAgICBwYXJhbXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaW5wdXRPYmogPSAocGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBoYXNHYXRla2VlcGVyRmllbGQgPVxuICAgICAgICAgICAgaW5wdXRPYmo/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlucHV0T2JqPy5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChoYXNHYXRla2VlcGVyRmllbGQpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbTUNQQVFMSGFuZGxlcl0gR2F0ZWtlZXBlciBwb2xpY3kgZWRpdCBibG9ja2VkIGZyb20gZWxlbWVudC1wb2xpY3kgZWxldmF0aW9uIOKAlCByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb25gLCB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIHBvbGljeVNvdXJjZTogZGVjaXNpb24ucG9saWN5U291cmNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKFxuICAgICAgICAgICAgICBgRWRpdGluZyBnYXRla2VlcGVyIHBvbGljaWVzIHJlcXVpcmVzIGV4cGxpY2l0IHVzZXIgY29uZmlybWF0aW9uIGFuZCBjYW5ub3QgYmUgYXV0by1hcHByb3ZlZCBieSBlbGVtZW50IHBvbGljaWVzLiBgICtcbiAgICAgICAgICAgICAgYFVzZSBjb25maXJtX29wZXJhdGlvbiB3aXRoIHBhcmFtcyB7IG9wZXJhdGlvbjogXCJlZGl0X2VsZW1lbnRcIiR7ZWxlbWVudFR5cGUgPyBgLCBlbGVtZW50X3R5cGU6IFwiJHtlbGVtZW50VHlwZX1cImAgOiAnJ30gfSB0byBhcHByb3ZlLCB0aGVuIHJldHJ5LmAsXG4gICAgICAgICAgICAgIHN0YXJ0VGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhdGVrZWVwZXIgZGlzYWJsZWQg4oCUIGZhbGwgYmFjayB0byByb3V0ZSB2YWxpZGF0aW9uIG9ubHlcbiAgICAgICAgR2F0ZWtlZXBlci52YWxpZGF0ZShvcGVyYXRpb24sIGVuZHBvaW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAzOiBSb3V0ZSBvcGVyYXRpb24gdG8gaGFuZGxlciByZWZlcmVuY2VcbiAgICAgIGNvbnN0IHJvdXRlID0gZ2V0Um91dGUob3BlcmF0aW9uKTtcbiAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFmdGVyIFBlcm1pc3Npb25HdWFyZC52YWxpZGF0ZSwgYnV0IGd1YXJkIGRlZmVuc2l2ZWx5XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUoYFVua25vd24gb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gLCBzdGFydFRpbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDQ6IERpc3BhdGNoIHRvIGhhbmRsZXIgKG1lcmdlIGltcGxpY2l0UGFyYW1zIGZyb20gcm91dGUsIHVzZXIgcGFyYW1zIHRha2UgcHJlY2VkZW5jZSlcbiAgICAgIGNvbnN0IG1lcmdlZFBhcmFtcyA9IHJvdXRlLmltcGxpY2l0UGFyYW1zXG4gICAgICAgID8geyAuLi5yb3V0ZS5pbXBsaWNpdFBhcmFtcywgLi4ucGFyYW1zIH1cbiAgICAgICAgOiBwYXJhbXMgPz8ge307XG4gICAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5kaXNwYXRjaChyb3V0ZS5oYW5kbGVyLCB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsZWFudXBEZWxldGVkTWVtb3J5Qm9va2tlZXBpbmcob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgbWVyZ2VkUGFyYW1zKTtcblxuICAgICAgLy8gU3RlcCA1OiBBcHBseSBmaWVsZCBzZWxlY3Rpb24gKElzc3VlICMyMDIpXG4gICAgICAvLyBUcmFuc2Zvcm0gbmFtZSDihpIgZWxlbWVudF9uYW1lIGZvciBMTE0gY29uc2lzdGVuY3lcbiAgICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyBpZiBmaWVsZHMgcGFyYW0gcHJvdmlkZWRcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmFwcGx5RmllbGRTZWxlY3Rpb24ocmF3RGF0YSwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgLy8gU3RlcCA2OiBMb2cgc3VjY2Vzc2Z1bCBvcGVyYXRpb24g4oCUIG9ubHkgbXV0YXRpb25zIGFyZSBzZWN1cml0eS1yZWxldmFudFxuICAgICAgaWYgKGVuZHBvaW50ICE9PSAnUkVBRCcpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdPUEVSQVRJT05fQ09NUExFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgICBkZXRhaWxzOiBlbGVtZW50VHlwZVxuICAgICAgICAgICAgPyBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkIG9uICR7ZWxlbWVudFR5cGV9YFxuICAgICAgICAgICAgOiBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcktleXM6IHBhcmFtcyA/IE9iamVjdC5rZXlzKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgdGhpcy5oYW5kbGVycy5vcGVyYXRpb25NZXRyaWNzVHJhY2tlcj8ucmVjb3JkKG9wZXJhdGlvbk5hbWUsIGVuZHBvaW50LCBkdXJhdGlvbk1zLCB0cnVlKTtcbiAgICAgIGNvbnN0IHR5cGVTdWZmaXggPSBlbGVtZW50VHlwZSA/ICc6JyArIGVsZW1lbnRUeXBlIDogJyc7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1AtQVFMXSAke2VuZHBvaW50fSAke29wZXJhdGlvbn0ke3R5cGVTdWZmaXh9ICgke2R1cmF0aW9uTXMudG9GaXhlZCgxKX1tcylgKTtcbiAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3MoZGF0YSwgc3RhcnRUaW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBhbmQgcmV0dXJuIGFzIE9wZXJhdGlvbkZhaWx1cmVcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBpc1NlY3VyaXR5VmlvbGF0aW9uID0gbWVzc2FnZS5pbmNsdWRlcygnU2VjdXJpdHkgdmlvbGF0aW9uJyk7XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMuaGFuZGxlcnMub3BlcmF0aW9uTWV0cmljc1RyYWNrZXI/LnJlY29yZChvcGVyYXRpb25OYW1lLCBlbmRwb2ludCwgZHVyYXRpb25NcywgZmFsc2UpO1xuXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRzIHdpdGggYXBwcm9wcmlhdGUgc2V2ZXJpdHlcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogaXNTZWN1cml0eVZpb2xhdGlvbiA/ICdVUERBVEVfU0VDVVJJVFlfVklPTEFUSU9OJyA6ICdPUEVSQVRJT05fRkFJTEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6IGlzU2VjdXJpdHlWaW9sYXRpb24gPyAnSElHSCcgOiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgZGV0YWlsczogYCR7ZW5kcG9pbnR9ICcke29wZXJhdGlvbk5hbWV9JyBmYWlsZWQ6ICR7bWVzc2FnZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbmRwb2ludCwgb3BlcmF0aW9uOiBvcGVyYXRpb25OYW1lLCBlcnJvcjogbWVzc2FnZSB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmVycm9yKGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb25OYW1lfScgZmFpbGVkOiAke21lc3NhZ2V9YCwge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25OYW1lLFxuICAgICAgICBlcnJvcjogbWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShtZXNzYWdlLCBzdGFydFRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgYmF0Y2ggb2Ygb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkuXG4gICAqIE9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkIGluIG9yZGVyLCBhbmQgZmFpbHVyZXMgZG8gbm90IHN0b3AgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBFWEVDVVRJT04gU0VNQU5USUNTOlxuICAgKiAtIE9wZXJhdGlvbnMgcnVuIHNlcXVlbnRpYWxseSAoaW4gb3JkZXIpXG4gICAqIC0gRWFjaCBvcGVyYXRpb24gaXMgdmFsaWRhdGVkIGluZGVwZW5kZW50bHlcbiAgICogLSBGYWlsZWQgb3BlcmF0aW9ucyBkb24ndCBzdG9wIHRoZSBiYXRjaFxuICAgKiAtIEFsbCByZXN1bHRzIGFyZSBjb2xsZWN0ZWQgYW5kIHJldHVybmVkXG4gICAqXG4gICAqIEBwYXJhbSBiYXRjaCAtIEJhdGNoUmVxdWVzdCB3aXRoIGFycmF5IG9mIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQ1JVRCBlbmRwb2ludCBiZWluZyBjYWxsZWRcbiAgICogQHJldHVybnMgQmF0Y2hSZXN1bHQgd2l0aCBhbGwgb3BlcmF0aW9uIHJlc3VsdHMgYW5kIHN1bW1hcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUJhdGNoKFxuICAgIGJhdGNoOiBCYXRjaFJlcXVlc3QsXG4gICAgZW5kcG9pbnQ6IENSVURFbmRwb2ludFxuICApOiBQcm9taXNlPEJhdGNoUmVzdWx0PiB7XG4gICAgLy8gSXNzdWUgIzIyMS8jNTQzOiBSZWplY3Qgb3ZlcnNpemVkIGJhdGNoZXMgdG8gcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uXG4gICAgaWYgKGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9CQVRDSF9PUEVSQVRJT05TKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdCQVRDSF9SRUpFQ1RFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9LmJhdGNoYCxcbiAgICAgICAgZGV0YWlsczogYEJhdGNoIG9mICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IG9wcyByZWplY3RlZCDigJQgZXhjZWVkcyBsaW1pdCBvZiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OU31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbmRwb2ludCwgcmVxdWVzdGVkOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCwgbGltaXQ6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OUyB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgIHN1bW1hcnk6IHsgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLCBzdWNjZWVkZWQ6IDAsIGZhaWxlZDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGggfSxcbiAgICAgICAgZXJyb3I6IGBCYXRjaCBzaXplICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OU30gb3BlcmF0aW9uc2AsXG4gICAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShwZXJmb3JtYW5jZS5ub3coKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICMzMDE6IENhcHR1cmUgc3RhcnQgdGltZSBmb3IgYmF0Y2gtbGV2ZWwgdGltaW5nIG1ldGFkYXRhXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgcmVzdWx0czogQmF0Y2hPcGVyYXRpb25SZXN1bHRbXSA9IFtdO1xuICAgIGxldCBzdWNjZWVkZWQgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvcCA9IGJhdGNoLm9wZXJhdGlvbnNbaV07XG5cbiAgICAgIC8vIFBhc3MgcmF3IG9wZXJhdGlvbiB0aHJvdWdoIOKAlCBwYXJzZU9wZXJhdGlvbklucHV0KCkgaW4gZXhlY3V0ZU9wZXJhdGlvbigpXG4gICAgICAvLyBoYW5kbGVzIGFsbCBub3JtYWxpemF0aW9uIChlbGVtZW50X3R5cGUgdnMgZWxlbWVudFR5cGUsIGxlZ2FjeSBmb3JtYXRzLCBldGMuKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9uKG9wLCBlbmRwb2ludCk7XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGluZGV4OiBpLFxuICAgICAgICBvcGVyYXRpb246IG9wLm9wZXJhdGlvbixcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBzdWNjZWVkZWQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWxlZCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvZyBiYXRjaCBjb21wbGV0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0JBVENIX0NPTVBMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX0uYmF0Y2hgLFxuICAgICAgZGV0YWlsczogYEJhdGNoIG9mICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IG9wczogJHtzdWNjZWVkZWR9IHN1Y2NlZWRlZCwgJHtmYWlsZWR9IGZhaWxlZGAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICBzdWNjZWVkZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgICAgb3BlcmF0aW9uczogYmF0Y2gub3BlcmF0aW9ucy5tYXAob3AgPT4gb3Aub3BlcmF0aW9uKSxcbiAgICAgICAgZmFpbHVyZVJhdGU6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKGZhaWxlZCAvIGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoKSAqIDEwMCkgOiAwLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVzdWx0cyxcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICBzdWNjZWVkZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgIH0sXG4gICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEoc3RhcnRUaW1lKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgaGFuZGxlciByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBoYW5kbGVyIG1ldGhvZC5cbiAgICpcbiAgICogSGFuZGxlciByZWZlcmVuY2UgZm9ybWF0OiBcIk1vZHVsZS5tZXRob2RcIlxuICAgKiBFeGFtcGxlczpcbiAgICogLSBcIkVsZW1lbnRDUlVELmNyZWF0ZVwiIOKGkiB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmNyZWF0ZUVsZW1lbnQoLi4uKVxuICAgKiAtIFwiTWVtb3J5LmFkZEVudHJ5XCIg4oaSIHRoaXMuaGFuZGxlcnMubWVtb3J5TWFuYWdlci5hZGRFbnRyeSguLi4pXG4gICAqIC0gXCJBZ2VudC5leGVjdXRlXCIg4oaSIHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCguLi4pXG4gICAqXG4gICAqIERJU1BBVENIIFNUUkFURUdZIChJc3N1ZSAjMjQ3KTpcbiAgICogMS4gQ2hlY2sgaWYgb3BlcmF0aW9uIGlzIHNjaGVtYS1kcml2ZW4g4oaSIHVzZSBTY2hlbWFEaXNwYXRjaGVyXG4gICAqIDIuIE90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gbGVnYWN5IG1vZHVsZS1iYXNlZCBkaXNwYXRjaFxuICAgKlxuICAgKiBTY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnMgYmVuZWZpdCBmcm9tOlxuICAgKiAtIERlY2xhcmF0aXZlIGNvbmZpZ3VyYXRpb24gKG5vIHN3aXRjaCBzdGF0ZW1lbnRzKVxuICAgKiAtIEF1dG8tZ2VuZXJhdGVkIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gICAqIC0gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igb3BlcmF0aW9uIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGVyUmVmIC0gSGFuZGxlciByZWZlcmVuY2UgaW4gXCJNb2R1bGUubWV0aG9kXCIgZm9ybWF0XG4gICAqIEBwYXJhbSBpbnB1dCAtIFZhbGlkYXRlZCBvcGVyYXRpb24gaW5wdXRcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gb3BlcmF0aW9uLXNwZWNpZmljIGRhdGFcbiAgICogQHRocm93cyBFcnJvciBpZiBoYW5kbGVyIHJlZmVyZW5jZSBpcyB1bmtub3duIG9yIG1ldGhvZCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaChcbiAgICBoYW5kbGVyUmVmOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBwYXJhbXMgfSA9IGlucHV0O1xuXG4gICAgLy8gSXNzdWUgIzI0NzogU2NoZW1hLWRyaXZlbiBkaXNwYXRjaCBmb3IgY29uZmlndXJlZCBvcGVyYXRpb25zXG4gICAgLy8gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBtYW51YWwgc3dpdGNoIHN0YXRlbWVudHNcbiAgICAvLyBJc3N1ZSAjMjUxOiBQYXNzIGZ1bGwgaW5wdXQgZm9yIG9wZXJhdGlvbnMgbmVlZGluZyBlbGVtZW50VHlwZSByZXNvbHV0aW9uXG4gICAgaWYgKFNjaGVtYURpc3BhdGNoZXIuY2FuRGlzcGF0Y2gob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFNjaGVtYURpc3BhdGNoZXIuZGlzcGF0Y2goXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge30sXG4gICAgICAgIHRoaXMuaGFuZGxlcnMsXG4gICAgICAgIGlucHV0XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBtb2R1bGUtYmFzZWQgZGlzcGF0Y2ggZm9yIGNvbXBsZXggb3BlcmF0aW9uc1xuICAgIGNvbnN0IFttb2R1bGUsIG1ldGhvZF0gPSBoYW5kbGVyUmVmLnNwbGl0KCcuJyk7XG5cbiAgICAvLyBFbGVtZW50Q1JVRCBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0VsZW1lbnRDUlVEJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFbGVtZW50Q1JVRChtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBNZW1vcnkgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdNZW1vcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaE1lbW9yeShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQWdlbnQgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdBZ2VudCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQWdlbnQobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFRlbXBsYXRlKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmF0aW9uIG9wZXJhdGlvbnMgKGNyb3NzLWN1dHRpbmcgY29uY2VybilcbiAgICBpZiAobW9kdWxlID09PSAnQWN0aXZhdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQWN0aXZhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdTZWFyY2gnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFNlYXJjaChtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBVbmlmaWVkU2VhcmNoIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpIGFyZSBub3cgc2NoZW1hLWRyaXZlblxuICAgIC8vIHZpYSBTY2hlbWFEaXNwYXRjaGVyIHdpdGggdGhlICdzZWFyY2hQYXJhbXMnIG5vcm1hbGl6ZXIuXG4gICAgLy8gU2VlIFBPUlRGT0xJT19PUEVSQVRJT05TLnNlYXJjaCBpbiBPcGVyYXRpb25TY2hlbWEudHNcblxuICAgIC8vIEludHJvc3BlY3Rpb24gb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdJbnRyb3NwZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hJbnRyb3NwZWN0aW9uKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0aW9uIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0NvbGxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaENvbGxlY3Rpb24obWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFBvcnRmb2xpbyBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdQb3J0Zm9saW8nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFBvcnRmb2xpbyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQXV0aCBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdBdXRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hBdXRoKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBDb25maWcgb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnQ29uZmlnJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hDb25maWcobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnRW5oYW5jZWRJbmRleCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRW5oYW5jZWRJbmRleChtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gUGVyc29uYSBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdQZXJzb25hJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hQZXJzb25hKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIG9wZXJhdGlvbnMgKElzc3VlICMyNDQgLSBDUlVERSlcbiAgICBpZiAobW9kdWxlID09PSAnRXhlY3V0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXhlY3V0ZShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gR2F0ZWtlZXBlciBvcGVyYXRpb25zIChJc3N1ZSAjNDUyIC0gY29uZmlybWF0aW9uIGZsb3cpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0dhdGVrZWVwZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEdhdGVrZWVwZXIobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIExvZ2dpbmcgb3BlcmF0aW9ucyAoSXNzdWUgIzUyOCAtIENSVURFIG1pZ3JhdGlvbilcbiAgICBpZiAobW9kdWxlID09PSAnTG9nZ2luZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTG9nZ2luZyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gTWV0cmljcyBvcGVyYXRpb25zIChDUlVERS1yb3V0ZWQgcXVlcnlfbWV0cmljcylcbiAgICBpZiAobW9kdWxlID09PSAnTWV0cmljcycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTWV0cmljcyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQnJvd3NlciBvcGVyYXRpb25zIChJc3N1ZSAjNzc0OiBvcGVuIHBvcnRmb2xpbyBicm93c2VyKVxuICAgIGlmIChtb2R1bGUgPT09ICdCcm93c2VyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hCcm93c2VyKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gaGFuZGxlciBtb2R1bGU6ICR7bW9kdWxlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEVsZW1lbnRDUlVEIG9wZXJhdGlvbnMgdG8gRWxlbWVudENSVURIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRWxlbWVudENSVUQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQ7XG4gICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdjcmVhdGUnOiB7XG4gICAgICAgIC8vIElzc3VlICMyNzg6IEZvciBlbnNlbWJsZXMsIG1lcmdlIHRvcC1sZXZlbCBlbGVtZW50cyBpbnRvIG1ldGFkYXRhXG4gICAgICAgIC8vIExMTXMgb2Z0ZW4gcGFzcyBlbGVtZW50cyBhdCBwYXJhbXMgbGV2ZWwsIG5vdCBpbnNpZGUgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpO1xuICAgICAgICBsZXQgbWV0YWRhdGEgPSBwLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBlbnNlbWJsZSB0eXBlIChoYW5kbGVzIGJvdGggcGx1cmFsIGNvbnN0YW50IGFuZCBzaW5ndWxhciBmb3JtKVxuICAgICAgICBjb25zdCBpc0Vuc2VtYmxlID0gcmVzb2x2ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSB8fCByZXNvbHZlZFR5cGUgPT09ICdlbnNlbWJsZSc7XG4gICAgICAgIGlmIChpc0Vuc2VtYmxlKSB7XG4gICAgICAgICAgLy8gSXNzdWUgIzM2NTogUmVjb2duaXplIGNvbW1vbiBzeW5vbnltcyBmb3IgJ2VsZW1lbnRzJyAobWVtYmVycywgY29tcG9uZW50cywgaXRlbXMpXG4gICAgICAgICAgY29uc3Qgc3lub255bXMgPSBbJ21lbWJlcnMnLCAnY29tcG9uZW50cycsICdpdGVtcyddIGFzIGNvbnN0O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzU291cmNlID0gcC5lbGVtZW50cyB8fCBzeW5vbnltcy5yZWR1Y2U8dW5rbm93bj4oXG4gICAgICAgICAgICAoZm91bmQsIHN5bikgPT4gZm91bmQgfHwgcFtzeW5dLCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlbGVtZW50c1NvdXJjZSAmJiAoIW1ldGFkYXRhIHx8ICFtZXRhZGF0YS5lbGVtZW50cykpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhID0geyAuLi5tZXRhZGF0YSwgZWxlbWVudHM6IGVsZW1lbnRzU291cmNlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzYwMjogJ2luc3RydWN0aW9ucycgaXMgbm8gbG9uZ2VyIGFuIEFQSSBmaWVsZC4gVXNlICdjb250ZW50JyBmb3IgYWxsIHR5cGVzLlxuICAgICAgICAvLyBJZiBhbiBMTE0gc2VuZHMgJ2luc3RydWN0aW9ucycsIHBhc3MgaXQgdGhyb3VnaCBzbyBjcmVhdGVFbGVtZW50IGNhbiByZWplY3Qgd2l0aCBndWlkYW5jZS5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICB0eXBlOiByZXNvbHZlZFR5cGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIGNvbnRlbnQ6IHAuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwLmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsICAvLyBSZWplY3RlZCB3aXRoIGd1aWRhbmNlIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5saXN0RWxlbWVudHMoXG4gICAgICAgICAgZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnZ2V0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZylcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXNzdWUgIzczODogQ3VycmVudGx5IHNoYXJlcyBjb2RlIHBhdGggd2l0aCAnZ2V0Jy4gRnV0dXJlIGRpdmVyZ2VuY2UgcG9pbnQg4oCUXG4gICAgICAvLyAnZ2V0RGV0YWlscycgd2lsbCByZXR1cm4gZXh0ZW5kZWQgbWV0YWRhdGEgKHJlbGF0aW9uc2hpcCBncmFwaCwgc3RhY2sgbWVtYmVyc2hpcCxcbiAgICAgIC8vIHBvbGljeSByZXNvbHV0aW9uLCBhY3RpdmF0aW9uIHN0YXRlLCByZXZlcnNlIGRlcGVuZGVuY2llcykuXG4gICAgICBjYXNlICdnZXREZXRhaWxzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZylcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnZWRpdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmVkaXRFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBpbnB1dDogcC5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIudmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBzdHJpY3Q6IHAuc3RyaWN0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5kZWxldGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBkZWxldGVEYXRhOiBwLmRlbGV0ZURhdGEgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUltcG9ydEVsZW1lbnQocCk7XG5cbiAgICAgIGNhc2UgJ2V4cG9ydCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUV4cG9ydEVsZW1lbnQoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyksXG4gICAgICAgICAgKHAuZm9ybWF0IGFzICdqc29uJyB8ICd5YW1sJykgfHwgJ2pzb24nXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBFbGVtZW50Q1JVRCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBpbXBvcnQgb3BlcmF0aW9uLlxuICAgKiBQYXJzZXMgZXhwb3J0IHBhY2thZ2UsIGRlc2VyaWFsaXplcyBlbGVtZW50IGRhdGEsIGFuZCBjcmVhdGVzIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBkYXRhIGFuZCBvcHRpb25hbCBvdmVyd3JpdGUgZmxhZ1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBjcmVhdGVkIGVsZW1lbnRcbiAgICogQHRocm93cyBFcnJvciBpZiBleHBvcnQgcGFja2FnZSBpcyBpbnZhbGlkIG9yIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgKHdoZW4gb3ZlcndyaXRlIGlzIGZhbHNlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbXBvcnRFbGVtZW50KHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcblxuICAgIC8vIFBhcnNlIGV4cG9ydCBwYWNrYWdlIChjYW4gYmUgc3RyaW5nIG9yIGFscmVhZHktcGFyc2VkIG9iamVjdClcbiAgICBsZXQgZXhwb3J0UGFja2FnZTogRXhwb3J0UGFja2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0UGFja2FnZSA9IEpTT04ucGFyc2UocGFyYW1zLmRhdGEpIGFzIEV4cG9ydFBhY2thZ2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZXhwb3J0IHBhY2thZ2U6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnb2JqZWN0JyAmJiBwYXJhbXMuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgZXhwb3J0UGFja2FnZSA9IHBhcmFtcy5kYXRhIGFzIEV4cG9ydFBhY2thZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyBvciBvYmplY3QnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBleHBvcnQgcGFja2FnZSBzdHJ1Y3R1cmUgd2l0aCBkZXRhaWxlZCBtaXNzaW5nIGZpZWxkIHJlcG9ydGluZ1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gWydleHBvcnRWZXJzaW9uJywgJ2VsZW1lbnRUeXBlJywgJ2Zvcm1hdCcsICdkYXRhJ10gYXMgY29uc3Q7XG4gICAgY29uc3QgbWlzc2luZ0ZpZWxkcyA9IHJlcXVpcmVkRmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZCkgPT4gIWV4cG9ydFBhY2thZ2VbZmllbGQgYXMga2V5b2YgRXhwb3J0UGFja2FnZV1cbiAgICApO1xuICAgIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogbWlzc2luZyBmaWVsZHM6ICR7bWlzc2luZ0ZpZWxkcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIERlc2VyaWFsaXplIGVsZW1lbnQgZGF0YSBiYXNlZCBvbiBmb3JtYXRcbiAgICBsZXQgZWxlbWVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXhwb3J0UGFja2FnZS5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBlbGVtZW50RGF0YSA9IEpTT04ucGFyc2UoZXhwb3J0UGFja2FnZS5kYXRhKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIH0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZS5mb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgICAvLyBTRUNVUklUWTogVXNlIEpTT05fU0NIRU1BIGZvciBwdXJlIFlBTUwgcGFyc2luZyAocHJldmVudHMgY29kZSBleGVjdXRpb24pXG4gICAgICAgIC8vIEpTT05fU0NIRU1BID0gRkFJTFNBRkUgKyBib29sL2ludC9mbG9hdC9udWxsIChzYWZlciB0aGFuIERFRkFVTFQgd2hpY2ggYWRkcyB0aW1lc3RhbXBzKVxuICAgICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoZXhwb3J0UGFja2FnZS5kYXRhLCB7IHNjaGVtYTogeWFtbC5KU09OX1NDSEVNQSB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBZQU1MIGRhdGE6IGV4cGVjdGVkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnREYXRhID0gcGFyc2VkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmb3JtYXQ6ICR7ZXhwb3J0UGFja2FnZS5mb3JtYXR9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIGVsZW1lbnQgZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBlbGVtZW50IGZpZWxkc1xuICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50RGF0YS5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGVsZW1lbnREYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZztcbiAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudERhdGEuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50RGF0YS5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmFtZSB8fCAhZGVzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50IGRhdGE6IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzIChuYW1lLCBkZXNjcmlwdGlvbiknKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBvdmVyd3JpdGUgaXMgYWxsb3dlZFxuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IHBhcmFtcy5vdmVyd3JpdGUgPT09IHRydWU7XG5cbiAgICAvLyBJZiBub3Qgb3ZlcndyaXRpbmcsIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzXG4gICAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhbHJlYWR5IGV4aXN0czogJHtuYW1lfS4gVXNlIG92ZXJ3cml0ZTp0cnVlIHRvIHJlcGxhY2UgaXQuYCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbGVtZW50IGRvZXNuJ3QgZXhpc3QsIG9yIGVycm9yIGdldHRpbmcgZGV0YWlscyAtIHByb2NlZWQgd2l0aCBjcmVhdGlvblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IG91ciBvd24gXCJhbHJlYWR5IGV4aXN0c1wiIGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgLSBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgZWxlbWVudCAod2lsbCBvdmVyd3JpdGUgaWYgaXQgZXhpc3RzKVxuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZUVsZW1lbnQoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IGV4cG9ydFBhY2thZ2UuZWxlbWVudFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZWxlbWVudCB0byBKU09OIG9yIFlBTUwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lIHRvIGV4cG9ydFxuICAgKiBAcGFyYW0gdHlwZSAtIEVsZW1lbnQgdHlwZSAocGVyc29uYSwgc2tpbGwsIHRlbXBsYXRlLCBhZ2VudCwgbWVtb3J5LCBlbnNlbWJsZSlcbiAgICogQHBhcmFtIGZvcm1hdCAtIEV4cG9ydCBmb3JtYXQ6ICdqc29uJyBvciAneWFtbCcgKGRlZmF1bHQ6ICdqc29uJylcbiAgICogQHJldHVybnMgRXhwb3J0UGFja2FnZSB3aXRoIHNlcmlhbGl6ZWQgZWxlbWVudCBkYXRhXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV4cG9ydEVsZW1lbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyA9ICdqc29uJ1xuICApOiBQcm9taXNlPEV4cG9ydFBhY2thZ2U+IHtcbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBvcGVyYXRpb24gcmVxdWlyZXMgbmFtZSBwYXJhbWV0ZXInKTtcbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBvcGVyYXRpb24gcmVxdWlyZXMgdHlwZSBwYXJhbWV0ZXIgKHZpYSBlbGVtZW50VHlwZSBvciBwYXJhbXMudHlwZSknKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZWxlbWVudCBkZXRhaWxzIHVzaW5nIGV4aXN0aW5nIGhhbmRsZXJcbiAgICBjb25zdCBlbGVtZW50RGV0YWlscyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgdHlwZSk7XG5cbiAgICAvLyBCdWlsZCBleHBvcnQgcGFja2FnZVxuICAgIGNvbnN0IGV4cG9ydFBhY2thZ2U6IEV4cG9ydFBhY2thZ2UgPSB7XG4gICAgICBleHBvcnRWZXJzaW9uOiAnMS4wJyxcbiAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICBmb3JtYXQsXG4gICAgICBkYXRhOiAnJyxcbiAgICB9O1xuXG4gICAgLy8gU2VyaWFsaXplIHRvIHJlcXVlc3RlZCBmb3JtYXRcbiAgICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICAgIGV4cG9ydFBhY2thZ2UuZGF0YSA9IHlhbWwuZHVtcChlbGVtZW50RGV0YWlscywge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0UGFja2FnZS5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudERldGFpbHMsIG51bGwsIDIpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBvcnRQYWNrYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIE1lbW9yeSBvcGVyYXRpb25zIHRvIE1lbW9yeU1hbmFnZXJcbiAgICpcbiAgICogTWVtb3J5IG9wZXJhdGlvbnMgd29yayBvbiBpbmRpdmlkdWFsIE1lbW9yeSBpbnN0YW5jZXM6XG4gICAqIDEuIEdldCB0aGUgTWVtb3J5IGJ5IG5hbWUgZnJvbSBNZW1vcnlNYW5hZ2VyXG4gICAqIDIuIENhbGwgdGhlIG9wZXJhdGlvbiBvbiB0aGUgTWVtb3J5IGluc3RhbmNlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVkIGtleSBzaGFyZWQgYnkgcGVuZGluZ1NhdmVzLCBmYWlsZWRNZW1vcnlTYXZlcywgbWVtb3J5U2F2ZUF0dGVtcHRzLFxuICAgKiBhbmQgc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLiBBbGwgbWVtb3J5LXNhdmUgYm9va2tlZXBpbmcgbXVzdCB1c2UgdGhpcyDigJQgYVxuICAgKiBtaXNtYXRjaGVkIGtleSBzaWxlbnRseSBkaXNjb25uZWN0cyB0aGUgZmFpbHVyZSBsZWRnZXIgZnJvbSByZWNvdmVyeSAoIzIzMjkpLlxuICAgKi9cbiAgcHJpdmF0ZSBtZW1vcnlTYXZlS2V5KG1lbW9yeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1lbW9yeU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOSAoQ29kZXggcmV2aWV3KTogYSBzdWNjZXNzZnVsbHkgZGVsZXRlZCBtZW1vcnkgbXVzdCBkcm9wIGl0c1xuICAgKiBzYXZlIGJvb2trZWVwaW5nIOKAlCBhIHJldGFpbmVkIGZhaWx1cmUtbGVkZ2VyIGluc3RhbmNlIG9yIHBlbmRpbmcgZGVib3VuY2VcbiAgICogdGltZXIgd291bGQgb3RoZXJ3aXNlIHJlLXNhdmUgdGhlIGluLVJBTSBzdGF0ZSBhbmQgcmVzdXJyZWN0IHRoZSBkZWxldGVkXG4gICAqIGZpbGUuIENhbGxlZCBhZnRlciBkaXNwYXRjaCBpbiBleGVjdXRlT3BlcmF0aW9uIHNvIHRoZSBzY2hlbWEtZGlzcGF0Y2gsXG4gICAqIGxlZ2FjeSwgYW5kIGJhdGNoIHBhdGhzIGFyZSBhbGwgY292ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgY2xlYW51cERlbGV0ZWRNZW1vcnlCb29ra2VlcGluZyhcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIGlmIChvcGVyYXRpb24gIT09ICdkZWxldGVfZWxlbWVudCcpIHJldHVybjtcbiAgICBjb25zdCBwID0gcGFyYW1zID8/IHt9O1xuICAgIGNvbnN0IHR5cGUgPSAoZWxlbWVudFR5cGUgPz8gcC5lbGVtZW50X3R5cGUgPz8gcC50eXBlKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbmFtZSA9IChwLmVsZW1lbnRfbmFtZSA/PyBwLm5hbWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobmFtZSAmJiBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICB0aGlzLmNsZWFyTWVtb3J5U2F2ZUJvb2trZWVwaW5nKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOSAoQ29kZXggcmV2aWV3KTogZHJvcCBhbGwgc2F2ZSBib29ra2VlcGluZyBmb3IgYSBkZWxldGVkIG1lbW9yeS5cbiAgICogV2l0aG91dCB0aGlzLCB0aGUgZmFpbHVyZSBsZWRnZXIga2VlcHMgdGhlIGRlbGV0ZWQgbWVtb3J5J3MgaW4tUkFNIGluc3RhbmNlXG4gICAqIGFuZCB0aGUgZmx1c2gvcmV0cnkgcGF0aHMgcmUtc2F2ZSBpdCwgcmVzdXJyZWN0aW5nIHRoZSBkZWxldGVkIGZpbGUuIEEgc2F2ZVxuICAgKiBhbHJlYWR5IGluIGZsaWdodCB3aGVuIHRoZSBkZWxldGUgbGFuZHMgY2FuIHN0aWxsIHJhY2UgdGhlIGZpbGUgYmFjayDigJQgdGhhdFxuICAgKiBuYXJyb3cgd2luZG93IGlzIGluaGVyZW50IHRvIGZpcmUtYW5kLWZvcmdldCB3cml0ZXMgYW5kIHVuY2hhbmdlZCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhck1lbW9yeVNhdmVCb29ra2VlcGluZyhtZW1vcnlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm1lbW9yeVNhdmVLZXkobWVtb3J5TmFtZSk7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1NhdmVzLmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICBjbGVhclRpbWVvdXQocGVuZGluZy50aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdTYXZlcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5mYWlsZWRNZW1vcnlTYXZlcy5kZWxldGUoa2V5KTtcbiAgICB0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5kZWxldGUoa2V5KTtcbiAgICB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOTogc2F2ZSBhIG1lbW9yeSB3aXRoIGZhaWx1cmUtbGVkZ2VyIGJvb2trZWVwaW5nLiBPbiBmYWlsdXJlIHRoZVxuICAgKiBsZWRnZXIgcmVjb3JkcyB0aGUgZXJyb3IgQU5EIHRoZSBmYWlsaW5nIGluc3RhbmNlIChpdHMgdW5wZXJzaXN0ZWQgZW50cmllc1xuICAgKiBleGlzdCBub3doZXJlIGVsc2UpOyBvbiBzdWNjZXNzIHRoZSByZWNvcmQgY2xlYXJzLiBUaGUgYXR0ZW1wdCBjb3VudGVyIG1ha2VzXG4gICAqIHRoZSBuZXdlc3Qtc3RhcnRlZCBzYXZlIHdpbjogYW4gb2xkZXIgaW4tZmxpZ2h0IHNhdmUgcmVzb2x2aW5nIGxhdGUgY2Fubm90XG4gICAqIGVyYXNlIGEgbmV3ZXIgZmFpbHVyZS4gUmV0aHJvd3MgdGhlIHNhdmUgZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVNZW1vcnlUcmFja2VkKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG1lbW9yeTogaW1wb3J0KCcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnKS5NZW1vcnksXG4gICAgbWFuYWdlcjogTWVtb3J5TWFuYWdlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXR0ZW1wdCA9ICh0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgdGhpcy5tZW1vcnlTYXZlQXR0ZW1wdHMuc2V0KGtleSwgYXR0ZW1wdCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgaWYgKHRoaXMubWVtb3J5U2F2ZUF0dGVtcHRzLmdldChrZXkpID09PSBhdHRlbXB0KSB7XG4gICAgICAgIHRoaXMuZmFpbGVkTWVtb3J5U2F2ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIC8vIFBydW5lIHRoZSBjb3VudGVyIG9uIGxhdGVzdC1zdWNjZXNzIHNvIHRoZSBtYXAgc3RheXMgYm91bmRlZCBieVxuICAgICAgICAvLyBjdXJyZW50bHktZmFpbGluZyBtZW1vcmllcy4gQSBzdGFsZSBpbi1mbGlnaHQgc2F2ZSB0aGVuIHNlZXNcbiAgICAgICAgLy8gdW5kZWZpbmVkICE9PSBpdHMgYXR0ZW1wdCBhbmQgY29ycmVjdGx5IHNraXBzIGxlZGdlciB1cGRhdGVzLlxuICAgICAgICB0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5nZXQoa2V5KSA9PT0gYXR0ZW1wdCkge1xuICAgICAgICB0aGlzLmZhaWxlZE1lbW9yeVNhdmVzLnNldChrZXksIHtcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpLFxuICAgICAgICAgIG1lbW9yeSxcbiAgICAgICAgICBtYW5hZ2VyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NjogRGVib3VuY2UgbWVtb3J5IHNhdmVzIHRvIHByZXZlbnQgZmlsZSBkZXNjcmlwdG9yIGV4aGF1c3Rpb24uXG4gICAqIENvYWxlc2NlcyByYXBpZCBhZGRFbnRyeSBjYWxscyDigJQgb25seSB3cml0ZXMgdGhlIGxhdGVzdCBzdGF0ZSBhZnRlciB0aGUgd2luZG93IGV4cGlyZXMuXG4gICAqL1xuICBwcml2YXRlIGRlYm91bmNlZE1lbW9yeVNhdmUoXG4gICAgbWVtb3J5TmFtZTogc3RyaW5nLFxuICAgIG1lbW9yeTogaW1wb3J0KCcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnKS5NZW1vcnksXG4gICAgbWFuYWdlcjogTWVtb3J5TWFuYWdlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5tZW1vcnlTYXZlS2V5KG1lbW9yeU5hbWUpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nU2F2ZXMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZXhpc3RpbmcudGltZXIpO1xuICAgICAgdGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1BBUUxIYW5kbGVyXSBDb2FsZXNjZWQgc2F2ZSBmb3IgbWVtb3J5ICcke21lbW9yeU5hbWV9JyAocGVuZGluZzogJHt0aGlzLnBlbmRpbmdTYXZlcy5zaXplfSwgY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pYCk7XG4gICAgfVxuICAgIGNvbnN0IGRlYm91bmNlTXMgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9ERUJPVU5DRV9NUztcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nU2F2ZXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1BBUUxIYW5kbGVyXSBGbHVzaGluZyBkZWJvdW5jZWQgc2F2ZSBmb3IgbWVtb3J5ICcke21lbW9yeU5hbWV9JyAoY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pYCk7XG4gICAgICB0aGlzLnNhdmVNZW1vcnlUcmFja2VkKGtleSwgbWVtb3J5LCBtYW5hZ2VyKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01DUEFRTEhhbmRsZXJdIERlYm91bmNlZCBzYXZlIGZhaWxlZCBmb3IgbWVtb3J5ICcke21lbW9yeU5hbWV9JyAocGVuZGluZzogJHt0aGlzLnBlbmRpbmdTYXZlcy5zaXplfSwgY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pOiAke2Vycn1gKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlYm91bmNlTXMpO1xuICAgIC8vIEVuc3VyZSB0aW1lciBkb2Vzbid0IGtlZXAgTm9kZSBwcm9jZXNzIGFsaXZlIChpbXBvcnRhbnQgZm9yIHRlc3RzL3NodXRkb3duKVxuICAgIGlmICh0eXBlb2YgdGltZXIgPT09ICdvYmplY3QnICYmICd1bnJlZicgaW4gdGltZXIpIHtcbiAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ1NhdmVzLnNldChrZXksIHsgdGltZXIsIG1lbW9yeSwgbWFuYWdlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU3OiBUcmFjayBhZGRFbnRyeSBjYWxsIGZyZXF1ZW5jeSBwZXIgbWVtb3J5IGFuZCBsb2cgd2FybmluZ3MgYXQgdGhyZXNob2xkcy5cbiAgICpcbiAgICogVXNlcyBhIHNsaWRpbmcgd2luZG93IGNvdW50ZXIgdG8gZGV0ZWN0IHJ1bmF3YXkgc2F2ZSBsb29wcyBiZWZvcmUgdGhleSBleGhhdXN0IHJlc291cmNlcy5cbiAgICogQ291bnRlcnMgYXJlIGJvdW5kZWQ6IG1heCA1MDAgdHJhY2tlZCBtZW1vcmllcywgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIHdoZW4gZXhjZWVkZWQuXG4gICAqIFdhcm5pbmcvY3JpdGljYWwgZmxhZ3MgYXV0by1yZXNldCB3aGVuIGZyZXF1ZW5jeSBkcm9wcyBiZWxvdyB0aHJlc2hvbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gbWVtb3J5TmFtZSAtIE5hbWUgb2YgdGhlIG1lbW9yeSBiZWluZyB3cml0dGVuIHRvXG4gICAqL1xuICBwcml2YXRlIHRyYWNrU2F2ZUZyZXF1ZW5jeShtZW1vcnlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm1lbW9yeVNhdmVLZXkobWVtb3J5TmFtZSk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3aW5kb3dNcyA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1FTU9SWV9TQVZFX01PTklUT1JfV0lORE9XX01TO1xuICAgIGNvbnN0IHdhcm5UaHJlc2hvbGQgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9GUkVRVUVOQ1lfV0FSTl9USFJFU0hPTEQ7XG4gICAgY29uc3QgY3JpdGljYWxUaHJlc2hvbGQgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9GUkVRVUVOQ1lfQ1JJVElDQUxfVEhSRVNIT0xEO1xuXG4gICAgbGV0IGNvdW50ZXIgPSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5nZXQoa2V5KTtcbiAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgIC8vIEV2aWN0IG9sZGVzdCBlbnRyeSBpZiBtYXAgZXhjZWVkcyBzaXplIGxpbWl0IChwcmV2ZW50cyB1bmJvdW5kZWQgZ3Jvd3RoKVxuICAgICAgaWYgKHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNpemUgPj0gNTAwKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdEtleSA9IHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3RLZXkpIHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLmRlbGV0ZShvbGRlc3RLZXkpO1xuICAgICAgfVxuICAgICAgY291bnRlciA9IHsgdGltZXN0YW1wczogW10sIHdhcm5lZDogZmFsc2UsIGNyaXRpY2FsOiBmYWxzZSB9O1xuICAgICAgdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuc2V0KGtleSwgY291bnRlcik7XG4gICAgfVxuXG4gICAgLy8gUHJ1bmUgdGltZXN0YW1wcyBvdXRzaWRlIHRoZSB3aW5kb3dcbiAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB3aW5kb3dNcztcbiAgICBjb3VudGVyLnRpbWVzdGFtcHMgPSBjb3VudGVyLnRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gdCA+IGN1dG9mZik7XG4gICAgY291bnRlci50aW1lc3RhbXBzLnB1c2gobm93KTtcblxuICAgIGNvbnN0IGNvdW50ID0gY291bnRlci50aW1lc3RhbXBzLmxlbmd0aDtcblxuICAgIGlmIChjb3VudCA+PSBjcml0aWNhbFRocmVzaG9sZCAmJiAhY291bnRlci5jcml0aWNhbCkge1xuICAgICAgY291bnRlci5jcml0aWNhbCA9IHRydWU7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNQ1BBUUxIYW5kbGVyXSBTYXZlIGZyZXF1ZW5jeSBjcml0aWNhbCB0aHJlc2hvbGQgZXhjZWVkZWQnLCB7XG4gICAgICAgIG1lbW9yeU5hbWUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICB0aHJlc2hvbGQ6IGNyaXRpY2FsVGhyZXNob2xkLFxuICAgICAgICB3aW5kb3dTZWNvbmRzOiB3aW5kb3dNcyAvIDEwMDAsXG4gICAgICAgIHRyYWNrZWRNZW1vcmllczogdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuc2l6ZSxcbiAgICAgIH0pO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIudHJhY2tTYXZlRnJlcXVlbmN5JyxcbiAgICAgICAgZGV0YWlsczogYE1lbW9yeSAnJHttZW1vcnlOYW1lfScgZXhjZWVkcyBjcml0aWNhbCBzYXZlIGZyZXF1ZW5jeTogJHtjb3VudH0gY2FsbHMgaW4gJHt3aW5kb3dNcyAvIDEwMDB9c2AsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IG1lbW9yeU5hbWUsIGNvdW50LCB0aHJlc2hvbGQ6IGNyaXRpY2FsVGhyZXNob2xkLCB3aW5kb3dNcyB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb3VudCA+PSB3YXJuVGhyZXNob2xkICYmICFjb3VudGVyLndhcm5lZCkge1xuICAgICAgY291bnRlci53YXJuZWQgPSB0cnVlO1xuICAgICAgbG9nZ2VyLndhcm4oJ1tNQ1BBUUxIYW5kbGVyXSBTYXZlIGZyZXF1ZW5jeSB3YXJuIHRocmVzaG9sZCBleGNlZWRlZCcsIHtcbiAgICAgICAgbWVtb3J5TmFtZSxcbiAgICAgICAgY291bnQsXG4gICAgICAgIHRocmVzaG9sZDogd2FyblRocmVzaG9sZCxcbiAgICAgICAgd2luZG93U2Vjb25kczogd2luZG93TXMgLyAxMDAwLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgd2FybmluZyBmbGFncyB3aGVuIGNvdW50IGRyb3BzIGJhY2sgYmVsb3cgdGhyZXNob2xkc1xuICAgIGlmIChjb3VudCA8IHdhcm5UaHJlc2hvbGQpIHtcbiAgICAgIGNvdW50ZXIud2FybmVkID0gZmFsc2U7XG4gICAgICBjb3VudGVyLmNyaXRpY2FsID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IEZsdXNoIGFsbCBwZW5kaW5nIGRlYm91bmNlZCBzYXZlcyBvbiBzaHV0ZG93bi5cbiAgICogQ2FsbGVkIGJ5IERJIGNvbnRhaW5lciBkaXNwb3NlIGNoYWluIHRvIGVuc3VyZSBubyBkYXRhIGlzIGxvc3QuXG4gICAqL1xuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nU2F2ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBGbHVzaCBhbGwgcGVuZGluZyBkZWJvdW5jZWQgc2F2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIElzc3VlICMyMzI5OiBhbHNvIHJldHJpZXMgbWVtb3JpZXMgd2hvc2UgZWFybGllciBkZWZlcnJlZCBzYXZlIGZhaWxlZCBhbmRcbiAgICogdGhhdCBoYXZlIG5vIHBlbmRpbmcgdGltZXIg4oCUIHRoZWlyIGRpcnR5IHN0YXRlIGV4aXN0cyBvbmx5IGluIFJBTSBhbmQgdGhpc1xuICAgKiBpcyB0aGUgbGFzdCBjaGFuY2UgdG8gcGVyc2lzdCBpdCBiZWZvcmUgc2h1dGRvd24uXG4gICAqL1xuICBhc3luYyBmbHVzaFBlbmRpbmdTYXZlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gWy4uLnRoaXMucGVuZGluZ1NhdmVzLmVudHJpZXMoKV07XG4gICAgdGhpcy5wZW5kaW5nU2F2ZXMuY2xlYXIoKTtcbiAgICBpZiAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgW01DUEFRTEhhbmRsZXJdIEZsdXNoaW5nICR7cGVuZGluZy5sZW5ndGh9IHBlbmRpbmcgbWVtb3J5IHNhdmUocykgb24gc2h1dGRvd24gKHRvdGFsIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB0b3RhbCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgIH1cbiAgICBjb25zdCBmbHVzaGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgeyB0aW1lciwgbWVtb3J5LCBtYW5hZ2VyIH1dIG9mIHBlbmRpbmcpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBmbHVzaGVkS2V5cy5hZGQoa2V5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZU1lbW9yeVRyYWNrZWQoa2V5LCBtZW1vcnksIG1hbmFnZXIpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IHR5cGVvZiBtZW1vcnkuZ2V0RW50cmllcyA9PT0gJ2Z1bmN0aW9uJyA/IG1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSA6ICd1bmtub3duJztcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2ggc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSwgcGVuZGluZyByZW1haW5pbmc6ICR7cGVuZGluZy5sZW5ndGh9KTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERpcmVjdCBNYXAgaXRlcmF0aW9uIGlzIHNhZmUgaGVyZTogc2F2ZU1lbW9yeVRyYWNrZWQgb25seSBkZWxldGVzIHRoZVxuICAgIC8vIGN1cnJlbnQga2V5IG9uIHN1Y2Nlc3MsIHdoaWNoIHRoZSBpdGVyYXRpb24gcHJvdG9jb2wgdG9sZXJhdGVzLlxuICAgIGZvciAoY29uc3QgW2tleSwgeyBtZW1vcnksIG1hbmFnZXIgfV0gb2YgdGhpcy5mYWlsZWRNZW1vcnlTYXZlcykge1xuICAgICAgaWYgKGZsdXNoZWRLZXlzLmhhcyhrZXkpKSBjb250aW51ZTsgLy8ganVzdCBhdHRlbXB0ZWQgYWJvdmVcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZU1lbW9yeVRyYWNrZWQoa2V5LCBtZW1vcnksIG1hbmFnZXIpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTUNQQVFMSGFuZGxlcl0gUmVjb3ZlcmVkIHByZXZpb3VzbHkgZmFpbGVkIHNhdmUgZm9yIG1lbW9yeSAnJHtrZXl9JyBkdXJpbmcgZmx1c2hgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlbnRyeUNvdW50ID0gdHlwZW9mIG1lbW9yeS5nZXRFbnRyaWVzID09PSAnZnVuY3Rpb24nID8gbWVtb3J5LmdldEVudHJpZXMoKS5zaXplIDogJ3Vua25vd24nO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNQ1BBUUxIYW5kbGVyXSBGaW5hbCBmbHVzaCByZXRyeSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSkg4oCUIHVucGVyc2lzdGVkIGVudHJpZXMgd2lsbCBiZSBsb3N0IGlmIHRoZSBwcm9jZXNzIGV4aXRzOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoTWVtb3J5KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMubWVtb3J5TWFuYWdlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFVzZSBzaGFyZWQgdmFsaWRhdGlvbiB1dGlsaXR5XG4gICAgY29uc3QgbWVtb3J5TmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICBwYXJhbXMsXG4gICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICd0aGUgbmFtZSBvZiB0aGUgbWVtb3J5IHRvIG9wZXJhdGUgb24nXG4gICAgKTtcblxuICAgIC8vIEdldCB0aGUgbWVtb3J5IGluc3RhbmNlIGJ5IG5hbWUgdXNpbmcgZmluZCgpXG4gICAgLy8gTWVtb3J5IG5hbWUgaXMgc3RvcmVkIGluIG1ldGFkYXRhLm5hbWVcbiAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCBtYW5hZ2VyLmZpbmQobSA9PiBtLm1ldGFkYXRhLm5hbWUgPT09IG1lbW9yeU5hbWUpO1xuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lbW9yeSAnJHttZW1vcnlOYW1lfScgbm90IGZvdW5kLiBVc2UgbGlzdF9lbGVtZW50cyB0byBzZWUgYXZhaWxhYmxlIG1lbW9yaWVzLmApO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdhZGRFbnRyeSc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZU1lbW9yeUFkZEVudHJ5KG1lbW9yeU5hbWUsIG1lbW9yeSwgbWFuYWdlciwgcGFyYW1zKTtcblxuICAgICAgY2FzZSAnY2xlYXInOiB7XG4gICAgICAgIC8vIElzc3VlICMyMzI5OiBjYW5jZWwgYW55IHBlbmRpbmcgZGVib3VuY2VkIHNhdmUgZmlyc3Qg4oCUIGEgc3RhbGUgdGltZXJcbiAgICAgICAgLy8gZmlyaW5nIGFmdGVyIHRoZSBjbGVhciB3b3VsZCByZXN1cnJlY3QgdGhlIHByZS1jbGVhciBlbnRyaWVzIG9uIGRpc2suXG4gICAgICAgIGNvbnN0IGNsZWFyS2V5ID0gdGhpcy5tZW1vcnlTYXZlS2V5KG1lbW9yeU5hbWUpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2xlYXIgPSB0aGlzLnBlbmRpbmdTYXZlcy5nZXQoY2xlYXJLZXkpO1xuICAgICAgICBpZiAocGVuZGluZ0NsZWFyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHBlbmRpbmdDbGVhci50aW1lcik7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZXMuZGVsZXRlKGNsZWFyS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNZW1vcnkuY2xlYXJBbGwoY29uZmlybSkgLSByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb25cbiAgICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBhd2FpdCBtZW1vcnkuY2xlYXJBbGwodHJ1ZSk7XG4gICAgICAgIC8vIEZpeCAjNDM4OiBQZXJzaXN0IHRvIGRpc2sgc28gY2xlYXJlZCBzdGF0ZSBzdXJ2aXZlcyByZXN0YXJ0LlxuICAgICAgICAvLyBUcmFja2VkIHNvIGEgc3VjY2VzcyBjbGVhcnMgYW55IHN0YWxlIGZhaWx1cmUgcmVjb3JkIGZvciB0aGlzIG1lbW9yeS5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlTWVtb3J5VHJhY2tlZChjbGVhcktleSwgbWVtb3J5LCBtYW5hZ2VyKTtcbiAgICAgICAgcmV0dXJuIGNsZWFyUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gTWVtb3J5IG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpeCAjMzg3OiByZXNvbHZlIHRoZSBhZGRFbnRyeSAnY29udGVudCcgcGFyYW1ldGVyLCBhY2NlcHRpbmcgJ2VudHJ5JyBhcyBhblxuICAgKiBhbGlhcyBhbmQgdGhyb3dpbmcgYSBjb250ZXh0dWFsIGVycm9yIHdoZW4gdGhlIHRleHQgcG9ydGlvbiBpcyBtaXNzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0QWRkRW50cnlDb250ZW50KG1lbW9yeU5hbWU6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgaWYgKHBhcmFtcy5lbnRyeSAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5jb250ZW50ID0gcGFyYW1zLmVudHJ5O1xuICAgIH1cbiAgICAvLyBGaXggIzM4NyBPcHRpb24gRDogQ29udGV4dHVhbCBlcnJvciBtZXNzYWdlIGd1aWRpbmcgdG93YXJkIGNvcnJlY3QgcGFyYW1ldGVyXG4gICAgaWYgKHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvbnRlbnQgPT09IG51bGwgfHwgdHlwZW9mIHBhcmFtcy5jb250ZW50ICE9PSAnc3RyaW5nJyB8fCAocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb25zdCBoaW50ID0gcGFyYW1zLmVudHJ5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBgWW91IHBhc3NlZCAnZW50cnknLCBidXQgYW4gZW50cnkgaXMgdGhlIGZ1bGwgb2JqZWN0IChjb250ZW50ICsgdGFncyArIG1ldGFkYXRhICsgdGltZXN0YW1wKS4gYCArXG4gICAgICAgICAgYFVzZSAnY29udGVudCcgdG8gcHJvdmlkZSB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBlbnRyeS5gXG4gICAgICAgIDogYFRoZSAnY29udGVudCcgcGFyYW1ldGVyIGlzIHRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG1lbW9yeSBlbnRyeS5gO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnRlbnQnLiAke2hpbnR9IGAgK1xuICAgICAgICBgRXhhbXBsZTogeyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCIke21lbW9yeU5hbWV9XCIsIGNvbnRlbnQ6IFwieW91ciB0ZXh0IGhlcmVcIiwgdGFnczogW1wib3B0aW9uYWxcIl0gfSB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcy5jb250ZW50IGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGRFbnRyeSB3aXRoIHRoZSAjMjMyOSBwZXJzaXN0ZW5jZSBndWFyYW50ZWVzOiByZWNvdmVyIGZyb20gYSBwcmlvciBmYWlsZWRcbiAgICogc2F2ZSwgbXV0YXRlIHRoZSBhdXRob3JpdGF0aXZlIGluc3RhbmNlLCB2ZXJpZnkgcGVyc2lzdGFiaWxpdHkgYmVmb3JlXG4gICAqIHJlcG9ydGluZyBzdWNjZXNzIChyb2xsaW5nIGJhY2sgb24gZmFpbHVyZSksIHRoZW4gc2NoZWR1bGUgdGhlIGRlYm91bmNlZCBzYXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNZW1vcnlBZGRFbnRyeShcbiAgICBtZW1vcnlOYW1lOiBzdHJpbmcsXG4gICAgbWVtb3J5OiBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcycpLk1lbW9yeSxcbiAgICBtYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmV4dHJhY3RBZGRFbnRyeUNvbnRlbnQobWVtb3J5TmFtZSwgcGFyYW1zKTtcbiAgICBjb25zdCB0YWdzID0gcGFyYW1zLnRhZ3MgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJhbXMubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBJc3N1ZSAjMjMyOTogb3BlcmF0ZSBvbiB0aGUgYXV0aG9yaXRhdGl2ZSBpbnN0YW5jZS4gVW5wZXJzaXN0ZWQgZW50cmllc1xuICAgIC8vIGxpdmUgb25seSBpbiB0aGUgaW5zdGFuY2UgaGVsZCBieSB0aGUgZmFpbHVyZSBsZWRnZXIgb3IgYSBwZW5kaW5nXG4gICAgLy8gZGVib3VuY2VkIHNhdmU7IGFmdGVyIGNhY2hlIGV2aWN0aW9uIGZpbmQoKSByZWxvYWRzIGEgZnJlc2ggY29weSBmcm9tXG4gICAgLy8gZGlzayB0aGF0IGxhY2tzIHRoZW0sIGFuZCB3cml0aW5nIHRocm91Z2ggdGhhdCBjb3B5IHdvdWxkIGNsb2JiZXIgdGhlXG4gICAgLy8gcmVjb3ZlcmVkIHN0YXRlLlxuICAgIGNvbnN0IHNhdmVLZXkgPSB0aGlzLm1lbW9yeVNhdmVLZXkobWVtb3J5TmFtZSk7XG4gICAgY29uc3QgcHJpb3JGYWlsdXJlID0gdGhpcy5mYWlsZWRNZW1vcnlTYXZlcy5nZXQoc2F2ZUtleSk7XG4gICAgY29uc3QgdGFyZ2V0TWVtb3J5ID0gcHJpb3JGYWlsdXJlPy5tZW1vcnkgPz8gdGhpcy5wZW5kaW5nU2F2ZXMuZ2V0KHNhdmVLZXkpPy5tZW1vcnkgPz8gbWVtb3J5O1xuXG4gICAgLy8gSXNzdWUgIzIzMjk6IGlmIGEgcHJldmlvdXMgc2F2ZSBvZiB0aGlzIG1lbW9yeSBmYWlsZWQgKGUuZy4gZGlzayBlcnJvciksXG4gICAgLy8gcmVjb3ZlciBiZWZvcmUgYWNjZXB0aW5nIG1vcmUgZW50cmllcyDigJQgb3RoZXJ3aXNlIHRoZXkgcGlsZSB1cCBpbiBSQU1cbiAgICAvLyBiZWhpbmQgdGhlIHNhbWUgZmFpbHVyZSBhbmQgYXJlIGxvc3Qgb24gcmVzdGFydC5cbiAgICBpZiAocHJpb3JGYWlsdXJlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVNZW1vcnlUcmFja2VkKHNhdmVLZXksIHRhcmdldE1lbW9yeSwgcHJpb3JGYWlsdXJlLm1hbmFnZXIpO1xuICAgICAgfSBjYXRjaCAocmV0cnlFcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFbnRyeSBOT1Qgc2F2ZWQ6IG1lbW9yeSAnJHttZW1vcnlOYW1lfScgaGFzIHVucGVyc2lzdGVkIGVudHJpZXMgZnJvbSBhbiBlYXJsaWVyIHNhdmUgZmFpbHVyZSBgICtcbiAgICAgICAgICBgKCR7cHJpb3JGYWlsdXJlLmVycm9yLm1lc3NhZ2V9KSBhbmQgdGhlIHJldHJ5IGFsc28gZmFpbGVkOiBgICtcbiAgICAgICAgICBgJHtyZXRyeUVyciBpbnN0YW5jZW9mIEVycm9yID8gcmV0cnlFcnIubWVzc2FnZSA6IHJldHJ5RXJyfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzQmVmb3JlID0gdGFyZ2V0TWVtb3J5LmdldEVudHJpZXMoKS5zaXplO1xuICAgIGNvbnN0IGVudHJ5UmVzdWx0ID0gYXdhaXQgdGFyZ2V0TWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3MsIG1ldGFkYXRhKTtcblxuICAgIC8vIElzc3VlICMyMzI5OiB2ZXJpZnkgdGhlIG1lbW9yeSBjYW4gc3RpbGwgYmUgcGVyc2lzdGVkIEJFRk9SRSByZXBvcnRpbmdcbiAgICAvLyBzdWNjZXNzLiBUaGUgZGlzayB3cml0ZSBiZWxvdyBpcyBkZWZlcnJlZCAoZGVib3VuY2VkKSwgc28gYSB2YWxpZGF0aW9uXG4gICAgLy8gZmFpbHVyZSB0aGVyZSBjYW4gbmV2ZXIgcmVhY2ggdGhlIGNhbGxlciDigJQgZW50cmllcyB3ZXJlIGFja25vd2xlZGdlZFxuICAgIC8vIHdpdGggYW4gaWQgYW5kIHRoZW4gc2lsZW50bHkgbG9zdCB3aGVuIHRoZSBtZW1vcnkgb3V0Z3JldyBzYXZlIGxpbWl0cy5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWFuYWdlci5hc3NlcnRQZXJzaXN0YWJsZSh0YXJnZXRNZW1vcnkpO1xuICAgIH0gY2F0Y2ggKHZhbGlkYXRpb25FcnIpIHtcbiAgICAgIHRhcmdldE1lbW9yeS5yZW1vdmVFbnRyeShlbnRyeVJlc3VsdC5pZCk7XG4gICAgICAvLyBhZGRFbnRyeSBtYXkgaGF2ZSBldmljdGVkIG9sZCBlbnRyaWVzIChyZXRlbnRpb24vY2FwYWNpdHkgcG9saWN5KVxuICAgICAgLy8gYmVmb3JlIHZhbGlkYXRpb24gZmFpbGVkLiBUaGUgZXZpY3Rpb24gc3RhbmRzIOKAlCBpdCB3b3VsZCBoYXBwZW4gb25cbiAgICAgIC8vIGFueSBmdXR1cmUgc3VjY2Vzc2Z1bCBhZGQg4oCUIGJ1dCBpdCBtdXN0IHJlYWNoIGRpc2ssIG9yIFJBTSBhbmQgZGlza1xuICAgICAgLy8gc2lsZW50bHkgZGl2ZXJnZSB3aXRoIG5vIHNhdmUgc2NoZWR1bGVkLlxuICAgICAgaWYgKHRhcmdldE1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSAhPT0gZW50cmllc0JlZm9yZSkge1xuICAgICAgICB0aGlzLmRlYm91bmNlZE1lbW9yeVNhdmUobWVtb3J5TmFtZSwgdGFyZ2V0TWVtb3J5LCBtYW5hZ2VyKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEVudHJ5IE5PVCBzYXZlZCB0byBtZW1vcnkgJyR7bWVtb3J5TmFtZX0nOiBgICtcbiAgICAgICAgYCR7dmFsaWRhdGlvbkVyciBpbnN0YW5jZW9mIEVycm9yID8gdmFsaWRhdGlvbkVyci5tZXNzYWdlIDogdmFsaWRhdGlvbkVycn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2NTc6IFRyYWNrIHNhdmUgZnJlcXVlbmN5IGFuZCBhbGVydCBvbiBhbm9tYWxvdXMgcGF0dGVybnMuXG4gICAgdGhpcy50cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZSk7XG4gICAgLy8gSXNzdWUgIzY1NjogRGVib3VuY2Ugc2F2ZXMgdG8gcHJldmVudCBGRCBleGhhdXN0aW9uIGZyb20gcmFwaWQgYWRkRW50cnkgY2FsbHMuXG4gICAgLy8gVGhlIGVudHJ5IGlzIGFscmVhZHkgaW4gbWVtb3J5IOKAlCBkaXNrIHdyaXRlIGlzIGRlZmVycmVkIGFuZCBjb2FsZXNjZWQuXG4gICAgdGhpcy5kZWJvdW5jZWRNZW1vcnlTYXZlKG1lbW9yeU5hbWUsIHRhcmdldE1lbW9yeSwgbWFuYWdlcik7XG4gICAgcmV0dXJuIGVudHJ5UmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEFnZW50IG9wZXJhdGlvbnMgdG8gQWdlbnRNYW5hZ2VyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQWdlbnQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5oYW5kbGVycy5hZ2VudE1hbmFnZXI7XG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXJcbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgIGNvbnN0IGFnZW50TmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICBwYXJhbXMsXG4gICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICd0aGUgbmFtZSBvZiB0aGUgYWdlbnQgdG8gZXhlY3V0ZSdcbiAgICApO1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUnOlxuICAgICAgICByZXR1cm4gbWFuYWdlci5leGVjdXRlQWdlbnQoXG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBZ2VudCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBUZW1wbGF0ZSBvcGVyYXRpb25zIHRvIFRlbXBsYXRlUmVuZGVyZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hUZW1wbGF0ZShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5oYW5kbGVycy50ZW1wbGF0ZVJlbmRlcmVyO1xuICAgIC8vIElzc3VlICMyOTA6IFVzZSBlbGVtZW50X25hbWUgcGFyYW1ldGVyXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIHJlbmRlcidcbiAgICApO1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3JlbmRlcic6XG4gICAgICAgIHJldHVybiByZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgdGVtcGxhdGVOYW1lLFxuICAgICAgICAgIHBhcmFtcy52YXJpYWJsZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgcGFyYW1zLnNlY3Rpb24gYXMgJ3RlbXBsYXRlJyB8ICdzdHlsZScgfCAnc2NyaXB0JyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJhbXMuYWxsX3NlY3Rpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFRlbXBsYXRlIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEFjdGl2YXRpb24gb3BlcmF0aW9ucyAoY3Jvc3MtY3V0dGluZyBjb25jZXJuKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEFjdGl2YXRpb24oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQ7XG4gICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIElzc3VlICMyOTA6IFVzZSBlbGVtZW50X25hbWUvZWxlbWVudF90eXBlIHBhcmFtZXRlciBuYW1lc1xuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHBhcmFtZXRlcnMgYmVmb3JlIHVzZVxuICAgIC8vIEZvciBnZXRBY3RpdmUsIGVsZW1lbnRfbmFtZSBpcyBub3QgcmVxdWlyZWRcbiAgICBpZiAobWV0aG9kICE9PSAnZ2V0QWN0aXZlJykge1xuICAgICAgY29uc3QgbmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgIHAsXG4gICAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgICAndGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZSdcbiAgICAgICk7XG5cbiAgICAgIC8vIGVsZW1lbnRfdHlwZSBjYW4gY29tZSBmcm9tIGlucHV0LmVsZW1lbnRUeXBlIG9yIHBhcmFtcy5lbGVtZW50X3R5cGVcbiAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICAgIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgdHlwZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2VsZW1lbnRfdHlwZScuIEV4cGVjdGVkOiBzdHJpbmcgKHBlcnNvbmEsIHNraWxsLCB0ZW1wbGF0ZSwgYWdlbnQsIG1lbW9yeSwgb3IgZW5zZW1ibGUpYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlICdhY3RpdmF0ZSc6XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIuYWN0aXZhdGVFbGVtZW50KFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwLmNvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgJ2RlYWN0aXZhdGUnOlxuICAgICAgICAgIHJldHVybiBoYW5kbGVyLmRlYWN0aXZhdGVFbGVtZW50KG5hbWUsIHR5cGUpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEFjdGl2YXRpb24gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXRBY3RpdmU6IGVsZW1lbnRfdHlwZSBpcyBvcHRpb25hbCAtIGlmIG5vdCBwcm92aWRlZCwgcmV0dXJucyBhbGwgYWN0aXZlIGVsZW1lbnRzXG4gICAgLy8gSXNzdWUgIzUwMTogUGFzcyB0eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCDigJQgZ2V0QWN0aXZlRWxlbWVudHMgaGFuZGxlcyBib3RoIGNhc2VzXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnRUeXBlIHx8IChwLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgIHJldHVybiBoYW5kbGVyLmdldEFjdGl2ZUVsZW1lbnRzKHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIFNlYXJjaCBvcGVyYXRpb25zIHRvIEVsZW1lbnRRdWVyeVNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hTZWFyY2goXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgcXVlcnlTZXJ2aWNlID0gdGhpcy5oYW5kbGVycy5lbGVtZW50UXVlcnlTZXJ2aWNlO1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVNlYXJjaEVsZW1lbnRzKGlucHV0KTtcblxuICAgICAgY2FzZSAncXVlcnknOiB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnRUeXBlIGlzIHJlcXVpcmVkIGZvciBxdWVyeVxuICAgICAgICBpZiAoIWVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50VHlwZSBpcyByZXF1aXJlZCBmb3IgcXVlcnlfZWxlbWVudHMgb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmF3IGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSAoY2FzdCB0byBJRWxlbWVudFtdIGZvciBxdWVyeSBzZXJ2aWNlKVxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IChhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEVsZW1lbnRzKGVsZW1lbnRUeXBlKSkgYXMgSUVsZW1lbnRbXTtcblxuICAgICAgICAvLyBCdWlsZCBRdWVyeU9wdGlvbnMgZnJvbSBwYXJhbXNcbiAgICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgcXVlcnlPcHRpb25zOiB7XG4gICAgICAgICAgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIHNvcnQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBwYWdpbmF0aW9uPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgYWdncmVnYXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH0gPSB7fTtcblxuICAgICAgICBpZiAocC5maWx0ZXJzKSB7XG4gICAgICAgICAgcXVlcnlPcHRpb25zLmZpbHRlcnMgPSBwLmZpbHRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAuc29ydCkge1xuICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5zb3J0ID0gcC5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnBhZ2luYXRpb24pIHtcbiAgICAgICAgICBxdWVyeU9wdGlvbnMucGFnaW5hdGlvbiA9IHAucGFnaW5hdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhZ2dyZWdhdGlvbiByZXF1ZXN0cyAoSXNzdWUgIzMwOSkg4oCUIGRlbGVnYXRlcyB0byBzaGFyZWQgQWdncmVnYXRpb25TZXJ2aWNlXG4gICAgICAgIGlmIChwLmFnZ3JlZ2F0ZSkge1xuICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZSA9IHAuYWdncmVnYXRlIGFzIHsgY291bnQ/OiBib29sZWFuOyBncm91cF9ieT86IHN0cmluZyB9O1xuXG4gICAgICAgICAgLy8gVmFsaWRhdGUgYWdncmVnYXRpb24gb3B0aW9uc1xuICAgICAgICAgIGNvbnN0IGFnZ0Vycm9yID0gdmFsaWRhdGVBZ2dyZWdhdGlvbk9wdGlvbnMoYWdncmVnYXRlKTtcbiAgICAgICAgICBpZiAoYWdnRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihhZ2dFcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZUVsZW1lbnRzKFxuICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZSxcbiAgICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5maWx0ZXJzIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNTAwOiBOb3JtYWxpemUgZmxhdCBwYWdpbmF0aW9uIHBhcmFtcyAocGFnZVNpemUsIHBhZ2UsIGxpbWl0LCBvZmZzZXQpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBmbGF0IHBhcmFtcyBsaWtlIHsgcGFnZVNpemU6IDUgfSB3b3JrIHRoZSBzYW1lIGFzIHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogNSB9IH1cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhZ2luYXRpb24gPSBub3JtYWxpemVQYWdpbmF0aW9uUGFyYW1zKHApO1xuICAgICAgICBxdWVyeU9wdGlvbnMucGFnaW5hdGlvbiA9IG5vcm1hbGl6ZWRQYWdpbmF0aW9uO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgcXVlcnkgd2l0aCBFbGVtZW50UXVlcnlTZXJ2aWNlXG4gICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gcXVlcnlTZXJ2aWNlLnF1ZXJ5KGVsZW1lbnRzLCBxdWVyeU9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFJldHVybiBjb25jaXNlIHN0cnVjdHVyZWQgcmVzcG9uc2UgKElzc3VlICMyOTkpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXRlbXM6IHF1ZXJ5UmVzdWx0Lml0ZW1zLm1hcCgoaXRlbTogSUVsZW1lbnQpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBpdGVtLm1ldGFkYXRhPy5uYW1lIHx8ICdVbmtub3duJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBpdGVtLm1ldGFkYXRhPy5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgdmVyc2lvbjogaXRlbS5tZXRhZGF0YT8udmVyc2lvbiB8fCBpdGVtLnZlcnNpb24sXG4gICAgICAgICAgICB0YWdzOiBpdGVtLm1ldGFkYXRhPy50YWdzLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBwYWdpbmF0aW9uOiBxdWVyeVJlc3VsdC5wYWdpbmF0aW9uLFxuICAgICAgICAgIHNvcnRpbmc6IHF1ZXJ5UmVzdWx0LnNvcnRpbmcsXG4gICAgICAgICAgZmlsdGVyczogcXVlcnlSZXN1bHQuZmlsdGVycy5hcHBsaWVkLmNvdW50ID4gMCA/IHsgYXBwbGllZDogcXVlcnlSZXN1bHQuZmlsdGVycy5hcHBsaWVkIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFNlYXJjaCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5PVEU6IFVuaWZpZWQgU2VhcmNoIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpIGFyZSBub3cgc2NoZW1hLWRyaXZlbi5cbiAgLy8gVGhlICdzZWFyY2gnIG9wZXJhdGlvbiB1c2VzIHRoZSAnc2VhcmNoUGFyYW1zJyBub3JtYWxpemVyIGluIE9wZXJhdGlvblNjaGVtYS50cy5cbiAgLy8gU2VlOiBTZWFyY2hQYXJhbXNOb3JtYWxpemVyIGZvciBzY29wZS9wYWdpbmF0aW9uL3NvcnQvZmlsdGVyIHRyYW5zZm9ybWF0aW9uLlxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBJbnRyb3NwZWN0aW9uIG9wZXJhdGlvbnMgdG8gSW50cm9zcGVjdGlvblJlc29sdmVyXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoSW50cm9zcGVjdGlvbihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHVua25vd24ge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdyZXNvbHZlJzpcbiAgICAgICAgcmV0dXJuIEludHJvc3BlY3Rpb25SZXNvbHZlci5yZXNvbHZlKHBhcmFtcyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBJbnRyb3NwZWN0aW9uIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBlbGVtZW50cyBhY3Jvc3Mgb25lIG9yIGFsbCBlbGVtZW50IHR5cGVzXG4gICAqXG4gICAqIEltcGxlbWVudHMgc2ltcGxlIGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG1hdGNoaW5nIG9uOlxuICAgKiAtIG1ldGFkYXRhLm5hbWVcbiAgICogLSBtZXRhZGF0YS5kZXNjcmlwdGlvblxuICAgKiAtIGNvbnRlbnQgKGlmIGF2YWlsYWJsZSlcbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3B0aW9uYWwgZWxlbWVudFR5cGUgYW5kIHNlYXJjaCBwYXJhbXNcbiAgICogQHJldHVybnMgU2VhcmNoIHJlc3VsdHMgd2l0aCBtYXRjaGVkIGVsZW1lbnRzIGFuZCByZWxldmFuY2UgaW5mb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZWFyY2hFbGVtZW50cyhpbnB1dDogT3BlcmF0aW9uSW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBzZWFyY2hTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IG1lbW9yeUJlZm9yZSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZDtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgcXVlcnkgPSAocC5xdWVyeSBhcyBzdHJpbmcpPy50cmltKCk7XG5cbiAgICAvLyBJc3N1ZSAjNTAwOiBOb3JtYWxpemUgZmxhdCBwYWdpbmF0aW9uIHBhcmFtcyAocGFnZVNpemUsIHBhZ2UsIGxpbWl0LCBvZmZzZXQpXG4gICAgY29uc3QgeyBwYWdlLCBwYWdlU2l6ZSB9ID0gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhwKTtcblxuICAgIC8vIEV4dHJhY3Qgc29ydCBwYXJhbXNcbiAgICBjb25zdCBzb3J0UGFyYW0gPSBwLnNvcnQgYXMgeyBzb3J0Qnk/OiBzdHJpbmc7IHNvcnRPcmRlcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNvcnRCeSA9IHNvcnRQYXJhbT8uc29ydEJ5ID8/ICduYW1lJztcbiAgICBjb25zdCBzb3J0T3JkZXIgPSAoc29ydFBhcmFtPy5zb3J0T3JkZXIgPz8gJ2FzYycpIGFzICdhc2MnIHwgJ2Rlc2MnO1xuXG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbiB3aXRoIGxlbmd0aCBsaW1pdFxuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VhcmNoIHF1ZXJ5IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChxdWVyeS5sZW5ndGggPiAxMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBtdXN0IGJlIHVuZGVyIDEwMDAgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB3aGljaCBlbGVtZW50IHR5cGVzIHRvIHNlYXJjaCAoSXNzdWUgIzQzMzogYWNjZXB0IHNpbmd1bGFyIGZvcm1zKVxuICAgIGxldCBlbGVtZW50VHlwZXM6IHN0cmluZ1tdO1xuICAgIGlmIChlbGVtZW50VHlwZSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTtcbiAgICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlICcke2VsZW1lbnRUeXBlfScuIFZhbGlkIHR5cGVzOiAke2Zvcm1hdEVsZW1lbnRUeXBlc0xpc3QoKX1gKTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRUeXBlcyA9IFtub3JtYWxpemVkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudFR5cGVzID0gWy4uLkFMTF9FTEVNRU5UX1RZUEVTXTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxSZXN1bHRzOiBBcnJheTx7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgbWF0Y2hlZEluOiBzdHJpbmdbXTtcbiAgICB9PiA9IFtdO1xuXG4gICAgLy8gQ29sbGVjdCBBTEwgbWF0Y2hlcyAobm8gZWFybHkgdGVybWluYXRpb24g4oCUIHBhZ2luYXRpb24gaGFuZGxlcyBsaW1pdGluZylcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgZWxlbWVudFR5cGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0RWxlbWVudHModHlwZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pikge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWRJbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IChlbGVtZW50Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB8fCB7fTtcblxuICAgICAgICAgIC8vIENoZWNrIG5hbWUgbWF0Y2hcbiAgICAgICAgICBjb25zdCBuYW1lID0gKG1ldGFkYXRhLm5hbWUgYXMgc3RyaW5nKSB8fCAnJztcbiAgICAgICAgICBpZiAobmFtZSAmJiBpc1NlYXJjaE1hdGNoKHF1ZXJ5LCBuYW1lKSkge1xuICAgICAgICAgICAgbWF0Y2hlZEluLnB1c2goJ25hbWUnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBkZXNjcmlwdGlvbiBtYXRjaFxuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKG1ldGFkYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgfHwgJyc7XG4gICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICYmIGlzU2VhcmNoTWF0Y2gocXVlcnksIGRlc2NyaXB0aW9uKSkge1xuICAgICAgICAgICAgbWF0Y2hlZEluLnB1c2goJ2Rlc2NyaXB0aW9uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgY29udGVudCBtYXRjaCAoaWYgYXZhaWxhYmxlKVxuICAgICAgICAgIGlmIChlbGVtZW50LmNvbnRlbnQgJiYgdHlwZW9mIGVsZW1lbnQuY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChpc1NlYXJjaE1hdGNoKHF1ZXJ5LCBlbGVtZW50LmNvbnRlbnQgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICBtYXRjaGVkSW4ucHVzaCgnY29udGVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGFueSBtYXRjaGVzIGZvdW5kLCBhZGQgdG8gcmVzdWx0c1xuICAgICAgICAgIC8vIFVzZSAnbmFtZScgaGVyZSDigJQgRklFTERfVFJBTlNGT1JNUyB3aWxsIHJlbmFtZSB0byAnZWxlbWVudF9uYW1lJyBpbiBhcHBseUZpZWxkU2VsZWN0aW9uXG4gICAgICAgICAgaWYgKG1hdGNoZWRJbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbGxSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgbWF0Y2hlZEluLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBTa2lwIGVsZW1lbnQgdHlwZXMgdGhhdCBmYWlsIHRvIGxvYWRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gbG9hZCBlbGVtZW50cyBmb3Igc2VhcmNoOiAke3R5cGV9YCwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgc2VhcmNoIG1ldHJpY3MgdmlhIFBlcmZvcm1hbmNlTW9uaXRvclxuICAgIHRoaXMuaGFuZGxlcnMucGVyZm9ybWFuY2VNb25pdG9yPy5yZWNvcmRTZWFyY2goe1xuICAgICAgcXVlcnksXG4gICAgICBkdXJhdGlvbjogcGVyZm9ybWFuY2Uubm93KCkgLSBzZWFyY2hTdGFydCxcbiAgICAgIHJlc3VsdENvdW50OiBhbGxSZXN1bHRzLmxlbmd0aCxcbiAgICAgIHNvdXJjZXM6IGVsZW1lbnRUeXBlcyxcbiAgICAgIGNhY2hlSGl0OiBmYWxzZSxcbiAgICAgIG1lbW9yeUJlZm9yZSxcbiAgICAgIG1lbW9yeUFmdGVyOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgfSk7XG5cbiAgICAvLyBTb3J0IHJlc3VsdHMgKGN1cnJlbnRseSBvbmx5ICduYW1lJyBpcyBzdXBwb3J0ZWQgYXMgYSBzb3J0IGZpZWxkKVxuICAgIGNvbnN0IHNvcnRlZFJlc3VsdHMgPSBbLi4uYWxsUmVzdWx0c10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgY21wID0gYS5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYycgPyAtY21wIDogY21wO1xuICAgIH0pO1xuXG4gICAgLy8gUGFnaW5hdGUgdmlhIFBhZ2luYXRpb25TZXJ2aWNlXG4gICAgY29uc3QgcGFnaW5hdG9yID0gbmV3IFBhZ2luYXRpb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgcGFnaW5hdGVkID0gcGFnaW5hdG9yLnBhZ2luYXRlKHNvcnRlZFJlc3VsdHMsIHsgcGFnZSwgcGFnZVNpemUgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHBhZ2luYXRlZC5pdGVtcyxcbiAgICAgIHBhZ2luYXRpb246IHBhZ2luYXRlZC5wYWdpbmF0aW9uLFxuICAgICAgc29ydGluZzogeyBzb3J0QnksIHNvcnRPcmRlciB9LFxuICAgICAgcXVlcnksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUNQLUFRTCBFeHRlbnNpb24gRGlzcGF0Y2ggTWV0aG9kcyAoSXNzdWUgIzI0MSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBDb2xsZWN0aW9uIG9wZXJhdGlvbnMgdG8gQ29sbGVjdGlvbkhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hDb2xsZWN0aW9uKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuY29sbGVjdGlvbkhhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBDb2xsZWN0aW9uSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdicm93c2UnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5icm93c2VDb2xsZWN0aW9uKFxuICAgICAgICAgIHBhcmFtcy5zZWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQ29sbGVjdGlvbihwYXJhbXMucXVlcnkgYXMgc3RyaW5nKTtcblxuICAgICAgY2FzZSAnc2VhcmNoRW5oYW5jZWQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hDb2xsZWN0aW9uRW5oYW5jZWQocGFyYW1zLnF1ZXJ5IGFzIHN0cmluZywgcGFyYW1zKTtcblxuICAgICAgY2FzZSAnZ2V0Q29udGVudCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldENvbGxlY3Rpb25Db250ZW50KHBhcmFtcy5wYXRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGNhc2UgJ2dldENhY2hlSGVhbHRoJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNhY2hlSGVhbHRoKCk7XG5cbiAgICAgIGNhc2UgJ2luc3RhbGwnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5pbnN0YWxsQ29udGVudChwYXJhbXMucGF0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBjYXNlICdzdWJtaXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zdWJtaXRDb250ZW50KHBhcmFtcy5jb250ZW50IGFzIHN0cmluZyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBDb2xsZWN0aW9uIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIFBvcnRmb2xpbyBvcGVyYXRpb25zIHRvIFBvcnRmb2xpb0hhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hQb3J0Zm9saW8oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5wb3J0Zm9saW9IYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW8gb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBQb3J0Zm9saW9IYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3N0YXR1cyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnBvcnRmb2xpb1N0YXR1cyhwYXJhbXMudXNlcm5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICAgICAgY2FzZSAnaW5pdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmluaXRQb3J0Zm9saW8oe1xuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiBwYXJhbXMucmVwb3NpdG9yeV9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcml2YXRlOiBwYXJhbXMucHJpdmF0ZSBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwYXJhbXMuZGVzY3JpcHRpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnY29uZmlnJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIucG9ydGZvbGlvQ29uZmlnKHtcbiAgICAgICAgICBhdXRvU3luYzogcGFyYW1zLmF1dG9fc3luYyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGRlZmF1bHRWaXNpYmlsaXR5OiBwYXJhbXMuZGVmYXVsdF92aXNpYmlsaXR5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBhdXRvU3VibWl0OiBwYXJhbXMuYXV0b19zdWJtaXQgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcGFyYW1zLnJlcG9zaXRvcnlfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzeW5jJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc3luY1BvcnRmb2xpbyh7XG4gICAgICAgICAgZGlyZWN0aW9uOiAocGFyYW1zLmRpcmVjdGlvbiBhcyBzdHJpbmcpIHx8ICdwdXNoJyxcbiAgICAgICAgICBtb2RlOiBwYXJhbXMubW9kZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZm9yY2U6IHBhcmFtcy5mb3JjZSBhcyBib29sZWFuIHx8IGZhbHNlLFxuICAgICAgICAgIGRyeVJ1bjogcGFyYW1zLmRyeV9ydW4gYXMgYm9vbGVhbiB8fCBmYWxzZSxcbiAgICAgICAgICBjb25maXJtRGVsZXRpb25zOiBwYXJhbXMuY29uZmlybV9kZWxldGlvbnMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaFBvcnRmb2xpbyh7XG4gICAgICAgICAgcXVlcnk6IHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy50eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBmdXp6eU1hdGNoOiBwYXJhbXMuZnV6enlfbWF0Y2ggYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhSZXN1bHRzOiBwYXJhbXMubWF4X3Jlc3VsdHMgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGluY2x1ZGVLZXl3b3JkczogcGFyYW1zLmluY2x1ZGVfa2V5d29yZHMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlVGFnczogcGFyYW1zLmluY2x1ZGVfdGFncyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGluY2x1ZGVUcmlnZ2VyczogcGFyYW1zLmluY2x1ZGVfdHJpZ2dlcnMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlRGVzY3JpcHRpb25zOiBwYXJhbXMuaW5jbHVkZV9kZXNjcmlwdGlvbnMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaEFsbCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaEFsbCh7XG4gICAgICAgICAgcXVlcnk6IHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcsXG4gICAgICAgICAgc291cmNlczogcGFyYW1zLnNvdXJjZXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy50eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYWdlOiBwYXJhbXMucGFnZSBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFnZVNpemU6IHBhcmFtcy5wYWdlX3NpemUgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHNvcnRCeTogcGFyYW1zLnNvcnRfYnkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnZWxlbWVudE1hbmFnZXInOiB7XG4gICAgICAgIGNvbnN0IHN5bmNIYW5kbGVyID0gdGhpcy5oYW5kbGVycy5zeW5jSGFuZGxlcjtcbiAgICAgICAgaWYgKCFzeW5jSGFuZGxlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydGZvbGlvIGVsZW1lbnQgbWFuYWdlciBub3QgYXZhaWxhYmxlOiBTeW5jSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzeW5jSGFuZGxlci5oYW5kbGVTeW5jT3BlcmF0aW9uKHtcbiAgICAgICAgICBvcGVyYXRpb246IHBhcmFtcy5vcGVyYXRpb24gYXMgJ2xpc3QtcmVtb3RlJyB8ICdkb3dubG9hZCcgfCAndXBsb2FkJyB8ICdjb21wYXJlJyxcbiAgICAgICAgICBlbGVtZW50X25hbWU6IHBhcmFtcy5lbGVtZW50X25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRfdHlwZTogcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBFbGVtZW50VHlwZSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBmaWx0ZXI6IHBhcmFtcy5maWx0ZXIgYXMgeyB0eXBlPzogRWxlbWVudFR5cGU7IGF1dGhvcj86IHN0cmluZzsgdXBkYXRlZF9hZnRlcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG9wdGlvbnM6IHBhcmFtcy5vcHRpb25zIGFzIHsgZm9yY2U/OiBib29sZWFuOyBkcnlfcnVuPzogYm9vbGVhbjsgaW5jbHVkZV9wcml2YXRlPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFBvcnRmb2xpbyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBdXRoIG9wZXJhdGlvbnMgdG8gR2l0SHViQXV0aEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hBdXRoKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuYXV0aEhhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGggb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBHaXRIdWJBdXRoSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzZXR1cCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNldHVwR2l0SHViQXV0aCgpO1xuXG4gICAgICBjYXNlICdjaGVjayc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmNoZWNrR2l0SHViQXV0aCgpO1xuXG4gICAgICBjYXNlICdjbGVhcic6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmNsZWFyR2l0SHViQXV0aCgpO1xuXG4gICAgICBjYXNlICdjb25maWd1cmVPQXV0aCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmNvbmZpZ3VyZU9BdXRoKHBhcmFtcy5jbGllbnRfaWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICAgICAgY2FzZSAnb2F1dGhIZWxwZXJTdGF0dXMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRPQXV0aEhlbHBlclN0YXR1cyhwYXJhbXMudmVyYm9zZSBhcyBib29sZWFuIHwgdW5kZWZpbmVkKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEF1dGggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQ29uZmlnIG9wZXJhdGlvbnMgdG8gQ29uZmlnSGFuZGxlciBhbmQgQnVpbGRJbmZvU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaENvbmZpZyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdtYW5hZ2UnOiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmNvbmZpZ0hhbmRsZXI7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlnIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQ29uZmlnSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmhhbmRsZUNvbmZpZ09wZXJhdGlvbih7XG4gICAgICAgICAgYWN0aW9uOiBwYXJhbXMuYWN0aW9uIGFzICdnZXQnIHwgJ3NldCcgfCAncmVzZXQnIHwgJ2V4cG9ydCcgfCAnaW1wb3J0JyB8ICd3aXphcmQnLFxuICAgICAgICAgIHNldHRpbmc6IHBhcmFtcy5zZXR0aW5nIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB2YWx1ZTogcGFyYW1zLnZhbHVlLFxuICAgICAgICAgIHNlY3Rpb246IHBhcmFtcy5zZWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBmb3JtYXQ6IHBhcmFtcy5mb3JtYXQgYXMgJ3lhbWwnIHwgJ2pzb24nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEJ1aWxkSW5mbyc6IHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuaGFuZGxlcnMuYnVpbGRJbmZvU2VydmljZTtcbiAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWlsZEluZm8gb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBCdWlsZEluZm9TZXJ2aWNlIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHNlcnZpY2UuZ2V0QnVpbGRJbmZvKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IHNlcnZpY2UuZm9ybWF0QnVpbGRJbmZvKGluZm8pXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0Q2FjaGVCdWRnZXRSZXBvcnQnOiB7XG4gICAgICAgIGNvbnN0IGJ1ZGdldCA9IHRoaXMuaGFuZGxlcnMuY2FjaGVNZW1vcnlCdWRnZXQ7XG4gICAgICAgIGlmICghYnVkZ2V0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZSBidWRnZXQgbm90IGF2YWlsYWJsZTogQ2FjaGVNZW1vcnlCdWRnZXQgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXBvcnQgPSBidWRnZXQuZ2V0UmVwb3J0KCk7XG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAnIyBDYWNoZSBNZW1vcnkgQnVkZ2V0IFJlcG9ydCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYCoqQnVkZ2V0OioqICR7cmVwb3J0LmJ1ZGdldE1CfSBNQmAsXG4gICAgICAgICAgYCoqVXNlZDoqKiAke3JlcG9ydC50b3RhbE1lbW9yeU1CfSBNQiAoJHtyZXBvcnQudXRpbGl6YXRpb25QZXJjZW50fSUpYCxcbiAgICAgICAgICBgKipSZWdpc3RlcmVkIENhY2hlczoqKiAke3JlcG9ydC5jYWNoZXMubGVuZ3RofWAsXG4gICAgICAgICAgJycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChyZXBvcnQuY2FjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKCd8IENhY2hlIHwgRW50cmllcyB8IE1lbW9yeSAoTUIpIHwgSGl0IFJhdGUgfCBMYXN0IEFjdGl2aXR5IHwnKTtcbiAgICAgICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcmVwb3J0LmNhY2hlcykge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZpdHkgPSBjLmxhc3RBY3Rpdml0eU1zID4gMFxuICAgICAgICAgICAgICA/IGAkeygoRGF0ZS5ub3coKSAtIGMubGFzdEFjdGl2aXR5TXMpIC8gMTAwMCkudG9GaXhlZCgwKX1zIGFnb2BcbiAgICAgICAgICAgICAgOiAnbmV2ZXInO1xuICAgICAgICAgICAgbGluZXMucHVzaChgfCAke2MubmFtZX0gfCAke2MuZW50cmllc30gfCAke2MubWVtb3J5TUJ9IHwgJHsoYy5oaXRSYXRlICogMTAwKS50b0ZpeGVkKDEpfSUgfCAke2FjdGl2aXR5fSB8YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpbmVzLnB1c2goJ19ObyBjYWNoZXMgcmVnaXN0ZXJlZC5fJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgdGV4dDogbGluZXMuam9pbignXFxuJylcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQ29uZmlnIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEVuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyB0byBFbmhhbmNlZEluZGV4SGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEVuaGFuY2VkSW5kZXgoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5oYW5jZWRJbmRleCBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IEVuaGFuY2VkSW5kZXhIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2ZpbmRTaW1pbGFyJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZmluZFNpbWlsYXJFbGVtZW50cyh7XG4gICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50X25hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogKHBhcmFtcy5saW1pdCBhcyBudW1iZXIpID8/IDEwLFxuICAgICAgICAgIHRocmVzaG9sZDogKHBhcmFtcy50aHJlc2hvbGQgYXMgbnVtYmVyKSA/PyAwLjUsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdnZXRSZWxhdGlvbnNoaXBzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudFJlbGF0aW9uc2hpcHMoe1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmVsYXRpb25zaGlwVHlwZXM6IHBhcmFtcy5yZWxhdGlvbnNoaXBfdHlwZXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2hCeVZlcmInOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hCeVZlcmIoe1xuICAgICAgICAgIHZlcmI6IHBhcmFtcy52ZXJiIGFzIHN0cmluZyxcbiAgICAgICAgICBsaW1pdDogKHBhcmFtcy5saW1pdCBhcyBudW1iZXIpID8/IDIwLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnZ2V0U3RhdHMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRSZWxhdGlvbnNoaXBTdGF0cygpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRW5oYW5jZWRJbmRleCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBQZXJzb25hIG9wZXJhdGlvbnMgdG8gUGVyc29uYUhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hQZXJzb25hKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMucGVyc29uYUhhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBQZXJzb25hSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdpbXBvcnQnOiB7XG4gICAgICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHNvdXJjZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgICAgICBjb25zdCBzb3VyY2UgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnc291cmNlJyxcbiAgICAgICAgICAnVVJMIG9yIGZpbGUgcGF0aCB0byBpbXBvcnQgcGVyc29uYSBmcm9tJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gaGFuZGxlci5pbXBvcnRQZXJzb25hKHNvdXJjZSwgcGFyYW1zLm92ZXJ3cml0ZSBhcyBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFBlcnNvbmEgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoYWxsZW5nZUlzRm9yRGVhZGxvY2tSZWxpZWYoY2hhbGxlbmdlOiB7IHJlYXNvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGNoYWxsZW5nZT8ucmVhc29uID09PSAnc3RyaW5nJyAmJiBjaGFsbGVuZ2UucmVhc29uLnN0YXJ0c1dpdGgoREVBRExPQ0tfUkVMSUVGX1JFQVNPTik7XG4gIH1cblxuICBwcml2YXRlIGlzc3VlRGVhZGxvY2tSZWxpZWZDaGFsbGVuZ2UoKToge1xuICAgIHBlbmRpbmc6IHRydWU7XG4gICAgY2hhbGxlbmdlX2lkOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHdhcm5pbmc6IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvblN0b3JlO1xuICAgIGlmICghc3RvcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmVyaWZpY2F0aW9uIHN5c3RlbSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWxsZW5nZUlkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IGNvZGUgPSBnZW5lcmF0ZURpc3BsYXlDb2RlKCk7XG4gICAgc3RvcmUuc2V0KGNoYWxsZW5nZUlkLCB7XG4gICAgICBjb2RlLFxuICAgICAgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgREVBRExPQ0tfUkVMSUVGX1RJTUVPVVRfTVMsXG4gICAgICByZWFzb246IERFQURMT0NLX1JFTElFRl9SRUFTT04sXG4gICAgfSk7XG5cbiAgICB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvbk5vdGlmaWVyPy5zaG93Q29kZShjb2RlLCBERUFETE9DS19SRUxJRUZfRElBTE9HX1JFQVNPTik7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnREFOR0VSX1pPTkVfVFJJR0dFUkVEJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuaXNzdWVEZWFkbG9ja1JlbGllZkNoYWxsZW5nZScsXG4gICAgICBkZXRhaWxzOiBgRGVhZGxvY2sgcmVsaWVmIGNoYWxsZW5nZSBpc3N1ZWQgZm9yIHNlc3Npb24gJHt0aGlzLmdhdGVrZWVwZXIuc2Vzc2lvbklkfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBjaGFsbGVuZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmdhdGVrZWVwZXIuc2Vzc2lvbklkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiB0cnVlLFxuICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgIG1lc3NhZ2U6ICdEZWFkbG9jayByZWxpZWYgcmVxdWlyZXMgaHVtYW4gY29uZmlybWF0aW9uLiBBIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBiZWVuIGRpc3BsYXllZCB0byB0aGUgdXNlci4nLFxuICAgICAgd2FybmluZzogJ0NvbXBsZXRpbmcgdGhpcyBmbG93IHdpbGwgZGVhY3RpdmF0ZSBhbGwgYWN0aXZlIGVsZW1lbnRzIGZvciB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCBjbGVhciBwZXJzaXN0ZWQgYWN0aXZhdGlvbiBzdGF0ZS4nLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbXBsZXRlRGVhZGxvY2tSZWxpZWYoY2hhbGxlbmdlSWQ6IHN0cmluZywgY29kZTogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgcmVsZWFzZWQ6IHRydWU7XG4gICAgY2hhbGxlbmdlX2lkOiBzdHJpbmc7XG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAgIGFjdGl2ZUJlZm9yZVJlc2V0OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIGRlYWN0aXZhdGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIGZhaWxlZDogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQ6IGJvb2xlYW47XG4gICAgbGlrZWx5RGVhZGxvY2tDYXVzZToge1xuICAgICAgc2FuZGJveGluZ0VsZW1lbnQ/OiB7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH07XG4gICAgICBhZHZpc29yeUVsZW1lbnRzOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIH07XG4gICAgc25hcHNob3RGaWxlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25TdG9yZTtcbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgJ1ZlcmlmaWNhdGlvbiBzeXN0ZW0gbm90IGF2YWlsYWJsZS4gRW5zdXJlIHRoZSBzZXJ2ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUNoYWxsZW5nZUlkRm9ybWF0KGNoYWxsZW5nZUlkKTtcblxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IHN0b3JlLmdldChjaGFsbGVuZ2VJZCk7XG4gICAgaWYgKCFjaGFsbGVuZ2UpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fVElNRU9VVCxcbiAgICAgICAgJ0RlYWRsb2NrIHJlbGllZiBjaGFsbGVuZ2Ugbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBleHBpcmVkIG9yIGFscmVhZHkgYmVlbiB1c2VkLiBSZXRyeSByZWxlYXNlX2RlYWRsb2NrIHRvIHJlY2VpdmUgYSBuZXcgY29kZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hhbGxlbmdlSXNGb3JEZWFkbG9ja1JlbGllZihjaGFsbGVuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgJ1RoaXMgY2hhbGxlbmdlIGlzIG5vdCBmb3IgZGVhZGxvY2sgcmVsaWVmLiBVc2UgdGhlIG1hdGNoaW5nIHZlcmlmaWNhdGlvbiBmbG93IGZvciB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZCA9IHN0b3JlLnZlcmlmeShjaGFsbGVuZ2VJZCwgY29kZSk7XG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICdWZXJpZmljYXRpb24gZmFpbGVkOiBpbmNvcnJlY3QgY29kZS4gVGhlIGNvZGUgaGFzIGJlZW4gY29uc3VtZWQgKG9uZS10aW1lIHVzZSkuIFJldHJ5IHJlbGVhc2VfZGVhZGxvY2sgdG8gcmVjZWl2ZSBhIG5ldyBjb2RlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc2V0ID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5yZWxlYXNlRGVhZGxvY2soKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fU1VDQ0VFREVEJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuY29tcGxldGVEZWFkbG9ja1JlbGllZicsXG4gICAgICBkZXRhaWxzOiBgRGVhZGxvY2sgcmVsaWVmIGNvbXBsZXRlZCBmb3Igc2Vzc2lvbiAke3RoaXMuZ2F0ZWtlZXBlci5zZXNzaW9uSWR9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGNoYWxsZW5nZUlkLFxuICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuZ2F0ZWtlZXBlci5zZXNzaW9uSWQsXG4gICAgICAgIGRlYWN0aXZhdGVkQ291bnQ6IHJlc2V0LmRlYWN0aXZhdGVkLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkQ291bnQ6IHJlc2V0LmZhaWxlZC5sZW5ndGgsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc25hcHNob3RTdWZmaXggPSByZXNldC5zbmFwc2hvdEZpbGVcbiAgICAgID8gYCBBIHJlY292ZXJ5IHNuYXBzaG90IHdhcyBzYXZlZCB0byAke3Jlc2V0LnNuYXBzaG90RmlsZX0uYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBtZXNzYWdlID0gcmVzZXQuZmFpbGVkLmxlbmd0aCA+IDBcbiAgICAgID8gYERlYWRsb2NrIHJlbGllZiBjb21wbGV0ZWQgd2l0aCAke3Jlc2V0LmZhaWxlZC5sZW5ndGh9IGRlYWN0aXZhdGlvbiBmYWlsdXJlKHMpLiBSZXZpZXcgdGhlIGZhaWxlZCBsaXN0LCBsaWtlbHkgZGVhZGxvY2sgY2F1c2UsIGFuZCByZWNvdmVyeSBzbmFwc2hvdCBiZWZvcmUgcmVhY3RpdmF0aW5nIGVsZW1lbnRzLmBcbiAgICAgIDogYERlYWRsb2NrIHJlbGllZiBjb21wbGV0ZWQuIEFsbCBhY3RpdmUgZWxlbWVudHMgZm9yIHRoaXMgc2Vzc2lvbiB3ZXJlIGRlYWN0aXZhdGVkIGFuZCBwZXJzaXN0ZWQgYWN0aXZhdGlvbiBzdGF0ZSB3YXMgY2xlYXJlZC4ke3NuYXBzaG90U3VmZml4fWA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVsZWFzZWQ6IHRydWUsXG4gICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgLi4ucmVzZXQsXG4gICAgICBtZXNzYWdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggR2F0ZWtlZXBlciBvcGVyYXRpb25zIGZvciBjb25maXJtYXRpb24gbWFuYWdlbWVudC5cbiAgICpcbiAgICogSXNzdWUgIzQ1MjogSGFuZGxlcyB0aGUgY29uZmlybV9vcGVyYXRpb24gZmxvdyB3aGVyZSB1c2VycyBhcHByb3ZlXG4gICAqIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGNvbmZpcm1hdGlvbiBwZXIgR2F0ZWtlZXBlciBwb2xpY3kuXG4gICAqXG4gICAqIEZsb3c6XG4gICAqIDEuIEdhdGVrZWVwZXIuZW5mb3JjZSgpIHJldHVybnMgY29uZmlybWF0aW9uUGVuZGluZzogdHJ1ZVxuICAgKiAyLiBMTE0gY2FsbHMgY29uZmlybV9vcGVyYXRpb24gd2l0aCB0aGUgb3BlcmF0aW9uIG5hbWVcbiAgICogMy4gVGhpcyBtZXRob2QgcmVjb3JkcyB0aGUgY29uZmlybWF0aW9uIGluIHRoZSBzZXNzaW9uXG4gICAqIDQuIExMTSByZXRyaWVzIHRoZSBvcmlnaW5hbCBvcGVyYXRpb24sIHdoaWNoIG5vdyBwYXNzZXMgdmlhIExheWVyIDNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hHYXRla2VlcGVyKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2NvbmZpcm0nOiB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdvcGVyYXRpb24nLFxuICAgICAgICAgICd0aGUgb3BlcmF0aW9uIG5hbWUgdG8gY29uZmlybSAoZS5nLiBcImNyZWF0ZV9lbGVtZW50XCIpJ1xuICAgICAgICApO1xuICAgICAgICAvLyBJc3N1ZSAjMTYzNjogTm9ybWFsaXplIGVsZW1lbnRfdHlwZSB0byBtYXRjaCB0aGUgTUNQLUFRTCBzaW5ndWxhciBmb3JtXG4gICAgICAgIC8vIHVzZWQgYnkgdGhlIGVuZm9yY2UgcGF0aC4gV2l0aG91dCB0aGlzLCBzY29wZWQgY29uZmlybWF0aW9ucyBzdG9yZWQgYXNcbiAgICAgICAgLy8gXCJjcmVhdGVfZWxlbWVudDpza2lsbHNcIiBuZXZlciBtYXRjaCBlbmZvcmNlIGxvb2t1cHMgZm9yIFwiY3JlYXRlX2VsZW1lbnQ6c2tpbGxcIi5cbiAgICAgICAgY29uc3QgcmF3RWxlbWVudFR5cGUgPSBwYXJhbXMuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSByYXdFbGVtZW50VHlwZVxuICAgICAgICAgID8gbm9ybWFsaXplTUNQQVFMRWxlbWVudFR5cGUocmF3RWxlbWVudFR5cGUpID8/IHJhd0VsZW1lbnRUeXBlXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gSXNzdWUgIzc0ODogQnVpbGQgaHVtYW4tcmVhZGFibGUgc3VtbWFyeSBvZiB3aGF0J3MgYmVpbmcgY29uZmlybWVkXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSB0aGlzLmJ1aWxkT3BlcmF0aW9uU3VtbWFyeShvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMpO1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNzU4OiBDaGVjayBmb3IgbnVjbGVhciBzYW5kYm94IOKAlCBkZW55OiBbJ2NvbmZpcm1fb3BlcmF0aW9uJ10gb24gYW55IGFjdGl2ZSBlbGVtZW50LlxuICAgICAgICAvLyBUaGlzIGlzIGEgaGFyZCBibG9jazogdGhlIExMTSBjYW5ub3QgY29uZmlybSBBTlkgb3BlcmF0aW9uIHdoaWxlIHRoZSBkZW55aW5nIGVsZW1lbnRcbiAgICAgICAgLy8gaXMgYWN0aXZlLiBUaGUgaHVtYW4gbXVzdCBkZWFjdGl2YXRlIHRoZSBlbGVtZW50IHRvIHJlc3RvcmUgY29uZmlybWF0aW9uIGNhcGFiaWxpdHkuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgYXV0b21hdGVkIGNvbmZpcm3ihpJleGVjdXRlIGxvb3BzIHRoYXQgYnlwYXNzIGh1bWFuIHJldmlldy5cbiAgICAgICAgY29uc3QgZGVueWluZ0VsZW1lbnQgPSBmaW5kQ29uZmlybURlbnlpbmdFbGVtZW50KGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGRlbnlpbmdFbGVtZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtHYXRla2VlcGVyXSBTYW5kYm94IGFjdGl2ZTogJHtkZW55aW5nRWxlbWVudC50eXBlfSBcIiR7ZGVueWluZ0VsZW1lbnQubmFtZX1cIiBkZW5pZXMgY29uZmlybV9vcGVyYXRpb25gLCB7XG4gICAgICAgICAgICBibG9ja2VkT3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgT3BlcmF0aW9uIGNhbm5vdCBiZSBjb25maXJtZWQg4oCUICR7ZGVueWluZ0VsZW1lbnQudHlwZX0gXCIke2RlbnlpbmdFbGVtZW50Lm5hbWV9XCIgaGFzIHNhbmRib3hlZCB0aGlzIHNlc3Npb24uIGAgK1xuICAgICAgICAgICAgYEFsbCBjb25maXJtYXRpb25zIGFyZSBibG9ja2VkIHdoaWxlIHRoaXMgZWxlbWVudCBpcyBhY3RpdmUuIGAgK1xuICAgICAgICAgICAgYERlYWN0aXZhdGUgdGhlIGVsZW1lbnQgdG8gcmVzdG9yZSBjb25maXJtYXRpb24gY2FwYWJpbGl0eS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM3NTg6IENoZWNrIGZvciBhZHZpc29yeSDigJQgY29uZmlybTogWydjb25maXJtX29wZXJhdGlvbiddIG9uIGFjdGl2ZSBlbGVtZW50cy5cbiAgICAgICAgLy8gTm90IGVuZm9yY2VkIGFzIGEgZ2F0ZSwgYnV0IHN1cmZhY2VkIHRvIHRoZSBodW1hbiBmb3IgYXdhcmVuZXNzLlxuICAgICAgICBjb25zdCBhZHZpc29yeUVsZW1lbnRzID0gZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzKGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgY29uc3QgYWR2aXNvcnlOb3RlID0gYWR2aXNvcnlFbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBgIE5vdGU6ICR7YWR2aXNvcnlFbGVtZW50cy5tYXAoZSA9PiBgJHtlLnR5cGV9IFwiJHtlLm5hbWV9XCJgKS5qb2luKCcsICcpfSByZXF1ZXN0IGFkZGl0aW9uYWwgc2NydXRpbnkgZm9yIGNvbmZpcm1hdGlvbnMuYFxuICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgLy8gRXZhbHVhdGUgdGhlIFRBUkdFVCBvcGVyYXRpb24ncyBwZXJtaXNzaW9uIGxldmVsIHdpdGggZnVsbCBlbGVtZW50IHBvbGljaWVzLlxuICAgICAgICAvLyBUaGlzIGlzIE5PVCBjaGVja2luZyBjb25maXJtX29wZXJhdGlvbiBpdHNlbGYgKHRoYXQgd2FzIGhhbmRsZWQgaW4gdGhlIHByaW1hcnlcbiAgICAgICAgLy8gZW5mb3JjZW1lbnQgcGF0aCB3aXRoIHNraXBFbGVtZW50UG9saWNpZXMpLiBUaGlzIGNoZWNrcyB3aGF0IHRoZSB0YXJnZXQgb3BlcmF0aW9uXG4gICAgICAgIC8vIG5lZWRzIHNvIHdlIHJlY29yZCB0aGUgcmlnaHQgY29uZmlybWF0aW9uIGxldmVsLlxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IHRoaXMuZ2F0ZWtlZXBlci5lbmZvcmNlKHtcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZ2V0RW5kcG9pbnRGb3JPcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgY29uZmlybWF0aW9uLCBpbmZvcm0gdGhlIGNhbGxlclxuICAgICAgICBpZiAoZGVjaXNpb24uYWxsb3dlZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25maXJtZWQ6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgYWxyZWFkeSBhcHByb3ZlZCAoJHtkZWNpc2lvbi5wb2xpY3lTb3VyY2UgPz8gJ2F1dG9fYXBwcm92ZSd9KS4gTm8gY29uZmlybWF0aW9uIG5lZWRlZC5gLFxuICAgICAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZWNpc2lvbi5jb25maXJtYXRpb25QZW5kaW5nKSB7XG4gICAgICAgICAgLy8gSGFyZCBkZW55IG9uIHRoZSB0YXJnZXQgb3BlcmF0aW9uIOKAlCBjb25maXJtYXRpb24gd29uJ3QgaGVscFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBPcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIiBpcyBkZW5pZWQgYnkgcG9saWN5IGFuZCBjYW5ub3QgYmUgY29uZmlybWVkLiAke2RlY2lzaW9uLnJlYXNvbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlY29yZCB0aGUgY29uZmlybWF0aW9uIGluIHRoZSBzZXNzaW9uXG4gICAgICAgIGNvbnN0IGxldmVsID0gZGVjaXNpb24ucGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFXG4gICAgICAgICAgPyBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFXG4gICAgICAgICAgOiBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TRVNTSU9OO1xuXG4gICAgICAgIHRoaXMuZ2F0ZWtlZXBlci5yZWNvcmRDb25maXJtYXRpb24ob3BlcmF0aW9uLCBsZXZlbCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgIC8vIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW06IGNsZWFyIG1hdGNoaW5nIGJsb2NrcyBmcm9tIGV4ZWN1dGluZyBhZ2VudHNcbiAgICAgICAgZm9yIChjb25zdCBbLCBhZ2VudEVudHJ5XSBvZiB0aGlzLmV4ZWN1dGluZ0FnZW50cykge1xuICAgICAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzID0gYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3MuZmlsdGVyKFxuICAgICAgICAgICAgYiA9PiBiLm9wZXJhdGlvbiAhPT0gb3BlcmF0aW9uIHx8IChlbGVtZW50VHlwZSAmJiBiLmVsZW1lbnRUeXBlICE9PSBlbGVtZW50VHlwZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb25maXJtZWQ6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogYENvbmZpcm1lZDogJHtzdW1tYXJ5fS4ke2Fkdmlzb3J5Tm90ZX1gLFxuICAgICAgICAgIHJhdGlvbmFsZTogZGVjaXNpb24ucmVhc29uLFxuICAgICAgICAgIHNjb3BlOiBlbGVtZW50VHlwZSA/IGBTY29wZWQgdG8gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWAgOiAnQWxsIGVsZW1lbnQgdHlwZXMnLFxuICAgICAgICAgIGxldmVsOiBsZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRSA/ICdzaW5nbGVfdXNlJyA6ICdzZXNzaW9uJyxcbiAgICAgICAgICBzdW1tYXJ5LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICd2ZXJpZnknOiB7XG4gICAgICAgIC8vIElzc3VlICMxNDI6IFZlcmlmeSBhIGRhbmdlciB6b25lIGNoYWxsZW5nZSBjb2RlIHRvIHVuYmxvY2sgYW4gYWdlbnQuXG4gICAgICAgIC8vIFRoaXMgaXMgc3RlcCA5IG9mIHRoZSB2ZXJpZmljYXRpb24gZmxvdyAoc2VlIGF1dG9ub215RXZhbHVhdG9yLnRzIGhlYWRlcikuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFBpcGVsaW5lOiB2YWxpZGF0ZSBwYXJhbXMg4oaSIHJhdGUgbGltaXQgY2hlY2sg4oaSIFVVSUQgdjQgZm9ybWF0IGNoZWNrIOKGklxuICAgICAgICAvLyAgICAgICAgICAgcHJlLWNoZWNrIHN0b3JlIChleHBpcmVkPykg4oaSIHZlcmlmeSBjb2RlICh3cm9uZz8pIOKGkiB1bmJsb2NrIGFnZW50XG4gICAgICAgIC8vXG4gICAgICAgIC8vIEVhY2ggc3RhZ2UgbG9ncyBhIGRpc3RpbmN0IHNlY3VyaXR5IGV2ZW50IHR5cGU6XG4gICAgICAgIC8vICAgVkVSSUZJQ0FUSU9OX0FUVEVNUFRFRCDihpIgVkVSSUZJQ0FUSU9OX0ZBSUxFRCAoZm9ybWF0L3JhdGUvd3JvbmcpIG9yXG4gICAgICAgIC8vICAgVkVSSUZJQ0FUSU9OX0VYUElSRUQgKG5vdCBmb3VuZCkgb3IgVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRFxuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkQXR0ZW1wdCgpO1xuICAgICAgICBjb25zdCBhdHRlbXB0VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBjb25zdCBjaGFsbGVuZ2VJZCA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdjaGFsbGVuZ2VfaWQnLFxuICAgICAgICAgICd0aGUgdmVyaWZpY2F0aW9uIGNoYWxsZW5nZSBJRCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29kZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdjb2RlJyxcbiAgICAgICAgICAndGhlIHZlcmlmaWNhdGlvbiBjb2RlIGRpc3BsYXllZCBvbiB5b3VyIHNjcmVlbidcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBMb2cgZXZlcnkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0FUVEVNUFRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBhdHRlbXB0ZWQgZm9yIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdGluZzogcmVqZWN0IGlmIHRvbyBtYW55IHJlY2VudCBmYWlsdXJlc1xuICAgICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlci5pc0xpbWl0ZWQoKSkge1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRSYXRlTGltaXRlZCgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiByYXRlLWxpbWl0ZWQ6IHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAoY2hhbGxlbmdlOiAke2NoYWxsZW5nZUlkfSlgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ3JhdGVfbGltaXRlZCcgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVG9vIG1hbnkgZmFpbGVkIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gUGxlYXNlIHdhaXQgYmVmb3JlIHRyeWluZyBhZ2Fpbi4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVVSUQgdjQgZm9ybWF0IHZhbGlkYXRpb246IHJlamVjdCBpbnZhbGlkIElEcyBiZWZvcmUgc3RvcmUgbG9va3VwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsaWRhdGVDaGFsbGVuZ2VJZEZvcm1hdChjaGFsbGVuZ2VJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEludmFsaWRGb3JtYXQoKTtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gcmVqZWN0ZWQ6IGludmFsaWQgY2hhbGxlbmdlX2lkIGZvcm1hdCAoJHtjaGFsbGVuZ2VJZH0pYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdpbnZhbGlkX2Zvcm1hdCcgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25TdG9yZTtcbiAgICAgICAgaWYgKCFzdG9yZSkge1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdWZXJpZmljYXRpb24gc3lzdGVtIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBjaGFsbGVuZ2UgZXhpc3RzIGFuZCBpcyBub3QgZXhwaXJlZCBiZWZvcmUgYXR0ZW1wdGluZyB2ZXJpZnlcbiAgICAgICAgLy8gVGhpcyBsZXRzIHVzIGRpc3Rpbmd1aXNoIFwid3JvbmcgY29kZVwiIGZyb20gXCJleHBpcmVkXCIgZm9yIGdyYW51bGFyIGxvZ2dpbmdcbiAgICAgICAgY29uc3QgY2hhbGxlbmdlUHJlQ2hlY2sgPSBzdG9yZS5nZXQoY2hhbGxlbmdlSWQpO1xuICAgICAgICBpZiAoIWNoYWxsZW5nZVByZUNoZWNrKSB7XG4gICAgICAgICAgLy8gQ2hhbGxlbmdlIG5vdCBmb3VuZCDigJQgZWl0aGVyIGV4cGlyZWQsIGFscmVhZHkgdXNlZCwgb3IgbmV2ZXIgZXhpc3RlZFxuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRFeHBpcmVkKCk7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9FWFBJUkVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBmYWlsZWQ6IGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfSBub3QgZm91bmQgKGV4cGlyZWQsIGFscmVhZHkgdXNlZCwgb3IgaW52YWxpZClgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ2V4cGlyZWRfb3Jfbm90X2ZvdW5kJyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX1RJTUVPVVQsXG4gICAgICAgICAgICAnVmVyaWZpY2F0aW9uIGZhaWxlZDogY2hhbGxlbmdlIG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgZXhwaXJlZCBvciBhbHJlYWR5IGJlZW4gdXNlZC4gJyArXG4gICAgICAgICAgICAnUmV0cnkgdGhlIGJsb2NrZWQgb3BlcmF0aW9uIHRvIHJlY2VpdmUgYSBuZXcgdmVyaWZpY2F0aW9uIGNvZGUuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGFsbGVuZ2VJc0ZvckRlYWRsb2NrUmVsaWVmKGNoYWxsZW5nZVByZUNoZWNrKSkge1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdUaGlzIHZlcmlmaWNhdGlvbiBjb2RlIGlzIHJlc2VydmVkIGZvciBkZWFkbG9jayByZWxpZWYuIFVzZSByZWxlYXNlX2RlYWRsb2NrIHdpdGggY2hhbGxlbmdlX2lkIGFuZCBjb2RlIHRvIGNvbXBsZXRlIHRoZSByZXNldC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgY29kZSAob25lLXRpbWUgdXNlIOKAlCBzdG9yZSBkZWxldGVzIGNoYWxsZW5nZSBhZnRlciB0aGlzIGNhbGwpXG4gICAgICAgIGNvbnN0IHZhbGlkID0gc3RvcmUudmVyaWZ5KGNoYWxsZW5nZUlkLCBjb2RlKTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgY29uc3QgcmF0ZUxpbWl0RXhjZWVkZWQgPSB0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gZmFpbGVkIGZvciBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH06IGluY29ycmVjdCBjb2RlYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICd3cm9uZ19jb2RlJywgcmF0ZUxpbWl0RXhjZWVkZWQgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVmVyaWZpY2F0aW9uIGZhaWxlZDogaW5jb3JyZWN0IGNvZGUuICcgK1xuICAgICAgICAgICAgJ1RoZSBjb2RlIGhhcyBiZWVuIGNvbnN1bWVkIChvbmUtdGltZSB1c2UpLiAnICtcbiAgICAgICAgICAgICdSZXRyeSB0aGUgYmxvY2tlZCBvcGVyYXRpb24gdG8gcmVjZWl2ZSBhIG5ldyB2ZXJpZmljYXRpb24gY29kZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3Mg4oCUIGNhbGN1bGF0ZSB0aW1lLXRvLXZlcmlmeSBhbmQgcmVjb3JkIG1ldHJpY3NcbiAgICAgICAgY29uc3QgdmVyaWZ5RHVyYXRpb25NcyA9IGF0dGVtcHRUaW1lc3RhbXAgLSAoY2hhbGxlbmdlUHJlQ2hlY2suZXhwaXJlc0F0IC0gNSAqIDYwICogMTAwMCk7XG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRTdWNjZXNzKHZlcmlmeUR1cmF0aW9uTXMgPiAwID8gdmVyaWZ5RHVyYXRpb25NcyA6IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgLy8gRmluZCB3aGljaCBhZ2VudCBpcyBibG9ja2VkIHdpdGggdGhpcyBjaGFsbGVuZ2VJZCBhbmQgdW5ibG9jayBpdFxuICAgICAgICBjb25zdCBlbmZvcmNlciA9IHRoaXMuaGFuZGxlcnMuZGFuZ2VyWm9uZUVuZm9yY2VyO1xuICAgICAgICBpZiAoZW5mb3JjZXIpIHtcbiAgICAgICAgICBjb25zdCBibG9ja2VkQWdlbnRzID0gZW5mb3JjZXIuZ2V0QmxvY2tlZEFnZW50cygpO1xuICAgICAgICAgIGxldCB1bmJsb2NrZWRBZ2VudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciAoY29uc3QgYWdlbnROYW1lIG9mIGJsb2NrZWRBZ2VudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrSW5mbyA9IGVuZm9yY2VyLmNoZWNrKGFnZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAoYmxvY2tJbmZvLnZlcmlmaWNhdGlvbklkID09PSBjaGFsbGVuZ2VJZCkge1xuICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gZW5mb3JjZXIudW5ibG9jayhhZ2VudE5hbWUsIGNoYWxsZW5nZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB1bmJsb2NrZWRBZ2VudCA9IGFnZW50TmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodW5ibG9ja2VkQWdlbnQpIHtcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9TVUNDRUVERUQnLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gc3VjY2VlZGVkOiBhZ2VudCAnJHt1bmJsb2NrZWRBZ2VudH0nIHVuYmxvY2tlZCAoY2hhbGxlbmdlOiAke2NoYWxsZW5nZUlkfSlgLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgdW5ibG9ja2VkQWdlbnQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHVuYmxvY2tlZEFnZW50LFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwuIEFnZW50ICcke3VuYmxvY2tlZEFnZW50fScgaGFzIGJlZW4gdW5ibG9ja2VkLiBZb3UgbWF5IG5vdyByZXRyeSB0aGUgb3BlcmF0aW9uLmAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvZGUgd2FzIHZhbGlkIGJ1dCBubyBhZ2VudCB3YXMgZm91bmQgYmxvY2tlZCB3aXRoIHRoaXMgY2hhbGxlbmdlSWRcbiAgICAgICAgLy8gKGNvdWxkIGJlIGEgc3RhbmRhbG9uZSB2ZXJpZmljYXRpb24sIG9yIGJsb2NrIHdhcyBhbHJlYWR5IGNsZWFyZWQpXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBzdWNjZWVkZWQgYnV0IG5vIGJsb2NrZWQgYWdlbnQgZm91bmQgZm9yIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogJ1ZlcmlmaWNhdGlvbiBzdWNjZXNzZnVsLiBZb3UgbWF5IG5vdyByZXRyeSB0aGUgb3BlcmF0aW9uLicsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3JlbGVhc2VEZWFkbG9jayc6IHtcbiAgICAgICAgY29uc3QgY2hhbGxlbmdlSWRWYWx1ZSA9IHR5cGVvZiBwYXJhbXMuY2hhbGxlbmdlX2lkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcGFyYW1zLmNoYWxsZW5nZV9pZC50cmltKClcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBjb2RlVmFsdWUgPSB0eXBlb2YgcGFyYW1zLmNvZGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBwYXJhbXMuY29kZS50cmltKClcbiAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIGlmICgoY2hhbGxlbmdlSWRWYWx1ZSAmJiAhY29kZVZhbHVlKSB8fCAoIWNoYWxsZW5nZUlkVmFsdWUgJiYgY29kZVZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdyZWxlYXNlX2RlYWRsb2NrIHJlcXVpcmVzIGJvdGggY2hhbGxlbmdlX2lkIGFuZCBjb2RlIHRvZ2V0aGVyLCBvciBuZWl0aGVyIGZvciB0aGUgaW5pdGlhbCBjaGFsbGVuZ2UgcmVxdWVzdC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hhbGxlbmdlSWRWYWx1ZSAmJiAhY29kZVZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVEZWFkbG9ja1JlbGllZkNoYWxsZW5nZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGVEZWFkbG9ja1JlbGllZihjaGFsbGVuZ2VJZFZhbHVlLCBjb2RlVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdiZWV0bGVqdWljZSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzUwMzogU2FmZS10cmlnZ2VyIHRoZSBmdWxsIGRhbmdlciB6b25lIHZlcmlmaWNhdGlvbiBwaXBlbGluZS5cbiAgICAgICAgLy8gQ3JlYXRlcyBhIGNoYWxsZW5nZSwgc3RvcmVzIGl0LCBhbmQgYmxvY2tzIGFuIGFnZW50IOKAlCBhbGwgaW4gb25lIGNhbGwuXG4gICAgICAgIC8vIElzc3VlICM1MjI6IENvZGUgaXMgc2hvd24gdmlhIE9TIGRpYWxvZywgTkVWRVIgcmV0dXJuZWQgdG8gdGhlIExMTS5cbiAgICAgICAgY29uc3QgYWdlbnROYW1lID0gdHlwZW9mIHBhcmFtcy5hZ2VudF9uYW1lID09PSAnc3RyaW5nJyAmJiBwYXJhbXMuYWdlbnRfbmFtZS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBwYXJhbXMuYWdlbnRfbmFtZVxuICAgICAgICAgIDogJ2JlZXRsZWp1aWNlLXRlc3QtYWdlbnQnO1xuXG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25TdG9yZTtcbiAgICAgICAgaWYgKCFzdG9yZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmVyaWZpY2F0aW9uU3RvcmUgbm90IGF2YWlsYWJsZS4gRW5zdXJlIHRoZSBzZXJ2ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmZvcmNlciA9IHRoaXMuaGFuZGxlcnMuZGFuZ2VyWm9uZUVuZm9yY2VyO1xuICAgICAgICBpZiAoIWVuZm9yY2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYW5nZXJab25lRW5mb3JjZXIgbm90IGF2YWlsYWJsZS4gRW5zdXJlIHRoZSBzZXJ2ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IEJFRVRMRUpVSUNFX0NIQUxMRU5HRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDsgLy8gNSBtaW51dGVzLCBtYXRjaGVzIGRlZmF1bHQgdmVyaWZpY2F0aW9uVGltZW91dE1pbnV0ZXNcbiAgICAgICAgY29uc3QgY2hhbGxlbmdlSWQgPSByYW5kb21VVUlEKCk7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBnZW5lcmF0ZURpc3BsYXlDb2RlKCk7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyBCRUVUTEVKVUlDRV9DSEFMTEVOR0VfVElNRU9VVF9NUztcblxuICAgICAgICBzdG9yZS5zZXQoY2hhbGxlbmdlSWQsIHsgY29kZSwgZXhwaXJlc0F0LCByZWFzb246ICdCZWV0bGVqdWljZSB0ZXN0IHRyaWdnZXIgKElzc3VlICM1MDMpJyB9KTtcbiAgICAgICAgZW5mb3JjZXIuYmxvY2soYWdlbnROYW1lLCAnQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyJywgWydiZWV0bGVqdWljZV9iZWV0bGVqdWljZV9iZWV0bGVqdWljZSddLCBjaGFsbGVuZ2VJZCk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyMjogU2hvdyBjb2RlIHZpYSBPUyBkaWFsb2cgKGZpcmUtYW5kLWZvcmdldCwgbm9uLWJsb2NraW5nKVxuICAgICAgICAvLyBUaGUgY29kZSBpcyBORVZFUiBpbmNsdWRlZCBpbiB0aGUgTUNQIHJlc3BvbnNlIOKAlCBvbmx5IHRoZSBodW1hbiBzZWVzIGl0LlxuICAgICAgICB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvbk5vdGlmaWVyPy5zaG93Q29kZShjb2RlLCBgQWdlbnQgJyR7YWdlbnROYW1lfScgcmVxdWlyZXMgdmVyaWZpY2F0aW9uIChCZWV0bGVqdWljZSB0cmlnZ2VyKWApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnREFOR0VSX1pPTkVfVFJJR0dFUkVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIuYmVldGxlanVpY2UnLFxuICAgICAgICAgIGRldGFpbHM6IGBCZWV0bGVqdWljZSB0ZXN0IHRyaWdnZXI6IGFnZW50ICcke2FnZW50TmFtZX0nIGJsb2NrZWQgd2l0aCBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCBhZ2VudE5hbWUsIHRlc3RUcmlnZ2VyOiB0cnVlIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjI6IFJlc3BvbnNlIGRlbGliZXJhdGVseSBvbWl0cyBjb2RlIGFuZCBpbnN0cnVjdGlvbnMuXG4gICAgICAgIC8vIFRoZSBodW1hbiByZWFkcyB0aGUgY29kZSBmcm9tIHRoZSBPUyBkaWFsb2cgYW5kIHR5cGVzIGl0IGludG8gY2hhdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmlnZ2VyZWQ6IHRydWUsXG4gICAgICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICBhZ2VudF9uYW1lOiBhZ2VudE5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke2FnZW50TmFtZX0nIGlzIG5vdyBibG9ja2VkLiBBIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBiZWVuIGRpc3BsYXllZCB0byB0aGUgdXNlci4gVGhleSBtdXN0IHR5cGUgaXQgdG8gcHJvY2VlZCB2aWEgdmVyaWZ5X2NoYWxsZW5nZS5gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdwZXJtaXNzaW9uUHJvbXB0Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1OiBFdmFsdWF0ZSBDTEktbGV2ZWwgcGVybWlzc2lvbiBwcm9tcHRzIGZvciAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2xcbiAgICAgICAgLy8gU2VlOiBkb2NzL2FyY2hpdGVjdHVyZS9QRVJNSVNTSU9OX1BST01QVF9BUkNISVRFQ1RVUkUubWQgZm9yIHByb3RvY29sIGRldGFpbHNcbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAndG9vbF9uYW1lJyxcbiAgICAgICAgICAndGhlIHRvb2wgcmVxdWVzdGluZyBwZXJtaXNzaW9uIChlLmcuLCBcIkJhc2hcIiwgXCJFZGl0XCIsIFwiV3JpdGVcIiknXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRvb2xJbnB1dFJhdyA9IHBhcmFtcy5pbnB1dDtcbiAgICAgICAgaWYgKCF0b29sSW5wdXRSYXcgfHwgdHlwZW9mIHRvb2xJbnB1dFJhdyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIFwiaW5wdXRcIiBwYXJhbWV0ZXIgZm9yICR7dG9vbE5hbWV9IHRvb2wgZXZhbHVhdGlvbi5gLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiAnZGFuZ2Vyb3VzJyxcbiAgICAgICAgICAgICAgcmVhc29uOiAnQ2Fubm90IGV2YWx1YXRlIHBlcm1pc3Npb24gd2l0aG91dCB0b29sIGlucHV0JyxcbiAgICAgICAgICAgICAgc3RhZ2U6ICdpbnB1dF92YWxpZGF0aW9uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29sSW5wdXQgPSB0b29sSW5wdXRSYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgICAgLy8gSXNzdWUgIzY2NTogVmFsaWRhdGUgQmFzaCBjb21tYW5kcyBoYXZlIGEgbm9uLWVtcHR5IGNvbW1hbmQgc3RyaW5nXG4gICAgICAgIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnKSB7XG4gICAgICAgICAgY29uc3QgY29tbWFuZCA9IHR5cGVvZiB0b29sSW5wdXQuY29tbWFuZCA9PT0gJ3N0cmluZycgPyB0b29sSW5wdXQuY29tbWFuZC50cmltKCkgOiAnJztcbiAgICAgICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIFwiY29tbWFuZFwiIGluIGlucHV0IGZvciBCYXNoIHRvb2wuIENhbm5vdCBldmFsdWF0ZSBhbiBlbXB0eSBjb21tYW5kLmAsXG4gICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgcmlza0xldmVsOiAnZGFuZ2Vyb3VzJyxcbiAgICAgICAgICAgICAgICByZWFzb246ICdFbXB0eSBCYXNoIGNvbW1hbmQg4oCUIGRlbmllZCBieSBkZWZhdWx0IGZvciBzYWZldHknLFxuICAgICAgICAgICAgICAgIHN0YWdlOiAnaW5wdXRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM2NDc6IENhcHR1cmUgYWdlbnRfaWRlbnRpdHkgZnJvbSBDbGF1ZGUgQ29kZSAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2xcbiAgICAgICAgY29uc3QgYWdlbnRJZGVudGl0eSA9IHR5cGVvZiBwYXJhbXMuYWdlbnRfaWRlbnRpdHkgPT09ICdzdHJpbmcnID8gcGFyYW1zLmFnZW50X2lkZW50aXR5IDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgNDogUmF0ZSBsaW1pdCBjaGVja1xuICAgICAgICBjb25zdCBwcm9tcHRSYXRlU3RhdHVzID0gdGhpcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgIGlmICghcHJvbXB0UmF0ZVN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRSYXRlTGltaXREZW55KCdwZXJtaXNzaW9uX3Byb21wdCcsIHRvb2xOYW1lLCBwcm9tcHRSYXRlU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuXG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgNDogVHJhY2sgdGhhdCBwZXJtaXNzaW9uX3Byb21wdCBpcyBhY3RpdmUgKGZhaWwtc2FmZSBkZXRlY3Rpb24pXG4gICAgICAgIGlmICghdGhpcy5nYXRla2VlcGVyLmlzUGVybWlzc2lvblByb21wdEFjdGl2ZSkge1xuICAgICAgICAgIHRoaXMuZ2F0ZWtlZXBlci5tYXJrUGVybWlzc2lvblByb21wdEFjdGl2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMTogU3RhdGljIGNsYXNzaWZpY2F0aW9uIChmYXN0IHBhdGgpXG4gICAgICAgIGNvbnN0IGNsYXNzaWZpY2F0aW9uID0gY2xhc3NpZnlUb29sKHRvb2xOYW1lLCB0b29sSW5wdXQpO1xuXG4gICAgICAgIGlmIChjbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2FsbG93Jykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ3N0YXRpY19jbGFzc2lmaWNhdGlvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnZGVueScpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEVSTUlTU0lPTl9QUk9NUFRfREVOSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnBlcm1pc3Npb25Qcm9tcHQnLFxuICAgICAgICAgICAgZGV0YWlsczogYFBlcm1pc3Npb24gZGVuaWVkIGZvciAke3Rvb2xOYW1lfTogJHtjbGFzc2lmaWNhdGlvbi5yZWFzb259YCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHRvb2xOYW1lLCByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCwgYWdlbnRJZGVudGl0eSB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgLi4uKGFnZW50SWRlbnRpdHkgJiYgeyBhZ2VudF9pZGVudGl0eTogYWdlbnRJZGVudGl0eSB9KSxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdzdGF0aWNfY2xhc3NpZmljYXRpb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMjogQWN0aXZlIGVsZW1lbnQgcG9saWN5IGNoZWNrXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCBlbGVtZW50RGVjaXNpb24gPSBldmFsdWF0ZUNsaVRvb2xQb2xpY3kodG9vbE5hbWUsIHRvb2xJbnB1dCwgYWN0aXZlRWxlbWVudHMpO1xuXG4gICAgICAgIGlmIChlbGVtZW50RGVjaXNpb24uYmVoYXZpb3IgPT09ICdkZW55Jykge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdQRVJNSVNTSU9OX1BST01QVF9ERU5JRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIucGVybWlzc2lvblByb21wdCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgUGVybWlzc2lvbiBkZW5pZWQgYnkgZWxlbWVudCBwb2xpY3kgZm9yICR7dG9vbE5hbWV9YCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHRvb2xOYW1lLCBtZXNzYWdlOiBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSwgYWdlbnRJZGVudGl0eSB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UsXG4gICAgICAgICAgICAuLi4oYWdlbnRJZGVudGl0eSAmJiB7IGFnZW50X2lkZW50aXR5OiBhZ2VudElkZW50aXR5IH0pLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ2VsZW1lbnRfcG9saWN5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMi4xOiBQYXR0ZXJuLWJhc2VkIGFwcHJvdmFsIChjb25maXJtUGF0dGVybnMg4oCUIElzc3VlICMxNjYwKVxuICAgICAgICBpZiAoZWxlbWVudERlY2lzaW9uLmJlaGF2aW9yID09PSAnY29uZmlybScpIHtcbiAgICAgICAgICBjb25zdCByaXNrID0gYXNzZXNzUmlzayh0b29sTmFtZSwgdG9vbElucHV0LCBjbGFzc2lmaWNhdGlvbik7XG4gICAgICAgICAgY29uc3QgcG9saWN5U291cmNlID0gZWxlbWVudERlY2lzaW9uLmNvbmZpcm1Tb3VyY2UgfHwgJ3Vua25vd24nO1xuXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxSYXRlU3RhdHVzID0gdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICAgIGlmICghYXBwcm92YWxSYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueShcbiAgICAgICAgICAgICAgJ2NsaV9hcHByb3ZhbCcsIHRvb2xOYW1lLCBhcHByb3ZhbFJhdGVTdGF0dXMsXG4gICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCwgY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgICBjb25zdCBhcHByb3ZhbFBvbGljeSA9IHJlc29sdmVDbGlBcHByb3ZhbFBvbGljeShhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgICAgY29uc3QgdHRsTXMgPSBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzID8gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyAqIDEwMDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5nYXRla2VlcGVyLmNyZWF0ZUNsaUFwcHJvdmFsUmVxdWVzdChcbiAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgcmlzay5zY29yZSxcbiAgICAgICAgICAgIHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UgfHwgYENvbmZpcm1hdGlvbiByZXF1aXJlZCBieSBlbGVtZW50IHBvbGljeWAsXG4gICAgICAgICAgICBwb2xpY3lTb3VyY2UsXG4gICAgICAgICAgICB0dGxNcyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgUmVxdWlyZXMgaHVtYW4gYXBwcm92YWwuIFJlcXVlc3QgSUQ6ICR7cmVxdWVzdElkfS4gQ2FsbCBhcHByb3ZlX2NsaV9wZXJtaXNzaW9uIHRvIGF1dGhvcml6ZS5gLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ2FwcHJvdmFsX3JlcXVpcmVkJyxcbiAgICAgICAgICAgICAgcmlza1Njb3JlOiByaXNrLnNjb3JlLFxuICAgICAgICAgICAgICBpcnJldmVyc2libGU6IHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcHJvdmFsUmVxdWVzdDoge1xuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmlza1Njb3JlOiByaXNrLnNjb3JlLFxuICAgICAgICAgICAgICBpcnJldmVyc2libGU6IHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgICByZWFzb246IGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlIHx8ICdDb25maXJtYXRpb24gcmVxdWlyZWQgYnkgZWxlbWVudCBwb2xpY3knLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyLjU6IENoZWNrIGV4aXN0aW5nIENMSSBhcHByb3ZhbCAoSXNzdWUgIzYyNSBQaGFzZSAzKVxuICAgICAgICBjb25zdCBleGlzdGluZ0FwcHJvdmFsID0gdGhpcy5nYXRla2VlcGVyLmNoZWNrQ2xpQXBwcm92YWwodG9vbE5hbWUsIHRvb2xJbnB1dCk7XG4gICAgICAgIGlmIChleGlzdGluZ0FwcHJvdmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgICAgdXBkYXRlZElucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnY2xpX2FwcHJvdmFsJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbENvbnRleHQ6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkOiBleGlzdGluZ0FwcHJvdmFsLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgc2NvcGU6IGV4aXN0aW5nQXBwcm92YWwuc2NvcGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDIuNzU6IEFwcHJvdmFsLXJlcXVpcmVkIHJvdXRpbmcgKElzc3VlICM2MjUgUGhhc2UgMylcbiAgICAgICAgY29uc3QgYXBwcm92YWxQb2xpY3kgPSByZXNvbHZlQ2xpQXBwcm92YWxQb2xpY3koYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICBpZiAoYXBwcm92YWxQb2xpY3kucmVxdWlyZUFwcHJvdmFsPy5pbmNsdWRlcyhjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwgYXMgJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKSkge1xuICAgICAgICAgIGNvbnN0IHJpc2sgPSBhc3Nlc3NSaXNrKHRvb2xOYW1lLCB0b29sSW5wdXQsIGNsYXNzaWZpY2F0aW9uKTtcbiAgICAgICAgICBjb25zdCBwb2xpY3lTb3VyY2UgPSBhY3RpdmVFbGVtZW50c1xuICAgICAgICAgICAgLmZpbHRlcihlbCA9PiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmFwcHJvdmFsUG9saWN5Py5yZXF1aXJlQXBwcm92YWw/Lmxlbmd0aClcbiAgICAgICAgICAgIC5tYXAoZWwgPT4gYCR7ZWwudHlwZX06JHtlbC5uYW1lfWApXG4gICAgICAgICAgICAuam9pbignLCAnKSB8fCAnZW52OkRPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZJztcblxuICAgICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgNDogUmF0ZSBsaW1pdCBDTEkgYXBwcm92YWwgY3JlYXRpb25cbiAgICAgICAgICBjb25zdCBhcHByb3ZhbFJhdGVTdGF0dXMgPSB0aGlzLmNsaUFwcHJvdmFsTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgICAgaWYgKCFhcHByb3ZhbFJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRSYXRlTGltaXREZW55KFxuICAgICAgICAgICAgICAnY2xpX2FwcHJvdmFsJywgdG9vbE5hbWUsIGFwcHJvdmFsUmF0ZVN0YXR1cyxcbiAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24ucmlza0xldmVsLCBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNsaUFwcHJvdmFsTGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAgIGNvbnN0IHR0bE1zID0gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyA/IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgKiAxMDAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2F0ZWtlZXBlci5jcmVhdGVDbGlBcHByb3ZhbFJlcXVlc3QoXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJpc2suc2NvcmUsXG4gICAgICAgICAgICByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIGBUb29sICcke3Rvb2xOYW1lfScgY2xhc3NpZmllZCBhcyAke2NsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbH06ICR7Y2xhc3NpZmljYXRpb24ucmVhc29ufWAsXG4gICAgICAgICAgICBwb2xpY3lTb3VyY2UsXG4gICAgICAgICAgICB0dGxNcyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgUmVxdWlyZXMgaHVtYW4gYXBwcm92YWwuIFJlcXVlc3QgSUQ6ICR7cmVxdWVzdElkfS4gQ2FsbCBhcHByb3ZlX2NsaV9wZXJtaXNzaW9uIHRvIGF1dGhvcml6ZS5gLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ2FwcHJvdmFsX3JlcXVpcmVkJyxcbiAgICAgICAgICAgICAgcmlza1Njb3JlOiByaXNrLnNjb3JlLFxuICAgICAgICAgICAgICBpcnJldmVyc2libGU6IHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcHJvdmFsUmVxdWVzdDoge1xuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmlza1Njb3JlOiByaXNrLnNjb3JlLFxuICAgICAgICAgICAgICBpcnJldmVyc2libGU6IHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMzogRGVmYXVsdCDigJQgYWxsb3cgKHBlcm1pc3NpdmUpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgdXBkYXRlZElucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICBzdGFnZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2V2YWx1YXRlUGVybWlzc2lvbic6IHtcbiAgICAgICAgLy8gRXZhbHVhdGUgQ0xJIHBlcm1pc3Npb24gZm9yIFByZVRvb2xVc2UgaG9va3MgKGFsbCBwbGF0Zm9ybXMpXG4gICAgICAgIGNvbnN0IHsgZXZhbHVhdGVQZXJtaXNzaW9uIH0gPSBhd2FpdCBpbXBvcnQoJy4vZXZhbHVhdGVQZXJtaXNzaW9uLmpzJyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZVBlcm1pc3Npb24ocGFyYW1zLCB7XG4gICAgICAgICAgcGVybWlzc2lvblByb21wdExpbWl0ZXI6IHRoaXMucGVybWlzc2lvblByb21wdExpbWl0ZXIsXG4gICAgICAgICAgY2xhc3NpZnlUb29sLFxuICAgICAgICAgIGV2YWx1YXRlQ2xpVG9vbFBvbGljeSxcbiAgICAgICAgICBnZXRBY3RpdmVFbGVtZW50czogKHNlc3Npb25JZD86IHN0cmluZykgPT4gdGhpcy5nZXRBY3RpdmVFbGVtZW50cyhzZXNzaW9uSWQpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0RWZmZWN0aXZlQ2xpUG9saWNpZXMnOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgMjogR2V0IGVmZmVjdGl2ZSBDTEkgcGVybWlzc2lvbiBwb2xpY2llc1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcmFtcy50b29sX25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB0b29sSW5wdXQgPSAocGFyYW1zLnRvb2xfaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9O1xuICAgICAgICBjb25zdCByZXBvcnRTZXNzaW9uSWQgPSB0eXBlb2YgcGFyYW1zLnNlc3Npb25faWQgPT09ICdzdHJpbmcnID8gcGFyYW1zLnNlc3Npb25faWQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJlcG9ydGluZ1Njb3BlID0gcGFyYW1zLnJlcG9ydGluZ19zY29wZSA9PT0gJ2Rhc2hib2FyZCc7XG5cbiAgICAgICAgLy8gMS4gR2V0IGFsbCBhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgY29uc3QgcG9saWN5RWxlbWVudHMgPSByZXBvcnRpbmdTY29wZSAmJiAhdG9vbE5hbWVcbiAgICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0UG9saWN5UmVwb3J0RWxlbWVudHMocmVwb3J0U2Vzc2lvbklkKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuXG4gICAgICAgIC8vIDIuIEV4dHJhY3QgZXh0ZXJuYWxSZXN0cmljdGlvbnMgZnJvbSBlYWNoIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZWxlbWVudFBvbGljaWVzID0gcG9saWN5RWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGdldEdhdGVrZWVwZXJEaWFnbm9zdGljcyhlbC5tZXRhZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICAgICAgYWxsb3dQYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hbGxvd1BhdHRlcm5zID8/IFtdLFxuICAgICAgICAgICAgY29uZmlybVBhdHRlcm5zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmNvbmZpcm1QYXR0ZXJucyA/PyBbXSxcbiAgICAgICAgICAgIGRlbnlQYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5kZW55UGF0dGVybnMgPz8gW10sXG4gICAgICAgICAgICBhbGxvd09wZXJhdGlvbnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5hbGxvdyA/PyBbXSxcbiAgICAgICAgICAgIGNvbmZpcm1PcGVyYXRpb25zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uY29uZmlybSA/PyBbXSxcbiAgICAgICAgICAgIGRlbnlPcGVyYXRpb25zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZGVueSA/PyBbXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkR2F0ZWtlZXBlclBvbGljeTogISFkaWFnbm9zdGljcyxcbiAgICAgICAgICAgIGludmFsaWRHYXRla2VlcGVyTWVzc2FnZTogZGlhZ25vc3RpY3M/Lm1lc3NhZ2UsXG4gICAgICAgICAgICBzZXNzaW9uSWRzOiAoZWwubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5zZXNzaW9uSWRzID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAzLiBCdWlsZCBjb21iaW5lZCB2aWV3XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQWxsb3cgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuYWxsb3dQYXR0ZXJucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQ29uZmlybSA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5jb25maXJtUGF0dGVybnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZERlbnkgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuZGVueVBhdHRlcm5zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRBbGxvd09wZXJhdGlvbnMgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuYWxsb3dPcGVyYXRpb25zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRDb25maXJtT3BlcmF0aW9ucyA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5jb25maXJtT3BlcmF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRGVueU9wZXJhdGlvbnMgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuZGVueU9wZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBoYXNBbGxvd2xpc3QgPSBjb21iaW5lZEFsbG93Lmxlbmd0aCA+IDAgfHwgY29tYmluZWRBbGxvd09wZXJhdGlvbnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyA0LiBJZiB0b29sX25hbWUgcHJvdmlkZWQsIGV2YWx1YXRlIGl0IGFnYWluc3QgY3VycmVudCBwb2xpY2llc1xuICAgICAgICBsZXQgZXZhbHVhdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0b29sTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHRvb2xDbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgdG9vbElucHV0KTtcbiAgICAgICAgICBjb25zdCBwb2xpY3lSZXN1bHQgPSB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdldmFsdWF0ZSdcbiAgICAgICAgICAgID8gZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCB0b29sSW5wdXQsIHBvbGljeUVsZW1lbnRzKVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgZXZhbHVhdGlvbiA9IHtcbiAgICAgICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sX2lucHV0OiBPYmplY3Qua2V5cyh0b29sSW5wdXQpLmxlbmd0aCA+IDAgPyB0b29sSW5wdXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0aWNDbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IHRvb2xDbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIGJlaGF2aW9yOiB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IsXG4gICAgICAgICAgICAgIHJlYXNvbjogdG9vbENsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbGVtZW50UG9saWN5UmVzdWx0OiBwb2xpY3lSZXN1bHQgPyB7XG4gICAgICAgICAgICAgIGJlaGF2aW9yOiBwb2xpY3lSZXN1bHQuYmVoYXZpb3IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHBvbGljeVJlc3VsdC5tZXNzYWdlLFxuICAgICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBwb2xpY3lSZXN1bHQucG9saWN5Q29udGV4dCxcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBmaW5hbEJlaGF2aW9yOiBwb2xpY3lSZXN1bHQ/LmJlaGF2aW9yID09PSAnZGVueScgPyAnZGVueSdcbiAgICAgICAgICAgICAgOiB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdkZW55JyA/ICdkZW55JyA6ICdhbGxvdycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIEZhaWwtc2FmZSBkZXRlY3Rpb24gKElzc3VlICM2MjUgUGhhc2UgNClcbiAgICAgICAgY29uc3QgcGVybWlzc2lvblByb21wdEFjdGl2ZSA9IHRoaXMuZ2F0ZWtlZXBlci5pc1Blcm1pc3Npb25Qcm9tcHRBY3RpdmU7XG4gICAgICAgIGNvbnN0IGhvb2tTdGF0dXMgPSBnZXRQZXJtaXNzaW9uSG9va1N0YXR1cygpO1xuICAgICAgICBjb25zdCBob29rSW5zdGFsbGVkID0gaG9va1N0YXR1cy5pbnN0YWxsZWQ7XG4gICAgICAgIGNvbnN0IGVuZm9yY2VtZW50UmVhZHkgPSBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlIHx8IGhvb2tJbnN0YWxsZWQ7XG4gICAgICAgIGNvbnN0IGhhc0NsaVJlc3RyaWN0aW9ucyA9IGNvbWJpbmVkQWxsb3cubGVuZ3RoID4gMCB8fCBjb21iaW5lZERlbnkubGVuZ3RoID4gMCB8fCBjb21iaW5lZENvbmZpcm0ubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgaGFzT3BlcmF0aW9uUmVzdHJpY3Rpb25zID0gY29tYmluZWRBbGxvd09wZXJhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgIHx8IGNvbWJpbmVkRGVueU9wZXJhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgIHx8IGNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgaW52YWxpZFBvbGljeUVsZW1lbnRzID0gZWxlbWVudFBvbGljaWVzLmZpbHRlcihwb2xpY3kgPT4gcG9saWN5LmludmFsaWRHYXRla2VlcGVyUG9saWN5KTtcbiAgICAgICAgbGV0IGFkdmlzb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChoYXNDbGlSZXN0cmljdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWVuZm9yY2VtZW50UmVhZHkpIHtcbiAgICAgICAgICAgIGFkdmlzb3J5ID0gJ1BvbGljaWVzIGFyZSBsb2FkZWQgYnV0IE5PVCBlbmZvcmNlZC4gTm8gcGVybWlzc2lvbiBob29rIGRldGVjdGVkIGFuZCBwZXJtaXNzaW9uX3Byb21wdCBoYXMgbm90IGJlZW4gY2FsbGVkLiBSdW4gb3Blbl9zZXR1cCBhbmQgcmVpbnN0YWxsLCBvciBsYXVuY2ggdGhlIENMSSBjbGllbnQgd2l0aCAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2wuJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGhvb2tJbnN0YWxsZWQgJiYgIXBlcm1pc3Npb25Qcm9tcHRBY3RpdmUpIHtcbiAgICAgICAgICAgIGFkdmlzb3J5ID0gYFBvbGljaWVzIGFyZSBsb2FkZWQuIFBlcm1pc3Npb24gaG9vayBkZXRlY3RlZCBmb3IgJHtob29rU3RhdHVzLmhvc3QgPz8gJ2Egc3VwcG9ydGVkIGNsaWVudCd9LCBzbyBlbmZvcmNlbWVudCBkZXBlbmRzIG9uIHVzaW5nIHRoYXQgY2xpZW50IGNvbmZpZ3VyYXRpb24uYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzT3BlcmF0aW9uUmVzdHJpY3Rpb25zKSB7XG4gICAgICAgICAgYWR2aXNvcnkgPSAnTUNQLUFRTCBvcGVyYXRpb24gcG9saWNpZXMgYXJlIGFjdGl2ZSBmb3IgRG9sbGhvdXNlIGFjdGlvbnMgaW4gdGhpcyBzZXNzaW9uLic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW52YWxpZFBvbGljeUVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkQWR2aXNvcnkgPSBidWlsZEludmFsaWRQb2xpY3lBZHZpc29yeShpbnZhbGlkUG9saWN5RWxlbWVudHMubGVuZ3RoKTtcbiAgICAgICAgICBhZHZpc29yeSA9IGFkdmlzb3J5ID8gYCR7YWR2aXNvcnl9ICR7aW52YWxpZEFkdmlzb3J5fWAgOiBpbnZhbGlkQWR2aXNvcnk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRDb3VudDogcG9saWN5RWxlbWVudHMubGVuZ3RoLFxuICAgICAgICAgIGhhc0FsbG93bGlzdCxcbiAgICAgICAgICBlbGVtZW50czogZWxlbWVudFBvbGljaWVzLFxuICAgICAgICAgIGNvbWJpbmVkQWxsb3dQYXR0ZXJuczogY29tYmluZWRBbGxvdyxcbiAgICAgICAgICBjb21iaW5lZENvbmZpcm1QYXR0ZXJuczogY29tYmluZWRDb25maXJtLFxuICAgICAgICAgIGNvbWJpbmVkRGVueVBhdHRlcm5zOiBjb21iaW5lZERlbnksXG4gICAgICAgICAgY29tYmluZWRBbGxvd09wZXJhdGlvbnMsXG4gICAgICAgICAgY29tYmluZWRDb25maXJtT3BlcmF0aW9ucyxcbiAgICAgICAgICBjb21iaW5lZERlbnlPcGVyYXRpb25zLFxuICAgICAgICAgIGV2YWx1YXRpb24sXG4gICAgICAgICAgcGVybWlzc2lvblByb21wdEFjdGl2ZSxcbiAgICAgICAgICBob29rSW5zdGFsbGVkLFxuICAgICAgICAgIGVuZm9yY2VtZW50UmVhZHksXG4gICAgICAgICAgaG9va0hvc3Q6IGhvb2tTdGF0dXMuaG9zdCxcbiAgICAgICAgICBpbnZhbGlkUG9saWN5RWxlbWVudENvdW50OiBpbnZhbGlkUG9saWN5RWxlbWVudHMubGVuZ3RoLFxuICAgICAgICAgIGFkdmlzb3J5LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRQZXJtaXNzaW9uQXV0aG9yaXR5Jzoge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRIb3N0ID0gdHlwZW9mIHBhcmFtcy5ob3N0ID09PSAnc3RyaW5nJyA/IHBhcmFtcy5ob3N0IDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWZhdWx0TW9kZTogYXV0aG9yaXR5U3RhdGUuZGVmYXVsdE1vZGUsXG4gICAgICAgICAgdXBkYXRlZEF0OiBhdXRob3JpdHlTdGF0ZS51cGRhdGVkQXQsXG4gICAgICAgICAgc3VwcG9ydGVkSG9zdHM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUU10sXG4gICAgICAgICAgc3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgICAgYWlNdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBob3N0czogYXV0aG9yaXR5U3RhdGUuaG9zdHMsXG4gICAgICAgICAgaG9zdDogcmVxdWVzdGVkSG9zdCxcbiAgICAgICAgICBtb2RlOiByZXF1ZXN0ZWRIb3N0ICYmIHJlcXVlc3RlZEhvc3QgaW4gYXV0aG9yaXR5U3RhdGUuaG9zdHNcbiAgICAgICAgICAgID8gYXV0aG9yaXR5U3RhdGUuaG9zdHNbcmVxdWVzdGVkSG9zdCBhcyBrZXlvZiB0eXBlb2YgYXV0aG9yaXR5U3RhdGUuaG9zdHNdPy5tb2RlID8/IGF1dGhvcml0eVN0YXRlLmRlZmF1bHRNb2RlXG4gICAgICAgICAgICA6IGF1dGhvcml0eVN0YXRlLmRlZmF1bHRNb2RlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhcHByb3ZlQ2xpUGVybWlzc2lvbic6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzOiBBcHByb3ZlIGEgcGVuZGluZyBDTEkgdG9vbCBwZXJtaXNzaW9uIHJlcXVlc3RcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3JlcXVlc3RfaWQnLFxuICAgICAgICAgICd0aGUgYXBwcm92YWwgcmVxdWVzdCBJRCBmcm9tIHBlcm1pc3Npb25fcHJvbXB0IGRlbnkgcmVzcG9uc2UgKGZvcm1hdDogY2xpLTxVVUlEPiknXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gKHBhcmFtcy5zY29wZSBhcyBDbGlBcHByb3ZhbFNjb3BlKSA/PyAnc2luZ2xlJztcblxuICAgICAgICAvLyBWYWxpZGF0ZSBzY29wZVxuICAgICAgICBpZiAoc2NvcGUgIT09ICdzaW5nbGUnICYmIHNjb3BlICE9PSAndG9vbF9zZXNzaW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY29wZSBcIiR7c2NvcGV9XCIuIE11c3QgYmUgXCJzaW5nbGVcIiBvciBcInRvb2xfc2Vzc2lvblwiLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5nYXRla2VlcGVyLmFwcHJvdmVDbGlSZXF1ZXN0KHJlcXVlc3RJZCwgc2NvcGUpO1xuICAgICAgICBpZiAoIXJlY29yZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVuZGluZyBhcHByb3ZhbCBmb3IgXCIke3JlcXVlc3RJZH1cIi4gSXQgbWF5IGhhdmUgZXhwaXJlZCBvciBhbHJlYWR5IGJlZW4gYXBwcm92ZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFwcHJvdmVkOiB0cnVlLFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICB0b29sTmFtZTogcmVjb3JkLnRvb2xOYW1lLFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIG1lc3NhZ2U6IHNjb3BlID09PSAndG9vbF9zZXNzaW9uJ1xuICAgICAgICAgICAgPyBgQXBwcm92ZWQgZm9yIGFsbCB1c2VzIG9mICcke3JlY29yZC50b29sTmFtZX0nIHRoaXMgc2Vzc2lvbi5gXG4gICAgICAgICAgICA6IGBBcHByb3ZlZCBzaW5nbGUgdXNlIG9mICcke3JlY29yZC50b29sTmFtZX0nLiBSZXRyeSB0aGUgdG9vbCBjYWxsIG5vdy5gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRQZW5kaW5nQ2xpQXBwcm92YWxzJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDM6IEdldCBhbGwgcGVuZGluZyBDTEkgdG9vbCBhcHByb3ZhbCByZXF1ZXN0c1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5nYXRla2VlcGVyLmdldFBlbmRpbmdDbGlBcHByb3ZhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5kaW5nLFxuICAgICAgICAgIGNvdW50OiBwZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEdhdGVrZWVwZXIgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTG9nZ2luZyBvcGVyYXRpb25zIChJc3N1ZSAjNTI4IC0gQ1JVREUgbWlncmF0aW9uKVxuICAgKlxuICAgKiBSb3V0ZXMgcXVlcnlfbG9ncyB0aHJvdWdoIHRoZSB1bmlmaWVkIENSVURFIHBpcGVsaW5lIGluc3RlYWQgb2ZcbiAgICogYSBzdGFuZGFsb25lIE1DUCB0b29sLCBwcm92aWRpbmcgb3BlcmF0aW9uIHJvdXRpbmcsIGdhdGVrZWVwZXJcbiAgICogcG9saWN5IGVuZm9yY2VtZW50LCBhbmQgc3RydWN0dXJlZCByZXNwb25zZSBmb3JtYXQuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTG9nZ2luZyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5oYW5kbGVycy5tZW1vcnlTaW5rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeUxvZ1Npbmsgbm90IGF2YWlsYWJsZSDigJQgbG9nZ2luZyBxdWVyeSByZXF1aXJlcyBtZW1vcnkgc2luaycpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdxdWVyeSc6IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbGlkYXRlTG9nUXVlcnlQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVycy5tZW1vcnlTaW5rLnF1ZXJ5KG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0xvZ1F1ZXJ5UmVzdWx0JywgLi4ucmVzdWx0IH07XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gTG9nZ2luZyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBNZXRyaWNzIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIFJvdXRlcyBxdWVyeV9tZXRyaWNzIHRocm91Z2ggdGhlIHVuaWZpZWQgQ1JVREUgcGlwZWxpbmUsIHByb3ZpZGluZ1xuICAgKiBvcGVyYXRpb24gcm91dGluZywgZ2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQsIGFuZCBzdHJ1Y3R1cmVkIHJlc3BvbnNlIGZvcm1hdC5cbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hNZXRyaWNzKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLmhhbmRsZXJzLm1ldHJpY3NTaW5rKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogJ01ldHJpY1F1ZXJ5UmVzdWx0JyxcbiAgICAgICAgc25hcHNob3RzOiBbXSxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnTWV0cmljcyBjb2xsZWN0aW9uIGlzIG5vdCBlbmFibGVkLiBTZXQgRE9MTEhPVVNFX01FVFJJQ1NfRU5BQkxFRD10cnVlIHRvIGFjdGl2YXRlLicsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09ICdxdWVyeScpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB2YWxpZGF0ZU1ldHJpY1F1ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZXJzLm1ldHJpY3NTaW5rLnF1ZXJ5KG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHsgX3R5cGU6ICdNZXRyaWNRdWVyeVJlc3VsdCcsIC4uLnJlc3VsdCB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gTWV0cmljcyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEJyb3dzZXIgb3BlcmF0aW9ucyAoSXNzdWUgIzc3NDogb3BlbiBwb3J0Zm9saW8gYnJvd3NlcilcbiAgICovXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBCcm93c2VyIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIFN0YXJ0cyB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIgKGlmIG5vdCBydW5uaW5nKSBhbmQgb3BlbnMgdGhlXG4gICAqIHN5c3RlbSBicm93c2VyLiBSZXR1cm5zIHRoZSBVUkwgYW5kIGFueSB3YXJuaW5ncyBpZiB0aGUgYnJvd3NlclxuICAgKiBjb3VsZCBub3QgYmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgYnJvd3NlciBtZXRob2QgdG8gZGlzcGF0Y2ggKCdvcGVuJylcbiAgICogQHJldHVybnMgTUNQIHJlc3BvbnNlIHdpdGggVVJMIGFuZCBvcHRpb25hbCB3YXJuaW5nXG4gICAqIEBzZWUgSXNzdWUgIzc3NFxuICAgKi9cbiAgLyoqXG4gICAqIEV4dHJhY3QgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSBvcGVyYXRpb24gcGFyYW1zLlxuICAgKiBTZXJpYWxpemVzIGFsbCBwYXJhbXMgZXhjZXB0ICd0YWInIGFzIHN0cmluZyBrZXktdmFsdWUgcGFpcnMuXG4gICAqIEBzZWUgSXNzdWUgIzE3NjUgLSBVUkwgcGFyYW1ldGVyIHN1cHBvcnQgZm9yIHBvcnRmb2xpbyBicm93c2VyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0VXJsUGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB1cmxQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMpKSB7XG4gICAgICBpZiAoa2V5ID09PSAndGFiJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAnJykgY29udGludWU7XG4gICAgICB1cmxQYXJhbXNba2V5XSA9IE1DUEFRTEhhbmRsZXIuc2VyaWFsaXplUGFyYW1WYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh1cmxQYXJhbXMpLmxlbmd0aCA+IDAgPyB1cmxQYXJhbXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogU2VyaWFsaXplIGEgcGFyYW0gdmFsdWUgdG8gYSBVUkwtc2FmZSBzdHJpbmcuICovXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZVBhcmFtVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQnJvd3NlcihtZXRob2Q6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAobWV0aG9kICE9PSAnb3BlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBCcm93c2VyIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBvcGVuUG9ydGZvbGlvQnJvd3NlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi8uLi93ZWIvc2VydmVyLmpzJyk7XG4gICAgY29uc3QgeyBob21lZGlyIH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6b3MnKTtcbiAgICBjb25zdCBwb3J0Zm9saW9EaXIgPSBob21lZGlyKCkgKyAnLy5kb2xsaG91c2UvcG9ydGZvbGlvJztcblxuICAgIGNvbnN0IHRhYiA9IHR5cGVvZiBwYXJhbXM/LnRhYiA9PT0gJ3N0cmluZycgPyBwYXJhbXMudGFiIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHVybFBhcmFtcyA9IHBhcmFtcyA/IE1DUEFRTEhhbmRsZXIuZXh0cmFjdFVybFBhcmFtcyhwYXJhbXMpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSXNzdWUgIzc5NjogUGFzcyBNQ1BBUUxIYW5kbGVyIHRvIHdlYiBzZXJ2ZXIgZm9yIGdhdGV3YXkgcm91dGluZy5cbiAgICAvLyBJc3N1ZSAjMTg1MDogUGFzcyBzaW5rcyBzbyBmYWxsYmFjayBzZXJ2ZXIgaGFzIGZ1bGwgY29uc29sZSBmdW5jdGlvbmFsaXR5LlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZW5Qb3J0Zm9saW9Ccm93c2VyKHtcbiAgICAgIHBvcnRmb2xpb0RpcixcbiAgICAgIG1jcEFxbEhhbmRsZXI6IHRoaXMsXG4gICAgICB0YWIsXG4gICAgICB1cmxQYXJhbXMsXG4gICAgICBtZW1vcnlTaW5rOiB0aGlzLmhhbmRsZXJzLm1lbW9yeVNpbmssXG4gICAgICBtZXRyaWNzU2luazogdGhpcy5oYW5kbGVycy5tZXRyaWNzU2luayxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5hbHJlYWR5UnVubmluZyA/ICdhbHJlYWR5IHJ1bm5pbmcnIDogJ3N0YXJ0ZWQnO1xuICAgIGNvbnN0IGJyb3dzZXJTdGF0dXMgPSByZXN1bHQuYnJvd3Nlck9wZW5lZCA/ICdvcGVuZWQnIDogJ2NvdWxkIG5vdCBvcGVuIGF1dG9tYXRpY2FsbHknO1xuICAgIGNvbnN0IHdhcm5pbmcgPSByZXN1bHQud2FybmluZyA/IGBcXG5cXG7imqDvuI8gJHtyZXN1bHQud2FybmluZ31gIDogJyc7XG4gICAgY29uc3QgdGFiTm90ZSA9IHRhYiA/IGAgKCR7dGFifSB0YWIpYCA6ICcnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgdGV4dDogYFBvcnRmb2xpbyBicm93c2VyICR7c3RhdHVzfSBhdCAke3Jlc3VsdC51cmx9JHt0YWJOb3RlfSDigJQgYnJvd3NlciAke2Jyb3dzZXJTdGF0dXN9JHt3YXJuaW5nfWAsXG4gICAgICB9XSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2sgdXAgdGhlIENSVURFIGVuZHBvaW50IGZvciBhIGdpdmVuIG9wZXJhdGlvbiBuYW1lLlxuICAgKiBVc2VkIGJ5IGRpc3BhdGNoR2F0ZWtlZXBlciB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZW5kcG9pbnQgY29udGV4dC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RW5kcG9pbnRGb3JPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcpOiBDUlVERW5kcG9pbnQge1xuICAgIGNvbnN0IHJvdXRlID0gZ2V0Um91dGUob3BlcmF0aW9uKTtcbiAgICBpZiAoIXJvdXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlLmVuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgaHVtYW4tcmVhZGFibGUgc3VtbWFyeSBvZiBhbiBvcGVyYXRpb24gZm9yIGNvbmZpcm1hdGlvbiBwcm9tcHRzLlxuICAgKiBJc3N1ZSAjNzQ4OiBOYXR1cmFsIGxhbmd1YWdlIGNvbmZpcm1hdGlvbiBzdW1tYXJpZXMuXG4gICAqXG4gICAqIFRyYW5zbGF0ZXMgcmF3IG9wZXJhdGlvbiBuYW1lcyBhbmQgcGFyYW1zIGludG8gcGxhaW4gbGFuZ3VhZ2Ugc28gdXNlcnNcbiAgICogdW5kZXJzdGFuZCB3aGF0IHRoZXkncmUgYXBwcm92aW5nIHdpdGhvdXQgcGFyc2luZyBtYWNoaW5lLXJlYWRhYmxlIHBheWxvYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE9wZXJhdGlvblN1bW1hcnkoXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmcsXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbnN0IG5hbWUgPSAocC5lbGVtZW50X25hbWUgfHwgcC5uYW1lIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdHlwZUxhYmVsID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZykgfHwgJ2VsZW1lbnQnO1xuXG4gICAgLy8gT3BlcmF0aW9uLXNwZWNpZmljIG5hdHVyYWwgbGFuZ3VhZ2UgdGVtcGxhdGVzXG4gICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgJ2NyZWF0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBDcmVhdGUgYSBuZXcgJHt0eXBlTGFiZWx9IGNhbGxlZCBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBDcmVhdGUgYSBuZXcgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2VkaXRfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgRWRpdCB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYEVkaXQgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnZGVsZXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYFBlcm1hbmVudGx5IGRlbGV0ZSB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYFBlcm1hbmVudGx5IGRlbGV0ZSBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdhY3RpdmF0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBBY3RpdmF0ZSB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiIChjaGFuZ2VzIGFjdGl2ZSBwZXJtaXNzaW9uIHN1cmZhY2UpYFxuICAgICAgICAgIDogYEFjdGl2YXRlIGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2RlYWN0aXZhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgRGVhY3RpdmF0ZSB0aGUgJHt0eXBlTGFiZWx9IFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYERlYWN0aXZhdGUgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnZXhlY3V0ZV9hZ2VudCc6IHtcbiAgICAgICAgY29uc3QgZ29hbCA9IChwLmdvYWwgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgZ29hbFN1ZmZpeCA9IGdvYWwgPyBgIHdpdGggZ29hbDogJHtnb2FsfWAgOiAnJztcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBSdW4gdGhlIGFnZW50IFwiJHtuYW1lfVwiJHtnb2FsU3VmZml4fWBcbiAgICAgICAgICA6IGBFeGVjdXRlIGFuIGFnZW50JHtnb2FsU3VmZml4fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudCc6IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IChwLnBhdGggfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgcmV0dXJuIHBhdGhcbiAgICAgICAgICA/IGBJbnN0YWxsIFwiJHtwYXRofVwiIGZyb20gdGhlIGNvbW11bml0eSBjb2xsZWN0aW9uIHRvIHlvdXIgcG9ydGZvbGlvYFxuICAgICAgICAgIDogJ0luc3RhbGwgYW4gZWxlbWVudCBmcm9tIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbic7XG4gICAgICB9XG4gICAgICBjYXNlICdzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50JzpcbiAgICAgICAgcmV0dXJuICdTdWJtaXQgYSBsb2NhbCBlbGVtZW50IHRvIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbic7XG4gICAgICBjYXNlICdjbGVhcic6XG4gICAgICAgIHJldHVybiB0eXBlTGFiZWwgIT09ICdlbGVtZW50J1xuICAgICAgICAgID8gYENsZWFyIGFsbCAke3R5cGVMYWJlbH0gZGF0YWBcbiAgICAgICAgICA6ICdDbGVhciBkYXRhJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHNjaGVtYSwgb3IgZm9ybWF0dGVkIG9wZXJhdGlvbiBuYW1lXG4gICAgICAgIC8vIEluY2x1ZGUgcGFyYW1ldGVyIGtleXMgc28gdW5jb21tb24gb3BlcmF0aW9ucyBzdGlsbCBwcm92aWRlIHVzZWZ1bCBjb250ZXh0XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IEFMTF9PUEVSQVRJT05fU0NIRU1BU1tvcGVyYXRpb25dO1xuICAgICAgICBjb25zdCBwYXJhbUtleXMgPSBPYmplY3Qua2V5cyhwKS5maWx0ZXIoayA9PiBrICE9PSAnb3BlcmF0aW9uJyk7XG4gICAgICAgIGNvbnN0IHBhcmFtSGludCA9IHBhcmFtS2V5cy5sZW5ndGggPiAwID8gYCAoJHtwYXJhbUtleXMuam9pbignLCAnKX0pYCA6ICcnO1xuICAgICAgICBpZiAoc2NoZW1hPy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHJldHVybiBgJHtzY2hlbWEuZGVzY3JpcHRpb259JHtwYXJhbUhpbnR9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFBlcmZvcm0gb3BlcmF0aW9uOiAke29wZXJhdGlvbi5yZXBsYWNlKC9fL2csICcgJyl9JHtwYXJhbUhpbnR9JHtlbGVtZW50VHlwZSA/IGAgb24gJHtlbGVtZW50VHlwZX1gIDogJyd9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NvcmUgdGhlIHJpc2sgb2YgYW4gTUNQLUFRTCBvcGVyYXRpb24gZm9yIGF1dG8tY29uZmlybSBhdWRpdCB0cmFpbHMuXG4gICAqXG4gICAqIFJldHVybnMgYSBzY29yZSBmcm9tIDAtMTAwIGJhc2VkIG9uIG9wZXJhdGlvbiBjaGFyYWN0ZXJpc3RpY3M6XG4gICAqIC0gREVMRVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgODAgKGRlc3RydWN0aXZlLCBkYXRhIGxvc3MpXG4gICAqIC0gRVhFQ1VURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDYwICh1bnByZWRpY3RhYmxlIHNpZGUgZWZmZWN0cylcbiAgICogLSBVUERBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSA0MCAobW9kaWZpZXMgZXhpc3RpbmcgZGF0YSlcbiAgICogLSBDUkVBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSAyMCAoYWRkaXRpdmUsIGxvdyByaXNrKVxuICAgKlxuICAgKiBNb2RpZmllcnM6XG4gICAqIC0gT3BlcmF0aW9ucyB3aXRoIGNhbkJlRWxldmF0ZWQ6IGZhbHNlIGdldCArMTAgKHN0cnVjdHVyYWxseSBkYW5nZXJvdXMpXG4gICAqIC0gT3BlcmF0aW9ucyB0YXJnZXRpbmcgZ2F0ZWtlZXBlciBmaWVsZHMgZ2V0ICsxMCAocHJpdmlsZWdlIGVzY2FsYXRpb24gdmVjdG9yKVxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBDUlVERSBlbmRwb2ludFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnMgKGZvciBmaWVsZCBpbnNwZWN0aW9uKVxuICAgKiBAcmV0dXJucyBSaXNrIHNjb3JlIDAtMTAwXG4gICAqL1xuICBwcml2YXRlIHNjb3JlT3BlcmF0aW9uUmlzayhcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBlbmRwb2ludDogc3RyaW5nLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IG51bWJlciB7XG4gICAgLy8gQmFzZSBzY29yZSBieSBlbmRwb2ludCB0eXBlXG4gICAgY29uc3QgYmFzZVNjb3JlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIERFTEVURTogODAsXG4gICAgICBFWEVDVVRFOiA2MCxcbiAgICAgIFVQREFURTogNDAsXG4gICAgICBDUkVBVEU6IDIwLFxuICAgICAgUkVBRDogMCxcbiAgICB9O1xuICAgIGxldCBzY29yZSA9IGJhc2VTY29yZXNbZW5kcG9pbnRdID8/IDQwO1xuXG4gICAgLy8gTW9kaWZpZXI6IG5vbi1lbGV2YXRhYmxlIG9wZXJhdGlvbnMgYXJlIHN0cnVjdHVyYWxseSBtb3JlIGRhbmdlcm91c1xuICAgIGlmICghY2FuT3BlcmF0aW9uQmVFbGV2YXRlZChvcGVyYXRpb24pKSB7XG4gICAgICBzY29yZSArPSAxMDtcbiAgICB9XG5cbiAgICAvLyBNb2RpZmllcjogb3BlcmF0aW9ucyB0YXJnZXRpbmcgZ2F0ZWtlZXBlciBmaWVsZHMgKHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcilcbiAgICBpZiAocGFyYW1zICYmIG9wZXJhdGlvbiA9PT0gJ2VkaXRfZWxlbWVudCcpIHtcbiAgICAgIGNvbnN0IGlucHV0T2JqID0gcGFyYW1zLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGlucHV0T2JqPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoaW5wdXRPYmo/Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKT8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjb3JlICs9IDEwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1pbihzY29yZSwgMTAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBFeGVjdXRlIG9wZXJhdGlvbnMgZm9yIGV4ZWN1dGlvbiBsaWZlY3ljbGUgbWFuYWdlbWVudCAoSXNzdWUgIzI0NClcbiAgICpcbiAgICogRXhlY3V0ZSBvcGVyYXRpb25zIGhhbmRsZSBydW50aW1lIHN0YXRlIG9mIGV4ZWN1dGFibGUgZWxlbWVudHM6XG4gICAqIC0gZXhlY3V0ZTogU3RhcnQgYSBuZXcgZXhlY3V0aW9uXG4gICAqIC0gZ2V0U3RhdGU6IFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAqIC0gdXBkYXRlU3RhdGU6IFJlY29yZCBwcm9ncmVzcywgZmluZGluZ3MsIHN0ZXAgY29tcGxldGlvblxuICAgKiAtIGNvbXBsZXRlOiBTaWduYWwgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uXG4gICAqIC0gY29udGludWU6IFJlc3VtZSBmcm9tIHNhdmVkIHN0YXRlXG4gICAqIC0gYWJvcnQ6IENhbmNlbCBhbiBvbmdvaW5nIGV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGVzZSBvcGVyYXRpb25zIGFyZSBub24taWRlbXBvdGVudCBieSBuYXR1cmUgKHVubGlrZSBDUlVEIG9wZXJhdGlvbnMpLlxuICAgKiBDdXJyZW50bHkgcm91dGVzIHRvIEFnZW50TWFuYWdlciwgYnV0IGRlc2lnbmVkIGZvciBmdXR1cmUgZXh0ZW5zaWJpbGl0eVxuICAgKiB0byB3b3JrZmxvd3MsIHBpcGVsaW5lcywgYW5kIG90aGVyIGV4ZWN1dGFibGUgZWxlbWVudCB0eXBlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFeGVjdXRlKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyO1xuXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgZWxlbWVudF9uYW1lIHBhcmFtZXRlciAod2FzIGluY29ycmVjdGx5IHVzaW5nICduYW1lJylcbiAgICAvLyBBbGwgZXhlY3V0ZSBvcGVyYXRpb25zIHJlcXVpcmUgZWxlbWVudF9uYW1lIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXRcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IHZhbGlkYXRlRXhlY3V0aW9uRWxlbWVudE5hbWUobWV0aG9kLCBwYXJhbXMpO1xuXG4gICAgLy8gSXNzdWUgIzExMDogUHJvZ3JhbW1hdGljIGVuZm9yY2VtZW50IGZvciBEQU5HRVJfWk9ORSB0aWVyXG4gICAgLy8gSXNzdWUgIzQwMjogVXNlIERJLWluamVjdGVkIGVuZm9yY2VyIGluc3RlYWQgb2Ygc2luZ2xldG9uXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFnZW50IGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXJcbiAgICAvLyBPbmx5IGFsbG93ICdnZXRTdGF0ZScgb3BlcmF0aW9uIGZvciBibG9ja2VkIGFnZW50cyAocmVhZC1vbmx5LCBuZWVkZWQgZm9yIGRpYWdub3N0aWNzKVxuICAgIGlmIChtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgIGNvbnN0IGJsb2NrQ2hlY2sgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlci5jaGVjayhlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoYmxvY2tDaGVjay5ibG9ja2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGJsb2NrZWQgZnJvbSBleGVjdXRpbmcgJyR7bWV0aG9kfSc6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVhc29uOiBibG9ja0NoZWNrLnJlYXNvbixcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICM0MDU6IEFjdGlvbmFibGUgZ3VpZGFuY2Ugd2l0aCB2ZXJpZnlfY2hhbGxlbmdlIGluc3RydWN0aW9uc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlcjogJHtibG9ja0NoZWNrLnJlYXNvbn0uIGAgK1xuICAgICAgICAgIGAke2Jsb2NrQ2hlY2sucmVzb2x1dGlvbn1gICtcbiAgICAgICAgICAoYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZFxuICAgICAgICAgICAgPyAnIEFzayB0aGUgaHVtYW4gb3BlcmF0b3IgdG8gcmVhZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZnJvbSB0aGUgZGlhbG9nIG9uIHRoZWlyIHNjcmVlbi4nXG4gICAgICAgICAgICA6ICcnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICMyNDk6IFJlamVjdCBleGVjdXRpb24gb3BlcmF0aW9ucyBmb3IgYWJvcnRlZCBnb2Fscy5cbiAgICAvLyBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IGV4ZWN1dGlvbiBzdGF0ZSBhcmUgYmxvY2tlZDsgZ2V0U3RhdGUgYW5kIGFib3J0IGFyZSBhbGxvd2VkLlxuICAgIGlmIChtZXRob2QgIT09ICdleGVjdXRlJyAmJiBtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgbWV0aG9kICE9PSAnYWJvcnQnKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQncyBhY3RpdmUgZ29hbCBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICBjb25zdCBhZ2VudEdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgZm9yIChjb25zdCBnb2FsSWQgb2YgYWdlbnRHb2FsSWRzKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWRHb2Fscy5oYXMoZ29hbElkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGV4ZWN1dGlvbiB3YXMgYWJvcnRlZCAoZ29hbElkOiAke2dvYWxJZH0pLiBgICtcbiAgICAgICAgICAgIGBGdXJ0aGVyIGV4ZWN1dGlvbiBvcGVyYXRpb25zIGFyZSByZWplY3RlZC4gVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZXhlY3V0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUnOiB7XG4gICAgICAgIC8vIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogVmFsaWRhdGUgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGVcbiAgICAgICAgY29uc3QgcnVudGltZU1heFN0ZXBzID0gcGFyYW1zLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgaWYgKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lTWF4U3RlcHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJ1bnRpbWVNYXhTdGVwcykgfHwgcnVudGltZU1heFN0ZXBzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0OTogVHJhY2sgZXhlY3V0aW5nIGFnZW50IGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudFxuICAgICAgICAvLyBJc3N1ZSAjNDQ3OiBBbHNvIHN0b3JlIHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEFsc28gc3RvcmUgcmVzaWxpZW5jZSBwb2xpY3kgYW5kIG9yaWdpbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudEVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyLnJlYWQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50TWV0YSA9IGFnZW50RWxlbWVudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgICAgICBsZXQgZ2F0ZWtlZXBlclBvbGljeSA9IGFnZW50TWV0YS5nYXRla2VlcGVyO1xuXG4gICAgICAgICAgICAvLyBTeW50aGVzaXplIHBvbGljeSBmcm9tIHRvb2xzIGNvbmZpZyBpZiBubyBleHBsaWNpdCBnYXRla2VlcGVyIHBvbGljeVxuICAgICAgICAgICAgaWYgKCFnYXRla2VlcGVyUG9saWN5ICYmIGFnZW50TWV0YS50b29scykge1xuICAgICAgICAgICAgICBnYXRla2VlcGVyUG9saWN5ID0gdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5KGFnZW50TWV0YS50b29scykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc3N1ZSAjNTI2OiBFeHRyYWN0IHJlc2lsaWVuY2UgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJlc2lsaWVuY2VQb2xpY3kgPSBhZ2VudE1ldGEucmVzaWxpZW5jZTtcblxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyYWNrIGlmIHRoZXJlJ3MgYSBnYXRla2VlcGVyIHBvbGljeSwgcnVudGltZSBvdmVycmlkZSwgb3IgcmVzaWxpZW5jZSBwb2xpY3lcbiAgICAgICAgICAgIGlmIChnYXRla2VlcGVyUG9saWN5IHx8IHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkIHx8IHJlc2lsaWVuY2VQb2xpY3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuc2V0KGVsZW1lbnROYW1lLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihnYXRla2VlcGVyUG9saWN5ID8geyBnYXRla2VlcGVyOiBnYXRla2VlcGVyUG9saWN5IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAuLi4ocnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQgPyB7IG1heEF1dG9ub21vdXNTdGVwczogcnVudGltZU1heFN0ZXBzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgY29udGludWF0aW9uQ291bnQ6IDAsXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlc2lsaWVuY2VQb2xpY3ksXG4gICAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydW50aW1lTWF4U3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTm8gYWdlbnQgZWxlbWVudCB0byByZWFkLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzdG9yZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLnNldChlbGVtZW50TmFtZSwge1xuICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgbWF4QXV0b25vbW91c1N0ZXBzOiBydW50aW1lTWF4U3RlcHMgfSxcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBjb250aW51YXRpb25Db3VudDogMCxcbiAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxQYXJhbWV0ZXJzOiBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBhZ2VudCBleGVjdXRlcyBldmVuIGlmIHRyYWNraW5nIGZhaWxzXG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB0cmFjayBleGVjdXRpbmcgYWdlbnQgZm9yIEdhdGVrZWVwZXIgcG9saWN5JywgeyBhZ2VudE5hbWU6IGVsZW1lbnROYW1lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGVBZ2VudFJlc3VsdCcsIC4uLmV4ZWN1dGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0U3RhdGUnOiB7XG4gICAgICAgIC8vIFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk6IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZUNvbnRleHQ6IHBhcmFtcy5pbmNsdWRlQ29udGV4dCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGlvblN0YXRlJywgLi4uc3RhdGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBkYXRlU3RhdGUnOiB7XG4gICAgICAgIC8vIFJlY29yZCBleGVjdXRpb24gcHJvZ3Jlc3MsIHN0ZXAgY29tcGxldGlvbiwgb3IgZmluZGluZ3NcbiAgICAgICAgLy8gUmV0dXJucyBhdXRvbm9teSBkaXJlY3RpdmUgaW5kaWNhdGluZyBjb250aW51ZS9wYXVzZVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgbmV4dEFjdGlvbkhpbnQgPSBwYXJhbXMubmV4dEFjdGlvbkhpbnQ7XG4gICAgICAgIGlmIChuZXh0QWN0aW9uSGludCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBuZXh0QWN0aW9uSGludCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25leHRBY3Rpb25IaW50IG11c3QgYmUgYSBzdHJpbmcgaWYgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpc2tTY29yZSA9IHBhcmFtcy5yaXNrU2NvcmU7XG4gICAgICAgIGlmIChyaXNrU2NvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygcmlza1Njb3JlICE9PSAnbnVtYmVyJyB8fCBpc05hTihyaXNrU2NvcmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jpc2tTY29yZSBtdXN0IGJlIGEgbnVtYmVyIGlmIHByb3ZpZGVkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyaXNrU2NvcmUgPCAwIHx8IHJpc2tTY29yZSA+IDEwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyaXNrU2NvcmUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM0NDc6IEFwcGx5IHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlIGlmIHN0b3JlZCBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGNvbnN0IG1heFN0ZXBzT3ZlcnJpZGUgPSBleGVjdXRpbmdBZ2VudD8ubWV0YWRhdGE/Lm1heEF1dG9ub21vdXNTdGVwcyBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5yZWNvcmRBZ2VudFN0ZXAoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgc3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZSBhcyAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbCcsXG4gICAgICAgICAgZmluZGluZ3M6IHBhcmFtcy5maW5kaW5ncyBhcyBzdHJpbmcsXG4gICAgICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgYXMgbnVtYmVyLFxuICAgICAgICAgIG5leHRBY3Rpb25IaW50OiBuZXh0QWN0aW9uSGludCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmlza1Njb3JlOiByaXNrU2NvcmUgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFN0ZXBzT3ZlcnJpZGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEV2YWx1YXRlIHJlc2lsaWVuY2UgcG9saWN5IHdoZW4gYXV0b25vbXkgc2F5cyBwYXVzZVxuICAgICAgICBjb25zdCByZXNpbGllbmNlUmVzdWx0ID0gdGhpcy5ldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgdXBkYXRlUmVzdWx0LFxuICAgICAgICAgIHBhcmFtcy5vdXRjb21lIGFzIHN0cmluZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW06IGNvbGxlY3QgYW5kIGF0dGFjaCBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0gcmVzaWxpZW5jZVJlc3VsdCA/PyB1cGRhdGVSZXN1bHQ7XG4gICAgICAgIGNvbnN0IGF1dG9ub215ID0gZmluYWxSZXN1bHQuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChhdXRvbm9teSkge1xuICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSB0aGlzLmNvbGxlY3ROb3RpZmljYXRpb25zKGVsZW1lbnROYW1lLCBhdXRvbm9teSk7XG4gICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXV0b25vbXkubm90aWZpY2F0aW9ucyA9IG5vdGlmaWNhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ1N0ZXBSZXN1bHQnLCAuLi5maW5hbFJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6IHtcbiAgICAgICAgLy8gU2lnbmFsIGV4ZWN1dGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY29uc3QgY29tcGxldGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgICAgICBzdW1tYXJ5OiBwYXJhbXMuc3VtbWFyeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZ29hbElkOiBwYXJhbXMuZ29hbElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyNjogVHJhY2sgcmVzaWxpZW5jZSBvdXRjb21lIGFuZCByZXNldCBjaXJjdWl0IGJyZWFrZXIgb24gc3VjY2Vzc1xuICAgICAgICBjb25zdCBjb21wbGV0ZWRBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGlmIChjb21wbGV0ZWRBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSAmJiAoY29tcGxldGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGNvbXBsZXRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHBhcmFtcy5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ29tcGxldGlvbkFmdGVyUmVzaWxpZW5jZShpc1N1Y2Nlc3MpO1xuICAgICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNpcmN1aXRCcmVha2VyLnJlc2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNDQ5OiBSZW1vdmUgYWdlbnQgZnJvbSBleGVjdXRpbmcgc2V0IHNvIGl0cyBwb2xpY2llcyBzdG9wIGFwcGx5aW5nXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0NvbXBsZXRpb25SZXN1bHQnLCAuLi5jb21wbGV0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb250aW51ZSc6IHtcbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIHNhdmVkIHN0YXRlXG4gICAgICAgIGNvbnN0IGNvbnRpbnVlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5jb250aW51ZUFnZW50RXhlY3V0aW9uKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnQ29udGludWVSZXN1bHQnLCAuLi5jb250aW51ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhYm9ydCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI0OTogQWJvcnQgYSBydW5uaW5nIGFnZW50IGV4ZWN1dGlvblxuICAgICAgICBjb25zdCByZWFzb24gPSAocGFyYW1zLnJlYXNvbiBhcyBzdHJpbmcpIHx8ICdBYm9ydGVkIGJ5IHVzZXInO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGFjdGl2ZSBnb2FsIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWN0aXZlR29hbElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTm8gYWN0aXZlIGV4ZWN1dGlvbiBmb3VuZCBmb3IgYWdlbnQgJyR7ZWxlbWVudE5hbWV9Jy4gYCArXG4gICAgICAgICAgICBgTm90aGluZyB0byBhYm9ydC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYWxsIGFjdGl2ZSBnb2FscyBhcyBhYm9ydGVkXG4gICAgICAgIGZvciAoY29uc3QgZ29hbElkIG9mIGFjdGl2ZUdvYWxJZHMpIHtcbiAgICAgICAgICB0aGlzLmFib3J0ZWRHb2Fscy5hZGQoZ29hbElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBsZXRlIHRoZSBhZ2VudCBnb2FsIHdpdGggJ2ZhaWx1cmUnIG91dGNvbWUgdG8gcGVyc2lzdCB0aGUgYWJvcnRlZCBzdGF0ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoe1xuICAgICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIG91dGNvbWU6ICdmYWlsdXJlJyxcbiAgICAgICAgICAgIHN1bW1hcnk6IGBFeGVjdXRpb24gYWJvcnRlZDogJHtyZWFzb259YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBnb2FsIG1heSBhbHJlYWR5IGJlIGNvbXBsZXRlZCBvciBhZ2VudCBzdGF0ZSBtYXkgYmUgaW5jb25zaXN0ZW50XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBtYXJrIGFib3J0ZWQgYWdlbnQgZ29hbCBhcyBmYWlsZWQnLCB7IGFnZW50TmFtZTogZWxlbWVudE5hbWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNTI2OiBUcmFjayByZXNpbGllbmNlIG91dGNvbWUgKGFib3J0ID0gZmFpbHVyZSBhZnRlciByZXNpbGllbmNlKVxuICAgICAgICBjb25zdCBhYm9ydGVkQWdlbnQgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWJvcnRlZEFnZW50Py5yZXNpbGllbmNlUG9saWN5ICYmIChhYm9ydGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGFib3J0ZWRBZ2VudC5yZXRyeUNvdW50ID4gMCkpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDb21wbGV0aW9uQWZ0ZXJSZXNpbGllbmNlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIHVwIGV4ZWN1dGluZ0FnZW50cyBNYXAgKHN0b3AgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQpXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgRGFuZ2VyWm9uZUVuZm9yY2VyIGJsb2NrcyBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIudW5ibG9jayhlbGVtZW50TmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb24tZmF0YWw6IGFnZW50IG1heSBub3QgaGF2ZSBiZWVuIGJsb2NrZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEV4ZWN1dGUuYWJvcnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRpb24gYWJvcnRlZDogJHtlbGVtZW50TmFtZX0g4oCUICR7cmVhc29ufWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBhYm9ydGVkR29hbElkczogYWN0aXZlR29hbElkcyxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3R5cGU6ICdBYm9ydFJlc3VsdCcsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBhY3RpdmVHb2FsSWRzLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7ZWxlbWVudE5hbWV9JyBleGVjdXRpb24gYWJvcnRlZC4gJHthY3RpdmVHb2FsSWRzLmxlbmd0aH0gZ29hbChzKSB0ZXJtaW5hdGVkLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEdhdGhlcmVkRGF0YSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzY4OiBHZXQgYWdncmVnYXRlZCBleGVjdXRpb24gZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsXG4gICAgICAgIGNvbnN0IGdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ29hbElkICE9PSAnc3RyaW5nJyB8fCAhZ29hbElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnb2FsSWQgaXMgcmVxdWlyZWQgZm9yIGdldF9nYXRoZXJlZF9kYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F0aGVyZWREYXRhID0gYXdhaXQgbWFuYWdlci5nZXRHYXRoZXJlZERhdGEoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZ29hbElkOiBnb2FsSWQgYXMgc3RyaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdHYXRoZXJlZERhdGEnLCAuLi5nYXRoZXJlZERhdGEgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncHJlcGFyZUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUHJlcGFyZSBhIGhhbmRvZmYgc3RhdGUgZm9yIHNlc3Npb24gdHJhbnNmZXJcbiAgICAgICAgY29uc3QgaGFuZG9mZkdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkdvYWxJZCAhPT0gJ3N0cmluZycgfHwgIWhhbmRvZmZHb2FsSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvYWxJZCBpcyByZXF1aXJlZCBmb3IgcHJlcGFyZV9oYW5kb2ZmJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgdGhlIGdvYWxcbiAgICAgICAgY29uc3QgaGFuZG9mZkdhdGhlcmVkRGF0YSA9IGF3YWl0IG1hbmFnZXIuZ2V0R2F0aGVyZWREYXRhKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGdvYWxJZDogaGFuZG9mZkdvYWxJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVhZCBhZ2VudCBtZXRhZGF0YSBmb3IgYWN0aXZlIGVsZW1lbnRzIGFuZCBzdWNjZXNzIGNyaXRlcmlhXG4gICAgICAgIGxldCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgICAgIGxldCBzdWNjZXNzQ3JpdGVyaWE6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWdlbnRFbGVtZW50ID0gYXdhaXQgbWFuYWdlci5yZWFkKGVsZW1lbnROYW1lKTtcbiAgICAgICAgICBpZiAoYWdlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gYWdlbnRFbGVtZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgICAgIGlmIChtZXRhLmFjdGl2YXRlcykge1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9IHsgLi4ubWV0YS5hY3RpdmF0ZXMgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWEgPSBtZXRhLmdvYWw/LnN1Y2Nlc3NDcml0ZXJpYSB8fCBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5vbi1mYXRhbDogcHJvY2VlZCB3aXRoIGRlZmF1bHRzXG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIGluY2x1ZGUgdGhlIGFnZW50IGl0c2VsZlxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXS5wdXNoKGVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBoYW5kb2ZmIHN0YXRlXG4gICAgICAgIGNvbnN0IGhhbmRvZmZTdGF0ZSA9IHByZXBhcmVIYW5kb2ZmU3RhdGUoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgaGFuZG9mZkdhdGhlcmVkRGF0YSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWFcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgY29weS1wYXN0ZWFibGUgYmxvY2tcbiAgICAgICAgY29uc3QgaGFuZG9mZkJsb2NrID0gZ2VuZXJhdGVIYW5kb2ZmQmxvY2soaGFuZG9mZlN0YXRlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF90eXBlOiAnSGFuZG9mZlJlc3VsdCcsXG4gICAgICAgICAgaGFuZG9mZlN0YXRlLFxuICAgICAgICAgIGhhbmRvZmZCbG9jayxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncmVzdW1lRnJvbUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIGEgaGFuZG9mZiBibG9ja1xuICAgICAgICBjb25zdCBoYW5kb2ZmQmxvY2tQYXJhbSA9IHBhcmFtcy5oYW5kb2ZmQmxvY2s7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkJsb2NrUGFyYW0gIT09ICdzdHJpbmcnIHx8ICFoYW5kb2ZmQmxvY2tQYXJhbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGFuZG9mZkJsb2NrIGlzIHJlcXVpcmVkIGZvciByZXN1bWVfZnJvbV9oYW5kb2ZmICh0aGUgZnVsbCBoYW5kb2ZmIGJsb2NrIHRleHQpJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGhhbmRvZmYgYmxvY2sgKGNoZWNrc3VtIHZhbGlkYXRlZCBpbnRlcm5hbGx5KVxuICAgICAgICBjb25zdCByZXN0b3JlZFN0YXRlID0gcGFyc2VIYW5kb2ZmQmxvY2soaGFuZG9mZkJsb2NrUGFyYW0pO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgYWdlbnQgbmFtZSBtYXRjaGVzXG4gICAgICAgIGlmIChyZXN0b3JlZFN0YXRlLmFnZW50TmFtZSAhPT0gZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignSGFuZG9mZiBhZ2VudCBtaXNtYXRjaCBkZXRlY3RlZCcsIHtcbiAgICAgICAgICAgIGV4cGVjdGVkQWdlbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgYmxvY2tBZ2VudDogcmVzdG9yZWRTdGF0ZS5hZ2VudE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0hhbmRvZmYgYWdlbnQgbWlzbWF0Y2g6IHRoZSBoYW5kb2ZmIGJsb2NrIHdhcyBub3QgcHJlcGFyZWQgZm9yIHRoaXMgYWdlbnQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lcmdlIGNhbGxlci1wcm92aWRlZCBwYXJhbWV0ZXJzIHdpdGggaGFuZG9mZiBtZXRhZGF0YS5cbiAgICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IHN1cHBseSBhbnkgcmVxdWlyZWQgZ29hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIHRhc2spLlxuICAgICAgICBjb25zdCBjYWxsZXJQYXJhbXMgPSAocGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bWVQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uY2FsbGVyUGFyYW1zLFxuICAgICAgICAgIHJlc3VtZWRGcm9tSGFuZG9mZjogdHJ1ZSxcbiAgICAgICAgICBvcmlnaW5hbEdvYWxJZDogcmVzdG9yZWRTdGF0ZS5nb2FsSWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiB1c2luZyBjb250aW51ZSB3aXRoIHJlc3RvcmVkIGNvbnRleHRcbiAgICAgICAgY29uc3QgY29udGludWVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbnRpbnVlQWdlbnRFeGVjdXRpb24oe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBgUmVzdW1lZCBmcm9tIGhhbmRvZmYgKGdvYWxJZDogJHtyZXN0b3JlZFN0YXRlLmdvYWxJZH0sICR7cmVzdG9yZWRTdGF0ZS5nb2FsUHJvZ3Jlc3Muc3RlcHNDb21wbGV0ZWR9IHN0ZXBzIGNvbXBsZXRlZClgLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHJlc3VtZVBhcmFtcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfdHlwZTogJ1Jlc3VtZVJlc3VsdCcsXG4gICAgICAgICAgLi4uY29udGludWVSZXN1bHQsXG4gICAgICAgICAgcmVzdG9yZWRGcm9tOiB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IHJlc3RvcmVkU3RhdGUuYWdlbnROYW1lLFxuICAgICAgICAgICAgZ29hbElkOiByZXN0b3JlZFN0YXRlLmdvYWxJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3RvcmVkU3RhdGUudmVyc2lvbixcbiAgICAgICAgICAgIHN0ZXBzQ29tcGxldGVkOiByZXN0b3JlZFN0YXRlLmdvYWxQcm9ncmVzcy5zdGVwc0NvbXBsZXRlZCxcbiAgICAgICAgICAgIHByZXBhcmVkQXQ6IHJlc3RvcmVkU3RhdGUucHJlcGFyZWRBdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRXhlY3V0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIE1heGltdW0gcmVjZW50IGJsb2NrcyB0cmFja2VkIHBlciBhZ2VudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1JFQ0VOVF9CTE9DS1MgPSA1MDtcblxuICAvKipcbiAgICogUmVjb3JkIGEgZ2F0ZWtlZXBlciBibG9jayBhZ2FpbnN0IGFsbCBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cy5cbiAgICogQ2FsbGVkIHdoZW4gR2F0ZWtlZXBlci5lbmZvcmNlKCkgZGVuaWVzIGFuIG9wZXJhdGlvbiwgc28gdGhhdFxuICAgKiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgY2FuIHJlcG9ydCBpdCBhcyBhIG5vdGlmaWNhdGlvbi5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVjb3JkR2F0ZWtlZXBlckJsb2NrRm9yQWdlbnRzKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgbGV2ZWw6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leGVjdXRpbmdBZ2VudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmxvY2sgPSB7XG4gICAgICBvcGVyYXRpb24sXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHJlYXNvbixcbiAgICAgIGxldmVsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXBvcnRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnB1c2goYmxvY2spO1xuXG4gICAgICAvLyBDYXAgYXQgTUFYX1JFQ0VOVF9CTE9DS1M6IGV2aWN0IG9sZGVzdCByZXBvcnRlZCBmaXJzdCwgdGhlbiBvbGRlc3QgdW5yZXBvcnRlZFxuICAgICAgd2hpbGUgKGFnZW50RW50cnkucmVjZW50QmxvY2tzLmxlbmd0aCA+IE1DUEFRTEhhbmRsZXIuTUFYX1JFQ0VOVF9CTE9DS1MpIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ZWRJZHggPSBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5maW5kSW5kZXgoYiA9PiBiLnJlcG9ydGVkKTtcbiAgICAgICAgaWYgKHJlcG9ydGVkSWR4ID49IDApIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5zcGxpY2UocmVwb3J0ZWRJZHgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdCBub3RpZmljYXRpb25zIGZvciBhbiBleGVjdXRpbmcgYWdlbnQgZnJvbSBhbGwgc291cmNlczpcbiAgICogMS4gVW5yZXBvcnRlZCBnYXRla2VlcGVyIGJsb2NrcyDihpIgcGVybWlzc2lvbl9wZW5kaW5nXG4gICAqIDIuIEF1dG9ub215IHBhdXNlIChjb250aW51ZT1mYWxzZSkg4oaSIGF1dG9ub215X3BhdXNlXG4gICAqIDMuIERhbmdlclpvbmUgYmxvY2tlZCBhZ2VudHMgKHN5c3RlbS13aWRlIGJyb2FkY2FzdCkg4oaSIGRhbmdlcl96b25lXG4gICAqXG4gICAqIEdhdGVrZWVwZXIgYmxvY2tzIGFyZSBtYXJrZWQgYXMgXCJyZXBvcnRlZFwiIGFmdGVyIGZpcnN0IGNvbGxlY3Rpb25cbiAgICogc28gdGhleSBkb24ndCByZXBlYXQgb24gc3Vic2VxdWVudCBjYWxscy4gRGFuZ2VyWm9uZSBhbmQgYXV0b25vbXlcbiAgICogbm90aWZpY2F0aW9ucyBhcmUgYWx3YXlzIGVtaXR0ZWQgd2hpbGUgdGhlIGNvbmRpdGlvbiBwZXJzaXN0cy5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE5vdGlmaWNhdGlvbnMoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgYXV0b25vbXk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IEFnZW50Tm90aWZpY2F0aW9uW10ge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnM6IEFnZW50Tm90aWZpY2F0aW9uW10gPSBbXTtcbiAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChhZ2VudE5hbWUpO1xuXG4gICAgLy8gU291cmNlIDE6IFVucmVwb3J0ZWQgZ2F0ZWtlZXBlciBibG9ja3NcbiAgICBpZiAoZXhlY3V0aW5nQWdlbnQ/LnJlY2VudEJsb2Nrcykge1xuICAgICAgZm9yIChjb25zdCBibG9jayBvZiBleGVjdXRpbmdBZ2VudC5yZWNlbnRCbG9ja3MpIHtcbiAgICAgICAgaWYgKCFibG9jay5yZXBvcnRlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAncGVybWlzc2lvbl9wZW5kaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Jsb2NrLm9wZXJhdGlvbn0ke2Jsb2NrLmVsZW1lbnRUeXBlID8gYCgke2Jsb2NrLmVsZW1lbnRUeXBlfSlgIDogJyd9IHJlcXVpcmVzIGNvbmZpcm1hdGlvbmAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBvcGVyYXRpb246IGJsb2NrLm9wZXJhdGlvbixcbiAgICAgICAgICAgICAgZWxlbWVudF90eXBlOiBibG9jay5lbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBibG9jay5yZWFzb24sXG4gICAgICAgICAgICAgIGxldmVsOiBibG9jay5sZXZlbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGJsb2NrLnRpbWVzdGFtcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBibG9jay5yZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3VyY2UgMjogQXV0b25vbXkgcGF1c2VcbiAgICBpZiAoYXV0b25vbXkuY29udGludWUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCByZWFzb24gPSAoYXV0b25vbXkucmVhc29uIGFzIHN0cmluZykgfHwgKGF1dG9ub215LmZhY3RvcnMgYXMgc3RyaW5nW10gfHwgW10pLmpvaW4oJywgJyk7XG4gICAgICBpZiAocmVhc29uKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2F1dG9ub215X3BhdXNlJyxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgcGF1c2VkOiAke3JlYXNvbn1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU291cmNlIDM6IERhbmdlclpvbmUgYnJvYWRjYXN0IOKAlCBhbGVydCBBTEwgZXhlY3V0aW5nIGFnZW50cyBhYm91dCBhbnkgYmxvY2tlZCBhZ2VudFxuICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgaWYgKGVuZm9yY2VyPy5oYXNCbG9ja2VkQWdlbnRzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2tlZEFnZW50IG9mIGVuZm9yY2VyLmdldEJsb2NrZWRBZ2VudHMoKSkge1xuICAgICAgICBjb25zdCBibG9ja0NoZWNrID0gZW5mb3JjZXIuY2hlY2soYmxvY2tlZEFnZW50KTtcbiAgICAgICAgaWYgKGJsb2NrQ2hlY2suYmxvY2tlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnZGFuZ2VyX3pvbmUnLFxuICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke2Jsb2NrZWRBZ2VudH0nIGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXI6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogYmxvY2tlZEFnZW50LFxuICAgICAgICAgICAgICByZWFzb246IGJsb2NrQ2hlY2sucmVhc29uLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JZDogYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3RpZmljYXRpb25zO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZXNpbGllbmNlIEV2YWx1YXRpb24gKElzc3VlICM1MjYpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXZhbHVhdGUgcmVzaWxpZW5jZSBwb2xpY3kgYWZ0ZXIgYSBzdGVwIHJlc3VsdCBhbmQgcG90ZW50aWFsbHkgb3ZlcnJpZGVcbiAgICogdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBlbmFibGUgYXV0by1jb250aW51YXRpb24gb3IgcmV0cnkuXG4gICAqXG4gICAqIFJldHVybnMgYSBtb2RpZmllZCBzdGVwIHJlc3VsdCBpZiByZXNpbGllbmNlIGtpY2tzIGluLCBvciBudWxsIHRvIHVzZVxuICAgKiB0aGUgb3JpZ2luYWwgcmVzdWx0IChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IEV4ZWN1dGlvbiBSZXNpbGllbmNlIChJc3N1ZSAjNTI2KVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdGVwT3V0Y29tZTogc3RyaW5nXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gICAgLy8gT25seSBldmFsdWF0ZSB3aGVuIGF1dG9ub215IHNheXMgcGF1c2VcbiAgICBjb25zdCBhdXRvbm9teSA9IHVwZGF0ZVJlc3VsdC5hdXRvbm9teSBhcyB7IGNvbnRpbnVlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmc7IGZhY3RvcnM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXV0b25vbXkgfHwgYXV0b25vbXkuY29udGludWUgPT09IHRydWUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gTG9vayB1cCB0aGUgZXhlY3V0aW5nIGFnZW50J3MgcmVzaWxpZW5jZSB0cmFja2luZyBzdGF0ZVxuICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGFnZW50TmFtZSk7XG4gICAgaWYgKCFleGVjdXRpbmdBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhlIHBhdXNlXG4gICAgY29uc3QgaXNTdGVwTGltaXQgPSBhdXRvbm9teS5yZWFzb24/LnN0YXJ0c1dpdGgoJ01heGltdW0gYXV0b25vbW91cyBzdGVwcyByZWFjaGVkJykgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNGYWlsdXJlID0gc3RlcE91dGNvbWUgPT09ICdmYWlsdXJlJztcblxuICAgIC8vIE9ubHkgaGFuZGxlIHN0ZXAtbGltaXQgYW5kIGZhaWx1cmUgdHJpZ2dlcnNcbiAgICBpZiAoIWlzU3RlcExpbWl0ICYmICFpc0ZhaWx1cmUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogUmVzaWxpZW5jZUNvbnRleHQgPSB7XG4gICAgICB0cmlnZ2VyOiBpc1N0ZXBMaW1pdCA/ICdzdGVwX2xpbWl0JyA6ICdleGVjdXRpb25fZmFpbHVyZScsXG4gICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICByZXRyeUNvdW50OiBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50LFxuICAgICAgc3RlcE91dGNvbWU6IHN0ZXBPdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aW9uID0gZXZhbHVhdGVSZXNpbGllbmNlUG9saWN5KGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3ksIGNvbnRleHQpO1xuXG4gICAgLy8gSWYgcmVzaWxpZW5jZSBzYXlzIHBhdXNlLCByZWNvcmQgdGhlIGxpbWl0IGFuZCB1c2UgdGhlIG9yaWdpbmFsIHJlc3VsdFxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAncGF1c2UnKSB7XG4gICAgICAvLyBUcmFjayBpZiB0aGlzIHdhcyBhIGxpbWl0IGV4aGF1c3Rpb24gKG5vdCBhIGRlZmF1bHQtcGF1c2UgcG9saWN5KVxuICAgICAgaWYgKGFjdGlvbi5yZWFzb24/LmluY2x1ZGVzKCdleGhhdXN0ZWQnKSB8fCBhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkUmVzaWxpZW5jZUxpbWl0KCk7XG4gICAgICAgIGlmIChhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDaXJjdWl0QnJlYWtlclRyaXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQXV0by1jb250aW51ZTogb3ZlcnJpZGUgdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBjb250aW51ZVxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7IC8vIFJlc2V0IHJldHJ5IGNvdW50IG9uIGNvbnRpbnVhdGlvblxuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQXV0b0NvbnRpbnVhdGlvbigpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX0NPTlRJTlVFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1jb250aW51ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZVJlc3VsdCxcbiAgICAgICAgYXV0b25vbXk6IHtcbiAgICAgICAgICAuLi5hdXRvbm9teSxcbiAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGFjdGlvbi5yZWFzb24sXG4gICAgICAgICAgZmFjdG9yczogWy4uLihhdXRvbm9teS5mYWN0b3JzIHx8IFtdKSwgYHJlc2lsaWVuY2U6IGF1dG8tY29udGludWVkICgke2V4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50fS8ke2FjdGlvbi5tYXhDb250aW51YXRpb25zIHx8ICd1bmxpbWl0ZWQnfSlgXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJldHJ5OiB0ZWxsIExMTSB0byByZXRyeSB3aXRoIGJhY2tvZmYgZ3VpZGFuY2VcbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3JldHJ5Jykge1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCsrO1xuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkU3RlcFJldHJ5KCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX1NURVBfUkVUUklFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgc3RlcCByZXRyeTogJHthY3Rpb24ucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQsXG4gICAgICAgICAgYmFja29mZk1zOiBhY3Rpb24uYmFja29mZk1zLFxuICAgICAgICAgIHRyaWdnZXI6IGNvbnRleHQudHJpZ2dlcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiByZXRyeSBhdHRlbXB0ICR7ZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudH1gXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlc3RhcnQ6IG92ZXJyaWRlIHRvIGNvbnRpbnVlLCBzaWduYWwgZnJlc2ggcmVzdGFydCB0byBMTE1cbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3Jlc3RhcnQnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7XG4gICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRBdXRvUmVzdGFydCgpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX1JFU1RBUlRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1yZXN0YXJ0ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICAgIHByZXNlcnZlU3RhdGU6IGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3k/LnByZXNlcnZlU3RhdGUgPz8gdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiBhdXRvLXJlc3RhcnRlZCAoJHtleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudH0vJHthY3Rpb24ubWF4Q29udGludWF0aW9ucyB8fCAndW5saW1pdGVkJ30pYF0sXG4gICAgICAgICAgcmVzaWxpZW5jZUFjdGlvbjogYWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGdvYWwgSURzIGZvciBhbiBhZ2VudCAoSXNzdWUgIzI0OSkuXG4gICAqIFF1ZXJpZXMgdGhlIGFnZW50J3Mgc3RhdGUgdG8gZmluZCBpbi1wcm9ncmVzcyBnb2Fscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlR29hbElkcyhcbiAgICBtYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgYWdlbnROYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZ2V0QWdlbnRTdGF0ZSh7IGFnZW50TmFtZSB9KTtcbiAgICAgIGlmIChzdGF0ZVJlc3VsdD8uc3RhdGU/LmdvYWxzKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZVJlc3VsdC5zdGF0ZS5nb2Fsc1xuICAgICAgICAgIC5maWx0ZXIoKGc6IHsgc3RhdHVzOiBzdHJpbmcgfSkgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgICAgLm1hcCgoZzogeyBpZDogc3RyaW5nIH0pID0+IGcuaWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWdlbnQgbWF5IG5vdCBoYXZlIHN0YXRlIHlldFxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvcnJlbGF0aW9uIElEIGZyb20gdGhlIHVuZGVybHlpbmcgQ29udGV4dFRyYWNrZXIuXG4gICAqIEV4cG9zZWQgZm9yIHVzZSBieSBVbmlmaWVkRW5kcG9pbnQgYW5kIG90aGVyIHdyYXBwZXJzLlxuICAgKiBJc3N1ZSAjMzAxLlxuICAgKi9cbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc3VsdCBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHJlc3BvbnNlIG1ldGFkYXRhIHdpdGggY29ycmVsYXRpb24gSUQgYW5kIHRpbWluZy5cbiAgICogSXNzdWUgIzMwMTogUmVxdWVzdCBJRHMgYW5kIGRpc3RyaWJ1dGVkIHRyYWNpbmcgc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXRhKHN0YXJ0VGltZTogbnVtYmVyKTogUmVzcG9uc2VNZXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdElkOiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCkgPz8gJ3Vua25vd24nLFxuICAgICAgZHVyYXRpb25NczogcGFyc2VGbG9hdCgocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMikpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgc3VjY2VzcyhkYXRhOiB1bmtub3duLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvblN1Y2Nlc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZGF0YSxcbiAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShzdGFydFRpbWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFpbGVkIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgZmFpbHVyZShlcnJvcjogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yLFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRmllbGQgU2VsZWN0aW9uIChJc3N1ZSAjMjAyKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpZWxkIHNlbGVjdGlvbiBhbmQgbmFtZSB0cmFuc2Zvcm1hdGlvbiB0byBoYW5kbGVyIHJlc3BvbnNlLlxuICAgKlxuICAgKiBQcm9jZXNzZXMgdGhlIGBmaWVsZHNgIHBhcmFtZXRlciB0byBmaWx0ZXIgcmVzcG9uc2UgZGF0YTpcbiAgICogLSBJZiBmaWVsZHMgaXMgYW4gYXJyYXksIGZpbHRlciB0byB0aG9zZSBmaWVsZHMgb25seVxuICAgKiAtIElmIGZpZWxkcyBpcyBhIHByZXNldCBzdHJpbmcgKCdtaW5pbWFsJywgJ3N0YW5kYXJkJywgJ2Z1bGwnKSwgdXNlIHByZXNldFxuICAgKiAtIElmIGZpZWxkcyBpcyBub3QgcHJvdmlkZWQsIHRyYW5zZm9ybSBuYW1lcyBvbmx5IChuYW1lIOKGkiBlbGVtZW50X25hbWUpXG4gICAqXG4gICAqIEZvciByZXNwb25zZXMgd2l0aCBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMsIGZpZWxkIHNlbGVjdGlvbiBpcyBhcHBsaWVkXG4gICAqIHRvIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgcmF0aGVyIHRoYW4gZmlsdGVyaW5nIHRoZSBjb250YWluZXIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJhdyBoYW5kbGVyIHJlc3VsdFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3JpZ2luYWwgcGFyYW1zIGNvbnRhaW5pbmcgb3B0aW9uYWwgYGZpZWxkc2BcbiAgICogQHJldHVybnMgVHJhbnNmb3JtZWQgcmVzdWx0IHdpdGggZmllbGQgc2VsZWN0aW9uIGFwcGxpZWRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWVsZFNlbGVjdGlvbihcbiAgICByZXN1bHQ6IHVua25vd24sXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgLy8gU2tpcCB0cmFuc2Zvcm1hdGlvbiBmb3IgTUNQIHJlc3BvbnNlIGZvcm1hdCB3aXRoIGNvbnRlbnQgYXJyYXlcbiAgICAvLyBUaGVzZSBhcmUgZm9ybWF0dGVkIHRleHQgcmVzcG9uc2VzIHRoYXQgc2hvdWxkbid0IGJlIHRyYW5zZm9ybWVkXG4gICAgaWYgKHRoaXMuaXNNQ1BSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkc1BhcmFtID0gcGFyYW1zPy5maWVsZHM7XG5cbiAgICAvLyBObyBmaWVsZHMgcGFyYW0gLSBhcHBseSBuYW1lIHRyYW5zZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAoZmllbGRzUGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBmaWVsZHMgZnJvbSBwcmVzZXQgb3IgYXJyYXlcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlc2V0OiAnbWluaW1hbCcgfCAnc3RhbmRhcmQnIHwgJ2Z1bGwnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmaWVsZHNQYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpc1ZhbGlkUHJlc2V0KGZpZWxkc1BhcmFtKSkge1xuICAgICAgICBpZiAoZmllbGRzUGFyYW0gPT09ICdmdWxsJykge1xuICAgICAgICAgIC8vICdmdWxsJyBwcmVzZXQgPSBhbGwgZmllbGRzLCBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHByZXNldCA9IGZpZWxkc1BhcmFtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW52YWxpZCBwcmVzZXQgLSB0cmVhdCBhcyBzaW5nbGUgZmllbGRcbiAgICAgICAgZmllbGRzID0gW2ZpZWxkc1BhcmFtXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRzUGFyYW0pKSB7XG4gICAgICAvLyBGaWx0ZXIgdG8gc3RyaW5ncyBvbmx5LCB3YXJuIGFib3V0IG5vbi1zdHJpbmcgZWxlbWVudHNcbiAgICAgIGNvbnN0IG5vblN0cmluZ0NvdW50ID0gZmllbGRzUGFyYW0uZmlsdGVyKGYgPT4gdHlwZW9mIGYgIT09ICdzdHJpbmcnKS5sZW5ndGg7XG4gICAgICBpZiAobm9uU3RyaW5nQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBGaWVsZCBzZWxlY3Rpb246ICR7bm9uU3RyaW5nQ291bnR9IG5vbi1zdHJpbmcgZWxlbWVudChzKSBpbiBmaWVsZHMgYXJyYXkgaWdub3JlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyaW5nRmllbGRzID0gZmllbGRzUGFyYW0uZmlsdGVyKChmKTogZiBpcyBzdHJpbmcgPT4gdHlwZW9mIGYgPT09ICdzdHJpbmcnKTtcbiAgICAgIGlmIChzdHJpbmdGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZpZWxkcyA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmaWVsZCBuYW1lcyBmb3Igc2VjdXJpdHkgYW5kIGNoZWNrIGZvciBVbmljb2RlIGlzc3Vlc1xuICAgICAgICBjb25zdCB7IG5vcm1hbGl6ZWQsIHdhcm5pbmdzIH0gPSBub3JtYWxpemVGaWVsZE5hbWVzKHN0cmluZ0ZpZWxkcyk7XG4gICAgICAgIGlmICh3YXJuaW5ncykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGaWVsZCBzZWxlY3Rpb24gVW5pY29kZSBub3JtYWxpemF0aW9uOiAke3dhcm5pbmdzLmpvaW4oJzsgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzID0gbm9ybWFsaXplZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBmaWVsZHMgLSBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgIGlmICghZmllbGRzICYmICFwcmVzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyB3aXRoIGFycmF5LWF3YXJlbmVzc1xuICAgIHJldHVybiB0aGlzLmZpbHRlcldpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQsIGZpZWxkcywgcHJlc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gcmVzcG9uc2Ugd2l0aCBhd2FyZW5lc3Mgb2YgbmVzdGVkIGFycmF5cy5cbiAgICogQXBwbGllcyBuYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGl0ZW1zIHdpdGhpbiBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbW1vbiBhcnJheSBjb250YWluZXIgcGF0dGVybnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5yZXN1bHRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ3Jlc3VsdHMnXSksXG4gICAgICAgICAgcmVzdWx0czogZmlsdGVyRmllbGRzKG9iai5yZXN1bHRzLCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsnaXRlbXMnXSksXG4gICAgICAgICAgaXRlbXM6IGZpbHRlckZpZWxkcyhvYmouaXRlbXMsIHsgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiB0cmFuc2Zvcm0gZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciByZXNwb25zZSB3aXRoIGF3YXJlbmVzcyBvZiBuZXN0ZWQgYXJyYXlzLlxuICAgKiBBcHBsaWVzIGZpZWxkIGZpbHRlcmluZyB0byBpdGVtcyB3aXRoaW4gYHJlc3VsdHNgIG9yIGBpdGVtc2AgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJXaXRoQXJyYXlBd2FyZW5lc3MoXG4gICAgcmVzdWx0OiB1bmtub3duLFxuICAgIGZpZWxkcz86IHN0cmluZ1tdLFxuICAgIHByZXNldD86ICdtaW5pbWFsJyB8ICdzdGFuZGFyZCcgfCAnZnVsbCdcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBjb25zdCBvYmogPSByZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gYXJyYXkgY29udGFpbmVyIHBhdHRlcm5zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoucmVzdWx0cykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydyZXN1bHRzJ10pLFxuICAgICAgICAgIHJlc3VsdHM6IGZpbHRlckZpZWxkcyhvYmoucmVzdWx0cywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5pdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydpdGVtcyddKSxcbiAgICAgICAgICBpdGVtczogZmlsdGVyRmllbGRzKG9iai5pdGVtcywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBmaWx0ZXIgZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IGZpZWxkcywgcHJlc2V0LCB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9wLWxldmVsIGZpZWxkcyBvZiBhbiBvYmplY3QsIGV4Y2x1ZGluZyBzcGVjaWZpZWQga2V5cy5cbiAgICogVXNlZCB0byBwcmVzZXJ2ZSBjb250YWluZXIgbWV0YWRhdGEgKHRvdGFsLCBxdWVyeSwgZXRjLikgd2hpbGUgZmlsdGVyaW5nIG5lc3RlZCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVRvcExldmVsKFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZXhjbHVkZUtleXM6IHN0cmluZ1tdXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKCFleGNsdWRlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcmVzdWx0IGlzIGFuIE1DUCByZXNwb25zZSBmb3JtYXQgKHdpdGggY29udGVudCBhcnJheSkuXG4gICAqIFRoZXNlIHJlc3BvbnNlcyBjb250YWluIGZvcm1hdHRlZCB0ZXh0IGFuZCBzaG91bGRuJ3QgYmUgdHJhbnNmb3JtZWQuXG4gICAqL1xuICBwcml2YXRlIGlzTUNQUmVzcG9uc2UocmVzdWx0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdjb250ZW50JyBpbiByZXN1bHQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudClcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW52YWxpZFBvbGljeUFkdmlzb3J5KGludmFsaWRQb2xpY3lDb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2luZ3VsYXIgPSBpbnZhbGlkUG9saWN5Q291bnQgPT09IDE7XG4gIHJldHVybiBgJHtpbnZhbGlkUG9saWN5Q291bnR9IGFjdGl2ZSBlbGVtZW50JHtzaW5ndWxhciA/ICcnIDogJ3MnfSBoYSR7c2luZ3VsYXIgPyAncycgOiAndmUnfSBtYWxmb3JtZWQgZ2F0ZWtlZXBlciBwb2xpY3kuIFRoZSBlbGVtZW50JHtzaW5ndWxhciA/ICcgcmVtYWlucycgOiAncyByZW1haW4nfSBhY3RpdmUsIGJ1dCB0aGF0IHBvbGljeSBpcyBub3QgZW5mb3JjZWFibGUgdW50aWwgZml4ZWQuYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgQ0xJIGFwcHJvdmFsIHBvbGljeSBmcm9tIGFsbCBhY3RpdmUgZWxlbWVudHMuXG4gKlxuICogVW5pb25zIGByZXF1aXJlQXBwcm92YWxgIGFycmF5cyBhY3Jvc3MgYWxsIGVsZW1lbnRzLiBUYWtlcyB0aGUgbW9zdFxuICogY29uc2VydmF0aXZlIChzbWFsbGVzdCkgVFRMLiBGYWxscyBiYWNrIHRvIGVudiB2YXIgYERPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZYC5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudHMgLSBDdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBhcHByb3ZhbCBwb2xpY3lcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10pOiBDbGlBcHByb3ZhbFBvbGljeSB7XG4gIGNvbnN0IHJlcXVpcmVBcHByb3ZhbCA9IG5ldyBTZXQ8J21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnPigpO1xuICBsZXQgZGVmYXVsdFNjb3BlOiBDbGlBcHByb3ZhbFNjb3BlIHwgdW5kZWZpbmVkO1xuICBsZXQgdHRsU2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IHBvbGljeSA9IGVsZW1lbnQubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hcHByb3ZhbFBvbGljeTtcbiAgICBpZiAoIXBvbGljeSkgY29udGludWU7XG5cbiAgICBpZiAocG9saWN5LnJlcXVpcmVBcHByb3ZhbCkge1xuICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBwb2xpY3kucmVxdWlyZUFwcHJvdmFsKSB7XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbC5hZGQobGV2ZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9saWN5LmRlZmF1bHRTY29wZSAmJiAhZGVmYXVsdFNjb3BlKSB7XG4gICAgICBkZWZhdWx0U2NvcGUgPSBwb2xpY3kuZGVmYXVsdFNjb3BlO1xuICAgIH1cbiAgICBpZiAocG9saWN5LnR0bFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHRsU2Vjb25kcyA9IHR0bFNlY29uZHMgPT09IHVuZGVmaW5lZCA/IHBvbGljeS50dGxTZWNvbmRzIDogTWF0aC5taW4odHRsU2Vjb25kcywgcG9saWN5LnR0bFNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGVudmlyb25tZW50IHZhcmlhYmxlXG4gIGlmIChyZXF1aXJlQXBwcm92YWwuc2l6ZSA9PT0gMCkge1xuICAgIGNvbnN0IGVudlBvbGljeSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZO1xuICAgIGlmIChlbnZQb2xpY3kpIHtcbiAgICAgIGNvbnN0IGxldmVscyA9IGVudlBvbGljeS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIocyA9PiBzID09PSAnbW9kZXJhdGUnIHx8IHMgPT09ICdkYW5nZXJvdXMnKTtcbiAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbC5hZGQobGV2ZWwgYXMgJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlcXVpcmVBcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsLnNpemUgPiAwID8gQXJyYXkuZnJvbShyZXF1aXJlQXBwcm92YWwpIDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRTY29wZSxcbiAgICB0dGxTZWNvbmRzLFxuICB9O1xufVxuIl19
3923
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNCLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0osT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFNTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBSXBCLGNBQWMsRUFDZCwwQkFBMEIsR0FDM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMs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bnRlbnQiOlsiLyoqXG4gKiBNQ1BBUUxIYW5kbGVyIC0gVW5pZmllZCBoYW5kbGVyIGZvciBhbGwgTUNQLUFRTCBvcGVyYXRpb25zXG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBUaGluIHJlc29sdmVyIHBhdHRlcm46IHZhbGlkYXRlcyDihpIgcm91dGVzIOKGkiBkaXNwYXRjaGVzXG4gKiAtIFNPTElEIHByaW5jaXBsZXM6IGRlcGVuZHMgb24gYWJzdHJhY3Rpb25zIChIYW5kbGVyUmVnaXN0cnkgaW50ZXJmYWNlKVxuICogLSBEZWZlbnNlIGluIGRlcHRoOiBHYXRla2VlcGVyIHZhbGlkYXRlcyBlbmRwb2ludC9vcGVyYXRpb24gbWF0Y2hpbmcgYW5kIGVuZm9yY2VzIHBvbGljaWVzXG4gKiAtIERpc3BhdGNoIHBhdHRlcm46IHJvdXRlcyBoYW5kbGVyIHJlZmVyZW5jZXMgdG8gYWN0dWFsIG1ldGhvZCBjYWxsc1xuICpcbiAqIE9QRVJBVElPTiBGTE9XOlxuICogMS4gVmFsaWRhdGUgaW5wdXQgc3RydWN0dXJlICh0eXBlIGd1YXJkcylcbiAqIDIuIFZhbGlkYXRlIHBlcm1pc3Npb25zIChHYXRla2VlcGVyKVxuICogMy4gUm91dGUgb3BlcmF0aW9uIChPcGVyYXRpb25Sb3V0ZXIpXG4gKiA0LiBEaXNwYXRjaCB0byBoYW5kbGVyIChyZXNvbHZlSGFuZGxlclJlZmVyZW5jZSlcbiAqIDUuIFJldHVybiBzdGFuZGFyZGl6ZWQgcmVzdWx0IChPcGVyYXRpb25SZXN1bHQpXG4gKlxuICogRVJST1IgSEFORExJTkc6XG4gKiBBbGwgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIHJldHVybmVkIGFzIE9wZXJhdGlvbkZhaWx1cmUgd2l0aDpcbiAqIC0gc3VjY2VzczogZmFsc2VcbiAqIC0gZXJyb3I6IGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2VcbiAqIC0gZGF0YTogbmV2ZXIgKGRpc2NyaW1pbmF0ZWQgdW5pb24gZW5mb3JjZXMgdGhpcylcbiAqL1xuXG5pbXBvcnQgeyBDUlVERW5kcG9pbnQgfSBmcm9tICcuL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBHYXRla2VlcGVyIH0gZnJvbSAnLi9HYXRla2VlcGVyLmpzJztcbmltcG9ydCB7IHR5cGUgQWN0aXZlRWxlbWVudCwgdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5LCBjYW5PcGVyYXRpb25CZUVsZXZhdGVkIH0gZnJvbSAnLi9wb2xpY2llcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbiwgZmluZENvbmZpcm1EZW55aW5nRWxlbWVudCwgZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzLCBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MgfSBmcm9tICcuL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uTGV2ZWwsIEdhdGVrZWVwZXJFcnJvckNvZGUgfSBmcm9tICcuL0dhdGVrZWVwZXJUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRSb3V0ZSB9IGZyb20gJy4vT3BlcmF0aW9uUm91dGVyLmpzJztcbmltcG9ydCB7IEFMTF9PUEVSQVRJT05fU0NIRU1BUyB9IGZyb20gJy4vT3BlcmF0aW9uU2NoZW1hLmpzJztcbmltcG9ydCB7IEludHJvc3BlY3Rpb25SZXNvbHZlciB9IGZyb20gJy4vSW50cm9zcGVjdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IFNjaGVtYURpc3BhdGNoZXIgfSBmcm9tICcuL1NjaGVtYURpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZU5vcm1hbGl6ZXJzIH0gZnJvbSAnLi9ub3JtYWxpemVycy9pbmRleC5qcyc7XG5pbXBvcnQgeyBmaWx0ZXJGaWVsZHMsIGlzVmFsaWRQcmVzZXQsIG5vcm1hbGl6ZUZpZWxkTmFtZXMgfSBmcm9tICcuLi8uLi91dGlscy9GaWVsZEZpbHRlci5qcyc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25JbnB1dCxcbiAgT3BlcmF0aW9uUmVzdWx0LFxuICBPcGVyYXRpb25TdWNjZXNzLFxuICBPcGVyYXRpb25GYWlsdXJlLFxuICBSZXNwb25zZU1ldGEsXG4gIHBhcnNlT3BlcmF0aW9uSW5wdXQsXG4gIGRlc2NyaWJlSW52YWxpZElucHV0LFxuICBCYXRjaFJlcXVlc3QsXG4gIEJhdGNoUmVzdWx0LFxuICBCYXRjaE9wZXJhdGlvblJlc3VsdCxcbiAgaXNCYXRjaFJlcXVlc3QsXG4gIG5vcm1hbGl6ZU1DUEFRTEVsZW1lbnRUeXBlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBpc1NlYXJjaE1hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VhcmNoVXRpbHMuanMnO1xuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9QYWdpbmF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbGVtZW50VHlwZSwgQUxMX0VMRU1FTlRfVFlQRVMsIGZvcm1hdEVsZW1lbnRUeXBlc0xpc3QgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlUb29sLCBldmFsdWF0ZUNsaVRvb2xQb2xpY3ksIGFzc2Vzc1Jpc2sgfSBmcm9tICcuL3BvbGljaWVzL1Rvb2xDbGFzc2lmaWNhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IENsaUFwcHJvdmFsU2NvcGUsIENsaUFwcHJvdmFsUG9saWN5IH0gZnJvbSAnLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vdXRpbHMvUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgeyBTVE9SQUdFX0xBWUVSX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBEYW5nZXJab25lRW5mb3JjZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9EYW5nZXJab25lRW5mb3JjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBWZXJpZmljYXRpb25TdG9yZSB9IGZyb20gJ0Bkb2xsaG91c2VtY3Avc2FmZXR5JztcbmltcG9ydCB0eXBlIHsgSVZlcmlmaWNhdGlvbk5vdGlmaWVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvVmVyaWZpY2F0aW9uTm90aWZpZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEaXNwbGF5Q29kZSB9IGZyb20gJ0Bkb2xsaG91c2VtY3Avc2FmZXR5JztcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRDUlVESGFuZGxlciB9IGZyb20gJy4uL0VsZW1lbnRDUlVESGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFnZW50RXhlY3V0aW9uSWRlbnRpdHksIHR5cGUgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFnZW50TWV0YWRhdGFWMiwgQWdlbnRSZXNpbGllbmNlUG9saWN5LCBBZ2VudE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy90eXBlcy5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZVJlc2lsaWVuY2VQb2xpY3ksIGNpcmN1aXRCcmVha2VyLCB0eXBlIFJlc2lsaWVuY2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL3Jlc2lsaWVuY2VFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHsgcmVzaWxpZW5jZU1ldHJpY3MgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvcmVzaWxpZW5jZU1ldHJpY3MuanMnO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZVJlbmRlcmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvVGVtcGxhdGVSZW5kZXJlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9FbGVtZW50UXVlcnlTZXJ2aWNlLmpzJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUVsZW1lbnRzLCB2YWxpZGF0ZUFnZ3JlZ2F0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXJ5L0FnZ3JlZ2F0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IElFbGVtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gJy4uL1BvcnRmb2xpb0hhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBHaXRIdWJBdXRoSGFuZGxlciB9IGZyb20gJy4uL0dpdEh1YkF1dGhIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnSGFuZGxlciB9IGZyb20gJy4uL0NvbmZpZ0hhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZEluZGV4SGFuZGxlciB9IGZyb20gJy4uL0VuaGFuY2VkSW5kZXhIYW5kbGVyLmpzJztcbmltcG9ydCB7IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbkhvb2tzLmpzJztcbmltcG9ydCB7XG4gIFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFUyxcbiAgcmVhZFBlcm1pc3Npb25BdXRob3JpdHlTdGF0ZSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbkF1dGhvcml0eS5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcnNvbmFIYW5kbGVyIH0gZnJvbSAnLi4vUGVyc29uYUhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTeW5jSGFuZGxlciB9IGZyb20gJy4uL1N5bmNIYW5kbGVyVjIuanMnO1xuaW1wb3J0IHR5cGUgeyBCdWlsZEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvQnVpbGRJbmZvU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2dRdWVyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0cmljUXVlcnlPcHRpb25zLCBNZXRyaWNUeXBlIH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcmZvcm1hbmNlTW9uaXRvciB9IGZyb20gJy4uLy4uL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9PcGVyYXRpb25NZXRyaWNzVHJhY2tlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlciB9IGZyb20gJy4uLy4uL21ldHJpY3MvR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgcHJlcGFyZUhhbmRvZmZTdGF0ZSwgcGFyc2VIYW5kb2ZmQmxvY2ssIGdlbmVyYXRlSGFuZG9mZkJsb2NrIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL2hhbmRvZmYuanMnO1xuaW1wb3J0IHsgZ2V0QXV0b25vbXlNZXRyaWNzIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL2F1dG9ub215RXZhbHVhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgQXV0b25vbXlNZXRyaWNzU25hcHNob3QgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHsgRWxlbWVudE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJhbWV0ZXIgVmFsaWRhdGlvbiBVdGlsaXRpZXMgKElzc3VlICMzMjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIGV4dHJhY3QgYSByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGZyb20gcGFyYW1zLlxuICogVGhyb3dzIGEgdXNlci1mcmllbmRseSBlcnJvciBpZiB0aGUgcGFyYW1ldGVyIGlzIG1pc3Npbmcgb3Igbm90IGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBvYmplY3QgdG8gZXh0cmFjdCBmcm9tXG4gKiBAcGFyYW0gcGFyYW1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIHBhcmFtZXRlclxuICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIHRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIHN0cmluZyB2YWx1ZVxuICogQHRocm93cyBFcnJvciB3aXRoIHVzZXItZnJpZW5kbHkgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhcmFtTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtc1twYXJhbU5hbWVdO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJyR7cGFyYW1OYW1lfScuIEV4cGVjdGVkOiBzdHJpbmcgKCR7ZGVzY3JpcHRpb259KWBcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuY29uc3QgRVhFQ1VUSU9OX09QRVJBVElPTl9OQU1FUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgZXhlY3V0ZTogJ2V4ZWN1dGVfYWdlbnQnLFxuICBnZXRTdGF0ZTogJ2dldF9leGVjdXRpb25fc3RhdGUnLFxuICB1cGRhdGVTdGF0ZTogJ3JlY29yZF9leGVjdXRpb25fc3RlcCcsXG4gIGNvbXBsZXRlOiAnY29tcGxldGVfZXhlY3V0aW9uJyxcbiAgY29udGludWU6ICdjb250aW51ZV9leGVjdXRpb24nLFxuICBhYm9ydDogJ2Fib3J0X2V4ZWN1dGlvbicsXG4gIGdldEdhdGhlcmVkRGF0YTogJ2dldF9nYXRoZXJlZF9kYXRhJyxcbiAgcHJlcGFyZUhhbmRvZmY6ICdwcmVwYXJlX2hhbmRvZmYnLFxuICByZXN1bWVGcm9tSGFuZG9mZjogJ3Jlc3VtZV9mcm9tX2hhbmRvZmYnLFxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVFeGVjdXRpb25FbGVtZW50TmFtZShcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zLmVsZW1lbnRfbmFtZTtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IEVYRUNVVElPTl9PUEVSQVRJT05fTkFNRVNbbWV0aG9kXSB8fCAnZXhlY3V0aW9uIGxpZmVjeWNsZSBvcGVyYXRpb24nO1xuXG4gIGlmIChtZXRob2QgPT09ICdnZXRTdGF0ZScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2VsZW1lbnRfbmFtZScuIEV4cGVjdGVkOiBzdHJpbmcgYCArXG4gICAgICBgKHRoZSBuYW1lIG9mIHRoZSBhZ2VudC9leGVjdXRhYmxlIGVsZW1lbnQgd2hvc2UgZXhlY3V0aW9uIHN0YXRlIHlvdSB3YW50IHRvIGluc3BlY3QpLiBgICtcbiAgICAgIGBVc2UgdGhlIHNhbWUgZWxlbWVudF9uYW1lIHlvdSBwYXNzZWQgdG8gZXhlY3V0ZV9hZ2VudC4gYCArXG4gICAgICBgUmV0cnkgd2l0aDogeyBvcGVyYXRpb246IFwiZ2V0X2V4ZWN1dGlvbl9zdGF0ZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgaW5jbHVkZURlY2lzaW9uSGlzdG9yeTogdHJ1ZSB9IH0uIGAgK1xuICAgICAgYElmIHlvdSdyZSB1bnN1cmUgd2hpY2ggbmFtZSB0byB1c2UsIGNhbGwgaW50cm9zcGVjdCBmb3IgXCJnZXRfZXhlY3V0aW9uX3N0YXRlXCIgb3IgbGlzdCBhY3RpdmUgYWdlbnRzIGZpcnN0LmBcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnZWxlbWVudF9uYW1lJy4gRXhwZWN0ZWQ6IHN0cmluZyBgICtcbiAgICBgKHRoZSBuYW1lIG9mIHRoZSBhZ2VudC9leGVjdXRhYmxlIGVsZW1lbnQgZm9yICR7b3BlcmF0aW9uTmFtZX0pLiBgICtcbiAgICBgSWYgdGhpcyBpcyBwYXJ0IG9mIGFuIGV4aXN0aW5nIGV4ZWN1dGlvbiBsaWZlY3ljbGUsIHJldXNlIHRoZSBzYW1lIGVsZW1lbnRfbmFtZSB5b3UgcGFzc2VkIHRvIGV4ZWN1dGVfYWdlbnQuIGAgK1xuICAgIGBJZiB5b3UncmUgdW5zdXJlIHdoaWNoIG5hbWUgdG8gdXNlLCBjYWxsIGludHJvc3BlY3QgZm9yIFwiJHtvcGVyYXRpb25OYW1lfVwiIG9yIGxpc3QgYWN0aXZlIGFnZW50cyBmaXJzdC5gXG4gICk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgaW50byBhIHsgcGFnZSwgcGFnZVNpemUgfSBvYmplY3QuXG4gKlxuICogSXNzdWUgIzUwMDogcXVlcnlfZWxlbWVudHMgYW5kIHNlYXJjaF9lbGVtZW50cyBzaWxlbnRseSBpZ25vcmVkIGZsYXRcbiAqIHBhZ2VTaXplL3BhZ2UvbGltaXQvb2Zmc2V0IHBhcmFtcy4gVGhpcyBoZWxwZXIgZGV0ZWN0cyB0aGVzZSBhdCB0aGVcbiAqIHRvcCBsZXZlbCBhbmQgbm9ybWFsaXplcyB0aGVtLCBtYXRjaGluZyB0aGUgcGF0dGVybiB1c2VkIGJ5IGxpc3RFbGVtZW50cy5cbiAqXG4gKiBQcmlvcml0eTogbmVzdGVkIHBhZ2luYXRpb24gPiBsaW1pdC9vZmZzZXQgPiBmbGF0IHBhZ2UvcGFnZVNpemUgPiBkZWZhdWx0c1xuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWdpbmF0aW9uUGFyYW1zKFxuICBwYXJhbXM6IHtcbiAgICBwYWdpbmF0aW9uPzogeyBwYWdlPzogbnVtYmVyOyBwYWdlU2l6ZT86IG51bWJlciB9O1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgcGFnZVNpemU/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gIH1cbik6IHsgcGFnZTogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0ge1xuICAvLyBJZiBuZXN0ZWQgcGFnaW5hdGlvbiBpcyBwcmVzZW50LCB1c2UgaXQgZGlyZWN0bHlcbiAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uICYmIHR5cGVvZiBwYXJhbXMucGFnaW5hdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwID0gcGFyYW1zLnBhZ2luYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6ICh0eXBlb2YgcC5wYWdlID09PSAnbnVtYmVyJyAmJiBwLnBhZ2UgPiAwKSA/IHAucGFnZSA6IDEsXG4gICAgICBwYWdlU2l6ZTogKHR5cGVvZiBwLnBhZ2VTaXplID09PSAnbnVtYmVyJyAmJiBwLnBhZ2VTaXplID4gMCkgPyBwLnBhZ2VTaXplIDogMjAsXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwYWdlID0gMTtcbiAgbGV0IHBhZ2VTaXplID0gMjA7XG5cbiAgLy8gU3VwcG9ydCBsaW1pdC9vZmZzZXQgc3R5bGUgKGNvbnZlcnQgdG8gcGFnZS9wYWdlU2l6ZSlcbiAgaWYgKHR5cGVvZiBwYXJhbXMubGltaXQgPT09ICdudW1iZXInICYmIHBhcmFtcy5saW1pdCA+IDApIHtcbiAgICBwYWdlU2l6ZSA9IHBhcmFtcy5saW1pdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5vZmZzZXQgPT09ICdudW1iZXInICYmIHBhcmFtcy5vZmZzZXQgPj0gMCkge1xuICAgICAgcGFnZSA9IE1hdGguZmxvb3IocGFyYW1zLm9mZnNldCAvIHBhcmFtcy5saW1pdCkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN1cHBvcnQgZmxhdCBwYWdlL3BhZ2VTaXplIChvdmVycmlkZXMgbGltaXQvb2Zmc2V0IGlmIGJvdGggcHJlc2VudClcbiAgaWYgKHR5cGVvZiBwYXJhbXMucGFnZSA9PT0gJ251bWJlcicgJiYgcGFyYW1zLnBhZ2UgPiAwKSB7XG4gICAgcGFnZSA9IHBhcmFtcy5wYWdlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnBhZ2VTaXplID09PSAnbnVtYmVyJyAmJiBwYXJhbXMucGFnZVNpemUgPiAwKSB7XG4gICAgcGFnZVNpemUgPSBwYXJhbXMucGFnZVNpemU7XG4gIH1cblxuICByZXR1cm4geyBwYWdlLCBwYWdlU2l6ZSB9O1xufVxuXG4vKipcbiAqIFZhbGlkIGxvZyBjYXRlZ29yaWVzIGFjY2VwdGVkIGJ5IExvZ1F1ZXJ5T3B0aW9ucy5cbiAqIE1hdGNoZXMgdGhlIExvZ0NhdGVnb3J5IHVuaW9uIHR5cGUgcGx1cyB0aGUgJ2FsbCcgd2lsZGNhcmQuXG4gKi9cbmNvbnN0IFZBTElEX0xPR19DQVRFR09SSUVTID0gbmV3IFNldChbJ2FwcGxpY2F0aW9uJywgJ3NlY3VyaXR5JywgJ3BlcmZvcm1hbmNlJywgJ3RlbGVtZXRyeScsICdhbGwnXSk7XG5cbi8qKlxuICogVmFsaWQgbG9nIGxldmVscyBhY2NlcHRlZCBieSBMb2dRdWVyeU9wdGlvbnMuXG4gKiBNYXRjaGVzIHRoZSBMb2dMZXZlbCB1bmlvbiB0eXBlLlxuICovXG5jb25zdCBWQUxJRF9MT0dfTEVWRUxTID0gbmV3IFNldChbJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgcmF3IHBhcmFtcyBpbnRvIGEgc2FmZSBMb2dRdWVyeU9wdGlvbnMgb2JqZWN0LlxuICogU3RyaXBzIHVua25vd24ga2V5cywgdmFsaWRhdGVzIHR5cGVzIG9mIGtub3duIGZpZWxkcywgYW5kIHJldHVybnNcbiAqIG9ubHkgd2VsbC10eXBlZCB2YWx1ZXMuIEludmFsaWQgZmllbGRzIGFyZSBzaWxlbnRseSBkcm9wcGVkIHNpbmNlXG4gKiBhbGwgTG9nUXVlcnlPcHRpb25zIGZpZWxkcyBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFJhdyBwYXJhbXMgZnJvbSB0aGUgTUNQIHJlcXVlc3RcbiAqIEByZXR1cm5zIFZhbGlkYXRlZCBMb2dRdWVyeU9wdGlvbnMgd2l0aCBvbmx5IHZhbGlkIGZpZWxkc1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUxvZ1F1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBMb2dRdWVyeU9wdGlvbnMge1xuICBjb25zdCBvcHRpb25zOiBMb2dRdWVyeU9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIHBhcmFtcy5jYXRlZ29yeSA9PT0gJ3N0cmluZycgJiYgVkFMSURfTE9HX0NBVEVHT1JJRVMuaGFzKHBhcmFtcy5jYXRlZ29yeSkpIHtcbiAgICBvcHRpb25zLmNhdGVnb3J5ID0gcGFyYW1zLmNhdGVnb3J5IGFzIExvZ1F1ZXJ5T3B0aW9uc1snY2F0ZWdvcnknXTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5sZXZlbCA9PT0gJ3N0cmluZycgJiYgVkFMSURfTE9HX0xFVkVMUy5oYXMocGFyYW1zLmxldmVsKSkge1xuICAgIG9wdGlvbnMubGV2ZWwgPSBwYXJhbXMubGV2ZWwgYXMgTG9nUXVlcnlPcHRpb25zWydsZXZlbCddO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zaW5jZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNpbmNlID0gcGFyYW1zLnNpbmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnVudGlsID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMudW50aWwgPSBwYXJhbXMudW50aWw7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGltaXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMubGltaXQpKSB7XG4gICAgb3B0aW9ucy5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5vZmZzZXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMub2Zmc2V0KSkge1xuICAgIG9wdGlvbnMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5jb3JyZWxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmNvbnN0IFZBTElEX01FVFJJQ19UWVBFUyA9IG5ldyBTZXQ8TWV0cmljVHlwZT4oWydjb3VudGVyJywgJ2dhdWdlJywgJ2hpc3RvZ3JhbSddKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVNZXRyaWNRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTWV0cmljUXVlcnlPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogTWV0cmljUXVlcnlPcHRpb25zID0ge307XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLm5hbWVzKSkge1xuICAgIG9wdGlvbnMubmFtZXMgPSBwYXJhbXMubmFtZXMuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gdHlwZW9mIG4gPT09ICdzdHJpbmcnKTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zb3VyY2UgPSBwYXJhbXMuc291cmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnR5cGUgPT09ICdzdHJpbmcnICYmIFZBTElEX01FVFJJQ19UWVBFUy5oYXMocGFyYW1zLnR5cGUgYXMgTWV0cmljVHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBwYXJhbXMudHlwZSBhcyBNZXRyaWNUeXBlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuc2luY2UgPSBwYXJhbXMuc2luY2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMudW50aWwgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy51bnRpbCA9IHBhcmFtcy51bnRpbDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5sYXRlc3QgPT09ICdib29sZWFuJykge1xuICAgIG9wdGlvbnMubGF0ZXN0ID0gcGFyYW1zLmxhdGVzdDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5saW1pdCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBhcmFtcy5saW1pdCkpIHtcbiAgICBvcHRpb25zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm9mZnNldCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBhcmFtcy5vZmZzZXQpKSB7XG4gICAgb3B0aW9ucy5vZmZzZXQgPSBwYXJhbXMub2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZlcmlmaWNhdGlvbiBTZWN1cml0eSBVdGlsaXRpZXMgKElzc3VlICMxNDIg4oCUIFBSICM0NzggcmV2aWV3IGZvbGxvdy11cHMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBVVUlEIHY0IGZvcm1hdDogOC00LTQtNC0xMiBoZXggZGlnaXRzIHdpdGggdmVyc2lvbiA0IG1hcmtlciBhbmQgdmFyaWFudCBiaXRzICovXG5jb25zdCBVVUlEX1Y0X1JFR0VYID0gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS00WzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pO1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBjaGFsbGVuZ2UgSUQgaXMgYSB2YWxpZCBVVUlEIHY0IGZvcm1hdC5cbiAqIENoYWxsZW5nZSBJRHMgYXJlIGdlbmVyYXRlZCBieSBjcnlwdG8ucmFuZG9tVVVJRCgpIGFuZCBtdXN0IGNvbmZvcm0uXG4gKiBSZWplY3RzIG9idmlvdXNseSBpbnZhbGlkIElEcyBiZWZvcmUgaGl0dGluZyB0aGUgc3RvcmUgdG8gcHJldmVudCBlbnVtZXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDaGFsbGVuZ2VJZEZvcm1hdChjaGFsbGVuZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghVVVJRF9WNF9SRUdFWC50ZXN0KGNoYWxsZW5nZUlkKSkge1xuICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgIGBJbnZhbGlkIGNoYWxsZW5nZV9pZCBmb3JtYXQuIEV4cGVjdGVkIFVVSUQgdjQgKGUuZy4sIFwiNTUwZTg0MDAtZTI5Yi00MWQ0LWE3MTYtNDQ2NjU1NDQwMDAwXCIpLmBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogU3RydWN0dXJlZCB2ZXJpZmljYXRpb24gZXJyb3Igd2l0aCBHYXRla2VlcGVyIGVycm9yIGNvZGUuXG4gKiBFbmFibGVzIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmcgYWxpZ25lZCB3aXRoIGV4aXN0aW5nIEdhdGVrZWVwZXIgcGF0dGVybnMuXG4gKi9cbmNsYXNzIFZlcmlmaWNhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JDb2RlOiBHYXRla2VlcGVyRXJyb3JDb2RlLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1ZlcmlmaWNhdGlvbkVycm9yJztcbiAgfVxufVxuXG5jb25zdCBERUFETE9DS19SRUxJRUZfUkVBU09OID0gJ0RlYWRsb2NrIHJlbGllZiByZXF1ZXN0ZWQnO1xuY29uc3QgREVBRExPQ0tfUkVMSUVGX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgREVBRExPQ0tfUkVMSUVGX0RJQUxPR19SRUFTT04gPVxuICAnRGVhZGxvY2sgcmVsaWVmIHJlcXVlc3RlZC5cXG5cXG5UaGlzIHdpbGwgZGVhY3RpdmF0ZSBhbGwgYWN0aXZlIGVsZW1lbnRzIGZvciB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCBjbGVhciBwZXJzaXN0ZWQgYWN0aXZhdGlvbiBzdGF0ZS4nO1xuXG4vKipcbiAqIEdsb2JhbCByYXRlIGxpbWl0ZXIgZm9yIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy5cbiAqIFRyYWNrcyBmYWlsZWQgYXR0ZW1wdHMgd2l0aGluIGEgc2xpZGluZyB3aW5kb3cgdG8gcHJldmVudCBicnV0ZS1mb3JjZSBhdHRhY2tzLlxuICpcbiAqIERlc2lnbjogU2luY2UgdmVyaWZpY2F0aW9uIGNvZGVzIGFyZSBvbmUtdGltZS11c2UgKGRlbGV0ZWQgb24gYW55IGF0dGVtcHQpLFxuICogdGhlIHJlYWwgYXR0YWNrIHZlY3RvciBpcyByZXBlYXRlZCBjaGFsbGVuZ2UgY3JlYXRpb24gKyBpbW1lZGlhdGUgYXR0ZW1wdC5cbiAqIFRoaXMgbGltaXRlciBjYXBzIHRvdGFsIGZhaWx1cmVzIGFjcm9zcyBhbGwgY2hhbGxlbmdlcyB3aXRoaW4gYSB0aW1lIHdpbmRvdy5cbiAqL1xuY2xhc3MgVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIge1xuICBwcml2YXRlIGZhaWx1cmVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4RmFpbHVyZXM6IG51bWJlciA9IDEwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93TXM6IG51bWJlciA9IDYwXzAwMCxcbiAgKSB7fVxuXG4gIC8qKiBSZWNvcmQgYSBmYWlsZWQgdmVyaWZpY2F0aW9uIGF0dGVtcHQuIFJldHVybnMgdHJ1ZSBpZiByYXRlIGxpbWl0IGlzIGV4Y2VlZGVkLiAqL1xuICByZWNvcmRGYWlsdXJlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5mYWlsdXJlcy5wdXNoKG5vdyk7XG4gICAgdGhpcy5wcnVuZShub3cpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmxlbmd0aCA+IHRoaXMubWF4RmFpbHVyZXM7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgcmF0ZSBsaW1pdCBpcyBjdXJyZW50bHkgZXhjZWVkZWQgd2l0aG91dCByZWNvcmRpbmcuICovXG4gIGlzTGltaXRlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLnBydW5lKERhdGUubm93KCkpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmxlbmd0aCA+IHRoaXMubWF4RmFpbHVyZXM7XG4gIH1cblxuICAvKiogUmVtb3ZlIGVudHJpZXMgb3V0c2lkZSB0aGUgc2xpZGluZyB3aW5kb3cuICovXG4gIHByaXZhdGUgcHJ1bmUobm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB0aGlzLndpbmRvd01zO1xuICAgIHdoaWxlICh0aGlzLmZhaWx1cmVzLmxlbmd0aCA+IDAgJiYgdGhpcy5mYWlsdXJlc1swXSA8IGN1dG9mZikge1xuICAgICAgdGhpcy5mYWlsdXJlcy5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDdXJyZW50IGZhaWx1cmUgY291bnQgaW4gd2luZG93IChmb3IgbWV0cmljcykuICovXG4gIGdldCBmYWlsdXJlc0luV2luZG93KCk6IG51bWJlciB7XG4gICAgdGhpcy5wcnVuZShEYXRlLm5vdygpKTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGg7XG4gIH1cblxuICAvKiogUmVzZXQgKGZvciB0ZXN0aW5nKS4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5mYWlsdXJlcyA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZpY2F0aW9uIG1ldHJpY3MgdHJhY2tlciBmb2xsb3dpbmcgRGFuZ2VyWm9uZUVuZm9yY2VyLmdldE1ldHJpY3MoKSBwYXR0ZXJuLlxuICogVHJhY2tzIHN1Y2Nlc3MvZmFpbHVyZS9leHBpcnkgcmF0ZXMgYW5kIHRpbWUtdG8tdmVyaWZ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk1ldHJpY3Mge1xuICAvKiogVG90YWwgdmVyaWZ5X2NoYWxsZW5nZSBjYWxscyBzaW5jZSBzdGFydHVwICovXG4gIHRvdGFsQXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIFN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9ucyAqL1xuICB0b3RhbFN1Y2Nlc3NlczogbnVtYmVyO1xuICAvKiogRmFpbGVkIHZlcmlmaWNhdGlvbnMgKHdyb25nIGNvZGUpICovXG4gIHRvdGFsRmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIEV4cGlyZWQgY2hhbGxlbmdlIGF0dGVtcHRzICovXG4gIHRvdGFsRXhwaXJlZDogbnVtYmVyO1xuICAvKiogSW52YWxpZCBmb3JtYXQgYXR0ZW1wdHMgKHJlamVjdGVkIGJlZm9yZSBzdG9yZSBsb29rdXApICovXG4gIHRvdGFsSW52YWxpZEZvcm1hdDogbnVtYmVyO1xuICAvKiogUmF0ZS1saW1pdGVkIGF0dGVtcHRzICovXG4gIHRvdGFsUmF0ZUxpbWl0ZWQ6IG51bWJlcjtcbiAgLyoqIEF2ZXJhZ2UgdGltZSBmcm9tIGNoYWxsZW5nZSBjcmVhdGlvbiB0byBzdWNjZXNzZnVsIHZlcmlmeSAobXMpICovXG4gIGF2ZXJhZ2VUaW1lVG9WZXJpZnlNczogbnVtYmVyO1xuICAvKiogQ3VycmVudCBmYWlsdXJlcyBpbiByYXRlLWxpbWl0IHdpbmRvdyAqL1xuICBmYWlsdXJlc0luQ3VycmVudFdpbmRvdzogbnVtYmVyO1xufVxuXG5jbGFzcyBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlciB7XG4gIHByaXZhdGUgX3RvdGFsQXR0ZW1wdHMgPSAwO1xuICBwcml2YXRlIF90b3RhbFN1Y2Nlc3NlcyA9IDA7XG4gIHByaXZhdGUgX3RvdGFsRmFpbHVyZXMgPSAwO1xuICBwcml2YXRlIF90b3RhbEV4cGlyZWQgPSAwO1xuICBwcml2YXRlIF90b3RhbEludmFsaWRGb3JtYXQgPSAwO1xuICBwcml2YXRlIF90b3RhbFJhdGVMaW1pdGVkID0gMDtcbiAgcHJpdmF0ZSB2ZXJpZnlEdXJhdGlvbnM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9EVVJBVElPTlMgPSAxMDAwO1xuXG4gIHJlY29yZEF0dGVtcHQoKTogdm9pZCB7IHRoaXMuX3RvdGFsQXR0ZW1wdHMrKzsgfVxuICByZWNvcmRTdWNjZXNzKGR1cmF0aW9uTXM/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl90b3RhbFN1Y2Nlc3NlcysrO1xuICAgIGlmIChkdXJhdGlvbk1zICE9PSB1bmRlZmluZWQgJiYgZHVyYXRpb25NcyA+PSAwKSB7XG4gICAgICB0aGlzLnZlcmlmeUR1cmF0aW9ucy5wdXNoKGR1cmF0aW9uTXMpO1xuICAgICAgaWYgKHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aCA+IFZlcmlmaWNhdGlvbk1ldHJpY3NUcmFja2VyLk1BWF9EVVJBVElPTlMpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVjb3JkRmFpbHVyZSgpOiB2b2lkIHsgdGhpcy5fdG90YWxGYWlsdXJlcysrOyB9XG4gIHJlY29yZEV4cGlyZWQoKTogdm9pZCB7IHRoaXMuX3RvdGFsRXhwaXJlZCsrOyB9XG4gIHJlY29yZEludmFsaWRGb3JtYXQoKTogdm9pZCB7IHRoaXMuX3RvdGFsSW52YWxpZEZvcm1hdCsrOyB9XG4gIHJlY29yZFJhdGVMaW1pdGVkKCk6IHZvaWQgeyB0aGlzLl90b3RhbFJhdGVMaW1pdGVkKys7IH1cblxuICBnZXRNZXRyaWNzKHJhdGVMaW1pdGVyOiBWZXJpZmljYXRpb25SYXRlTGltaXRlcik6IFZlcmlmaWNhdGlvbk1ldHJpY3Mge1xuICAgIGNvbnN0IGF2Z0R1cmF0aW9uID0gdGhpcy52ZXJpZnlEdXJhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgPyBNYXRoLnJvdW5kKHRoaXMudmVyaWZ5RHVyYXRpb25zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdGhpcy52ZXJpZnlEdXJhdGlvbnMubGVuZ3RoKVxuICAgICAgOiAwO1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEF0dGVtcHRzOiB0aGlzLl90b3RhbEF0dGVtcHRzLFxuICAgICAgdG90YWxTdWNjZXNzZXM6IHRoaXMuX3RvdGFsU3VjY2Vzc2VzLFxuICAgICAgdG90YWxGYWlsdXJlczogdGhpcy5fdG90YWxGYWlsdXJlcyxcbiAgICAgIHRvdGFsRXhwaXJlZDogdGhpcy5fdG90YWxFeHBpcmVkLFxuICAgICAgdG90YWxJbnZhbGlkRm9ybWF0OiB0aGlzLl90b3RhbEludmFsaWRGb3JtYXQsXG4gICAgICB0b3RhbFJhdGVMaW1pdGVkOiB0aGlzLl90b3RhbFJhdGVMaW1pdGVkLFxuICAgICAgYXZlcmFnZVRpbWVUb1ZlcmlmeU1zOiBhdmdEdXJhdGlvbixcbiAgICAgIGZhaWx1cmVzSW5DdXJyZW50V2luZG93OiByYXRlTGltaXRlci5mYWlsdXJlc0luV2luZG93LFxuICAgIH07XG4gIH1cblxuICAvKiogUmVzZXQgKGZvciB0ZXN0aW5nKS4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdG90YWxBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5fdG90YWxTdWNjZXNzZXMgPSAwO1xuICAgIHRoaXMuX3RvdGFsRmFpbHVyZXMgPSAwO1xuICAgIHRoaXMuX3RvdGFsRXhwaXJlZCA9IDA7XG4gICAgdGhpcy5fdG90YWxJbnZhbGlkRm9ybWF0ID0gMDtcbiAgICB0aGlzLl90b3RhbFJhdGVMaW1pdGVkID0gMDtcbiAgICB0aGlzLnZlcmlmeUR1cmF0aW9ucyA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlciByZWdpc3RyeSBpbnRlcmZhY2UgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQWJzdHJhY3RzIHRoZSBjb25jcmV0ZSBoYW5kbGVyIHR5cGVzIGZvciBiZXR0ZXIgdGVzdGFiaWxpdHkgYW5kIGRlY291cGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclJlZ2lzdHJ5IHtcbiAgZWxlbWVudENSVUQ6IEVsZW1lbnRDUlVESGFuZGxlcjtcbiAgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlcjtcbiAgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXI7XG4gIHRlbXBsYXRlUmVuZGVyZXI6IFRlbXBsYXRlUmVuZGVyZXI7XG4gIGVsZW1lbnRRdWVyeVNlcnZpY2U6IEVsZW1lbnRRdWVyeVNlcnZpY2U7XG4gIC8vIE1DUC1BUUwgZXh0ZW5zaW9uIGhhbmRsZXJzIChJc3N1ZSAjMjQxKVxuICBjb2xsZWN0aW9uSGFuZGxlcj86IENvbGxlY3Rpb25IYW5kbGVyO1xuICBwb3J0Zm9saW9IYW5kbGVyPzogUG9ydGZvbGlvSGFuZGxlcjtcbiAgYXV0aEhhbmRsZXI/OiBHaXRIdWJBdXRoSGFuZGxlcjtcbiAgY29uZmlnSGFuZGxlcj86IENvbmZpZ0hhbmRsZXI7XG4gIGVuaGFuY2VkSW5kZXhIYW5kbGVyPzogRW5oYW5jZWRJbmRleEhhbmRsZXI7XG4gIHBlcnNvbmFIYW5kbGVyPzogUGVyc29uYUhhbmRsZXI7XG4gIHN5bmNIYW5kbGVyPzogU3luY0hhbmRsZXI7XG4gIGJ1aWxkSW5mb1NlcnZpY2U/OiBCdWlsZEluZm9TZXJ2aWNlO1xuICBjYWNoZU1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldDtcbiAgZ2F0ZWtlZXBlcjogR2F0ZWtlZXBlcjtcbiAgLy8gSXNzdWUgIzQwMjogREktaW5qZWN0ZWQgZGFuZ2VyIHpvbmUgZW5mb3JjZXIgKHJlcGxhY2VzIHNpbmdsZXRvbiBpbXBvcnQpXG4gIGRhbmdlclpvbmVFbmZvcmNlcj86IERhbmdlclpvbmVFbmZvcmNlcjtcbiAgLy8gSXNzdWUgIzE0MjogU2VydmVyLXNpZGUgdmVyaWZpY2F0aW9uIHN0b3JlIGZvciBjaGFsbGVuZ2UgY29kZXNcbiAgdmVyaWZpY2F0aW9uU3RvcmU/OiBWZXJpZmljYXRpb25TdG9yZTtcbiAgLy8gSXNzdWUgIzUyMjogTm9uLWJsb2NraW5nIE9TIGRpYWxvZyBmb3IgdmVyaWZpY2F0aW9uIGNvZGVzIChyZXBsYWNlcyByZXR1cm5pbmcgY29kZSB0byBMTE0pXG4gIHZlcmlmaWNhdGlvbk5vdGlmaWVyPzogSVZlcmlmaWNhdGlvbk5vdGlmaWVyO1xuICAvLyBJc3N1ZSAjNTI4OiBNZW1vcnlMb2dTaW5rIGZvciBDUlVERS1yb3V0ZWQgcXVlcnlfbG9nc1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgLy8gTWV0cmljczogTWVtb3J5TWV0cmljc1NpbmsgZm9yIENSVURFLXJvdXRlZCBxdWVyeV9tZXRyaWNzXG4gIG1ldHJpY3NTaW5rPzogaW1wb3J0KCcuLi8uLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJykuTWVtb3J5TWV0cmljc1Npbms7XG4gIC8vIFNlYXJjaCBtZXRyaWNzOiBQZXJmb3JtYW5jZU1vbml0b3IgZm9yIHJlY29yZFNlYXJjaCgpXG4gIHBlcmZvcm1hbmNlTW9uaXRvcj86IFBlcmZvcm1hbmNlTW9uaXRvcjtcbiAgLy8gT3BlcmF0aW9uIG1ldHJpY3M6IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIGZvciBDUlVEIG9wZXJhdGlvbiBzdGF0c1xuICBvcGVyYXRpb25NZXRyaWNzVHJhY2tlcj86IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyO1xuICAvLyBHYXRla2VlcGVyIG1ldHJpY3M6IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlciBmb3IgcG9saWN5IGVuZm9yY2VtZW50IHN0YXRzXG4gIGdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcj86IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcjtcbn1cblxuLyoqXG4gKiBFeHBvcnQgcGFja2FnZSBzdHJ1Y3R1cmUgZm9yIGVsZW1lbnQgaW1wb3J0L2V4cG9ydCBvcGVyYXRpb25zXG4gKi9cbmludGVyZmFjZSBFeHBvcnRQYWNrYWdlIHtcbiAgZXhwb3J0VmVyc2lvbjogc3RyaW5nO1xuICBleHBvcnRlZEF0OiBzdHJpbmc7XG4gIGVsZW1lbnRUeXBlOiBzdHJpbmc7XG4gIGVsZW1lbnROYW1lPzogc3RyaW5nO1xuICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJztcbiAgZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE1DUEFRTEhhbmRsZXIgLSBVbmlmaWVkIGVudHJ5IHBvaW50IGZvciBhbGwgTUNQLUFRTCBvcGVyYXRpb25zXG4gKlxuICogVGhpcyBoYW5kbGVyIGltcGxlbWVudHMgdGhlIHRoaW4gcmVzb2x2ZXIgcGF0dGVybjpcbiAqIDEuIFZhbGlkYXRlcyB0aGF0IG9wZXJhdGlvbnMgYXJlIGNhbGxlZCB2aWEgY29ycmVjdCBDUlVEIGVuZHBvaW50c1xuICogMi4gUm91dGVzIG9wZXJhdGlvbnMgdG8gdGhlaXIgaGFuZGxlciByZWZlcmVuY2VzXG4gKiAzLiBEaXNwYXRjaGVzIHRvIGFjdHVhbCBoYW5kbGVyIG1ldGhvZHNcbiAqIDQuIFJldHVybnMgc3RhbmRhcmRpemVkIE9wZXJhdGlvblJlc3VsdFxuICpcbiAqIERFU0lHTiBSQVRJT05BTEU6XG4gKiAtIFNpbmdsZSBSZXNwb25zaWJpbGl0eTogT25seSBvcmNoZXN0cmF0ZXMsIGRlbGVnYXRlcyBhY3R1YWwgd29ya1xuICogLSBEZXBlbmRlbmN5IEludmVyc2lvbjogRGVwZW5kcyBvbiBIYW5kbGVyUmVnaXN0cnkgaW50ZXJmYWNlXG4gKiAtIEludGVyZmFjZSBTZWdyZWdhdGlvbjogSGFuZGxlclJlZ2lzdHJ5IGV4cG9zZXMgb25seSB3aGF0J3MgbmVlZGVkXG4gKiAtIE9wZW4vQ2xvc2VkOiBOZXcgb3BlcmF0aW9ucyBhZGRlZCB0byByb3V0ZXIsIG5vdCB0aGlzIGNsYXNzXG4gKi9cbi8qKlxuICogTWluaW1hbCBpbnRlcmZhY2UgZm9yIGNvcnJlbGF0aW9uIElEIHJldHJpZXZhbC5cbiAqIEtlZXBzIGNvdXBsaW5nIGxvb3NlIOKAlCBvbmx5IHJlcXVpcmVzIHdoYXQgTUNQQVFMSGFuZGxlciBhY3R1YWxseSBuZWVkcy5cbiAqIElzc3VlICMzMDE6IFJlcXVlc3QgY29ycmVsYXRpb24gc3VwcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JyZWxhdGlvbklkUHJvdmlkZXIge1xuICBnZXRDb3JyZWxhdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1DUEFRTEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGdhdGVrZWVwZXI6IEdhdGVrZWVwZXI7XG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBQZXItbWVtb3J5IHNhdmUgZGVib3VuY2UgdGltZXJzLlxuICAgKiBXaGVuIGFkZEVudHJ5IGlzIGNhbGxlZCByYXBpZGx5LCB3ZSBjb2FsZXNjZSBzYXZlcyDigJQgb25seSB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGlzIHdyaXR0ZW4gdG8gZGlzayBhZnRlciB0aGUgZGVib3VuY2Ugd2luZG93IGV4cGlyZXMuXG4gICAqIEtleTogbm9ybWFsaXplZCBtZW1vcnkgbmFtZSwgVmFsdWU6IHsgdGltZXIsIG1lbW9yeSwgbWFuYWdlciB9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdTYXZlcyA9IG5ldyBNYXA8c3RyaW5nLCB7XG4gICAgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICAgIG1lbW9yeTogaW1wb3J0KCcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnKS5NZW1vcnk7XG4gICAgbWFuYWdlcjogTWVtb3J5TWFuYWdlcjtcbiAgfT4oKTtcbiAgLyoqIElzc3VlICM2NTY6IERlYm91bmNlIG1ldHJpY3Mg4oCUIHRyYWNrcyBzYXZlcyBjb2FsZXNjZWQgdnMgYWN0dWFsbHkgd3JpdHRlbi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZU1ldHJpY3MgPSB7IGNvYWxlc2NlZDogMCwgd3JpdHRlbjogMCB9O1xuICAvKipcbiAgICogSXNzdWUgIzIzMjk6IE1lbW9yaWVzIHdob3NlIG1vc3QgcmVjZW50IHNhdmUgYXR0ZW1wdCBmYWlsZWQuXG4gICAqIEtleTogbm9ybWFsaXplZCBtZW1vcnkgbmFtZSAobWVtb3J5U2F2ZUtleSkuIEhvbGRzIHRoZSBmYWlsaW5nIE1lbW9yeVxuICAgKiBpbnN0YW5jZSBhbmQgaXRzIG1hbmFnZXIg4oCUIHRoZSB1bnBlcnNpc3RlZCBlbnRyaWVzIGV4aXN0IG9ubHkgaW4gdGhhdFxuICAgKiBpbnN0YW5jZSwgc28gcmVjb3ZlcnkgbXVzdCByZXRyeSBpdCAoYSBmcmVzaGx5IGxvYWRlZCBpbnN0YW5jZSB3b3VsZCBsYWNrXG4gICAqIHRoZW0pLCBhbmQgaG9sZGluZyB0aGUgcmVmZXJlbmNlIGtlZXBzIGl0IGFsaXZlIGFjcm9zcyBjYWNoZSBldmljdGlvbi5cbiAgICogVGhlIG5leHQgYWRkRW50cnkgcmV0cmllcyB0aGUgc2F2ZSBzeW5jaHJvbm91c2x5IGFuZCByZXBvcnRzIHRoZSBlcnJvciB0b1xuICAgKiB0aGUgY2FsbGVyIGluc3RlYWQgb2Ygc2lsZW50bHkgYWNjZXB0aW5nIG1vcmUgZW50cmllczsgZGlzcG9zZSgpIGZsdXNoZXNcbiAgICogdGhlc2UgYXMgYSBsYXN0IHJlc29ydC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFpbGVkTWVtb3J5U2F2ZXMgPSBuZXcgTWFwPHN0cmluZywge1xuICAgIGVycm9yOiBFcnJvcjtcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5O1xuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIH0+KCk7XG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOTogbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHNhdmUtYXR0ZW1wdCBjb3VudGVyIHBlciBtZW1vcnkga2V5LlxuICAgKiBHdWFyZHMgdGhlIGZhaWx1cmUgbGVkZ2VyIGFnYWluc3QgcmVvcmRlcmluZzogYW4gb2xkZXIgaW4tZmxpZ2h0IHNhdmUgdGhhdFxuICAgKiByZXNvbHZlcyBhZnRlciBhIG5ld2VyIG9uZSBzdGFydGVkIG11c3Qgbm90IG92ZXJ3cml0ZSB0aGUgbmV3ZXIgYXR0ZW1wdCdzXG4gICAqIG91dGNvbWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeVNhdmVBdHRlbXB0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU3OiBQZXItbWVtb3J5IHNhdmUgZnJlcXVlbmN5IHRyYWNrZXIuXG4gICAqIFNsaWRpbmcgd2luZG93IGNvdW50ZXI6IHRyYWNrcyBhZGRFbnRyeSBjYWxscyBwZXIgbWVtb3J5IHdpdGhpbiB0aGUgbW9uaXRvciB3aW5kb3cuXG4gICAqIExvZ3Mgd2FybmluZ3MgYXQgY29uZmlndXJhYmxlIHRocmVzaG9sZHMgdG8gY2F0Y2ggcnVuYXdheSBsb29wcyBlYXJseS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgdGltZXN0YW1wczogbnVtYmVyW107IHdhcm5lZDogYm9vbGVhbjsgY3JpdGljYWw6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIElzc3VlICM2MjUgUGhhc2UgNDogUmF0ZSBsaW1pdGVyIGZvciBwZXJtaXNzaW9uX3Byb21wdCBldmFsdWF0aW9ucyAoY29uZmlndXJhYmxlIHZpYSBlbnYpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvblByb21wdExpbWl0ZXIgPSBSYXRlTGltaXRlckZhY3RvcnkuY3JlYXRlUGVybWlzc2lvblByb21wdExpbWl0ZXIoXG4gICAgZW52LkRPTExIT1VTRV9QRVJNSVNTSU9OX1BST01QVF9SQVRFX0xJTUlULCBlbnYuRE9MTEhPVVNFX1BFUk1JU1NJT05fUkFURV9XSU5ET1dfTVNcbiAgKTtcbiAgLyoqIElzc3VlICM2MjUgUGhhc2UgNDogUmF0ZSBsaW1pdGVyIGZvciBDTEkgYXBwcm92YWwgcmVjb3JkIGNyZWF0aW9uIChjb25maWd1cmFibGUgdmlhIGVudikgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjbGlBcHByb3ZhbExpbWl0ZXIgPSBSYXRlTGltaXRlckZhY3RvcnkuY3JlYXRlQ2xpQXBwcm92YWxMaW1pdGVyKFxuICAgIGVudi5ET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1JBVEVfTElNSVQsIGVudi5ET0xMSE9VU0VfUEVSTUlTU0lPTl9SQVRFX1dJTkRPV19NU1xuICApO1xuICAvKipcbiAgICogQnVpbGQgYSBzdGFuZGFyZGl6ZWQgcmF0ZS1saW1pdCBkZW55IHJlc3BvbnNlIGZvciBwZXJtaXNzaW9uX3Byb21wdC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSYXRlTGltaXREZW55KFxuICAgIGxpbWl0ZXJOYW1lOiBzdHJpbmcsXG4gICAgdG9vbE5hbWU6IHN0cmluZyxcbiAgICBzdGF0dXM6IGltcG9ydCgnLi4vLi4vdXRpbHMvUmF0ZUxpbWl0ZXIuanMnKS5SYXRlTGltaXRTdGF0dXMsXG4gICAgcmlza0xldmVsID0gJ2Jsb2NrZWQnLFxuICAgIHJlYXNvbiA9ICdSYXRlIGxpbWl0IGV4Y2VlZGVkJyxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgIGRldGFpbHM6IGAke2xpbWl0ZXJOYW1lfSByYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke3Rvb2xOYW1lfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgbGltaXRlcjogbGltaXRlck5hbWUsXG4gICAgICAgIHJldHJ5QWZ0ZXJNczogc3RhdHVzLnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgcmVtYWluaW5nVG9rZW5zOiBzdGF0dXMucmVtYWluaW5nVG9rZW5zLFxuICAgICAgICByZXNldFRpbWU6IHN0YXR1cy5yZXNldFRpbWUudG9JU09TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICBtZXNzYWdlOiBgUmF0ZSBsaW1pdCBleGNlZWRlZCBmb3IgJHtsaW1pdGVyTmFtZX0uIFJldHJ5IGFmdGVyICR7c3RhdHVzLnJldHJ5QWZ0ZXJNc31tcy5gLFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgcmlza0xldmVsLCByZWFzb24sIHN0YWdlOiAncmF0ZV9saW1pdCcgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIElzc3VlICMxNDI6IFJhdGUgbGltaXRlciBmb3IgdmVyaWZ5X2NoYWxsZW5nZSBhdHRlbXB0cyAobWF4IDEwIGZhaWx1cmVzIHBlciA2MHMgd2luZG93KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmaWNhdGlvblJhdGVMaW1pdGVyID0gbmV3IFZlcmlmaWNhdGlvblJhdGVMaW1pdGVyKCk7XG4gIC8qKiBJc3N1ZSAjMTQyOiBNZXRyaWNzIHRyYWNrZXIgZm9yIHZlcmlmaWNhdGlvbiBvcGVyYXRpb25zICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyaWZpY2F0aW9uTWV0cmljcyA9IG5ldyBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlcigpO1xuICAvKipcbiAgICogVHJhY2tzIGFnZW50cyBjdXJyZW50bHkgaW4gYW4gZXhlY3V0aW9uIGxvb3AgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50LlxuICAgKlxuICAgKiAqKkxpZmVjeWNsZToqKiBFbnRyaWVzIGFyZSBhZGRlZCBpbiBgZGlzcGF0Y2hFeGVjdXRlKClgIG9uIGBleGVjdXRlX2FnZW50YCBhbmRcbiAgICogcmVtb3ZlZCBvbiBgY29tcGxldGVfZXhlY3V0aW9uYC4gT25seSBhZ2VudHMgd2l0aCBhIGdhdGVrZWVwZXIgcG9saWN5IChleHBsaWNpdFxuICAgKiBvciBzeW50aGVzaXplZCBmcm9tIGB0b29sc2AgY29uZmlnKSBhcmUgdHJhY2tlZC5cbiAgICpcbiAgICogKipQb2xpY3kgcmVzb2x1dGlvbjoqKiBFbnRyaWVzIGFyZSBpbmNsdWRlZCBpbiBgZ2V0QWN0aXZlRWxlbWVudHMoKWAgc28gdGhlXG4gICAqIEdhdGVrZWVwZXIgZXZhbHVhdGVzIGFnZW50IHBvbGljaWVzIGFsb25nc2lkZSBwZXJzb25hL3NraWxsL2Vuc2VtYmxlIHBvbGljaWVzLlxuICAgKiBUaGUgc3RhbmRhcmQgcHJpb3JpdHkgYXBwbGllczogZGVueSA+IHNjb3BlX3Jlc3RyaWN0aW9uID4gY29uZmlybSA+IGFsbG93LlxuICAgKlxuICAgKiAqKk1lbW9yeSBzYWZldHk6KiogVGhlIE1hcCBpcyBib3VuZGVkIGJ5IGNvbmN1cnJlbnRseSBleGVjdXRpbmcgYWdlbnRzLiBJZiBhXG4gICAqIHNlc3Npb24gZW5kcyB3aXRob3V0IGBjb21wbGV0ZV9leGVjdXRpb25gLCB0aGUgTWFwIGlzIGdhcmJhZ2UgY29sbGVjdGVkIHdpdGhcbiAgICogdGhlIE1DUEFRTEhhbmRsZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIElzc3VlICM0NDlcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW5nQWdlbnRzID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAvKiogQWdlbnQgZWxlbWVudCBuYW1lIGFzIHN1cHBsaWVkIHdoZW4gZXhlY3V0aW9uIGJlZ2FuIChNYXAga2V5IGlzIGNhbm9uaWNhbCkgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIE1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIHJlc29sdmVkIGdhdGVrZWVwZXIgcG9saWN5ICovXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8qKiBUaW1lc3RhbXAgd2hlbiBleGVjdXRpb24gc3RhcnRlZCAoZm9yIGRpYWdub3N0aWNzKSAqL1xuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBudW1iZXIgb2YgYXV0by1jb250aW51YXRpb25zIHBlcmZvcm1lZCAoSXNzdWUgIzUyNikgKi9cbiAgICBjb250aW51YXRpb25Db3VudDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBudW1iZXIgb2YgcmV0cmllcyBmb3IgdGhlIGN1cnJlbnQgc3RlcCAoSXNzdWUgIzUyNikgKi9cbiAgICByZXRyeUNvdW50OiBudW1iZXI7XG4gICAgLyoqIFJlc2lsaWVuY2UgdHJhY2tpbmc6IG9yaWdpbmFsIHBhcmFtZXRlcnMgZnJvbSBleGVjdXRlX2FnZW50IChJc3N1ZSAjNTI2KSAqL1xuICAgIG9yaWdpbmFsUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiByZXNvbHZlZCBwb2xpY3kgZnJvbSBhZ2VudCBtZXRhZGF0YSAoSXNzdWUgIzUyNikgKi9cbiAgICByZXNpbGllbmNlUG9saWN5PzogQWdlbnRSZXNpbGllbmNlUG9saWN5O1xuICAgIC8qKiBSZWNlbnQgZ2F0ZWtlZXBlciBibG9ja3MgZHVyaW5nIHRoaXMgYWdlbnQncyBleGVjdXRpb24gKEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW0pICovXG4gICAgcmVjZW50QmxvY2tzOiBBcnJheTx7XG4gICAgICBvcGVyYXRpb246IHN0cmluZztcbiAgICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nO1xuICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAvKiogUGVybWlzc2lvbiBsZXZlbCB0aGF0IGNhdXNlZCB0aGUgYmxvY2sgKERFTlksIENPTkZJUk1fU0VTU0lPTiwgQ09ORklSTV9TSU5HTEVfVVNFKSAqL1xuICAgICAgbGV2ZWw6IHN0cmluZztcbiAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgLyoqIFdoZXRoZXIgdGhpcyBibG9jayBoYXMgYmVlbiByZXBvcnRlZCBpbiBhIG5vdGlmaWNhdGlvbiAqL1xuICAgICAgcmVwb3J0ZWQ6IGJvb2xlYW47XG4gICAgfT47XG4gIH0+KCk7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBhYm9ydGVkIGdvYWxJZHMuIE9uY2UgYSBnb2FsSWQgaXMgYWJvcnRlZCwgYWxsIGZ1cnRoZXIgZXhlY3V0aW9uXG4gICAqIG9wZXJhdGlvbnMgKHJlY29yZF9leGVjdXRpb25fc3RlcCwgY29tcGxldGVfZXhlY3V0aW9uLCBjb250aW51ZV9leGVjdXRpb24pXG4gICAqIGZvciB0aGF0IGdvYWxJZCBhcmUgcmVqZWN0ZWQgYXQgdGhlIGRpc3BhdGNoIGxheWVyLlxuICAgKlxuICAgKiBJc3N1ZSAjMjQ5OiBBYm9ydC9jYW5jZWxsYXRpb24gaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0ZWRHb2FscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRUcmFja2VyPzogQ29ycmVsYXRpb25JZFByb3ZpZGVyLFxuICApIHtcbiAgICAvLyBJbml0aWFsaXplIG5vcm1hbGl6ZXJzIGZvciBzY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpXG4gICAgaW5pdGlhbGl6ZU5vcm1hbGl6ZXJzKCk7XG4gICAgLy8gSXNzdWUgIzQ1MjogU3RvcmUgR2F0ZWtlZXBlciBpbnN0YW5jZSBmb3IgcG9saWN5IGVuZm9yY2VtZW50XG4gICAgaWYgKCFoYW5kbGVycy5nYXRla2VlcGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dhdGVrZWVwZXIgaW5zdGFuY2UgaXMgcmVxdWlyZWQgaW4gSGFuZGxlclJlZ2lzdHJ5LiBQcm92aWRlIG9uZSB2aWEgdGhlIERJIGNvbnRhaW5lci4nKTtcbiAgICB9XG4gICAgdGhpcy5nYXRla2VlcGVyID0gaGFuZGxlcnMuZ2F0ZWtlZXBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmVyaWZpY2F0aW9uIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcvZGlhZ25vc3RpY3MuXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBEYW5nZXJab25lRW5mb3JjZXIuZ2V0TWV0cmljcygpLlxuICAgKi9cbiAgZ2V0VmVyaWZpY2F0aW9uTWV0cmljcygpOiBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgICByZXR1cm4gdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLmdldE1ldHJpY3ModGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1dG9ub215IGV2YWx1YXRpb24gbWV0cmljcyBmb3IgbW9uaXRvcmluZy9kaWFnbm9zdGljcy5cbiAgICogSXNzdWUgIzM5MTogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIGdldFZlcmlmaWNhdGlvbk1ldHJpY3MoKS5cbiAgICovXG4gIGdldEF1dG9ub215TWV0cmljcygpOiBBdXRvbm9teU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgcmV0dXJuIGdldEF1dG9ub215TWV0cmljcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdhdGhlciBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzIGZvciBHYXRla2VlcGVyIHBvbGljeSBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBRdWVyaWVzIFBlcnNvbmFNYW5hZ2VyLCBTa2lsbE1hbmFnZXIsIGFuZCBFbnNlbWJsZU1hbmFnZXIgZm9yIGFjdGl2ZSBlbGVtZW50cyxcbiAgICogdGhlbiBhcHBlbmRzIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cyB3aXRoIGdhdGVrZWVwZXIgcG9saWNpZXMuIEFsbFxuICAgKiBlbGVtZW50cyBhcmUgbWFwcGVkIHRvIHRoZSB7QGxpbmsgQWN0aXZlRWxlbWVudH0gaW50ZXJmYWNlIGV4cGVjdGVkIGJ5XG4gICAqIGBHYXRla2VlcGVyLmVuZm9yY2UoKWAuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGVsZW1lbnQgY29udGV4dCBmb3IgTGF5ZXIgMiAoZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbikuXG4gICAqIElzc3VlICM0NDk6IEluY2x1ZGVzIGV4ZWN1dGluZyBhZ2VudHMgYWxvbmdzaWRlIHBlcnNvbmFzL3NraWxscy9lbnNlbWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGFjdGl2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIGdhdGVrZWVwZXIgcG9saWNpZXMsIG9yIGVtcHR5XG4gICAqICAgICAgICAgIGFycmF5IGlmIGdhdGhlcmluZyBmYWlscyAoZmFpbC1vcGVuOiBvbmx5IHJvdXRlIHBvbGljaWVzIGFwcGx5KS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHMoc2Vzc2lvbklkPzogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVFbGVtZW50W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3RWxlbWVudHMgPSBzZXNzaW9uSWRcbiAgICAgICAgPyBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldFBvbGljeUVsZW1lbnRzRm9yUmVwb3J0KHNlc3Npb25JZClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdID0gcmF3RWxlbWVudHMubWFwKChlbCkgPT4gKHtcbiAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAoZWwubWV0YWRhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZ2F0ZWtlZXBlcjogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXIgYXMgQWN0aXZlRWxlbWVudFsnbWV0YWRhdGEnXVsnZ2F0ZWtlZXBlciddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi50aGlzLmNvcHlHYXRla2VlcGVyRGlhZ25vc3RpY3MoZWwubWV0YWRhdGEpLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBJc3N1ZSAjNDQ5OiBJbmNsdWRlIGV4ZWN1dGluZyBhZ2VudHMgd2l0aCBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFssIGFnZW50RW50cnldIG9mIHRoaXMuZXhlY3V0aW5nQWdlbnRzKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWdlbnQnLFxuICAgICAgICAgICAgbmFtZTogYWdlbnRFbnRyeS5uYW1lLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnRFbnRyeS5uYW1lLFxuICAgICAgICAgICAgICBnYXRla2VlcGVyOiBhZ2VudEVudHJ5Lm1ldGFkYXRhLmdhdGVrZWVwZXIgYXMgQWN0aXZlRWxlbWVudFsnbWV0YWRhdGEnXVsnZ2F0ZWtlZXBlciddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWN0aXZlRWxlbWVudHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgb3BlbiDigJQgaWYgd2UgY2FuJ3QgZ2F0aGVyIGFjdGl2ZSBlbGVtZW50cywgZW5mb3JjZSB3aXRob3V0IHRoZW1cbiAgICAgIC8vIFRoaXMgbWVhbnMgb25seSByb3V0ZSB2YWxpZGF0aW9uIGFuZCBkZWZhdWx0IHBvbGljaWVzIHdpbGwgYXBwbHlcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBlbGVtZW50cyBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IsIHNlc3Npb25JZCB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFBvbGljeVJlcG9ydEVsZW1lbnRzKHNlc3Npb25JZD86IHN0cmluZyk6IFByb21pc2U8QWN0aXZlRWxlbWVudFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQpO1xuICAgICAgcmV0dXJuIHJhd0VsZW1lbnRzLm1hcCgoZWwpID0+ICh7XG4gICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogKGVsLm1ldGFkYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGdhdGVrZWVwZXI6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIEFjdGl2ZUVsZW1lbnRbJ21ldGFkYXRhJ11bJ2dhdGVrZWVwZXInXSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgLi4udGhpcy5jb3B5R2F0ZWtlZXBlckRpYWdub3N0aWNzKGVsLm1ldGFkYXRhKSxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheSgoZWwgYXMgeyBzZXNzaW9uSWRzPzogc3RyaW5nW10gfSkuc2Vzc2lvbklkcylcbiAgICAgICAgICAgID8geyBzZXNzaW9uSWRzOiAoZWwgYXMgeyBzZXNzaW9uSWRzPzogc3RyaW5nW10gfSkuc2Vzc2lvbklkcyB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgcG9saWN5IGVsZW1lbnRzIGZvciBkYXNoYm9hcmQgcmVwb3J0aW5nJywgeyBlcnJvciwgc2Vzc2lvbklkIH0pO1xuICAgICAgcmV0dXJuIHNlc3Npb25JZCA/IFtdIDogdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29weUdhdGVrZWVwZXJEaWFnbm9zdGljcyhtZXRhZGF0YTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IGdldEdhdGVrZWVwZXJEaWFnbm9zdGljcyhtZXRhZGF0YSk7XG4gICAgcmV0dXJuIGRpYWdub3N0aWNzID8geyBnYXRla2VlcGVyRGlhZ25vc3RpY3M6IGRpYWdub3N0aWNzIH0gOiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgQ1JFQVRFIG9wZXJhdGlvbnMgKGFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUpXG4gICAqXG4gICAqIENSRUFURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGNyZWF0ZV9lbGVtZW50OiBDcmVhdGUgbmV3IGVsZW1lbnRzXG4gICAqIC0gaW1wb3J0X2VsZW1lbnQ6IEltcG9ydCBlbGVtZW50cyBmcm9tIGV4cG9ydGVkIGRhdGFcbiAgICogLSBhZGRFbnRyeTogQWRkIGVudHJpZXMgdG8gbWVtb3J5IGVsZW1lbnRzXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ0NSRUFURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnQ1JFQVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIFJFQUQgb3BlcmF0aW9ucyAocmVhZC1vbmx5LCBzYWZlKVxuICAgKlxuICAgKiBSRUFEIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gbGlzdF9lbGVtZW50czogTGlzdCBlbGVtZW50cyB3aXRoIGZpbHRlcmluZ1xuICAgKiAtIGdldF9lbGVtZW50OiBHZXQgZWxlbWVudCBieSBuYW1lXG4gICAqIC0gZ2V0X2VsZW1lbnRfZGV0YWlsczogR2V0IGRldGFpbGVkIGVsZW1lbnQgaW5mb3JtYXRpb25cbiAgICogLSBzZWFyY2hfZWxlbWVudHM6IEZ1bGwtdGV4dCBzZWFyY2hcbiAgICogLSBxdWVyeV9lbGVtZW50czogUXVlcnkgd2l0aCBwYWdpbmF0aW9uXG4gICAqIC0gZ2V0X2FjdGl2ZV9lbGVtZW50czogR2V0IGFjdGl2ZSBlbGVtZW50c1xuICAgKiAtIHZhbGlkYXRlX2VsZW1lbnQ6IFZhbGlkYXRlIGVsZW1lbnRcbiAgICogLSByZW5kZXI6IFJlbmRlciB0ZW1wbGF0ZVxuICAgKiAtIGV4cG9ydF9lbGVtZW50OiBFeHBvcnQgZWxlbWVudFxuICAgKiAtIGFjdGl2YXRlX2VsZW1lbnQ6IEFjdGl2YXRlIGVsZW1lbnRzIGZvciB1c2VcbiAgICogLSBkZWFjdGl2YXRlX2VsZW1lbnQ6IERlYWN0aXZhdGUgZWxlbWVudFxuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZVJlYWQoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnUkVBRCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnUkVBRCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVUERBVEUgb3BlcmF0aW9ucyAobW9kaWZ5aW5nIGV4aXN0aW5nIHN0YXRlKVxuICAgKlxuICAgKiBVUERBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBlZGl0X2VsZW1lbnQ6IE1vZGlmeSBleGlzdGluZyBlbGVtZW50c1xuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZVVwZGF0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdVUERBVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ1VQREFURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBERUxFVEUgb3BlcmF0aW9ucyAoZGVzdHJ1Y3RpdmUgYWN0aW9ucylcbiAgICpcbiAgICogREVMRVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gZGVsZXRlX2VsZW1lbnQ6IERlbGV0ZSBlbGVtZW50c1xuICAgKiAtIGNsZWFyOiBDbGVhciBtZW1vcnkgZW50cmllc1xuICAgKiAtIGNsZWFyX2dpdGh1Yl9hdXRoOiBSZW1vdmUgR2l0SHViIGF1dGhlbnRpY2F0aW9uXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlRGVsZXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ0RFTEVURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnREVMRVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEVYRUNVVEUgb3BlcmF0aW9ucyAocnVudGltZSBleGVjdXRpb24gbGlmZWN5Y2xlKVxuICAgKlxuICAgKiBFWEVDVVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gZXhlY3V0ZV9hZ2VudDogU3RhcnQgZXhlY3V0aW9uIG9mIGFuIGFnZW50IG9yIGV4ZWN1dGFibGUgZWxlbWVudFxuICAgKiAtIGdldF9leGVjdXRpb25fc3RhdGU6IFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAqIC0gcmVjb3JkX2V4ZWN1dGlvbl9zdGVwOiBSZWNvcmQgZXhlY3V0aW9uIHByb2dyZXNzIG9yIGZpbmRpbmdzXG4gICAqIC0gY29tcGxldGVfZXhlY3V0aW9uOiBTaWduYWwgZXhlY3V0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseVxuICAgKiAtIGNvbnRpbnVlX2V4ZWN1dGlvbjogUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIHNhdmVkIHN0YXRlXG4gICAqIC0gYWJvcnRfZXhlY3V0aW9uOiBDYW5jZWwgYW4gb25nb2luZyBleGVjdXRpb25cbiAgICpcbiAgICogVW5saWtlIENSVUQgb3BlcmF0aW9ucyAod2hpY2ggYXJlIGlkZW1wb3RlbnQpLCBFWEVDVVRFIG9wZXJhdGlvbnMgbWFuYWdlXG4gICAqIHJ1bnRpbWUgc3RhdGUgYW5kIGFyZSBpbmhlcmVudGx5IG5vbi1pZGVtcG90ZW50LiBDYWxsaW5nIGV4ZWN1dGUgdHdpY2VcbiAgICogY3JlYXRlcyB0d28gc2VwYXJhdGUgZXhlY3V0aW9ucy5cbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVFeGVjdXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ0VYRUNVVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ0VYRUNVVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIGV4ZWN1dGlvbiBsb2dpYyBzaGFyZWQgYnkgYWxsIENSVUQgZW5kcG9pbnRzLlxuICAgKiBJbXBsZW1lbnRzIHRoZSB0aGluIHJlc29sdmVyIHBhdHRlcm46IHZhbGlkYXRlIOKGkiByb3V0ZSDihpIgZGlzcGF0Y2gg4oaSIHJldHVybi5cbiAgICpcbiAgICogT1BFUkFUSU9OIEZMT1c6XG4gICAqIDEuIFZhbGlkYXRlIGlucHV0IHN0cnVjdHVyZVxuICAgKiAyLiBWYWxpZGF0ZSBwZXJtaXNzaW9ucyAoUGVybWlzc2lvbkd1YXJkKVxuICAgKiAzLiBSb3V0ZSBvcGVyYXRpb24gKE9wZXJhdGlvblJvdXRlcilcbiAgICogNC4gRGlzcGF0Y2ggdG8gaGFuZGxlclxuICAgKiA1LiBSZXR1cm4gc3RhbmRhcmRpemVkIHJlc3VsdFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBSYXcgaW5wdXQgdG8gdmFsaWRhdGUgYW5kIHByb2Nlc3NcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQ1JVRCBlbmRwb2ludCBiZWluZyBjYWxsZWRcbiAgICogQHJldHVybnMgU3RhbmRhcmRpemVkIE9wZXJhdGlvblJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlT3BlcmF0aW9uKFxuICAgIGlucHV0OiB1bmtub3duLFxuICAgIGVuZHBvaW50OiBDUlVERW5kcG9pbnRcbiAgKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICAvLyBJc3N1ZSAjMzAxOiBDYXB0dXJlIHN0YXJ0IHRpbWUgZm9yIHJlc3BvbnNlIHRpbWluZyBtZXRhZGF0YVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgLy8gU3RlcCAxOiBQYXJzZSBhbmQgbm9ybWFsaXplIGlucHV0IChoYW5kbGVzIGJvdGggcHJvcGVyIGFuZCBsZWdhY3kgZm9ybWF0cylcbiAgICAvLyBJc3N1ZSAjMjA1OiBTaWxlbnQgSlNPTiBmYWxsYmFjayBmb3IgZWRnZSBjYXNlc1xuICAgIGNvbnN0IHBhcnNlZElucHV0ID0gcGFyc2VPcGVyYXRpb25JbnB1dChpbnB1dCk7XG5cbiAgICAvLyBFeHRyYWN0IG9wZXJhdGlvbiBuYW1lIGZvciBsb2dnaW5nXG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IHBhcnNlZElucHV0Py5vcGVyYXRpb24gPz8gJ3Vua25vd24nO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIHBhcnNpbmcgc3VjY2VlZGVkXG4gICAgICBpZiAoIXBhcnNlZElucHV0KSB7XG4gICAgICAgIC8vIFByb3ZpZGUgc3BlY2lmaWMgZGlhZ25vc3RpY3MgZGVwZW5kaW5nIG9uIHdoYXQgd2VudCB3cm9uZ1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljID0gZGVzY3JpYmVJbnZhbGlkSW5wdXQoaW5wdXQpO1xuICAgICAgICBjb25zdCBoYXNPcGVyYXRpb24gPSBpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiAoaW5wdXQgYXMgYW55KS5vcGVyYXRpb24gPT09ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCBoaW50ID0gaGFzT3BlcmF0aW9uXG4gICAgICAgICAgPyAnVGhlIGlucHV0IHN0cnVjdHVyZSBsb29rcyBjb3JyZWN0IGJ1dCB2YWxpZGF0aW9uIGZhaWxlZC4gSWYgY29udGVudCBjb250YWlucyBtYXJrZG93biBvciBzcGVjaWFsIGNoYXJhY3RlcnMsIGVuc3VyZSB0aGUgSlNPTiBpcyBwcm9wZXJseSBlc2NhcGVkLidcbiAgICAgICAgICA6ICdVc2UgZm9ybWF0OiB7IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIHBhcmFtczogeyB0eXBlOiBcInBlcnNvbmFzXCIgfSB9JztcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShcbiAgICAgICAgICBgSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgT3BlcmF0aW9uSW5wdXQgd2l0aCBcIm9wZXJhdGlvblwiIGFuZCBvcHRpb25hbCBcInBhcmFtc1wiLiAke2RpYWdub3N0aWN9LiAke2hpbnR9YCxcbiAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IHBhcnNlZElucHV0O1xuXG4gICAgICAvLyBTdGVwIDI6IEVuZm9yY2UgR2F0ZWtlZXBlciBwb2xpY3kgKElzc3VlICM0NTIpXG4gICAgICBpZiAoZW52LkRPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQpIHtcbiAgICAgICAgLy8gRnVsbCA0LWxheWVyIGNoZWNrOiByb3V0ZSB2YWxpZGF0aW9uIOKGkiBlbGVtZW50IHBvbGljaWVzIOKGkiBzZXNzaW9uIGNvbmZpcm1hdGlvbnMg4oaSIGRlZmF1bHRzXG4gICAgICAgIC8vIElzc3VlICM3NTg6IEdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyAoY29uZmlybV9vcGVyYXRpb24sIHZlcmlmeV9jaGFsbGVuZ2UsIGV0Yy4pXG4gICAgICAgIC8vIHNraXAgZWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvbiBpbiB0aGUgcHJpbWFyeSBlbmZvcmNlbWVudCBwYXRoIHRvIHByZXZlbnQgY2FzY2FkaW5nXG4gICAgICAgIC8vIGNvbmZpcm1hdGlvbiBsb29wcy4gRWxlbWVudCBwb2xpY2llcyBmb3IgdGhlIFRBUkdFVCBvcGVyYXRpb24gYXJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5XG4gICAgICAgIC8vIGluc2lkZSB0aGUgY29uZmlybSBoYW5kbGVyLCBhbmQgZGVueTogWydjb25maXJtX29wZXJhdGlvbiddIGlzIGVuZm9yY2VkIGFzIGEgc2FuZGJveC5cbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gdGhpcy5nYXRla2VlcGVyLmVuZm9yY2Uoe1xuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBza2lwRWxlbWVudFBvbGljaWVzOiBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbihvcGVyYXRpb24pLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZWNvcmQgR2F0ZWtlZXBlciBkZWNpc2lvbiBmb3IgbWV0cmljc1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcj8ucmVjb3JkKHtcbiAgICAgICAgICBhbGxvd2VkOiBkZWNpc2lvbi5hbGxvd2VkLFxuICAgICAgICAgIHBlcm1pc3Npb25MZXZlbDogZGVjaXNpb24ucGVybWlzc2lvbkxldmVsLFxuICAgICAgICAgIHBvbGljeVNvdXJjZTogZGVjaXNpb24ucG9saWN5U291cmNlLFxuICAgICAgICAgIGNvbmZpcm1hdGlvblBlbmRpbmc6IGRlY2lzaW9uLmNvbmZpcm1hdGlvblBlbmRpbmcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZGVjaXNpb24uYWxsb3dlZCkge1xuICAgICAgICAgIGlmIChkZWNpc2lvbi5jb25maXJtYXRpb25QZW5kaW5nKSB7XG4gICAgICAgICAgICAvLyBJc3N1ZSAjMTY1MzogQXV0by1jb25maXJtIHdoZW4gdGhlIGhvc3QgKENsYXVkZSBDb2RlLCBldGMuKSBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgLy8gYXBwcm92ZWQgdGhpcyBNQ1AgdG9vbCBjYWxsLiBUaGUgaG9zdCdzIHRvb2wtbGV2ZWwgYXBwcm92YWwgaXMgdGhlIHByaW1hcnlcbiAgICAgICAgICAgIC8vIGh1bWFuIGdhdGU7IHRoZSBnYXRla2VlcGVyJ3MgY29uZmlybV9vcGVyYXRpb24gcm91bmQtdHJpcCBpcyByZWR1bmRhbnQgd2hlblxuICAgICAgICAgICAgLy8gdGhlIGhvc3QgZ2F0ZXMgZXZlcnkgY2FsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTYWZldHkgbGF5ZXJzIHRoYXQgcmVtYWluIGFjdGl2ZSAocHJvdmVuIGJ5IHBlcm1pc3Npb24tZmxvdy1oYXJuZXNzIHRlc3RzKTpcbiAgICAgICAgICAgIC8vIC0gRWxlbWVudCBkZW55IHBvbGljaWVzIChoYXJkIGRlbnksIG5vIGNvbmZpcm1hdGlvblBlbmRpbmcgZmxhZylcbiAgICAgICAgICAgIC8vIC0gY2FuQmVFbGV2YXRlZDogZmFsc2UgY29uc3RyYWludHNcbiAgICAgICAgICAgIC8vIC0gU2FmZXR5IHRpZXIgZXZhbHVhdGlvbiAocnVucyBiZWZvcmUgY29uZmlybWF0aW9uIGNoZWNrKVxuICAgICAgICAgICAgLy8gLSBEYW5nZXJab25lIHZlcmlmaWNhdGlvbiAoc2VwYXJhdGUgZmxvdylcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgY29uZmlybWF0aW9uIGlzIHJlY29yZGVkIGluIHRoZSBzZXNzaW9uIHNvIHN1YnNlcXVlbnQgZW5mb3JjZSgpIGNhbGxzXG4gICAgICAgICAgICAvLyBmb3IgdGhlIHNhbWUgb3BlcmF0aW9uIHBhc3Mgd2l0aG91dCByZS1jb25maXJtaW5nLlxuICAgICAgICAgICAgY29uc3QgY29uZmlybUxldmVsID0gZGVjaXNpb24ucGVybWlzc2lvbkxldmVsIGFzXG4gICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT04gfCBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFO1xuXG4gICAgICAgICAgICAvLyBSaXNrIHNjb3JpbmcgZm9yIGRlc3RydWN0aXZlL2hpZ2gtaW1wYWN0IG9wZXJhdGlvbnMuXG4gICAgICAgICAgICAvLyBBc3NpZ25zIGEgcmlzayBzY29yZSAoMC0xMDApIGJhc2VkIG9uIG9wZXJhdGlvbiBjaGFyYWN0ZXJpc3RpY3MuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBNQ1AtQVFMIGVxdWl2YWxlbnQgb2YgYXNzZXNzUmlzaygpIGZvciBDTEkgdG9vbHMuXG4gICAgICAgICAgICBjb25zdCByaXNrU2NvcmUgPSB0aGlzLnNjb3JlT3BlcmF0aW9uUmlzayhvcGVyYXRpb24sIGVuZHBvaW50LCBwYXJhbXMpO1xuXG4gICAgICAgICAgICB0aGlzLmdhdGVrZWVwZXIucmVjb3JkQ29uZmlybWF0aW9uKG9wZXJhdGlvbiwgY29uZmlybUxldmVsLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuZCBsb2cgYSBkZXRhaWxlZCBzdW1tYXJ5IGZvciBzZXNzaW9uIHJldmlldy5cbiAgICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIG5vIGh1bWFuIGlzIHByb21wdGVkLCB0aGlzIGFwcGVhcnMgaW4gcXVlcnlfbG9nc1xuICAgICAgICAgICAgLy8gc28gb3BlcmF0b3JzIGNhbiB0cmFjZSB3aGF0IHdhcyBhdXRvLWNvbmZpcm1lZCBhbmQgd2h5LlxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuYnVpbGRPcGVyYXRpb25TdW1tYXJ5KG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICBjb25zdCBzY29wZSA9IGVsZW1lbnRUeXBlID8gJyBbJy5jb25jYXQoZWxlbWVudFR5cGUsICddJykgOiAnJztcbiAgICAgICAgICAgIGxldCByaXNrTGFiZWwgPSAnTE9XJztcbiAgICAgICAgICAgIGlmIChyaXNrU2NvcmUgPj0gODApIHJpc2tMYWJlbCA9ICdISUdIJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHJpc2tTY29yZSA+PSA0MCkgcmlza0xhYmVsID0gJ01PREVSQVRFJztcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gWydbR2F0ZWtlZXBlcl0gQXV0by1jb25maXJtZWQgKCcsIHJpc2tMYWJlbCwgJyByaXNrPScsIFN0cmluZyhyaXNrU2NvcmUpLFxuICAgICAgICAgICAgICAnKTogJywgc3VtbWFyeSwgc2NvcGUsICcuIFJlYXNvbjogJywgZGVjaXNpb24ucmVhc29uXTtcbiAgICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBwYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICAgICAgLy8gQ09ORklSTV9TSU5HTEVfVVNFIG9wZXJhdGlvbnMgKGRlbGV0ZSwgZXhlY3V0ZV9hZ2VudCwgZWRpdCwgYWJvcnQpXG4gICAgICAgICAgICAvLyBhcmUgaGlnaGVyLXJpc2sg4oCUIGxvZyBhdCB3YXJuIGxldmVsIGZvciB2aXNpYmlsaXR5IGluIGF1ZGl0IHRyYWlscy5cbiAgICAgICAgICAgIGlmIChjb25maXJtTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0UpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obG9nTWVzc2FnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcobG9nTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEhhcmQgZGVueSDigJQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgcG9saWN5LCBubyBjb25maXJtYXRpb24gY2FuIGhlbHBcbiAgICAgICAgICAgIHRoaXMucmVjb3JkR2F0ZWtlZXBlckJsb2NrRm9yQWdlbnRzKG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIGRlY2lzaW9uLnJlYXNvbiA/PyAnT3BlcmF0aW9uIGJsb2NrZWQgYnkgcG9saWN5JywgZGVjaXNpb24ucGVybWlzc2lvbkxldmVsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBkZWNpc2lvbi5zdWdnZXN0aW9uXG4gICAgICAgICAgICAgID8gYCBTdWdnZXN0aW9uOiAke2RlY2lzaW9uLnN1Z2dlc3Rpb259YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbR2F0ZWtlZXBlcl0gJHtkZWNpc2lvbi5yZWFzb259JHtzdWdnZXN0aW9ufWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM2NzM6IFByb3RlY3QgZ2F0ZWtlZXBlciBwb2xpY3kgZmllbGRzIGZyb20gZWxlbWVudC1wb2xpY3kgZWxldmF0aW9uLlxuICAgICAgICAvLyBlZGl0X2VsZW1lbnQgaXMgZWxldmF0YWJsZSBmb3Igbm9ybWFsIGZpZWxkcyAoZGVzY3JpcHRpb24sIHRhZ3MsIGV0Yy4pLCBidXRcbiAgICAgICAgLy8gZWRpdGluZyBnYXRla2VlcGVyIHBvbGljaWVzIGFsd2F5cyByZXF1aXJlcyBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbi5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhbiBlbGVtZW50IGZyb20gYXV0by1hcHByb3ZpbmcgY2hhbmdlcyB0byBzZWN1cml0eSBwb2xpY2llc1xuICAgICAgICAvLyBvbiBvdGhlciBlbGVtZW50cyAodGhlIHByaW1hcnkgcHJpdmlsZWdlIGVzY2FsYXRpb24gdmVjdG9yKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9wZXJhdGlvbiA9PT0gJ2VkaXRfZWxlbWVudCcgJiZcbiAgICAgICAgICBkZWNpc2lvbi5wb2xpY3lTb3VyY2UgPT09ICdlbGVtZW50X3BvbGljeScgJiZcbiAgICAgICAgICBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5BVVRPX0FQUFJPVkUgJiZcbiAgICAgICAgICBwYXJhbXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaW5wdXRPYmogPSAocGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBoYXNHYXRla2VlcGVyRmllbGQgPVxuICAgICAgICAgICAgaW5wdXRPYmo/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlucHV0T2JqPy5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChoYXNHYXRla2VlcGVyRmllbGQpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbTUNQQVFMSGFuZGxlcl0gR2F0ZWtlZXBlciBwb2xpY3kgZWRpdCBibG9ja2VkIGZyb20gZWxlbWVudC1wb2xpY3kgZWxldmF0aW9uIOKAlCByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb25gLCB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIHBvbGljeVNvdXJjZTogZGVjaXNpb24ucG9saWN5U291cmNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKFxuICAgICAgICAgICAgICBgRWRpdGluZyBnYXRla2VlcGVyIHBvbGljaWVzIHJlcXVpcmVzIGV4cGxpY2l0IHVzZXIgY29uZmlybWF0aW9uIGFuZCBjYW5ub3QgYmUgYXV0by1hcHByb3ZlZCBieSBlbGVtZW50IHBvbGljaWVzLiBgICtcbiAgICAgICAgICAgICAgYFVzZSBjb25maXJtX29wZXJhdGlvbiB3aXRoIHBhcmFtcyB7IG9wZXJhdGlvbjogXCJlZGl0X2VsZW1lbnRcIiR7ZWxlbWVudFR5cGUgPyBgLCBlbGVtZW50X3R5cGU6IFwiJHtlbGVtZW50VHlwZX1cImAgOiAnJ30gfSB0byBhcHByb3ZlLCB0aGVuIHJldHJ5LmAsXG4gICAgICAgICAgICAgIHN0YXJ0VGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhdGVrZWVwZXIgZGlzYWJsZWQg4oCUIGZhbGwgYmFjayB0byByb3V0ZSB2YWxpZGF0aW9uIG9ubHlcbiAgICAgICAgR2F0ZWtlZXBlci52YWxpZGF0ZShvcGVyYXRpb24sIGVuZHBvaW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAzOiBSb3V0ZSBvcGVyYXRpb24gdG8gaGFuZGxlciByZWZlcmVuY2VcbiAgICAgIGNvbnN0IHJvdXRlID0gZ2V0Um91dGUob3BlcmF0aW9uKTtcbiAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFmdGVyIFBlcm1pc3Npb25HdWFyZC52YWxpZGF0ZSwgYnV0IGd1YXJkIGRlZmVuc2l2ZWx5XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUoYFVua25vd24gb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gLCBzdGFydFRpbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDQ6IERpc3BhdGNoIHRvIGhhbmRsZXIgKG1lcmdlIGltcGxpY2l0UGFyYW1zIGZyb20gcm91dGUsIHVzZXIgcGFyYW1zIHRha2UgcHJlY2VkZW5jZSlcbiAgICAgIGNvbnN0IG1lcmdlZFBhcmFtcyA9IHJvdXRlLmltcGxpY2l0UGFyYW1zXG4gICAgICAgID8geyAuLi5yb3V0ZS5pbXBsaWNpdFBhcmFtcywgLi4ucGFyYW1zIH1cbiAgICAgICAgOiBwYXJhbXMgPz8ge307XG4gICAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5kaXNwYXRjaChyb3V0ZS5oYW5kbGVyLCB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsZWFudXBEZWxldGVkTWVtb3J5Qm9va2tlZXBpbmcob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgbWVyZ2VkUGFyYW1zKTtcblxuICAgICAgLy8gU3RlcCA1OiBBcHBseSBmaWVsZCBzZWxlY3Rpb24gKElzc3VlICMyMDIpXG4gICAgICAvLyBUcmFuc2Zvcm0gbmFtZSDihpIgZWxlbWVudF9uYW1lIGZvciBMTE0gY29uc2lzdGVuY3lcbiAgICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyBpZiBmaWVsZHMgcGFyYW0gcHJvdmlkZWRcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmFwcGx5RmllbGRTZWxlY3Rpb24ocmF3RGF0YSwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgLy8gU3RlcCA2OiBMb2cgc3VjY2Vzc2Z1bCBvcGVyYXRpb24g4oCUIG9ubHkgbXV0YXRpb25zIGFyZSBzZWN1cml0eS1yZWxldmFudFxuICAgICAgaWYgKGVuZHBvaW50ICE9PSAnUkVBRCcpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdPUEVSQVRJT05fQ09NUExFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgICBkZXRhaWxzOiBlbGVtZW50VHlwZVxuICAgICAgICAgICAgPyBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkIG9uICR7ZWxlbWVudFR5cGV9YFxuICAgICAgICAgICAgOiBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcktleXM6IHBhcmFtcyA/IE9iamVjdC5rZXlzKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgdGhpcy5oYW5kbGVycy5vcGVyYXRpb25NZXRyaWNzVHJhY2tlcj8ucmVjb3JkKG9wZXJhdGlvbk5hbWUsIGVuZHBvaW50LCBkdXJhdGlvbk1zLCB0cnVlKTtcbiAgICAgIGNvbnN0IHR5cGVTdWZmaXggPSBlbGVtZW50VHlwZSA/ICc6JyArIGVsZW1lbnRUeXBlIDogJyc7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1AtQVFMXSAke2VuZHBvaW50fSAke29wZXJhdGlvbn0ke3R5cGVTdWZmaXh9ICgke2R1cmF0aW9uTXMudG9GaXhlZCgxKX1tcylgKTtcbiAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3MoZGF0YSwgc3RhcnRUaW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBhbmQgcmV0dXJuIGFzIE9wZXJhdGlvbkZhaWx1cmVcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBpc1NlY3VyaXR5VmlvbGF0aW9uID0gbWVzc2FnZS5pbmNsdWRlcygnU2VjdXJpdHkgdmlvbGF0aW9uJyk7XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMuaGFuZGxlcnMub3BlcmF0aW9uTWV0cmljc1RyYWNrZXI/LnJlY29yZChvcGVyYXRpb25OYW1lLCBlbmRwb2ludCwgZHVyYXRpb25NcywgZmFsc2UpO1xuXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRzIHdpdGggYXBwcm9wcmlhdGUgc2V2ZXJpdHlcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogaXNTZWN1cml0eVZpb2xhdGlvbiA/ICdVUERBVEVfU0VDVVJJVFlfVklPTEFUSU9OJyA6ICdPUEVSQVRJT05fRkFJTEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6IGlzU2VjdXJpdHlWaW9sYXRpb24gPyAnSElHSCcgOiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgZGV0YWlsczogYCR7ZW5kcG9pbnR9ICcke29wZXJhdGlvbk5hbWV9JyBmYWlsZWQ6ICR7bWVzc2FnZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbmRwb2ludCwgb3BlcmF0aW9uOiBvcGVyYXRpb25OYW1lLCBlcnJvcjogbWVzc2FnZSB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmVycm9yKGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb25OYW1lfScgZmFpbGVkOiAke21lc3NhZ2V9YCwge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25OYW1lLFxuICAgICAgICBlcnJvcjogbWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShtZXNzYWdlLCBzdGFydFRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgYmF0Y2ggb2Ygb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkuXG4gICAqIE9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkIGluIG9yZGVyLCBhbmQgZmFpbHVyZXMgZG8gbm90IHN0b3AgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBFWEVDVVRJT04gU0VNQU5USUNTOlxuICAgKiAtIE9wZXJhdGlvbnMgcnVuIHNlcXVlbnRpYWxseSAoaW4gb3JkZXIpXG4gICAqIC0gRWFjaCBvcGVyYXRpb24gaXMgdmFsaWRhdGVkIGluZGVwZW5kZW50bHlcbiAgICogLSBGYWlsZWQgb3BlcmF0aW9ucyBkb24ndCBzdG9wIHRoZSBiYXRjaFxuICAgKiAtIEFsbCByZXN1bHRzIGFyZSBjb2xsZWN0ZWQgYW5kIHJldHVybmVkXG4gICAqXG4gICAqIEBwYXJhbSBiYXRjaCAtIEJhdGNoUmVxdWVzdCB3aXRoIGFycmF5IG9mIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQ1JVRCBlbmRwb2ludCBiZWluZyBjYWxsZWRcbiAgICogQHJldHVybnMgQmF0Y2hSZXN1bHQgd2l0aCBhbGwgb3BlcmF0aW9uIHJlc3VsdHMgYW5kIHN1bW1hcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUJhdGNoKFxuICAgIGJhdGNoOiBCYXRjaFJlcXVlc3QsXG4gICAgZW5kcG9pbnQ6IENSVURFbmRwb2ludFxuICApOiBQcm9taXNlPEJhdGNoUmVzdWx0PiB7XG4gICAgLy8gSXNzdWUgIzIyMS8jNTQzOiBSZWplY3Qgb3ZlcnNpemVkIGJhdGNoZXMgdG8gcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uXG4gICAgaWYgKGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9CQVRDSF9PUEVSQVRJT05TKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdCQVRDSF9SRUpFQ1RFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9LmJhdGNoYCxcbiAgICAgICAgZGV0YWlsczogYEJhdGNoIG9mICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IG9wcyByZWplY3RlZCDigJQgZXhjZWVkcyBsaW1pdCBvZiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OU31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbmRwb2ludCwgcmVxdWVzdGVkOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCwgbGltaXQ6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OUyB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgIHN1bW1hcnk6IHsgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLCBzdWNjZWVkZWQ6IDAsIGZhaWxlZDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGggfSxcbiAgICAgICAgZXJyb3I6IGBCYXRjaCBzaXplICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OU30gb3BlcmF0aW9uc2AsXG4gICAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShwZXJmb3JtYW5jZS5ub3coKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICMzMDE6IENhcHR1cmUgc3RhcnQgdGltZSBmb3IgYmF0Y2gtbGV2ZWwgdGltaW5nIG1ldGFkYXRhXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgcmVzdWx0czogQmF0Y2hPcGVyYXRpb25SZXN1bHRbXSA9IFtdO1xuICAgIGxldCBzdWNjZWVkZWQgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvcCA9IGJhdGNoLm9wZXJhdGlvbnNbaV07XG5cbiAgICAgIC8vIFBhc3MgcmF3IG9wZXJhdGlvbiB0aHJvdWdoIOKAlCBwYXJzZU9wZXJhdGlvbklucHV0KCkgaW4gZXhlY3V0ZU9wZXJhdGlvbigpXG4gICAgICAvLyBoYW5kbGVzIGFsbCBub3JtYWxpemF0aW9uIChlbGVtZW50X3R5cGUgdnMgZWxlbWVudFR5cGUsIGxlZ2FjeSBmb3JtYXRzLCBldGMuKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9uKG9wLCBlbmRwb2ludCk7XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGluZGV4OiBpLFxuICAgICAgICBvcGVyYXRpb246IG9wLm9wZXJhdGlvbixcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBzdWNjZWVkZWQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWxlZCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvZyBiYXRjaCBjb21wbGV0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0JBVENIX0NPTVBMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX0uYmF0Y2hgLFxuICAgICAgZGV0YWlsczogYEJhdGNoIG9mICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IG9wczogJHtzdWNjZWVkZWR9IHN1Y2NlZWRlZCwgJHtmYWlsZWR9IGZhaWxlZGAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICBzdWNjZWVkZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgICAgb3BlcmF0aW9uczogYmF0Y2gub3BlcmF0aW9ucy5tYXAob3AgPT4gb3Aub3BlcmF0aW9uKSxcbiAgICAgICAgZmFpbHVyZVJhdGU6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKGZhaWxlZCAvIGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoKSAqIDEwMCkgOiAwLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVzdWx0cyxcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICBzdWNjZWVkZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgIH0sXG4gICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEoc3RhcnRUaW1lKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgaGFuZGxlciByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBoYW5kbGVyIG1ldGhvZC5cbiAgICpcbiAgICogSGFuZGxlciByZWZlcmVuY2UgZm9ybWF0OiBcIk1vZHVsZS5tZXRob2RcIlxuICAgKiBFeGFtcGxlczpcbiAgICogLSBcIkVsZW1lbnRDUlVELmNyZWF0ZVwiIOKGkiB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmNyZWF0ZUVsZW1lbnQoLi4uKVxuICAgKiAtIFwiTWVtb3J5LmFkZEVudHJ5XCIg4oaSIHRoaXMuaGFuZGxlcnMubWVtb3J5TWFuYWdlci5hZGRFbnRyeSguLi4pXG4gICAqIC0gXCJBZ2VudC5leGVjdXRlXCIg4oaSIHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCguLi4pXG4gICAqXG4gICAqIERJU1BBVENIIFNUUkFURUdZIChJc3N1ZSAjMjQ3KTpcbiAgICogMS4gQ2hlY2sgaWYgb3BlcmF0aW9uIGlzIHNjaGVtYS1kcml2ZW4g4oaSIHVzZSBTY2hlbWFEaXNwYXRjaGVyXG4gICAqIDIuIE90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gbGVnYWN5IG1vZHVsZS1iYXNlZCBkaXNwYXRjaFxuICAgKlxuICAgKiBTY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnMgYmVuZWZpdCBmcm9tOlxuICAgKiAtIERlY2xhcmF0aXZlIGNvbmZpZ3VyYXRpb24gKG5vIHN3aXRjaCBzdGF0ZW1lbnRzKVxuICAgKiAtIEF1dG8tZ2VuZXJhdGVkIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gICAqIC0gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igb3BlcmF0aW9uIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGVyUmVmIC0gSGFuZGxlciByZWZlcmVuY2UgaW4gXCJNb2R1bGUubWV0aG9kXCIgZm9ybWF0XG4gICAqIEBwYXJhbSBpbnB1dCAtIFZhbGlkYXRlZCBvcGVyYXRpb24gaW5wdXRcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gb3BlcmF0aW9uLXNwZWNpZmljIGRhdGFcbiAgICogQHRocm93cyBFcnJvciBpZiBoYW5kbGVyIHJlZmVyZW5jZSBpcyB1bmtub3duIG9yIG1ldGhvZCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaChcbiAgICBoYW5kbGVyUmVmOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBwYXJhbXMgfSA9IGlucHV0O1xuXG4gICAgLy8gSXNzdWUgIzI0NzogU2NoZW1hLWRyaXZlbiBkaXNwYXRjaCBmb3IgY29uZmlndXJlZCBvcGVyYXRpb25zXG4gICAgLy8gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBtYW51YWwgc3dpdGNoIHN0YXRlbWVudHNcbiAgICAvLyBJc3N1ZSAjMjUxOiBQYXNzIGZ1bGwgaW5wdXQgZm9yIG9wZXJhdGlvbnMgbmVlZGluZyBlbGVtZW50VHlwZSByZXNvbHV0aW9uXG4gICAgaWYgKFNjaGVtYURpc3BhdGNoZXIuY2FuRGlzcGF0Y2gob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFNjaGVtYURpc3BhdGNoZXIuZGlzcGF0Y2goXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge30sXG4gICAgICAgIHRoaXMuaGFuZGxlcnMsXG4gICAgICAgIGlucHV0XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBtb2R1bGUtYmFzZWQgZGlzcGF0Y2ggZm9yIGNvbXBsZXggb3BlcmF0aW9uc1xuICAgIGNvbnN0IFttb2R1bGUsIG1ldGhvZF0gPSBoYW5kbGVyUmVmLnNwbGl0KCcuJyk7XG5cbiAgICAvLyBFbGVtZW50Q1JVRCBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0VsZW1lbnRDUlVEJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFbGVtZW50Q1JVRChtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBNZW1vcnkgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdNZW1vcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaE1lbW9yeShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQWdlbnQgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdBZ2VudCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQWdlbnQobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFRlbXBsYXRlKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmF0aW9uIG9wZXJhdGlvbnMgKGNyb3NzLWN1dHRpbmcgY29uY2VybilcbiAgICBpZiAobW9kdWxlID09PSAnQWN0aXZhdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQWN0aXZhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdTZWFyY2gnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFNlYXJjaChtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBVbmlmaWVkU2VhcmNoIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpIGFyZSBub3cgc2NoZW1hLWRyaXZlblxuICAgIC8vIHZpYSBTY2hlbWFEaXNwYXRjaGVyIHdpdGggdGhlICdzZWFyY2hQYXJhbXMnIG5vcm1hbGl6ZXIuXG4gICAgLy8gU2VlIFBPUlRGT0xJT19PUEVSQVRJT05TLnNlYXJjaCBpbiBPcGVyYXRpb25TY2hlbWEudHNcblxuICAgIC8vIEludHJvc3BlY3Rpb24gb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdJbnRyb3NwZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hJbnRyb3NwZWN0aW9uKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0aW9uIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0NvbGxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaENvbGxlY3Rpb24obWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFBvcnRmb2xpbyBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdQb3J0Zm9saW8nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFBvcnRmb2xpbyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQXV0aCBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdBdXRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hBdXRoKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBDb25maWcgb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnQ29uZmlnJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hDb25maWcobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnRW5oYW5jZWRJbmRleCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRW5oYW5jZWRJbmRleChtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gUGVyc29uYSBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdQZXJzb25hJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hQZXJzb25hKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIG9wZXJhdGlvbnMgKElzc3VlICMyNDQgLSBDUlVERSlcbiAgICBpZiAobW9kdWxlID09PSAnRXhlY3V0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXhlY3V0ZShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gR2F0ZWtlZXBlciBvcGVyYXRpb25zIChJc3N1ZSAjNDUyIC0gY29uZmlybWF0aW9uIGZsb3cpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0dhdGVrZWVwZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEdhdGVrZWVwZXIobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIExvZ2dpbmcgb3BlcmF0aW9ucyAoSXNzdWUgIzUyOCAtIENSVURFIG1pZ3JhdGlvbilcbiAgICBpZiAobW9kdWxlID09PSAnTG9nZ2luZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTG9nZ2luZyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gTWV0cmljcyBvcGVyYXRpb25zIChDUlVERS1yb3V0ZWQgcXVlcnlfbWV0cmljcylcbiAgICBpZiAobW9kdWxlID09PSAnTWV0cmljcycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTWV0cmljcyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQnJvd3NlciBvcGVyYXRpb25zIChJc3N1ZSAjNzc0OiBvcGVuIHBvcnRmb2xpbyBicm93c2VyKVxuICAgIGlmIChtb2R1bGUgPT09ICdCcm93c2VyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hCcm93c2VyKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gaGFuZGxlciBtb2R1bGU6ICR7bW9kdWxlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEVsZW1lbnRDUlVEIG9wZXJhdGlvbnMgdG8gRWxlbWVudENSVURIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRWxlbWVudENSVUQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQ7XG4gICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdjcmVhdGUnOiB7XG4gICAgICAgIC8vIElzc3VlICMyNzg6IEZvciBlbnNlbWJsZXMsIG1lcmdlIHRvcC1sZXZlbCBlbGVtZW50cyBpbnRvIG1ldGFkYXRhXG4gICAgICAgIC8vIExMTXMgb2Z0ZW4gcGFzcyBlbGVtZW50cyBhdCBwYXJhbXMgbGV2ZWwsIG5vdCBpbnNpZGUgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpO1xuICAgICAgICBsZXQgbWV0YWRhdGEgPSBwLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBlbnNlbWJsZSB0eXBlIChoYW5kbGVzIGJvdGggcGx1cmFsIGNvbnN0YW50IGFuZCBzaW5ndWxhciBmb3JtKVxuICAgICAgICBjb25zdCBpc0Vuc2VtYmxlID0gcmVzb2x2ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSB8fCByZXNvbHZlZFR5cGUgPT09ICdlbnNlbWJsZSc7XG4gICAgICAgIGlmIChpc0Vuc2VtYmxlKSB7XG4gICAgICAgICAgLy8gSXNzdWUgIzM2NTogUmVjb2duaXplIGNvbW1vbiBzeW5vbnltcyBmb3IgJ2VsZW1lbnRzJyAobWVtYmVycywgY29tcG9uZW50cywgaXRlbXMpXG4gICAgICAgICAgY29uc3Qgc3lub255bXMgPSBbJ21lbWJlcnMnLCAnY29tcG9uZW50cycsICdpdGVtcyddIGFzIGNvbnN0O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzU291cmNlID0gcC5lbGVtZW50cyB8fCBzeW5vbnltcy5yZWR1Y2U8dW5rbm93bj4oXG4gICAgICAgICAgICAoZm91bmQsIHN5bikgPT4gZm91bmQgfHwgcFtzeW5dLCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlbGVtZW50c1NvdXJjZSAmJiAoIW1ldGFkYXRhIHx8ICFtZXRhZGF0YS5lbGVtZW50cykpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhID0geyAuLi5tZXRhZGF0YSwgZWxlbWVudHM6IGVsZW1lbnRzU291cmNlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzYwMjogJ2luc3RydWN0aW9ucycgaXMgbm8gbG9uZ2VyIGFuIEFQSSBmaWVsZC4gVXNlICdjb250ZW50JyBmb3IgYWxsIHR5cGVzLlxuICAgICAgICAvLyBJZiBhbiBMTE0gc2VuZHMgJ2luc3RydWN0aW9ucycsIHBhc3MgaXQgdGhyb3VnaCBzbyBjcmVhdGVFbGVtZW50IGNhbiByZWplY3Qgd2l0aCBndWlkYW5jZS5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICB0eXBlOiByZXNvbHZlZFR5cGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIGNvbnRlbnQ6IHAuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwLmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsICAvLyBSZWplY3RlZCB3aXRoIGd1aWRhbmNlIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5saXN0RWxlbWVudHMoXG4gICAgICAgICAgZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnZ2V0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZylcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXNzdWUgIzczODogQ3VycmVudGx5IHNoYXJlcyBjb2RlIHBhdGggd2l0aCAnZ2V0Jy4gRnV0dXJlIGRpdmVyZ2VuY2UgcG9pbnQg4oCUXG4gICAgICAvLyAnZ2V0RGV0YWlscycgd2lsbCByZXR1cm4gZXh0ZW5kZWQgbWV0YWRhdGEgKHJlbGF0aW9uc2hpcCBncmFwaCwgc3RhY2sgbWVtYmVyc2hpcCxcbiAgICAgIC8vIHBvbGljeSByZXNvbHV0aW9uLCBhY3RpdmF0aW9uIHN0YXRlLCByZXZlcnNlIGRlcGVuZGVuY2llcykuXG4gICAgICBjYXNlICdnZXREZXRhaWxzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZylcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnZWRpdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmVkaXRFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBpbnB1dDogcC5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIudmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBzdHJpY3Q6IHAuc3RyaWN0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5kZWxldGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBkZWxldGVEYXRhOiBwLmRlbGV0ZURhdGEgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUltcG9ydEVsZW1lbnQocCk7XG5cbiAgICAgIGNhc2UgJ2V4cG9ydCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUV4cG9ydEVsZW1lbnQoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyksXG4gICAgICAgICAgKHAuZm9ybWF0IGFzICdqc29uJyB8ICd5YW1sJykgfHwgJ2pzb24nXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBFbGVtZW50Q1JVRCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBpbXBvcnQgb3BlcmF0aW9uLlxuICAgKiBQYXJzZXMgZXhwb3J0IHBhY2thZ2UsIGRlc2VyaWFsaXplcyBlbGVtZW50IGRhdGEsIGFuZCBjcmVhdGVzIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBkYXRhIGFuZCBvcHRpb25hbCBvdmVyd3JpdGUgZmxhZ1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBjcmVhdGVkIGVsZW1lbnRcbiAgICogQHRocm93cyBFcnJvciBpZiBleHBvcnQgcGFja2FnZSBpcyBpbnZhbGlkIG9yIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgKHdoZW4gb3ZlcndyaXRlIGlzIGZhbHNlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbXBvcnRFbGVtZW50KHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcblxuICAgIC8vIFBhcnNlIGV4cG9ydCBwYWNrYWdlIChjYW4gYmUgc3RyaW5nIG9yIGFscmVhZHktcGFyc2VkIG9iamVjdClcbiAgICBsZXQgZXhwb3J0UGFja2FnZTogRXhwb3J0UGFja2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0UGFja2FnZSA9IEpTT04ucGFyc2UocGFyYW1zLmRhdGEpIGFzIEV4cG9ydFBhY2thZ2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZXhwb3J0IHBhY2thZ2U6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnb2JqZWN0JyAmJiBwYXJhbXMuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgZXhwb3J0UGFja2FnZSA9IHBhcmFtcy5kYXRhIGFzIEV4cG9ydFBhY2thZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyBvciBvYmplY3QnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBleHBvcnQgcGFja2FnZSBzdHJ1Y3R1cmUgd2l0aCBkZXRhaWxlZCBtaXNzaW5nIGZpZWxkIHJlcG9ydGluZ1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gWydleHBvcnRWZXJzaW9uJywgJ2VsZW1lbnRUeXBlJywgJ2Zvcm1hdCcsICdkYXRhJ10gYXMgY29uc3Q7XG4gICAgY29uc3QgbWlzc2luZ0ZpZWxkcyA9IHJlcXVpcmVkRmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZCkgPT4gIWV4cG9ydFBhY2thZ2VbZmllbGQgYXMga2V5b2YgRXhwb3J0UGFja2FnZV1cbiAgICApO1xuICAgIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogbWlzc2luZyBmaWVsZHM6ICR7bWlzc2luZ0ZpZWxkcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIERlc2VyaWFsaXplIGVsZW1lbnQgZGF0YSBiYXNlZCBvbiBmb3JtYXRcbiAgICBsZXQgZWxlbWVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXhwb3J0UGFja2FnZS5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBlbGVtZW50RGF0YSA9IEpTT04ucGFyc2UoZXhwb3J0UGFja2FnZS5kYXRhKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIH0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZS5mb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgICAvLyBTRUNVUklUWTogVXNlIEpTT05fU0NIRU1BIGZvciBwdXJlIFlBTUwgcGFyc2luZyAocHJldmVudHMgY29kZSBleGVjdXRpb24pXG4gICAgICAgIC8vIEpTT05fU0NIRU1BID0gRkFJTFNBRkUgKyBib29sL2ludC9mbG9hdC9udWxsIChzYWZlciB0aGFuIERFRkFVTFQgd2hpY2ggYWRkcyB0aW1lc3RhbXBzKVxuICAgICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoZXhwb3J0UGFja2FnZS5kYXRhLCB7IHNjaGVtYTogeWFtbC5KU09OX1NDSEVNQSB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBZQU1MIGRhdGE6IGV4cGVjdGVkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnREYXRhID0gcGFyc2VkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmb3JtYXQ6ICR7ZXhwb3J0UGFja2FnZS5mb3JtYXR9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIGVsZW1lbnQgZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBlbGVtZW50IGZpZWxkc1xuICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50RGF0YS5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGVsZW1lbnREYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZztcbiAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudERhdGEuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50RGF0YS5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmFtZSB8fCAhZGVzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50IGRhdGE6IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzIChuYW1lLCBkZXNjcmlwdGlvbiknKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBvdmVyd3JpdGUgaXMgYWxsb3dlZFxuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IHBhcmFtcy5vdmVyd3JpdGUgPT09IHRydWU7XG5cbiAgICAvLyBJZiBub3Qgb3ZlcndyaXRpbmcsIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzXG4gICAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhbHJlYWR5IGV4aXN0czogJHtuYW1lfS4gVXNlIG92ZXJ3cml0ZTp0cnVlIHRvIHJlcGxhY2UgaXQuYCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbGVtZW50IGRvZXNuJ3QgZXhpc3QsIG9yIGVycm9yIGdldHRpbmcgZGV0YWlscyAtIHByb2NlZWQgd2l0aCBjcmVhdGlvblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IG91ciBvd24gXCJhbHJlYWR5IGV4aXN0c1wiIGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgLSBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgZWxlbWVudCAod2lsbCBvdmVyd3JpdGUgaWYgaXQgZXhpc3RzKVxuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZUVsZW1lbnQoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IGV4cG9ydFBhY2thZ2UuZWxlbWVudFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZWxlbWVudCB0byBKU09OIG9yIFlBTUwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lIHRvIGV4cG9ydFxuICAgKiBAcGFyYW0gdHlwZSAtIEVsZW1lbnQgdHlwZSAocGVyc29uYSwgc2tpbGwsIHRlbXBsYXRlLCBhZ2VudCwgbWVtb3J5LCBlbnNlbWJsZSlcbiAgICogQHBhcmFtIGZvcm1hdCAtIEV4cG9ydCBmb3JtYXQ6ICdqc29uJyBvciAneWFtbCcgKGRlZmF1bHQ6ICdqc29uJylcbiAgICogQHJldHVybnMgRXhwb3J0UGFja2FnZSB3aXRoIHNlcmlhbGl6ZWQgZWxlbWVudCBkYXRhXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV4cG9ydEVsZW1lbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyA9ICdqc29uJ1xuICApOiBQcm9taXNlPEV4cG9ydFBhY2thZ2U+IHtcbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBvcGVyYXRpb24gcmVxdWlyZXMgbmFtZSBwYXJhbWV0ZXInKTtcbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBvcGVyYXRpb24gcmVxdWlyZXMgdHlwZSBwYXJhbWV0ZXIgKHZpYSBlbGVtZW50VHlwZSBvciBwYXJhbXMudHlwZSknKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZWxlbWVudCBkZXRhaWxzIHVzaW5nIGV4aXN0aW5nIGhhbmRsZXJcbiAgICBjb25zdCBlbGVtZW50RGV0YWlscyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgdHlwZSk7XG5cbiAgICAvLyBCdWlsZCBleHBvcnQgcGFja2FnZVxuICAgIGNvbnN0IGV4cG9ydFBhY2thZ2U6IEV4cG9ydFBhY2thZ2UgPSB7XG4gICAgICBleHBvcnRWZXJzaW9uOiAnMS4wJyxcbiAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICBmb3JtYXQsXG4gICAgICBkYXRhOiAnJyxcbiAgICB9O1xuXG4gICAgLy8gU2VyaWFsaXplIHRvIHJlcXVlc3RlZCBmb3JtYXRcbiAgICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICAgIGV4cG9ydFBhY2thZ2UuZGF0YSA9IHlhbWwuZHVtcChlbGVtZW50RGV0YWlscywge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0UGFja2FnZS5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudERldGFpbHMsIG51bGwsIDIpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBvcnRQYWNrYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIE1lbW9yeSBvcGVyYXRpb25zIHRvIE1lbW9yeU1hbmFnZXJcbiAgICpcbiAgICogTWVtb3J5IG9wZXJhdGlvbnMgd29yayBvbiBpbmRpdmlkdWFsIE1lbW9yeSBpbnN0YW5jZXM6XG4gICAqIDEuIEdldCB0aGUgTWVtb3J5IGJ5IG5hbWUgZnJvbSBNZW1vcnlNYW5hZ2VyXG4gICAqIDIuIENhbGwgdGhlIG9wZXJhdGlvbiBvbiB0aGUgTWVtb3J5IGluc3RhbmNlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVkIGtleSBzaGFyZWQgYnkgcGVuZGluZ1NhdmVzLCBmYWlsZWRNZW1vcnlTYXZlcywgbWVtb3J5U2F2ZUF0dGVtcHRzLFxuICAgKiBhbmQgc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLiBBbGwgbWVtb3J5LXNhdmUgYm9va2tlZXBpbmcgbXVzdCB1c2UgdGhpcyDigJQgYVxuICAgKiBtaXNtYXRjaGVkIGtleSBzaWxlbnRseSBkaXNjb25uZWN0cyB0aGUgZmFpbHVyZSBsZWRnZXIgZnJvbSByZWNvdmVyeSAoIzIzMjkpLlxuICAgKi9cbiAgcHJpdmF0ZSBtZW1vcnlTYXZlS2V5KG1lbW9yeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1lbW9yeU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOSAoQ29kZXggcmV2aWV3KTogYSBzdWNjZXNzZnVsbHkgZGVsZXRlZCBtZW1vcnkgbXVzdCBkcm9wIGl0c1xuICAgKiBzYXZlIGJvb2trZWVwaW5nIOKAlCBhIHJldGFpbmVkIGZhaWx1cmUtbGVkZ2VyIGluc3RhbmNlIG9yIHBlbmRpbmcgZGVib3VuY2VcbiAgICogdGltZXIgd291bGQgb3RoZXJ3aXNlIHJlLXNhdmUgdGhlIGluLVJBTSBzdGF0ZSBhbmQgcmVzdXJyZWN0IHRoZSBkZWxldGVkXG4gICAqIGZpbGUuIENhbGxlZCBhZnRlciBkaXNwYXRjaCBpbiBleGVjdXRlT3BlcmF0aW9uIHNvIHRoZSBzY2hlbWEtZGlzcGF0Y2gsXG4gICAqIGxlZ2FjeSwgYW5kIGJhdGNoIHBhdGhzIGFyZSBhbGwgY292ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgY2xlYW51cERlbGV0ZWRNZW1vcnlCb29ra2VlcGluZyhcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIGlmIChvcGVyYXRpb24gIT09ICdkZWxldGVfZWxlbWVudCcpIHJldHVybjtcbiAgICBjb25zdCBwID0gcGFyYW1zID8/IHt9O1xuICAgIGNvbnN0IHR5cGUgPSAoZWxlbWVudFR5cGUgPz8gcC5lbGVtZW50X3R5cGUgPz8gcC50eXBlKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbmFtZSA9IChwLmVsZW1lbnRfbmFtZSA/PyBwLm5hbWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobmFtZSAmJiBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICB0aGlzLmNsZWFyTWVtb3J5U2F2ZUJvb2trZWVwaW5nKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOSAoQ29kZXggcmV2aWV3KTogZHJvcCBhbGwgc2F2ZSBib29ra2VlcGluZyBmb3IgYSBkZWxldGVkIG1lbW9yeS5cbiAgICogV2l0aG91dCB0aGlzLCB0aGUgZmFpbHVyZSBsZWRnZXIga2VlcHMgdGhlIGRlbGV0ZWQgbWVtb3J5J3MgaW4tUkFNIGluc3RhbmNlXG4gICAqIGFuZCB0aGUgZmx1c2gvcmV0cnkgcGF0aHMgcmUtc2F2ZSBpdCwgcmVzdXJyZWN0aW5nIHRoZSBkZWxldGVkIGZpbGUuIEEgc2F2ZVxuICAgKiBhbHJlYWR5IGluIGZsaWdodCB3aGVuIHRoZSBkZWxldGUgbGFuZHMgY2FuIHN0aWxsIHJhY2UgdGhlIGZpbGUgYmFjayDigJQgdGhhdFxuICAgKiBuYXJyb3cgd2luZG93IGlzIGluaGVyZW50IHRvIGZpcmUtYW5kLWZvcmdldCB3cml0ZXMgYW5kIHVuY2hhbmdlZCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhck1lbW9yeVNhdmVCb29ra2VlcGluZyhtZW1vcnlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm1lbW9yeVNhdmVLZXkobWVtb3J5TmFtZSk7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1NhdmVzLmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICBjbGVhclRpbWVvdXQocGVuZGluZy50aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdTYXZlcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5mYWlsZWRNZW1vcnlTYXZlcy5kZWxldGUoa2V5KTtcbiAgICB0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5kZWxldGUoa2V5KTtcbiAgICB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOTogc2F2ZSBhIG1lbW9yeSB3aXRoIGZhaWx1cmUtbGVkZ2VyIGJvb2trZWVwaW5nLiBPbiBmYWlsdXJlIHRoZVxuICAgKiBsZWRnZXIgcmVjb3JkcyB0aGUgZXJyb3IgQU5EIHRoZSBmYWlsaW5nIGluc3RhbmNlIChpdHMgdW5wZXJzaXN0ZWQgZW50cmllc1xuICAgKiBleGlzdCBub3doZXJlIGVsc2UpOyBvbiBzdWNjZXNzIHRoZSByZWNvcmQgY2xlYXJzLiBUaGUgYXR0ZW1wdCBjb3VudGVyIG1ha2VzXG4gICAqIHRoZSBuZXdlc3Qtc3RhcnRlZCBzYXZlIHdpbjogYW4gb2xkZXIgaW4tZmxpZ2h0IHNhdmUgcmVzb2x2aW5nIGxhdGUgY2Fubm90XG4gICAqIGVyYXNlIGEgbmV3ZXIgZmFpbHVyZS4gUmV0aHJvd3MgdGhlIHNhdmUgZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVNZW1vcnlUcmFja2VkKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG1lbW9yeTogaW1wb3J0KCcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnKS5NZW1vcnksXG4gICAgbWFuYWdlcjogTWVtb3J5TWFuYWdlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXR0ZW1wdCA9ICh0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgdGhpcy5tZW1vcnlTYXZlQXR0ZW1wdHMuc2V0KGtleSwgYXR0ZW1wdCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgaWYgKHRoaXMubWVtb3J5U2F2ZUF0dGVtcHRzLmdldChrZXkpID09PSBhdHRlbXB0KSB7XG4gICAgICAgIHRoaXMuZmFpbGVkTWVtb3J5U2F2ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIC8vIFBydW5lIHRoZSBjb3VudGVyIG9uIGxhdGVzdC1zdWNjZXNzIHNvIHRoZSBtYXAgc3RheXMgYm91bmRlZCBieVxuICAgICAgICAvLyBjdXJyZW50bHktZmFpbGluZyBtZW1vcmllcy4gQSBzdGFsZSBpbi1mbGlnaHQgc2F2ZSB0aGVuIHNlZXNcbiAgICAgICAgLy8gdW5kZWZpbmVkICE9PSBpdHMgYXR0ZW1wdCBhbmQgY29ycmVjdGx5IHNraXBzIGxlZGdlciB1cGRhdGVzLlxuICAgICAgICB0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLm1lbW9yeVNhdmVBdHRlbXB0cy5nZXQoa2V5KSA9PT0gYXR0ZW1wdCkge1xuICAgICAgICB0aGlzLmZhaWxlZE1lbW9yeVNhdmVzLnNldChrZXksIHtcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpLFxuICAgICAgICAgIG1lbW9yeSxcbiAgICAgICAgICBtYW5hZ2VyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NjogRGVib3VuY2UgbWVtb3J5IHNhdmVzIHRvIHByZXZlbnQgZmlsZSBkZXNjcmlwdG9yIGV4aGF1c3Rpb24uXG4gICAqIENvYWxlc2NlcyByYXBpZCBhZGRFbnRyeSBjYWxscyDigJQgb25seSB3cml0ZXMgdGhlIGxhdGVzdCBzdGF0ZSBhZnRlciB0aGUgd2luZG93IGV4cGlyZXMuXG4gICAqL1xuICBwcml2YXRlIGRlYm91bmNlZE1lbW9yeVNhdmUoXG4gICAgbWVtb3J5TmFtZTogc3RyaW5nLFxuICAgIG1lbW9yeTogaW1wb3J0KCcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnKS5NZW1vcnksXG4gICAgbWFuYWdlcjogTWVtb3J5TWFuYWdlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5tZW1vcnlTYXZlS2V5KG1lbW9yeU5hbWUpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nU2F2ZXMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZXhpc3RpbmcudGltZXIpO1xuICAgICAgdGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1BBUUxIYW5kbGVyXSBDb2FsZXNjZWQgc2F2ZSBmb3IgbWVtb3J5ICcke21lbW9yeU5hbWV9JyAocGVuZGluZzogJHt0aGlzLnBlbmRpbmdTYXZlcy5zaXplfSwgY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pYCk7XG4gICAgfVxuICAgIGNvbnN0IGRlYm91bmNlTXMgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9ERUJPVU5DRV9NUztcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nU2F2ZXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1BBUUxIYW5kbGVyXSBGbHVzaGluZyBkZWJvdW5jZWQgc2F2ZSBmb3IgbWVtb3J5ICcke21lbW9yeU5hbWV9JyAoY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pYCk7XG4gICAgICB0aGlzLnNhdmVNZW1vcnlUcmFja2VkKGtleSwgbWVtb3J5LCBtYW5hZ2VyKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01DUEFRTEhhbmRsZXJdIERlYm91bmNlZCBzYXZlIGZhaWxlZCBmb3IgbWVtb3J5ICcke21lbW9yeU5hbWV9JyAocGVuZGluZzogJHt0aGlzLnBlbmRpbmdTYXZlcy5zaXplfSwgY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pOiAke2Vycn1gKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlYm91bmNlTXMpO1xuICAgIC8vIEVuc3VyZSB0aW1lciBkb2Vzbid0IGtlZXAgTm9kZSBwcm9jZXNzIGFsaXZlIChpbXBvcnRhbnQgZm9yIHRlc3RzL3NodXRkb3duKVxuICAgIGlmICh0eXBlb2YgdGltZXIgPT09ICdvYmplY3QnICYmICd1bnJlZicgaW4gdGltZXIpIHtcbiAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ1NhdmVzLnNldChrZXksIHsgdGltZXIsIG1lbW9yeSwgbWFuYWdlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU3OiBUcmFjayBhZGRFbnRyeSBjYWxsIGZyZXF1ZW5jeSBwZXIgbWVtb3J5IGFuZCBsb2cgd2FybmluZ3MgYXQgdGhyZXNob2xkcy5cbiAgICpcbiAgICogVXNlcyBhIHNsaWRpbmcgd2luZG93IGNvdW50ZXIgdG8gZGV0ZWN0IHJ1bmF3YXkgc2F2ZSBsb29wcyBiZWZvcmUgdGhleSBleGhhdXN0IHJlc291cmNlcy5cbiAgICogQ291bnRlcnMgYXJlIGJvdW5kZWQ6IG1heCA1MDAgdHJhY2tlZCBtZW1vcmllcywgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIHdoZW4gZXhjZWVkZWQuXG4gICAqIFdhcm5pbmcvY3JpdGljYWwgZmxhZ3MgYXV0by1yZXNldCB3aGVuIGZyZXF1ZW5jeSBkcm9wcyBiZWxvdyB0aHJlc2hvbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gbWVtb3J5TmFtZSAtIE5hbWUgb2YgdGhlIG1lbW9yeSBiZWluZyB3cml0dGVuIHRvXG4gICAqL1xuICBwcml2YXRlIHRyYWNrU2F2ZUZyZXF1ZW5jeShtZW1vcnlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm1lbW9yeVNhdmVLZXkobWVtb3J5TmFtZSk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3aW5kb3dNcyA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1FTU9SWV9TQVZFX01PTklUT1JfV0lORE9XX01TO1xuICAgIGNvbnN0IHdhcm5UaHJlc2hvbGQgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9GUkVRVUVOQ1lfV0FSTl9USFJFU0hPTEQ7XG4gICAgY29uc3QgY3JpdGljYWxUaHJlc2hvbGQgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9GUkVRVUVOQ1lfQ1JJVElDQUxfVEhSRVNIT0xEO1xuXG4gICAgbGV0IGNvdW50ZXIgPSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5nZXQoa2V5KTtcbiAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgIC8vIEV2aWN0IG9sZGVzdCBlbnRyeSBpZiBtYXAgZXhjZWVkcyBzaXplIGxpbWl0IChwcmV2ZW50cyB1bmJvdW5kZWQgZ3Jvd3RoKVxuICAgICAgaWYgKHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNpemUgPj0gNTAwKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdEtleSA9IHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3RLZXkpIHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLmRlbGV0ZShvbGRlc3RLZXkpO1xuICAgICAgfVxuICAgICAgY291bnRlciA9IHsgdGltZXN0YW1wczogW10sIHdhcm5lZDogZmFsc2UsIGNyaXRpY2FsOiBmYWxzZSB9O1xuICAgICAgdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuc2V0KGtleSwgY291bnRlcik7XG4gICAgfVxuXG4gICAgLy8gUHJ1bmUgdGltZXN0YW1wcyBvdXRzaWRlIHRoZSB3aW5kb3dcbiAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB3aW5kb3dNcztcbiAgICBjb3VudGVyLnRpbWVzdGFtcHMgPSBjb3VudGVyLnRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gdCA+IGN1dG9mZik7XG4gICAgY291bnRlci50aW1lc3RhbXBzLnB1c2gobm93KTtcblxuICAgIGNvbnN0IGNvdW50ID0gY291bnRlci50aW1lc3RhbXBzLmxlbmd0aDtcblxuICAgIGlmIChjb3VudCA+PSBjcml0aWNhbFRocmVzaG9sZCAmJiAhY291bnRlci5jcml0aWNhbCkge1xuICAgICAgY291bnRlci5jcml0aWNhbCA9IHRydWU7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNQ1BBUUxIYW5kbGVyXSBTYXZlIGZyZXF1ZW5jeSBjcml0aWNhbCB0aHJlc2hvbGQgZXhjZWVkZWQnLCB7XG4gICAgICAgIG1lbW9yeU5hbWUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICB0aHJlc2hvbGQ6IGNyaXRpY2FsVGhyZXNob2xkLFxuICAgICAgICB3aW5kb3dTZWNvbmRzOiB3aW5kb3dNcyAvIDEwMDAsXG4gICAgICAgIHRyYWNrZWRNZW1vcmllczogdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuc2l6ZSxcbiAgICAgIH0pO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIudHJhY2tTYXZlRnJlcXVlbmN5JyxcbiAgICAgICAgZGV0YWlsczogYE1lbW9yeSAnJHttZW1vcnlOYW1lfScgZXhjZWVkcyBjcml0aWNhbCBzYXZlIGZyZXF1ZW5jeTogJHtjb3VudH0gY2FsbHMgaW4gJHt3aW5kb3dNcyAvIDEwMDB9c2AsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IG1lbW9yeU5hbWUsIGNvdW50LCB0aHJlc2hvbGQ6IGNyaXRpY2FsVGhyZXNob2xkLCB3aW5kb3dNcyB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb3VudCA+PSB3YXJuVGhyZXNob2xkICYmICFjb3VudGVyLndhcm5lZCkge1xuICAgICAgY291bnRlci53YXJuZWQgPSB0cnVlO1xuICAgICAgbG9nZ2VyLndhcm4oJ1tNQ1BBUUxIYW5kbGVyXSBTYXZlIGZyZXF1ZW5jeSB3YXJuIHRocmVzaG9sZCBleGNlZWRlZCcsIHtcbiAgICAgICAgbWVtb3J5TmFtZSxcbiAgICAgICAgY291bnQsXG4gICAgICAgIHRocmVzaG9sZDogd2FyblRocmVzaG9sZCxcbiAgICAgICAgd2luZG93U2Vjb25kczogd2luZG93TXMgLyAxMDAwLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgd2FybmluZyBmbGFncyB3aGVuIGNvdW50IGRyb3BzIGJhY2sgYmVsb3cgdGhyZXNob2xkc1xuICAgIGlmIChjb3VudCA8IHdhcm5UaHJlc2hvbGQpIHtcbiAgICAgIGNvdW50ZXIud2FybmVkID0gZmFsc2U7XG4gICAgICBjb3VudGVyLmNyaXRpY2FsID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IEZsdXNoIGFsbCBwZW5kaW5nIGRlYm91bmNlZCBzYXZlcyBvbiBzaHV0ZG93bi5cbiAgICogQ2FsbGVkIGJ5IERJIGNvbnRhaW5lciBkaXNwb3NlIGNoYWluIHRvIGVuc3VyZSBubyBkYXRhIGlzIGxvc3QuXG4gICAqL1xuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmx1c2hQZW5kaW5nU2F2ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBGbHVzaCBhbGwgcGVuZGluZyBkZWJvdW5jZWQgc2F2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIElzc3VlICMyMzI5OiBhbHNvIHJldHJpZXMgbWVtb3JpZXMgd2hvc2UgZWFybGllciBkZWZlcnJlZCBzYXZlIGZhaWxlZCBhbmRcbiAgICogdGhhdCBoYXZlIG5vIHBlbmRpbmcgdGltZXIg4oCUIHRoZWlyIGRpcnR5IHN0YXRlIGV4aXN0cyBvbmx5IGluIFJBTSBhbmQgdGhpc1xuICAgKiBpcyB0aGUgbGFzdCBjaGFuY2UgdG8gcGVyc2lzdCBpdCBiZWZvcmUgc2h1dGRvd24uXG4gICAqL1xuICBhc3luYyBmbHVzaFBlbmRpbmdTYXZlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gWy4uLnRoaXMucGVuZGluZ1NhdmVzLmVudHJpZXMoKV07XG4gICAgdGhpcy5wZW5kaW5nU2F2ZXMuY2xlYXIoKTtcbiAgICBpZiAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgW01DUEFRTEhhbmRsZXJdIEZsdXNoaW5nICR7cGVuZGluZy5sZW5ndGh9IHBlbmRpbmcgbWVtb3J5IHNhdmUocykgb24gc2h1dGRvd24gKHRvdGFsIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB0b3RhbCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgIH1cbiAgICBjb25zdCBmbHVzaGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgeyB0aW1lciwgbWVtb3J5LCBtYW5hZ2VyIH1dIG9mIHBlbmRpbmcpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBmbHVzaGVkS2V5cy5hZGQoa2V5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZU1lbW9yeVRyYWNrZWQoa2V5LCBtZW1vcnksIG1hbmFnZXIpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IHR5cGVvZiBtZW1vcnkuZ2V0RW50cmllcyA9PT0gJ2Z1bmN0aW9uJyA/IG1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSA6ICd1bmtub3duJztcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2ggc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSwgcGVuZGluZyByZW1haW5pbmc6ICR7cGVuZGluZy5sZW5ndGh9KTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERpcmVjdCBNYXAgaXRlcmF0aW9uIGlzIHNhZmUgaGVyZTogc2F2ZU1lbW9yeVRyYWNrZWQgb25seSBkZWxldGVzIHRoZVxuICAgIC8vIGN1cnJlbnQga2V5IG9uIHN1Y2Nlc3MsIHdoaWNoIHRoZSBpdGVyYXRpb24gcHJvdG9jb2wgdG9sZXJhdGVzLlxuICAgIGZvciAoY29uc3QgW2tleSwgeyBtZW1vcnksIG1hbmFnZXIgfV0gb2YgdGhpcy5mYWlsZWRNZW1vcnlTYXZlcykge1xuICAgICAgaWYgKGZsdXNoZWRLZXlzLmhhcyhrZXkpKSBjb250aW51ZTsgLy8ganVzdCBhdHRlbXB0ZWQgYWJvdmVcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZU1lbW9yeVRyYWNrZWQoa2V5LCBtZW1vcnksIG1hbmFnZXIpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTUNQQVFMSGFuZGxlcl0gUmVjb3ZlcmVkIHByZXZpb3VzbHkgZmFpbGVkIHNhdmUgZm9yIG1lbW9yeSAnJHtrZXl9JyBkdXJpbmcgZmx1c2hgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlbnRyeUNvdW50ID0gdHlwZW9mIG1lbW9yeS5nZXRFbnRyaWVzID09PSAnZnVuY3Rpb24nID8gbWVtb3J5LmdldEVudHJpZXMoKS5zaXplIDogJ3Vua25vd24nO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNQ1BBUUxIYW5kbGVyXSBGaW5hbCBmbHVzaCByZXRyeSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSkg4oCUIHVucGVyc2lzdGVkIGVudHJpZXMgd2lsbCBiZSBsb3N0IGlmIHRoZSBwcm9jZXNzIGV4aXRzOiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoTWVtb3J5KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMubWVtb3J5TWFuYWdlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFVzZSBzaGFyZWQgdmFsaWRhdGlvbiB1dGlsaXR5XG4gICAgY29uc3QgbWVtb3J5TmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICBwYXJhbXMsXG4gICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICd0aGUgbmFtZSBvZiB0aGUgbWVtb3J5IHRvIG9wZXJhdGUgb24nXG4gICAgKTtcblxuICAgIC8vIEdldCB0aGUgbWVtb3J5IGluc3RhbmNlIGJ5IG5hbWUgdXNpbmcgZmluZCgpXG4gICAgLy8gTWVtb3J5IG5hbWUgaXMgc3RvcmVkIGluIG1ldGFkYXRhLm5hbWVcbiAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCBtYW5hZ2VyLmZpbmQobSA9PiBtLm1ldGFkYXRhLm5hbWUgPT09IG1lbW9yeU5hbWUpO1xuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lbW9yeSAnJHttZW1vcnlOYW1lfScgbm90IGZvdW5kLiBVc2UgbGlzdF9lbGVtZW50cyB0byBzZWUgYXZhaWxhYmxlIG1lbW9yaWVzLmApO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdhZGRFbnRyeSc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZU1lbW9yeUFkZEVudHJ5KG1lbW9yeU5hbWUsIG1lbW9yeSwgbWFuYWdlciwgcGFyYW1zKTtcblxuICAgICAgY2FzZSAnY2xlYXInOiB7XG4gICAgICAgIC8vIElzc3VlICMyMzI5OiBjYW5jZWwgYW55IHBlbmRpbmcgZGVib3VuY2VkIHNhdmUgZmlyc3Qg4oCUIGEgc3RhbGUgdGltZXJcbiAgICAgICAgLy8gZmlyaW5nIGFmdGVyIHRoZSBjbGVhciB3b3VsZCByZXN1cnJlY3QgdGhlIHByZS1jbGVhciBlbnRyaWVzIG9uIGRpc2suXG4gICAgICAgIGNvbnN0IGNsZWFyS2V5ID0gdGhpcy5tZW1vcnlTYXZlS2V5KG1lbW9yeU5hbWUpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2xlYXIgPSB0aGlzLnBlbmRpbmdTYXZlcy5nZXQoY2xlYXJLZXkpO1xuICAgICAgICBpZiAocGVuZGluZ0NsZWFyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHBlbmRpbmdDbGVhci50aW1lcik7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZXMuZGVsZXRlKGNsZWFyS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNZW1vcnkuY2xlYXJBbGwoY29uZmlybSkgLSByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb25cbiAgICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBhd2FpdCBtZW1vcnkuY2xlYXJBbGwodHJ1ZSk7XG4gICAgICAgIC8vIEZpeCAjNDM4OiBQZXJzaXN0IHRvIGRpc2sgc28gY2xlYXJlZCBzdGF0ZSBzdXJ2aXZlcyByZXN0YXJ0LlxuICAgICAgICAvLyBUcmFja2VkIHNvIGEgc3VjY2VzcyBjbGVhcnMgYW55IHN0YWxlIGZhaWx1cmUgcmVjb3JkIGZvciB0aGlzIG1lbW9yeS5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlTWVtb3J5VHJhY2tlZChjbGVhcktleSwgbWVtb3J5LCBtYW5hZ2VyKTtcbiAgICAgICAgcmV0dXJuIGNsZWFyUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gTWVtb3J5IG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpeCAjMzg3OiByZXNvbHZlIHRoZSBhZGRFbnRyeSAnY29udGVudCcgcGFyYW1ldGVyLCBhY2NlcHRpbmcgJ2VudHJ5JyBhcyBhblxuICAgKiBhbGlhcyBhbmQgdGhyb3dpbmcgYSBjb250ZXh0dWFsIGVycm9yIHdoZW4gdGhlIHRleHQgcG9ydGlvbiBpcyBtaXNzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0QWRkRW50cnlDb250ZW50KG1lbW9yeU5hbWU6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgaWYgKHBhcmFtcy5lbnRyeSAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5jb250ZW50ID0gcGFyYW1zLmVudHJ5O1xuICAgIH1cbiAgICAvLyBGaXggIzM4NyBPcHRpb24gRDogQ29udGV4dHVhbCBlcnJvciBtZXNzYWdlIGd1aWRpbmcgdG93YXJkIGNvcnJlY3QgcGFyYW1ldGVyXG4gICAgaWYgKHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvbnRlbnQgPT09IG51bGwgfHwgdHlwZW9mIHBhcmFtcy5jb250ZW50ICE9PSAnc3RyaW5nJyB8fCAocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb25zdCBoaW50ID0gcGFyYW1zLmVudHJ5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBgWW91IHBhc3NlZCAnZW50cnknLCBidXQgYW4gZW50cnkgaXMgdGhlIGZ1bGwgb2JqZWN0IChjb250ZW50ICsgdGFncyArIG1ldGFkYXRhICsgdGltZXN0YW1wKS4gYCArXG4gICAgICAgICAgYFVzZSAnY29udGVudCcgdG8gcHJvdmlkZSB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBlbnRyeS5gXG4gICAgICAgIDogYFRoZSAnY29udGVudCcgcGFyYW1ldGVyIGlzIHRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG1lbW9yeSBlbnRyeS5gO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnRlbnQnLiAke2hpbnR9IGAgK1xuICAgICAgICBgRXhhbXBsZTogeyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCIke21lbW9yeU5hbWV9XCIsIGNvbnRlbnQ6IFwieW91ciB0ZXh0IGhlcmVcIiwgdGFnczogW1wib3B0aW9uYWxcIl0gfSB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcy5jb250ZW50IGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGRFbnRyeSB3aXRoIHRoZSAjMjMyOSBwZXJzaXN0ZW5jZSBndWFyYW50ZWVzOiByZWNvdmVyIGZyb20gYSBwcmlvciBmYWlsZWRcbiAgICogc2F2ZSwgbXV0YXRlIHRoZSBhdXRob3JpdGF0aXZlIGluc3RhbmNlLCB2ZXJpZnkgcGVyc2lzdGFiaWxpdHkgYmVmb3JlXG4gICAqIHJlcG9ydGluZyBzdWNjZXNzIChyb2xsaW5nIGJhY2sgb24gZmFpbHVyZSksIHRoZW4gc2NoZWR1bGUgdGhlIGRlYm91bmNlZCBzYXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNZW1vcnlBZGRFbnRyeShcbiAgICBtZW1vcnlOYW1lOiBzdHJpbmcsXG4gICAgbWVtb3J5OiBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcycpLk1lbW9yeSxcbiAgICBtYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmV4dHJhY3RBZGRFbnRyeUNvbnRlbnQobWVtb3J5TmFtZSwgcGFyYW1zKTtcbiAgICBjb25zdCB0YWdzID0gcGFyYW1zLnRhZ3MgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJhbXMubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBJc3N1ZSAjMjMyOTogb3BlcmF0ZSBvbiB0aGUgYXV0aG9yaXRhdGl2ZSBpbnN0YW5jZS4gVW5wZXJzaXN0ZWQgZW50cmllc1xuICAgIC8vIGxpdmUgb25seSBpbiB0aGUgaW5zdGFuY2UgaGVsZCBieSB0aGUgZmFpbHVyZSBsZWRnZXIgb3IgYSBwZW5kaW5nXG4gICAgLy8gZGVib3VuY2VkIHNhdmU7IGFmdGVyIGNhY2hlIGV2aWN0aW9uIGZpbmQoKSByZWxvYWRzIGEgZnJlc2ggY29weSBmcm9tXG4gICAgLy8gZGlzayB0aGF0IGxhY2tzIHRoZW0sIGFuZCB3cml0aW5nIHRocm91Z2ggdGhhdCBjb3B5IHdvdWxkIGNsb2JiZXIgdGhlXG4gICAgLy8gcmVjb3ZlcmVkIHN0YXRlLlxuICAgIGNvbnN0IHNhdmVLZXkgPSB0aGlzLm1lbW9yeVNhdmVLZXkobWVtb3J5TmFtZSk7XG4gICAgY29uc3QgcHJpb3JGYWlsdXJlID0gdGhpcy5mYWlsZWRNZW1vcnlTYXZlcy5nZXQoc2F2ZUtleSk7XG4gICAgY29uc3QgdGFyZ2V0TWVtb3J5ID0gcHJpb3JGYWlsdXJlPy5tZW1vcnkgPz8gdGhpcy5wZW5kaW5nU2F2ZXMuZ2V0KHNhdmVLZXkpPy5tZW1vcnkgPz8gbWVtb3J5O1xuXG4gICAgLy8gSXNzdWUgIzIzMjk6IGlmIGEgcHJldmlvdXMgc2F2ZSBvZiB0aGlzIG1lbW9yeSBmYWlsZWQgKGUuZy4gZGlzayBlcnJvciksXG4gICAgLy8gcmVjb3ZlciBiZWZvcmUgYWNjZXB0aW5nIG1vcmUgZW50cmllcyDigJQgb3RoZXJ3aXNlIHRoZXkgcGlsZSB1cCBpbiBSQU1cbiAgICAvLyBiZWhpbmQgdGhlIHNhbWUgZmFpbHVyZSBhbmQgYXJlIGxvc3Qgb24gcmVzdGFydC5cbiAgICBpZiAocHJpb3JGYWlsdXJlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVNZW1vcnlUcmFja2VkKHNhdmVLZXksIHRhcmdldE1lbW9yeSwgcHJpb3JGYWlsdXJlLm1hbmFnZXIpO1xuICAgICAgfSBjYXRjaCAocmV0cnlFcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFbnRyeSBOT1Qgc2F2ZWQ6IG1lbW9yeSAnJHttZW1vcnlOYW1lfScgaGFzIHVucGVyc2lzdGVkIGVudHJpZXMgZnJvbSBhbiBlYXJsaWVyIHNhdmUgZmFpbHVyZSBgICtcbiAgICAgICAgICBgKCR7cHJpb3JGYWlsdXJlLmVycm9yLm1lc3NhZ2V9KSBhbmQgdGhlIHJldHJ5IGFsc28gZmFpbGVkOiBgICtcbiAgICAgICAgICBgJHtyZXRyeUVyciBpbnN0YW5jZW9mIEVycm9yID8gcmV0cnlFcnIubWVzc2FnZSA6IHJldHJ5RXJyfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzQmVmb3JlID0gdGFyZ2V0TWVtb3J5LmdldEVudHJpZXMoKS5zaXplO1xuICAgIGNvbnN0IGVudHJ5UmVzdWx0ID0gYXdhaXQgdGFyZ2V0TWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3MsIG1ldGFkYXRhKTtcblxuICAgIC8vIElzc3VlICMyMzI5OiB2ZXJpZnkgdGhlIG1lbW9yeSBjYW4gc3RpbGwgYmUgcGVyc2lzdGVkIEJFRk9SRSByZXBvcnRpbmdcbiAgICAvLyBzdWNjZXNzLiBUaGUgZGlzayB3cml0ZSBiZWxvdyBpcyBkZWZlcnJlZCAoZGVib3VuY2VkKSwgc28gYSB2YWxpZGF0aW9uXG4gICAgLy8gZmFpbHVyZSB0aGVyZSBjYW4gbmV2ZXIgcmVhY2ggdGhlIGNhbGxlciDigJQgZW50cmllcyB3ZXJlIGFja25vd2xlZGdlZFxuICAgIC8vIHdpdGggYW4gaWQgYW5kIHRoZW4gc2lsZW50bHkgbG9zdCB3aGVuIHRoZSBtZW1vcnkgb3V0Z3JldyBzYXZlIGxpbWl0cy5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWFuYWdlci5hc3NlcnRQZXJzaXN0YWJsZSh0YXJnZXRNZW1vcnkpO1xuICAgIH0gY2F0Y2ggKHZhbGlkYXRpb25FcnIpIHtcbiAgICAgIHRhcmdldE1lbW9yeS5yZW1vdmVFbnRyeShlbnRyeVJlc3VsdC5pZCk7XG4gICAgICAvLyBhZGRFbnRyeSBtYXkgaGF2ZSBldmljdGVkIG9sZCBlbnRyaWVzIChyZXRlbnRpb24vY2FwYWNpdHkgcG9saWN5KVxuICAgICAgLy8gYmVmb3JlIHZhbGlkYXRpb24gZmFpbGVkLiBUaGUgZXZpY3Rpb24gc3RhbmRzIOKAlCBpdCB3b3VsZCBoYXBwZW4gb25cbiAgICAgIC8vIGFueSBmdXR1cmUgc3VjY2Vzc2Z1bCBhZGQg4oCUIGJ1dCBpdCBtdXN0IHJlYWNoIGRpc2ssIG9yIFJBTSBhbmQgZGlza1xuICAgICAgLy8gc2lsZW50bHkgZGl2ZXJnZSB3aXRoIG5vIHNhdmUgc2NoZWR1bGVkLlxuICAgICAgaWYgKHRhcmdldE1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSAhPT0gZW50cmllc0JlZm9yZSkge1xuICAgICAgICB0aGlzLmRlYm91bmNlZE1lbW9yeVNhdmUobWVtb3J5TmFtZSwgdGFyZ2V0TWVtb3J5LCBtYW5hZ2VyKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEVudHJ5IE5PVCBzYXZlZCB0byBtZW1vcnkgJyR7bWVtb3J5TmFtZX0nOiBgICtcbiAgICAgICAgYCR7dmFsaWRhdGlvbkVyciBpbnN0YW5jZW9mIEVycm9yID8gdmFsaWRhdGlvbkVyci5tZXNzYWdlIDogdmFsaWRhdGlvbkVycn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2NTc6IFRyYWNrIHNhdmUgZnJlcXVlbmN5IGFuZCBhbGVydCBvbiBhbm9tYWxvdXMgcGF0dGVybnMuXG4gICAgdGhpcy50cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZSk7XG4gICAgLy8gSXNzdWUgIzY1NjogRGVib3VuY2Ugc2F2ZXMgdG8gcHJldmVudCBGRCBleGhhdXN0aW9uIGZyb20gcmFwaWQgYWRkRW50cnkgY2FsbHMuXG4gICAgLy8gVGhlIGVudHJ5IGlzIGFscmVhZHkgaW4gbWVtb3J5IOKAlCBkaXNrIHdyaXRlIGlzIGRlZmVycmVkIGFuZCBjb2FsZXNjZWQuXG4gICAgdGhpcy5kZWJvdW5jZWRNZW1vcnlTYXZlKG1lbW9yeU5hbWUsIHRhcmdldE1lbW9yeSwgbWFuYWdlcik7XG4gICAgLy8gRW50cnkgcHJvc2UgYmVnaW5zIGFzIFVOVFJVU1RFRCBhbmQgaXMgdmFsaWRhdGVkIGFzeW5jaHJvbm91c2x5LiBSZXR1cm5cbiAgICAvLyBvbmx5IHNlcnZlci1nZW5lcmF0ZWQgcmVjZWlwdCBmaWVsZHMgc28gdGhlIG11dGF0aW9uIHJlc3BvbnNlIGNhbm5vdFxuICAgIC8vIGJ5cGFzcyB0aGUgc2FuZGJveCB1c2VkIHdoZW4gbWVtb3J5IGNvbnRlbnQgaXMgcmVuZGVyZWQgbGF0ZXIuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBlbnRyeVJlc3VsdC5pZCxcbiAgICAgIHRpbWVzdGFtcDogZW50cnlSZXN1bHQudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICB0cnVzdExldmVsOiBlbnRyeVJlc3VsdC50cnVzdExldmVsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQWdlbnQgb3BlcmF0aW9ucyB0byBBZ2VudE1hbmFnZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hBZ2VudChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgY29uc3QgYWdlbnROYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgIHBhcmFtcyxcbiAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBhZ2VudCB0byBleGVjdXRlJ1xuICAgICk7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnZXhlY3V0ZSc6XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmV4ZWN1dGVBZ2VudChcbiAgICAgICAgICBhZ2VudE5hbWUsXG4gICAgICAgICAgcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEFnZW50IG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIFRlbXBsYXRlIG9wZXJhdGlvbnMgdG8gVGVtcGxhdGVSZW5kZXJlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFRlbXBsYXRlKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmhhbmRsZXJzLnRlbXBsYXRlUmVuZGVyZXI7XG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXJcbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICBwYXJhbXMsXG4gICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICd0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyJ1xuICAgICk7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncmVuZGVyJzpcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlcihcbiAgICAgICAgICB0ZW1wbGF0ZU5hbWUsXG4gICAgICAgICAgcGFyYW1zLnZhcmlhYmxlcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICBwYXJhbXMuc2VjdGlvbiBhcyAndGVtcGxhdGUnIHwgJ3N0eWxlJyB8ICdzY3JpcHQnIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhcmFtcy5hbGxfc2VjdGlvbnMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gVGVtcGxhdGUgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQWN0aXZhdGlvbiBvcGVyYXRpb25zIChjcm9zcy1jdXR0aW5nIGNvbmNlcm4pXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQWN0aXZhdGlvbihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZS9lbGVtZW50X3R5cGUgcGFyYW1ldGVyIG5hbWVzXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgcGFyYW1ldGVycyBiZWZvcmUgdXNlXG4gICAgLy8gRm9yIGdldEFjdGl2ZSwgZWxlbWVudF9uYW1lIGlzIG5vdCByZXF1aXJlZFxuICAgIGlmIChtZXRob2QgIT09ICdnZXRBY3RpdmUnKSB7XG4gICAgICBjb25zdCBuYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgcCxcbiAgICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAgICd0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlJ1xuICAgICAgKTtcblxuICAgICAgLy8gZWxlbWVudF90eXBlIGNhbiBjb21lIGZyb20gaW5wdXQuZWxlbWVudFR5cGUgb3IgcGFyYW1zLmVsZW1lbnRfdHlwZVxuICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnRUeXBlIHx8IChwLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnZWxlbWVudF90eXBlJy4gRXhwZWN0ZWQ6IHN0cmluZyAocGVyc29uYSwgc2tpbGwsIHRlbXBsYXRlLCBhZ2VudCwgbWVtb3J5LCBvciBlbnNlbWJsZSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgIGNhc2UgJ2FjdGl2YXRlJzpcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHAuY29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgY2FzZSAnZGVhY3RpdmF0ZSc6XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIuZGVhY3RpdmF0ZUVsZW1lbnQobmFtZSwgdHlwZSk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQWN0aXZhdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldEFjdGl2ZTogZWxlbWVudF90eXBlIGlzIG9wdGlvbmFsIC0gaWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIGFsbCBhY3RpdmUgZWxlbWVudHNcbiAgICAvLyBJc3N1ZSAjNTAxOiBQYXNzIHR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkIOKAlCBnZXRBY3RpdmVFbGVtZW50cyBoYW5kbGVzIGJvdGggY2FzZXNcbiAgICBjb25zdCB0eXBlID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIGhhbmRsZXIuZ2V0QWN0aXZlRWxlbWVudHModHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggU2VhcmNoIG9wZXJhdGlvbnMgdG8gRWxlbWVudFF1ZXJ5U2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFNlYXJjaChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBxdWVyeVNlcnZpY2UgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRRdWVyeVNlcnZpY2U7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2VhcmNoRWxlbWVudHMoaW5wdXQpO1xuXG4gICAgICBjYXNlICdxdWVyeSc6IHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudFR5cGUgaXMgcmVxdWlyZWQgZm9yIHF1ZXJ5XG4gICAgICAgIGlmICghZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnRUeXBlIGlzIHJlcXVpcmVkIGZvciBxdWVyeV9lbGVtZW50cyBvcGVyYXRpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCByYXcgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIChjYXN0IHRvIElFbGVtZW50W10gZm9yIHF1ZXJ5IHNlcnZpY2UpXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gKGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0RWxlbWVudHMoZWxlbWVudFR5cGUpKSBhcyBJRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIEJ1aWxkIFF1ZXJ5T3B0aW9ucyBmcm9tIHBhcmFtc1xuICAgICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zdCBxdWVyeU9wdGlvbnM6IHtcbiAgICAgICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgc29ydD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIHBhZ2luYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBhZ2dyZWdhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgIGlmIChwLmZpbHRlcnMpIHtcbiAgICAgICAgICBxdWVyeU9wdGlvbnMuZmlsdGVycyA9IHAuZmlsdGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5zb3J0KSB7XG4gICAgICAgICAgcXVlcnlPcHRpb25zLnNvcnQgPSBwLnNvcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAucGFnaW5hdGlvbikge1xuICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5wYWdpbmF0aW9uID0gcC5wYWdpbmF0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFnZ3JlZ2F0aW9uIHJlcXVlc3RzIChJc3N1ZSAjMzA5KSDigJQgZGVsZWdhdGVzIHRvIHNoYXJlZCBBZ2dyZWdhdGlvblNlcnZpY2VcbiAgICAgICAgaWYgKHAuYWdncmVnYXRlKSB7XG4gICAgICAgICAgY29uc3QgYWdncmVnYXRlID0gcC5hZ2dyZWdhdGUgYXMgeyBjb3VudD86IGJvb2xlYW47IGdyb3VwX2J5Pzogc3RyaW5nIH07XG5cbiAgICAgICAgICAvLyBWYWxpZGF0ZSBhZ2dyZWdhdGlvbiBvcHRpb25zXG4gICAgICAgICAgY29uc3QgYWdnRXJyb3IgPSB2YWxpZGF0ZUFnZ3JlZ2F0aW9uT3B0aW9ucyhhZ2dyZWdhdGUpO1xuICAgICAgICAgIGlmIChhZ2dFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFnZ0Vycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWdncmVnYXRlRWxlbWVudHMoXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgYWdncmVnYXRlLFxuICAgICAgICAgICAgcXVlcnlPcHRpb25zLmZpbHRlcnMgYXMgYW55XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM1MDA6IE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIChwYWdlU2l6ZSwgcGFnZSwgbGltaXQsIG9mZnNldClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGZsYXQgcGFyYW1zIGxpa2UgeyBwYWdlU2l6ZTogNSB9IHdvcmsgdGhlIHNhbWUgYXMgeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1IH0gfVxuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFnaW5hdGlvbiA9IG5vcm1hbGl6ZVBhZ2luYXRpb25QYXJhbXMocCk7XG4gICAgICAgIHF1ZXJ5T3B0aW9ucy5wYWdpbmF0aW9uID0gbm9ybWFsaXplZFBhZ2luYXRpb247XG5cbiAgICAgICAgLy8gRXhlY3V0ZSBxdWVyeSB3aXRoIEVsZW1lbnRRdWVyeVNlcnZpY2VcbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBxdWVyeVNlcnZpY2UucXVlcnkoZWxlbWVudHMsIHF1ZXJ5T3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUmV0dXJuIGNvbmNpc2Ugc3RydWN0dXJlZCByZXNwb25zZSAoSXNzdWUgIzI5OSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpdGVtczogcXVlcnlSZXN1bHQuaXRlbXMubWFwKChpdGVtOiBJRWxlbWVudCkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGl0ZW0ubWV0YWRhdGE/Lm5hbWUgfHwgJ1Vua25vd24nLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGl0ZW0ubWV0YWRhdGE/LmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBpdGVtLm1ldGFkYXRhPy52ZXJzaW9uIHx8IGl0ZW0udmVyc2lvbixcbiAgICAgICAgICAgIHRhZ3M6IGl0ZW0ubWV0YWRhdGE/LnRhZ3MsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHBhZ2luYXRpb246IHF1ZXJ5UmVzdWx0LnBhZ2luYXRpb24sXG4gICAgICAgICAgc29ydGluZzogcXVlcnlSZXN1bHQuc29ydGluZyxcbiAgICAgICAgICBmaWx0ZXJzOiBxdWVyeVJlc3VsdC5maWx0ZXJzLmFwcGxpZWQuY291bnQgPiAwID8geyBhcHBsaWVkOiBxdWVyeVJlc3VsdC5maWx0ZXJzLmFwcGxpZWQgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gU2VhcmNoIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTk9URTogVW5pZmllZCBTZWFyY2ggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MykgYXJlIG5vdyBzY2hlbWEtZHJpdmVuLlxuICAvLyBUaGUgJ3NlYXJjaCcgb3BlcmF0aW9uIHVzZXMgdGhlICdzZWFyY2hQYXJhbXMnIG5vcm1hbGl6ZXIgaW4gT3BlcmF0aW9uU2NoZW1hLnRzLlxuICAvLyBTZWU6IFNlYXJjaFBhcmFtc05vcm1hbGl6ZXIgZm9yIHNjb3BlL3BhZ2luYXRpb24vc29ydC9maWx0ZXIgdHJhbnNmb3JtYXRpb24uXG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEludHJvc3BlY3Rpb24gb3BlcmF0aW9ucyB0byBJbnRyb3NwZWN0aW9uUmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hJbnRyb3NwZWN0aW9uKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3Jlc29sdmUnOlxuICAgICAgICByZXR1cm4gSW50cm9zcGVjdGlvblJlc29sdmVyLnJlc29sdmUocGFyYW1zKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEludHJvc3BlY3Rpb24gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGVsZW1lbnRzIGFjcm9zcyBvbmUgb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICpcbiAgICogSW1wbGVtZW50cyBzaW1wbGUgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgbWF0Y2hpbmcgb246XG4gICAqIC0gbWV0YWRhdGEubmFtZVxuICAgKiAtIG1ldGFkYXRhLmRlc2NyaXB0aW9uXG4gICAqIC0gY29udGVudCAoaWYgYXZhaWxhYmxlKVxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcHRpb25hbCBlbGVtZW50VHlwZSBhbmQgc2VhcmNoIHBhcmFtc1xuICAgKiBAcmV0dXJucyBTZWFyY2ggcmVzdWx0cyB3aXRoIG1hdGNoZWQgZWxlbWVudHMgYW5kIHJlbGV2YW5jZSBpbmZvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlYXJjaEVsZW1lbnRzKGlucHV0OiBPcGVyYXRpb25JbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHNlYXJjaFN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgbWVtb3J5QmVmb3JlID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkO1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBxdWVyeSA9IChwLnF1ZXJ5IGFzIHN0cmluZyk/LnRyaW0oKTtcblxuICAgIC8vIElzc3VlICM1MDA6IE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIChwYWdlU2l6ZSwgcGFnZSwgbGltaXQsIG9mZnNldClcbiAgICBjb25zdCB7IHBhZ2UsIHBhZ2VTaXplIH0gPSBub3JtYWxpemVQYWdpbmF0aW9uUGFyYW1zKHApO1xuXG4gICAgLy8gRXh0cmFjdCBzb3J0IHBhcmFtc1xuICAgIGNvbnN0IHNvcnRQYXJhbSA9IHAuc29ydCBhcyB7IHNvcnRCeT86IHN0cmluZzsgc29ydE9yZGVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc29ydEJ5ID0gc29ydFBhcmFtPy5zb3J0QnkgPz8gJ25hbWUnO1xuICAgIGNvbnN0IHNvcnRPcmRlciA9IChzb3J0UGFyYW0/LnNvcnRPcmRlciA/PyAnYXNjJykgYXMgJ2FzYycgfCAnZGVzYyc7XG5cbiAgICAvLyBJbnB1dCB2YWxpZGF0aW9uIHdpdGggbGVuZ3RoIGxpbWl0XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VhcmNoIHF1ZXJ5IG11c3QgYmUgdW5kZXIgMTAwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGVsZW1lbnQgdHlwZXMgdG8gc2VhcmNoIChJc3N1ZSAjNDMzOiBhY2NlcHQgc2luZ3VsYXIgZm9ybXMpXG4gICAgbGV0IGVsZW1lbnRUeXBlczogc3RyaW5nW107XG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpO1xuICAgICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7ZWxlbWVudFR5cGV9Jy4gVmFsaWQgdHlwZXM6ICR7Zm9ybWF0RWxlbWVudFR5cGVzTGlzdCgpfWApO1xuICAgICAgfVxuICAgICAgZWxlbWVudFR5cGVzID0gW25vcm1hbGl6ZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50VHlwZXMgPSBbLi4uQUxMX0VMRU1FTlRfVFlQRVNdO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFJlc3VsdHM6IEFycmF5PHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBtYXRjaGVkSW46IHN0cmluZ1tdO1xuICAgIH0+ID0gW107XG5cbiAgICAvLyBDb2xsZWN0IEFMTCBtYXRjaGVzIChubyBlYXJseSB0ZXJtaW5hdGlvbiDigJQgcGFnaW5hdGlvbiBoYW5kbGVzIGxpbWl0aW5nKVxuICAgIGZvciAoY29uc3QgdHlwZSBvZiBlbGVtZW50VHlwZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50cyh0eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZEluOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gKGVsZW1lbnQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgbmFtZSBtYXRjaFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSAobWV0YWRhdGEubmFtZSBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgICAgIGlmIChuYW1lICYmIGlzU2VhcmNoTWF0Y2gocXVlcnksIG5hbWUpKSB7XG4gICAgICAgICAgICBtYXRjaGVkSW4ucHVzaCgnbmFtZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGRlc2NyaXB0aW9uIG1hdGNoXG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAobWV0YWRhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nKSB8fCAnJztcbiAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gJiYgaXNTZWFyY2hNYXRjaChxdWVyeSwgZGVzY3JpcHRpb24pKSB7XG4gICAgICAgICAgICBtYXRjaGVkSW4ucHVzaCgnZGVzY3JpcHRpb24nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBjb250ZW50IG1hdGNoIChpZiBhdmFpbGFibGUpXG4gICAgICAgICAgaWYgKGVsZW1lbnQuY29udGVudCAmJiB0eXBlb2YgZWxlbWVudC5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGlzU2VhcmNoTWF0Y2gocXVlcnksIGVsZW1lbnQuY29udGVudCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCdjb250ZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYW55IG1hdGNoZXMgZm91bmQsIGFkZCB0byByZXN1bHRzXG4gICAgICAgICAgLy8gVXNlICduYW1lJyBoZXJlIOKAlCBGSUVMRF9UUkFOU0ZPUk1TIHdpbGwgcmVuYW1lIHRvICdlbGVtZW50X25hbWUnIGluIGFwcGx5RmllbGRTZWxlY3Rpb25cbiAgICAgICAgICBpZiAobWF0Y2hlZEluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFsbFJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBtYXRjaGVkSW4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNraXAgZWxlbWVudCB0eXBlcyB0aGF0IGZhaWwgdG8gbG9hZFxuICAgICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBsb2FkIGVsZW1lbnRzIGZvciBzZWFyY2g6ICR7dHlwZX1gLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlY29yZCBzZWFyY2ggbWV0cmljcyB2aWEgUGVyZm9ybWFuY2VNb25pdG9yXG4gICAgdGhpcy5oYW5kbGVycy5wZXJmb3JtYW5jZU1vbml0b3I/LnJlY29yZFNlYXJjaCh7XG4gICAgICBxdWVyeSxcbiAgICAgIGR1cmF0aW9uOiBwZXJmb3JtYW5jZS5ub3coKSAtIHNlYXJjaFN0YXJ0LFxuICAgICAgcmVzdWx0Q291bnQ6IGFsbFJlc3VsdHMubGVuZ3RoLFxuICAgICAgc291cmNlczogZWxlbWVudFR5cGVzLFxuICAgICAgY2FjaGVIaXQ6IGZhbHNlLFxuICAgICAgbWVtb3J5QmVmb3JlLFxuICAgICAgbWVtb3J5QWZ0ZXI6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICB9KTtcblxuICAgIC8vIFNvcnQgcmVzdWx0cyAoY3VycmVudGx5IG9ubHkgJ25hbWUnIGlzIHN1cHBvcnRlZCBhcyBhIHNvcnQgZmllbGQpXG4gICAgY29uc3Qgc29ydGVkUmVzdWx0cyA9IFsuLi5hbGxSZXN1bHRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBjbXAgPSBhLm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJyA/IC1jbXAgOiBjbXA7XG4gICAgfSk7XG5cbiAgICAvLyBQYWdpbmF0ZSB2aWEgUGFnaW5hdGlvblNlcnZpY2VcbiAgICBjb25zdCBwYWdpbmF0b3IgPSBuZXcgUGFnaW5hdGlvblNlcnZpY2UoKTtcbiAgICBjb25zdCBwYWdpbmF0ZWQgPSBwYWdpbmF0b3IucGFnaW5hdGUoc29ydGVkUmVzdWx0cywgeyBwYWdlLCBwYWdlU2l6ZSB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcGFnaW5hdGVkLml0ZW1zLFxuICAgICAgcGFnaW5hdGlvbjogcGFnaW5hdGVkLnBhZ2luYXRpb24sXG4gICAgICBzb3J0aW5nOiB7IHNvcnRCeSwgc29ydE9yZGVyIH0sXG4gICAgICBxdWVyeSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNQ1AtQVFMIEV4dGVuc2lvbiBEaXNwYXRjaCBNZXRob2RzIChJc3N1ZSAjMjQxKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIENvbGxlY3Rpb24gb3BlcmF0aW9ucyB0byBDb2xsZWN0aW9uSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaENvbGxlY3Rpb24oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5jb2xsZWN0aW9uSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IENvbGxlY3Rpb25IYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2Jyb3dzZSc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmJyb3dzZUNvbGxlY3Rpb24oXG4gICAgICAgICAgcGFyYW1zLnNlY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhcmFtcy50eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hDb2xsZWN0aW9uKHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcpO1xuXG4gICAgICBjYXNlICdzZWFyY2hFbmhhbmNlZCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaENvbGxlY3Rpb25FbmhhbmNlZChwYXJhbXMucXVlcnkgYXMgc3RyaW5nLCBwYXJhbXMpO1xuXG4gICAgICBjYXNlICdnZXRDb250ZW50JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNvbnRlbnQocGFyYW1zLnBhdGggYXMgc3RyaW5nKTtcblxuICAgICAgY2FzZSAnZ2V0Q2FjaGVIZWFsdGgnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDb2xsZWN0aW9uQ2FjaGVIZWFsdGgoKTtcblxuICAgICAgY2FzZSAnaW5zdGFsbCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmluc3RhbGxDb250ZW50KHBhcmFtcy5wYXRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnN1Ym1pdENvbnRlbnQocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIENvbGxlY3Rpb24gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggUG9ydGZvbGlvIG9wZXJhdGlvbnMgdG8gUG9ydGZvbGlvSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFBvcnRmb2xpbyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnBvcnRmb2xpb0hhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IFBvcnRmb2xpb0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc3RhdHVzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIucG9ydGZvbGlvU3RhdHVzKHBhcmFtcy51c2VybmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gICAgICBjYXNlICdpbml0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW5pdFBvcnRmb2xpbyh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHBhcmFtcy5yZXBvc2l0b3J5X25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHByaXZhdGU6IHBhcmFtcy5wcml2YXRlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHBhcmFtcy5kZXNjcmlwdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdjb25maWcnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5wb3J0Zm9saW9Db25maWcoe1xuICAgICAgICAgIGF1dG9TeW5jOiBwYXJhbXMuYXV0b19zeW5jIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgZGVmYXVsdFZpc2liaWxpdHk6IHBhcmFtcy5kZWZhdWx0X3Zpc2liaWxpdHkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGF1dG9TdWJtaXQ6IHBhcmFtcy5hdXRvX3N1Ym1pdCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiBwYXJhbXMucmVwb3NpdG9yeV9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3N5bmMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zeW5jUG9ydGZvbGlvKHtcbiAgICAgICAgICBkaXJlY3Rpb246IChwYXJhbXMuZGlyZWN0aW9uIGFzIHN0cmluZykgfHwgJ3B1c2gnLFxuICAgICAgICAgIG1vZGU6IHBhcmFtcy5tb2RlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBmb3JjZTogcGFyYW1zLmZvcmNlIGFzIGJvb2xlYW4gfHwgZmFsc2UsXG4gICAgICAgICAgZHJ5UnVuOiBwYXJhbXMuZHJ5X3J1biBhcyBib29sZWFuIHx8IGZhbHNlLFxuICAgICAgICAgIGNvbmZpcm1EZWxldGlvbnM6IHBhcmFtcy5jb25maXJtX2RlbGV0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoUG9ydGZvbGlvKHtcbiAgICAgICAgICBxdWVyeTogcGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1enp5TWF0Y2g6IHBhcmFtcy5mdXp6eV9tYXRjaCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFJlc3VsdHM6IHBhcmFtcy5tYXhfcmVzdWx0cyBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZUtleXdvcmRzOiBwYXJhbXMuaW5jbHVkZV9rZXl3b3JkcyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGluY2x1ZGVUYWdzOiBwYXJhbXMuaW5jbHVkZV90YWdzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZVRyaWdnZXJzOiBwYXJhbXMuaW5jbHVkZV90cmlnZ2VycyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGluY2x1ZGVEZXNjcmlwdGlvbnM6IHBhcmFtcy5pbmNsdWRlX2Rlc2NyaXB0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoQWxsJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQWxsKHtcbiAgICAgICAgICBxdWVyeTogcGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyxcbiAgICAgICAgICBzb3VyY2VzOiBwYXJhbXMuc291cmNlcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhZ2U6IHBhcmFtcy5wYWdlIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYWdlU2l6ZTogcGFyYW1zLnBhZ2Vfc2l6ZSBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgc29ydEJ5OiBwYXJhbXMuc29ydF9ieSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdlbGVtZW50TWFuYWdlcic6IHtcbiAgICAgICAgY29uc3Qgc3luY0hhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnN5bmNIYW5kbGVyO1xuICAgICAgICBpZiAoIXN5bmNIYW5kbGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW8gZWxlbWVudCBtYW5hZ2VyIG5vdCBhdmFpbGFibGU6IFN5bmNIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN5bmNIYW5kbGVyLmhhbmRsZVN5bmNPcGVyYXRpb24oe1xuICAgICAgICAgIG9wZXJhdGlvbjogcGFyYW1zLm9wZXJhdGlvbiBhcyAnbGlzdC1yZW1vdGUnIHwgJ2Rvd25sb2FkJyB8ICd1cGxvYWQnIHwgJ2NvbXBhcmUnLFxuICAgICAgICAgIGVsZW1lbnRfbmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZWxlbWVudF90eXBlOiBwYXJhbXMuZWxlbWVudF90eXBlIGFzIEVsZW1lbnRUeXBlIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZpbHRlcjogcGFyYW1zLmZpbHRlciBhcyB7IHR5cGU/OiBFbGVtZW50VHlwZTsgYXV0aG9yPzogc3RyaW5nOyB1cGRhdGVkX2FmdGVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG4gICAgICAgICAgb3B0aW9uczogcGFyYW1zLm9wdGlvbnMgYXMgeyBmb3JjZT86IGJvb2xlYW47IGRyeV9ydW4/OiBib29sZWFuOyBpbmNsdWRlX3ByaXZhdGU/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUG9ydGZvbGlvIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEF1dGggb3BlcmF0aW9ucyB0byBHaXRIdWJBdXRoSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEF1dGgoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5hdXRoSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aCBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IEdpdEh1YkF1dGhIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3NldHVwJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2V0dXBHaXRIdWJBdXRoKCk7XG5cbiAgICAgIGNhc2UgJ2NoZWNrJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2hlY2tHaXRIdWJBdXRoKCk7XG5cbiAgICAgIGNhc2UgJ2NsZWFyJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2xlYXJHaXRIdWJBdXRoKCk7XG5cbiAgICAgIGNhc2UgJ2NvbmZpZ3VyZU9BdXRoJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY29uZmlndXJlT0F1dGgocGFyYW1zLmNsaWVudF9pZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gICAgICBjYXNlICdvYXV0aEhlbHBlclN0YXR1cyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldE9BdXRoSGVscGVyU3RhdHVzKHBhcmFtcy52ZXJib3NlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQXV0aCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBDb25maWcgb3BlcmF0aW9ucyB0byBDb25maWdIYW5kbGVyIGFuZCBCdWlsZEluZm9TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQ29uZmlnKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ21hbmFnZSc6IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuY29uZmlnSGFuZGxlcjtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBDb25maWdIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaGFuZGxlQ29uZmlnT3BlcmF0aW9uKHtcbiAgICAgICAgICBhY3Rpb246IHBhcmFtcy5hY3Rpb24gYXMgJ2dldCcgfCAnc2V0JyB8ICdyZXNldCcgfCAnZXhwb3J0JyB8ICdpbXBvcnQnIHwgJ3dpemFyZCcsXG4gICAgICAgICAgc2V0dGluZzogcGFyYW1zLnNldHRpbmcgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHZhbHVlOiBwYXJhbXMudmFsdWUsXG4gICAgICAgICAgc2VjdGlvbjogcGFyYW1zLnNlY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcm1hdDogcGFyYW1zLmZvcm1hdCBhcyAneWFtbCcgfCAnanNvbicgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0QnVpbGRJbmZvJzoge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5oYW5kbGVycy5idWlsZEluZm9TZXJ2aWNlO1xuICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWxkSW5mbyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IEJ1aWxkSW5mb1NlcnZpY2Ugbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgc2VydmljZS5nZXRCdWlsZEluZm8oKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgdGV4dDogc2VydmljZS5mb3JtYXRCdWlsZEluZm8oaW5mbylcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRDYWNoZUJ1ZGdldFJlcG9ydCc6IHtcbiAgICAgICAgY29uc3QgYnVkZ2V0ID0gdGhpcy5oYW5kbGVycy5jYWNoZU1lbW9yeUJ1ZGdldDtcbiAgICAgICAgaWYgKCFidWRnZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlIGJ1ZGdldCBub3QgYXZhaWxhYmxlOiBDYWNoZU1lbW9yeUJ1ZGdldCBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcG9ydCA9IGJ1ZGdldC5nZXRSZXBvcnQoKTtcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICcjIENhY2hlIE1lbW9yeSBCdWRnZXQgUmVwb3J0JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBgKipCdWRnZXQ6KiogJHtyZXBvcnQuYnVkZ2V0TUJ9IE1CYCxcbiAgICAgICAgICBgKipVc2VkOioqICR7cmVwb3J0LnRvdGFsTWVtb3J5TUJ9IE1CICgke3JlcG9ydC51dGlsaXphdGlvblBlcmNlbnR9JSlgLFxuICAgICAgICAgIGAqKlJlZ2lzdGVyZWQgQ2FjaGVzOioqICR7cmVwb3J0LmNhY2hlcy5sZW5ndGh9YCxcbiAgICAgICAgICAnJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlcG9ydC5jYWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxpbmVzLnB1c2goJ3wgQ2FjaGUgfCBFbnRyaWVzIHwgTWVtb3J5IChNQikgfCBIaXQgUmF0ZSB8IExhc3QgQWN0aXZpdHkgfCcpO1xuICAgICAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfCcpO1xuICAgICAgICAgIGZvciAoY29uc3QgYyBvZiByZXBvcnQuY2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpdml0eSA9IGMubGFzdEFjdGl2aXR5TXMgPiAwXG4gICAgICAgICAgICAgID8gYCR7KChEYXRlLm5vdygpIC0gYy5sYXN0QWN0aXZpdHlNcykgLyAxMDAwKS50b0ZpeGVkKDApfXMgYWdvYFxuICAgICAgICAgICAgICA6ICduZXZlcic7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGB8ICR7Yy5uYW1lfSB8ICR7Yy5lbnRyaWVzfSB8ICR7Yy5tZW1vcnlNQn0gfCAkeyhjLmhpdFJhdGUgKiAxMDApLnRvRml4ZWQoMSl9JSB8ICR7YWN0aXZpdHl9IHxgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZXMucHVzaCgnX05vIGNhY2hlcyByZWdpc3RlcmVkLl8nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBsaW5lcy5qb2luKCdcXG4nKVxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBDb25maWcgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRW5oYW5jZWRJbmRleCBvcGVyYXRpb25zIHRvIEVuaGFuY2VkSW5kZXhIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRW5oYW5jZWRJbmRleChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogRW5oYW5jZWRJbmRleEhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnZmluZFNpbWlsYXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5maW5kU2ltaWxhckVsZW1lbnRzKHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAocGFyYW1zLmxpbWl0IGFzIG51bWJlcikgPz8gMTAsXG4gICAgICAgICAgdGhyZXNob2xkOiAocGFyYW1zLnRocmVzaG9sZCBhcyBudW1iZXIpID8/IDAuNSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2dldFJlbGF0aW9uc2hpcHMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50UmVsYXRpb25zaGlwcyh7XG4gICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50X25hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlczogcGFyYW1zLnJlbGF0aW9uc2hpcF90eXBlcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaEJ5VmVyYic6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaEJ5VmVyYih7XG4gICAgICAgICAgdmVyYjogcGFyYW1zLnZlcmIgYXMgc3RyaW5nLFxuICAgICAgICAgIGxpbWl0OiAocGFyYW1zLmxpbWl0IGFzIG51bWJlcikgPz8gMjAsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdnZXRTdGF0cyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldFJlbGF0aW9uc2hpcFN0YXRzKCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBFbmhhbmNlZEluZGV4IG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIFBlcnNvbmEgb3BlcmF0aW9ucyB0byBQZXJzb25hSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFBlcnNvbmEoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5wZXJzb25hSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGVyc29uYSBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IFBlcnNvbmFIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2ltcG9ydCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgc291cmNlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdzb3VyY2UnLFxuICAgICAgICAgICdVUkwgb3IgZmlsZSBwYXRoIHRvIGltcG9ydCBwZXJzb25hIGZyb20nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmltcG9ydFBlcnNvbmEoc291cmNlLCBwYXJhbXMub3ZlcndyaXRlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUGVyc29uYSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hhbGxlbmdlSXNGb3JEZWFkbG9ja1JlbGllZihjaGFsbGVuZ2U6IHsgcmVhc29uOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgY2hhbGxlbmdlPy5yZWFzb24gPT09ICdzdHJpbmcnICYmIGNoYWxsZW5nZS5yZWFzb24uc3RhcnRzV2l0aChERUFETE9DS19SRUxJRUZfUkVBU09OKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNzdWVEZWFkbG9ja1JlbGllZkNoYWxsZW5nZSgpOiB7XG4gICAgcGVuZGluZzogdHJ1ZTtcbiAgICBjaGFsbGVuZ2VfaWQ6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgd2FybmluZzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJpZmljYXRpb24gc3lzdGVtIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbGxlbmdlSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgY29kZSA9IGdlbmVyYXRlRGlzcGxheUNvZGUoKTtcbiAgICBzdG9yZS5zZXQoY2hhbGxlbmdlSWQsIHtcbiAgICAgIGNvZGUsXG4gICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBERUFETE9DS19SRUxJRUZfVElNRU9VVF9NUyxcbiAgICAgIHJlYXNvbjogREVBRExPQ0tfUkVMSUVGX1JFQVNPTixcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uTm90aWZpZXI/LnNob3dDb2RlKGNvZGUsIERFQURMT0NLX1JFTElFRl9ESUFMT0dfUkVBU09OKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5pc3N1ZURlYWRsb2NrUmVsaWVmQ2hhbGxlbmdlJyxcbiAgICAgIGRldGFpbHM6IGBEZWFkbG9jayByZWxpZWYgY2hhbGxlbmdlIGlzc3VlZCBmb3Igc2Vzc2lvbiAke3RoaXMuZ2F0ZWtlZXBlci5zZXNzaW9uSWR9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGNoYWxsZW5nZUlkLFxuICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuZ2F0ZWtlZXBlci5zZXNzaW9uSWQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmc6IHRydWUsXG4gICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgbWVzc2FnZTogJ0RlYWRsb2NrIHJlbGllZiByZXF1aXJlcyBodW1hbiBjb25maXJtYXRpb24uIEEgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gZGlzcGxheWVkIHRvIHRoZSB1c2VyLicsXG4gICAgICB3YXJuaW5nOiAnQ29tcGxldGluZyB0aGlzIGZsb3cgd2lsbCBkZWFjdGl2YXRlIGFsbCBhY3RpdmUgZWxlbWVudHMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gYW5kIGNsZWFyIHBlcnNpc3RlZCBhY3RpdmF0aW9uIHN0YXRlLicsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVEZWFkbG9ja1JlbGllZihjaGFsbGVuZ2VJZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICByZWxlYXNlZDogdHJ1ZTtcbiAgICBjaGFsbGVuZ2VfaWQ6IHN0cmluZztcbiAgICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gICAgYWN0aXZlQmVmb3JlUmVzZXQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZGVhY3RpdmF0ZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICAgIHBlcnNpc3RlZFN0YXRlQ2xlYXJlZDogYm9vbGVhbjtcbiAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICBzYW5kYm94aW5nRWxlbWVudD86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIGFkdmlzb3J5RWxlbWVudHM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgfTtcbiAgICBzbmFwc2hvdEZpbGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvblN0b3JlO1xuICAgIGlmICghc3RvcmUpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAnVmVyaWZpY2F0aW9uIHN5c3RlbSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQpO1xuXG4gICAgY29uc3QgY2hhbGxlbmdlID0gc3RvcmUuZ2V0KGNoYWxsZW5nZUlkKTtcbiAgICBpZiAoIWNoYWxsZW5nZSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9USU1FT1VULFxuICAgICAgICAnRGVhZGxvY2sgcmVsaWVmIGNoYWxsZW5nZSBub3QgZm91bmQuIEl0IG1heSBoYXZlIGV4cGlyZWQgb3IgYWxyZWFkeSBiZWVuIHVzZWQuIFJldHJ5IHJlbGVhc2VfZGVhZGxvY2sgdG8gcmVjZWl2ZSBhIG5ldyBjb2RlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGFsbGVuZ2VJc0ZvckRlYWRsb2NrUmVsaWVmKGNoYWxsZW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAnVGhpcyBjaGFsbGVuZ2UgaXMgbm90IGZvciBkZWFkbG9jayByZWxpZWYuIFVzZSB0aGUgbWF0Y2hpbmcgdmVyaWZpY2F0aW9uIGZsb3cgZm9yIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkID0gc3RvcmUudmVyaWZ5KGNoYWxsZW5nZUlkLCBjb2RlKTtcbiAgICBpZiAoIXZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgJ1ZlcmlmaWNhdGlvbiBmYWlsZWQ6IGluY29ycmVjdCBjb2RlLiBUaGUgY29kZSBoYXMgYmVlbiBjb25zdW1lZCAob25lLXRpbWUgdXNlKS4gUmV0cnkgcmVsZWFzZV9kZWFkbG9jayB0byByZWNlaXZlIGEgbmV3IGNvZGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzZXQgPSBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELnJlbGVhc2VEZWFkbG9jaygpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9TVUNDRUVERUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5jb21wbGV0ZURlYWRsb2NrUmVsaWVmJyxcbiAgICAgIGRldGFpbHM6IGBEZWFkbG9jayByZWxpZWYgY29tcGxldGVkIGZvciBzZXNzaW9uICR7dGhpcy5nYXRla2VlcGVyLnNlc3Npb25JZH1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgY2hhbGxlbmdlSWQsXG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5nYXRla2VlcGVyLnNlc3Npb25JZCxcbiAgICAgICAgZGVhY3RpdmF0ZWRDb3VudDogcmVzZXQuZGVhY3RpdmF0ZWQubGVuZ3RoLFxuICAgICAgICBmYWlsZWRDb3VudDogcmVzZXQuZmFpbGVkLmxlbmd0aCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzbmFwc2hvdFN1ZmZpeCA9IHJlc2V0LnNuYXBzaG90RmlsZVxuICAgICAgPyBgIEEgcmVjb3Zlcnkgc25hcHNob3Qgd2FzIHNhdmVkIHRvICR7cmVzZXQuc25hcHNob3RGaWxlfS5gXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNldC5mYWlsZWQubGVuZ3RoID4gMFxuICAgICAgPyBgRGVhZGxvY2sgcmVsaWVmIGNvbXBsZXRlZCB3aXRoICR7cmVzZXQuZmFpbGVkLmxlbmd0aH0gZGVhY3RpdmF0aW9uIGZhaWx1cmUocykuIFJldmlldyB0aGUgZmFpbGVkIGxpc3QsIGxpa2VseSBkZWFkbG9jayBjYXVzZSwgYW5kIHJlY292ZXJ5IHNuYXBzaG90IGJlZm9yZSByZWFjdGl2YXRpbmcgZWxlbWVudHMuYFxuICAgICAgOiBgRGVhZGxvY2sgcmVsaWVmIGNvbXBsZXRlZC4gQWxsIGFjdGl2ZSBlbGVtZW50cyBmb3IgdGhpcyBzZXNzaW9uIHdlcmUgZGVhY3RpdmF0ZWQgYW5kIHBlcnNpc3RlZCBhY3RpdmF0aW9uIHN0YXRlIHdhcyBjbGVhcmVkLiR7c25hcHNob3RTdWZmaXh9YDtcblxuICAgIHJldHVybiB7XG4gICAgICByZWxlYXNlZDogdHJ1ZSxcbiAgICAgIGNoYWxsZW5nZV9pZDogY2hhbGxlbmdlSWQsXG4gICAgICAuLi5yZXNldCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBHYXRla2VlcGVyIG9wZXJhdGlvbnMgZm9yIGNvbmZpcm1hdGlvbiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBJc3N1ZSAjNDUyOiBIYW5kbGVzIHRoZSBjb25maXJtX29wZXJhdGlvbiBmbG93IHdoZXJlIHVzZXJzIGFwcHJvdmVcbiAgICogb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgY29uZmlybWF0aW9uIHBlciBHYXRla2VlcGVyIHBvbGljeS5cbiAgICpcbiAgICogRmxvdzpcbiAgICogMS4gR2F0ZWtlZXBlci5lbmZvcmNlKCkgcmV0dXJucyBjb25maXJtYXRpb25QZW5kaW5nOiB0cnVlXG4gICAqIDIuIExMTSBjYWxscyBjb25maXJtX29wZXJhdGlvbiB3aXRoIHRoZSBvcGVyYXRpb24gbmFtZVxuICAgKiAzLiBUaGlzIG1ldGhvZCByZWNvcmRzIHRoZSBjb25maXJtYXRpb24gaW4gdGhlIHNlc3Npb25cbiAgICogNC4gTExNIHJldHJpZXMgdGhlIG9yaWdpbmFsIG9wZXJhdGlvbiwgd2hpY2ggbm93IHBhc3NlcyB2aWEgTGF5ZXIgM1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEdhdGVrZWVwZXIoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnY29uZmlybSc6IHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ29wZXJhdGlvbicsXG4gICAgICAgICAgJ3RoZSBvcGVyYXRpb24gbmFtZSB0byBjb25maXJtIChlLmcuIFwiY3JlYXRlX2VsZW1lbnRcIiknXG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICMxNjM2OiBOb3JtYWxpemUgZWxlbWVudF90eXBlIHRvIG1hdGNoIHRoZSBNQ1AtQVFMIHNpbmd1bGFyIGZvcm1cbiAgICAgICAgLy8gdXNlZCBieSB0aGUgZW5mb3JjZSBwYXRoLiBXaXRob3V0IHRoaXMsIHNjb3BlZCBjb25maXJtYXRpb25zIHN0b3JlZCBhc1xuICAgICAgICAvLyBcImNyZWF0ZV9lbGVtZW50OnNraWxsc1wiIG5ldmVyIG1hdGNoIGVuZm9yY2UgbG9va3VwcyBmb3IgXCJjcmVhdGVfZWxlbWVudDpza2lsbFwiLlxuICAgICAgICBjb25zdCByYXdFbGVtZW50VHlwZSA9IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBlbGVtZW50VHlwZSA9IHJhd0VsZW1lbnRUeXBlXG4gICAgICAgICAgPyBub3JtYWxpemVNQ1BBUUxFbGVtZW50VHlwZShyYXdFbGVtZW50VHlwZSkgPz8gcmF3RWxlbWVudFR5cGVcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBJc3N1ZSAjNzQ4OiBCdWlsZCBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHdoYXQncyBiZWluZyBjb25maXJtZWRcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuYnVpbGRPcGVyYXRpb25TdW1tYXJ5KG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuXG4gICAgICAgIC8vIElzc3VlICM3NTg6IENoZWNrIGZvciBudWNsZWFyIHNhbmRib3gg4oCUIGRlbnk6IFsnY29uZmlybV9vcGVyYXRpb24nXSBvbiBhbnkgYWN0aXZlIGVsZW1lbnQuXG4gICAgICAgIC8vIFRoaXMgaXMgYSBoYXJkIGJsb2NrOiB0aGUgTExNIGNhbm5vdCBjb25maXJtIEFOWSBvcGVyYXRpb24gd2hpbGUgdGhlIGRlbnlpbmcgZWxlbWVudFxuICAgICAgICAvLyBpcyBhY3RpdmUuIFRoZSBodW1hbiBtdXN0IGRlYWN0aXZhdGUgdGhlIGVsZW1lbnQgdG8gcmVzdG9yZSBjb25maXJtYXRpb24gY2FwYWJpbGl0eS5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhdXRvbWF0ZWQgY29uZmlybeKGkmV4ZWN1dGUgbG9vcHMgdGhhdCBieXBhc3MgaHVtYW4gcmV2aWV3LlxuICAgICAgICBjb25zdCBkZW55aW5nRWxlbWVudCA9IGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQoYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICBpZiAoZGVueWluZ0VsZW1lbnQpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW0dhdGVrZWVwZXJdIFNhbmRib3ggYWN0aXZlOiAke2RlbnlpbmdFbGVtZW50LnR5cGV9IFwiJHtkZW55aW5nRWxlbWVudC5uYW1lfVwiIGRlbmllcyBjb25maXJtX29wZXJhdGlvbmAsIHtcbiAgICAgICAgICAgIGJsb2NrZWRPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBPcGVyYXRpb24gY2Fubm90IGJlIGNvbmZpcm1lZCDigJQgJHtkZW55aW5nRWxlbWVudC50eXBlfSBcIiR7ZGVueWluZ0VsZW1lbnQubmFtZX1cIiBoYXMgc2FuZGJveGVkIHRoaXMgc2Vzc2lvbi4gYCArXG4gICAgICAgICAgICBgQWxsIGNvbmZpcm1hdGlvbnMgYXJlIGJsb2NrZWQgd2hpbGUgdGhpcyBlbGVtZW50IGlzIGFjdGl2ZS4gYCArXG4gICAgICAgICAgICBgRGVhY3RpdmF0ZSB0aGUgZWxlbWVudCB0byByZXN0b3JlIGNvbmZpcm1hdGlvbiBjYXBhYmlsaXR5LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzc1ODogQ2hlY2sgZm9yIGFkdmlzb3J5IOKAlCBjb25maXJtOiBbJ2NvbmZpcm1fb3BlcmF0aW9uJ10gb24gYWN0aXZlIGVsZW1lbnRzLlxuICAgICAgICAvLyBOb3QgZW5mb3JjZWQgYXMgYSBnYXRlLCBidXQgc3VyZmFjZWQgdG8gdGhlIGh1bWFuIGZvciBhd2FyZW5lc3MuXG4gICAgICAgIGNvbnN0IGFkdmlzb3J5RWxlbWVudHMgPSBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICBjb25zdCBhZHZpc29yeU5vdGUgPSBhZHZpc29yeUVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAgTm90ZTogJHthZHZpc29yeUVsZW1lbnRzLm1hcChlID0+IGAke2UudHlwZX0gXCIke2UubmFtZX1cImApLmpvaW4oJywgJyl9IHJlcXVlc3QgYWRkaXRpb25hbCBzY3J1dGlueSBmb3IgY29uZmlybWF0aW9ucy5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgVEFSR0VUIG9wZXJhdGlvbidzIHBlcm1pc3Npb24gbGV2ZWwgd2l0aCBmdWxsIGVsZW1lbnQgcG9saWNpZXMuXG4gICAgICAgIC8vIFRoaXMgaXMgTk9UIGNoZWNraW5nIGNvbmZpcm1fb3BlcmF0aW9uIGl0c2VsZiAodGhhdCB3YXMgaGFuZGxlZCBpbiB0aGUgcHJpbWFyeVxuICAgICAgICAvLyBlbmZvcmNlbWVudCBwYXRoIHdpdGggc2tpcEVsZW1lbnRQb2xpY2llcykuIFRoaXMgY2hlY2tzIHdoYXQgdGhlIHRhcmdldCBvcGVyYXRpb25cbiAgICAgICAgLy8gbmVlZHMgc28gd2UgcmVjb3JkIHRoZSByaWdodCBjb25maXJtYXRpb24gbGV2ZWwuXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gdGhpcy5nYXRla2VlcGVyLmVuZm9yY2Uoe1xuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBlbmRwb2ludDogdGhpcy5nZXRFbmRwb2ludEZvck9wZXJhdGlvbihvcGVyYXRpb24pLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCBjb25maXJtYXRpb24sIGluZm9ybSB0aGUgY2FsbGVyXG4gICAgICAgIGlmIChkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmZpcm1lZDogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBPcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIiBpcyBhbHJlYWR5IGFwcHJvdmVkICgke2RlY2lzaW9uLnBvbGljeVNvdXJjZSA/PyAnYXV0b19hcHByb3ZlJ30pLiBObyBjb25maXJtYXRpb24gbmVlZGVkLmAsXG4gICAgICAgICAgICBzdW1tYXJ5LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRlY2lzaW9uLmNvbmZpcm1hdGlvblBlbmRpbmcpIHtcbiAgICAgICAgICAvLyBIYXJkIGRlbnkgb24gdGhlIHRhcmdldCBvcGVyYXRpb24g4oCUIGNvbmZpcm1hdGlvbiB3b24ndCBoZWxwXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGRlbmllZCBieSBwb2xpY3kgYW5kIGNhbm5vdCBiZSBjb25maXJtZWQuICR7ZGVjaXNpb24ucmVhc29ufWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVjb3JkIHRoZSBjb25maXJtYXRpb24gaW4gdGhlIHNlc3Npb25cbiAgICAgICAgY29uc3QgbGV2ZWwgPSBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgICAgICAgICA/IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgICAgICAgICA6IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT047XG5cbiAgICAgICAgdGhpcy5nYXRla2VlcGVyLnJlY29yZENvbmZpcm1hdGlvbihvcGVyYXRpb24sIGxldmVsLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgICAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbTogY2xlYXIgbWF0Y2hpbmcgYmxvY2tzIGZyb20gZXhlY3V0aW5nIGFnZW50c1xuICAgICAgICBmb3IgKGNvbnN0IFssIGFnZW50RW50cnldIG9mIHRoaXMuZXhlY3V0aW5nQWdlbnRzKSB7XG4gICAgICAgICAgYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3MgPSBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgICBiID0+IGIub3BlcmF0aW9uICE9PSBvcGVyYXRpb24gfHwgKGVsZW1lbnRUeXBlICYmIGIuZWxlbWVudFR5cGUgIT09IGVsZW1lbnRUeXBlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbmZpcm1lZDogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQ29uZmlybWVkOiAke3N1bW1hcnl9LiR7YWR2aXNvcnlOb3RlfWAsXG4gICAgICAgICAgcmF0aW9uYWxlOiBkZWNpc2lvbi5yZWFzb24sXG4gICAgICAgICAgc2NvcGU6IGVsZW1lbnRUeXBlID8gYFNjb3BlZCB0byBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCA6ICdBbGwgZWxlbWVudCB0eXBlcycsXG4gICAgICAgICAgbGV2ZWw6IGxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFID8gJ3NpbmdsZV91c2UnIDogJ3Nlc3Npb24nLFxuICAgICAgICAgIHN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3ZlcmlmeSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzE0MjogVmVyaWZ5IGEgZGFuZ2VyIHpvbmUgY2hhbGxlbmdlIGNvZGUgdG8gdW5ibG9jayBhbiBhZ2VudC5cbiAgICAgICAgLy8gVGhpcyBpcyBzdGVwIDkgb2YgdGhlIHZlcmlmaWNhdGlvbiBmbG93IChzZWUgYXV0b25vbXlFdmFsdWF0b3IudHMgaGVhZGVyKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUGlwZWxpbmU6IHZhbGlkYXRlIHBhcmFtcyDihpIgcmF0ZSBsaW1pdCBjaGVjayDihpIgVVVJRCB2NCBmb3JtYXQgY2hlY2sg4oaSXG4gICAgICAgIC8vICAgICAgICAgICBwcmUtY2hlY2sgc3RvcmUgKGV4cGlyZWQ/KSDihpIgdmVyaWZ5IGNvZGUgKHdyb25nPykg4oaSIHVuYmxvY2sgYWdlbnRcbiAgICAgICAgLy9cbiAgICAgICAgLy8gRWFjaCBzdGFnZSBsb2dzIGEgZGlzdGluY3Qgc2VjdXJpdHkgZXZlbnQgdHlwZTpcbiAgICAgICAgLy8gICBWRVJJRklDQVRJT05fQVRURU1QVEVEIOKGkiBWRVJJRklDQVRJT05fRkFJTEVEIChmb3JtYXQvcmF0ZS93cm9uZykgb3JcbiAgICAgICAgLy8gICBWRVJJRklDQVRJT05fRVhQSVJFRCAobm90IGZvdW5kKSBvciBWRVJJRklDQVRJT05fU1VDQ0VFREVEXG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRBdHRlbXB0KCk7XG4gICAgICAgIGNvbnN0IGF0dGVtcHRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZUlkID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ2NoYWxsZW5nZV9pZCcsXG4gICAgICAgICAgJ3RoZSB2ZXJpZmljYXRpb24gY2hhbGxlbmdlIElEJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb2RlID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ2NvZGUnLFxuICAgICAgICAgICd0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZGlzcGxheWVkIG9uIHlvdXIgc2NyZWVuJ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIExvZyBldmVyeSB2ZXJpZmljYXRpb24gYXR0ZW1wdCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fQVRURU1QVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIGF0dGVtcHRlZCBmb3IgY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSYXRlIGxpbWl0aW5nOiByZWplY3QgaWYgdG9vIG1hbnkgcmVjZW50IGZhaWx1cmVzXG4gICAgICAgIGlmICh0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLmlzTGltaXRlZCgpKSB7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZFJhdGVMaW1pdGVkKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHJhdGUtbGltaXRlZDogdG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzIChjaGFsbGVuZ2U6ICR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAncmF0ZV9saW1pdGVkJyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdUb28gbWFueSBmYWlsZWQgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBQbGVhc2Ugd2FpdCBiZWZvcmUgdHJ5aW5nIGFnYWluLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVVVJRCB2NCBmb3JtYXQgdmFsaWRhdGlvbjogcmVqZWN0IGludmFsaWQgSURzIGJlZm9yZSBzdG9yZSBsb29rdXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWxpZGF0ZUNoYWxsZW5nZUlkRm9ybWF0KGNoYWxsZW5nZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkSW52YWxpZEZvcm1hdCgpO1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiByZWplY3RlZDogaW52YWxpZCBjaGFsbGVuZ2VfaWQgZm9ybWF0ICgke2NoYWxsZW5nZUlkfSlgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ2ludmFsaWRfZm9ybWF0JyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvblN0b3JlO1xuICAgICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1ZlcmlmaWNhdGlvbiBzeXN0ZW0gbm90IGF2YWlsYWJsZS4gRW5zdXJlIHRoZSBzZXJ2ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGNoYWxsZW5nZSBleGlzdHMgYW5kIGlzIG5vdCBleHBpcmVkIGJlZm9yZSBhdHRlbXB0aW5nIHZlcmlmeVxuICAgICAgICAvLyBUaGlzIGxldHMgdXMgZGlzdGluZ3Vpc2ggXCJ3cm9uZyBjb2RlXCIgZnJvbSBcImV4cGlyZWRcIiBmb3IgZ3JhbnVsYXIgbG9nZ2luZ1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2VQcmVDaGVjayA9IHN0b3JlLmdldChjaGFsbGVuZ2VJZCk7XG4gICAgICAgIGlmICghY2hhbGxlbmdlUHJlQ2hlY2spIHtcbiAgICAgICAgICAvLyBDaGFsbGVuZ2Ugbm90IGZvdW5kIOKAlCBlaXRoZXIgZXhwaXJlZCwgYWxyZWFkeSB1c2VkLCBvciBuZXZlciBleGlzdGVkXG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEV4cGlyZWQoKTtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0VYUElSRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIGZhaWxlZDogY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9IG5vdCBmb3VuZCAoZXhwaXJlZCwgYWxyZWFkeSB1c2VkLCBvciBpbnZhbGlkKWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAnZXhwaXJlZF9vcl9ub3RfZm91bmQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fVElNRU9VVCxcbiAgICAgICAgICAgICdWZXJpZmljYXRpb24gZmFpbGVkOiBjaGFsbGVuZ2Ugbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBleHBpcmVkIG9yIGFscmVhZHkgYmVlbiB1c2VkLiAnICtcbiAgICAgICAgICAgICdSZXRyeSB0aGUgYmxvY2tlZCBvcGVyYXRpb24gdG8gcmVjZWl2ZSBhIG5ldyB2ZXJpZmljYXRpb24gY29kZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoYWxsZW5nZUlzRm9yRGVhZGxvY2tSZWxpZWYoY2hhbGxlbmdlUHJlQ2hlY2spKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1RoaXMgdmVyaWZpY2F0aW9uIGNvZGUgaXMgcmVzZXJ2ZWQgZm9yIGRlYWRsb2NrIHJlbGllZi4gVXNlIHJlbGVhc2VfZGVhZGxvY2sgd2l0aCBjaGFsbGVuZ2VfaWQgYW5kIGNvZGUgdG8gY29tcGxldGUgdGhlIHJlc2V0LidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBjb2RlIChvbmUtdGltZSB1c2Ug4oCUIHN0b3JlIGRlbGV0ZXMgY2hhbGxlbmdlIGFmdGVyIHRoaXMgY2FsbClcbiAgICAgICAgY29uc3QgdmFsaWQgPSBzdG9yZS52ZXJpZnkoY2hhbGxlbmdlSWQsIGNvZGUpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBjb25zdCByYXRlTGltaXRFeGNlZWRlZCA9IHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfTogaW5jb3JyZWN0IGNvZGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ3dyb25nX2NvZGUnLCByYXRlTGltaXRFeGNlZWRlZCB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdWZXJpZmljYXRpb24gZmFpbGVkOiBpbmNvcnJlY3QgY29kZS4gJyArXG4gICAgICAgICAgICAnVGhlIGNvZGUgaGFzIGJlZW4gY29uc3VtZWQgKG9uZS10aW1lIHVzZSkuICcgK1xuICAgICAgICAgICAgJ1JldHJ5IHRoZSBibG9ja2VkIG9wZXJhdGlvbiB0byByZWNlaXZlIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VjY2VzcyDigJQgY2FsY3VsYXRlIHRpbWUtdG8tdmVyaWZ5IGFuZCByZWNvcmQgbWV0cmljc1xuICAgICAgICBjb25zdCB2ZXJpZnlEdXJhdGlvbk1zID0gYXR0ZW1wdFRpbWVzdGFtcCAtIChjaGFsbGVuZ2VQcmVDaGVjay5leHBpcmVzQXQgLSA1ICogNjAgKiAxMDAwKTtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZFN1Y2Nlc3ModmVyaWZ5RHVyYXRpb25NcyA+IDAgPyB2ZXJpZnlEdXJhdGlvbk1zIDogdW5kZWZpbmVkKTtcblxuICAgICAgICAvLyBGaW5kIHdoaWNoIGFnZW50IGlzIGJsb2NrZWQgd2l0aCB0aGlzIGNoYWxsZW5nZUlkIGFuZCB1bmJsb2NrIGl0XG4gICAgICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgICAgIGlmIChlbmZvcmNlcikge1xuICAgICAgICAgIGNvbnN0IGJsb2NrZWRBZ2VudHMgPSBlbmZvcmNlci5nZXRCbG9ja2VkQWdlbnRzKCk7XG4gICAgICAgICAgbGV0IHVuYmxvY2tlZEFnZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgZm9yIChjb25zdCBhZ2VudE5hbWUgb2YgYmxvY2tlZEFnZW50cykge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJbmZvID0gZW5mb3JjZXIuY2hlY2soYWdlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChibG9ja0luZm8udmVyaWZpY2F0aW9uSWQgPT09IGNoYWxsZW5nZUlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBlbmZvcmNlci51bmJsb2NrKGFnZW50TmFtZSwgY2hhbGxlbmdlSWQpO1xuICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHVuYmxvY2tlZEFnZW50ID0gYWdlbnROYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1bmJsb2NrZWRBZ2VudCkge1xuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBzdWNjZWVkZWQ6IGFnZW50ICcke3VuYmxvY2tlZEFnZW50fScgdW5ibG9ja2VkIChjaGFsbGVuZ2U6ICR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCB1bmJsb2NrZWRBZ2VudCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdW5ibG9ja2VkQWdlbnQsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBWZXJpZmljYXRpb24gc3VjY2Vzc2Z1bC4gQWdlbnQgJyR7dW5ibG9ja2VkQWdlbnR9JyBoYXMgYmVlbiB1bmJsb2NrZWQuIFlvdSBtYXkgbm93IHJldHJ5IHRoZSBvcGVyYXRpb24uYCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29kZSB3YXMgdmFsaWQgYnV0IG5vIGFnZW50IHdhcyBmb3VuZCBibG9ja2VkIHdpdGggdGhpcyBjaGFsbGVuZ2VJZFxuICAgICAgICAvLyAoY291bGQgYmUgYSBzdGFuZGFsb25lIHZlcmlmaWNhdGlvbiwgb3IgYmxvY2sgd2FzIGFscmVhZHkgY2xlYXJlZClcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fU1VDQ0VFREVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBidXQgbm8gYmxvY2tlZCBhZ2VudCBmb3VuZCBmb3IgY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwuIFlvdSBtYXkgbm93IHJldHJ5IHRoZSBvcGVyYXRpb24uJyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncmVsZWFzZURlYWRsb2NrJzoge1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2VJZFZhbHVlID0gdHlwZW9mIHBhcmFtcy5jaGFsbGVuZ2VfaWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBwYXJhbXMuY2hhbGxlbmdlX2lkLnRyaW0oKVxuICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IGNvZGVWYWx1ZSA9IHR5cGVvZiBwYXJhbXMuY29kZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHBhcmFtcy5jb2RlLnRyaW0oKVxuICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgaWYgKChjaGFsbGVuZ2VJZFZhbHVlICYmICFjb2RlVmFsdWUpIHx8ICghY2hhbGxlbmdlSWRWYWx1ZSAmJiBjb2RlVmFsdWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ3JlbGVhc2VfZGVhZGxvY2sgcmVxdWlyZXMgYm90aCBjaGFsbGVuZ2VfaWQgYW5kIGNvZGUgdG9nZXRoZXIsIG9yIG5laXRoZXIgZm9yIHRoZSBpbml0aWFsIGNoYWxsZW5nZSByZXF1ZXN0LidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjaGFsbGVuZ2VJZFZhbHVlICYmICFjb2RlVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZURlYWRsb2NrUmVsaWVmQ2hhbGxlbmdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZURlYWRsb2NrUmVsaWVmKGNoYWxsZW5nZUlkVmFsdWUsIGNvZGVWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2JlZXRsZWp1aWNlJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNTAzOiBTYWZlLXRyaWdnZXIgdGhlIGZ1bGwgZGFuZ2VyIHpvbmUgdmVyaWZpY2F0aW9uIHBpcGVsaW5lLlxuICAgICAgICAvLyBDcmVhdGVzIGEgY2hhbGxlbmdlLCBzdG9yZXMgaXQsIGFuZCBibG9ja3MgYW4gYWdlbnQg4oCUIGFsbCBpbiBvbmUgY2FsbC5cbiAgICAgICAgLy8gSXNzdWUgIzUyMjogQ29kZSBpcyBzaG93biB2aWEgT1MgZGlhbG9nLCBORVZFUiByZXR1cm5lZCB0byB0aGUgTExNLlxuICAgICAgICBjb25zdCBhZ2VudE5hbWUgPSB0eXBlb2YgcGFyYW1zLmFnZW50X25hbWUgPT09ICdzdHJpbmcnICYmIHBhcmFtcy5hZ2VudF9uYW1lLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHBhcmFtcy5hZ2VudF9uYW1lXG4gICAgICAgICAgOiAnYmVldGxlanVpY2UtdGVzdC1hZ2VudCc7XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvblN0b3JlO1xuICAgICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJpZmljYXRpb25TdG9yZSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgICAgIGlmICghZW5mb3JjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhbmdlclpvbmVFbmZvcmNlciBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQkVFVExFSlVJQ0VfQ0hBTExFTkdFX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMsIG1hdGNoZXMgZGVmYXVsdCB2ZXJpZmljYXRpb25UaW1lb3V0TWludXRlc1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2VJZCA9IHJhbmRvbVVVSUQoKTtcbiAgICAgICAgY29uc3QgY29kZSA9IGdlbmVyYXRlRGlzcGxheUNvZGUoKTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIEJFRVRMRUpVSUNFX0NIQUxMRU5HRV9USU1FT1VUX01TO1xuXG4gICAgICAgIHN0b3JlLnNldChjaGFsbGVuZ2VJZCwgeyBjb2RlLCBleHBpcmVzQXQsIHJlYXNvbjogJ0JlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlciAoSXNzdWUgIzUwMyknIH0pO1xuICAgICAgICBlbmZvcmNlci5ibG9jayhhZ2VudE5hbWUsICdCZWV0bGVqdWljZSB0ZXN0IHRyaWdnZXInLCBbJ2JlZXRsZWp1aWNlX2JlZXRsZWp1aWNlX2JlZXRsZWp1aWNlJ10sIGNoYWxsZW5nZUlkKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBTaG93IGNvZGUgdmlhIE9TIGRpYWxvZyAoZmlyZS1hbmQtZm9yZ2V0LCBub24tYmxvY2tpbmcpXG4gICAgICAgIC8vIFRoZSBjb2RlIGlzIE5FVkVSIGluY2x1ZGVkIGluIHRoZSBNQ1AgcmVzcG9uc2Ug4oCUIG9ubHkgdGhlIGh1bWFuIHNlZXMgaXQuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uTm90aWZpZXI/LnNob3dDb2RlKGNvZGUsIGBBZ2VudCAnJHthZ2VudE5hbWV9JyByZXF1aXJlcyB2ZXJpZmljYXRpb24gKEJlZXRsZWp1aWNlIHRyaWdnZXIpYCk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5iZWV0bGVqdWljZScsXG4gICAgICAgICAgZGV0YWlsczogYEJlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlcjogYWdlbnQgJyR7YWdlbnROYW1lfScgYmxvY2tlZCB3aXRoIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIGFnZW50TmFtZSwgdGVzdFRyaWdnZXI6IHRydWUgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyMjogUmVzcG9uc2UgZGVsaWJlcmF0ZWx5IG9taXRzIGNvZGUgYW5kIGluc3RydWN0aW9ucy5cbiAgICAgICAgLy8gVGhlIGh1bWFuIHJlYWRzIHRoZSBjb2RlIGZyb20gdGhlIE9TIGRpYWxvZyBhbmQgdHlwZXMgaXQgaW50byBjaGF0LlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyaWdnZXJlZDogdHJ1ZSxcbiAgICAgICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgICAgIGFnZW50X25hbWU6IGFnZW50TmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgaXMgbm93IGJsb2NrZWQuIEEgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGV5IG11c3QgdHlwZSBpdCB0byBwcm9jZWVkIHZpYSB2ZXJpZnlfY2hhbGxlbmdlLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3Blcm1pc3Npb25Qcm9tcHQnOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjU6IEV2YWx1YXRlIENMSS1sZXZlbCBwZXJtaXNzaW9uIHByb21wdHMgZm9yIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbFxuICAgICAgICAvLyBTZWU6IGRvY3MvYXJjaGl0ZWN0dXJlL1BFUk1JU1NJT05fUFJPTVBUX0FSQ0hJVEVDVFVSRS5tZCBmb3IgcHJvdG9jb2wgZGV0YWlsc1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICd0b29sX25hbWUnLFxuICAgICAgICAgICd0aGUgdG9vbCByZXF1ZXN0aW5nIHBlcm1pc3Npb24gKGUuZy4sIFwiQmFzaFwiLCBcIkVkaXRcIiwgXCJXcml0ZVwiKSdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdG9vbElucHV0UmF3ID0gcGFyYW1zLmlucHV0O1xuICAgICAgICBpZiAoIXRvb2xJbnB1dFJhdyB8fCB0eXBlb2YgdG9vbElucHV0UmF3ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgXCJpbnB1dFwiIHBhcmFtZXRlciBmb3IgJHt0b29sTmFtZX0gdG9vbCBldmFsdWF0aW9uLmAsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6ICdkYW5nZXJvdXMnLFxuICAgICAgICAgICAgICByZWFzb246ICdDYW5ub3QgZXZhbHVhdGUgcGVybWlzc2lvbiB3aXRob3V0IHRvb2wgaW5wdXQnLFxuICAgICAgICAgICAgICBzdGFnZTogJ2lucHV0X3ZhbGlkYXRpb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvb2xJbnB1dCA9IHRvb2xJbnB1dFJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICAvLyBJc3N1ZSAjNjY1OiBWYWxpZGF0ZSBCYXNoIGNvbW1hbmRzIGhhdmUgYSBub24tZW1wdHkgY29tbWFuZCBzdHJpbmdcbiAgICAgICAgaWYgKHRvb2xOYW1lID09PSAnQmFzaCcpIHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kID0gdHlwZW9mIHRvb2xJbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyA/IHRvb2xJbnB1dC5jb21tYW5kLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGlmICghY29tbWFuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgXCJjb21tYW5kXCIgaW4gaW5wdXQgZm9yIEJhc2ggdG9vbC4gQ2Fubm90IGV2YWx1YXRlIGFuIGVtcHR5IGNvbW1hbmQuYCxcbiAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgICByaXNrTGV2ZWw6ICdkYW5nZXJvdXMnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0VtcHR5IEJhc2ggY29tbWFuZCDigJQgZGVuaWVkIGJ5IGRlZmF1bHQgZm9yIHNhZmV0eScsXG4gICAgICAgICAgICAgICAgc3RhZ2U6ICdpbnB1dF92YWxpZGF0aW9uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzY0NzogQ2FwdHVyZSBhZ2VudF9pZGVudGl0eSBmcm9tIENsYXVkZSBDb2RlIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbFxuICAgICAgICBjb25zdCBhZ2VudElkZW50aXR5ID0gdHlwZW9mIHBhcmFtcy5hZ2VudF9pZGVudGl0eSA9PT0gJ3N0cmluZycgPyBwYXJhbXMuYWdlbnRfaWRlbnRpdHkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0IGNoZWNrXG4gICAgICAgIGNvbnN0IHByb21wdFJhdGVTdGF0dXMgPSB0aGlzLnBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgaWYgKCFwcm9tcHRSYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoJ3Blcm1pc3Npb25fcHJvbXB0JywgdG9vbE5hbWUsIHByb21wdFJhdGVTdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBUcmFjayB0aGF0IHBlcm1pc3Npb25fcHJvbXB0IGlzIGFjdGl2ZSAoZmFpbC1zYWZlIGRldGVjdGlvbilcbiAgICAgICAgaWYgKCF0aGlzLmdhdGVrZWVwZXIuaXNQZXJtaXNzaW9uUHJvbXB0QWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy5nYXRla2VlcGVyLm1hcmtQZXJtaXNzaW9uUHJvbXB0QWN0aXZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAxOiBTdGF0aWMgY2xhc3NpZmljYXRpb24gKGZhc3QgcGF0aClcbiAgICAgICAgY29uc3QgY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmeVRvb2wodG9vbE5hbWUsIHRvb2xJbnB1dCk7XG5cbiAgICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnYWxsb3cnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgICAgdXBkYXRlZElucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnc3RhdGljX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdkZW55Jykge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdQRVJNSVNTSU9OX1BST01QVF9ERU5JRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIucGVybWlzc2lvblByb21wdCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgUGVybWlzc2lvbiBkZW5pZWQgZm9yICR7dG9vbE5hbWV9OiAke2NsYXNzaWZpY2F0aW9uLnJlYXNvbn1gLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgdG9vbE5hbWUsIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLCBhZ2VudElkZW50aXR5IH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAuLi4oYWdlbnRJZGVudGl0eSAmJiB7IGFnZW50X2lkZW50aXR5OiBhZ2VudElkZW50aXR5IH0pLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ3N0YXRpY19jbGFzc2lmaWNhdGlvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyOiBBY3RpdmUgZWxlbWVudCBwb2xpY3kgY2hlY2tcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnREZWNpc2lvbiA9IGV2YWx1YXRlQ2xpVG9vbFBvbGljeSh0b29sTmFtZSwgdG9vbElucHV0LCBhY3RpdmVFbGVtZW50cyk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnREZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1BFUk1JU1NJT05fUFJPTVBUX0RFTklFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBQZXJtaXNzaW9uIGRlbmllZCBieSBlbGVtZW50IHBvbGljeSBmb3IgJHt0b29sTmFtZX1gLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgdG9vbE5hbWUsIG1lc3NhZ2U6IGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlLCBhZ2VudElkZW50aXR5IH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSxcbiAgICAgICAgICAgIC4uLihhZ2VudElkZW50aXR5ICYmIHsgYWdlbnRfaWRlbnRpdHk6IGFnZW50SWRlbnRpdHkgfSksXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnZWxlbWVudF9wb2xpY3knLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyLjE6IFBhdHRlcm4tYmFzZWQgYXBwcm92YWwgKGNvbmZpcm1QYXR0ZXJucyDigJQgSXNzdWUgIzE2NjApXG4gICAgICAgIGlmIChlbGVtZW50RGVjaXNpb24uYmVoYXZpb3IgPT09ICdjb25maXJtJykge1xuICAgICAgICAgIGNvbnN0IHJpc2sgPSBhc3Nlc3NSaXNrKHRvb2xOYW1lLCB0b29sSW5wdXQsIGNsYXNzaWZpY2F0aW9uKTtcbiAgICAgICAgICBjb25zdCBwb2xpY3lTb3VyY2UgPSBlbGVtZW50RGVjaXNpb24uY29uZmlybVNvdXJjZSB8fCAndW5rbm93bic7XG5cbiAgICAgICAgICBjb25zdCBhcHByb3ZhbFJhdGVTdGF0dXMgPSB0aGlzLmNsaUFwcHJvdmFsTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgICAgaWYgKCFhcHByb3ZhbFJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRSYXRlTGltaXREZW55KFxuICAgICAgICAgICAgICAnY2xpX2FwcHJvdmFsJywgdG9vbE5hbWUsIGFwcHJvdmFsUmF0ZVN0YXR1cyxcbiAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24ucmlza0xldmVsLCBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNsaUFwcHJvdmFsTGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUG9saWN5ID0gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgICBjb25zdCB0dGxNcyA9IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgPyBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzICogMTAwMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdhdGVrZWVwZXIuY3JlYXRlQ2xpQXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByaXNrLnNjb3JlLFxuICAgICAgICAgICAgcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSB8fCBgQ29uZmlybWF0aW9uIHJlcXVpcmVkIGJ5IGVsZW1lbnQgcG9saWN5YCxcbiAgICAgICAgICAgIHBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIHR0bE1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXF1aXJlcyBodW1hbiBhcHByb3ZhbC4gUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9LiBDYWxsIGFwcHJvdmVfY2xpX3Blcm1pc3Npb24gdG8gYXV0aG9yaXplLmAsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnYXBwcm92YWxfcmVxdWlyZWQnLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICAgIHJlYXNvbjogZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UgfHwgJ0NvbmZpcm1hdGlvbiByZXF1aXJlZCBieSBlbGVtZW50IHBvbGljeScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDIuNTogQ2hlY2sgZXhpc3RpbmcgQ0xJIGFwcHJvdmFsIChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQXBwcm92YWwgPSB0aGlzLmdhdGVrZWVwZXIuY2hlY2tDbGlBcHByb3ZhbCh0b29sTmFtZSwgdG9vbElucHV0KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQXBwcm92YWwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdjbGlfYXBwcm92YWwnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcHJvdmFsQ29udGV4dDoge1xuICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGV4aXN0aW5nQXBwcm92YWwucmVxdWVzdElkLFxuICAgICAgICAgICAgICBzY29wZTogZXhpc3RpbmdBcHByb3ZhbC5zY29wZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMi43NTogQXBwcm92YWwtcmVxdWlyZWQgcm91dGluZyAoSXNzdWUgIzYyNSBQaGFzZSAzKVxuICAgICAgICBjb25zdCBhcHByb3ZhbFBvbGljeSA9IHJlc29sdmVDbGlBcHByb3ZhbFBvbGljeShhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGlmIChhcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWw/LmluY2x1ZGVzKGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCBhcyAnbW9kZXJhdGUnIHwgJ2Rhbmdlcm91cycpKSB7XG4gICAgICAgICAgY29uc3QgcmlzayA9IGFzc2Vzc1Jpc2sodG9vbE5hbWUsIHRvb2xJbnB1dCwgY2xhc3NpZmljYXRpb24pO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVNvdXJjZSA9IGFjdGl2ZUVsZW1lbnRzXG4gICAgICAgICAgICAuZmlsdGVyKGVsID0+IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uYXBwcm92YWxQb2xpY3k/LnJlcXVpcmVBcHByb3ZhbD8ubGVuZ3RoKVxuICAgICAgICAgICAgLm1hcChlbCA9PiBgJHtlbC50eXBlfToke2VsLm5hbWV9YClcbiAgICAgICAgICAgIC5qb2luKCcsICcpIHx8ICdlbnY6RE9MTEhPVVNFX0NMSV9BUFBST1ZBTF9QT0xJQ1knO1xuXG4gICAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0IENMSSBhcHByb3ZhbCBjcmVhdGlvblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmF0ZVN0YXR1cyA9IHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgICBpZiAoIWFwcHJvdmFsUmF0ZVN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoXG4gICAgICAgICAgICAgICdjbGlfYXBwcm92YWwnLCB0b29sTmFtZSwgYXBwcm92YWxSYXRlU3RhdHVzLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuXG4gICAgICAgICAgY29uc3QgdHRsTXMgPSBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzID8gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyAqIDEwMDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5nYXRla2VlcGVyLmNyZWF0ZUNsaUFwcHJvdmFsUmVxdWVzdChcbiAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgcmlzay5zY29yZSxcbiAgICAgICAgICAgIHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgYFRvb2wgJyR7dG9vbE5hbWV9JyBjbGFzc2lmaWVkIGFzICR7Y2xhc3NpZmljYXRpb24ucmlza0xldmVsfTogJHtjbGFzc2lmaWNhdGlvbi5yZWFzb259YCxcbiAgICAgICAgICAgIHBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIHR0bE1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXF1aXJlcyBodW1hbiBhcHByb3ZhbC4gUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9LiBDYWxsIGFwcHJvdmVfY2xpX3Blcm1pc3Npb24gdG8gYXV0aG9yaXplLmAsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnYXBwcm92YWxfcmVxdWlyZWQnLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAzOiBEZWZhdWx0IOKAlCBhbGxvdyAocGVybWlzc2l2ZSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIHN0YWdlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZXZhbHVhdGVQZXJtaXNzaW9uJzoge1xuICAgICAgICAvLyBFdmFsdWF0ZSBDTEkgcGVybWlzc2lvbiBmb3IgUHJlVG9vbFVzZSBob29rcyAoYWxsIHBsYXRmb3JtcylcbiAgICAgICAgY29uc3QgeyBldmFsdWF0ZVBlcm1pc3Npb24gfSA9IGF3YWl0IGltcG9ydCgnLi9ldmFsdWF0ZVBlcm1pc3Npb24uanMnKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlUGVybWlzc2lvbihwYXJhbXMsIHtcbiAgICAgICAgICBwZXJtaXNzaW9uUHJvbXB0TGltaXRlcjogdGhpcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlcixcbiAgICAgICAgICBjbGFzc2lmeVRvb2wsXG4gICAgICAgICAgZXZhbHVhdGVDbGlUb29sUG9saWN5LFxuICAgICAgICAgIGdldEFjdGl2ZUVsZW1lbnRzOiAoc2Vzc2lvbklkPzogc3RyaW5nKSA9PiB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKHNlc3Npb25JZCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRFZmZlY3RpdmVDbGlQb2xpY2llcyc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAyOiBHZXQgZWZmZWN0aXZlIENMSSBwZXJtaXNzaW9uIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gcGFyYW1zLnRvb2xfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHRvb2xJbnB1dCA9IChwYXJhbXMudG9vbF9pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPz8ge307XG4gICAgICAgIGNvbnN0IHJlcG9ydFNlc3Npb25JZCA9IHR5cGVvZiBwYXJhbXMuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBwYXJhbXMuc2Vzc2lvbl9pZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcmVwb3J0aW5nU2NvcGUgPSBwYXJhbXMucmVwb3J0aW5nX3Njb3BlID09PSAnZGFzaGJvYXJkJztcblxuICAgICAgICAvLyAxLiBHZXQgYWxsIGFjdGl2ZSBlbGVtZW50c1xuICAgICAgICBjb25zdCBwb2xpY3lFbGVtZW50cyA9IHJlcG9ydGluZ1Njb3BlICYmICF0b29sTmFtZVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5nZXRQb2xpY3lSZXBvcnRFbGVtZW50cyhyZXBvcnRTZXNzaW9uSWQpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG5cbiAgICAgICAgLy8gMi4gRXh0cmFjdCBleHRlcm5hbFJlc3RyaWN0aW9ucyBmcm9tIGVhY2ggZWxlbWVudFxuICAgICAgICBjb25zdCBlbGVtZW50UG9saWNpZXMgPSBwb2xpY3lFbGVtZW50cy5tYXAoZWwgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gZ2V0R2F0ZWtlZXBlckRpYWdub3N0aWNzKGVsLm1ldGFkYXRhKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgICBhbGxvd1BhdHRlcm5zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmFsbG93UGF0dGVybnMgPz8gW10sXG4gICAgICAgICAgICBjb25maXJtUGF0dGVybnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uY29uZmlybVBhdHRlcm5zID8/IFtdLFxuICAgICAgICAgICAgZGVueVBhdHRlcm5zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmRlbnlQYXR0ZXJucyA/PyBbXSxcbiAgICAgICAgICAgIGFsbG93T3BlcmF0aW9uczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmFsbG93ID8/IFtdLFxuICAgICAgICAgICAgY29uZmlybU9wZXJhdGlvbnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5jb25maXJtID8/IFtdLFxuICAgICAgICAgICAgZGVueU9wZXJhdGlvbnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5kZW55ID8/IFtdLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uZGVzY3JpcHRpb24gPz8gbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRHYXRla2VlcGVyUG9saWN5OiAhIWRpYWdub3N0aWNzLFxuICAgICAgICAgICAgaW52YWxpZEdhdGVrZWVwZXJNZXNzYWdlOiBkaWFnbm9zdGljcz8ubWVzc2FnZSxcbiAgICAgICAgICAgIHNlc3Npb25JZHM6IChlbC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LnNlc3Npb25JZHMgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDMuIEJ1aWxkIGNvbWJpbmVkIHZpZXdcbiAgICAgICAgY29uc3QgY29tYmluZWRBbGxvdyA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5hbGxvd1BhdHRlcm5zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRDb25maXJtID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmNvbmZpcm1QYXR0ZXJucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRGVueSA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5kZW55UGF0dGVybnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZEFsbG93T3BlcmF0aW9ucyA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5hbGxvd09wZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZENvbmZpcm1PcGVyYXRpb25zID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmNvbmZpcm1PcGVyYXRpb25zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWREZW55T3BlcmF0aW9ucyA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5kZW55T3BlcmF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGhhc0FsbG93bGlzdCA9IGNvbWJpbmVkQWxsb3cubGVuZ3RoID4gMCB8fCBjb21iaW5lZEFsbG93T3BlcmF0aW9ucy5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vIDQuIElmIHRvb2xfbmFtZSBwcm92aWRlZCwgZXZhbHVhdGUgaXQgYWdhaW5zdCBjdXJyZW50IHBvbGljaWVzXG4gICAgICAgIGxldCBldmFsdWF0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRvb2xOYW1lKSB7XG4gICAgICAgICAgY29uc3QgdG9vbENsYXNzaWZpY2F0aW9uID0gY2xhc3NpZnlUb29sKHRvb2xOYW1lLCB0b29sSW5wdXQpO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVJlc3VsdCA9IHRvb2xDbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2V2YWx1YXRlJ1xuICAgICAgICAgICAgPyBldmFsdWF0ZUNsaVRvb2xQb2xpY3kodG9vbE5hbWUsIHRvb2xJbnB1dCwgcG9saWN5RWxlbWVudHMpXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBldmFsdWF0aW9uID0ge1xuICAgICAgICAgICAgdG9vbF9uYW1lOiB0b29sTmFtZSxcbiAgICAgICAgICAgIHRvb2xfaW5wdXQ6IE9iamVjdC5rZXlzKHRvb2xJbnB1dCkubGVuZ3RoID4gMCA/IHRvb2xJbnB1dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogdG9vbENsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgYmVoYXZpb3I6IHRvb2xDbGFzc2lmaWNhdGlvbi5iZWhhdmlvcixcbiAgICAgICAgICAgICAgcmVhc29uOiB0b29sQ2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVsZW1lbnRQb2xpY3lSZXN1bHQ6IHBvbGljeVJlc3VsdCA/IHtcbiAgICAgICAgICAgICAgYmVoYXZpb3I6IHBvbGljeVJlc3VsdC5iZWhhdmlvcixcbiAgICAgICAgICAgICAgbWVzc2FnZTogcG9saWN5UmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IHBvbGljeVJlc3VsdC5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGZpbmFsQmVoYXZpb3I6IHBvbGljeVJlc3VsdD8uYmVoYXZpb3IgPT09ICdkZW55JyA/ICdkZW55J1xuICAgICAgICAgICAgICA6IHRvb2xDbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2RlbnknID8gJ2RlbnknIDogJ2FsbG93JyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gRmFpbC1zYWZlIGRldGVjdGlvbiAoSXNzdWUgIzYyNSBQaGFzZSA0KVxuICAgICAgICBjb25zdCBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlID0gdGhpcy5nYXRla2VlcGVyLmlzUGVybWlzc2lvblByb21wdEFjdGl2ZTtcbiAgICAgICAgY29uc3QgaG9va1N0YXR1cyA9IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzKCk7XG4gICAgICAgIGNvbnN0IGhvb2tJbnN0YWxsZWQgPSBob29rU3RhdHVzLmluc3RhbGxlZDtcbiAgICAgICAgY29uc3QgZW5mb3JjZW1lbnRSZWFkeSA9IHBlcm1pc3Npb25Qcm9tcHRBY3RpdmUgfHwgaG9va0luc3RhbGxlZDtcbiAgICAgICAgY29uc3QgaGFzQ2xpUmVzdHJpY3Rpb25zID0gY29tYmluZWRBbGxvdy5sZW5ndGggPiAwIHx8IGNvbWJpbmVkRGVueS5sZW5ndGggPiAwIHx8IGNvbWJpbmVkQ29uZmlybS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBoYXNPcGVyYXRpb25SZXN0cmljdGlvbnMgPSBjb21iaW5lZEFsbG93T3BlcmF0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgfHwgY29tYmluZWREZW55T3BlcmF0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgfHwgY29tYmluZWRDb25maXJtT3BlcmF0aW9ucy5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBpbnZhbGlkUG9saWN5RWxlbWVudHMgPSBlbGVtZW50UG9saWNpZXMuZmlsdGVyKHBvbGljeSA9PiBwb2xpY3kuaW52YWxpZEdhdGVrZWVwZXJQb2xpY3kpO1xuICAgICAgICBsZXQgYWR2aXNvcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGhhc0NsaVJlc3RyaWN0aW9ucykge1xuICAgICAgICAgIGlmICghZW5mb3JjZW1lbnRSZWFkeSkge1xuICAgICAgICAgICAgYWR2aXNvcnkgPSAnUG9saWNpZXMgYXJlIGxvYWRlZCBidXQgTk9UIGVuZm9yY2VkLiBObyBwZXJtaXNzaW9uIGhvb2sgZGV0ZWN0ZWQgYW5kIHBlcm1pc3Npb25fcHJvbXB0IGhhcyBub3QgYmVlbiBjYWxsZWQuIFJ1biBvcGVuX3NldHVwIGFuZCByZWluc3RhbGwsIG9yIGxhdW5jaCB0aGUgQ0xJIGNsaWVudCB3aXRoIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbC4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaG9va0luc3RhbGxlZCAmJiAhcGVybWlzc2lvblByb21wdEFjdGl2ZSkge1xuICAgICAgICAgICAgYWR2aXNvcnkgPSBgUG9saWNpZXMgYXJlIGxvYWRlZC4gUGVybWlzc2lvbiBob29rIGRldGVjdGVkIGZvciAke2hvb2tTdGF0dXMuaG9zdCA/PyAnYSBzdXBwb3J0ZWQgY2xpZW50J30sIHNvIGVuZm9yY2VtZW50IGRlcGVuZHMgb24gdXNpbmcgdGhhdCBjbGllbnQgY29uZmlndXJhdGlvbi5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChoYXNPcGVyYXRpb25SZXN0cmljdGlvbnMpIHtcbiAgICAgICAgICBhZHZpc29yeSA9ICdNQ1AtQVFMIG9wZXJhdGlvbiBwb2xpY2llcyBhcmUgYWN0aXZlIGZvciBEb2xsaG91c2UgYWN0aW9ucyBpbiB0aGlzIHNlc3Npb24uJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZhbGlkUG9saWN5RWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGludmFsaWRBZHZpc29yeSA9IGJ1aWxkSW52YWxpZFBvbGljeUFkdmlzb3J5KGludmFsaWRQb2xpY3lFbGVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgIGFkdmlzb3J5ID0gYWR2aXNvcnkgPyBgJHthZHZpc29yeX0gJHtpbnZhbGlkQWR2aXNvcnl9YCA6IGludmFsaWRBZHZpc29yeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudENvdW50OiBwb2xpY3lFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgICAgaGFzQWxsb3dsaXN0LFxuICAgICAgICAgIGVsZW1lbnRzOiBlbGVtZW50UG9saWNpZXMsXG4gICAgICAgICAgY29tYmluZWRBbGxvd1BhdHRlcm5zOiBjb21iaW5lZEFsbG93LFxuICAgICAgICAgIGNvbWJpbmVkQ29uZmlybVBhdHRlcm5zOiBjb21iaW5lZENvbmZpcm0sXG4gICAgICAgICAgY29tYmluZWREZW55UGF0dGVybnM6IGNvbWJpbmVkRGVueSxcbiAgICAgICAgICBjb21iaW5lZEFsbG93T3BlcmF0aW9ucyxcbiAgICAgICAgICBjb21iaW5lZENvbmZpcm1PcGVyYXRpb25zLFxuICAgICAgICAgIGNvbWJpbmVkRGVueU9wZXJhdGlvbnMsXG4gICAgICAgICAgZXZhbHVhdGlvbixcbiAgICAgICAgICBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlLFxuICAgICAgICAgIGhvb2tJbnN0YWxsZWQsXG4gICAgICAgICAgZW5mb3JjZW1lbnRSZWFkeSxcbiAgICAgICAgICBob29rSG9zdDogaG9va1N0YXR1cy5ob3N0LFxuICAgICAgICAgIGludmFsaWRQb2xpY3lFbGVtZW50Q291bnQ6IGludmFsaWRQb2xpY3lFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgICAgYWR2aXNvcnksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldFBlcm1pc3Npb25BdXRob3JpdHknOiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEhvc3QgPSB0eXBlb2YgcGFyYW1zLmhvc3QgPT09ICdzdHJpbmcnID8gcGFyYW1zLmhvc3QgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGF1dGhvcml0eVN0YXRlID0gYXdhaXQgcmVhZFBlcm1pc3Npb25BdXRob3JpdHlTdGF0ZSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlZmF1bHRNb2RlOiBhdXRob3JpdHlTdGF0ZS5kZWZhdWx0TW9kZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGF1dGhvcml0eVN0YXRlLnVwZGF0ZWRBdCxcbiAgICAgICAgICBzdXBwb3J0ZWRIb3N0czogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTXSxcbiAgICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgICBhaU11dGFibGU6IGZhbHNlLFxuICAgICAgICAgIGhvc3RzOiBhdXRob3JpdHlTdGF0ZS5ob3N0cyxcbiAgICAgICAgICBob3N0OiByZXF1ZXN0ZWRIb3N0LFxuICAgICAgICAgIG1vZGU6IHJlcXVlc3RlZEhvc3QgJiYgcmVxdWVzdGVkSG9zdCBpbiBhdXRob3JpdHlTdGF0ZS5ob3N0c1xuICAgICAgICAgICAgPyBhdXRob3JpdHlTdGF0ZS5ob3N0c1tyZXF1ZXN0ZWRIb3N0IGFzIGtleW9mIHR5cGVvZiBhdXRob3JpdHlTdGF0ZS5ob3N0c10/Lm1vZGUgPz8gYXV0aG9yaXR5U3RhdGUuZGVmYXVsdE1vZGVcbiAgICAgICAgICAgIDogYXV0aG9yaXR5U3RhdGUuZGVmYXVsdE1vZGUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2FwcHJvdmVDbGlQZXJtaXNzaW9uJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDM6IEFwcHJvdmUgYSBwZW5kaW5nIENMSSB0b29sIHBlcm1pc3Npb24gcmVxdWVzdFxuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAncmVxdWVzdF9pZCcsXG4gICAgICAgICAgJ3RoZSBhcHByb3ZhbCByZXF1ZXN0IElEIGZyb20gcGVybWlzc2lvbl9wcm9tcHQgZGVueSByZXNwb25zZSAoZm9ybWF0OiBjbGktPFVVSUQ+KSdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSAocGFyYW1zLnNjb3BlIGFzIENsaUFwcHJvdmFsU2NvcGUpID8/ICdzaW5nbGUnO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNjb3BlXG4gICAgICAgIGlmIChzY29wZSAhPT0gJ3NpbmdsZScgJiYgc2NvcGUgIT09ICd0b29sX3Nlc3Npb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjb3BlIFwiJHtzY29wZX1cIi4gTXVzdCBiZSBcInNpbmdsZVwiIG9yIFwidG9vbF9zZXNzaW9uXCIuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdhdGVrZWVwZXIuYXBwcm92ZUNsaVJlcXVlc3QocmVxdWVzdElkLCBzY29wZSk7XG4gICAgICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwZW5kaW5nIGFwcHJvdmFsIGZvciBcIiR7cmVxdWVzdElkfVwiLiBJdCBtYXkgaGF2ZSBleHBpcmVkIG9yIGFscmVhZHkgYmVlbiBhcHByb3ZlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwcm92ZWQ6IHRydWUsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIHRvb2xOYW1lOiByZWNvcmQudG9vbE5hbWUsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgbWVzc2FnZTogc2NvcGUgPT09ICd0b29sX3Nlc3Npb24nXG4gICAgICAgICAgICA/IGBBcHByb3ZlZCBmb3IgYWxsIHVzZXMgb2YgJyR7cmVjb3JkLnRvb2xOYW1lfScgdGhpcyBzZXNzaW9uLmBcbiAgICAgICAgICAgIDogYEFwcHJvdmVkIHNpbmdsZSB1c2Ugb2YgJyR7cmVjb3JkLnRvb2xOYW1lfScuIFJldHJ5IHRoZSB0b29sIGNhbGwgbm93LmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldFBlbmRpbmdDbGlBcHByb3ZhbHMnOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgMzogR2V0IGFsbCBwZW5kaW5nIENMSSB0b29sIGFwcHJvdmFsIHJlcXVlc3RzXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmdhdGVrZWVwZXIuZ2V0UGVuZGluZ0NsaUFwcHJvdmFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbmRpbmcsXG4gICAgICAgICAgY291bnQ6IHBlbmRpbmcubGVuZ3RoLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gR2F0ZWtlZXBlciBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBMb2dnaW5nIG9wZXJhdGlvbnMgKElzc3VlICM1MjggLSBDUlVERSBtaWdyYXRpb24pXG4gICAqXG4gICAqIFJvdXRlcyBxdWVyeV9sb2dzIHRocm91Z2ggdGhlIHVuaWZpZWQgQ1JVREUgcGlwZWxpbmUgaW5zdGVhZCBvZlxuICAgKiBhIHN0YW5kYWxvbmUgTUNQIHRvb2wsIHByb3ZpZGluZyBvcGVyYXRpb24gcm91dGluZywgZ2F0ZWtlZXBlclxuICAgKiBwb2xpY3kgZW5mb3JjZW1lbnQsIGFuZCBzdHJ1Y3R1cmVkIHJlc3BvbnNlIGZvcm1hdC5cbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hMb2dnaW5nKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLmhhbmRsZXJzLm1lbW9yeVNpbmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5TG9nU2luayBub3QgYXZhaWxhYmxlIOKAlCBsb2dnaW5nIHF1ZXJ5IHJlcXVpcmVzIG1lbW9yeSBzaW5rJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3F1ZXJ5Jzoge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdmFsaWRhdGVMb2dRdWVyeVBhcmFtcyhwYXJhbXMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZXJzLm1lbW9yeVNpbmsucXVlcnkob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnTG9nUXVlcnlSZXN1bHQnLCAuLi5yZXN1bHQgfTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBMb2dnaW5nIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIE1ldHJpY3Mgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogUm91dGVzIHF1ZXJ5X21ldHJpY3MgdGhyb3VnaCB0aGUgdW5pZmllZCBDUlVERSBwaXBlbGluZSwgcHJvdmlkaW5nXG4gICAqIG9wZXJhdGlvbiByb3V0aW5nLCBnYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudCwgYW5kIHN0cnVjdHVyZWQgcmVzcG9uc2UgZm9ybWF0LlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaE1ldHJpY3MoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMuaGFuZGxlcnMubWV0cmljc1NpbmspIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiAnTWV0cmljUXVlcnlSZXN1bHQnLFxuICAgICAgICBzbmFwc2hvdHM6IFtdLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6ICdNZXRyaWNzIGNvbGxlY3Rpb24gaXMgbm90IGVuYWJsZWQuIFNldCBET0xMSE9VU0VfTUVUUklDU19FTkFCTEVEPXRydWUgdG8gYWN0aXZhdGUuJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbGlkYXRlTWV0cmljUXVlcnlQYXJhbXMocGFyYW1zKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlcnMubWV0cmljc1NpbmsucXVlcnkob3B0aW9ucyk7XG4gICAgICByZXR1cm4geyBfdHlwZTogJ01ldHJpY1F1ZXJ5UmVzdWx0JywgLi4ucmVzdWx0IH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBNZXRyaWNzIG1ldGhvZDogJHttZXRob2R9YCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQnJvd3NlciBvcGVyYXRpb25zIChJc3N1ZSAjNzc0OiBvcGVuIHBvcnRmb2xpbyBicm93c2VyKVxuICAgKi9cbiAgLyoqXG4gICAqIERpc3BhdGNoIEJyb3dzZXIgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogU3RhcnRzIHRoZSBwb3J0Zm9saW8gd2ViIHNlcnZlciAoaWYgbm90IHJ1bm5pbmcpIGFuZCBvcGVucyB0aGVcbiAgICogc3lzdGVtIGJyb3dzZXIuIFJldHVybnMgdGhlIFVSTCBhbmQgYW55IHdhcm5pbmdzIGlmIHRoZSBicm93c2VyXG4gICAqIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBicm93c2VyIG1ldGhvZCB0byBkaXNwYXRjaCAoJ29wZW4nKVxuICAgKiBAcmV0dXJucyBNQ1AgcmVzcG9uc2Ugd2l0aCBVUkwgYW5kIG9wdGlvbmFsIHdhcm5pbmdcbiAgICogQHNlZSBJc3N1ZSAjNzc0XG4gICAqL1xuICAvKipcbiAgICogRXh0cmFjdCBVUkwgcXVlcnkgcGFyYW1ldGVycyBmcm9tIG9wZXJhdGlvbiBwYXJhbXMuXG4gICAqIFNlcmlhbGl6ZXMgYWxsIHBhcmFtcyBleGNlcHQgJ3RhYicgYXMgc3RyaW5nIGtleS12YWx1ZSBwYWlycy5cbiAgICogQHNlZSBJc3N1ZSAjMTc2NSAtIFVSTCBwYXJhbWV0ZXIgc3VwcG9ydCBmb3IgcG9ydGZvbGlvIGJyb3dzZXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RVcmxQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybFBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcykpIHtcbiAgICAgIGlmIChrZXkgPT09ICd0YWInIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSBjb250aW51ZTtcbiAgICAgIHVybFBhcmFtc1trZXldID0gTUNQQVFMSGFuZGxlci5zZXJpYWxpemVQYXJhbVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHVybFBhcmFtcykubGVuZ3RoID4gMCA/IHVybFBhcmFtcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBTZXJpYWxpemUgYSBwYXJhbSB2YWx1ZSB0byBhIFVSTC1zYWZlIHN0cmluZy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplUGFyYW1WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hCcm93c2VyKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChtZXRob2QgIT09ICdvcGVuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEJyb3dzZXIgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG9wZW5Qb3J0Zm9saW9Ccm93c2VyIH0gPSBhd2FpdCBpbXBvcnQoJy4uLy4uL3dlYi9zZXJ2ZXIuanMnKTtcbiAgICBjb25zdCB7IGhvbWVkaXIgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpvcycpO1xuICAgIGNvbnN0IHBvcnRmb2xpb0RpciA9IGhvbWVkaXIoKSArICcvLmRvbGxob3VzZS9wb3J0Zm9saW8nO1xuXG4gICAgY29uc3QgdGFiID0gdHlwZW9mIHBhcmFtcz8udGFiID09PSAnc3RyaW5nJyA/IHBhcmFtcy50YWIgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdXJsUGFyYW1zID0gcGFyYW1zID8gTUNQQVFMSGFuZGxlci5leHRyYWN0VXJsUGFyYW1zKHBhcmFtcykgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJc3N1ZSAjNzk2OiBQYXNzIE1DUEFRTEhhbmRsZXIgdG8gd2ViIHNlcnZlciBmb3IgZ2F0ZXdheSByb3V0aW5nLlxuICAgIC8vIElzc3VlICMxODUwOiBQYXNzIHNpbmtzIHNvIGZhbGxiYWNrIHNlcnZlciBoYXMgZnVsbCBjb25zb2xlIGZ1bmN0aW9uYWxpdHkuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlblBvcnRmb2xpb0Jyb3dzZXIoe1xuICAgICAgcG9ydGZvbGlvRGlyLFxuICAgICAgbWNwQXFsSGFuZGxlcjogdGhpcyxcbiAgICAgIHRhYixcbiAgICAgIHVybFBhcmFtcyxcbiAgICAgIG1lbW9yeVNpbms6IHRoaXMuaGFuZGxlcnMubWVtb3J5U2luayxcbiAgICAgIG1ldHJpY3NTaW5rOiB0aGlzLmhhbmRsZXJzLm1ldHJpY3NTaW5rLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LmFscmVhZHlSdW5uaW5nID8gJ2FscmVhZHkgcnVubmluZycgOiAnc3RhcnRlZCc7XG4gICAgY29uc3QgYnJvd3NlclN0YXR1cyA9IHJlc3VsdC5icm93c2VyT3BlbmVkID8gJ29wZW5lZCcgOiAnY291bGQgbm90IG9wZW4gYXV0b21hdGljYWxseSc7XG4gICAgY29uc3Qgd2FybmluZyA9IHJlc3VsdC53YXJuaW5nID8gYFxcblxcbuKaoO+4jyAke3Jlc3VsdC53YXJuaW5nfWAgOiAnJztcbiAgICBjb25zdCB0YWJOb3RlID0gdGFiID8gYCAoJHt0YWJ9IHRhYilgIDogJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB0ZXh0OiBgUG9ydGZvbGlvIGJyb3dzZXIgJHtzdGF0dXN9IGF0ICR7cmVzdWx0LnVybH0ke3RhYk5vdGV9IOKAlCBicm93c2VyICR7YnJvd3NlclN0YXR1c30ke3dhcm5pbmd9YCxcbiAgICAgIH1dLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9vayB1cCB0aGUgQ1JVREUgZW5kcG9pbnQgZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uIG5hbWUuXG4gICAqIFVzZWQgYnkgZGlzcGF0Y2hHYXRla2VlcGVyIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBlbmRwb2ludCBjb250ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbmRwb2ludEZvck9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZyk6IENSVURFbmRwb2ludCB7XG4gICAgY29uc3Qgcm91dGUgPSBnZXRSb3V0ZShvcGVyYXRpb24pO1xuICAgIGlmICghcm91dGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGUuZW5kcG9pbnQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIGFuIG9wZXJhdGlvbiBmb3IgY29uZmlybWF0aW9uIHByb21wdHMuXG4gICAqIElzc3VlICM3NDg6IE5hdHVyYWwgbGFuZ3VhZ2UgY29uZmlybWF0aW9uIHN1bW1hcmllcy5cbiAgICpcbiAgICogVHJhbnNsYXRlcyByYXcgb3BlcmF0aW9uIG5hbWVzIGFuZCBwYXJhbXMgaW50byBwbGFpbiBsYW5ndWFnZSBzbyB1c2Vyc1xuICAgKiB1bmRlcnN0YW5kIHdoYXQgdGhleSdyZSBhcHByb3Zpbmcgd2l0aG91dCBwYXJzaW5nIG1hY2hpbmUtcmVhZGFibGUgcGF5bG9hZHMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkT3BlcmF0aW9uU3VtbWFyeShcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHAgPSBwYXJhbXMgfHwge307XG4gICAgY29uc3QgbmFtZSA9IChwLmVsZW1lbnRfbmFtZSB8fCBwLm5hbWUgfHwgJycpIGFzIHN0cmluZztcbiAgICBjb25zdCB0eXBlTGFiZWwgPSBlbGVtZW50VHlwZSB8fCAocC5lbGVtZW50X3R5cGUgYXMgc3RyaW5nKSB8fCAnZWxlbWVudCc7XG5cbiAgICAvLyBPcGVyYXRpb24tc3BlY2lmaWMgbmF0dXJhbCBsYW5ndWFnZSB0ZW1wbGF0ZXNcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgY2FzZSAnY3JlYXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYENyZWF0ZSBhIG5ldyAke3R5cGVMYWJlbH0gY2FsbGVkIFwiJHtuYW1lfVwiYFxuICAgICAgICAgIDogYENyZWF0ZSBhIG5ldyAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnZWRpdF9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBFZGl0IHRoZSAke3R5cGVMYWJlbH0gXCIke25hbWV9XCJgXG4gICAgICAgICAgOiBgRWRpdCBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdkZWxldGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgUGVybWFuZW50bHkgZGVsZXRlIHRoZSAke3R5cGVMYWJlbH0gXCIke25hbWV9XCJgXG4gICAgICAgICAgOiBgUGVybWFuZW50bHkgZGVsZXRlIGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2FjdGl2YXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYEFjdGl2YXRlIHRoZSAke3R5cGVMYWJlbH0gXCIke25hbWV9XCIgKGNoYW5nZXMgYWN0aXZlIHBlcm1pc3Npb24gc3VyZmFjZSlgXG4gICAgICAgICAgOiBgQWN0aXZhdGUgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnZGVhY3RpdmF0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBEZWFjdGl2YXRlIHRoZSAke3R5cGVMYWJlbH0gXCIke25hbWV9XCJgXG4gICAgICAgICAgOiBgRGVhY3RpdmF0ZSBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdleGVjdXRlX2FnZW50Jzoge1xuICAgICAgICBjb25zdCBnb2FsID0gKHAuZ29hbCB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBnb2FsU3VmZml4ID0gZ29hbCA/IGAgd2l0aCBnb2FsOiAke2dvYWx9YCA6ICcnO1xuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYFJ1biB0aGUgYWdlbnQgXCIke25hbWV9XCIke2dvYWxTdWZmaXh9YFxuICAgICAgICAgIDogYEV4ZWN1dGUgYW4gYWdlbnQke2dvYWxTdWZmaXh9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2luc3RhbGxfY29sbGVjdGlvbl9jb250ZW50Jzoge1xuICAgICAgICBjb25zdCBwYXRoID0gKHAucGF0aCB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgID8gYEluc3RhbGwgXCIke3BhdGh9XCIgZnJvbSB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24gdG8geW91ciBwb3J0Zm9saW9gXG4gICAgICAgICAgOiAnSW5zdGFsbCBhbiBlbGVtZW50IGZyb20gdGhlIGNvbW11bml0eSBjb2xsZWN0aW9uJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N1Ym1pdF9jb2xsZWN0aW9uX2NvbnRlbnQnOlxuICAgICAgICByZXR1cm4gJ1N1Ym1pdCBhIGxvY2FsIGVsZW1lbnQgdG8gdGhlIGNvbW11bml0eSBjb2xsZWN0aW9uJztcbiAgICAgIGNhc2UgJ2NsZWFyJzpcbiAgICAgICAgcmV0dXJuIHR5cGVMYWJlbCAhPT0gJ2VsZW1lbnQnXG4gICAgICAgICAgPyBgQ2xlYXIgYWxsICR7dHlwZUxhYmVsfSBkYXRhYFxuICAgICAgICAgIDogJ0NsZWFyIGRhdGEnO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gb3BlcmF0aW9uIGRlc2NyaXB0aW9uIGZyb20gc2NoZW1hLCBvciBmb3JtYXR0ZWQgb3BlcmF0aW9uIG5hbWVcbiAgICAgICAgLy8gSW5jbHVkZSBwYXJhbWV0ZXIga2V5cyBzbyB1bmNvbW1vbiBvcGVyYXRpb25zIHN0aWxsIHByb3ZpZGUgdXNlZnVsIGNvbnRleHRcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gQUxMX09QRVJBVElPTl9TQ0hFTUFTW29wZXJhdGlvbl07XG4gICAgICAgIGNvbnN0IHBhcmFtS2V5cyA9IE9iamVjdC5rZXlzKHApLmZpbHRlcihrID0+IGsgIT09ICdvcGVyYXRpb24nKTtcbiAgICAgICAgY29uc3QgcGFyYW1IaW50ID0gcGFyYW1LZXlzLmxlbmd0aCA+IDAgPyBgICgke3BhcmFtS2V5cy5qb2luKCcsICcpfSlgIDogJyc7XG4gICAgICAgIGlmIChzY2hlbWE/LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3NjaGVtYS5kZXNjcmlwdGlvbn0ke3BhcmFtSGludH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgUGVyZm9ybSBvcGVyYXRpb246ICR7b3BlcmF0aW9uLnJlcGxhY2UoL18vZywgJyAnKX0ke3BhcmFtSGludH0ke2VsZW1lbnRUeXBlID8gYCBvbiAke2VsZW1lbnRUeXBlfWAgOiAnJ31gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY29yZSB0aGUgcmlzayBvZiBhbiBNQ1AtQVFMIG9wZXJhdGlvbiBmb3IgYXV0by1jb25maXJtIGF1ZGl0IHRyYWlscy5cbiAgICpcbiAgICogUmV0dXJucyBhIHNjb3JlIGZyb20gMC0xMDAgYmFzZWQgb24gb3BlcmF0aW9uIGNoYXJhY3RlcmlzdGljczpcbiAgICogLSBERUxFVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSA4MCAoZGVzdHJ1Y3RpdmUsIGRhdGEgbG9zcylcbiAgICogLSBFWEVDVVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgNjAgKHVucHJlZGljdGFibGUgc2lkZSBlZmZlY3RzKVxuICAgKiAtIFVQREFURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDQwIChtb2RpZmllcyBleGlzdGluZyBkYXRhKVxuICAgKiAtIENSRUFURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDIwIChhZGRpdGl2ZSwgbG93IHJpc2spXG4gICAqXG4gICAqIE1vZGlmaWVyczpcbiAgICogLSBPcGVyYXRpb25zIHdpdGggY2FuQmVFbGV2YXRlZDogZmFsc2UgZ2V0ICsxMCAoc3RydWN0dXJhbGx5IGRhbmdlcm91cylcbiAgICogLSBPcGVyYXRpb25zIHRhcmdldGluZyBnYXRla2VlcGVyIGZpZWxkcyBnZXQgKzEwIChwcml2aWxlZ2UgZXNjYWxhdGlvbiB2ZWN0b3IpXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIG5hbWVcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gVGhlIENSVURFIGVuZHBvaW50XG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcGVyYXRpb24gcGFyYW1ldGVycyAoZm9yIGZpZWxkIGluc3BlY3Rpb24pXG4gICAqIEByZXR1cm5zIFJpc2sgc2NvcmUgMC0xMDBcbiAgICovXG4gIHByaXZhdGUgc2NvcmVPcGVyYXRpb25SaXNrKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogbnVtYmVyIHtcbiAgICAvLyBCYXNlIHNjb3JlIGJ5IGVuZHBvaW50IHR5cGVcbiAgICBjb25zdCBiYXNlU2NvcmVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgICAgREVMRVRFOiA4MCxcbiAgICAgIEVYRUNVVEU6IDYwLFxuICAgICAgVVBEQVRFOiA0MCxcbiAgICAgIENSRUFURTogMjAsXG4gICAgICBSRUFEOiAwLFxuICAgIH07XG4gICAgbGV0IHNjb3JlID0gYmFzZVNjb3Jlc1tlbmRwb2ludF0gPz8gNDA7XG5cbiAgICAvLyBNb2RpZmllcjogbm9uLWVsZXZhdGFibGUgb3BlcmF0aW9ucyBhcmUgc3RydWN0dXJhbGx5IG1vcmUgZGFuZ2Vyb3VzXG4gICAgaWYgKCFjYW5PcGVyYXRpb25CZUVsZXZhdGVkKG9wZXJhdGlvbikpIHtcbiAgICAgIHNjb3JlICs9IDEwO1xuICAgIH1cblxuICAgIC8vIE1vZGlmaWVyOiBvcGVyYXRpb25zIHRhcmdldGluZyBnYXRla2VlcGVyIGZpZWxkcyAocHJpdmlsZWdlIGVzY2FsYXRpb24gdmVjdG9yKVxuICAgIGlmIChwYXJhbXMgJiYgb3BlcmF0aW9uID09PSAnZWRpdF9lbGVtZW50Jykge1xuICAgICAgY29uc3QgaW5wdXRPYmogPSBwYXJhbXMuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoaW5wdXRPYmo/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChpbnB1dE9iaj8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NvcmUgKz0gMTA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWluKHNjb3JlLCAxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEV4ZWN1dGUgb3BlcmF0aW9ucyBmb3IgZXhlY3V0aW9uIGxpZmVjeWNsZSBtYW5hZ2VtZW50IChJc3N1ZSAjMjQ0KVxuICAgKlxuICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgaGFuZGxlIHJ1bnRpbWUgc3RhdGUgb2YgZXhlY3V0YWJsZSBlbGVtZW50czpcbiAgICogLSBleGVjdXRlOiBTdGFydCBhIG5ldyBleGVjdXRpb25cbiAgICogLSBnZXRTdGF0ZTogUXVlcnkgY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICogLSB1cGRhdGVTdGF0ZTogUmVjb3JkIHByb2dyZXNzLCBmaW5kaW5ncywgc3RlcCBjb21wbGV0aW9uXG4gICAqIC0gY29tcGxldGU6IFNpZ25hbCBzdWNjZXNzZnVsIGNvbXBsZXRpb25cbiAgICogLSBjb250aW51ZTogUmVzdW1lIGZyb20gc2F2ZWQgc3RhdGVcbiAgICogLSBhYm9ydDogQ2FuY2VsIGFuIG9uZ29pbmcgZXhlY3V0aW9uXG4gICAqXG4gICAqIFRoZXNlIG9wZXJhdGlvbnMgYXJlIG5vbi1pZGVtcG90ZW50IGJ5IG5hdHVyZSAodW5saWtlIENSVUQgb3BlcmF0aW9ucykuXG4gICAqIEN1cnJlbnRseSByb3V0ZXMgdG8gQWdlbnRNYW5hZ2VyLCBidXQgZGVzaWduZWQgZm9yIGZ1dHVyZSBleHRlbnNpYmlsaXR5XG4gICAqIHRvIHdvcmtmbG93cywgcGlwZWxpbmVzLCBhbmQgb3RoZXIgZXhlY3V0YWJsZSBlbGVtZW50IHR5cGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEV4ZWN1dGUoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5oYW5kbGVycy5hZ2VudE1hbmFnZXI7XG5cbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBlbGVtZW50X25hbWUgcGFyYW1ldGVyICh3YXMgaW5jb3JyZWN0bHkgdXNpbmcgJ25hbWUnKVxuICAgIC8vIEFsbCBleGVjdXRlIG9wZXJhdGlvbnMgcmVxdWlyZSBlbGVtZW50X25hbWUgdG8gaWRlbnRpZnkgdGhlIHRhcmdldFxuICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdmFsaWRhdGVFeGVjdXRpb25FbGVtZW50TmFtZShtZXRob2QsIHBhcmFtcyk7XG4gICAgY29uc3QgZXhlY3V0aW9uS2V5ID0gbm9ybWFsaXplQWdlbnRFeGVjdXRpb25JZGVudGl0eShlbGVtZW50TmFtZSk7XG5cbiAgICAvLyBJc3N1ZSAjMTEwOiBQcm9ncmFtbWF0aWMgZW5mb3JjZW1lbnQgZm9yIERBTkdFUl9aT05FIHRpZXJcbiAgICAvLyBJc3N1ZSAjNDAyOiBVc2UgREktaW5qZWN0ZWQgZW5mb3JjZXIgaW5zdGVhZCBvZiBzaW5nbGV0b25cbiAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlci4gU3RhdGUgcmVhZHMgYW5kXG4gICAgLy8gYWJvcnQgcmVtYWluIGF2YWlsYWJsZSBmb3IgZGlhZ25vc3RpY3MgYW5kIHNhZmUgZXhlY3V0aW9uIHNodXRkb3duLiBBYm9ydFxuICAgIC8vIGRlbGliZXJhdGVseSBwcmVzZXJ2ZXMgdGhlIGluZGVwZW5kZW50IERhbmdlclpvbmUgYmxvY2sgYmVsb3cuXG4gICAgaWYgKG1ldGhvZCAhPT0gJ2dldFN0YXRlJyAmJiBtZXRob2QgIT09ICdhYm9ydCcgJiYgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgIGNvbnN0IGJsb2NrQ2hlY2sgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlci5jaGVjayhlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoYmxvY2tDaGVjay5ibG9ja2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGJsb2NrZWQgZnJvbSBleGVjdXRpbmcgJyR7bWV0aG9kfSc6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVhc29uOiBibG9ja0NoZWNrLnJlYXNvbixcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICM0MDU6IEFjdGlvbmFibGUgZ3VpZGFuY2Ugd2l0aCB2ZXJpZnlfY2hhbGxlbmdlIGluc3RydWN0aW9uc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlcjogJHtibG9ja0NoZWNrLnJlYXNvbn0uIGAgK1xuICAgICAgICAgIGAke2Jsb2NrQ2hlY2sucmVzb2x1dGlvbn1gICtcbiAgICAgICAgICAoYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZFxuICAgICAgICAgICAgPyAnIEFzayB0aGUgaHVtYW4gb3BlcmF0b3IgdG8gcmVhZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZnJvbSB0aGUgZGlhbG9nIG9uIHRoZWlyIHNjcmVlbi4nXG4gICAgICAgICAgICA6ICcnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICMyNDk6IFJlamVjdCBleGVjdXRpb24gb3BlcmF0aW9ucyBmb3IgYWJvcnRlZCBnb2Fscy5cbiAgICAvLyBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IGV4ZWN1dGlvbiBzdGF0ZSBhcmUgYmxvY2tlZDsgZ2V0U3RhdGUgYW5kIGFib3J0IGFyZSBhbGxvd2VkLlxuICAgIGlmIChtZXRob2QgIT09ICdleGVjdXRlJyAmJiBtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgbWV0aG9kICE9PSAnYWJvcnQnKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQncyBhY3RpdmUgZ29hbCBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICBjb25zdCBhZ2VudEdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgZm9yIChjb25zdCBnb2FsSWQgb2YgYWdlbnRHb2FsSWRzKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWRHb2Fscy5oYXMoZ29hbElkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGV4ZWN1dGlvbiB3YXMgYWJvcnRlZCAoZ29hbElkOiAke2dvYWxJZH0pLiBgICtcbiAgICAgICAgICAgIGBGdXJ0aGVyIGV4ZWN1dGlvbiBvcGVyYXRpb25zIGFyZSByZWplY3RlZC4gVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZXhlY3V0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUnOiB7XG4gICAgICAgIC8vIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogVmFsaWRhdGUgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGVcbiAgICAgICAgY29uc3QgcnVudGltZU1heFN0ZXBzID0gcGFyYW1zLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgaWYgKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lTWF4U3RlcHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJ1bnRpbWVNYXhTdGVwcykgfHwgcnVudGltZU1heFN0ZXBzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0OTogVHJhY2sgZXhlY3V0aW5nIGFnZW50IGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudFxuICAgICAgICAvLyBJc3N1ZSAjNDQ3OiBBbHNvIHN0b3JlIHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEFsc28gc3RvcmUgcmVzaWxpZW5jZSBwb2xpY3kgYW5kIG9yaWdpbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudEVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyLnJlYWQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50TWV0YSA9IGFnZW50RWxlbWVudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgICAgICBsZXQgZ2F0ZWtlZXBlclBvbGljeSA9IGFnZW50TWV0YS5nYXRla2VlcGVyO1xuXG4gICAgICAgICAgICAvLyBTeW50aGVzaXplIHBvbGljeSBmcm9tIHRvb2xzIGNvbmZpZyBpZiBubyBleHBsaWNpdCBnYXRla2VlcGVyIHBvbGljeVxuICAgICAgICAgICAgaWYgKCFnYXRla2VlcGVyUG9saWN5ICYmIGFnZW50TWV0YS50b29scykge1xuICAgICAgICAgICAgICBnYXRla2VlcGVyUG9saWN5ID0gdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5KGFnZW50TWV0YS50b29scykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc3N1ZSAjNTI2OiBFeHRyYWN0IHJlc2lsaWVuY2UgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJlc2lsaWVuY2VQb2xpY3kgPSBhZ2VudE1ldGEucmVzaWxpZW5jZTtcblxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyYWNrIGlmIHRoZXJlJ3MgYSBnYXRla2VlcGVyIHBvbGljeSwgcnVudGltZSBvdmVycmlkZSwgb3IgcmVzaWxpZW5jZSBwb2xpY3lcbiAgICAgICAgICAgIGlmIChnYXRla2VlcGVyUG9saWN5IHx8IHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkIHx8IHJlc2lsaWVuY2VQb2xpY3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuc2V0KGV4ZWN1dGlvbktleSwge1xuICAgICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAuLi4oZ2F0ZWtlZXBlclBvbGljeSA/IHsgZ2F0ZWtlZXBlcjogZ2F0ZWtlZXBlclBvbGljeSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgLi4uKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkID8geyBtYXhBdXRvbm9tb3VzU3RlcHM6IHJ1bnRpbWVNYXhTdGVwcyB9IDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbkNvdW50OiAwLFxuICAgICAgICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxQYXJhbWV0ZXJzOiBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZXNpbGllbmNlUG9saWN5LFxuICAgICAgICAgICAgICAgIHJlY2VudEJsb2NrczogW10sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIE5vIGFnZW50IGVsZW1lbnQgdG8gcmVhZCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc3RvcmUgdGhlIG92ZXJyaWRlXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGluZ0FnZW50cy5zZXQoZXhlY3V0aW9uS2V5LCB7XG4gICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBtYXhBdXRvbm9tb3VzU3RlcHM6IHJ1bnRpbWVNYXhTdGVwcyB9LFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIGNvbnRpbnVhdGlvbkNvdW50OiAwLFxuICAgICAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgICAgICBvcmlnaW5hbFBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByZWNlbnRCbG9ja3M6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBOb24tZmF0YWw6IGFnZW50IGV4ZWN1dGVzIGV2ZW4gaWYgdHJhY2tpbmcgZmFpbHNcbiAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHRyYWNrIGV4ZWN1dGluZyBhZ2VudCBmb3IgR2F0ZWtlZXBlciBwb2xpY3knLCB7IGFnZW50TmFtZTogZWxlbWVudE5hbWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnRXhlY3V0ZUFnZW50UmVzdWx0JywgLi4uZXhlY3V0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRTdGF0ZSc6IHtcbiAgICAgICAgLy8gUXVlcnkgY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICAgICAgY29uc3Qgc3RhdGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmdldEFnZW50U3RhdGUoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeTogcGFyYW1zLmluY2x1ZGVEZWNpc2lvbkhpc3RvcnkgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlQ29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnRXhlY3V0aW9uU3RhdGUnLCAuLi5zdGF0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICd1cGRhdGVTdGF0ZSc6IHtcbiAgICAgICAgLy8gUmVjb3JkIGV4ZWN1dGlvbiBwcm9ncmVzcywgc3RlcCBjb21wbGV0aW9uLCBvciBmaW5kaW5nc1xuICAgICAgICAvLyBSZXR1cm5zIGF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIGNvbnRpbnVlL3BhdXNlXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgb3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICBjb25zdCBuZXh0QWN0aW9uSGludCA9IHBhcmFtcy5uZXh0QWN0aW9uSGludDtcbiAgICAgICAgaWYgKG5leHRBY3Rpb25IaW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG5leHRBY3Rpb25IaW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbmV4dEFjdGlvbkhpbnQgbXVzdCBiZSBhIHN0cmluZyBpZiBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcmlza1Njb3JlID0gcGFyYW1zLnJpc2tTY29yZTtcbiAgICAgICAgaWYgKHJpc2tTY29yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByaXNrU2NvcmUgIT09ICdudW1iZXInIHx8IGlzTmFOKHJpc2tTY29yZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmlza1Njb3JlIG11c3QgYmUgYSBudW1iZXIgaWYgcHJvdmlkZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpc2tTY29yZSA8IDAgfHwgcmlza1Njb3JlID4gMTAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jpc2tTY29yZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgc3RvcmVkIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGV4ZWN1dGlvbktleSk7XG4gICAgICAgIGNvbnN0IG1heFN0ZXBzT3ZlcnJpZGUgPSBleGVjdXRpbmdBZ2VudD8ubWV0YWRhdGE/Lm1heEF1dG9ub21vdXNTdGVwcyBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5yZWNvcmRBZ2VudFN0ZXAoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgc3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZSBhcyAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbCcsXG4gICAgICAgICAgZmluZGluZ3M6IHBhcmFtcy5maW5kaW5ncyBhcyBzdHJpbmcsXG4gICAgICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgYXMgbnVtYmVyLFxuICAgICAgICAgIG5leHRBY3Rpb25IaW50OiBuZXh0QWN0aW9uSGludCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmlza1Njb3JlOiByaXNrU2NvcmUgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFN0ZXBzT3ZlcnJpZGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEV2YWx1YXRlIHJlc2lsaWVuY2UgcG9saWN5IHdoZW4gYXV0b25vbXkgc2F5cyBwYXVzZVxuICAgICAgICBjb25zdCByZXNpbGllbmNlUmVzdWx0ID0gdGhpcy5ldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZXhlY3V0aW9uS2V5LFxuICAgICAgICAgIHVwZGF0ZVJlc3VsdCxcbiAgICAgICAgICBwYXJhbXMub3V0Y29tZSBhcyBzdHJpbmdcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtOiBjb2xsZWN0IGFuZCBhdHRhY2ggbm90aWZpY2F0aW9uc1xuICAgICAgICBjb25zdCBmaW5hbFJlc3VsdCA9IHJlc2lsaWVuY2VSZXN1bHQgPz8gdXBkYXRlUmVzdWx0O1xuICAgICAgICBjb25zdCBhdXRvbm9teSA9IGZpbmFsUmVzdWx0LmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoYXV0b25vbXkpIHtcbiAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25zID0gdGhpcy5jb2xsZWN0Tm90aWZpY2F0aW9ucyhleGVjdXRpb25LZXksIGF1dG9ub215KTtcbiAgICAgICAgICBpZiAobm90aWZpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhdXRvbm9teS5ub3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnU3RlcFJlc3VsdCcsIC4uLmZpbmFsUmVzdWx0IH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NvbXBsZXRlJzoge1xuICAgICAgICAvLyBTaWduYWwgZXhlY3V0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICBjb25zdCBjb21wbGV0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWUgYXMgJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnIHwgJ3BhcnRpYWwnLFxuICAgICAgICAgIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5IGFzIHN0cmluZyxcbiAgICAgICAgICBnb2FsSWQ6IHBhcmFtcy5nb2FsSWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTI2OiBUcmFjayByZXNpbGllbmNlIG91dGNvbWUgYW5kIHJlc2V0IGNpcmN1aXQgYnJlYWtlciBvbiBzdWNjZXNzXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZEFnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGV4ZWN1dGlvbktleSk7XG4gICAgICAgIGlmIChjb21wbGV0ZWRBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSAmJiAoY29tcGxldGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGNvbXBsZXRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHBhcmFtcy5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ29tcGxldGlvbkFmdGVyUmVzaWxpZW5jZShpc1N1Y2Nlc3MpO1xuICAgICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNpcmN1aXRCcmVha2VyLnJlc2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNDQ5OiBSZW1vdmUgYWdlbnQgZnJvbSBleGVjdXRpbmcgc2V0IHNvIGl0cyBwb2xpY2llcyBzdG9wIGFwcGx5aW5nXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShleGVjdXRpb25LZXkpO1xuXG4gICAgICAgIC8vIElzc3VlICMxMjU6IFJldHVybiBzdHJ1Y3R1cmVkIEpTT04gd2l0aCB0eXBlIGRpc2NyaW1pbmF0b3JcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdDb21wbGV0aW9uUmVzdWx0JywgLi4uY29tcGxldGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnY29udGludWUnOiB7XG4gICAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gZnJvbSBzYXZlZCBzdGF0ZVxuICAgICAgICBjb25zdCBjb250aW51ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuY29udGludWVBZ2VudEV4ZWN1dGlvbih7XG4gICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ6IHBhcmFtcy5wcmV2aW91c1N0ZXBSZXN1bHQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0NvbnRpbnVlUmVzdWx0JywgLi4uY29udGludWVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYWJvcnQnOiB7XG4gICAgICAgIC8vIElzc3VlICMyNDk6IEFib3J0IGEgcnVubmluZyBhZ2VudCBleGVjdXRpb25cbiAgICAgICAgY29uc3QgcmVhc29uID0gKHBhcmFtcy5yZWFzb24gYXMgc3RyaW5nKSB8fCAnQWJvcnRlZCBieSB1c2VyJztcblxuICAgICAgICAvLyBGaW5kIHRoZSBhY3RpdmUgZ29hbCBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBjb25zdCBleGVjdXRpb25Qb2xpY3lBdExvb2t1cFN0YXJ0ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGV4ZWN1dGlvbktleSk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb25PYnNlcnZhdGlvbiA9IG1hbmFnZXIub2JzZXJ2ZUV4ZWN1dGlvbkdlbmVyYXRpb24oZWxlbWVudE5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUsIGZhbHNlKTtcbiAgICAgICAgICBpZiAoYWN0aXZlR29hbElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIElzc3VlICMyNDI3OiB0aGUgZHVyYWJsZSBnb2FsIG1heSBhbHJlYWR5IGJlIGdvbmUgd2hpbGUgdGhlIGluLW1lbW9yeVxuICAgICAgICAgICAgLy8gZXhlY3V0aW9uIHBvbGljeSByZW1haW5zLiBFeHBsaWNpdCBhYm9ydCBpcyBzYWZlciBhbmQgbmFycm93ZXIgdGhhblxuICAgICAgICAgICAgLy8gY2xlYXJpbmcgZXZlcnkgYWN0aXZlIGVsZW1lbnQgdGhyb3VnaCByZWxlYXNlX2RlYWRsb2NrLlxuICAgICAgICAgICAgLy8gUmUtcmVhZCBkdXJhYmxlIHN0YXRlIGltbWVkaWF0ZWx5IGJlZm9yZSBjbGVhbnVwLiBBIGNvbmN1cnJlbnRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGVfYWdlbnQgY2FuIHBlcnNpc3QgYSBuZXcgZ29hbCB3aGlsZSBwb2xpY3kgdHJhY2tpbmcgZmFpbHMsXG4gICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBvbGQgbWFwIG9iamVjdCB1bmNoYW5nZWQgYW5kIGRlZmVhdGluZyBpZGVudGl0eSBjaGVja3NcbiAgICAgICAgICAgIC8vIGJ5IHRoZW1zZWx2ZXMuXG4gICAgICAgICAgICBjb25zdCByZXZhbGlkYXRlZEdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFeGVjdXRpb25Qb2xpY3kgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoZXhlY3V0aW9uS2V5KTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcmV2YWxpZGF0ZWRHb2FsSWRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgbWFuYWdlci5oYXNFeGVjdXRpb25HZW5lcmF0aW9uQ2hhbmdlZChlbGVtZW50TmFtZSwgZ2VuZXJhdGlvbk9ic2VydmF0aW9uLnRva2VuKSB8fFxuICAgICAgICAgICAgICAoY3VycmVudEV4ZWN1dGlvblBvbGljeSAmJiBjdXJyZW50RXhlY3V0aW9uUG9saWN5ICE9PSBleGVjdXRpb25Qb2xpY3lBdExvb2t1cFN0YXJ0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhlY3V0aW9uIHN0YXRlIGNoYW5nZWQgd2hpbGUgcmVjb3ZlcmluZyBhZ2VudCAnJHtlbGVtZW50TmFtZX0nLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIG5ld2VyIGV4ZWN1dGlvbiBwb2xpY3kgd2FzIHByZXNlcnZlZDsgcmV0cnkgYWJvcnRfZXhlY3V0aW9uIHRvIGFib3J0IGl0LmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleGVjdXRpb25Qb2xpY3lBdExvb2t1cFN0YXJ0ICYmIGN1cnJlbnRFeGVjdXRpb25Qb2xpY3kgPT09IGV4ZWN1dGlvblBvbGljeUF0TG9va3VwU3RhcnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuZGVsZXRlKGV4ZWN1dGlvbktleSk7XG4gICAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQUdFTlRfUE9MSUNZX1JFQ09WRVJFRCcsXG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hFeGVjdXRlLmFib3J0JyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiBgUmVjb3ZlcmVkIHN0YWxlIGV4ZWN1dGlvbiBwb2xpY3kgZm9yIGFnZW50OiAke2VsZW1lbnROYW1lfWAsXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgYWdlbnROYW1lOiBlbGVtZW50TmFtZSwgcmVhc29uOiAnc3RhbGVfZXhlY3V0aW9uX3BvbGljeScgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX3R5cGU6ICdBYm9ydFJlc3VsdCcsXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBbXSxcbiAgICAgICAgICAgICAgICByZWNvdmVyZWRTdGFsZVBvbGljeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYFJlbW92ZWQgc3RhbGUgZXhlY3V0aW9uIHBvbGljeSBmb3IgYWdlbnQgJyR7ZWxlbWVudE5hbWV9Jy4gTm8gYWN0aXZlIGdvYWwgcmVtYWluZWQuYCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYE5vIGFjdGl2ZSBleGVjdXRpb24gZm91bmQgZm9yIGFnZW50ICcke2VsZW1lbnROYW1lfScuIGAgK1xuICAgICAgICAgICAgICBgTm90aGluZyB0byBhYm9ydC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENvbXBsZXRlIGVhY2ggZXhhY3QgZ29hbCBmcm9tIHRoZSBzdHJpY3Qgc25hcHNob3QgYmVmb3JlIGRyb3BwaW5nIHBvbGljeS5cbiAgICAgICAgICAvLyBBbnkgc3RvcmFnZSBvciB2ZXJzaW9uIGNvbmZsaWN0IGZhaWxzIGNsb3NlZCBhbmQgcHJlc2VydmVzIHRoZSBzYW5kYm94LlxuICAgICAgICAgIGZvciAoY29uc3QgZ29hbElkIG9mIGFjdGl2ZUdvYWxJZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWxGb3JSZWNvdmVyeSh7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGdvYWxJZCxcbiAgICAgICAgICAgICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgICAgICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0aW9uIGFib3J0ZWQ6ICR7cmVhc29ufWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRlZEdvYWxzLmFkZChnb2FsSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEEgbmV3IGV4ZWN1dGlvbiBtYXkgYmVnaW4gYWZ0ZXIgdGhlIGFjdGl2ZS1nb2FsIHNuYXBzaG90IG9yIGFmdGVyIHRoZVxuICAgICAgICAgIC8vIG9sZCBnb2FscyBhcmUgY29tcGxldGVkLiBQcmVzZXJ2ZSBpdHMgcG9saWN5IHVubGVzcyBkdXJhYmxlIHN0YXRlLFxuICAgICAgICAgIC8vIGdlbmVyYXRpb24sIGFuZCBtYXAgaWRlbnRpdHkgc3RpbGwgZGVzY3JpYmUgdGhlIG9yaWdpbmFsIGV4ZWN1dGlvbi5cbiAgICAgICAgICBjb25zdCByZW1haW5pbmdBY3RpdmVHb2FsSWRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVHb2FsSWRzKG1hbmFnZXIsIGVsZW1lbnROYW1lLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudEV4ZWN1dGlvblBvbGljeSA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChleGVjdXRpb25LZXkpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlbWFpbmluZ0FjdGl2ZUdvYWxJZHMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgbWFuYWdlci5oYXNFeGVjdXRpb25HZW5lcmF0aW9uQ2hhbmdlZChlbGVtZW50TmFtZSwgZ2VuZXJhdGlvbk9ic2VydmF0aW9uLnRva2VuKSB8fFxuICAgICAgICAgICAgKGN1cnJlbnRFeGVjdXRpb25Qb2xpY3kgJiYgY3VycmVudEV4ZWN1dGlvblBvbGljeSAhPT0gZXhlY3V0aW9uUG9saWN5QXRMb29rdXBTdGFydClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEV4ZWN1dGlvbiBzdGF0ZSBjaGFuZ2VkIHdoaWxlIGFib3J0aW5nIGFnZW50ICcke2VsZW1lbnROYW1lfScuIGAgK1xuICAgICAgICAgICAgICBgVGhlIG5ld2VyIGV4ZWN1dGlvbiBwb2xpY3kgd2FzIHByZXNlcnZlZDsgcmV0cnkgYWJvcnRfZXhlY3V0aW9uIHRvIGFib3J0IGl0LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSXNzdWUgIzUyNjogVHJhY2sgcmVzaWxpZW5jZSBvdXRjb21lIChhYm9ydCA9IGZhaWx1cmUgYWZ0ZXIgcmVzaWxpZW5jZSlcbiAgICAgICAgICBjb25zdCBhYm9ydGVkQWdlbnQgPSBleGVjdXRpb25Qb2xpY3lBdExvb2t1cFN0YXJ0O1xuICAgICAgICAgIGlmIChhYm9ydGVkQWdlbnQ/LnJlc2lsaWVuY2VQb2xpY3kgJiYgKGFib3J0ZWRBZ2VudC5jb250aW51YXRpb25Db3VudCA+IDAgfHwgYWJvcnRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ29tcGxldGlvbkFmdGVyUmVzaWxpZW5jZShmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGVsZXRlIG9ubHkgdGhlIHBvbGljeSB0aGF0IHdhcyBwcmVzZW50IHdoZW4gdGhpcyBhYm9ydCBiZWdhbi5cbiAgICAgICAgICBpZiAoY3VycmVudEV4ZWN1dGlvblBvbGljeSA9PT0gZXhlY3V0aW9uUG9saWN5QXRMb29rdXBTdGFydCkge1xuICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuZGVsZXRlKGV4ZWN1dGlvbktleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hFeGVjdXRlLmFib3J0JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRpb24gYWJvcnRlZDogJHtlbGVtZW50TmFtZX0g4oCUICR7cmVhc29ufWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBhYm9ydGVkR29hbElkczogYWN0aXZlR29hbElkcyxcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIElzc3VlICMxMjU6IFJldHVybiBzdHJ1Y3R1cmVkIEpTT04gd2l0aCB0eXBlIGRpc2NyaW1pbmF0b3JcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3R5cGU6ICdBYm9ydFJlc3VsdCcsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBhY3RpdmVHb2FsSWRzLFxuICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke2VsZW1lbnROYW1lfScgZXhlY3V0aW9uIGFib3J0ZWQuICR7YWN0aXZlR29hbElkcy5sZW5ndGh9IGdvYWwocykgdGVybWluYXRlZC5gLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZ2VuZXJhdGlvbk9ic2VydmF0aW9uLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRHYXRoZXJlZERhdGEnOiB7XG4gICAgICAgIC8vIElzc3VlICM2ODogR2V0IGFnZ3JlZ2F0ZWQgZXhlY3V0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWMgZ29hbFxuICAgICAgICBjb25zdCBnb2FsSWQgPSBwYXJhbXMuZ29hbElkO1xuICAgICAgICBpZiAodHlwZW9mIGdvYWxJZCAhPT0gJ3N0cmluZycgfHwgIWdvYWxJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ29hbElkIGlzIHJlcXVpcmVkIGZvciBnZXRfZ2F0aGVyZWRfZGF0YScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdhdGhlcmVkRGF0YSA9IGF3YWl0IG1hbmFnZXIuZ2V0R2F0aGVyZWREYXRhKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGdvYWxJZDogZ29hbElkIGFzIHN0cmluZyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnR2F0aGVyZWREYXRhJywgLi4uZ2F0aGVyZWREYXRhIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3ByZXBhcmVIYW5kb2ZmJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjk6IFByZXBhcmUgYSBoYW5kb2ZmIHN0YXRlIGZvciBzZXNzaW9uIHRyYW5zZmVyXG4gICAgICAgIGNvbnN0IGhhbmRvZmZHb2FsSWQgPSBwYXJhbXMuZ29hbElkO1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRvZmZHb2FsSWQgIT09ICdzdHJpbmcnIHx8ICFoYW5kb2ZmR29hbElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnb2FsSWQgaXMgcmVxdWlyZWQgZm9yIHByZXBhcmVfaGFuZG9mZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGdhdGhlcmVkIGRhdGEgZm9yIHRoZSBnb2FsXG4gICAgICAgIGNvbnN0IGhhbmRvZmZHYXRoZXJlZERhdGEgPSBhd2FpdCBtYW5hZ2VyLmdldEdhdGhlcmVkRGF0YSh7XG4gICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICBnb2FsSWQ6IGhhbmRvZmZHb2FsSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlYWQgYWdlbnQgbWV0YWRhdGEgZm9yIGFjdGl2ZSBlbGVtZW50cyBhbmQgc3VjY2VzcyBjcml0ZXJpYVxuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgICAgICBsZXQgc3VjY2Vzc0NyaXRlcmlhOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFnZW50RWxlbWVudCA9IGF3YWl0IG1hbmFnZXIucmVhZChlbGVtZW50TmFtZSk7XG4gICAgICAgICAgaWYgKGFnZW50RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IGFnZW50RWxlbWVudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgICAgICBpZiAobWV0YS5hY3RpdmF0ZXMpIHtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudHMgPSB7IC4uLm1ldGEuYWN0aXZhdGVzIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VjY2Vzc0NyaXRlcmlhID0gbWV0YS5nb2FsPy5zdWNjZXNzQ3JpdGVyaWEgfHwgW107XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBOb24tZmF0YWw6IHByb2NlZWQgd2l0aCBkZWZhdWx0c1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIHRoZSBhZ2VudCBpdHNlbGZcbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50c1snYWdlbnRzJ10pIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50c1snYWdlbnRzJ10gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXS5pbmNsdWRlcyhlbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50c1snYWdlbnRzJ10ucHVzaChlbGVtZW50TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCB0aGUgaGFuZG9mZiBzdGF0ZVxuICAgICAgICBjb25zdCBoYW5kb2ZmU3RhdGUgPSBwcmVwYXJlSGFuZG9mZlN0YXRlKFxuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGhhbmRvZmZHYXRoZXJlZERhdGEsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgICAgc3VjY2Vzc0NyaXRlcmlhXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGNvcHktcGFzdGVhYmxlIGJsb2NrXG4gICAgICAgIGNvbnN0IGhhbmRvZmZCbG9jayA9IGdlbmVyYXRlSGFuZG9mZkJsb2NrKGhhbmRvZmZTdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfdHlwZTogJ0hhbmRvZmZSZXN1bHQnLFxuICAgICAgICAgIGhhbmRvZmZTdGF0ZSxcbiAgICAgICAgICBoYW5kb2ZmQmxvY2ssXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3Jlc3VtZUZyb21IYW5kb2ZmJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjk6IFJlc3VtZSBleGVjdXRpb24gZnJvbSBhIGhhbmRvZmYgYmxvY2tcbiAgICAgICAgY29uc3QgaGFuZG9mZkJsb2NrUGFyYW0gPSBwYXJhbXMuaGFuZG9mZkJsb2NrO1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRvZmZCbG9ja1BhcmFtICE9PSAnc3RyaW5nJyB8fCAhaGFuZG9mZkJsb2NrUGFyYW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRvZmZCbG9jayBpcyByZXF1aXJlZCBmb3IgcmVzdW1lX2Zyb21faGFuZG9mZiAodGhlIGZ1bGwgaGFuZG9mZiBibG9jayB0ZXh0KScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgYW5kIHZhbGlkYXRlIHRoZSBoYW5kb2ZmIGJsb2NrIChjaGVja3N1bSB2YWxpZGF0ZWQgaW50ZXJuYWxseSlcbiAgICAgICAgY29uc3QgcmVzdG9yZWRTdGF0ZSA9IHBhcnNlSGFuZG9mZkJsb2NrKGhhbmRvZmZCbG9ja1BhcmFtKTtcblxuICAgICAgICAvLyBWZXJpZnkgdGhlIGFnZW50IG5hbWUgbWF0Y2hlc1xuICAgICAgICBpZiAocmVzdG9yZWRTdGF0ZS5hZ2VudE5hbWUgIT09IGVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0hhbmRvZmYgYWdlbnQgbWlzbWF0Y2ggZGV0ZWN0ZWQnLCB7XG4gICAgICAgICAgICBleHBlY3RlZEFnZW50OiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIGJsb2NrQWdlbnQ6IHJlc3RvcmVkU3RhdGUuYWdlbnROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdIYW5kb2ZmIGFnZW50IG1pc21hdGNoOiB0aGUgaGFuZG9mZiBibG9jayB3YXMgbm90IHByZXBhcmVkIGZvciB0aGlzIGFnZW50J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNZXJnZSBjYWxsZXItcHJvdmlkZWQgcGFyYW1ldGVycyB3aXRoIGhhbmRvZmYgbWV0YWRhdGEuXG4gICAgICAgIC8vIFRoZSBjYWxsZXIgbXVzdCBzdXBwbHkgYW55IHJlcXVpcmVkIGdvYWwgdGVtcGxhdGUgcGFyYW1ldGVycyAoZS5nLiB0YXNrKS5cbiAgICAgICAgY29uc3QgY2FsbGVyUGFyYW1zID0gKHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB8fCB7fTtcbiAgICAgICAgY29uc3QgcmVzdW1lUGFyYW1zID0ge1xuICAgICAgICAgIC4uLmNhbGxlclBhcmFtcyxcbiAgICAgICAgICByZXN1bWVkRnJvbUhhbmRvZmY6IHRydWUsXG4gICAgICAgICAgb3JpZ2luYWxHb2FsSWQ6IHJlc3RvcmVkU3RhdGUuZ29hbElkLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gdXNpbmcgY29udGludWUgd2l0aCByZXN0b3JlZCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5jb250aW51ZUFnZW50RXhlY3V0aW9uKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogYFJlc3VtZWQgZnJvbSBoYW5kb2ZmIChnb2FsSWQ6ICR7cmVzdG9yZWRTdGF0ZS5nb2FsSWR9LCAke3Jlc3RvcmVkU3RhdGUuZ29hbFByb2dyZXNzLnN0ZXBzQ29tcGxldGVkfSBzdGVwcyBjb21wbGV0ZWQpYCxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiByZXN1bWVQYXJhbXMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3R5cGU6ICdSZXN1bWVSZXN1bHQnLFxuICAgICAgICAgIC4uLmNvbnRpbnVlUmVzdWx0LFxuICAgICAgICAgIHJlc3RvcmVkRnJvbToge1xuICAgICAgICAgICAgYWdlbnROYW1lOiByZXN0b3JlZFN0YXRlLmFnZW50TmFtZSxcbiAgICAgICAgICAgIGdvYWxJZDogcmVzdG9yZWRTdGF0ZS5nb2FsSWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiByZXN0b3JlZFN0YXRlLnZlcnNpb24sXG4gICAgICAgICAgICBzdGVwc0NvbXBsZXRlZDogcmVzdG9yZWRTdGF0ZS5nb2FsUHJvZ3Jlc3Muc3RlcHNDb21wbGV0ZWQsXG4gICAgICAgICAgICBwcmVwYXJlZEF0OiByZXN0b3JlZFN0YXRlLnByZXBhcmVkQXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEV4ZWN1dGUgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBNYXhpbXVtIHJlY2VudCBibG9ja3MgdHJhY2tlZCBwZXIgYWdlbnQgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9SRUNFTlRfQkxPQ0tTID0gNTA7XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIGdhdGVrZWVwZXIgYmxvY2sgYWdhaW5zdCBhbGwgY3VycmVudGx5IGV4ZWN1dGluZyBhZ2VudHMuXG4gICAqIENhbGxlZCB3aGVuIEdhdGVrZWVwZXIuZW5mb3JjZSgpIGRlbmllcyBhbiBvcGVyYXRpb24sIHNvIHRoYXRcbiAgICogcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIGNhbiByZXBvcnQgaXQgYXMgYSBub3RpZmljYXRpb24uXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4xLjAgLSBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlY29yZEdhdGVrZWVwZXJCbG9ja0ZvckFnZW50cyhcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJlYXNvbjogc3RyaW5nLFxuICAgIGxldmVsOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhlY3V0aW5nQWdlbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGJsb2NrID0ge1xuICAgICAgb3BlcmF0aW9uLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICByZWFzb24sXG4gICAgICBsZXZlbCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcmVwb3J0ZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFssIGFnZW50RW50cnldIG9mIHRoaXMuZXhlY3V0aW5nQWdlbnRzKSB7XG4gICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5wdXNoKGJsb2NrKTtcblxuICAgICAgLy8gQ2FwIGF0IE1BWF9SRUNFTlRfQkxPQ0tTOiBldmljdCBvbGRlc3QgcmVwb3J0ZWQgZmlyc3QsIHRoZW4gb2xkZXN0IHVucmVwb3J0ZWRcbiAgICAgIHdoaWxlIChhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5sZW5ndGggPiBNQ1BBUUxIYW5kbGVyLk1BWF9SRUNFTlRfQkxPQ0tTKSB7XG4gICAgICAgIGNvbnN0IHJlcG9ydGVkSWR4ID0gYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3MuZmluZEluZGV4KGIgPT4gYi5yZXBvcnRlZCk7XG4gICAgICAgIGlmIChyZXBvcnRlZElkeCA+PSAwKSB7XG4gICAgICAgICAgYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3Muc3BsaWNlKHJlcG9ydGVkSWR4LCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Qgbm90aWZpY2F0aW9ucyBmb3IgYW4gZXhlY3V0aW5nIGFnZW50IGZyb20gYWxsIHNvdXJjZXM6XG4gICAqIDEuIFVucmVwb3J0ZWQgZ2F0ZWtlZXBlciBibG9ja3Mg4oaSIHBlcm1pc3Npb25fcGVuZGluZ1xuICAgKiAyLiBBdXRvbm9teSBwYXVzZSAoY29udGludWU9ZmFsc2UpIOKGkiBhdXRvbm9teV9wYXVzZVxuICAgKiAzLiBEYW5nZXJab25lIGJsb2NrZWQgYWdlbnRzIChzeXN0ZW0td2lkZSBicm9hZGNhc3QpIOKGkiBkYW5nZXJfem9uZVxuICAgKlxuICAgKiBHYXRla2VlcGVyIGJsb2NrcyBhcmUgbWFya2VkIGFzIFwicmVwb3J0ZWRcIiBhZnRlciBmaXJzdCBjb2xsZWN0aW9uXG4gICAqIHNvIHRoZXkgZG9uJ3QgcmVwZWF0IG9uIHN1YnNlcXVlbnQgY2FsbHMuIERhbmdlclpvbmUgYW5kIGF1dG9ub215XG4gICAqIG5vdGlmaWNhdGlvbnMgYXJlIGFsd2F5cyBlbWl0dGVkIHdoaWxlIHRoZSBjb25kaXRpb24gcGVyc2lzdHMuXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4xLjAgLSBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3ROb3RpZmljYXRpb25zKFxuICAgIGV4ZWN1dGlvbktleTogc3RyaW5nLFxuICAgIGF1dG9ub215OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBBZ2VudE5vdGlmaWNhdGlvbltdIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25zOiBBZ2VudE5vdGlmaWNhdGlvbltdID0gW107XG4gICAgY29uc3QgZXhlY3V0aW5nQWdlbnQgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoZXhlY3V0aW9uS2V5KTtcblxuICAgIC8vIFNvdXJjZSAxOiBVbnJlcG9ydGVkIGdhdGVrZWVwZXIgYmxvY2tzXG4gICAgaWYgKGV4ZWN1dGluZ0FnZW50Py5yZWNlbnRCbG9ja3MpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2sgb2YgZXhlY3V0aW5nQWdlbnQucmVjZW50QmxvY2tzKSB7XG4gICAgICAgIGlmICghYmxvY2sucmVwb3J0ZWQpIHtcbiAgICAgICAgICBub3RpZmljYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ3Blcm1pc3Npb25fcGVuZGluZycsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtibG9jay5vcGVyYXRpb259JHtibG9jay5lbGVtZW50VHlwZSA/IGAoJHtibG9jay5lbGVtZW50VHlwZX0pYCA6ICcnfSByZXF1aXJlcyBjb25maXJtYXRpb25gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uOiBibG9jay5vcGVyYXRpb24sXG4gICAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogYmxvY2suZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIHJlYXNvbjogYmxvY2sucmVhc29uLFxuICAgICAgICAgICAgICBsZXZlbDogYmxvY2subGV2ZWwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBibG9jay50aW1lc3RhbXAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYmxvY2sucmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU291cmNlIDI6IEF1dG9ub215IHBhdXNlXG4gICAgaWYgKGF1dG9ub215LmNvbnRpbnVlID09PSBmYWxzZSkge1xuICAgICAgY29uc3QgcmVhc29uID0gKGF1dG9ub215LnJlYXNvbiBhcyBzdHJpbmcpIHx8IChhdXRvbm9teS5mYWN0b3JzIGFzIHN0cmluZ1tdIHx8IFtdKS5qb2luKCcsICcpO1xuICAgICAgaWYgKHJlYXNvbikge1xuICAgICAgICBub3RpZmljYXRpb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhdXRvbm9teV9wYXVzZScsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50IHBhdXNlZDogJHtyZWFzb259YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvdXJjZSAzOiBEYW5nZXJab25lIGJyb2FkY2FzdCDigJQgYWxlcnQgQUxMIGV4ZWN1dGluZyBhZ2VudHMgYWJvdXQgYW55IGJsb2NrZWQgYWdlbnRcbiAgICBjb25zdCBlbmZvcmNlciA9IHRoaXMuaGFuZGxlcnMuZGFuZ2VyWm9uZUVuZm9yY2VyO1xuICAgIGlmIChlbmZvcmNlcj8uaGFzQmxvY2tlZEFnZW50cygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGJsb2NrZWRBZ2VudCBvZiBlbmZvcmNlci5nZXRCbG9ja2VkQWdlbnRzKCkpIHtcbiAgICAgICAgY29uc3QgYmxvY2tDaGVjayA9IGVuZm9yY2VyLmNoZWNrKGJsb2NrZWRBZ2VudCk7XG4gICAgICAgIGlmIChibG9ja0NoZWNrLmJsb2NrZWQpIHtcbiAgICAgICAgICBub3RpZmljYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2Rhbmdlcl96b25lJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtibG9ja2VkQWdlbnR9JyBpcyBibG9ja2VkIGR1ZSB0byBkYW5nZXIgem9uZSB0cmlnZ2VyOiAke2Jsb2NrQ2hlY2sucmVhc29ufWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBhZ2VudE5hbWU6IGJsb2NrZWRBZ2VudCxcbiAgICAgICAgICAgICAgcmVhc29uOiBibG9ja0NoZWNrLnJlYXNvbixcbiAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uSWQ6IGJsb2NrQ2hlY2sudmVyaWZpY2F0aW9uSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm90aWZpY2F0aW9ucztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVzaWxpZW5jZSBFdmFsdWF0aW9uIChJc3N1ZSAjNTI2KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIHJlc2lsaWVuY2UgcG9saWN5IGFmdGVyIGEgc3RlcCByZXN1bHQgYW5kIHBvdGVudGlhbGx5IG92ZXJyaWRlXG4gICAqIHRoZSBhdXRvbm9teSBkaXJlY3RpdmUgdG8gZW5hYmxlIGF1dG8tY29udGludWF0aW9uIG9yIHJldHJ5LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbW9kaWZpZWQgc3RlcCByZXN1bHQgaWYgcmVzaWxpZW5jZSBraWNrcyBpbiwgb3IgbnVsbCB0byB1c2VcbiAgICogdGhlIG9yaWdpbmFsIHJlc3VsdCAoZGVmYXVsdCBiZWhhdmlvcikuXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4xLjAgLSBBZ2VudCBFeGVjdXRpb24gUmVzaWxpZW5jZSAoSXNzdWUgIzUyNilcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZXZhbHVhdGVSZXNpbGllbmNlKFxuICAgIGFnZW50TmFtZTogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbktleTogc3RyaW5nLFxuICAgIHVwZGF0ZVJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RlcE91dGNvbWU6IHN0cmluZ1xuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwge1xuICAgIC8vIE9ubHkgZXZhbHVhdGUgd2hlbiBhdXRvbm9teSBzYXlzIHBhdXNlXG4gICAgY29uc3QgYXV0b25vbXkgPSB1cGRhdGVSZXN1bHQuYXV0b25vbXkgYXMgeyBjb250aW51ZTogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nOyBmYWN0b3JzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWF1dG9ub215IHx8IGF1dG9ub215LmNvbnRpbnVlID09PSB0cnVlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIExvb2sgdXAgdGhlIGV4ZWN1dGluZyBhZ2VudCdzIHJlc2lsaWVuY2UgdHJhY2tpbmcgc3RhdGVcbiAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChleGVjdXRpb25LZXkpO1xuICAgIGlmICghZXhlY3V0aW5nQWdlbnQ/LnJlc2lsaWVuY2VQb2xpY3kpIHJldHVybiBudWxsO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHdoYXQgdHJpZ2dlcmVkIHRoZSBwYXVzZVxuICAgIGNvbnN0IGlzU3RlcExpbWl0ID0gYXV0b25vbXkucmVhc29uPy5zdGFydHNXaXRoKCdNYXhpbXVtIGF1dG9ub21vdXMgc3RlcHMgcmVhY2hlZCcpID8/IGZhbHNlO1xuICAgIGNvbnN0IGlzRmFpbHVyZSA9IHN0ZXBPdXRjb21lID09PSAnZmFpbHVyZSc7XG5cbiAgICAvLyBPbmx5IGhhbmRsZSBzdGVwLWxpbWl0IGFuZCBmYWlsdXJlIHRyaWdnZXJzXG4gICAgaWYgKCFpc1N0ZXBMaW1pdCAmJiAhaXNGYWlsdXJlKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IFJlc2lsaWVuY2VDb250ZXh0ID0ge1xuICAgICAgdHJpZ2dlcjogaXNTdGVwTGltaXQgPyAnc3RlcF9saW1pdCcgOiAnZXhlY3V0aW9uX2ZhaWx1cmUnLFxuICAgICAgY29udGludWF0aW9uQ291bnQ6IGV4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50LFxuICAgICAgcmV0cnlDb3VudDogZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCxcbiAgICAgIHN0ZXBPdXRjb21lOiBzdGVwT3V0Y29tZSBhcyAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbCcsXG4gICAgICBhZ2VudE5hbWUsXG4gICAgfTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IGV2YWx1YXRlUmVzaWxpZW5jZVBvbGljeShleGVjdXRpbmdBZ2VudC5yZXNpbGllbmNlUG9saWN5LCBjb250ZXh0KTtcblxuICAgIC8vIElmIHJlc2lsaWVuY2Ugc2F5cyBwYXVzZSwgcmVjb3JkIHRoZSBsaW1pdCBhbmQgdXNlIHRoZSBvcmlnaW5hbCByZXN1bHRcbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3BhdXNlJykge1xuICAgICAgLy8gVHJhY2sgaWYgdGhpcyB3YXMgYSBsaW1pdCBleGhhdXN0aW9uIChub3QgYSBkZWZhdWx0LXBhdXNlIHBvbGljeSlcbiAgICAgIGlmIChhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnZXhoYXVzdGVkJykgfHwgYWN0aW9uLnJlYXNvbj8uaW5jbHVkZXMoJ0NpcmN1aXQgYnJlYWtlcicpKSB7XG4gICAgICAgIHJlc2lsaWVuY2VNZXRyaWNzLnJlY29yZFJlc2lsaWVuY2VMaW1pdCgpO1xuICAgICAgICBpZiAoYWN0aW9uLnJlYXNvbj8uaW5jbHVkZXMoJ0NpcmN1aXQgYnJlYWtlcicpKSB7XG4gICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ2lyY3VpdEJyZWFrZXJUcmlwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEF1dG8tY29udGludWU6IG92ZXJyaWRlIHRoZSBhdXRvbm9teSBkaXJlY3RpdmUgdG8gY29udGludWVcbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ2NvbnRpbnVlJykge1xuICAgICAgZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQrKztcbiAgICAgIGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQgPSAwOyAvLyBSZXNldCByZXRyeSBjb3VudCBvbiBjb250aW51YXRpb25cbiAgICAgIHJlc2lsaWVuY2VNZXRyaWNzLnJlY29yZEF1dG9Db250aW51YXRpb24oKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfQVVUT19DT05USU5VRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZXZhbHVhdGVSZXNpbGllbmNlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke2FnZW50TmFtZX0nIGF1dG8tY29udGludWVkOiAke2FjdGlvbi5yZWFzb259YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhZ2VudE5hbWUsXG4gICAgICAgICAgY29udGludWF0aW9uQ291bnQ6IGV4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50LFxuICAgICAgICAgIG1heENvbnRpbnVhdGlvbnM6IGFjdGlvbi5tYXhDb250aW51YXRpb25zLFxuICAgICAgICAgIHRyaWdnZXI6IGNvbnRleHQudHJpZ2dlcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiBhdXRvLWNvbnRpbnVlZCAoJHtleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudH0vJHthY3Rpb24ubWF4Q29udGludWF0aW9ucyB8fCAndW5saW1pdGVkJ30pYF0sXG4gICAgICAgICAgcmVzaWxpZW5jZUFjdGlvbjogYWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZXRyeTogdGVsbCBMTE0gdG8gcmV0cnkgd2l0aCBiYWNrb2ZmIGd1aWRhbmNlXG4gICAgaWYgKGFjdGlvbi5hY3Rpb24gPT09ICdyZXRyeScpIHtcbiAgICAgIGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQrKztcbiAgICAgIHJlc2lsaWVuY2VNZXRyaWNzLnJlY29yZFN0ZXBSZXRyeSgpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9TVEVQX1JFVFJJRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZXZhbHVhdGVSZXNpbGllbmNlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke2FnZW50TmFtZX0nIHN0ZXAgcmV0cnk6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICByZXRyeUNvdW50OiBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50LFxuICAgICAgICAgIGJhY2tvZmZNczogYWN0aW9uLmJhY2tvZmZNcyxcbiAgICAgICAgICB0cmlnZ2VyOiBjb250ZXh0LnRyaWdnZXIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udXBkYXRlUmVzdWx0LFxuICAgICAgICBhdXRvbm9teToge1xuICAgICAgICAgIC4uLmF1dG9ub215LFxuICAgICAgICAgIGNvbnRpbnVlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYWN0aW9uLnJlYXNvbixcbiAgICAgICAgICBmYWN0b3JzOiBbLi4uKGF1dG9ub215LmZhY3RvcnMgfHwgW10pLCBgcmVzaWxpZW5jZTogcmV0cnkgYXR0ZW1wdCAke2V4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnR9YF0sXG4gICAgICAgICAgcmVzaWxpZW5jZUFjdGlvbjogYWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0YXJ0OiBvdmVycmlkZSB0byBjb250aW51ZSwgc2lnbmFsIGZyZXNoIHJlc3RhcnQgdG8gTExNXG4gICAgaWYgKGFjdGlvbi5hY3Rpb24gPT09ICdyZXN0YXJ0Jykge1xuICAgICAgZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQrKztcbiAgICAgIGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQgPSAwO1xuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQXV0b1Jlc3RhcnQoKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfQVVUT19SRVNUQVJURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZXZhbHVhdGVSZXNpbGllbmNlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke2FnZW50TmFtZX0nIGF1dG8tcmVzdGFydGVkOiAke2FjdGlvbi5yZWFzb259YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBhZ2VudE5hbWUsXG4gICAgICAgICAgY29udGludWF0aW9uQ291bnQ6IGV4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50LFxuICAgICAgICAgIG1heENvbnRpbnVhdGlvbnM6IGFjdGlvbi5tYXhDb250aW51YXRpb25zLFxuICAgICAgICAgIHRyaWdnZXI6IGNvbnRleHQudHJpZ2dlcixcbiAgICAgICAgICBwcmVzZXJ2ZVN0YXRlOiBleGVjdXRpbmdBZ2VudC5yZXNpbGllbmNlUG9saWN5Py5wcmVzZXJ2ZVN0YXRlID8/IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udXBkYXRlUmVzdWx0LFxuICAgICAgICBhdXRvbm9teToge1xuICAgICAgICAgIC4uLmF1dG9ub215LFxuICAgICAgICAgIGNvbnRpbnVlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYWN0aW9uLnJlYXNvbixcbiAgICAgICAgICBmYWN0b3JzOiBbLi4uKGF1dG9ub215LmZhY3RvcnMgfHwgW10pLCBgcmVzaWxpZW5jZTogYXV0by1yZXN0YXJ0ZWQgKCR7ZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnR9LyR7YWN0aW9uLm1heENvbnRpbnVhdGlvbnMgfHwgJ3VubGltaXRlZCd9KWBdLFxuICAgICAgICAgIHJlc2lsaWVuY2VBY3Rpb246IGFjdGlvbixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBnb2FsIElEcyBmb3IgYW4gYWdlbnQgKElzc3VlICMyNDkpLlxuICAgKiBRdWVyaWVzIHRoZSBhZ2VudCdzIHN0YXRlIHRvIGZpbmQgaW4tcHJvZ3Jlc3MgZ29hbHMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFjdGl2ZUdvYWxJZHMoXG4gICAgbWFuYWdlcjogQWdlbnRNYW5hZ2VyLFxuICAgIGFnZW50TmFtZTogc3RyaW5nLFxuICAgIHN1cHByZXNzTG9va3VwRXJyb3JzID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZVJlc3VsdCA9IHN1cHByZXNzTG9va3VwRXJyb3JzXG4gICAgICAgID8gYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlKHsgYWdlbnROYW1lIH0pXG4gICAgICAgIDogYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlRm9yUmVjb3ZlcnkoeyBhZ2VudE5hbWUgfSk7XG4gICAgICBpZiAoc3RhdGVSZXN1bHQ/LnN0YXRlPy5nb2Fscykge1xuICAgICAgICByZXR1cm4gc3RhdGVSZXN1bHQuc3RhdGUuZ29hbHNcbiAgICAgICAgICAuZmlsdGVyKChnOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKVxuICAgICAgICAgIC5tYXAoKGc6IHsgaWQ6IHN0cmluZyB9KSA9PiBnLmlkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBkZWxldGVkIGFnZW50IGlzIGRlZmluaXRpdmUgc3RhbGUgc3RhdGUuIE90aGVyIGxvb2t1cCBmYWlsdXJlcyBtYXkgYmVcbiAgICAgIC8vIHRyYW5zaWVudCBhbmQgbXVzdCBzdGlsbCBmYWlsIGNsb3NlZCB3aGVuIHN1cHByZXNzaW9uIGlzIGRpc2FibGVkLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFzdXBwcmVzc0xvb2t1cEVycm9ycykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEFnZW50IG1heSBub3QgaGF2ZSBzdGF0ZSB5ZXRcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBjb3JyZWxhdGlvbiBJRCBmcm9tIHRoZSB1bmRlcmx5aW5nIENvbnRleHRUcmFja2VyLlxuICAgKiBFeHBvc2VkIGZvciB1c2UgYnkgVW5pZmllZEVuZHBvaW50IGFuZCBvdGhlciB3cmFwcGVycy5cbiAgICogSXNzdWUgIzMwMS5cbiAgICovXG4gIGdldENvcnJlbGF0aW9uSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZXN1bHQgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBCdWlsZCByZXNwb25zZSBtZXRhZGF0YSB3aXRoIGNvcnJlbGF0aW9uIElEIGFuZCB0aW1pbmcuXG4gICAqIElzc3VlICMzMDE6IFJlcXVlc3QgSURzIGFuZCBkaXN0cmlidXRlZCB0cmFjaW5nIHN1cHBvcnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTWV0YShzdGFydFRpbWU6IG51bWJlcik6IFJlc3BvbnNlTWV0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RJZDogdGhpcy5jb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpID8/ICd1bmtub3duJyxcbiAgICAgIGR1cmF0aW9uTXM6IHBhcnNlRmxvYXQoKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKS50b0ZpeGVkKDIpKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24gcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIHN1Y2Nlc3MoZGF0YTogdW5rbm93biwgc3RhcnRUaW1lOiBudW1iZXIpOiBPcGVyYXRpb25TdWNjZXNzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGRhdGEsXG4gICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEoc3RhcnRUaW1lKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhaWxlZCBvcGVyYXRpb24gcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGZhaWx1cmUoZXJyb3I6IHN0cmluZywgc3RhcnRUaW1lOiBudW1iZXIpOiBPcGVyYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcixcbiAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShzdGFydFRpbWUpLFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZpZWxkIFNlbGVjdGlvbiAoSXNzdWUgIzIwMilcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBcHBseSBmaWVsZCBzZWxlY3Rpb24gYW5kIG5hbWUgdHJhbnNmb3JtYXRpb24gdG8gaGFuZGxlciByZXNwb25zZS5cbiAgICpcbiAgICogUHJvY2Vzc2VzIHRoZSBgZmllbGRzYCBwYXJhbWV0ZXIgdG8gZmlsdGVyIHJlc3BvbnNlIGRhdGE6XG4gICAqIC0gSWYgZmllbGRzIGlzIGFuIGFycmF5LCBmaWx0ZXIgdG8gdGhvc2UgZmllbGRzIG9ubHlcbiAgICogLSBJZiBmaWVsZHMgaXMgYSBwcmVzZXQgc3RyaW5nICgnbWluaW1hbCcsICdzdGFuZGFyZCcsICdmdWxsJyksIHVzZSBwcmVzZXRcbiAgICogLSBJZiBmaWVsZHMgaXMgbm90IHByb3ZpZGVkLCB0cmFuc2Zvcm0gbmFtZXMgb25seSAobmFtZSDihpIgZWxlbWVudF9uYW1lKVxuICAgKlxuICAgKiBGb3IgcmVzcG9uc2VzIHdpdGggYHJlc3VsdHNgIG9yIGBpdGVtc2AgYXJyYXlzLCBmaWVsZCBzZWxlY3Rpb24gaXMgYXBwbGllZFxuICAgKiB0byBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHJhdGhlciB0aGFuIGZpbHRlcmluZyB0aGUgY29udGFpbmVyIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByYXcgaGFuZGxlciByZXN1bHRcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9yaWdpbmFsIHBhcmFtcyBjb250YWluaW5nIG9wdGlvbmFsIGBmaWVsZHNgXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHJlc3VsdCB3aXRoIGZpZWxkIHNlbGVjdGlvbiBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RmllbGRTZWxlY3Rpb24oXG4gICAgcmVzdWx0OiB1bmtub3duLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHVua25vd24ge1xuICAgIC8vIFNraXAgdHJhbnNmb3JtYXRpb24gZm9yIE1DUCByZXNwb25zZSBmb3JtYXQgd2l0aCBjb250ZW50IGFycmF5XG4gICAgLy8gVGhlc2UgYXJlIGZvcm1hdHRlZCB0ZXh0IHJlc3BvbnNlcyB0aGF0IHNob3VsZG4ndCBiZSB0cmFuc2Zvcm1lZFxuICAgIGlmICh0aGlzLmlzTUNQUmVzcG9uc2UocmVzdWx0KSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZHNQYXJhbSA9IHBhcmFtcz8uZmllbGRzO1xuXG4gICAgLy8gTm8gZmllbGRzIHBhcmFtIC0gYXBwbHkgbmFtZSB0cmFuc2Zvcm1hdGlvbiBvbmx5XG4gICAgaWYgKGZpZWxkc1BhcmFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgZmllbGRzIGZyb20gcHJlc2V0IG9yIGFycmF5XG4gICAgbGV0IGZpZWxkczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXNldDogJ21pbmltYWwnIHwgJ3N0YW5kYXJkJyB8ICdmdWxsJyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmllbGRzUGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoaXNWYWxpZFByZXNldChmaWVsZHNQYXJhbSkpIHtcbiAgICAgICAgaWYgKGZpZWxkc1BhcmFtID09PSAnZnVsbCcpIHtcbiAgICAgICAgICAvLyAnZnVsbCcgcHJlc2V0ID0gYWxsIGZpZWxkcywganVzdCB0cmFuc2Zvcm0gbmFtZXNcbiAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1XaXRoQXJyYXlBd2FyZW5lc3MocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBwcmVzZXQgPSBmaWVsZHNQYXJhbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludmFsaWQgcHJlc2V0IC0gdHJlYXQgYXMgc2luZ2xlIGZpZWxkXG4gICAgICAgIGZpZWxkcyA9IFtmaWVsZHNQYXJhbV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkc1BhcmFtKSkge1xuICAgICAgLy8gRmlsdGVyIHRvIHN0cmluZ3Mgb25seSwgd2FybiBhYm91dCBub24tc3RyaW5nIGVsZW1lbnRzXG4gICAgICBjb25zdCBub25TdHJpbmdDb3VudCA9IGZpZWxkc1BhcmFtLmZpbHRlcihmID0+IHR5cGVvZiBmICE9PSAnc3RyaW5nJykubGVuZ3RoO1xuICAgICAgaWYgKG5vblN0cmluZ0NvdW50ID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgRmllbGQgc2VsZWN0aW9uOiAke25vblN0cmluZ0NvdW50fSBub24tc3RyaW5nIGVsZW1lbnQocykgaW4gZmllbGRzIGFycmF5IGlnbm9yZWRgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmluZ0ZpZWxkcyA9IGZpZWxkc1BhcmFtLmZpbHRlcigoZik6IGYgaXMgc3RyaW5nID0+IHR5cGVvZiBmID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoc3RyaW5nRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBmaWVsZHMgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3JtYWxpemUgZmllbGQgbmFtZXMgZm9yIHNlY3VyaXR5IGFuZCBjaGVjayBmb3IgVW5pY29kZSBpc3N1ZXNcbiAgICAgICAgY29uc3QgeyBub3JtYWxpemVkLCB3YXJuaW5ncyB9ID0gbm9ybWFsaXplRmllbGROYW1lcyhzdHJpbmdGaWVsZHMpO1xuICAgICAgICBpZiAod2FybmluZ3MpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgRmllbGQgc2VsZWN0aW9uIFVuaWNvZGUgbm9ybWFsaXphdGlvbjogJHt3YXJuaW5ncy5qb2luKCc7ICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkcyA9IG5vcm1hbGl6ZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gdmFsaWQgZmllbGRzIC0ganVzdCB0cmFuc2Zvcm0gbmFtZXNcbiAgICBpZiAoIWZpZWxkcyAmJiAhcHJlc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1XaXRoQXJyYXlBd2FyZW5lc3MocmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBmaWVsZCBmaWx0ZXJpbmcgd2l0aCBhcnJheS1hd2FyZW5lc3NcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJXaXRoQXJyYXlBd2FyZW5lc3MocmVzdWx0LCBmaWVsZHMsIHByZXNldCk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHJlc3BvbnNlIHdpdGggYXdhcmVuZXNzIG9mIG5lc3RlZCBhcnJheXMuXG4gICAqIEFwcGxpZXMgbmFtZSB0cmFuc2Zvcm1hdGlvbiB0byBpdGVtcyB3aXRoaW4gYHJlc3VsdHNgIG9yIGBpdGVtc2AgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1XaXRoQXJyYXlBd2FyZW5lc3MocmVzdWx0OiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBjb25zdCBvYmogPSByZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gYXJyYXkgY29udGFpbmVyIHBhdHRlcm5zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoucmVzdWx0cykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydyZXN1bHRzJ10pLFxuICAgICAgICAgIHJlc3VsdHM6IGZpbHRlckZpZWxkcyhvYmoucmVzdWx0cywgeyB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqLml0ZW1zKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ2l0ZW1zJ10pLFxuICAgICAgICAgIGl0ZW1zOiBmaWx0ZXJGaWVsZHMob2JqLml0ZW1zLCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdDogdHJhbnNmb3JtIGVudGlyZSByZXNwb25zZVxuICAgIGNvbnN0IHsgZGF0YSB9ID0gZmlsdGVyRmllbGRzKHJlc3VsdCwgeyB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgcmVzcG9uc2Ugd2l0aCBhd2FyZW5lc3Mgb2YgbmVzdGVkIGFycmF5cy5cbiAgICogQXBwbGllcyBmaWVsZCBmaWx0ZXJpbmcgdG8gaXRlbXMgd2l0aGluIGByZXN1bHRzYCBvciBgaXRlbXNgIGFycmF5cy5cbiAgICovXG4gIHByaXZhdGUgZmlsdGVyV2l0aEFycmF5QXdhcmVuZXNzKFxuICAgIHJlc3VsdDogdW5rbm93bixcbiAgICBmaWVsZHM/OiBzdHJpbmdbXSxcbiAgICBwcmVzZXQ/OiAnbWluaW1hbCcgfCAnc3RhbmRhcmQnIHwgJ2Z1bGwnXG4gICk6IHVua25vd24ge1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgY29uc3Qgb2JqID0gcmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAvLyBDaGVjayBmb3IgY29tbW9uIGFycmF5IGNvbnRhaW5lciBwYXR0ZXJuc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqLnJlc3VsdHMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsncmVzdWx0cyddKSxcbiAgICAgICAgICByZXN1bHRzOiBmaWx0ZXJGaWVsZHMob2JqLnJlc3VsdHMsIHsgZmllbGRzLCBwcmVzZXQsIHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsnaXRlbXMnXSksXG4gICAgICAgICAgaXRlbXM6IGZpbHRlckZpZWxkcyhvYmouaXRlbXMsIHsgZmllbGRzLCBwcmVzZXQsIHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdDogZmlsdGVyIGVudGlyZSByZXNwb25zZVxuICAgIGNvbnN0IHsgZGF0YSB9ID0gZmlsdGVyRmllbGRzKHJlc3VsdCwgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHRvcC1sZXZlbCBmaWVsZHMgb2YgYW4gb2JqZWN0LCBleGNsdWRpbmcgc3BlY2lmaWVkIGtleXMuXG4gICAqIFVzZWQgdG8gcHJlc2VydmUgY29udGFpbmVyIG1ldGFkYXRhICh0b3RhbCwgcXVlcnksIGV0Yy4pIHdoaWxlIGZpbHRlcmluZyBuZXN0ZWQgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Ub3BMZXZlbChcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGV4Y2x1ZGVLZXlzOiBzdHJpbmdbXVxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGlmICghZXhjbHVkZUtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJlc3VsdCBpcyBhbiBNQ1AgcmVzcG9uc2UgZm9ybWF0ICh3aXRoIGNvbnRlbnQgYXJyYXkpLlxuICAgKiBUaGVzZSByZXNwb25zZXMgY29udGFpbiBmb3JtYXR0ZWQgdGV4dCBhbmQgc2hvdWxkbid0IGJlIHRyYW5zZm9ybWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpc01DUFJlc3BvbnNlKHJlc3VsdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICByZXN1bHQgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmXG4gICAgICAnY29udGVudCcgaW4gcmVzdWx0ICYmXG4gICAgICBBcnJheS5pc0FycmF5KChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmNvbnRlbnQpXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEludmFsaWRQb2xpY3lBZHZpc29yeShpbnZhbGlkUG9saWN5Q291bnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNpbmd1bGFyID0gaW52YWxpZFBvbGljeUNvdW50ID09PSAxO1xuICByZXR1cm4gYCR7aW52YWxpZFBvbGljeUNvdW50fSBhY3RpdmUgZWxlbWVudCR7c2luZ3VsYXIgPyAnJyA6ICdzJ30gaGEke3Npbmd1bGFyID8gJ3MnIDogJ3ZlJ30gbWFsZm9ybWVkIGdhdGVrZWVwZXIgcG9saWN5LiBUaGUgZWxlbWVudCR7c2luZ3VsYXIgPyAnIHJlbWFpbnMnIDogJ3MgcmVtYWluJ30gYWN0aXZlLCBidXQgdGhhdCBwb2xpY3kgaXMgbm90IGVuZm9yY2VhYmxlIHVudGlsIGZpeGVkLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIENMSSBhcHByb3ZhbCBwb2xpY3kgZnJvbSBhbGwgYWN0aXZlIGVsZW1lbnRzLlxuICpcbiAqIFVuaW9ucyBgcmVxdWlyZUFwcHJvdmFsYCBhcnJheXMgYWNyb3NzIGFsbCBlbGVtZW50cy4gVGFrZXMgdGhlIG1vc3RcbiAqIGNvbnNlcnZhdGl2ZSAoc21hbGxlc3QpIFRUTC4gRmFsbHMgYmFjayB0byBlbnYgdmFyIGBET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWWAuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRzIC0gQ3VycmVudGx5IGFjdGl2ZSBlbGVtZW50c1xuICogQHJldHVybnMgUmVzb2x2ZWQgYXBwcm92YWwgcG9saWN5XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDbGlBcHByb3ZhbFBvbGljeShhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdKTogQ2xpQXBwcm92YWxQb2xpY3kge1xuICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBuZXcgU2V0PCdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJz4oKTtcbiAgbGV0IGRlZmF1bHRTY29wZTogQ2xpQXBwcm92YWxTY29wZSB8IHVuZGVmaW5lZDtcbiAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBlbGVtZW50Lm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uYXBwcm92YWxQb2xpY3k7XG4gICAgaWYgKCFwb2xpY3kpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHBvbGljeS5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgcG9saWN5LnJlcXVpcmVBcHByb3ZhbCkge1xuICAgICAgICByZXF1aXJlQXBwcm92YWwuYWRkKGxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0U2NvcGUgJiYgIWRlZmF1bHRTY29wZSkge1xuICAgICAgZGVmYXVsdFNjb3BlID0gcG9saWN5LmRlZmF1bHRTY29wZTtcbiAgICB9XG4gICAgaWYgKHBvbGljeS50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHR0bFNlY29uZHMgPSB0dGxTZWNvbmRzID09PSB1bmRlZmluZWQgPyBwb2xpY3kudHRsU2Vjb25kcyA6IE1hdGgubWluKHR0bFNlY29uZHMsIHBvbGljeS50dGxTZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICBpZiAocmVxdWlyZUFwcHJvdmFsLnNpemUgPT09IDApIHtcbiAgICBjb25zdCBlbnZQb2xpY3kgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWTtcbiAgICBpZiAoZW52UG9saWN5KSB7XG4gICAgICBjb25zdCBsZXZlbHMgPSBlbnZQb2xpY3kuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKHMgPT4gcyA9PT0gJ21vZGVyYXRlJyB8fCBzID09PSAnZGFuZ2Vyb3VzJyk7XG4gICAgICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgICAgICByZXF1aXJlQXBwcm92YWwuYWRkKGxldmVsIGFzICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlQXBwcm92YWw6IHJlcXVpcmVBcHByb3ZhbC5zaXplID4gMCA/IEFycmF5LmZyb20ocmVxdWlyZUFwcHJvdmFsKSA6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0U2NvcGUsXG4gICAgdHRsU2Vjb25kcyxcbiAgfTtcbn1cbiJdfQ==