@fjall/components-infrastructure 0.86.1 → 0.87.3

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 (112) hide show
  1. package/README.md +3 -3
  2. package/dist/lib/app.d.ts +166 -6
  3. package/dist/lib/app.js +212 -20
  4. package/dist/lib/aspects/resourceInventory.d.ts +4 -4
  5. package/dist/lib/aspects/resourceInventory.js +3 -3
  6. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  7. package/dist/lib/config/aws/identityCenter.js +1 -5
  8. package/dist/lib/config/aws/organisation.js +1 -4
  9. package/dist/lib/index.d.ts +1 -0
  10. package/dist/lib/index.js +7 -1
  11. package/dist/lib/patterns/aws/buildkite.js +3 -2
  12. package/dist/lib/patterns/aws/cdn.d.ts +164 -0
  13. package/dist/lib/patterns/aws/cdn.js +264 -0
  14. package/dist/lib/patterns/aws/compute.d.ts +278 -59
  15. package/dist/lib/patterns/aws/compute.js +384 -188
  16. package/dist/lib/patterns/aws/connections.d.ts +46 -0
  17. package/dist/lib/patterns/aws/connections.js +159 -0
  18. package/dist/lib/patterns/aws/database.d.ts +124 -11
  19. package/dist/lib/patterns/aws/database.js +188 -66
  20. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  21. package/dist/lib/patterns/aws/index.d.ts +3 -0
  22. package/dist/lib/patterns/aws/index.js +4 -1
  23. package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
  24. package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
  25. package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
  26. package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
  27. package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
  28. package/dist/lib/patterns/aws/interfaces/database.js +65 -0
  29. package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
  30. package/dist/lib/patterns/aws/interfaces/index.js +49 -0
  31. package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
  32. package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
  33. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
  34. package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
  35. package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
  36. package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
  37. package/dist/lib/patterns/aws/messaging.d.ts +183 -0
  38. package/dist/lib/patterns/aws/messaging.js +239 -0
  39. package/dist/lib/patterns/aws/network.js +4 -4
  40. package/dist/lib/patterns/aws/pattern.d.ts +67 -0
  41. package/dist/lib/patterns/aws/pattern.js +69 -0
  42. package/dist/lib/patterns/aws/payload.d.ts +87 -0
  43. package/dist/lib/patterns/aws/payload.js +526 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +127 -15
  45. package/dist/lib/patterns/aws/storage.js +234 -38
  46. package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
  47. package/dist/lib/resources/aws/backup/backupVault.js +1 -2
  48. package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
  49. package/dist/lib/resources/aws/base/awsStack.js +1 -7
  50. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
  51. package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
  52. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/cdn/index.js +18 -0
  54. package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
  55. package/dist/lib/resources/aws/compute/ec2.js +33 -6
  56. package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
  57. package/dist/lib/resources/aws/compute/ecs.js +31 -115
  58. package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
  59. package/dist/lib/resources/aws/compute/lambda.js +209 -32
  60. package/dist/lib/resources/aws/database/database.js +1 -1
  61. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  62. package/dist/lib/resources/aws/database/dynamodb.js +181 -0
  63. package/dist/lib/resources/aws/database/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/database/index.js +2 -1
  65. package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
  66. package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
  67. package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
  68. package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
  69. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
  70. package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
  71. package/dist/lib/resources/aws/index.d.ts +2 -0
  72. package/dist/lib/resources/aws/index.js +3 -1
  73. package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
  74. package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
  75. package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
  76. package/dist/lib/resources/aws/messaging/index.js +20 -0
  77. package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
  78. package/dist/lib/resources/aws/messaging/sns.js +70 -0
  79. package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
  80. package/dist/lib/resources/aws/messaging/sqs.js +231 -0
  81. package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
  82. package/dist/lib/resources/aws/messaging/utils.js +7 -0
  83. package/dist/lib/resources/aws/networking/ipam.js +1 -2
  84. package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
  85. package/dist/lib/resources/aws/networking/vpc.js +1 -2
  86. package/dist/lib/resources/aws/storage/ecr.js +8 -5
  87. package/dist/lib/resources/aws/storage/s3.js +1 -2
  88. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  89. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  90. package/dist/lib/utils/getConfig.js +3 -2
  91. package/dist/lib/utils/index.d.ts +1 -0
  92. package/dist/lib/utils/index.js +2 -1
  93. package/dist/lib/utils/manifestWriter.d.ts +174 -0
  94. package/dist/lib/utils/manifestWriter.js +233 -0
  95. package/dist/lib/utils/standardTagsAspect.js +1 -8
  96. package/dist/lib/utils/validationLogger.d.ts +34 -0
  97. package/dist/lib/utils/validationLogger.js +83 -0
  98. package/package.json +3 -3
  99. package/dist/lib/__tests__/setup.d.ts +0 -48
  100. package/dist/lib/__tests__/setup.js +0 -1
  101. package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
  102. package/dist/lib/patterns/aws/cicdRole.js +0 -68
  103. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
  104. package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
  105. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
  106. package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
  107. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
  108. package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
  109. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
  110. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
  111. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
  112. package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
@@ -18,6 +18,7 @@ const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
18
18
  const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
19
19
  const hostedZone_1 = require("../../../patterns/aws/hostedZone");
20
20
  const securityGroup_1 = require("../iam/securityGroup");
21
+ const connections_js_1 = require("../../../patterns/aws/connections.js");
21
22
  /**
22
23
  * Instance type prefixes that use ARM64 architecture (Graviton processors).
23
24
  * All other prefixes are assumed to be x86-64 (STANDARD).
@@ -151,19 +152,14 @@ class EcsCluster extends constructs_1.Construct {
151
152
  this.loadBalancerDisabled =
152
153
  props.cluster?.loadBalancer === false || this.directAccessEnabled;
153
154
  this.validateProps(props);
154
- // 1. Create the ECS cluster
155
155
  this.addCluster(props);
156
- // 2. Pre-create ASGs for services with EC2 capacity provider
157
- // This ensures ASG security groups exist before load balancer creation
158
156
  for (const serviceProps of props.services) {
159
157
  if (serviceProps.capacityProvider === "EC2") {
160
158
  this.getOrCreateAsgCapacityProvider(serviceProps);
161
159
  }
162
160
  }
163
- // 3. Create ALB if not disabled (shared by all services)
164
161
  if (!this.loadBalancerDisabled) {
165
162
  this.addLoadBalancer(props);
166
- // Set up domain/HTTPS if configured
167
163
  if (props.cluster?.domain || props.cluster?.domainConfig) {
168
164
  this.addHostedZone(props);
169
165
  }
@@ -172,16 +168,11 @@ class EcsCluster extends constructs_1.Construct {
172
168
  else if (this.directAccessEnabled) {
173
169
  this.addDirectAccessOutputs(props);
174
170
  }
175
- // 4. Create each service
176
171
  for (const serviceProps of props.services) {
177
172
  this.addServiceToCluster(serviceProps);
178
173
  }
179
- // 5. Create DeployableService outputs for deployment automation
180
174
  this.addDeployableServiceOutputs(props);
181
- // 6. Set up connections
182
175
  this.setupConnections(props);
183
- // 7. Apply aspect to fix capacity provider deletion dependencies (CDK bug workaround)
184
- // This runs at synth time when CfnClusterCapacityProviderAssociations exists
185
176
  aws_cdk_lib_1.Aspects.of(this).add(new CapacityProviderDependencyAspect(this.cluster));
186
177
  }
187
178
  /** Get the cluster's load balancer. Undefined if disabled. */
@@ -222,28 +213,21 @@ class EcsCluster extends constructs_1.Construct {
222
213
  */
223
214
  addServiceToCluster(serviceProps) {
224
215
  const serviceName = serviceProps.name;
225
- // Create separate roles for security best practice
226
216
  const executionRole = this.createExecutionRole(serviceName);
227
217
  const taskRole = this.createTaskRole(serviceName, serviceProps);
228
- // Create task definition with both roles
229
218
  const taskDefinition = this.createTaskDefinition(serviceName, serviceProps, executionRole, taskRole);
230
- // Add containers to task definition
231
219
  const { containers, primaryContainer } = this.addContainersToTask(serviceName, serviceProps, taskDefinition);
232
- // Create the ECS service
233
220
  const service = this.createService(serviceName, serviceProps, taskDefinition);
234
- // Register with ALB if enabled and has primary container with port
235
221
  let targetGroup;
236
222
  if (!this.loadBalancerDisabled &&
237
223
  primaryContainer &&
238
224
  this.loadBalancerListener) {
239
225
  targetGroup = this.registerServiceWithALB(serviceName, serviceProps, service, primaryContainer);
240
226
  }
241
- // Add scaling if configured
242
227
  let scalingPolicy;
243
228
  if (serviceProps.scalingType) {
244
229
  scalingPolicy = this.addServiceScaling(serviceName, serviceProps, service);
245
230
  }
246
- // Store service data
247
231
  this.services.set(serviceName, {
248
232
  service,
249
233
  taskDefinition,
@@ -254,10 +238,14 @@ class EcsCluster extends constructs_1.Construct {
254
238
  targetGroup,
255
239
  scalingPolicy
256
240
  });
257
- // Add service level connections
258
241
  if (serviceProps.connections && serviceProps.connections.length > 0) {
259
- for (const connectable of serviceProps.connections) {
260
- service.connections.allowToDefaultPort(connectable);
242
+ try {
243
+ (0, connections_js_1.processConnections)(serviceProps.connections, taskRole, // IGrantable (task role for IAM grants)
244
+ service // IConnectable (security group for network access)
245
+ );
246
+ }
247
+ catch (error) {
248
+ throw new Error(`Failed to process connections for ECS service '${serviceName}': ${error instanceof Error ? error.message : String(error)}`);
261
249
  }
262
250
  }
263
251
  }
@@ -297,7 +285,6 @@ class EcsCluster extends constructs_1.Construct {
297
285
  }
298
286
  }
299
287
  setupConnections(props) {
300
- // Find the first service with a port for default connection
301
288
  let defaultPort = 80;
302
289
  for (const service of props.services) {
303
290
  const primaryContainer = service.containers.find((c) => c.port !== undefined);
@@ -306,13 +293,10 @@ class EcsCluster extends constructs_1.Construct {
306
293
  break;
307
294
  }
308
295
  }
309
- // Collect security groups from EC2 ASGs and Fargate services
310
296
  const securityGroups = [];
311
- // Add ASG security group if any EC2 services exist
312
297
  if (this.asgSecurityGroup) {
313
298
  securityGroups.push(this.asgSecurityGroup);
314
299
  }
315
- // Add Fargate service security groups if any Fargate services exist
316
300
  for (const serviceData of this.services.values()) {
317
301
  const serviceSgs = serviceData.service?.connections?.securityGroups || [];
318
302
  for (const sg of serviceSgs) {
@@ -335,7 +319,6 @@ class EcsCluster extends constructs_1.Construct {
335
319
  const executionRole = new aws_iam_1.Role(this, `${serviceName}ExecutionRole`, {
336
320
  assumedBy: new aws_iam_1.ServicePrincipal("ecs-tasks.amazonaws.com")
337
321
  });
338
- // ECR pull permissions
339
322
  executionRole.addToPolicy(new aws_iam_1.PolicyStatement({
340
323
  effect: aws_iam_1.Effect.ALLOW,
341
324
  actions: [
@@ -346,7 +329,6 @@ class EcsCluster extends constructs_1.Construct {
346
329
  ],
347
330
  resources: ["*"]
348
331
  }));
349
- // CloudWatch Logs permissions - scoped to ECS log groups for this cluster
350
332
  const logGroupArn = `arn:aws:logs:${aws_cdk_lib_1.Stack.of(this).region}:${aws_cdk_lib_1.Stack.of(this).account}:log-group:/ecs/${this.props.clusterName}*`;
351
333
  executionRole.addToPolicy(new aws_iam_1.PolicyStatement({
352
334
  effect: aws_iam_1.Effect.ALLOW,
@@ -357,8 +339,6 @@ class EcsCluster extends constructs_1.Construct {
357
339
  ],
358
340
  resources: [logGroupArn, `${logGroupArn}:*`]
359
341
  }));
360
- // Secrets Manager access for injecting secrets into containers
361
- // Scoped to specific secrets referenced in secretsImport for least-privilege access
362
342
  const secretNames = this.collectSecretsManagerSecretNames();
363
343
  if (secretNames.length > 0) {
364
344
  const secretArns = secretNames.map((secretName) => `arn:aws:secretsmanager:${aws_cdk_lib_1.Stack.of(this).region}:${aws_cdk_lib_1.Stack.of(this).account}:secret:${secretName}-*`);
@@ -370,27 +350,11 @@ class EcsCluster extends constructs_1.Construct {
370
350
  ],
371
351
  resources: secretArns
372
352
  }));
373
- // KMS decrypt for Secrets Manager secrets encrypted with customer-managed keys.
374
- // When importing secrets from other stacks (e.g., database credentials), the secret
375
- // is encrypted with a KMS key that we don't have direct access to. Grant decrypt
376
- // permission scoped to the Secrets Manager service for least-privilege access.
377
- executionRole.addToPolicy(new aws_iam_1.PolicyStatement({
378
- effect: aws_iam_1.Effect.ALLOW,
379
- actions: ["kms:Decrypt", "kms:DescribeKey"],
380
- resources: ["*"],
381
- conditions: {
382
- StringEquals: {
383
- "kms:ViaService": `secretsmanager.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`
384
- }
385
- }
386
- }));
387
353
  }
388
- // SSM Parameter Store access for injecting secrets into containers
389
- // Scoped to app namespace for least-privilege access - requires appName when ssmSecrets are used
390
- const hasSsmSecrets = this.props.services.some((service) => service.containers.some((container) => container.ssmSecrets && container.ssmSecrets.length > 0));
354
+ const hasSsmSecrets = this.props.services.some((service) => service.containers.some((container) => container.secrets && container.secrets.length > 0));
391
355
  if (hasSsmSecrets) {
392
356
  if (!this.props.appName) {
393
- throw new Error(`ECS cluster '${this.props.clusterName}' has services using ssmSecrets but appName is not configured. ` +
357
+ throw new Error(`ECS cluster '${this.props.clusterName}' has services using secrets but appName is not configured. ` +
394
358
  `Set appName on cluster props to enable scoped IAM permissions for SSM Parameter Store access.`);
395
359
  }
396
360
  executionRole.addToPolicy(new aws_iam_1.PolicyStatement({
@@ -399,15 +363,17 @@ class EcsCluster extends constructs_1.Construct {
399
363
  resources: [`arn:aws:ssm:*:*:parameter/${this.props.appName}/*`]
400
364
  }));
401
365
  }
402
- // KMS decrypt for SSM SecureString parameters encrypted with AWS-managed key (alias/aws/ssm).
403
- // Scoped to ssm service via condition for least-privilege access.
366
+ // KMS decrypt for SSM SecureString and Secrets Manager with customer-managed keys (CMKs)
404
367
  executionRole.addToPolicy(new aws_iam_1.PolicyStatement({
405
368
  effect: aws_iam_1.Effect.ALLOW,
406
369
  actions: ["kms:Decrypt"],
407
370
  resources: ["*"],
408
371
  conditions: {
409
372
  StringEquals: {
410
- "kms:ViaService": `ssm.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`
373
+ "kms:ViaService": [
374
+ `ssm.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`,
375
+ `secretsmanager.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`
376
+ ]
411
377
  }
412
378
  }
413
379
  }));
@@ -422,7 +388,7 @@ class EcsCluster extends constructs_1.Construct {
422
388
  const taskRole = new aws_iam_1.Role(this, `${serviceName}TaskRole`, {
423
389
  assumedBy: new aws_iam_1.ServicePrincipal("ecs-tasks.amazonaws.com")
424
390
  });
425
- // Default: SSM permissions for ECS Exec (ecs execute-command)
391
+ // SSM permissions for ECS Exec (ecs execute-command)
426
392
  taskRole.addToPolicy(new aws_iam_1.PolicyStatement({
427
393
  effect: aws_iam_1.Effect.ALLOW,
428
394
  actions: [
@@ -433,7 +399,6 @@ class EcsCluster extends constructs_1.Construct {
433
399
  ],
434
400
  resources: ["*"]
435
401
  }));
436
- // Add service-specific inline policies
437
402
  if (serviceProps.taskRoleInlinePolicies) {
438
403
  for (const [policyName, policyDocument] of Object.entries(serviceProps.taskRoleInlinePolicies)) {
439
404
  taskRole.attachInlinePolicy(new aws_iam_1.Policy(this, `${serviceName}${policyName}`, {
@@ -441,7 +406,6 @@ class EcsCluster extends constructs_1.Construct {
441
406
  }));
442
407
  }
443
408
  }
444
- // Add service-specific managed policies
445
409
  if (serviceProps.taskRoleManagedPolicies) {
446
410
  for (const policy of serviceProps.taskRoleManagedPolicies) {
447
411
  taskRole.addManagedPolicy(policy);
@@ -452,7 +416,6 @@ class EcsCluster extends constructs_1.Construct {
452
416
  createTaskDefinition(serviceName, serviceProps, executionRole, taskRole) {
453
417
  const cpu = serviceProps.cpu || 256;
454
418
  const memoryLimitMiB = serviceProps.memoryLimitMiB || 512;
455
- // Use per-service capacity provider check
456
419
  if (this.isServiceFargate(serviceProps)) {
457
420
  return new aws_ecs_1.FargateTaskDefinition(this, `${serviceName}TaskDefinition`, {
458
421
  family: `${this.props.clusterName}-${serviceName}`,
@@ -481,8 +444,6 @@ class EcsCluster extends constructs_1.Construct {
481
444
  for (const containerConfig of serviceProps.containers) {
482
445
  const image = this.getContainerImage(serviceName, containerConfig, serviceProps);
483
446
  const isFirstWithPort = !primaryContainer && containerConfig.port !== undefined;
484
- // Build secrets from Secrets Manager
485
- // Construct IDs use double-underscore delimiter to prevent collisions when names contain hyphens
486
447
  const secrets = {};
487
448
  if (containerConfig.secretsImport) {
488
449
  for (const [key, secretImport] of Object.entries(containerConfig.secretsImport)) {
@@ -490,21 +451,18 @@ class EcsCluster extends constructs_1.Construct {
490
451
  secrets[key] = aws_ecs_2.Secret.fromSecretsManager(secret, secretImport.field);
491
452
  }
492
453
  }
493
- // Build secrets from SSM Parameter Store
494
- if (containerConfig.ssmSecrets && containerConfig.ssmSecrets.length > 0) {
495
- // Check for duplicate keys between secretsImport and ssmSecrets
454
+ if (containerConfig.secrets && containerConfig.secrets.length > 0) {
496
455
  if (containerConfig.secretsImport) {
497
456
  const secretsImportKeys = Object.keys(containerConfig.secretsImport);
498
- const duplicateKeys = containerConfig.ssmSecrets.filter((key) => secretsImportKeys.includes(key));
457
+ const duplicateKeys = containerConfig.secrets.filter((key) => secretsImportKeys.includes(key));
499
458
  if (duplicateKeys.length > 0) {
500
459
  throw new Error(`Container '${containerConfig.name}' in service '${serviceName}' has duplicate secret keys ` +
501
- `defined in both secretsImport and ssmSecrets: ${duplicateKeys.join(", ")}. ` +
460
+ `defined in both secrets and secretsImport: ${duplicateKeys.join(", ")}. ` +
502
461
  `Each secret key must be unique across both sources.`);
503
462
  }
504
463
  }
505
- // Derive ssmSecretsPath if not explicitly provided
506
464
  const ssmSecretsPath = this.deriveSsmSecretsPath(serviceName, serviceProps.ssmSecretsPath);
507
- for (const secretName of containerConfig.ssmSecrets) {
465
+ for (const secretName of containerConfig.secrets) {
508
466
  const paramPath = `${ssmSecretsPath}/${secretName}`;
509
467
  const param = aws_ssm_1.StringParameter.fromSecureStringParameterAttributes(this, `${this.props.clusterName}${serviceName}${containerConfig.name}${secretName}SsmParam`, { parameterName: paramPath });
510
468
  secrets[secretName] = aws_ecs_2.Secret.fromSsmParameter(param);
@@ -554,22 +512,21 @@ class EcsCluster extends constructs_1.Construct {
554
512
  return { containers, primaryContainer };
555
513
  }
556
514
  getContainerImage(serviceName, containerConfig, serviceProps) {
557
- // Priority: container.image > service.image > cluster default
558
515
  const imageSource = containerConfig.image || serviceProps.image || this.props.ecrRepository;
559
516
  if (!imageSource) {
560
517
  return aws_ecs_1.ContainerImage.fromRegistry("amazon/amazon-ecs-sample");
561
518
  }
562
- // Include dockerTarget in tag name if specified (e.g., "service-api-latest")
563
- // This ensures services using different targets from the same Dockerfile get different images
519
+ // Build image tag with optional dockerTarget suffix
520
+ // Format: <service>-[<target>-]latest
564
521
  const targetSuffix = serviceProps.dockerTarget
565
- ? `-${serviceProps.dockerTarget}`
522
+ ? `-${serviceProps.dockerTarget.toLowerCase()}`
566
523
  : "";
567
524
  const imageTag = `${serviceName.toLowerCase()}${targetSuffix}-latest`;
568
525
  if (typeof imageSource === "string") {
569
- // Check if it's a registry image (public Docker Hub or public ECR) vs private ECR repository name
570
- const isPublicImage = (imageSource.includes("/") && !imageSource.includes(".")) || // Docker Hub: amazon/amazon-ecs-sample
571
- imageSource.startsWith("public.ecr.aws/"); // Public ECR: public.ecr.aws/fjall/welcome
572
- if (isPublicImage) {
526
+ const isFullRegistryUrl = (imageSource.includes("/") && !imageSource.includes(".")) || // Docker Hub: amazon/amazon-ecs-sample
527
+ imageSource.startsWith("public.ecr.aws/") || // Public ECR: public.ecr.aws/fjall/welcome
528
+ imageSource.includes(".dkr.ecr."); // Private ECR full URL: 123456789012.dkr.ecr.us-east-2.amazonaws.com/repo:tag
529
+ if (isFullRegistryUrl) {
573
530
  return aws_ecs_1.ContainerImage.fromRegistry(imageSource);
574
531
  }
575
532
  return aws_ecs_1.ContainerImage.fromEcrRepository(aws_ecr_1.Repository.fromRepositoryName(this, `${serviceName}${containerConfig.name}EcrRepo`, imageSource), imageTag);
@@ -577,13 +534,11 @@ class EcsCluster extends constructs_1.Construct {
577
534
  if (imageSource instanceof aws_ecr_1.Repository) {
578
535
  return aws_ecs_1.ContainerImage.fromEcrRepository(imageSource, imageTag);
579
536
  }
580
- // RepositoryImage extends ContainerImage, so this is a safe upcast
581
537
  return imageSource;
582
538
  }
583
539
  createService(serviceName, serviceProps, taskDefinition) {
584
540
  const desiredCount = serviceProps.desiredCount ?? 2;
585
541
  const effectiveProvider = this.getServiceCapacityProvider(serviceProps);
586
- // Use per-service capacity provider check
587
542
  if (this.isServiceFargate(serviceProps)) {
588
543
  const hasNat = this.vpcHasNatGateways();
589
544
  const service = new aws_ecs_1.FargateService(this, `${serviceName}Service`, {
@@ -620,7 +575,6 @@ class EcsCluster extends constructs_1.Construct {
620
575
  return service;
621
576
  }
622
577
  else {
623
- // Get or create ASG capacity provider for this service's EC2 config
624
578
  const asgProvider = this.getOrCreateAsgCapacityProvider(serviceProps);
625
579
  const service = new aws_ecs_1.Ec2Service(this, `${serviceName}Service`, {
626
580
  cluster: this.cluster,
@@ -654,10 +608,8 @@ class EcsCluster extends constructs_1.Construct {
654
608
  registerServiceWithALB(serviceName, serviceProps, service, primaryContainer) {
655
609
  const containerPort = primaryContainer.containerPort;
656
610
  const healthCheckPath = serviceProps.routing?.healthCheckPath || "/";
657
- // Determine routing conditions
658
611
  const servicesWithPorts = this.props.services.filter((s) => s.containers.some((c) => c.port !== undefined));
659
612
  const isSingleService = servicesWithPorts.length === 1;
660
- // Use per-service capacity provider check for health check config
661
613
  const healthCheckConfig = this.isServiceEc2(serviceProps)
662
614
  ? {
663
615
  interval: aws_cdk_lib_1.Duration.seconds(30),
@@ -674,7 +626,6 @@ class EcsCluster extends constructs_1.Construct {
674
626
  timeout: aws_cdk_lib_1.Duration.seconds(10)
675
627
  };
676
628
  if (isSingleService) {
677
- // Single service - create target group with service as default target
678
629
  return this.loadBalancerListener.addTargets(`${serviceName}TargetGroup`, {
679
630
  targets: [
680
631
  service.loadBalancerTarget({
@@ -688,7 +639,6 @@ class EcsCluster extends constructs_1.Construct {
688
639
  });
689
640
  }
690
641
  else {
691
- // Multi-service - create target group with routing rules
692
642
  const priority = serviceProps.routing?.priority || this.nextPriority++;
693
643
  const targetGroup = this.loadBalancerListener.addTargets(`${serviceName}Targets`, {
694
644
  targets: [
@@ -734,19 +684,6 @@ class EcsCluster extends constructs_1.Construct {
734
684
  scaleOutCooldown: aws_cdk_lib_1.Duration.seconds(60)
735
685
  });
736
686
  }
737
- /**
738
- * Checks if any service in the cluster uses EC2 capacity provider.
739
- */
740
- hasAnyEc2Service() {
741
- return this.props.services.some((s) => s.capacityProvider === "EC2");
742
- }
743
- /**
744
- * Checks if any service in the cluster uses Fargate capacity provider.
745
- */
746
- hasAnyFargateService() {
747
- return this.props.services.some((s) => s.capacityProvider === "FARGATE" ||
748
- s.capacityProvider === "FARGATE_SPOT");
749
- }
750
687
  /**
751
688
  * Check if the VPC has NAT gateways.
752
689
  * - For Fjall Vpc: uses hasNatGateways property
@@ -754,11 +691,9 @@ class EcsCluster extends constructs_1.Construct {
754
691
  */
755
692
  vpcHasNatGateways() {
756
693
  const vpc = this.cluster.vpc;
757
- // Check if it's our custom Vpc class with hasNatGateways property
758
694
  if ("hasNatGateways" in vpc && typeof vpc.hasNatGateways === "boolean") {
759
695
  return vpc.hasNatGateways;
760
696
  }
761
- // Fallback: assume NAT if private subnets exist
762
697
  return vpc.privateSubnets.length > 0;
763
698
  }
764
699
  /**
@@ -843,19 +778,16 @@ class EcsCluster extends constructs_1.Construct {
843
778
  return Array.from(secretNames);
844
779
  }
845
780
  deriveSsmSecretsPath(serviceName, explicitPath) {
846
- // Use explicit path if provided
847
781
  if (explicitPath) {
848
782
  return explicitPath;
849
783
  }
850
- // Derive path from app/cluster/service names
851
784
  const appName = this.props.appName;
852
785
  if (!appName) {
853
- throw new Error(`Service '${serviceName}' has ssmSecrets defined but no ssmSecretsPath is set ` +
786
+ throw new Error(`Service '${serviceName}' has secrets defined but no ssmSecretsPath is set ` +
854
787
  `and appName is not configured on the cluster. ` +
855
788
  `Either set ssmSecretsPath on the service, or set appName on the cluster props ` +
856
789
  `to enable automatic path derivation (/<appName>/<clusterName>/<serviceName>).`);
857
790
  }
858
- // Validate path components to prevent invalid SSM paths
859
791
  this.validateSsmPathComponent(appName, "appName");
860
792
  this.validateSsmPathComponent(this.props.clusterName, "clusterName");
861
793
  this.validateSsmPathComponent(serviceName, "serviceName");
@@ -875,15 +807,12 @@ class EcsCluster extends constructs_1.Construct {
875
807
  * Services with matching EC2 configs share the same ASG.
876
808
  */
877
809
  getOrCreateAsgCapacityProvider(serviceProps) {
878
- // Get EC2 config from service (required for EC2 capacity provider)
879
810
  const ec2Config = serviceProps.ec2Config ?? {};
880
811
  const key = this.getEc2ConfigKey(ec2Config);
881
- // Return existing if found
882
812
  const existing = this.asgCapacityProviders.get(key);
883
813
  if (existing) {
884
814
  return existing;
885
815
  }
886
- // Create new ASG and capacity provider
887
816
  const instanceType = ec2Config.instanceType ?? "t3.micro";
888
817
  const amiHardwareType = ec2Config.amiHardwareType
889
818
  ? ec2Config.amiHardwareType === "STANDARD"
@@ -892,12 +821,10 @@ class EcsCluster extends constructs_1.Construct {
892
821
  : inferAmiHardwareType(instanceType);
893
822
  const minCapacity = ec2Config.minCapacity ?? 2;
894
823
  const maxCapacity = ec2Config.maxCapacity ?? 3;
895
- // Create security group for this ASG
896
824
  const asgSecurityGroup = new securityGroup_1.SecurityGroup(this, `${key.replace(/[^a-zA-Z0-9]/g, "")}AsgSecurityGroup`, {
897
825
  vpc: this.cluster.vpc,
898
826
  description: `Security group for ${key} auto scaling group`
899
827
  });
900
- // Open container ports for direct EC2 access if enabled
901
828
  if (this.directAccessEnabled) {
902
829
  for (const service of this.props.services) {
903
830
  if (this.isServiceEc2(service)) {
@@ -909,7 +836,7 @@ class EcsCluster extends constructs_1.Construct {
909
836
  }
910
837
  }
911
838
  }
912
- const asg = new aws_autoscaling_1.AutoScalingGroup(this, `${key.replace(/[^a-zA-Z0-9]/g, "")}-AutoScalingGroup`, {
839
+ const asg = new aws_autoscaling_1.AutoScalingGroup(this, `${key.replace(/[^a-zA-Z0-9]/g, "")}AutoScalingGroup`, {
913
840
  autoScalingGroupName: `${this.props.clusterName}-${key.replace(/[^a-zA-Z0-9]/g, "")}-Asg`,
914
841
  vpc: this.cluster.vpc,
915
842
  vpcSubnets: {
@@ -930,7 +857,6 @@ class EcsCluster extends constructs_1.Construct {
930
857
  });
931
858
  this.cluster.addAsgCapacityProvider(provider);
932
859
  this.asgCapacityProviders.set(key, provider);
933
- // Store first ASG and security group for direct access outputs
934
860
  if (!this.autoScalingGroup) {
935
861
  this.autoScalingGroup = asg;
936
862
  }
@@ -952,7 +878,6 @@ class EcsCluster extends constructs_1.Construct {
952
878
  return this.props.services.some((s) => this.isServiceEc2(s));
953
879
  }
954
880
  addCluster(props) {
955
- // Enable Fargate capacity providers if ANY service uses FARGATE or FARGATE_SPOT
956
881
  const needsFargate = this.anyServiceUsesFargate();
957
882
  this.cluster = new aws_ecs_1.Cluster(this, `${props.clusterName}`, {
958
883
  vpc: props.vpc,
@@ -981,14 +906,12 @@ class EcsCluster extends constructs_1.Construct {
981
906
  : defaultLoadBalancerName;
982
907
  truncatedLoadBalancerName = truncatedLoadBalancerName.replace(/-+$/, "");
983
908
  const isInternal = props.cluster?.loadBalancer === "internal";
984
- // Check if ANY service uses EC2 (cluster-level or per-service)
985
909
  const hasEc2Services = this.anyServiceUsesEc2();
986
910
  if (hasEc2Services) {
987
- this.loadBalancerSecurityGroup = new securityGroup_1.SecurityGroup(this, `LoadBalancerSecurityGroup`, {
911
+ this.loadBalancerSecurityGroup = new securityGroup_1.SecurityGroup(this, `${props.clusterName}LoadBalancerSecurityGroup`, {
988
912
  vpc: this.cluster.vpc,
989
913
  description: `Security group for the ${props.clusterName} load balancer`
990
914
  });
991
- // Allow traffic to all ASG security groups
992
915
  if (this.asgSecurityGroup) {
993
916
  this.loadBalancerSecurityGroup.connections.allowTo(this.asgSecurityGroup, aws_ec2_1.Port.allTcp());
994
917
  this.asgSecurityGroup.connections.allowFrom(this.loadBalancerSecurityGroup, aws_ec2_1.Port.tcpRange(49152, 65535));
@@ -1039,7 +962,6 @@ class EcsCluster extends constructs_1.Construct {
1039
962
  addDirectAccessOutputs(props) {
1040
963
  if (!this.directAccessEnabled || !this.autoScalingGroup)
1041
964
  return;
1042
- // Get the first container port (for user instructions)
1043
965
  const containerPort = props.services.flatMap((s) => s.containers).find((c) => c.port)?.port ||
1044
966
  3000;
1045
967
  new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}AutoScalingGroupName`, {
@@ -1058,10 +980,7 @@ class EcsCluster extends constructs_1.Construct {
1058
980
  addLoadBalancerListener(props) {
1059
981
  if (!this.loadBalancer)
1060
982
  return;
1061
- // Determine port based on whether HTTPS is configured (domain + cert)
1062
983
  const port = this.certificate ? 443 : 80;
1063
- // Default action for requests that don't match any routing rule
1064
- // Returns 404 for multi-service clusters with routing rules
1065
984
  const defaultAction = aws_elasticloadbalancingv2_1.ListenerAction.fixedResponse(404, {
1066
985
  contentType: "text/plain",
1067
986
  messageBody: "Not Found"
@@ -1081,7 +1000,6 @@ class EcsCluster extends constructs_1.Construct {
1081
1000
  }
1082
1001
  }
1083
1002
  addHostedZone(props) {
1084
- // Support both new cluster.domain and advanced cluster.domainConfig
1085
1003
  const domainConfig = props.cluster?.domainConfig;
1086
1004
  const simpleDomain = props.cluster?.domain;
1087
1005
  if (!domainConfig && !simpleDomain)
@@ -1102,7 +1020,6 @@ class EcsCluster extends constructs_1.Construct {
1102
1020
  validation: aws_certificatemanager_1.CertificateValidation.fromDns(this.hostedZone)
1103
1021
  });
1104
1022
  }
1105
- // Handle advanced routing policies (latency, weighted, geo)
1106
1023
  if (domainConfig) {
1107
1024
  const latencyConfig = domainConfig;
1108
1025
  const weightedConfig = domainConfig;
@@ -1137,7 +1054,6 @@ class EcsCluster extends constructs_1.Construct {
1137
1054
  }
1138
1055
  }
1139
1056
  else if (simpleDomain && this.loadBalancer) {
1140
- // Simple domain - just create A record
1141
1057
  this.aRecord = new aws_route53_1.ARecord(this, `${props.clusterName}ARecord`, {
1142
1058
  recordName: domainName,
1143
1059
  zone: this.hostedZone,
@@ -1158,4 +1074,4 @@ class EcsCluster extends constructs_1.Construct {
1158
1074
  }
1159
1075
  }
1160
1076
  exports.default = EcsCluster;
1161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBb0I2QjtBQUM3QixpREFTNkI7QUFDN0IsMkNBQXVDO0FBR3ZDLDZDQUFrRTtBQUVsRSx1RkFPZ0Q7QUFDaEQsaURBUTZCO0FBQzdCLHVGQUtnRDtBQUNoRCxpREFBMEQ7QUFDMUQsdUVBQXdEO0FBQ3hELGlEQUFzRDtBQUN0RCwrRUFHNEM7QUFDNUMseURBS2lDO0FBQ2pDLHlFQUFxRTtBQUNyRSxpREFBaUQ7QUFDakQsaUVBQTJFO0FBRTNFLGlFQUFpRjtBQUNqRix3REFBcUQ7QUFJckQ7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixJQUFJO0lBQ0osTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLE9BQU87Q0FDUixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxZQUFvQjtJQUNoRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8scUJBQXFCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMzQyxDQUFDLENBQUMseUJBQWUsQ0FBQyxHQUFHO1FBQ3JCLENBQUMsQ0FBQyx5QkFBZSxDQUFDLFFBQVEsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sZ0NBQWdDO0lBR3BDLFlBQVksT0FB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QWEsRUFBRSxNQUFNO29CQUM3QixNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU07b0JBQzlCLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVztvQkFDbkMsYUFBYSxFQUFFLGFBQWE7aUJBQzdCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdDLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxTQUFTLEVBQUU7Z0JBQzlELFVBQVUsRUFBRSxVQUFVO2dCQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQ3JCLE1BQU0sRUFBRSwwQkFBWSxDQUFDLFNBQVMsQ0FDNUIsSUFBSSx3Q0FBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQzFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUNWLEVBQVUsRUFDVixLQUFzQjtRQUV0QixPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sUUFBUSxHQUFvQjtnQkFDaEMsR0FBRyxLQUFLO2dCQUNSLEdBQUc7b0JBQ0QsR0FBRyxFQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQVcsSUFBSSxLQUFLLENBQUMsR0FBRztpQkFDNUM7YUFDRixDQUFDO1lBQ0YsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXQ0Q0QsNkJBczRDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF3c0xvZ0RyaXZlcixcbiAgQ2x1c3RlciBhcyBDZGtDbHVzdGVyLFxuICBDb250YWluZXJJbWFnZSxcbiAgRmFyZ2F0ZVNlcnZpY2UsXG4gIEZhcmdhdGVUYXNrRGVmaW5pdGlvbixcbiAgRWMyU2VydmljZSxcbiAgRWMyVGFza0RlZmluaXRpb24sXG4gIE5ldHdvcmtNb2RlLFxuICBQcm9wYWdhdGVkVGFnU291cmNlLFxuICB0eXBlIFJlcG9zaXRvcnlJbWFnZSxcbiAgdHlwZSBDb250YWluZXJEZWZpbml0aW9uLFxuICBDb250YWluZXJJbnNpZ2h0cyxcbiAgUGxhY2VtZW50U3RyYXRlZ3ksXG4gIEFzZ0NhcGFjaXR5UHJvdmlkZXIsXG4gIEVjc09wdGltaXplZEltYWdlLFxuICBBbWlIYXJkd2FyZVR5cGUsXG4gIENwdUFyY2hpdGVjdHVyZSxcbiAgT3BlcmF0aW5nU3lzdGVtRmFtaWx5LFxuICBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwLFxuICB0eXBlIElWcGMsXG4gIEluc3RhbmNlVHlwZSxcbiAgUGVlcixcbiAgUG9ydCxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyB0eXBlIFN0YWNrQnVpbGRlciB9IGZyb20gXCIuLi9iYXNlL2F3c1N0YWNrXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBBc3BlY3RzLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHR5cGUgeyBJQXNwZWN0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICB0eXBlIEFwcGxpY2F0aW9uTGlzdGVuZXIsXG4gIEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxuICBBcHBsaWNhdGlvblByb3RvY29sLFxuICB0eXBlIElBcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICBMaXN0ZW5lckFjdGlvbixcbiAgTGlzdGVuZXJDb25kaXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQge1xuICBFZmZlY3QsXG4gIHR5cGUgSU1hbmFnZWRQb2xpY3ksXG4gIFBvbGljeSxcbiAgdHlwZSBQb2xpY3lEb2N1bWVudCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBSb2xlLFxuICBTZXJ2aWNlUHJpbmNpcGFsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBQcmVkZWZpbmVkTWV0cmljLFxuICBTY2FsYWJsZVRhcmdldCxcbiAgU2VydmljZU5hbWVzcGFjZSxcbiAgVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBwbGljYXRpb25hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgU2VjcmV0IGFzIEVjc1NlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGUsXG4gIENlcnRpZmljYXRlVmFsaWRhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQVJlY29yZCxcbiAgUmVjb3JkVGFyZ2V0LFxuICB0eXBlIElIb3N0ZWRab25lLFxuICB0eXBlIEdlb0xvY2F0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgTG9hZEJhbGFuY2VyVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjclwiO1xuaW1wb3J0IHsgQXV0b1NjYWxpbmdHcm91cCwgTW9uaXRvcmluZyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcblxuaW1wb3J0IHsgSG9zdGVkWm9uZSBhcyBGamFsbEhvc3RlZFpvbmUgfSBmcm9tIFwiLi4vLi4vLi4vcGF0dGVybnMvYXdzL2hvc3RlZFpvbmVcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtL3NlY3VyaXR5R3JvdXBcIjtcblxuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuXG4vKipcbiAqIEluc3RhbmNlIHR5cGUgcHJlZml4ZXMgdGhhdCB1c2UgQVJNNjQgYXJjaGl0ZWN0dXJlIChHcmF2aXRvbiBwcm9jZXNzb3JzKS5cbiAqIEFsbCBvdGhlciBwcmVmaXhlcyBhcmUgYXNzdW1lZCB0byBiZSB4ODYtNjQgKFNUQU5EQVJEKS5cbiAqL1xuY29uc3QgQVJNX0lOU1RBTkNFX1BSRUZJWEVTID0gW1xuICBcInQ0Z1wiLFxuICBcImM2Z1wiLFxuICBcImM2Z2RcIixcbiAgXCJjNmduXCIsXG4gIFwiYzdnXCIsXG4gIFwiYzdnZFwiLFxuICBcImM3Z25cIixcbiAgXCJyNmdcIixcbiAgXCJyNmdkXCIsXG4gIFwicjdnXCIsXG4gIFwicjdnZFwiLFxuICBcIm02Z1wiLFxuICBcIm02Z2RcIixcbiAgXCJtN2dcIixcbiAgXCJtN2dkXCIsXG4gIFwiYTFcIixcbiAgXCJ4MmdkXCIsXG4gIFwiaW00Z25cIixcbiAgXCJpczRnZW5cIixcbiAgXCJpNGdcIixcbiAgXCJocGM3Z1wiXG5dO1xuXG4vKipcbiAqIEluZmVyIHRoZSBBTUkgaGFyZHdhcmUgdHlwZSBmcm9tIGFuIEVDMiBpbnN0YW5jZSB0eXBlLlxuICogVXNlcyB0aGUgaW5zdGFuY2UgdHlwZSBwcmVmaXggdG8gZGV0ZXJtaW5lIGlmIGl0J3MgQVJNIChHcmF2aXRvbikgb3IgeDg2LTY0LlxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZVR5cGUgLSBFQzIgaW5zdGFuY2UgdHlwZSAoZS5nLiwgXCJ0NGcubWljcm9cIiwgXCJ0My5zbWFsbFwiKVxuICogQHJldHVybnMgQW1pSGFyZHdhcmVUeXBlLkFSTSBmb3IgR3Jhdml0b24gaW5zdGFuY2VzLCBBbWlIYXJkd2FyZVR5cGUuU1RBTkRBUkQgZm9yIEludGVsL0FNRFxuICovXG5mdW5jdGlvbiBpbmZlckFtaUhhcmR3YXJlVHlwZShpbnN0YW5jZVR5cGU6IHN0cmluZyk6IEFtaUhhcmR3YXJlVHlwZSB7XG4gIGNvbnN0IHByZWZpeCA9IGluc3RhbmNlVHlwZS5zcGxpdChcIi5cIilbMF07XG4gIHJldHVybiBBUk1fSU5TVEFOQ0VfUFJFRklYRVMuaW5jbHVkZXMocHJlZml4KVxuICAgID8gQW1pSGFyZHdhcmVUeXBlLkFSTVxuICAgIDogQW1pSGFyZHdhcmVUeXBlLlNUQU5EQVJEO1xufVxuXG4vKipcbiAqIENESyBBc3BlY3QgdGhhdCBmaXhlcyBjYXBhY2l0eSBwcm92aWRlciBkZWxldGlvbiBkZXBlbmRlbmNpZXMuXG4gKlxuICogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIENESyBidWcgIzE1MzY2IHdoZXJlIEVDUyBzZXJ2aWNlcyBkb24ndCBwcm9wZXJseVxuICogZGVwZW5kIG9uIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zLCBjYXVzaW5nIFwiY2FwYWNpdHkgcHJvdmlkZXJcbiAqIGlzIGluIHVzZVwiIGVycm9ycyBkdXJpbmcgc3RhY2sgZGVsZXRpb24uXG4gKlxuICogVGhlIGFzcGVjdCBydW5zIGF0IHN5bnRoIHRpbWUgKHdoZW4gYXNzb2NpYXRpb25zIGV4aXN0KSBhbmQgYWRkczpcbiAqIC0gU2VydmljZSBkZXBlbmRzIG9uIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zXG4gKlxuICogREVMRVRFIG9yZGVyIGJlY29tZXM6IFNlcnZpY2VzIOKGkiBBc3NvY2lhdGlvbnMg4oaSIENsdXN0ZXJcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTUzNjZcbiAqL1xuY2xhc3MgQ2FwYWNpdHlQcm92aWRlckRlcGVuZGVuY3lBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbHVzdGVyOiBDZGtDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGNsdXN0ZXI6IENka0NsdXN0ZXIpIHtcbiAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyO1xuICB9XG5cbiAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIC8vIEZpbmQgRUNTIHNlcnZpY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY2x1c3RlclxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgRmFyZ2F0ZVNlcnZpY2UgfHwgbm9kZSBpbnN0YW5jZW9mIEVjMlNlcnZpY2UpIHtcbiAgICAgIC8vIEZpbmQgQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnMgaW4gdGhlIGNsdXN0ZXIncyBkZXNjZW5kYW50c1xuICAgICAgY29uc3QgYXNzb2NpYXRpb25zID0gdGhpcy5jbHVzdGVyLm5vZGVcbiAgICAgICAgLmZpbmRBbGwoKVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAoY2hpbGQpOiBjaGlsZCBpcyBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9ucyA9PlxuICAgICAgICAgICAgY2hpbGQgaW5zdGFuY2VvZiBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9uc1xuICAgICAgICApO1xuXG4gICAgICBpZiAoYXNzb2NpYXRpb25zKSB7XG4gICAgICAgIC8vIEFkZCBkZXBlbmRlbmN5OiBTZXJ2aWNlIOKGkiBBc3NvY2lhdGlvbnNcbiAgICAgICAgLy8gREVMRVRFIG9yZGVyOiBTZXJ2aWNlIGRlbGV0ZWQgZmlyc3QsIHRoZW4gQXNzb2NpYXRpb25zXG4gICAgICAgIG5vZGUubm9kZS5hZGREZXBlbmRlbmN5KGFzc29jaWF0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBlbnVtIFByb3RvY29sIHtcbiAgSFRUUCxcbiAgSFRUUFNcbn1cblxuZXhwb3J0IGVudW0gU2NhbGluZ1R5cGUge1xuICBDUFUgPSBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfQ1BVX1VUSUxJWkFUSU9OLFxuICBNRU1PUlkgPSBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfTUVNT1JZX1VUSUxJWkFUSU9OXG59XG5cbmV4cG9ydCB0eXBlIEVjc0NhcGFjaXR5UHJvdmlkZXIgPSBcIkZBUkdBVEVcIiB8IFwiRkFSR0FURV9TUE9UXCIgfCBcIkVDMlwiO1xuXG4vKipcbiAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uIGZvciBFQ1MgRUMyLWJhY2tlZCBjbHVzdGVycy5cbiAqIE9ubHkgdXNlZCB3aGVuIGNhcGFjaXR5UHJvdmlkZXIgaXMgXCJFQzJcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYzJDYXBhY2l0eUNvbmZpZyB7XG4gIC8qKiBFQzIgaW5zdGFuY2UgdHlwZS4gRGVmYXVsdDogXCJ0My5taWNyb1wiICovXG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbiAgLyoqIEFNSSBoYXJkd2FyZSB0eXBlLiBEZWZhdWx0OiBcIkFSTVwiIChHcmF2aXRvbiAtIGJldHRlciBjb3N0L3BlcmZvcm1hbmNlKSAqL1xuICBhbWlIYXJkd2FyZVR5cGU/OiBcIkFSTVwiIHwgXCJTVEFOREFSRFwiO1xuICAvKiogTWluaW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAxICovXG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAzICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgRUMyIGluc3RhbmNlcy4gRGVmYXVsdDogMiAoZm9yIGF2YWlsYWJpbGl0eSkgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuICAvKiogTWVtb3J5IGxpbWl0IGluIE1pQiBmb3IgdGhlIGNvbnRhaW5lci4gRGVmYXVsdDogMTAyNCAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEb21haW4gY29uZmlndXJhdGlvbiBmb3IgSFRUUFMgYW5kIEROUy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb21haW5CYXNlQ29uZmlnIHtcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBob3N0ZWRab25lPzogRmphbGxIb3N0ZWRab25lO1xuICBjZXJ0aWZpY2F0ZT86IENlcnRpZmljYXRlO1xuICBzZXRJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhdGVuY3lEb21haW5Db25maWcgZXh0ZW5kcyBEb21haW5CYXNlQ29uZmlnIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2VpZ2h0ZWREb21haW5Db25maWcgZXh0ZW5kcyBEb21haW5CYXNlQ29uZmlnIHtcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvTG9jYXRpb25Eb21haW5Db25maWcgZXh0ZW5kcyBEb21haW5CYXNlQ29uZmlnIHtcbiAgZ2VvTG9jYXRpb246IEdlb0xvY2F0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBEb21haW5Db25maWcgPVxuICB8IERvbWFpbkJhc2VDb25maWdcbiAgfCBMYXRlbmN5RG9tYWluQ29uZmlnXG4gIHwgV2VpZ2h0ZWREb21haW5Db25maWdcbiAgfCBHZW9Mb2NhdGlvbkRvbWFpbkNvbmZpZztcblxuLyoqXG4gKiBJbnRlcm5hbCBjb25maWd1cmF0aW9uIGZvciBhIGNvbnRhaW5lciBpbiBhIG11bHRpLWNvbnRhaW5lciBFQ1MgdGFzay5cbiAqXG4gKiBJbiBtdWx0aS1jb250YWluZXIgdGFza3MsIHRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIGBwb3J0YCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gKiB0aGF0IHJlY2VpdmVzIGxvYWQgYmFsYW5jZXIgdHJhZmZpYy4gQWxsIG90aGVyIGNvbnRhaW5lcnMgYXJlICoqc2lkZWNhcnMqKiB0aGF0IHByb3ZpZGVcbiAqIHN1cHBvcnRpbmcgZnVuY3Rpb25hbGl0eSAobG9nZ2luZywgbW9uaXRvcmluZywgcHJveGllcywgZXRjLikuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFByaW1hcnkgY29udGFpbmVyIChoYXMgcG9ydCkgKyBzaWRlY2FyIChubyBwb3J0KVxuICogY29udGFpbmVyczogW1xuICogICB7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDAgfSwgICAgICAgICAgIC8vIFByaW1hcnkgLSByZWNlaXZlcyBBTEIgdHJhZmZpY1xuICogICB7IG5hbWU6IFwiZGF0YWRvZ1wiLCBpbWFnZTogXCJkYXRhZG9nL2FnZW50XCIgfSAgLy8gU2lkZWNhciAtIG1vbml0b3JpbmdcbiAqIF1cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqIFVuaXF1ZSBjb250YWluZXIgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250YWluZXIgaW1hZ2UuIE9wdGlvbnM6XG4gICAqIC0gT21pdDogVXNlcyBkZWZhdWx0IEVDUiByZXBvc2l0b3J5IChwcmltYXJ5IGNvbnRhaW5lciBvbmx5KVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuICAvKipcbiAgICogUG9ydCB0aGUgY29udGFpbmVyIGxpc3RlbnMgb24uXG4gICAqIFRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgYmVjb21lcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gICAqIGFuZCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFNlY3JldHMgaW1wb3J0ZWQgZnJvbSBvdGhlciByZXNvdXJjZXMgKEFXUyBTZWNyZXRzIE1hbmFnZXIpICovXG4gIHNlY3JldHNJbXBvcnQ/OiB7IFtrZXk6IHN0cmluZ106IFNlY3JldEltcG9ydCB9O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNzbVNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJEQl9QQVNTV09SRFwiXVxuICAgKi9cbiAgc3NtU2VjcmV0cz86IHN0cmluZ1tdO1xuICAvKiogQ29tbWFuZCB0byBydW4gaW4gdGhlIGNvbnRhaW5lciAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG4gIC8qKiBFbnRyeSBwb2ludCBmb3IgdGhlIGNvbnRhaW5lciAqL1xuICBlbnRyeVBvaW50Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIGVzc2VudGlhbC5cbiAgICogSWYgYW4gZXNzZW50aWFsIGNvbnRhaW5lciBzdG9wcywgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgc3RvcC5cbiAgICogRGVmYXVsdDogdHJ1ZSBmb3IgcHJpbWFyeSBjb250YWluZXIsIHRydWUgZm9yIHNpZGVjYXJzXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogQ2x1c3Rlci1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ2x1c3RlckNsdXN0ZXJDb25maWcge1xuICAvKipcbiAgICogRG9tYWluIGZvciBIVFRQUyBhY2Nlc3MuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IEROUyAoKi5lbGIuYW1hem9uYXdzLmNvbSlcbiAgICogLSBTcGVjaWZpZWQ6IENyZWF0ZXMgQUNNIGNlcnRpZmljYXRlICsgUm91dGU1MyBETlMgQSByZWNvcmRcbiAgICovXG4gIGRvbWFpbj86IHN0cmluZztcblxuICAvKipcbiAgICogTG9hZCBiYWxhbmNlciBjb25maWd1cmF0aW9uLlxuICAgKiAtIGZhbHNlOiBObyBBTEIgKGZvciB3b3JrZXJzL2ludGVybmFsIHNlcnZpY2VzKVxuICAgKiAtIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICovXG4gIGxvYWRCYWxhbmNlcj86IGZhbHNlIHwgXCJwdWJsaWNcIiB8IFwiaW50ZXJuYWxcIjtcblxuICAvKipcbiAgICogRW5hYmxlIGRpcmVjdCBFQzIgYWNjZXNzIHdpdGhvdXQgQUxCLlxuICAgKiBPcGVucyBjb250YWluZXIgcG9ydHMgb24gc2VjdXJpdHkgZ3JvdXAgZm9yIGRpcmVjdCBhY2Nlc3MgdmlhIEVDMiBwdWJsaWMgSVAuXG4gICAqIFVzZXMgaG9zdCBuZXR3b3JrIG1vZGUgZm9yIHByZWRpY3RhYmxlIHBvcnQgbWFwcGluZyAoY29udGFpbmVyOjMwMDAg4oaSIGhvc3Q6MzAwMCkuXG4gICAqIE9ubHkgdmFsaWQgd2l0aCBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb21haW4gY29uZmlndXJhdGlvbiBmb3IgYWR2YW5jZWQgcm91dGluZyBwb2xpY2llcyAobGF0ZW5jeSwgd2VpZ2h0ZWQsIGdlbykuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGRvbWFpbiBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG59XG5cbi8qKlxuICogUm91dGluZyBjb25maWd1cmF0aW9uIGZvciBwYXRoL2hvc3QtYmFzZWQgcm91dGluZyBvbiB0aGUgQUxCLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1JvdXRpbmdDb25maWcge1xuICAvKiogUGF0aCBwYXR0ZXJuIGZvciByb3V0aW5nIChlLmcuLCBcIi9hcGkvKlwiLCBcIi91c2Vycy8qXCIpICovXG4gIHBhdGg/OiBzdHJpbmc7XG4gIC8qKiBIb3N0IGhlYWRlciBmb3Igcm91dGluZyAoZS5nLiwgXCJhcGkuZXhhbXBsZS5jb21cIikgKi9cbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIFByaW9yaXR5IGZvciB0aGlzIHJvdXRpbmcgcnVsZSAoMS01MDAwMCkuIExvd2VyID0gaGlnaGVyIHByaW9yaXR5LiAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcbiAgLyoqIEhlYWx0aCBjaGVjayBwYXRoIGZvciB0aGlzIHNlcnZpY2UncyB0YXJnZXQgZ3JvdXAuIERlZmF1bHQ6IFwiL1wiICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZywgYW5kIHRhcmdldCBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NTZXJ2aWNlUHJvcHMge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIC0gT21pdDogVXNlcyBjbHVzdGVyJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgc2VydmljZS5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqIChyZWNlaXZlcyBBTEIgdHJhZmZpYykuXG4gICAqL1xuICBjb250YWluZXJzOiBFY3NDbHVzdGVyQ29udGFpbmVyQ29uZmlnW107XG5cbiAgLyoqIENQVSB1bml0cyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDI1Ni00MDk2KSAqL1xuICBjcHU/OiBudW1iZXI7XG5cbiAgLyoqIE1lbW9yeSBpbiBNaUIgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICg1MTItMzA3MjApICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuXG4gIC8qKiBEZXNpcmVkIG51bWJlciBvZiB0YXNrcy4gRGVmYXVsdDogMiAqL1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqIFNjYWxpbmcgdHlwZSAoQ1BVIG9yIE1FTU9SWSkuIE9taXQgdG8gZGlzYWJsZSBhdXRvLXNjYWxpbmcuICovXG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG5cbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIHRhc2tzIGZvciBhdXRvLXNjYWxpbmcuIERlZmF1bHQ6IDIgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHRhc2tzIGZvciBhdXRvLXNjYWxpbmcuIERlZmF1bHQ6IDEwICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIHNlcnZpY2Ugb24gdGhlIGNsdXN0ZXIncyBBTEIuXG4gICAqIFJlcXVpcmVkIHdoZW4gY2x1c3RlciBoYXMgbXVsdGlwbGUgc2VydmljZXMgd2l0aCBwb3J0cy5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGlubGluZSBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtYW5hZ2VkIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzPzogSU1hbmFnZWRQb2xpY3lbXTtcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgc2VydmljZSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIHRvIGFsbG93IHRyYWZmaWMgZnJvbSB0aGlzIHNwZWNpZmljIHNlcnZpY2Ugb25seS5cbiAgICovXG4gIGNvbm5lY3Rpb25zPzogSUNvbm5lY3RhYmxlW107XG5cbiAgLyoqXG4gICAqIENhcGFjaXR5IHByb3ZpZGVyIGZvciB0aGlzIHNlcnZpY2UuIFJFUVVJUkVELlxuICAgKiBFYWNoIHNlcnZpY2Ugc3BlY2lmaWVzIGl0cyBvd24gY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBjYXBhY2l0eVByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBPbmx5IHVzZWQgd2hlbiBzZXJ2aWNlIGNhcGFjaXR5UHJvdmlkZXIgaXMgXCJFQzJcIi5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBlYzJDb25maWcgc2hhcmUgYW4gQVNHIGZvciBlZmZpY2llbmN5LlxuICAgKi9cbiAgZWMyQ29uZmlnPzogRWMyQ2FwYWNpdHlDb25maWc7XG5cbiAgLyoqXG4gICAqIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBmb3Igc2VjcmV0cy5cbiAgICogSWYgY29udGFpbmVycyBoYXZlIHNzbVNlY3JldHMgZGVmaW5lZCwgdGhpcyBwYXRoIGlzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cbiAgICogRm9ybWF0OiAvPGFwcD4vPGNsdXN0ZXI+LzxzZXJ2aWNlPlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnNcIlxuICAgKi9cbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gRG9ja2VyZmlsZSBmb3IgYnVpbGRpbmcgdGhpcyBzZXJ2aWNlJ3MgaW1hZ2UuXG4gICAqIE1ldGFkYXRhIGZvciBDTEkgYnVpbGQgcHJvY2Vzcywgbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogRG9ja2VyIGJ1aWxkIHRhcmdldCBzdGFnZSBmb3IgbXVsdGktc3RhZ2UgRG9ja2VyZmlsZXMuXG4gICAqIE1ldGFkYXRhIGZvciBDTEkgYnVpbGQgcHJvY2Vzcywgbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJUYXJnZXQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIGNyZWF0aW5nIGFuIEVDUyBjbHVzdGVyIHdpdGggbXVsdGlwbGUgc2VydmljZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEVjc0NsdXN0ZXJQcm9wcyA9IHtcbiAgLyoqIENsdXN0ZXIgbmFtZSAqL1xuICBjbHVzdGVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIGZvciBTU00gc2VjcmV0cyBuYW1lc3BhY2UuXG4gICAqIFJlcXVpcmVkIHdoZW4gYW55IGNvbnRhaW5lciB1c2VzIHNzbVNlY3JldHMgd2l0aG91dCBleHBsaWNpdCBzc21TZWNyZXRzUGF0aC5cbiAgICogVXNlZCB0byBidWlsZCB0aGUgcGF0aDogLzxhcHBOYW1lPi88Y2x1c3Rlck5hbWU+LzxzZXJ2aWNlTmFtZT5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIFZQQyB0byBkZXBsb3kgaW50byAqL1xuICB2cGM/OiBJVnBjO1xuXG4gIC8qKiBEZWZhdWx0IEVDUiByZXBvc2l0b3J5IG9yIGNvbnRhaW5lciBpbWFnZSAqL1xuICBlY3JSZXBvc2l0b3J5OiBSZXBvc2l0b3J5IHwgUmVwb3NpdG9yeUltYWdlIHwgc3RyaW5nO1xuXG4gIC8vIE5vdGU6IGNhcGFjaXR5UHJvdmlkZXIgYW5kIGVjMkNvbmZpZyBhcmUgcGVyLXNlcnZpY2Ugb25seSAoaW4gRWNzU2VydmljZVByb3BzKVxuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIENvbnRyb2xzIHRoZSBzaGFyZWQgQUxCIGZvciBhbGwgc2VydmljZXMuXG4gICAqL1xuICBjbHVzdGVyPzogRWNzQ2x1c3RlckNsdXN0ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gICAqIEVhY2ggc2VydmljZSBNVVNUIHNwZWNpZnkgaXRzIG93biBjYXBhY2l0eVByb3ZpZGVyLlxuICAgKiBBbGwgc2VydmljZXMgc2hhcmUgdGhlIGNsdXN0ZXIncyBBTEIgKHVubGVzcyBkaXNhYmxlZCkuXG4gICAqIFRhc2sgcm9sZSBwb2xpY2llcyBhcmUgY29uZmlndXJlZCBwZXItc2VydmljZSBmb3IgbGVhc3QtcHJpdmlsZWdlLlxuICAgKi9cbiAgc2VydmljZXM6IEVjc1NlcnZpY2VQcm9wc1tdO1xufTtcblxuLyoqXG4gKiBEYXRhIHRyYWNrZWQgZm9yIGVhY2ggc2VydmljZSBpbiB0aGUgY2x1c3Rlci5cbiAqL1xuaW50ZXJmYWNlIFNlcnZpY2VEYXRhIHtcbiAgc2VydmljZTogRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlO1xuICB0YXNrRGVmaW5pdGlvbjogRmFyZ2F0ZVRhc2tEZWZpbml0aW9uIHwgRWMyVGFza0RlZmluaXRpb247XG4gIC8qKiBSb2xlIGZvciBFQ1MgYWdlbnQgKHB1bGwgaW1hZ2VzLCB3cml0ZSBsb2dzLCBpbmplY3Qgc2VjcmV0cykgKi9cbiAgZXhlY3V0aW9uUm9sZTogUm9sZTtcbiAgLyoqIFJvbGUgZm9yIGFwcGxpY2F0aW9uIGNvZGUgKHVzZXIgcG9saWNpZXMsIEVDUyBFeGVjKSAqL1xuICB0YXNrUm9sZTogUm9sZTtcbiAgY29udGFpbmVyczogQ29udGFpbmVyRGVmaW5pdGlvbltdO1xuICBwcmltYXJ5Q29udGFpbmVyPzogQ29udGFpbmVyRGVmaW5pdGlvbjtcbiAgdGFyZ2V0R3JvdXA/OiBJQXBwbGljYXRpb25UYXJnZXRHcm91cDtcbiAgc2NhbGluZ1BvbGljeT86IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeTtcbn1cblxuLyoqXG4gKiBFQ1MgQ2x1c3RlciBzdXBwb3J0aW5nIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggYSBzaGFyZWQgQUxCLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZSBjbHVzdGVyXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJXZWJDbHVzdGVyXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiV2ViQ2x1c3RlclwiLFxuICogICBlY3JSZXBvc2l0b3J5OiBlY3IsXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH1dIH1cbiAqICAgXVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXNlcnZpY2UgY2x1c3RlciB3aXRoIHJvdXRpbmdcbiAqIG5ldyBFY3NDbHVzdGVyKHNjb3BlLCBcIkFwaUNsdXN0ZXJcIiwge1xuICogICBjbHVzdGVyTmFtZTogXCJBcGlDbHVzdGVyXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwaS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIGVjclJlcG9zaXRvcnk6IGVjcixcbiAqICAgc2VydmljZXM6IFtcbiAqICAgICB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIgfSB9LFxuICogICAgIHsgbmFtZTogXCJvcmRlcnNcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMSB9XSwgcm91dGluZzogeyBwYXRoOiBcIi9vcmRlcnMvKlwiIH0gfVxuICogICBdXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV29ya2VyIGNsdXN0ZXIgKG5vIEFMQilcbiAqIG5ldyBFY3NDbHVzdGVyKHNjb3BlLCBcIldvcmtlcnNcIiwge1xuICogICBjbHVzdGVyTmFtZTogXCJXb3JrZXJzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgbG9hZEJhbGFuY2VyOiBmYWxzZSB9LFxuICogICBlY3JSZXBvc2l0b3J5OiBlY3IsXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInByb2Nlc3NvclwiLCBjb250YWluZXJzOiBbeyBuYW1lOiBcIndvcmtlclwiIH1dIH1cbiAqICAgXVxuICogfSk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVjc0NsdXN0ZXIgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIC8vIENsdXN0ZXItbGV2ZWwgcmVzb3VyY2VzXG4gIHByaXZhdGUgY2x1c3RlcjogQ2RrQ2x1c3RlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXI/OiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJMaXN0ZW5lcj86IEFwcGxpY2F0aW9uTGlzdGVuZXI7XG4gIHByaXZhdGUgaG9zdGVkWm9uZT86IElIb3N0ZWRab25lO1xuICBwcml2YXRlIGNlcnRpZmljYXRlPzogQ2VydGlmaWNhdGU7XG4gIHByaXZhdGUgYVJlY29yZD86IEFSZWNvcmQ7XG5cbiAgLy8gRUMyLXNwZWNpZmljXG4gIHByaXZhdGUgYXV0b1NjYWxpbmdHcm91cD86IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUgYXNnU2VjdXJpdHlHcm91cD86IFNlY3VyaXR5R3JvdXA7XG4gIHByaXZhdGUgYXNnQ2FwYWNpdHlQcm92aWRlcj86IEFzZ0NhcGFjaXR5UHJvdmlkZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cD86IFNlY3VyaXR5R3JvdXA7XG5cbiAgLy8gUGVyLXNlcnZpY2UgdHJhY2tpbmdcbiAgcHJpdmF0ZSBzZXJ2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXJ2aWNlRGF0YT4oKTtcblxuICAvLyBQZXItc2VydmljZSBBU0cgY2FwYWNpdHkgcHJvdmlkZXJzIChrZXllZCBieSBFQzIgY29uZmlnIHNpZ25hdHVyZSlcbiAgcHJpdmF0ZSBhc2dDYXBhY2l0eVByb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBc2dDYXBhY2l0eVByb3ZpZGVyPigpO1xuXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBzY29wZTogQ29uc3RydWN0O1xuICBwcml2YXRlIHByb3BzOiBFY3NDbHVzdGVyUHJvcHM7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyRGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgZGlyZWN0QWNjZXNzRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBuZXh0UHJpb3JpdHkgPSAxMDA7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCA9IHByb3BzLmNsdXN0ZXI/LmRpcmVjdEFjY2VzcyA9PT0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkID1cbiAgICAgIHByb3BzLmNsdXN0ZXI/LmxvYWRCYWxhbmNlciA9PT0gZmFsc2UgfHwgdGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcblxuICAgIC8vIDEuIENyZWF0ZSB0aGUgRUNTIGNsdXN0ZXJcbiAgICB0aGlzLmFkZENsdXN0ZXIocHJvcHMpO1xuXG4gICAgLy8gMi4gUHJlLWNyZWF0ZSBBU0dzIGZvciBzZXJ2aWNlcyB3aXRoIEVDMiBjYXBhY2l0eSBwcm92aWRlclxuICAgIC8vIFRoaXMgZW5zdXJlcyBBU0cgc2VjdXJpdHkgZ3JvdXBzIGV4aXN0IGJlZm9yZSBsb2FkIGJhbGFuY2VyIGNyZWF0aW9uXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlUHJvcHMgb2YgcHJvcHMuc2VydmljZXMpIHtcbiAgICAgIGlmIChzZXJ2aWNlUHJvcHMuY2FwYWNpdHlQcm92aWRlciA9PT0gXCJFQzJcIikge1xuICAgICAgICB0aGlzLmdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlcihzZXJ2aWNlUHJvcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIENyZWF0ZSBBTEIgaWYgbm90IGRpc2FibGVkIChzaGFyZWQgYnkgYWxsIHNlcnZpY2VzKVxuICAgIGlmICghdGhpcy5sb2FkQmFsYW5jZXJEaXNhYmxlZCkge1xuICAgICAgdGhpcy5hZGRMb2FkQmFsYW5jZXIocHJvcHMpO1xuXG4gICAgICAvLyBTZXQgdXAgZG9tYWluL0hUVFBTIGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChwcm9wcy5jbHVzdGVyPy5kb21haW4gfHwgcHJvcHMuY2x1c3Rlcj8uZG9tYWluQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuYWRkSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZERpcmVjdEFjY2Vzc091dHB1dHMocHJvcHMpO1xuICAgIH1cblxuICAgIC8vIDQuIENyZWF0ZSBlYWNoIHNlcnZpY2VcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2VQcm9wcyBvZiBwcm9wcy5zZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlVG9DbHVzdGVyKHNlcnZpY2VQcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gNS4gQ3JlYXRlIERlcGxveWFibGVTZXJ2aWNlIG91dHB1dHMgZm9yIGRlcGxveW1lbnQgYXV0b21hdGlvblxuICAgIHRoaXMuYWRkRGVwbG95YWJsZVNlcnZpY2VPdXRwdXRzKHByb3BzKTtcblxuICAgIC8vIDYuIFNldCB1cCBjb25uZWN0aW9uc1xuICAgIHRoaXMuc2V0dXBDb25uZWN0aW9ucyhwcm9wcyk7XG5cbiAgICAvLyA3LiBBcHBseSBhc3BlY3QgdG8gZml4IGNhcGFjaXR5IHByb3ZpZGVyIGRlbGV0aW9uIGRlcGVuZGVuY2llcyAoQ0RLIGJ1ZyB3b3JrYXJvdW5kKVxuICAgIC8vIFRoaXMgcnVucyBhdCBzeW50aCB0aW1lIHdoZW4gQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnMgZXhpc3RzXG4gICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IENhcGFjaXR5UHJvdmlkZXJEZXBlbmRlbmN5QXNwZWN0KHRoaXMuY2x1c3RlcikpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2x1c3RlcidzIGxvYWQgYmFsYW5jZXIuIFVuZGVmaW5lZCBpZiBkaXNhYmxlZC4gKi9cbiAgZ2V0TG9hZEJhbGFuY2VyKCk6IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkQmFsYW5jZXI7XG4gIH1cblxuICAvKiogR2V0IHRoZSBsb2FkIGJhbGFuY2VyJ3MgbGlzdGVuZXIuIFVuZGVmaW5lZCBpZiBkaXNhYmxlZC4gKi9cbiAgZ2V0TGlzdGVuZXIoKTogQXBwbGljYXRpb25MaXN0ZW5lciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXI7XG4gIH1cblxuICAvKiogR2V0IGEgc3BlY2lmaWMgc2VydmljZSBieSBuYW1lLiAqL1xuICBnZXRTZXJ2aWNlKG5hbWU6IHN0cmluZyk6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0KG5hbWUpPy5zZXJ2aWNlO1xuICB9XG5cbiAgLyoqIEdldCBhbGwgc2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLiAqL1xuICBnZXRTZXJ2aWNlcygpOiBNYXA8c3RyaW5nLCBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2U+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlPigpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIHRoaXMuc2VydmljZXMpIHtcbiAgICAgIHJlc3VsdC5zZXQobmFtZSwgZGF0YS5zZXJ2aWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEVDUyBjbHVzdGVyIGNvbnN0cnVjdC4gKi9cbiAgZ2V0Q2x1c3RlcigpOiBDZGtDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5jbHVzdGVyO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgQUxCIFVSTCAoaHR0cDovLyBvciBodHRwczovLykuICovXG4gIGdldFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5sb2FkQmFsYW5jZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLmNlcnRpZmljYXRlID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgY29uc3QgZG9tYWluID1cbiAgICAgIHRoaXMucHJvcHMuY2x1c3Rlcj8uZG9tYWluIHx8IHRoaXMubG9hZEJhbGFuY2VyLmxvYWRCYWxhbmNlckRuc05hbWU7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7ZG9tYWlufWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2VydmljZSB0byB0aGUgY2x1c3Rlci5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIGNvbnRhaW5lcnMsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlcnZpY2VUb0NsdXN0ZXIoc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VQcm9wcy5uYW1lO1xuXG4gICAgLy8gQ3JlYXRlIHNlcGFyYXRlIHJvbGVzIGZvciBzZWN1cml0eSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZSA9IHRoaXMuY3JlYXRlRXhlY3V0aW9uUm9sZShzZXJ2aWNlTmFtZSk7XG4gICAgY29uc3QgdGFza1JvbGUgPSB0aGlzLmNyZWF0ZVRhc2tSb2xlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlUHJvcHMpO1xuXG4gICAgLy8gQ3JlYXRlIHRhc2sgZGVmaW5pdGlvbiB3aXRoIGJvdGggcm9sZXNcbiAgICBjb25zdCB0YXNrRGVmaW5pdGlvbiA9IHRoaXMuY3JlYXRlVGFza0RlZmluaXRpb24oXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICB0YXNrUm9sZVxuICAgICk7XG5cbiAgICAvLyBBZGQgY29udGFpbmVycyB0byB0YXNrIGRlZmluaXRpb25cbiAgICBjb25zdCB7IGNvbnRhaW5lcnMsIHByaW1hcnlDb250YWluZXIgfSA9IHRoaXMuYWRkQ29udGFpbmVyc1RvVGFzayhcbiAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgc2VydmljZVByb3BzLFxuICAgICAgdGFza0RlZmluaXRpb25cbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBFQ1Mgc2VydmljZVxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVNlcnZpY2UoXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgIHRhc2tEZWZpbml0aW9uXG4gICAgKTtcblxuICAgIC8vIFJlZ2lzdGVyIHdpdGggQUxCIGlmIGVuYWJsZWQgYW5kIGhhcyBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnRcbiAgICBsZXQgdGFyZ2V0R3JvdXA6IElBcHBsaWNhdGlvblRhcmdldEdyb3VwIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkICYmXG4gICAgICBwcmltYXJ5Q29udGFpbmVyICYmXG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyXG4gICAgKSB7XG4gICAgICB0YXJnZXRHcm91cCA9IHRoaXMucmVnaXN0ZXJTZXJ2aWNlV2l0aEFMQihcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgICAgc2VydmljZSxcbiAgICAgICAgcHJpbWFyeUNvbnRhaW5lclxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2NhbGluZyBpZiBjb25maWd1cmVkXG4gICAgbGV0IHNjYWxpbmdQb2xpY3k6IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VydmljZVByb3BzLnNjYWxpbmdUeXBlKSB7XG4gICAgICBzY2FsaW5nUG9saWN5ID0gdGhpcy5hZGRTZXJ2aWNlU2NhbGluZyhcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgICAgc2VydmljZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSBzZXJ2aWNlIGRhdGFcbiAgICB0aGlzLnNlcnZpY2VzLnNldChzZXJ2aWNlTmFtZSwge1xuICAgICAgc2VydmljZSxcbiAgICAgIHRhc2tEZWZpbml0aW9uLFxuICAgICAgZXhlY3V0aW9uUm9sZSxcbiAgICAgIHRhc2tSb2xlLFxuICAgICAgY29udGFpbmVycyxcbiAgICAgIHByaW1hcnlDb250YWluZXIsXG4gICAgICB0YXJnZXRHcm91cCxcbiAgICAgIHNjYWxpbmdQb2xpY3lcbiAgICB9KTtcblxuICAgIC8vIEFkZCBzZXJ2aWNlIGxldmVsIGNvbm5lY3Rpb25zXG4gICAgaWYgKHNlcnZpY2VQcm9wcy5jb25uZWN0aW9ucyAmJiBzZXJ2aWNlUHJvcHMuY29ubmVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjb25uZWN0YWJsZSBvZiBzZXJ2aWNlUHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgICAgc2VydmljZS5jb25uZWN0aW9ucy5hbGxvd1RvRGVmYXVsdFBvcnQoY29ubmVjdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogRWNzQ2x1c3RlclByb3BzKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgc2VydmljZXMgYXJyYXlcbiAgICBpZiAoIXByb3BzLnNlcnZpY2VzIHx8IHByb3BzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgc2VydmljZSBuYW1lc1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHByb3BzLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgICBjb25zdCBkdXBsaWNhdGVTZXJ2aWNlcyA9IHNlcnZpY2VOYW1lcy5maWx0ZXIoXG4gICAgICAobmFtZSwgaW5kZXgpID0+IHNlcnZpY2VOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZVNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYER1cGxpY2F0ZSBzZXJ2aWNlIG5hbWVzOiAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZVNlcnZpY2VzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcm91dGluZyB3aGVuIG11bHRpcGxlIHNlcnZpY2VzIGhhdmUgcG9ydHNcbiAgICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHByb3BzLnNlcnZpY2VzLmZpbHRlcigocykgPT5cbiAgICAgIHMuY29udGFpbmVycy5zb21lKChjKSA9PiBjLnBvcnQgIT09IHVuZGVmaW5lZClcbiAgICApO1xuXG4gICAgaWYgKHNlcnZpY2VzV2l0aFBvcnRzLmxlbmd0aCA+IDEgJiYgIXRoaXMubG9hZEJhbGFuY2VyRGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdSb3V0aW5nID0gc2VydmljZXNXaXRoUG9ydHMuZmlsdGVyKFxuICAgICAgICAocykgPT4gIXMucm91dGluZz8ucGF0aCAmJiAhcy5yb3V0aW5nPy5ob3N0XG4gICAgICApO1xuICAgICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlcyB3aXRoIHBvcnRzIHJlcXVpcmUgcm91dGluZyBjb25maWcgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlczogYCArXG4gICAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgICBcIkFkZCByb3V0aW5nOiB7IHBhdGg6ICcvLi4uJyB9IHRvIGVhY2ggc2VydmljZS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgcHJvcHMuc2VydmljZXMpIHtcbiAgICAgIGlmICghc2VydmljZS5jb250YWluZXJzIHx8IHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBBdCBsZWFzdCBvbmUgY29udGFpbmVyIG11c3QgYmUgc3BlY2lmaWVkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2VcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lcnMgPSBjb250YWluZXJOYW1lcy5maWx0ZXIoXG4gICAgICAgIChuYW1lLCBpbmRleCkgPT4gY29udGFpbmVyTmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gaW5kZXhcbiAgICAgICk7XG4gICAgICBpZiAoZHVwbGljYXRlQ29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JzogRHVwbGljYXRlIGNvbnRhaW5lciBuYW1lczogYCArXG4gICAgICAgICAgICBgJHtbLi4ubmV3IFNldChkdXBsaWNhdGVDb250YWluZXJzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwQ29ubmVjdGlvbnMocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHNlcnZpY2Ugd2l0aCBhIHBvcnQgZm9yIGRlZmF1bHQgY29ubmVjdGlvblxuICAgIGxldCBkZWZhdWx0UG9ydCA9IDgwO1xuICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBwcm9wcy5zZXJ2aWNlcykge1xuICAgICAgY29uc3QgcHJpbWFyeUNvbnRhaW5lciA9IHNlcnZpY2UuY29udGFpbmVycy5maW5kKFxuICAgICAgICAoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBpZiAocHJpbWFyeUNvbnRhaW5lcj8ucG9ydCkge1xuICAgICAgICBkZWZhdWx0UG9ydCA9IHByaW1hcnlDb250YWluZXIucG9ydDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBzZWN1cml0eSBncm91cHMgZnJvbSBFQzIgQVNHcyBhbmQgRmFyZ2F0ZSBzZXJ2aWNlc1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdID0gW107XG5cbiAgICAvLyBBZGQgQVNHIHNlY3VyaXR5IGdyb3VwIGlmIGFueSBFQzIgc2VydmljZXMgZXhpc3RcbiAgICBpZiAodGhpcy5hc2dTZWN1cml0eUdyb3VwKSB7XG4gICAgICBzZWN1cml0eUdyb3Vwcy5wdXNoKHRoaXMuYXNnU2VjdXJpdHlHcm91cCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIEZhcmdhdGUgc2VydmljZSBzZWN1cml0eSBncm91cHMgaWYgYW55IEZhcmdhdGUgc2VydmljZXMgZXhpc3RcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2VEYXRhIG9mIHRoaXMuc2VydmljZXMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2VTZ3MgPSBzZXJ2aWNlRGF0YS5zZXJ2aWNlPy5jb25uZWN0aW9ucz8uc2VjdXJpdHlHcm91cHMgfHwgW107XG4gICAgICBmb3IgKGNvbnN0IHNnIG9mIHNlcnZpY2VTZ3MpIHtcbiAgICAgICAgaWYgKCFzZWN1cml0eUdyb3Vwcy5pbmNsdWRlcyhzZykpIHtcbiAgICAgICAgICBzZWN1cml0eUdyb3Vwcy5wdXNoKHNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AoZGVmYXVsdFBvcnQpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXhlY3V0aW9uIHJvbGUgZm9yIEVDUyBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zLlxuICAgKiBVc2VkIGJ5IHRoZSBFQ1MgYWdlbnQgdG8gcHVsbCBpbWFnZXMsIHdyaXRlIGxvZ3MsIGFuZCBpbmplY3Qgc2VjcmV0cy5cbiAgICogTk9UIHVzZWQgYnkgYXBwbGljYXRpb24gY29kZSAtIHRoYXQncyB0aGUgdGFzayByb2xlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFeGVjdXRpb25Sb2xlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBSb2xlIHtcbiAgICBjb25zdCBleGVjdXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgYCR7c2VydmljZU5hbWV9RXhlY3V0aW9uUm9sZWAsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgIH0pO1xuXG4gICAgLy8gRUNSIHB1bGwgcGVybWlzc2lvbnNcbiAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuXCIsXG4gICAgICAgICAgXCJlY3I6QmF0Y2hDaGVja0xheWVyQXZhaWxhYmlsaXR5XCIsXG4gICAgICAgICAgXCJlY3I6R2V0RG93bmxvYWRVcmxGb3JMYXllclwiLFxuICAgICAgICAgIFwiZWNyOkJhdGNoR2V0SW1hZ2VcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyBwZXJtaXNzaW9ucyAtIHNjb3BlZCB0byBFQ1MgbG9nIGdyb3VwcyBmb3IgdGhpcyBjbHVzdGVyXG4gICAgY29uc3QgbG9nR3JvdXBBcm4gPSBgYXJuOmF3czpsb2dzOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OmxvZy1ncm91cDovZWNzLyR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0qYDtcbiAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ1N0cmVhbVwiLFxuICAgICAgICAgIFwibG9nczpQdXRMb2dFdmVudHNcIixcbiAgICAgICAgICBcImxvZ3M6Q3JlYXRlTG9nR3JvdXBcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtsb2dHcm91cEFybiwgYCR7bG9nR3JvdXBBcm59OipgXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gU2VjcmV0cyBNYW5hZ2VyIGFjY2VzcyBmb3IgaW5qZWN0aW5nIHNlY3JldHMgaW50byBjb250YWluZXJzXG4gICAgLy8gU2NvcGVkIHRvIHNwZWNpZmljIHNlY3JldHMgcmVmZXJlbmNlZCBpbiBzZWNyZXRzSW1wb3J0IGZvciBsZWFzdC1wcml2aWxlZ2UgYWNjZXNzXG4gICAgY29uc3Qgc2VjcmV0TmFtZXMgPSB0aGlzLmNvbGxlY3RTZWNyZXRzTWFuYWdlclNlY3JldE5hbWVzKCk7XG4gICAgaWYgKHNlY3JldE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlY3JldEFybnMgPSBzZWNyZXROYW1lcy5tYXAoXG4gICAgICAgIChzZWNyZXROYW1lKSA9PlxuICAgICAgICAgIGBhcm46YXdzOnNlY3JldHNtYW5hZ2VyOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnNlY3JldDoke3NlY3JldE5hbWV9LSpgXG4gICAgICApO1xuICAgICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiLFxuICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpEZXNjcmliZVNlY3JldFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IHNlY3JldEFybnNcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEtNUyBkZWNyeXB0IGZvciBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0cyBlbmNyeXB0ZWQgd2l0aCBjdXN0b21lci1tYW5hZ2VkIGtleXMuXG4gICAgICAvLyBXaGVuIGltcG9ydGluZyBzZWNyZXRzIGZyb20gb3RoZXIgc3RhY2tzIChlLmcuLCBkYXRhYmFzZSBjcmVkZW50aWFscyksIHRoZSBzZWNyZXRcbiAgICAgIC8vIGlzIGVuY3J5cHRlZCB3aXRoIGEgS01TIGtleSB0aGF0IHdlIGRvbid0IGhhdmUgZGlyZWN0IGFjY2VzcyB0by4gR3JhbnQgZGVjcnlwdFxuICAgICAgLy8gcGVybWlzc2lvbiBzY29wZWQgdG8gdGhlIFNlY3JldHMgTWFuYWdlciBzZXJ2aWNlIGZvciBsZWFzdC1wcml2aWxlZ2UgYWNjZXNzLlxuICAgICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1wia21zOkRlY3J5cHRcIiwgXCJrbXM6RGVzY3JpYmVLZXlcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgICBcImttczpWaWFTZXJ2aWNlXCI6IGBzZWNyZXRzbWFuYWdlci4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNTTSBQYXJhbWV0ZXIgU3RvcmUgYWNjZXNzIGZvciBpbmplY3Rpbmcgc2VjcmV0cyBpbnRvIGNvbnRhaW5lcnNcbiAgICAvLyBTY29wZWQgdG8gYXBwIG5hbWVzcGFjZSBmb3IgbGVhc3QtcHJpdmlsZWdlIGFjY2VzcyAtIHJlcXVpcmVzIGFwcE5hbWUgd2hlbiBzc21TZWNyZXRzIGFyZSB1c2VkXG4gICAgY29uc3QgaGFzU3NtU2VjcmV0cyA9IHRoaXMucHJvcHMuc2VydmljZXMuc29tZSgoc2VydmljZSkgPT5cbiAgICAgIHNlcnZpY2UuY29udGFpbmVycy5zb21lKFxuICAgICAgICAoY29udGFpbmVyKSA9PiBjb250YWluZXIuc3NtU2VjcmV0cyAmJiBjb250YWluZXIuc3NtU2VjcmV0cy5sZW5ndGggPiAwXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoaGFzU3NtU2VjcmV0cykge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmFwcE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFQ1MgY2x1c3RlciAnJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfScgaGFzIHNlcnZpY2VzIHVzaW5nIHNzbVNlY3JldHMgYnV0IGFwcE5hbWUgaXMgbm90IGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICAgICAgYFNldCBhcHBOYW1lIG9uIGNsdXN0ZXIgcHJvcHMgdG8gZW5hYmxlIHNjb3BlZCBJQU0gcGVybWlzc2lvbnMgZm9yIFNTTSBQYXJhbWV0ZXIgU3RvcmUgYWNjZXNzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGV4ZWN1dGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcInNzbTpHZXRQYXJhbWV0ZXJzXCIsIFwic3NtOkdldFBhcmFtZXRlclwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzc206KjoqOnBhcmFtZXRlci8ke3RoaXMucHJvcHMuYXBwTmFtZX0vKmBdXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEtNUyBkZWNyeXB0IGZvciBTU00gU2VjdXJlU3RyaW5nIHBhcmFtZXRlcnMgZW5jcnlwdGVkIHdpdGggQVdTLW1hbmFnZWQga2V5IChhbGlhcy9hd3Mvc3NtKS5cbiAgICAvLyBTY29wZWQgdG8gc3NtIHNlcnZpY2UgdmlhIGNvbmRpdGlvbiBmb3IgbGVhc3QtcHJpdmlsZWdlIGFjY2Vzcy5cbiAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJrbXM6RGVjcnlwdFwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICBcImttczpWaWFTZXJ2aWNlXCI6IGBzc20uJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gZXhlY3V0aW9uUm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSB0YXNrIHJvbGUgZm9yIGFwcGxpY2F0aW9uIGNvZGUgcnVubmluZyBpbiB0aGUgY29udGFpbmVyLlxuICAgKiBUaGlzIHJvbGUgaXMgYXNzdW1lZCBieSB0aGUgYXBwbGljYXRpb24sIG5vdCB0aGUgRUNTIGFnZW50LlxuICAgKiBJbmNsdWRlcyBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zIHBsdXMgYW55IHNlcnZpY2Utc3BlY2lmaWMgcG9saWNpZXMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVRhc2tSb2xlKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHNcbiAgKTogUm9sZSB7XG4gICAgY29uc3QgdGFza1JvbGUgPSBuZXcgUm9sZSh0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrUm9sZWAsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgIH0pO1xuXG4gICAgLy8gRGVmYXVsdDogU1NNIHBlcm1pc3Npb25zIGZvciBFQ1MgRXhlYyAoZWNzIGV4ZWN1dGUtY29tbWFuZClcbiAgICB0YXNrUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwic3NtbWVzc2FnZXM6Q3JlYXRlQ29udHJvbENoYW5uZWxcIixcbiAgICAgICAgICBcInNzbW1lc3NhZ2VzOkNyZWF0ZURhdGFDaGFubmVsXCIsXG4gICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuQ29udHJvbENoYW5uZWxcIixcbiAgICAgICAgICBcInNzbW1lc3NhZ2VzOk9wZW5EYXRhQ2hhbm5lbFwiXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWRkIHNlcnZpY2Utc3BlY2lmaWMgaW5saW5lIHBvbGljaWVzXG4gICAgaWYgKHNlcnZpY2VQcm9wcy50YXNrUm9sZUlubGluZVBvbGljaWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwb2xpY3lOYW1lLCBwb2xpY3lEb2N1bWVudF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIHNlcnZpY2VQcm9wcy50YXNrUm9sZUlubGluZVBvbGljaWVzXG4gICAgICApKSB7XG4gICAgICAgIHRhc2tSb2xlLmF0dGFjaElubGluZVBvbGljeShcbiAgICAgICAgICBuZXcgUG9saWN5KHRoaXMsIGAke3NlcnZpY2VOYW1lfSR7cG9saWN5TmFtZX1gLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogcG9saWN5RG9jdW1lbnRcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBzZXJ2aWNlLXNwZWNpZmljIG1hbmFnZWQgcG9saWNpZXNcbiAgICBpZiAoc2VydmljZVByb3BzLnRhc2tSb2xlTWFuYWdlZFBvbGljaWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBvbGljeSBvZiBzZXJ2aWNlUHJvcHMudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMpIHtcbiAgICAgICAgdGFza1JvbGUuYWRkTWFuYWdlZFBvbGljeShwb2xpY3kpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXNrUm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGFza0RlZmluaXRpb24oXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wcyxcbiAgICBleGVjdXRpb25Sb2xlOiBSb2xlLFxuICAgIHRhc2tSb2xlOiBSb2xlXG4gICk6IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uIHtcbiAgICBjb25zdCBjcHUgPSBzZXJ2aWNlUHJvcHMuY3B1IHx8IDI1NjtcbiAgICBjb25zdCBtZW1vcnlMaW1pdE1pQiA9IHNlcnZpY2VQcm9wcy5tZW1vcnlMaW1pdE1pQiB8fCA1MTI7XG5cbiAgICAvLyBVc2UgcGVyLXNlcnZpY2UgY2FwYWNpdHkgcHJvdmlkZXIgY2hlY2tcbiAgICBpZiAodGhpcy5pc1NlcnZpY2VGYXJnYXRlKHNlcnZpY2VQcm9wcykpIHtcbiAgICAgIHJldHVybiBuZXcgRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHRoaXMsIGAke3NlcnZpY2VOYW1lfVRhc2tEZWZpbml0aW9uYCwge1xuICAgICAgICBmYW1pbHk6IGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LSR7c2VydmljZU5hbWV9YCxcbiAgICAgICAgY3B1LFxuICAgICAgICBtZW1vcnlMaW1pdE1pQixcbiAgICAgICAgZXhlY3V0aW9uUm9sZSxcbiAgICAgICAgdGFza1JvbGUsXG4gICAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICAgIGNwdUFyY2hpdGVjdHVyZTogQ3B1QXJjaGl0ZWN0dXJlLkFSTTY0LFxuICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbUZhbWlseTogT3BlcmF0aW5nU3lzdGVtRmFtaWx5LkxJTlVYXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEVjMlRhc2tEZWZpbml0aW9uKHRoaXMsIGAke3NlcnZpY2VOYW1lfVRhc2tEZWZpbml0aW9uYCwge1xuICAgICAgICBmYW1pbHk6IGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LSR7c2VydmljZU5hbWV9YCxcbiAgICAgICAgZXhlY3V0aW9uUm9sZSxcbiAgICAgICAgdGFza1JvbGUsXG4gICAgICAgIC4uLih0aGlzLmRpcmVjdEFjY2Vzc0VuYWJsZWQgJiYgeyBuZXR3b3JrTW9kZTogTmV0d29ya01vZGUuSE9TVCB9KVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb250YWluZXJzVG9UYXNrKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uXG4gICk6IHtcbiAgICBjb250YWluZXJzOiBDb250YWluZXJEZWZpbml0aW9uW107XG4gICAgcHJpbWFyeUNvbnRhaW5lcj86IENvbnRhaW5lckRlZmluaXRpb247XG4gIH0ge1xuICAgIGNvbnN0IGNvbnRhaW5lcnM6IENvbnRhaW5lckRlZmluaXRpb25bXSA9IFtdO1xuICAgIGxldCBwcmltYXJ5Q29udGFpbmVyOiBDb250YWluZXJEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBjb250YWluZXJDb25maWcgb2Ygc2VydmljZVByb3BzLmNvbnRhaW5lcnMpIHtcbiAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5nZXRDb250YWluZXJJbWFnZShcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIGNvbnRhaW5lckNvbmZpZyxcbiAgICAgICAgc2VydmljZVByb3BzXG4gICAgICApO1xuICAgICAgY29uc3QgaXNGaXJzdFdpdGhQb3J0ID1cbiAgICAgICAgIXByaW1hcnlDb250YWluZXIgJiYgY29udGFpbmVyQ29uZmlnLnBvcnQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQnVpbGQgc2VjcmV0cyBmcm9tIFNlY3JldHMgTWFuYWdlclxuICAgICAgLy8gQ29uc3RydWN0IElEcyB1c2UgZG91YmxlLXVuZGVyc2NvcmUgZGVsaW1pdGVyIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aGVuIG5hbWVzIGNvbnRhaW4gaHlwaGVuc1xuICAgICAgY29uc3Qgc2VjcmV0czogUmVjb3JkPHN0cmluZywgRWNzU2VjcmV0PiA9IHt9O1xuICAgICAgaWYgKGNvbnRhaW5lckNvbmZpZy5zZWNyZXRzSW1wb3J0KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgc2VjcmV0SW1wb3J0XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICBjb250YWluZXJDb25maWcuc2VjcmV0c0ltcG9ydFxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3Qgc2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9JHtrZXl9U2VjcmV0YCxcbiAgICAgICAgICAgIHNlY3JldEltcG9ydC5uYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZWNyZXRzW2tleV0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICAgICAgc2VjcmV0LFxuICAgICAgICAgICAgc2VjcmV0SW1wb3J0LmZpZWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCBzZWNyZXRzIGZyb20gU1NNIFBhcmFtZXRlciBTdG9yZVxuICAgICAgaWYgKGNvbnRhaW5lckNvbmZpZy5zc21TZWNyZXRzICYmIGNvbnRhaW5lckNvbmZpZy5zc21TZWNyZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBrZXlzIGJldHdlZW4gc2VjcmV0c0ltcG9ydCBhbmQgc3NtU2VjcmV0c1xuICAgICAgICBpZiAoY29udGFpbmVyQ29uZmlnLnNlY3JldHNJbXBvcnQpIHtcbiAgICAgICAgICBjb25zdCBzZWNyZXRzSW1wb3J0S2V5cyA9IE9iamVjdC5rZXlzKGNvbnRhaW5lckNvbmZpZy5zZWNyZXRzSW1wb3J0KTtcbiAgICAgICAgICBjb25zdCBkdXBsaWNhdGVLZXlzID0gY29udGFpbmVyQ29uZmlnLnNzbVNlY3JldHMuZmlsdGVyKChrZXkpID0+XG4gICAgICAgICAgICBzZWNyZXRzSW1wb3J0S2V5cy5pbmNsdWRlcyhrZXkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZHVwbGljYXRlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBDb250YWluZXIgJyR7Y29udGFpbmVyQ29uZmlnLm5hbWV9JyBpbiBzZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgaGFzIGR1cGxpY2F0ZSBzZWNyZXQga2V5cyBgICtcbiAgICAgICAgICAgICAgICBgZGVmaW5lZCBpbiBib3RoIHNlY3JldHNJbXBvcnQgYW5kIHNzbVNlY3JldHM6ICR7ZHVwbGljYXRlS2V5cy5qb2luKFwiLCBcIil9LiBgICtcbiAgICAgICAgICAgICAgICBgRWFjaCBzZWNyZXQga2V5IG11c3QgYmUgdW5pcXVlIGFjcm9zcyBib3RoIHNvdXJjZXMuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXJpdmUgc3NtU2VjcmV0c1BhdGggaWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICAgICAgY29uc3Qgc3NtU2VjcmV0c1BhdGggPSB0aGlzLmRlcml2ZVNzbVNlY3JldHNQYXRoKFxuICAgICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICAgIHNlcnZpY2VQcm9wcy5zc21TZWNyZXRzUGF0aFxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBjb250YWluZXJDb25maWcuc3NtU2VjcmV0cykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtUGF0aCA9IGAke3NzbVNlY3JldHNQYXRofS8ke3NlY3JldE5hbWV9YDtcbiAgICAgICAgICBjb25zdCBwYXJhbSA9IFN0cmluZ1BhcmFtZXRlci5mcm9tU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9JHtjb250YWluZXJDb25maWcubmFtZX0ke3NlY3JldE5hbWV9U3NtUGFyYW1gLFxuICAgICAgICAgICAgeyBwYXJhbWV0ZXJOYW1lOiBwYXJhbVBhdGggfVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2VjcmV0c1tzZWNyZXROYW1lXSA9IEVjc1NlY3JldC5mcm9tU3NtUGFyYW1ldGVyKHBhcmFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IGNvbnRhaW5lckNvbmZpZy5uYW1lLFxuICAgICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgICAgc3RyZWFtUHJlZml4OiBgL2Vjcy8ke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LyR7c2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogY29udGFpbmVyQ29uZmlnLmVudmlyb25tZW50LFxuICAgICAgICAgIHNlY3JldHMsXG4gICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmNvbW1hbmQsXG4gICAgICAgICAgZW50cnlQb2ludDogY29udGFpbmVyQ29uZmlnLmVudHJ5UG9pbnQsXG4gICAgICAgICAgZXNzZW50aWFsOiBjb250YWluZXJDb25maWcuZXNzZW50aWFsID8/IHRydWUsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVja1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWw6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbClcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay50aW1lb3V0XG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZXRyaWVzOiBjb250YWluZXJDb25maWcuaGVhbHRoQ2hlY2sucmV0cmllcyxcbiAgICAgICAgICAgICAgICBzdGFydFBlcmlvZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kXG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uKHRoaXMuaXNTZXJ2aWNlRWMyKHNlcnZpY2VQcm9wcykgJiYge1xuICAgICAgICAgICAgbWVtb3J5TGltaXRNaUI6IHNlcnZpY2VQcm9wcy5lYzJDb25maWc/Lm1lbW9yeUxpbWl0TWlCID8/IDEwMjRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAoY29udGFpbmVyQ29uZmlnLnBvcnQpIHtcbiAgICAgICAgY29udGFpbmVyLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgICAgICAgY29udGFpbmVyUG9ydDogY29udGFpbmVyQ29uZmlnLnBvcnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ZpcnN0V2l0aFBvcnQpIHtcbiAgICAgICAgcHJpbWFyeUNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGFpbmVycywgcHJpbWFyeUNvbnRhaW5lciB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250YWluZXJJbWFnZShcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIGNvbnRhaW5lckNvbmZpZzogRWNzQ2x1c3RlckNvbnRhaW5lckNvbmZpZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBDb250YWluZXJJbWFnZSB7XG4gICAgLy8gUHJpb3JpdHk6IGNvbnRhaW5lci5pbWFnZSA+IHNlcnZpY2UuaW1hZ2UgPiBjbHVzdGVyIGRlZmF1bHRcbiAgICBjb25zdCBpbWFnZVNvdXJjZSA9XG4gICAgICBjb250YWluZXJDb25maWcuaW1hZ2UgfHwgc2VydmljZVByb3BzLmltYWdlIHx8IHRoaXMucHJvcHMuZWNyUmVwb3NpdG9yeTtcblxuICAgIGlmICghaW1hZ2VTb3VyY2UpIHtcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIik7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSBkb2NrZXJUYXJnZXQgaW4gdGFnIG5hbWUgaWYgc3BlY2lmaWVkIChlLmcuLCBcInNlcnZpY2UtYXBpLWxhdGVzdFwiKVxuICAgIC8vIFRoaXMgZW5zdXJlcyBzZXJ2aWNlcyB1c2luZyBkaWZmZXJlbnQgdGFyZ2V0cyBmcm9tIHRoZSBzYW1lIERvY2tlcmZpbGUgZ2V0IGRpZmZlcmVudCBpbWFnZXNcbiAgICBjb25zdCB0YXJnZXRTdWZmaXggPSBzZXJ2aWNlUHJvcHMuZG9ja2VyVGFyZ2V0XG4gICAgICA/IGAtJHtzZXJ2aWNlUHJvcHMuZG9ja2VyVGFyZ2V0fWBcbiAgICAgIDogXCJcIjtcbiAgICBjb25zdCBpbWFnZVRhZyA9IGAke3NlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCl9JHt0YXJnZXRTdWZmaXh9LWxhdGVzdGA7XG5cbiAgICBpZiAodHlwZW9mIGltYWdlU291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgcmVnaXN0cnkgaW1hZ2UgKHB1YmxpYyBEb2NrZXIgSHViIG9yIHB1YmxpYyBFQ1IpIHZzIHByaXZhdGUgRUNSIHJlcG9zaXRvcnkgbmFtZVxuICAgICAgY29uc3QgaXNQdWJsaWNJbWFnZSA9XG4gICAgICAgIChpbWFnZVNvdXJjZS5pbmNsdWRlcyhcIi9cIikgJiYgIWltYWdlU291cmNlLmluY2x1ZGVzKFwiLlwiKSkgfHwgLy8gRG9ja2VyIEh1YjogYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXG4gICAgICAgIGltYWdlU291cmNlLnN0YXJ0c1dpdGgoXCJwdWJsaWMuZWNyLmF3cy9cIik7IC8vIFB1YmxpYyBFQ1I6IHB1YmxpYy5lY3IuYXdzL2ZqYWxsL3dlbGNvbWVcblxuICAgICAgaWYgKGlzUHVibGljSW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShpbWFnZVNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoXG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7c2VydmljZU5hbWV9JHtjb250YWluZXJDb25maWcubmFtZX1FY3JSZXBvYCxcbiAgICAgICAgICBpbWFnZVNvdXJjZVxuICAgICAgICApLFxuICAgICAgICBpbWFnZVRhZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2VTb3VyY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoaW1hZ2VTb3VyY2UsIGltYWdlVGFnKTtcbiAgICB9XG5cbiAgICAvLyBSZXBvc2l0b3J5SW1hZ2UgZXh0ZW5kcyBDb250YWluZXJJbWFnZSwgc28gdGhpcyBpcyBhIHNhZmUgdXBjYXN0XG4gICAgcmV0dXJuIGltYWdlU291cmNlIGFzIENvbnRhaW5lckltYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTZXJ2aWNlKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uXG4gICk6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZSB7XG4gICAgY29uc3QgZGVzaXJlZENvdW50ID0gc2VydmljZVByb3BzLmRlc2lyZWRDb3VudCA/PyAyO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVByb3ZpZGVyID0gdGhpcy5nZXRTZXJ2aWNlQ2FwYWNpdHlQcm92aWRlcihzZXJ2aWNlUHJvcHMpO1xuXG4gICAgLy8gVXNlIHBlci1zZXJ2aWNlIGNhcGFjaXR5IHByb3ZpZGVyIGNoZWNrXG4gICAgaWYgKHRoaXMuaXNTZXJ2aWNlRmFyZ2F0ZShzZXJ2aWNlUHJvcHMpKSB7XG4gICAgICBjb25zdCBoYXNOYXQgPSB0aGlzLnZwY0hhc05hdEdhdGV3YXlzKCk7XG4gICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IEZhcmdhdGVTZXJ2aWNlKHRoaXMsIGAke3NlcnZpY2VOYW1lfVNlcnZpY2VgLCB7XG4gICAgICAgIGNsdXN0ZXI6IHRoaXMuY2x1c3RlcixcbiAgICAgICAgdGFza0RlZmluaXRpb246IHRhc2tEZWZpbml0aW9uIGFzIEZhcmdhdGVUYXNrRGVmaW5pdGlvbixcbiAgICAgICAgZGVzaXJlZENvdW50LFxuICAgICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgIHN1Ym5ldFR5cGU6IGhhc05hdFxuICAgICAgICAgICAgPyBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICAgICAgICAgIDogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgfSxcbiAgICAgICAgYXNzaWduUHVibGljSXA6ICFoYXNOYXQsXG4gICAgICAgIGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVnaWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogZWZmZWN0aXZlUHJvdmlkZXIsXG4gICAgICAgICAgICB3ZWlnaHQ6IDFcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHByb3BhZ2F0ZVRhZ3M6IFByb3BhZ2F0ZWRUYWdTb3VyY2UuU0VSVklDRSxcbiAgICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgZW5hYmxlOiB0cnVlLCByb2xsYmFjazogdHJ1ZSB9LFxuICAgICAgICBlbmFibGVFQ1NNYW5hZ2VkVGFnczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDEwMCxcbiAgICAgICAgbWF4SGVhbHRoeVBlcmNlbnQ6IDIwMFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLCB7XG4gICAgICAgIGtleTogYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLFxuICAgICAgICBleHBvcnROYW1lOiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsXG4gICAgICAgIHZhbHVlOiBzZXJ2aWNlLnNlcnZpY2VBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRUNTIFNlcnZpY2UgQVJOIGZvciAke3NlcnZpY2VOYW1lfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdldCBvciBjcmVhdGUgQVNHIGNhcGFjaXR5IHByb3ZpZGVyIGZvciB0aGlzIHNlcnZpY2UncyBFQzIgY29uZmlnXG4gICAgICBjb25zdCBhc2dQcm92aWRlciA9IHRoaXMuZ2V0T3JDcmVhdGVBc2dDYXBhY2l0eVByb3ZpZGVyKHNlcnZpY2VQcm9wcyk7XG5cbiAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgRWMyU2VydmljZSh0aGlzLCBgJHtzZXJ2aWNlTmFtZX1TZXJ2aWNlYCwge1xuICAgICAgICBjbHVzdGVyOiB0aGlzLmNsdXN0ZXIsXG4gICAgICAgIHRhc2tEZWZpbml0aW9uOiB0YXNrRGVmaW5pdGlvbiBhcyBFYzJUYXNrRGVmaW5pdGlvbixcbiAgICAgICAgZGVzaXJlZENvdW50LFxuICAgICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgICAgY2FwYWNpdHlQcm92aWRlclN0cmF0ZWdpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiBhc2dQcm92aWRlci5jYXBhY2l0eVByb3ZpZGVyTmFtZSxcbiAgICAgICAgICAgIHdlaWdodDogMVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgcHJvcGFnYXRlVGFnczogUHJvcGFnYXRlZFRhZ1NvdXJjZS5TRVJWSUNFLFxuICAgICAgICBjaXJjdWl0QnJlYWtlcjogeyBlbmFibGU6IHRydWUsIHJvbGxiYWNrOiB0cnVlIH0sXG4gICAgICAgIHBsYWNlbWVudFN0cmF0ZWdpZXM6IFtQbGFjZW1lbnRTdHJhdGVneS5zcHJlYWRBY3Jvc3NJbnN0YW5jZXMoKV0sXG4gICAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiB0cnVlLFxuICAgICAgICBlbmFibGVFeGVjdXRlQ29tbWFuZDogdHJ1ZSxcbiAgICAgICAgaGVhbHRoQ2hlY2tHcmFjZVBlcmlvZDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtaW5IZWFsdGh5UGVyY2VudDogMTAwLFxuICAgICAgICBtYXhIZWFsdGh5UGVyY2VudDogMjAwXG4gICAgICB9KTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsIHtcbiAgICAgICAga2V5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsXG4gICAgICAgIGV4cG9ydE5hbWU6IGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1TZXJ2aWNlQXJuYCxcbiAgICAgICAgdmFsdWU6IHNlcnZpY2Uuc2VydmljZUFybixcbiAgICAgICAgZGVzY3JpcHRpb246IGBFQ1MgU2VydmljZSBBUk4gZm9yICR7c2VydmljZU5hbWV9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyU2VydmljZVdpdGhBTEIoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wcyxcbiAgICBzZXJ2aWNlOiBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2UsXG4gICAgcHJpbWFyeUNvbnRhaW5lcjogQ29udGFpbmVyRGVmaW5pdGlvblxuICApOiBJQXBwbGljYXRpb25UYXJnZXRHcm91cCB7XG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9IHByaW1hcnlDb250YWluZXIuY29udGFpbmVyUG9ydDtcbiAgICBjb25zdCBoZWFsdGhDaGVja1BhdGggPSBzZXJ2aWNlUHJvcHMucm91dGluZz8uaGVhbHRoQ2hlY2tQYXRoIHx8IFwiL1wiO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHJvdXRpbmcgY29uZGl0aW9uc1xuICAgIGNvbnN0IHNlcnZpY2VzV2l0aFBvcnRzID0gdGhpcy5wcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgICBzLmNvbnRhaW5lcnMuc29tZSgoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgICBjb25zdCBpc1NpbmdsZVNlcnZpY2UgPSBzZXJ2aWNlc1dpdGhQb3J0cy5sZW5ndGggPT09IDE7XG5cbiAgICAvLyBVc2UgcGVyLXNlcnZpY2UgY2FwYWNpdHkgcHJvdmlkZXIgY2hlY2sgZm9yIGhlYWx0aCBjaGVjayBjb25maWdcbiAgICBjb25zdCBoZWFsdGhDaGVja0NvbmZpZyA9IHRoaXMuaXNTZXJ2aWNlRWMyKHNlcnZpY2VQcm9wcylcbiAgICAgID8ge1xuICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgICAgICBoZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgICAgcGF0aDogaGVhbHRoQ2hlY2tQYXRoLFxuICAgICAgICAgIHBvcnQ6IFwidHJhZmZpYy1wb3J0XCIgYXMgY29uc3QsXG4gICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxNSlcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgaW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgICAgICBwYXRoOiBoZWFsdGhDaGVja1BhdGgsXG4gICAgICAgICAgcG9ydDogYCR7Y29udGFpbmVyUG9ydH1gLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApXG4gICAgICAgIH07XG5cbiAgICBpZiAoaXNTaW5nbGVTZXJ2aWNlKSB7XG4gICAgICAvLyBTaW5nbGUgc2VydmljZSAtIGNyZWF0ZSB0YXJnZXQgZ3JvdXAgd2l0aCBzZXJ2aWNlIGFzIGRlZmF1bHQgdGFyZ2V0XG4gICAgICByZXR1cm4gdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciEuYWRkVGFyZ2V0cyhcbiAgICAgICAgYCR7c2VydmljZU5hbWV9VGFyZ2V0R3JvdXBgLFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0czogW1xuICAgICAgICAgICAgc2VydmljZS5sb2FkQmFsYW5jZXJUYXJnZXQoe1xuICAgICAgICAgICAgICBjb250YWluZXJOYW1lOiBwcmltYXJ5Q29udGFpbmVyLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcnRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwb3J0OiBjb250YWluZXJQb3J0LFxuICAgICAgICAgIHByb3RvY29sOiBBcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGhlYWx0aENoZWNrQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpLXNlcnZpY2UgLSBjcmVhdGUgdGFyZ2V0IGdyb3VwIHdpdGggcm91dGluZyBydWxlc1xuICAgICAgY29uc3QgcHJpb3JpdHkgPSBzZXJ2aWNlUHJvcHMucm91dGluZz8ucHJpb3JpdHkgfHwgdGhpcy5uZXh0UHJpb3JpdHkrKztcblxuICAgICAgY29uc3QgdGFyZ2V0R3JvdXAgPSB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyIS5hZGRUYXJnZXRzKFxuICAgICAgICBgJHtzZXJ2aWNlTmFtZX1UYXJnZXRzYCxcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICAgIHNlcnZpY2UubG9hZEJhbGFuY2VyVGFyZ2V0KHtcbiAgICAgICAgICAgICAgY29udGFpbmVyTmFtZTogcHJpbWFyeUNvbnRhaW5lci5jb250YWluZXJOYW1lLFxuICAgICAgICAgICAgICBjb250YWluZXJQb3J0XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcG9ydDogY29udGFpbmVyUG9ydCxcbiAgICAgICAgICBwcm90b2NvbDogQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICAgIGhlYWx0aENoZWNrOiBoZWFsdGhDaGVja0NvbmZpZyxcbiAgICAgICAgICBjb25kaXRpb25zOiB0aGlzLmJ1aWxkUm91dGluZ0NvbmRpdGlvbnMoc2VydmljZVByb3BzKSxcbiAgICAgICAgICBwcmlvcml0eVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGFyZ2V0R3JvdXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJvdXRpbmdDb25kaXRpb25zKFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzXG4gICk6IExpc3RlbmVyQ29uZGl0aW9uW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnM6IExpc3RlbmVyQ29uZGl0aW9uW10gPSBbXTtcblxuICAgIGlmIChzZXJ2aWNlUHJvcHMucm91dGluZz8ucGF0aCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBMaXN0ZW5lckNvbmRpdGlvbi5wYXRoUGF0dGVybnMoW3NlcnZpY2VQcm9wcy5yb3V0aW5nLnBhdGhdKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNlcnZpY2VQcm9wcy5yb3V0aW5nPy5ob3N0KSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIExpc3RlbmVyQ29uZGl0aW9uLmhvc3RIZWFkZXJzKFtzZXJ2aWNlUHJvcHMucm91dGluZy5ob3N0XSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGFkZFNlcnZpY2VTY2FsaW5nKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgc2VydmljZTogRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlXG4gICk6IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeSB7XG4gICAgY29uc3Qgc2NhbGFibGVUYXJnZXQgPSBuZXcgU2NhbGFibGVUYXJnZXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7c2VydmljZU5hbWV9U2NhbGFibGVUYXJnZXRgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBTZXJ2aWNlTmFtZXNwYWNlLkVDUyxcbiAgICAgICAgcmVzb3VyY2VJZDogYHNlcnZpY2UvJHt0aGlzLmNsdXN0ZXIuY2x1c3Rlck5hbWV9LyR7c2VydmljZS5zZXJ2aWNlTmFtZX1gLFxuICAgICAgICBzY2FsYWJsZURpbWVuc2lvbjogXCJlY3M6c2VydmljZTpEZXNpcmVkQ291bnRcIixcbiAgICAgICAgbWluQ2FwYWNpdHk6IHNlcnZpY2VQcm9wcy5taW5DYXBhY2l0eSA/PyAyLFxuICAgICAgICBtYXhDYXBhY2l0eTogc2VydmljZVByb3BzLm1heENhcGFjaXR5ID8/IDEwXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3NlcnZpY2VOYW1lfVNjYWxpbmdQb2xpY3lgLFxuICAgICAge1xuICAgICAgICBzY2FsaW5nVGFyZ2V0OiBzY2FsYWJsZVRhcmdldCxcbiAgICAgICAgcHJlZGVmaW5lZE1ldHJpYzpcbiAgICAgICAgICBzZXJ2aWNlUHJvcHMuc2NhbGluZ1R5cGUgPT09IFNjYWxpbmdUeXBlLk1FTU9SWVxuICAgICAgICAgICAgPyBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfTUVNT1JZX1VUSUxJWkFUSU9OXG4gICAgICAgICAgICA6IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9DUFVfVVRJTElaQVRJT04sXG4gICAgICAgIHRhcmdldFZhbHVlOiA1MCxcbiAgICAgICAgc2NhbGVJbkNvb2xkb3duOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgICAgc2NhbGVPdXRDb29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MClcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgc2VydmljZSBpbiB0aGUgY2x1c3RlciB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlci5cbiAgICovXG4gIHByaXZhdGUgaGFzQW55RWMyU2VydmljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zZXJ2aWNlcy5zb21lKChzKSA9PiBzLmNhcGFjaXR5UHJvdmlkZXIgPT09IFwiRUMyXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgc2VydmljZSBpbiB0aGUgY2x1c3RlciB1c2VzIEZhcmdhdGUgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGhhc0FueUZhcmdhdGVTZXJ2aWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnNlcnZpY2VzLnNvbWUoXG4gICAgICAocykgPT5cbiAgICAgICAgcy5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkZBUkdBVEVcIiB8fFxuICAgICAgICBzLmNhcGFjaXR5UHJvdmlkZXIgPT09IFwiRkFSR0FURV9TUE9UXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBWUEMgaGFzIE5BVCBnYXRld2F5cy5cbiAgICogLSBGb3IgRmphbGwgVnBjOiB1c2VzIGhhc05hdEdhdGV3YXlzIHByb3BlcnR5XG4gICAqIC0gRm9yIG90aGVyIFZQQ3M6IGNoZWNrcyBpZiBwcml2YXRlIHN1Ym5ldHMgZXhpc3QgKGFzc3VtZXMgTkFUIGlmIHByZXNlbnQpXG4gICAqL1xuICBwcml2YXRlIHZwY0hhc05hdEdhdGV3YXlzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZwYyA9IHRoaXMuY2x1c3Rlci52cGM7XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBvdXIgY3VzdG9tIFZwYyBjbGFzcyB3aXRoIGhhc05hdEdhdGV3YXlzIHByb3BlcnR5XG4gICAgaWYgKFwiaGFzTmF0R2F0ZXdheXNcIiBpbiB2cGMgJiYgdHlwZW9mIHZwYy5oYXNOYXRHYXRld2F5cyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB2cGMuaGFzTmF0R2F0ZXdheXM7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrOiBhc3N1bWUgTkFUIGlmIHByaXZhdGUgc3VibmV0cyBleGlzdFxuICAgIHJldHVybiB2cGMucHJpdmF0ZVN1Ym5ldHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgRGVwbG95YWJsZVNlcnZpY2Ugb3V0cHV0cyBmb3IgZGVwbG95bWVudCBhdXRvbWF0aW9uLlxuICAgKiBFYWNoIHNlcnZpY2UgZ2V0cyBhIERlcGxveWFibGVTZXJ2aWNlIG91dHB1dCBzbyB0aGUgZGVwbG95bWVudCBzZXJ2aWNlXG4gICAqIGNhbiBmaW5kIGFuZCBkZXBsb3kgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyLlxuICAgKi9cbiAgYWRkRGVwbG95YWJsZVNlcnZpY2VPdXRwdXRzKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBmb3IgKGNvbnN0IFtzZXJ2aWNlTmFtZSwgc2VydmljZURhdGFdIG9mIHRoaXMuc2VydmljZXMpIHtcbiAgICAgIG5ldyBDZm5PdXRwdXQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9RGVwbG95YWJsZVNlcnZpY2VgLFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfURlcGxveWFibGVTZXJ2aWNlYCxcbiAgICAgICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfURlcGxveWFibGVTZXJ2aWNlYCxcbiAgICAgICAgICB2YWx1ZTogc2VydmljZURhdGEuc2VydmljZS5zZXJ2aWNlQXJuLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRGVwbG95YWJsZSBFQ1MgU2VydmljZSBBUk4gZm9yICR7c2VydmljZU5hbWV9IGluICR7cHJvcHMuY2x1c3Rlck5hbWV9YFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYXBhY2l0eSBwcm92aWRlciBmb3IgYSBzZXJ2aWNlLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2VydmljZUNhcGFjaXR5UHJvdmlkZXIoXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHNcbiAgKTogRWNzQ2FwYWNpdHlQcm92aWRlciB7XG4gICAgcmV0dXJuIHNlcnZpY2VQcm9wcy5jYXBhY2l0eVByb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHNlcnZpY2UgdXNlcyBhIEZhcmdhdGUgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGlzU2VydmljZUZhcmdhdGUoc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0U2VydmljZUNhcGFjaXR5UHJvdmlkZXIoc2VydmljZVByb3BzKTtcbiAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwiRkFSR0FURVwiIHx8IHByb3ZpZGVyID09PSBcIkZBUkdBVEVfU1BPVFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHNlcnZpY2UgdXNlcyBhbiBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGlzU2VydmljZUVjMihzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFNlcnZpY2VDYXBhY2l0eVByb3ZpZGVyKHNlcnZpY2VQcm9wcykgPT09IFwiRUMyXCI7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuIFNTTSBwYXRoIGNvbXBvbmVudCBmb3IgY29ycmVjdG5lc3MuXG4gICAqIFNTTSBwYXJhbWV0ZXIgcGF0aHMgaGF2ZSBzcGVjaWZpYyBjb25zdHJhaW50cyB0aGF0IG11c3QgYmUgZW5mb3JjZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgcGF0aCBjb21wb25lbnQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGZvciBlcnJvciBtZXNzYWdlc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjb21wb25lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNzbVBhdGhDb21wb25lbnQoY29tcG9uZW50OiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb21wb25lbnQgfHwgY29tcG9uZW50LnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkTmFtZX0gY2Fubm90IGJlIGVtcHR5IGZvciBTU00gcGF0aCBkZXJpdmF0aW9uYCk7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnQuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke2ZpZWxkTmFtZX0gY2Fubm90IGNvbnRhaW4gZm9yd2FyZCBzbGFzaGVzICgvKS4gSW52YWxpZCB2YWx1ZTogXCIke2NvbXBvbmVudH1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBTU00gcGFyYW1ldGVyIG5hbWUgaGllcmFyY2h5IGxhYmVscyBoYXZlIGEgbWF4IGxlbmd0aCBvZiAyMDQ4LCBidXQgd2UgdXNlIGEgbW9yZVxuICAgIC8vIHJlYXNvbmFibGUgbGltaXQgc2luY2UgZWFjaCBjb21wb25lbnQgaXMganVzdCBvbmUgcGFydCBvZiB0aGUgcGF0aFxuICAgIGlmIChjb21wb25lbnQubGVuZ3RoID4gMTI4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGROYW1lfSBleGNlZWRzIG1heGltdW0gbGVuZ3RoICgxMjggY2hhcmFjdGVycykuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgdGhlIFNTTSBzZWNyZXRzIHBhdGggZm9yIGEgc2VydmljZS5cbiAgICogVXNlcyBleHBsaWNpdCBwYXRoIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZGVyaXZlcyBmcm9tIGFwcC9jbHVzdGVyL3NlcnZpY2UgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIFRoZSBzZXJ2aWNlIG5hbWVcbiAgICogQHBhcmFtIGV4cGxpY2l0UGF0aCAtIE9wdGlvbmFsIGV4cGxpY2l0IHBhdGggb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIFNTTSBzZWNyZXRzIHBhdGggKGUuZy4sIC9teWFwcC9BcGlDbHVzdGVyL3VzZXJzKVxuICAgKi9cbiAgLyoqXG4gICAqIENvbGxlY3RzIGFsbCBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IG5hbWVzIGZyb20gc2VjcmV0c0ltcG9ydCBhY3Jvc3MgYWxsIHNlcnZpY2VzLlxuICAgKiBVc2VkIHRvIHNjb3BlIElBTSBwZXJtaXNzaW9ucyBmb3IgbGVhc3QtcHJpdmlsZWdlIGFjY2Vzcy5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdFNlY3JldHNNYW5hZ2VyU2VjcmV0TmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlY3JldE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHRoaXMucHJvcHMuc2VydmljZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNlcnZpY2UuY29udGFpbmVycykge1xuICAgICAgICBpZiAoY29udGFpbmVyLnNlY3JldHNJbXBvcnQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNlY3JldEltcG9ydCBvZiBPYmplY3QudmFsdWVzKGNvbnRhaW5lci5zZWNyZXRzSW1wb3J0KSkge1xuICAgICAgICAgICAgc2VjcmV0TmFtZXMuYWRkKHNlY3JldEltcG9ydC5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2VjcmV0TmFtZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJpdmVTc21TZWNyZXRzUGF0aChcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIGV4cGxpY2l0UGF0aD86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIC8vIFVzZSBleHBsaWNpdCBwYXRoIGlmIHByb3ZpZGVkXG4gICAgaWYgKGV4cGxpY2l0UGF0aCkge1xuICAgICAgcmV0dXJuIGV4cGxpY2l0UGF0aDtcbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgcGF0aCBmcm9tIGFwcC9jbHVzdGVyL3NlcnZpY2UgbmFtZXNcbiAgICBjb25zdCBhcHBOYW1lID0gdGhpcy5wcm9wcy5hcHBOYW1lO1xuICAgIGlmICghYXBwTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlTmFtZX0nIGhhcyBzc21TZWNyZXRzIGRlZmluZWQgYnV0IG5vIHNzbVNlY3JldHNQYXRoIGlzIHNldCBgICtcbiAgICAgICAgICBgYW5kIGFwcE5hbWUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhlIGNsdXN0ZXIuIGAgK1xuICAgICAgICAgIGBFaXRoZXIgc2V0IHNzbVNlY3JldHNQYXRoIG9uIHRoZSBzZXJ2aWNlLCBvciBzZXQgYXBwTmFtZSBvbiB0aGUgY2x1c3RlciBwcm9wcyBgICtcbiAgICAgICAgICBgdG8gZW5hYmxlIGF1dG9tYXRpYyBwYXRoIGRlcml2YXRpb24gKC88YXBwTmFtZT4vPGNsdXN0ZXJOYW1lPi88c2VydmljZU5hbWU+KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBhdGggY29tcG9uZW50cyB0byBwcmV2ZW50IGludmFsaWQgU1NNIHBhdGhzXG4gICAgdGhpcy52YWxpZGF0ZVNzbVBhdGhDb21wb25lbnQoYXBwTmFtZSwgXCJhcHBOYW1lXCIpO1xuICAgIHRoaXMudmFsaWRhdGVTc21QYXRoQ29tcG9uZW50KHRoaXMucHJvcHMuY2x1c3Rlck5hbWUsIFwiY2x1c3Rlck5hbWVcIik7XG4gICAgdGhpcy52YWxpZGF0ZVNzbVBhdGhDb21wb25lbnQoc2VydmljZU5hbWUsIFwic2VydmljZU5hbWVcIik7XG5cbiAgICByZXR1cm4gYC8ke2FwcE5hbWV9LyR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0vJHtzZXJ2aWNlTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBrZXkgZm9yIEVDMiBjb25maWcgKGZvciBBU0cgZGVkdXBsaWNhdGlvbikuXG4gICAqIFNlcnZpY2VzIHdpdGggbWF0Y2hpbmcga2V5cyBzaGFyZSBhbiBBU0cuXG4gICAqL1xuICBwcml2YXRlIGdldEVjMkNvbmZpZ0tleShlYzJDb25maWc6IEVjMkNhcGFjaXR5Q29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSBlYzJDb25maWcuaW5zdGFuY2VUeXBlID8/IFwidDMubWljcm9cIjtcbiAgICBjb25zdCBhbWlIYXJkd2FyZVR5cGUgPSBlYzJDb25maWcuYW1pSGFyZHdhcmVUeXBlID8/IFwiU1RBTkRBUkRcIjtcbiAgICByZXR1cm4gYCR7aW5zdGFuY2VUeXBlfS0ke2FtaUhhcmR3YXJlVHlwZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgY3JlYXRlcyBhbiBBU0cgY2FwYWNpdHkgcHJvdmlkZXIgZm9yIGEgc2VydmljZS5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBFQzIgY29uZmlncyBzaGFyZSB0aGUgc2FtZSBBU0cuXG4gICAqL1xuICBwcml2YXRlIGdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlcihcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBBc2dDYXBhY2l0eVByb3ZpZGVyIHtcbiAgICAvLyBHZXQgRUMyIGNvbmZpZyBmcm9tIHNlcnZpY2UgKHJlcXVpcmVkIGZvciBFQzIgY2FwYWNpdHkgcHJvdmlkZXIpXG4gICAgY29uc3QgZWMyQ29uZmlnID0gc2VydmljZVByb3BzLmVjMkNvbmZpZyA/PyB7fTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEVjMkNvbmZpZ0tleShlYzJDb25maWcpO1xuXG4gICAgLy8gUmV0dXJuIGV4aXN0aW5nIGlmIGZvdW5kXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmFzZ0NhcGFjaXR5UHJvdmlkZXJzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXcgQVNHIGFuZCBjYXBhY2l0eSBwcm92aWRlclxuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IGVjMkNvbmZpZy5pbnN0YW5jZVR5cGUgPz8gXCJ0My5taWNyb1wiO1xuICAgIGNvbnN0IGFtaUhhcmR3YXJlVHlwZSA9IGVjMkNvbmZpZy5hbWlIYXJkd2FyZVR5cGVcbiAgICAgID8gZWMyQ29uZmlnLmFtaUhhcmR3YXJlVHlwZSA9PT0gXCJTVEFOREFSRFwiXG4gICAgICAgID8gQW1pSGFyZHdhcmVUeXBlLlNUQU5EQVJEXG4gICAgICAgIDogQW1pSGFyZHdhcmVUeXBlLkFSTVxuICAgICAgOiBpbmZlckFtaUhhcmR3YXJlVHlwZShpbnN0YW5jZVR5cGUpO1xuICAgIGNvbnN0IG1pbkNhcGFjaXR5ID0gZWMyQ29uZmlnLm1pbkNhcGFjaXR5ID8/IDI7XG4gICAgY29uc3QgbWF4Q2FwYWNpdHkgPSBlYzJDb25maWcubWF4Q2FwYWNpdHkgPz8gMztcblxuICAgIC8vIENyZWF0ZSBzZWN1cml0eSBncm91cCBmb3IgdGhpcyBBU0dcbiAgICBjb25zdCBhc2dTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX1Bc2dTZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciAke2tleX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBPcGVuIGNvbnRhaW5lciBwb3J0cyBmb3IgZGlyZWN0IEVDMiBhY2Nlc3MgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmRpcmVjdEFjY2Vzc0VuYWJsZWQpIHtcbiAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiB0aGlzLnByb3BzLnNlcnZpY2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VydmljZUVjMihzZXJ2aWNlKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNlcnZpY2UuY29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5wb3J0KSB7XG4gICAgICAgICAgICAgIGFzZ1NlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICAgICAgICAgICAgUGVlci5hbnlJcHY0KCksXG4gICAgICAgICAgICAgICAgUG9ydC50Y3AoY29udGFpbmVyLnBvcnQpLFxuICAgICAgICAgICAgICAgIGBEaXJlY3QgYWNjZXNzIHRvIGNvbnRhaW5lciBwb3J0ICR7Y29udGFpbmVyLnBvcnR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFzZyA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2tleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIil9LUF1dG9TY2FsaW5nR3JvdXBgLFxuICAgICAge1xuICAgICAgICBhdXRvU2NhbGluZ0dyb3VwTmFtZTogYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0tJHtrZXkucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiXCIpfS1Bc2dgLFxuICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eUdyb3VwOiBhc2dTZWN1cml0eUdyb3VwLFxuICAgICAgICBtaW5DYXBhY2l0eSxcbiAgICAgICAgbWF4Q2FwYWNpdHksXG4gICAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShpbnN0YW5jZVR5cGUpLFxuICAgICAgICBjYXBhY2l0eVJlYmFsYW5jZTogdHJ1ZSxcbiAgICAgICAgaW5zdGFuY2VNb25pdG9yaW5nOiBNb25pdG9yaW5nLkJBU0lDLFxuICAgICAgICBtYWNoaW5lSW1hZ2U6IEVjc09wdGltaXplZEltYWdlLmFtYXpvbkxpbnV4MihhbWlIYXJkd2FyZVR5cGUpXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IEFzZ0NhcGFjaXR5UHJvdmlkZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX1Bc2dDYXBhY2l0eVByb3ZpZGVyYCxcbiAgICAgIHtcbiAgICAgICAgYXV0b1NjYWxpbmdHcm91cDogYXNnLFxuICAgICAgICBlbmFibGVNYW5hZ2VkRHJhaW5pbmc6IHRydWUsXG4gICAgICAgIGVuYWJsZU1hbmFnZWRUZXJtaW5hdGlvblByb3RlY3Rpb246IGZhbHNlXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuY2x1c3Rlci5hZGRBc2dDYXBhY2l0eVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICB0aGlzLmFzZ0NhcGFjaXR5UHJvdmlkZXJzLnNldChrZXksIHByb3ZpZGVyKTtcblxuICAgIC8vIFN0b3JlIGZpcnN0IEFTRyBhbmQgc2VjdXJpdHkgZ3JvdXAgZm9yIGRpcmVjdCBhY2Nlc3Mgb3V0cHV0c1xuICAgIGlmICghdGhpcy5hdXRvU2NhbGluZ0dyb3VwKSB7XG4gICAgICB0aGlzLmF1dG9TY2FsaW5nR3JvdXAgPSBhc2c7XG4gICAgfVxuICAgIGlmICghdGhpcy5hc2dTZWN1cml0eUdyb3VwKSB7XG4gICAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAgPSBhc2dTZWN1cml0eUdyb3VwO1xuICAgIH1cblxuICAgIHJldHVybiBwcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIgdXNlcyBhIEZhcmdhdGUgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGFueVNlcnZpY2VVc2VzRmFyZ2F0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zZXJ2aWNlcy5zb21lKChzKSA9PiB0aGlzLmlzU2VydmljZUZhcmdhdGUocykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgc2VydmljZSBpbiB0aGUgY2x1c3RlciB1c2VzIGFuIEVDMiBjYXBhY2l0eSBwcm92aWRlci5cbiAgICovXG4gIHByaXZhdGUgYW55U2VydmljZVVzZXNFYzIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc2VydmljZXMuc29tZSgocykgPT4gdGhpcy5pc1NlcnZpY2VFYzIocykpO1xuICB9XG5cbiAgYWRkQ2x1c3Rlcihwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgLy8gRW5hYmxlIEZhcmdhdGUgY2FwYWNpdHkgcHJvdmlkZXJzIGlmIEFOWSBzZXJ2aWNlIHVzZXMgRkFSR0FURSBvciBGQVJHQVRFX1NQT1RcbiAgICBjb25zdCBuZWVkc0ZhcmdhdGUgPSB0aGlzLmFueVNlcnZpY2VVc2VzRmFyZ2F0ZSgpO1xuXG4gICAgdGhpcy5jbHVzdGVyID0gbmV3IENka0NsdXN0ZXIodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9YCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBjbHVzdGVyTmFtZTogcHJvcHMuY2x1c3Rlck5hbWUsXG4gICAgICBjb250YWluZXJJbnNpZ2h0c1YyOiBDb250YWluZXJJbnNpZ2h0cy5FTkFCTEVELFxuICAgICAgZW5hYmxlRmFyZ2F0ZUNhcGFjaXR5UHJvdmlkZXJzOiBuZWVkc0ZhcmdhdGVcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVDbHVzdGVyYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVDbHVzdGVyYCxcbiAgICAgIHZhbHVlOiB0aGlzLmNsdXN0ZXIuY2x1c3RlckFyblxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1DbHVzdGVyQXJuYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1DbHVzdGVyQXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUNsdXN0ZXJBcm5gLFxuICAgICAgdmFsdWU6IHRoaXMuY2x1c3Rlci5jbHVzdGVyQXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBFQ1MgQ2x1c3RlciBBUk4gZm9yICR7cHJvcHMuY2x1c3Rlck5hbWV9YFxuICAgIH0pO1xuICB9XG5cbiAgLy8gTm90ZTogYWRkQXV0b1NjYWxpbmdHcm91cCByZW1vdmVkIC0gQVNHcyBhcmUgbm93IGNyZWF0ZWQgcGVyLXNlcnZpY2UgdmlhIGdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlclxuXG4gIGFkZExvYWRCYWxhbmNlcihwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgY29uc3QgZGVmYXVsdExvYWRCYWxhbmNlck5hbWUgPSBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgO1xuICAgIGNvbnN0IHN1cHBvcnRlZE5hbWVMZW5ndGggPSAzMjtcblxuICAgIGxldCB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lID1cbiAgICAgIGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lLmxlbmd0aCA+IHN1cHBvcnRlZE5hbWVMZW5ndGhcbiAgICAgICAgPyBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZS5zdWJzdHJpbmcoMCwgc3VwcG9ydGVkTmFtZUxlbmd0aClcbiAgICAgICAgOiBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZTtcblxuICAgIHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUgPSB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLnJlcGxhY2UoLy0rJC8sIFwiXCIpO1xuXG4gICAgY29uc3QgaXNJbnRlcm5hbCA9IHByb3BzLmNsdXN0ZXI/LmxvYWRCYWxhbmNlciA9PT0gXCJpbnRlcm5hbFwiO1xuXG4gICAgLy8gQ2hlY2sgaWYgQU5ZIHNlcnZpY2UgdXNlcyBFQzIgKGNsdXN0ZXItbGV2ZWwgb3IgcGVyLXNlcnZpY2UpXG4gICAgY29uc3QgaGFzRWMyU2VydmljZXMgPSB0aGlzLmFueVNlcnZpY2VVc2VzRWMyKCk7XG5cbiAgICBpZiAoaGFzRWMyU2VydmljZXMpIHtcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgTG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cGAsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgdGhlICR7cHJvcHMuY2x1c3Rlck5hbWV9IGxvYWQgYmFsYW5jZXJgXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIEFsbG93IHRyYWZmaWMgdG8gYWxsIEFTRyBzZWN1cml0eSBncm91cHNcbiAgICAgIGlmICh0aGlzLmFzZ1NlY3VyaXR5R3JvdXApIHtcbiAgICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zLmFsbG93VG8oXG4gICAgICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgICAgIFBvcnQuYWxsVGNwKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zLmFsbG93RnJvbShcbiAgICAgICAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gICAgICAgICAgUG9ydC50Y3BSYW5nZSg0OTE1MiwgNjU1MzUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyID0gbmV3IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICAgIGludGVybmV0RmFjaW5nOiAhaXNJbnRlcm5hbCxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwOiB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyTmFtZTogdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSxcbiAgICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgICBzdWJuZXRUeXBlOiBpc0ludGVybmFsXG4gICAgICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgICAgIDogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyID0gbmV3IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICAgIGludGVybmV0RmFjaW5nOiAhaXNJbnRlcm5hbCxcbiAgICAgICAgICBsb2FkQmFsYW5jZXJOYW1lOiB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLFxuICAgICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICAgIHN1Ym5ldFR5cGU6IGlzSW50ZXJuYWxcbiAgICAgICAgICAgICAgPyBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICAgICAgICAgICAgOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyRG5zTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZVxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJVcmxgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlclVybGAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJVcmxgLFxuICAgICAgdmFsdWU6IGBodHRwOi8vJHt0aGlzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogYExvYWQgQmFsYW5jZXIgVVJMIGZvciAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICB9KTtcblxuICAgIC8vIEV4cG9ydCBsb2FkIGJhbGFuY2VyIEFSTiBmb3IgbW9uaXRvcmluZ1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyQXJuYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYExvYWQgQmFsYW5jZXIgQVJOIGZvciAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGlyZWN0QWNjZXNzT3V0cHV0cyhwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgaWYgKCF0aGlzLmRpcmVjdEFjY2Vzc0VuYWJsZWQgfHwgIXRoaXMuYXV0b1NjYWxpbmdHcm91cCkgcmV0dXJuO1xuXG4gICAgLy8gR2V0IHRoZSBmaXJzdCBjb250YWluZXIgcG9ydCAoZm9yIHVzZXIgaW5zdHJ1Y3Rpb25zKVxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPVxuICAgICAgcHJvcHMuc2VydmljZXMuZmxhdE1hcCgocykgPT4gcy5jb250YWluZXJzKS5maW5kKChjKSA9PiBjLnBvcnQpPy5wb3J0IHx8XG4gICAgICAzMDAwO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BdXRvU2NhbGluZ0dyb3VwTmFtZWAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cE5hbWVgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cE5hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMuYXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUnVuOiBhd3MgYXV0b3NjYWxpbmcgZGVzY3JpYmUtYXV0by1zY2FsaW5nLWdyb3VwcyAtLWF1dG8tc2NhbGluZy1ncm91cC1uYW1lcyA8bmFtZT4gdG8gZmluZCBpbnN0YW5jZSBJUGBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGlyZWN0QWNjZXNzUG9ydGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGlyZWN0QWNjZXNzUG9ydGAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EaXJlY3RBY2Nlc3NQb3J0YCxcbiAgICAgIHZhbHVlOiBTdHJpbmcoY29udGFpbmVyUG9ydCksXG4gICAgICBkZXNjcmlwdGlvbjogYEFjY2VzcyB5b3VyIGFwcCBhdCBodHRwOi8vPEVDMi1QVUJMSUMtSVA+OiR7Y29udGFpbmVyUG9ydH1gXG4gICAgfSk7XG4gIH1cblxuICBhZGRMb2FkQmFsYW5jZXJMaXN0ZW5lcihwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRCYWxhbmNlcikgcmV0dXJuO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHBvcnQgYmFzZWQgb24gd2hldGhlciBIVFRQUyBpcyBjb25maWd1cmVkIChkb21haW4gKyBjZXJ0KVxuICAgIGNvbnN0IHBvcnQgPSB0aGlzLmNlcnRpZmljYXRlID8gNDQzIDogODA7XG5cbiAgICAvLyBEZWZhdWx0IGFjdGlvbiBmb3IgcmVxdWVzdHMgdGhhdCBkb24ndCBtYXRjaCBhbnkgcm91dGluZyBydWxlXG4gICAgLy8gUmV0dXJucyA0MDQgZm9yIG11bHRpLXNlcnZpY2UgY2x1c3RlcnMgd2l0aCByb3V0aW5nIHJ1bGVzXG4gICAgY29uc3QgZGVmYXVsdEFjdGlvbiA9IExpc3RlbmVyQWN0aW9uLmZpeGVkUmVzcG9uc2UoNDA0LCB7XG4gICAgICBjb250ZW50VHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICBtZXNzYWdlQm9keTogXCJOb3QgRm91bmRcIlxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY2VydGlmaWNhdGUpIHtcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIgPSB0aGlzLmxvYWRCYWxhbmNlci5hZGRMaXN0ZW5lcihcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TGlzdGVuZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBjZXJ0aWZpY2F0ZXM6IFt0aGlzLmNlcnRpZmljYXRlXSxcbiAgICAgICAgICBkZWZhdWx0QWN0aW9uXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIgPSB0aGlzLmxvYWRCYWxhbmNlci5hZGRMaXN0ZW5lcihcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TGlzdGVuZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBkZWZhdWx0QWN0aW9uXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYWRkSG9zdGVkWm9uZShwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgLy8gU3VwcG9ydCBib3RoIG5ldyBjbHVzdGVyLmRvbWFpbiBhbmQgYWR2YW5jZWQgY2x1c3Rlci5kb21haW5Db25maWdcbiAgICBjb25zdCBkb21haW5Db25maWcgPSBwcm9wcy5jbHVzdGVyPy5kb21haW5Db25maWc7XG4gICAgY29uc3Qgc2ltcGxlRG9tYWluID0gcHJvcHMuY2x1c3Rlcj8uZG9tYWluO1xuXG4gICAgaWYgKCFkb21haW5Db25maWcgJiYgIXNpbXBsZURvbWFpbikgcmV0dXJuO1xuXG4gICAgY29uc3QgZG9tYWluTmFtZSA9IGRvbWFpbkNvbmZpZz8uZG9tYWluTmFtZSB8fCBzaW1wbGVEb21haW4hO1xuXG4gICAgaWYgKCFkb21haW5Db25maWc/Lmhvc3RlZFpvbmUpIHtcbiAgICAgIGNvbnN0IGhvc3RlZFpvbmUgPSBuZXcgRmphbGxIb3N0ZWRab25lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Ib3N0ZWRab25lYCxcbiAgICAgICAge1xuICAgICAgICAgIHpvbmVOYW1lOiBkb21haW5OYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaG9zdGVkWm9uZSA9IGhvc3RlZFpvbmUuZ2V0SW50ZXJuYWxIb3N0ZWRab25lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG9zdGVkWm9uZSA9IGRvbWFpbkNvbmZpZy5ob3N0ZWRab25lLmdldEludGVybmFsSG9zdGVkWm9uZSgpO1xuICAgIH1cblxuICAgIGlmICghZG9tYWluQ29uZmlnPy5jZXJ0aWZpY2F0ZSkge1xuICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9Q2VydGlmaWNhdGVgLFxuICAgICAgICB7XG4gICAgICAgICAgZG9tYWluTmFtZSxcbiAgICAgICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGFkdmFuY2VkIHJvdXRpbmcgcG9saWNpZXMgKGxhdGVuY3ksIHdlaWdodGVkLCBnZW8pXG4gICAgaWYgKGRvbWFpbkNvbmZpZykge1xuICAgICAgY29uc3QgbGF0ZW5jeUNvbmZpZyA9IGRvbWFpbkNvbmZpZyBhcyBMYXRlbmN5RG9tYWluQ29uZmlnO1xuICAgICAgY29uc3Qgd2VpZ2h0ZWRDb25maWcgPSBkb21haW5Db25maWcgYXMgV2VpZ2h0ZWREb21haW5Db25maWc7XG4gICAgICBjb25zdCBnZW9Db25maWcgPSBkb21haW5Db25maWcgYXMgR2VvTG9jYXRpb25Eb21haW5Db25maWc7XG5cbiAgICAgIGNvbnN0IGhhc1JvdXRpbmdQb2xpY3k6IGJvb2xlYW4gPVxuICAgICAgICAhIWxhdGVuY3lDb25maWc/LnJlZ2lvbiB8fFxuICAgICAgICB3ZWlnaHRlZENvbmZpZz8ud2VpZ2h0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgISFnZW9Db25maWc/Lmdlb0xvY2F0aW9uO1xuXG4gICAgICBsZXQgc2V0SWRlbnRpZmllciA9IGRvbWFpbkNvbmZpZy5zZXRJZGVudGlmaWVyO1xuICAgICAgaWYgKGhhc1JvdXRpbmdQb2xpY3kgJiYgIXNldElkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKGxhdGVuY3lDb25maWc/LnJlZ2lvbikge1xuICAgICAgICAgIHNldElkZW50aWZpZXIgPSBgJHtwcm9wcy5jbHVzdGVyTmFtZX0ke2xhdGVuY3lDb25maWcucmVnaW9ufWA7XG4gICAgICAgIH0gZWxzZSBpZiAod2VpZ2h0ZWRDb25maWc/LndlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0SWRlbnRpZmllciA9IGAke3Byb3BzLmNsdXN0ZXJOYW1lfVdlaWdodCR7d2VpZ2h0ZWRDb25maWcud2VpZ2h0fWA7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvQ29uZmlnPy5nZW9Mb2NhdGlvbikge1xuICAgICAgICAgIHNldElkZW50aWZpZXIgPSBgJHtwcm9wcy5jbHVzdGVyTmFtZX1HZW9gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmxvYWRCYWxhbmNlcikge1xuICAgICAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BUmVjb3JkYCwge1xuICAgICAgICAgIHJlY29yZE5hbWU6IGRvbWFpbk5hbWUsXG4gICAgICAgICAgem9uZTogdGhpcy5ob3N0ZWRab25lLFxuICAgICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgICAgIG5ldyBMb2FkQmFsYW5jZXJUYXJnZXQodGhpcy5sb2FkQmFsYW5jZXIsIHtcbiAgICAgICAgICAgICAgZXZhbHVhdGVUYXJnZXRIZWFsdGg6IGhhc1JvdXRpbmdQb2xpY3lcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZWdpb246IGxhdGVuY3lDb25maWc/LnJlZ2lvbixcbiAgICAgICAgICB3ZWlnaHQ6IHdlaWdodGVkQ29uZmlnPy53ZWlnaHQsXG4gICAgICAgICAgZ2VvTG9jYXRpb246IGdlb0NvbmZpZz8uZ2VvTG9jYXRpb24sXG4gICAgICAgICAgc2V0SWRlbnRpZmllcjogc2V0SWRlbnRpZmllclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNpbXBsZURvbWFpbiAmJiB0aGlzLmxvYWRCYWxhbmNlcikge1xuICAgICAgLy8gU2ltcGxlIGRvbWFpbiAtIGp1c3QgY3JlYXRlIEEgcmVjb3JkXG4gICAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BUmVjb3JkYCwge1xuICAgICAgICByZWNvcmROYW1lOiBkb21haW5OYW1lLFxuICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgICBuZXcgTG9hZEJhbGFuY2VyVGFyZ2V0KHRoaXMubG9hZEJhbGFuY2VyKVxuICAgICAgICApXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogRWNzQ2x1c3RlclByb3BzXG4gICk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyA9IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IChzYi5nZXROZXR3b3JrKCkgYXMgSVZwYykgfHwgcHJvcHMudnBjXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IHRoaXMoc2IuZ2V0U3RhY2soKSwgaWQsIG5ld1Byb3BzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=
1077
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBb0I2QjtBQUM3QixpREFTNkI7QUFDN0IsMkNBQXVDO0FBR3ZDLDZDQUFrRTtBQUVsRSx1RkFPZ0Q7QUFDaEQsaURBUTZCO0FBQzdCLHVGQUtnRDtBQUNoRCxpREFBMEQ7QUFDMUQsdUVBQXdEO0FBQ3hELGlEQUFzRDtBQUN0RCwrRUFHNEM7QUFDNUMseURBS2lDO0FBQ2pDLHlFQUFxRTtBQUNyRSxpREFBaUQ7QUFDakQsaUVBQTJFO0FBRTNFLGlFQUFpRjtBQUNqRix3REFBcUQ7QUFFckQseUVBQTBFO0FBSTFFOzs7R0FHRztBQUNILE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLEtBQUs7SUFDTCxPQUFPO0NBQ1IsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQVMsb0JBQW9CLENBQUMsWUFBb0I7SUFDaEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxPQUFPLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDM0MsQ0FBQyxDQUFDLHlCQUFlLENBQUMsR0FBRztRQUNyQixDQUFDLENBQUMseUJBQWUsQ0FBQyxRQUFRLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLGdDQUFnQztJ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QUFVLEVBQUUsVUFBVTtnQkFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUNyQixNQUFNLEVBQUUsMEJBQVksQ0FBQyxTQUFTLENBQzVCLElBQUksd0NBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUMxQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FDVixFQUFVLEVBQ1YsS0FBc0I7UUFFdEIsT0FBTyxDQUFDLEVBQWdCLEVBQUUsRUFBRTtZQUMxQixNQUFNLFFBQVEsR0FBb0I7Z0JBQ2hDLEdBQUcsS0FBSztnQkFDUixHQUFHO29CQUNELEdBQUcsRUFBRyxFQUFFLENBQUMsVUFBVSxFQUFXLElBQUksS0FBSyxDQUFDLEdBQUc7aUJBQzVDO2FBQ0YsQ0FBQztZQUNGLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE5eUNELDZCQTh5Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBd3NMb2dEcml2ZXIsXG4gIENsdXN0ZXIgYXMgQ2RrQ2x1c3RlcixcbiAgQ29udGFpbmVySW1hZ2UsXG4gIEZhcmdhdGVTZXJ2aWNlLFxuICBGYXJnYXRlVGFza0RlZmluaXRpb24sXG4gIEVjMlNlcnZpY2UsXG4gIEVjMlRhc2tEZWZpbml0aW9uLFxuICBOZXR3b3JrTW9kZSxcbiAgUHJvcGFnYXRlZFRhZ1NvdXJjZSxcbiAgdHlwZSBSZXBvc2l0b3J5SW1hZ2UsXG4gIHR5cGUgQ29udGFpbmVyRGVmaW5pdGlvbixcbiAgQ29udGFpbmVySW5zaWdodHMsXG4gIFBsYWNlbWVudFN0cmF0ZWd5LFxuICBBc2dDYXBhY2l0eVByb3ZpZGVyLFxuICBFY3NPcHRpbWl6ZWRJbWFnZSxcbiAgQW1pSGFyZHdhcmVUeXBlLFxuICBDcHVBcmNoaXRlY3R1cmUsXG4gIE9wZXJhdGluZ1N5c3RlbUZhbWlseSxcbiAgQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICB0eXBlIElDb25uZWN0YWJsZSxcbiAgdHlwZSBJU2VjdXJpdHlHcm91cCxcbiAgdHlwZSBJVnBjLFxuICBJbnN0YW5jZVR5cGUsXG4gIFBlZXIsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgdHlwZSBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgQXNwZWN0cywgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB0eXBlIHsgSUFzcGVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBcHBsaWNhdGlvbkxpc3RlbmVyLFxuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgQXBwbGljYXRpb25Qcm90b2NvbCxcbiAgdHlwZSBJQXBwbGljYXRpb25UYXJnZXRHcm91cCxcbiAgTGlzdGVuZXJBY3Rpb24sXG4gIExpc3RlbmVyQ29uZGl0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHtcbiAgRWZmZWN0LFxuICB0eXBlIElNYW5hZ2VkUG9saWN5LFxuICBQb2xpY3ksXG4gIHR5cGUgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgUHJlZGVmaW5lZE1ldHJpYyxcbiAgU2NhbGFibGVUYXJnZXQsXG4gIFNlcnZpY2VOYW1lc3BhY2UsXG4gIFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwcGxpY2F0aW9uYXV0b3NjYWxpbmdcIjtcbmltcG9ydCB7IFNlY3JldCBhcyBFY3NTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlLFxuICBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFSZWNvcmQsXG4gIFJlY29yZFRhcmdldCxcbiAgdHlwZSBJSG9zdGVkWm9uZSxcbiAgdHlwZSBHZW9Mb2NhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IExvYWRCYWxhbmNlclRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXAsIE1vbml0b3JpbmcgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWF1dG9zY2FsaW5nXCI7XG5cbmltcG9ydCB7IEhvc3RlZFpvbmUgYXMgRmphbGxIb3N0ZWRab25lIH0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9ob3N0ZWRab25lXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbS9zZWN1cml0eUdyb3VwXCI7XG5pbXBvcnQgeyB0eXBlIENvbm5lY3Rpb25TcGVjIH0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuaW1wb3J0IHsgcHJvY2Vzc0Nvbm5lY3Rpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9jb25uZWN0aW9ucy5qc1wiO1xuXG5pbXBvcnQgeyB0eXBlIFNlY3JldEltcG9ydCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5cbi8qKlxuICogSW5zdGFuY2UgdHlwZSBwcmVmaXhlcyB0aGF0IHVzZSBBUk02NCBhcmNoaXRlY3R1cmUgKEdyYXZpdG9uIHByb2Nlc3NvcnMpLlxuICogQWxsIG90aGVyIHByZWZpeGVzIGFyZSBhc3N1bWVkIHRvIGJlIHg4Ni02NCAoU1RBTkRBUkQpLlxuICovXG5jb25zdCBBUk1fSU5TVEFOQ0VfUFJFRklYRVMgPSBbXG4gIFwidDRnXCIsXG4gIFwiYzZnXCIsXG4gIFwiYzZnZFwiLFxuICBcImM2Z25cIixcbiAgXCJjN2dcIixcbiAgXCJjN2dkXCIsXG4gIFwiYzdnblwiLFxuICBcInI2Z1wiLFxuICBcInI2Z2RcIixcbiAgXCJyN2dcIixcbiAgXCJyN2dkXCIsXG4gIFwibTZnXCIsXG4gIFwibTZnZFwiLFxuICBcIm03Z1wiLFxuICBcIm03Z2RcIixcbiAgXCJhMVwiLFxuICBcIngyZ2RcIixcbiAgXCJpbTRnblwiLFxuICBcImlzNGdlblwiLFxuICBcImk0Z1wiLFxuICBcImhwYzdnXCJcbl07XG5cbi8qKlxuICogSW5mZXIgdGhlIEFNSSBoYXJkd2FyZSB0eXBlIGZyb20gYW4gRUMyIGluc3RhbmNlIHR5cGUuXG4gKiBVc2VzIHRoZSBpbnN0YW5jZSB0eXBlIHByZWZpeCB0byBkZXRlcm1pbmUgaWYgaXQncyBBUk0gKEdyYXZpdG9uKSBvciB4ODYtNjQuXG4gKlxuICogQHBhcmFtIGluc3RhbmNlVHlwZSAtIEVDMiBpbnN0YW5jZSB0eXBlIChlLmcuLCBcInQ0Zy5taWNyb1wiLCBcInQzLnNtYWxsXCIpXG4gKiBAcmV0dXJucyBBbWlIYXJkd2FyZVR5cGUuQVJNIGZvciBHcmF2aXRvbiBpbnN0YW5jZXMsIEFtaUhhcmR3YXJlVHlwZS5TVEFOREFSRCBmb3IgSW50ZWwvQU1EXG4gKi9cbmZ1bmN0aW9uIGluZmVyQW1pSGFyZHdhcmVUeXBlKGluc3RhbmNlVHlwZTogc3RyaW5nKTogQW1pSGFyZHdhcmVUeXBlIHtcbiAgY29uc3QgcHJlZml4ID0gaW5zdGFuY2VUeXBlLnNwbGl0KFwiLlwiKVswXTtcbiAgcmV0dXJuIEFSTV9JTlNUQU5DRV9QUkVGSVhFUy5pbmNsdWRlcyhwcmVmaXgpXG4gICAgPyBBbWlIYXJkd2FyZVR5cGUuQVJNXG4gICAgOiBBbWlIYXJkd2FyZVR5cGUuU1RBTkRBUkQ7XG59XG5cbi8qKlxuICogQ0RLIEFzcGVjdCB0aGF0IGZpeGVzIGNhcGFjaXR5IHByb3ZpZGVyIGRlbGV0aW9uIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgQ0RLIGJ1ZyAjMTUzNjYgd2hlcmUgRUNTIHNlcnZpY2VzIGRvbid0IHByb3Blcmx5XG4gKiBkZXBlbmQgb24gQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnMsIGNhdXNpbmcgXCJjYXBhY2l0eSBwcm92aWRlclxuICogaXMgaW4gdXNlXCIgZXJyb3JzIGR1cmluZyBzdGFjayBkZWxldGlvbi5cbiAqXG4gKiBUaGUgYXNwZWN0IHJ1bnMgYXQgc3ludGggdGltZSAod2hlbiBhc3NvY2lhdGlvbnMgZXhpc3QpIGFuZCBhZGRzOlxuICogLSBTZXJ2aWNlIGRlcGVuZHMgb24gQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnNcbiAqXG4gKiBERUxFVEUgb3JkZXIgYmVjb21lczogU2VydmljZXMg4oaSIEFzc29jaWF0aW9ucyDihpIgQ2x1c3RlclxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xNTM2NlxuICovXG5jbGFzcyBDYXBhY2l0eVByb3ZpZGVyRGVwZW5kZW5jeUFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGNsdXN0ZXI6IENka0NsdXN0ZXI7XG5cbiAgY29uc3RydWN0b3IoY2x1c3RlcjogQ2RrQ2x1c3Rlcikge1xuICAgIHRoaXMuY2x1c3RlciA9IGNsdXN0ZXI7XG4gIH1cblxuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgLy8gRmluZCBFQ1Mgc2VydmljZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBjbHVzdGVyXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBGYXJnYXRlU2VydmljZSB8fCBub2RlIGluc3RhbmNlb2YgRWMyU2VydmljZSkge1xuICAgICAgLy8gRmluZCBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9ucyBpbiB0aGUgY2x1c3RlcidzIGRlc2NlbmRhbnRzXG4gICAgICBjb25zdCBhc3NvY2lhdGlvbnMgPSB0aGlzLmNsdXN0ZXIubm9kZVxuICAgICAgICAuZmluZEFsbCgpXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgIChjaGlsZCk6IGNoaWxkIGlzIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zID0+XG4gICAgICAgICAgICBjaGlsZCBpbnN0YW5jZW9mIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChhc3NvY2lhdGlvbnMpIHtcbiAgICAgICAgLy8gQWRkIGRlcGVuZGVuY3k6IFNlcnZpY2Ug4oaSIEFzc29jaWF0aW9uc1xuICAgICAgICAvLyBERUxFVEUgb3JkZXI6IFNlcnZpY2UgZGVsZXRlZCBmaXJzdCwgdGhlbiBBc3NvY2lhdGlvbnNcbiAgICAgICAgbm9kZS5ub2RlLmFkZERlcGVuZGVuY3koYXNzb2NpYXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gUHJvdG9jb2wge1xuICBIVFRQLFxuICBIVFRQU1xufVxuXG5leHBvcnQgZW51bSBTY2FsaW5nVHlwZSB7XG4gIENQVSA9IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9DUFVfVVRJTElaQVRJT04sXG4gIE1FTU9SWSA9IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9NRU1PUllfVVRJTElaQVRJT05cbn1cblxuZXhwb3J0IHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlciA9IFwiRkFSR0FURVwiIHwgXCJGQVJHQVRFX1NQT1RcIiB8IFwiRUMyXCI7XG5cbi8qKlxuICogRUMyIGNhcGFjaXR5IGNvbmZpZ3VyYXRpb24gZm9yIEVDUyBFQzItYmFja2VkIGNsdXN0ZXJzLlxuICogT25seSB1c2VkIHdoZW4gY2FwYWNpdHlQcm92aWRlciBpcyBcIkVDMlwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjMkNhcGFjaXR5Q29uZmlnIHtcbiAgLyoqIEVDMiBpbnN0YW5jZSB0eXBlLiBEZWZhdWx0OiBcInQzLm1pY3JvXCIgKi9cbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuICAvKiogQU1JIGhhcmR3YXJlIHR5cGUuIERlZmF1bHQ6IFwiQVJNXCIgKEdyYXZpdG9uIC0gYmV0dGVyIGNvc3QvcGVyZm9ybWFuY2UpICovXG4gIGFtaUhhcmR3YXJlVHlwZT86IFwiQVJNXCIgfCBcIlNUQU5EQVJEXCI7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDMgKi9cbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBEZXNpcmVkIG51bWJlciBvZiBFQzIgaW5zdGFuY2VzLiBEZWZhdWx0OiAyIChmb3IgYXZhaWxhYmlsaXR5KSAqL1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgbGltaXQgaW4gTWlCIGZvciB0aGUgY29udGFpbmVyLiBEZWZhdWx0OiAxMDI0ICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIERvbWFpbiBjb25maWd1cmF0aW9uIGZvciBIVFRQUyBhbmQgRE5TLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvbWFpbkJhc2VDb25maWcge1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGhvc3RlZFpvbmU/OiBGamFsbEhvc3RlZFpvbmU7XG4gIGNlcnRpZmljYXRlPzogQ2VydGlmaWNhdGU7XG4gIHNldElkZW50aWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZW5jeURvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICByZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWlnaHRlZERvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW9Mb2NhdGlvbkRvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICBnZW9Mb2NhdGlvbjogR2VvTG9jYXRpb247XG59XG5cbmV4cG9ydCB0eXBlIERvbWFpbkNvbmZpZyA9XG4gIHwgRG9tYWluQmFzZUNvbmZpZ1xuICB8IExhdGVuY3lEb21haW5Db25maWdcbiAgfCBXZWlnaHRlZERvbWFpbkNvbmZpZ1xuICB8IEdlb0xvY2F0aW9uRG9tYWluQ29uZmlnO1xuXG4vKipcbiAqIEludGVybmFsIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29udGFpbmVyIGluIGEgbXVsdGktY29udGFpbmVyIEVDUyB0YXNrLlxuICpcbiAqIEluIG11bHRpLWNvbnRhaW5lciB0YXNrcywgdGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgYHBvcnRgIGlzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAqIHRoYXQgcmVjZWl2ZXMgbG9hZCBiYWxhbmNlciB0cmFmZmljLiBBbGwgb3RoZXIgY29udGFpbmVycyBhcmUgKipzaWRlY2FycyoqIHRoYXQgcHJvdmlkZVxuICogc3VwcG9ydGluZyBmdW5jdGlvbmFsaXR5IChsb2dnaW5nLCBtb25pdG9yaW5nLCBwcm94aWVzLCBldGMuKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJpbWFyeSBjb250YWluZXIgKGhhcyBwb3J0KSArIHNpZGVjYXIgKG5vIHBvcnQpXG4gKiBjb250YWluZXJzOiBbXG4gKiAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LCAgICAgICAgICAgLy8gUHJpbWFyeSAtIHJlY2VpdmVzIEFMQiB0cmFmZmljXG4gKiAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9ICAvLyBTaWRlY2FyIC0gbW9uaXRvcmluZ1xuICogXVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NsdXN0ZXJDb250YWluZXJDb25maWcge1xuICAvKiogVW5pcXVlIGNvbnRhaW5lciBuYW1lICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZS4gT3B0aW9uczpcbiAgICogLSBPbWl0OiBVc2VzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnkgKHByaW1hcnkgY29udGFpbmVyIG9ubHkpXG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbi5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBiZWNvbWVzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAgICogYW5kIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJEQl9QQVNTV09SRFwiXVxuICAgKi9cbiAgc2VjcmV0cz86IHN0cmluZ1tdO1xuICAvKiogU2VjcmV0cyBpbXBvcnRlZCBmcm9tIG90aGVyIENESyByZXNvdXJjZXMgKEFXUyBTZWNyZXRzIE1hbmFnZXIpICovXG4gIHNlY3JldHNJbXBvcnQ/OiB7IFtrZXk6IHN0cmluZ106IFNlY3JldEltcG9ydCB9O1xuICAvKiogQ29tbWFuZCB0byBydW4gaW4gdGhlIGNvbnRhaW5lciAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG4gIC8qKiBFbnRyeSBwb2ludCBmb3IgdGhlIGNvbnRhaW5lciAqL1xuICBlbnRyeVBvaW50Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIGVzc2VudGlhbC5cbiAgICogSWYgYW4gZXNzZW50aWFsIGNvbnRhaW5lciBzdG9wcywgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgc3RvcC5cbiAgICogRGVmYXVsdDogdHJ1ZSBmb3IgcHJpbWFyeSBjb250YWluZXIsIHRydWUgZm9yIHNpZGVjYXJzXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogQ2x1c3Rlci1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ2x1c3RlckNsdXN0ZXJDb25maWcge1xuICAvKipcbiAgICogRG9tYWluIGZvciBIVFRQUyBhY2Nlc3MuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IEROUyAoKi5lbGIuYW1hem9uYXdzLmNvbSlcbiAgICogLSBTcGVjaWZpZWQ6IENyZWF0ZXMgQUNNIGNlcnRpZmljYXRlICsgUm91dGU1MyBETlMgQSByZWNvcmRcbiAgICovXG4gIGRvbWFpbj86IHN0cmluZztcblxuICAvKipcbiAgICogTG9hZCBiYWxhbmNlciBjb25maWd1cmF0aW9uLlxuICAgKiAtIGZhbHNlOiBObyBBTEIgKGZvciB3b3JrZXJzL2ludGVybmFsIHNlcnZpY2VzKVxuICAgKiAtIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICovXG4gIGxvYWRCYWxhbmNlcj86IGZhbHNlIHwgXCJwdWJsaWNcIiB8IFwiaW50ZXJuYWxcIjtcblxuICAvKipcbiAgICogRW5hYmxlIGRpcmVjdCBFQzIgYWNjZXNzIHdpdGhvdXQgQUxCLlxuICAgKiBPcGVucyBjb250YWluZXIgcG9ydHMgb24gc2VjdXJpdHkgZ3JvdXAgZm9yIGRpcmVjdCBhY2Nlc3MgdmlhIEVDMiBwdWJsaWMgSVAuXG4gICAqIFVzZXMgaG9zdCBuZXR3b3JrIG1vZGUgZm9yIHByZWRpY3RhYmxlIHBvcnQgbWFwcGluZyAoY29udGFpbmVyOjMwMDAg4oaSIGhvc3Q6MzAwMCkuXG4gICAqIE9ubHkgdmFsaWQgd2l0aCBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb21haW4gY29uZmlndXJhdGlvbiBmb3IgYWR2YW5jZWQgcm91dGluZyBwb2xpY2llcyAobGF0ZW5jeSwgd2VpZ2h0ZWQsIGdlbykuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGRvbWFpbiBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG59XG5cbi8qKlxuICogUm91dGluZyBjb25maWd1cmF0aW9uIGZvciBwYXRoL2hvc3QtYmFzZWQgcm91dGluZyBvbiB0aGUgQUxCLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1JvdXRpbmdDb25maWcge1xuICAvKiogUGF0aCBwYXR0ZXJuIGZvciByb3V0aW5nIChlLmcuLCBcIi9hcGkvKlwiLCBcIi91c2Vycy8qXCIpICovXG4gIHBhdGg/OiBzdHJpbmc7XG4gIC8qKiBIb3N0IGhlYWRlciBmb3Igcm91dGluZyAoZS5nLiwgXCJhcGkuZXhhbXBsZS5jb21cIikgKi9cbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIFByaW9yaXR5IGZvciB0aGlzIHJvdXRpbmcgcnVsZSAoMS01MDAwMCkuIExvd2VyID0gaGlnaGVyIHByaW9yaXR5LiAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcbiAgLyoqIEhlYWx0aCBjaGVjayBwYXRoIGZvciB0aGlzIHNlcnZpY2UncyB0YXJnZXQgZ3JvdXAuIERlZmF1bHQ6IFwiL1wiICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZywgYW5kIHRhcmdldCBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NTZXJ2aWNlUHJvcHMge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIC0gT21pdDogVXNlcyBjbHVzdGVyJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgc2VydmljZS5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqIChyZWNlaXZlcyBBTEIgdHJhZmZpYykuXG4gICAqL1xuICBjb250YWluZXJzOiBFY3NDbHVzdGVyQ29udGFpbmVyQ29uZmlnW107XG5cbiAgLyoqIENQVSB1bml0cyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDI1Ni00MDk2KSAqL1xuICBjcHU/OiBudW1iZXI7XG5cbiAgLyoqIE1lbW9yeSBpbiBNaUIgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICg1MTItMzA3MjApICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuXG4gIC8qKiBEZXNpcmVkIG51bWJlciBvZiB0YXNrcy4gRGVmYXVsdDogMiAqL1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqIFNjYWxpbmcgdHlwZSAoQ1BVIG9yIE1FTU9SWSkuIE9taXQgdG8gZGlzYWJsZSBhdXRvLXNjYWxpbmcuICovXG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG5cbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIHRhc2tzIGZvciBhdXRvLXNjYWxpbmcuIERlZmF1bHQ6IDIgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHRhc2tzIGZvciBhdXRvLXNjYWxpbmcuIERlZmF1bHQ6IDEwICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIHNlcnZpY2Ugb24gdGhlIGNsdXN0ZXIncyBBTEIuXG4gICAqIFJlcXVpcmVkIHdoZW4gY2x1c3RlciBoYXMgbXVsdGlwbGUgc2VydmljZXMgd2l0aCBwb3J0cy5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGlubGluZSBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtYW5hZ2VkIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzPzogSU1hbmFnZWRQb2xpY3lbXTtcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgc2VydmljZSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMsIFMzIGJ1Y2tldHMsIFNRUyBxdWV1ZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBJQ29ubmVjdGFibGUgcmVzb3VyY2VzIGFuZCBJQU0gZ3JhbnRzIGZvciBJQU0gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBJQ29ubmVjdGFibGU6IFNlY3VyaXR5IGdyb3VwIHJlc291cmNlcyAoUkRTLCBFQ1MsIGV0Yy4pXG4gICAqIC0gSVN0b3JhZ2VDb25uZWN0b3I6IFMzIGJ1Y2tldHMgKElBTSBncmFudHMpXG4gICAqIC0gSUR5bmFtb0RCQ29ubmVjdG9yOiBEeW5hbW9EQiB0YWJsZXMgKElBTSBncmFudHMpXG4gICAqIC0gSVF1ZXVlQ29ubmVjdG9yOiBTUVMgcXVldWVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIENvbm5lY3Rpb25Db25maWc6IEV4cGxpY2l0IGFjY2VzcyBsZXZlbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbm5lY3Rpb25zOiBbXG4gICAqICAgZGF0YWJhc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgZ3JvdXAgKFJEUylcbiAgICogICB7IHJlc291cmNlOiBjYWNoZSwgYWNjZXNzOiBcInJlYWRcIiB9LCAgIC8vIFJlYWQtb25seSBEeW5hbW9EQlxuICAgKiAgIHsgcmVzb3VyY2U6IGJ1Y2tldCwgYWNjZXNzOiBcIndyaXRlXCIgfSwgLy8gV3JpdGUtb25seSBTM1xuICAgKiAgIHsgcmVzb3VyY2U6IHF1ZXVlLCBhY2Nlc3M6IFwiY29uc3VtZVwiIH0gLy8gQ29uc3VtZS1vbmx5IFNRU1xuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IENvbm5lY3Rpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIENhcGFjaXR5IHByb3ZpZGVyIGZvciB0aGlzIHNlcnZpY2UuIFJFUVVJUkVELlxuICAgKiBFYWNoIHNlcnZpY2Ugc3BlY2lmaWVzIGl0cyBvd24gY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBjYXBhY2l0eVByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBPbmx5IHVzZWQgd2hlbiBzZXJ2aWNlIGNhcGFjaXR5UHJvdmlkZXIgaXMgXCJFQzJcIi5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBlYzJDb25maWcgc2hhcmUgYW4gQVNHIGZvciBlZmZpY2llbmN5LlxuICAgKi9cbiAgZWMyQ29uZmlnPzogRWMyQ2FwYWNpdHlDb25maWc7XG5cbiAgLyoqXG4gICAqIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBmb3Igc2VjcmV0cy5cbiAgICogSWYgY29udGFpbmVycyBoYXZlIHNlY3JldHMgZGVmaW5lZCwgdGhpcyBwYXRoIGlzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cbiAgICogRm9ybWF0OiAvPGFwcD4vPGNsdXN0ZXI+LzxzZXJ2aWNlPlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnNcIlxuICAgKi9cbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBidWlsZCB0YXJnZXQgc3RhZ2UgZm9yIG11bHRpLXN0YWdlIERvY2tlcmZpbGVzLlxuICAgKiBXaGVuIHNwZWNpZmllZCwgYXBwZW5kcyBgLTx0YXJnZXQ+YCB0byB0aGUgaW1hZ2UgdGFnLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBXaXRoIGRvY2tlclRhcmdldDogXCJhcGlcIiwgaW1hZ2UgdGFnIGJlY29tZXM6IG15c2VydmljZS1hcGktbGF0ZXN0XG4gICAqIGRvY2tlclRhcmdldDogXCJhcGlcIlxuICAgKi9cbiAgZG9ja2VyVGFyZ2V0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjcmVhdGluZyBhbiBFQ1MgY2x1c3RlciB3aXRoIG11bHRpcGxlIHNlcnZpY2VzLlxuICovXG5leHBvcnQgdHlwZSBFY3NDbHVzdGVyUHJvcHMgPSB7XG4gIC8qKiBDbHVzdGVyIG5hbWUgKi9cbiAgY2x1c3Rlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSBmb3IgU1NNIHNlY3JldHMgbmFtZXNwYWNlLlxuICAgKiBSZXF1aXJlZCB3aGVuIGFueSBjb250YWluZXIgdXNlcyBzZWNyZXRzIHdpdGhvdXQgZXhwbGljaXQgc3NtU2VjcmV0c1BhdGguXG4gICAqIFVzZWQgdG8gYnVpbGQgdGhlIHBhdGg6IC88YXBwTmFtZT4vPGNsdXN0ZXJOYW1lPi88c2VydmljZU5hbWU+XG4gICAqL1xuICBhcHBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBWUEMgdG8gZGVwbG95IGludG8gKi9cbiAgdnBjPzogSVZwYztcblxuICAvKiogRGVmYXVsdCBFQ1IgcmVwb3NpdG9yeSBvciBjb250YWluZXIgaW1hZ2UgKi9cbiAgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZSB8IHN0cmluZztcblxuICAvLyBOb3RlOiBjYXBhY2l0eVByb3ZpZGVyIGFuZCBlYzJDb25maWcgYXJlIHBlci1zZXJ2aWNlIG9ubHkgKGluIEVjc1NlcnZpY2VQcm9wcylcblxuICAvKipcbiAgICogQ2x1c3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzLlxuICAgKi9cbiAgY2x1c3Rlcj86IEVjc0NsdXN0ZXJDbHVzdGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBzY2FsaW5nLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKiBUYXNrIHJvbGUgcG9saWNpZXMgYXJlIGNvbmZpZ3VyZWQgcGVyLXNlcnZpY2UgZm9yIGxlYXN0LXByaXZpbGVnZS5cbiAgICovXG4gIHNlcnZpY2VzOiBFY3NTZXJ2aWNlUHJvcHNbXTtcbn07XG5cbi8qKlxuICogRGF0YSB0cmFja2VkIGZvciBlYWNoIHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIuXG4gKi9cbmludGVyZmFjZSBTZXJ2aWNlRGF0YSB7XG4gIHNlcnZpY2U6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZTtcbiAgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uO1xuICAvKiogUm9sZSBmb3IgRUNTIGFnZW50IChwdWxsIGltYWdlcywgd3JpdGUgbG9ncywgaW5qZWN0IHNlY3JldHMpICovXG4gIGV4ZWN1dGlvblJvbGU6IFJvbGU7XG4gIC8qKiBSb2xlIGZvciBhcHBsaWNhdGlvbiBjb2RlICh1c2VyIHBvbGljaWVzLCBFQ1MgRXhlYykgKi9cbiAgdGFza1JvbGU6IFJvbGU7XG4gIGNvbnRhaW5lcnM6IENvbnRhaW5lckRlZmluaXRpb25bXTtcbiAgcHJpbWFyeUNvbnRhaW5lcj86IENvbnRhaW5lckRlZmluaXRpb247XG4gIHRhcmdldEdyb3VwPzogSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXA7XG4gIHNjYWxpbmdQb2xpY3k/OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG59XG5cbi8qKlxuICogRUNTIENsdXN0ZXIgc3VwcG9ydGluZyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIGEgc2hhcmVkIEFMQi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIHNlcnZpY2UgY2x1c3RlclxuICogbmV3IEVjc0NsdXN0ZXIoc2NvcGUsIFwiV2ViQ2x1c3RlclwiLCB7XG4gKiAgIGNsdXN0ZXJOYW1lOiBcIldlYkNsdXN0ZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogZWNyLFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9XSB9XG4gKiAgIF1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJBcGlDbHVzdGVyXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiQXBpQ2x1c3RlclwiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBlY3JSZXBvc2l0b3J5OiBlY3IsXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtlciBjbHVzdGVyIChubyBBTEIpXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJXb3JrZXJzXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiV29ya2Vyc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgZWNyUmVwb3NpdG9yeTogZWNyLFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJwcm9jZXNzb3JcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJ3b3JrZXJcIiB9XSB9XG4gKiAgIF1cbiAqIH0pO1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY3NDbHVzdGVyIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zITogQ29ubmVjdGlvbnM7XG5cbiAgLy8gQ2x1c3Rlci1sZXZlbCByZXNvdXJjZXNcbiAgcHJpdmF0ZSBjbHVzdGVyITogQ2RrQ2x1c3RlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXI/OiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJMaXN0ZW5lcj86IEFwcGxpY2F0aW9uTGlzdGVuZXI7XG4gIHByaXZhdGUgaG9zdGVkWm9uZT86IElIb3N0ZWRab25lO1xuICBwcml2YXRlIGNlcnRpZmljYXRlPzogQ2VydGlmaWNhdGU7XG4gIHByaXZhdGUgYVJlY29yZD86IEFSZWNvcmQ7XG5cbiAgLy8gRUMyLXNwZWNpZmljXG4gIHByaXZhdGUgYXV0b1NjYWxpbmdHcm91cD86IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUgYXNnU2VjdXJpdHlHcm91cD86IFNlY3VyaXR5R3JvdXA7XG4gIHByaXZhdGUgYXNnQ2FwYWNpdHlQcm92aWRlcj86IEFzZ0NhcGFjaXR5UHJvdmlkZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cD86IFNlY3VyaXR5R3JvdXA7XG5cbiAgLy8gUGVyLXNlcnZpY2UgdHJhY2tpbmdcbiAgcHJpdmF0ZSBzZXJ2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXJ2aWNlRGF0YT4oKTtcblxuICAvLyBQZXItc2VydmljZSBBU0cgY2FwYWNpdHkgcHJvdmlkZXJzIChrZXllZCBieSBFQzIgY29uZmlnIHNpZ25hdHVyZSlcbiAgcHJpdmF0ZSBhc2dDYXBhY2l0eVByb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBc2dDYXBhY2l0eVByb3ZpZGVyPigpO1xuXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBzY29wZTogQ29uc3RydWN0O1xuICBwcml2YXRlIHByb3BzOiBFY3NDbHVzdGVyUHJvcHM7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyRGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgZGlyZWN0QWNjZXNzRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBuZXh0UHJpb3JpdHkgPSAxMDA7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCA9IHByb3BzLmNsdXN0ZXI/LmRpcmVjdEFjY2VzcyA9PT0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkID1cbiAgICAgIHByb3BzLmNsdXN0ZXI/LmxvYWRCYWxhbmNlciA9PT0gZmFsc2UgfHwgdGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcblxuICAgIHRoaXMuYWRkQ2x1c3Rlcihwcm9wcyk7XG5cbiAgICBmb3IgKGNvbnN0IHNlcnZpY2VQcm9wcyBvZiBwcm9wcy5zZXJ2aWNlcykge1xuICAgICAgaWYgKHNlcnZpY2VQcm9wcy5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiKSB7XG4gICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVBc2dDYXBhY2l0eVByb3ZpZGVyKHNlcnZpY2VQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkKSB7XG4gICAgICB0aGlzLmFkZExvYWRCYWxhbmNlcihwcm9wcyk7XG5cbiAgICAgIGlmIChwcm9wcy5jbHVzdGVyPy5kb21haW4gfHwgcHJvcHMuY2x1c3Rlcj8uZG9tYWluQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuYWRkSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZERpcmVjdEFjY2Vzc091dHB1dHMocHJvcHMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VydmljZVByb3BzIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VUb0NsdXN0ZXIoc2VydmljZVByb3BzKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlcGxveWFibGVTZXJ2aWNlT3V0cHV0cyhwcm9wcyk7XG5cbiAgICB0aGlzLnNldHVwQ29ubmVjdGlvbnMocHJvcHMpO1xuXG4gICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IENhcGFjaXR5UHJvdmlkZXJEZXBlbmRlbmN5QXNwZWN0KHRoaXMuY2x1c3RlcikpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2x1c3RlcidzIGxvYWQgYmFsYW5jZXIuIFVuZGVmaW5lZCBpZiBkaXNhYmxlZC4gKi9cbiAgZ2V0TG9hZEJhbGFuY2VyKCk6IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkQmFsYW5jZXI7XG4gIH1cblxuICAvKiogR2V0IHRoZSBsb2FkIGJhbGFuY2VyJ3MgbGlzdGVuZXIuIFVuZGVmaW5lZCBpZiBkaXNhYmxlZC4gKi9cbiAgZ2V0TGlzdGVuZXIoKTogQXBwbGljYXRpb25MaXN0ZW5lciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXI7XG4gIH1cblxuICAvKiogR2V0IGEgc3BlY2lmaWMgc2VydmljZSBieSBuYW1lLiAqL1xuICBnZXRTZXJ2aWNlKG5hbWU6IHN0cmluZyk6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0KG5hbWUpPy5zZXJ2aWNlO1xuICB9XG5cbiAgLyoqIEdldCBhbGwgc2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLiAqL1xuICBnZXRTZXJ2aWNlcygpOiBNYXA8c3RyaW5nLCBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2U+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlPigpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIHRoaXMuc2VydmljZXMpIHtcbiAgICAgIHJlc3VsdC5zZXQobmFtZSwgZGF0YS5zZXJ2aWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEVDUyBjbHVzdGVyIGNvbnN0cnVjdC4gKi9cbiAgZ2V0Q2x1c3RlcigpOiBDZGtDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5jbHVzdGVyO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgQUxCIFVSTCAoaHR0cDovLyBvciBodHRwczovLykuICovXG4gIGdldFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5sb2FkQmFsYW5jZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLmNlcnRpZmljYXRlID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgY29uc3QgZG9tYWluID1cbiAgICAgIHRoaXMucHJvcHMuY2x1c3Rlcj8uZG9tYWluIHx8IHRoaXMubG9hZEJhbGFuY2VyLmxvYWRCYWxhbmNlckRuc05hbWU7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7ZG9tYWlufWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2VydmljZSB0byB0aGUgY2x1c3Rlci5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIGNvbnRhaW5lcnMsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlcnZpY2VUb0NsdXN0ZXIoc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VQcm9wcy5uYW1lO1xuXG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZSA9IHRoaXMuY3JlYXRlRXhlY3V0aW9uUm9sZShzZXJ2aWNlTmFtZSk7XG4gICAgY29uc3QgdGFza1JvbGUgPSB0aGlzLmNyZWF0ZVRhc2tSb2xlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlUHJvcHMpO1xuXG4gICAgY29uc3QgdGFza0RlZmluaXRpb24gPSB0aGlzLmNyZWF0ZVRhc2tEZWZpbml0aW9uKFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICBleGVjdXRpb25Sb2xlLFxuICAgICAgdGFza1JvbGVcbiAgICApO1xuXG4gICAgY29uc3QgeyBjb250YWluZXJzLCBwcmltYXJ5Q29udGFpbmVyIH0gPSB0aGlzLmFkZENvbnRhaW5lcnNUb1Rhc2soXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgIHRhc2tEZWZpbml0aW9uXG4gICAgKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVNlcnZpY2UoXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgIHRhc2tEZWZpbml0aW9uXG4gICAgKTtcblxuICAgIGxldCB0YXJnZXRHcm91cDogSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgIXRoaXMubG9hZEJhbGFuY2VyRGlzYWJsZWQgJiZcbiAgICAgIHByaW1hcnlDb250YWluZXIgJiZcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXJcbiAgICApIHtcbiAgICAgIHRhcmdldEdyb3VwID0gdGhpcy5yZWdpc3RlclNlcnZpY2VXaXRoQUxCKFxuICAgICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgICAgc2VydmljZVByb3BzLFxuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBwcmltYXJ5Q29udGFpbmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBzY2FsaW5nUG9saWN5OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3kgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlcnZpY2VQcm9wcy5zY2FsaW5nVHlwZSkge1xuICAgICAgc2NhbGluZ1BvbGljeSA9IHRoaXMuYWRkU2VydmljZVNjYWxpbmcoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICAgIHNlcnZpY2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2aWNlcy5zZXQoc2VydmljZU5hbWUsIHtcbiAgICAgIHNlcnZpY2UsXG4gICAgICB0YXNrRGVmaW5pdGlvbixcbiAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICB0YXNrUm9sZSxcbiAgICAgIGNvbnRhaW5lcnMsXG4gICAgICBwcmltYXJ5Q29udGFpbmVyLFxuICAgICAgdGFyZ2V0R3JvdXAsXG4gICAgICBzY2FsaW5nUG9saWN5XG4gICAgfSk7XG5cbiAgICBpZiAoc2VydmljZVByb3BzLmNvbm5lY3Rpb25zICYmIHNlcnZpY2VQcm9wcy5jb25uZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwcm9jZXNzQ29ubmVjdGlvbnMoXG4gICAgICAgICAgc2VydmljZVByb3BzLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIHRhc2tSb2xlLCAvLyBJR3JhbnRhYmxlICh0YXNrIHJvbGUgZm9yIElBTSBncmFudHMpXG4gICAgICAgICAgc2VydmljZSAvLyBJQ29ubmVjdGFibGUgKHNlY3VyaXR5IGdyb3VwIGZvciBuZXR3b3JrIGFjY2VzcylcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHByb2Nlc3MgY29ubmVjdGlvbnMgZm9yIEVDUyBzZXJ2aWNlICcke3NlcnZpY2VOYW1lfSc6ICR7XG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogRWNzQ2x1c3RlclByb3BzKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgc2VydmljZXMgYXJyYXlcbiAgICBpZiAoIXByb3BzLnNlcnZpY2VzIHx8IHByb3BzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgc2VydmljZSBuYW1lc1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHByb3BzLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgICBjb25zdCBkdXBsaWNhdGVTZXJ2aWNlcyA9IHNlcnZpY2VOYW1lcy5maWx0ZXIoXG4gICAgICAobmFtZSwgaW5kZXgpID0+IHNlcnZpY2VOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZVNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYER1cGxpY2F0ZSBzZXJ2aWNlIG5hbWVzOiAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZVNlcnZpY2VzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcm91dGluZyB3aGVuIG11bHRpcGxlIHNlcnZpY2VzIGhhdmUgcG9ydHNcbiAgICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHByb3BzLnNlcnZpY2VzLmZpbHRlcigocykgPT5cbiAgICAgIHMuY29udGFpbmVycy5zb21lKChjKSA9PiBjLnBvcnQgIT09IHVuZGVmaW5lZClcbiAgICApO1xuXG4gICAgaWYgKHNlcnZpY2VzV2l0aFBvcnRzLmxlbmd0aCA+IDEgJiYgIXRoaXMubG9hZEJhbGFuY2VyRGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdSb3V0aW5nID0gc2VydmljZXNXaXRoUG9ydHMuZmlsdGVyKFxuICAgICAgICAocykgPT4gIXMucm91dGluZz8ucGF0aCAmJiAhcy5yb3V0aW5nPy5ob3N0XG4gICAgICApO1xuICAgICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlcyB3aXRoIHBvcnRzIHJlcXVpcmUgcm91dGluZyBjb25maWcgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlczogYCArXG4gICAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgICBcIkFkZCByb3V0aW5nOiB7IHBhdGg6ICcvLi4uJyB9IHRvIGVhY2ggc2VydmljZS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgcHJvcHMuc2VydmljZXMpIHtcbiAgICAgIGlmICghc2VydmljZS5jb250YWluZXJzIHx8IHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBBdCBsZWFzdCBvbmUgY29udGFpbmVyIG11c3QgYmUgc3BlY2lmaWVkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2VcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lcnMgPSBjb250YWluZXJOYW1lcy5maWx0ZXIoXG4gICAgICAgIChuYW1lLCBpbmRleCkgPT4gY29udGFpbmVyTmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gaW5kZXhcbiAgICAgICk7XG4gICAgICBpZiAoZHVwbGljYXRlQ29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JzogRHVwbGljYXRlIGNvbnRhaW5lciBuYW1lczogYCArXG4gICAgICAgICAgICBgJHtbLi4ubmV3IFNldChkdXBsaWNhdGVDb250YWluZXJzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwQ29ubmVjdGlvbnMocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyk6IHZvaWQge1xuICAgIGxldCBkZWZhdWx0UG9ydCA9IDgwO1xuICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBwcm9wcy5zZXJ2aWNlcykge1xuICAgICAgY29uc3QgcHJpbWFyeUNvbnRhaW5lciA9IHNlcnZpY2UuY29udGFpbmVycy5maW5kKFxuICAgICAgICAoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBpZiAocHJpbWFyeUNvbnRhaW5lcj8ucG9ydCkge1xuICAgICAgICBkZWZhdWx0UG9ydCA9IHByaW1hcnlDb250YWluZXIucG9ydDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHM6IElTZWN1cml0eUdyb3VwW10gPSBbXTtcblxuICAgIGlmICh0aGlzLmFzZ1NlY3VyaXR5R3JvdXApIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzLnB1c2godGhpcy5hc2dTZWN1cml0eUdyb3VwKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlcnZpY2VEYXRhIG9mIHRoaXMuc2VydmljZXMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2VTZ3MgPSBzZXJ2aWNlRGF0YS5zZXJ2aWNlPy5jb25uZWN0aW9ucz8uc2VjdXJpdHlHcm91cHMgfHwgW107XG4gICAgICBmb3IgKGNvbnN0IHNnIG9mIHNlcnZpY2VTZ3MpIHtcbiAgICAgICAgaWYgKCFzZWN1cml0eUdyb3Vwcy5pbmNsdWRlcyhzZykpIHtcbiAgICAgICAgICBzZWN1cml0eUdyb3Vwcy5wdXNoKHNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AoZGVmYXVsdFBvcnQpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXhlY3V0aW9uIHJvbGUgZm9yIEVDUyBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zLlxuICAgKiBVc2VkIGJ5IHRoZSBFQ1MgYWdlbnQgdG8gcHVsbCBpbWFnZXMsIHdyaXRlIGxvZ3MsIGFuZCBpbmplY3Qgc2VjcmV0cy5cbiAgICogTk9UIHVzZWQgYnkgYXBwbGljYXRpb24gY29kZSAtIHRoYXQncyB0aGUgdGFzayByb2xlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFeGVjdXRpb25Sb2xlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBSb2xlIHtcbiAgICBjb25zdCBleGVjdXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgYCR7c2VydmljZU5hbWV9RXhlY3V0aW9uUm9sZWAsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgIH0pO1xuXG4gICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwiZWNyOkdldEF1dGhvcml6YXRpb25Ub2tlblwiLFxuICAgICAgICAgIFwiZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eVwiLFxuICAgICAgICAgIFwiZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXJcIixcbiAgICAgICAgICBcImVjcjpCYXRjaEdldEltYWdlXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBsb2dHcm91cEFybiA9IGBhcm46YXdzOmxvZ3M6JHtTdGFjay5vZih0aGlzKS5yZWdpb259OiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06bG9nLWdyb3VwOi9lY3MvJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSpgO1xuICAgIGV4ZWN1dGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImxvZ3M6Q3JlYXRlTG9nU3RyZWFtXCIsXG4gICAgICAgICAgXCJsb2dzOlB1dExvZ0V2ZW50c1wiLFxuICAgICAgICAgIFwibG9nczpDcmVhdGVMb2dHcm91cFwiXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW2xvZ0dyb3VwQXJuLCBgJHtsb2dHcm91cEFybn06KmBdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBzZWNyZXROYW1lcyA9IHRoaXMuY29sbGVjdFNlY3JldHNNYW5hZ2VyU2VjcmV0TmFtZXMoKTtcbiAgICBpZiAoc2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VjcmV0QXJucyA9IHNlY3JldE5hbWVzLm1hcChcbiAgICAgICAgKHNlY3JldE5hbWUpID0+XG4gICAgICAgICAgYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtTdGFjay5vZih0aGlzKS5yZWdpb259OiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06c2VjcmV0OiR7c2VjcmV0TmFtZX0tKmBcbiAgICAgICk7XG4gICAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBcInNlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlXCIsXG4gICAgICAgICAgICBcInNlY3JldHNtYW5hZ2VyOkRlc2NyaWJlU2VjcmV0XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogc2VjcmV0QXJuc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTc21TZWNyZXRzID0gdGhpcy5wcm9wcy5zZXJ2aWNlcy5zb21lKChzZXJ2aWNlKSA9PlxuICAgICAgc2VydmljZS5jb250YWluZXJzLnNvbWUoXG4gICAgICAgIChjb250YWluZXIpID0+IGNvbnRhaW5lci5zZWNyZXRzICYmIGNvbnRhaW5lci5zZWNyZXRzLmxlbmd0aCA+IDBcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChoYXNTc21TZWNyZXRzKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuYXBwTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVDUyBjbHVzdGVyICcke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9JyBoYXMgc2VydmljZXMgdXNpbmcgc2VjcmV0cyBidXQgYXBwTmFtZSBpcyBub3QgY29uZmlndXJlZC4gYCArXG4gICAgICAgICAgICBgU2V0IGFwcE5hbWUgb24gY2x1c3RlciBwcm9wcyB0byBlbmFibGUgc2NvcGVkIElBTSBwZXJtaXNzaW9ucyBmb3IgU1NNIFBhcmFtZXRlciBTdG9yZSBhY2Nlc3MuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlcnNcIiwgXCJzc206R2V0UGFyYW1ldGVyXCJdLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnNzbToqOio6cGFyYW1ldGVyLyR7dGhpcy5wcm9wcy5hcHBOYW1lfS8qYF1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gS01TIGRlY3J5cHQgZm9yIFNTTSBTZWN1cmVTdHJpbmcgYW5kIFNlY3JldHMgTWFuYWdlciB3aXRoIGN1c3RvbWVyLW1hbmFnZWQga2V5cyAoQ01LcylcbiAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJrbXM6RGVjcnlwdFwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICBcImttczpWaWFTZXJ2aWNlXCI6IFtcbiAgICAgICAgICAgICAgYHNzbS4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsXG4gICAgICAgICAgICAgIGBzZWNyZXRzbWFuYWdlci4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBleGVjdXRpb25Sb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHRhc2sgcm9sZSBmb3IgYXBwbGljYXRpb24gY29kZSBydW5uaW5nIGluIHRoZSBjb250YWluZXIuXG4gICAqIFRoaXMgcm9sZSBpcyBhc3N1bWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgbm90IHRoZSBFQ1MgYWdlbnQuXG4gICAqIEluY2x1ZGVzIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMgcGx1cyBhbnkgc2VydmljZS1zcGVjaWZpYyBwb2xpY2llcy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVGFza1JvbGUoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBSb2xlIHtcbiAgICBjb25zdCB0YXNrUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke3NlcnZpY2VOYW1lfVRhc2tSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImVjcy10YXNrcy5hbWF6b25hd3MuY29tXCIpXG4gICAgfSk7XG5cbiAgICAvLyBTU00gcGVybWlzc2lvbnMgZm9yIEVDUyBFeGVjIChlY3MgZXhlY3V0ZS1jb21tYW5kKVxuICAgIHRhc2tSb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVDb250cm9sQ2hhbm5lbFwiLFxuICAgICAgICAgIFwic3NtbWVzc2FnZXM6Q3JlYXRlRGF0YUNoYW5uZWxcIixcbiAgICAgICAgICBcInNzbW1lc3NhZ2VzOk9wZW5Db250cm9sQ2hhbm5lbFwiLFxuICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkRhdGFDaGFubmVsXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoc2VydmljZVByb3BzLnRhc2tSb2xlSW5saW5lUG9saWNpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW3BvbGljeU5hbWUsIHBvbGljeURvY3VtZW50XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgc2VydmljZVByb3BzLnRhc2tSb2xlSW5saW5lUG9saWNpZXNcbiAgICAgICkpIHtcbiAgICAgICAgdGFza1JvbGUuYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgICAgIG5ldyBQb2xpY3kodGhpcywgYCR7c2VydmljZU5hbWV9JHtwb2xpY3lOYW1lfWAsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBwb2xpY3lEb2N1bWVudFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlcnZpY2VQcm9wcy50YXNrUm9sZU1hbmFnZWRQb2xpY2llcykge1xuICAgICAgZm9yIChjb25zdCBwb2xpY3kgb2Ygc2VydmljZVByb3BzLnRhc2tSb2xlTWFuYWdlZFBvbGljaWVzKSB7XG4gICAgICAgIHRhc2tSb2xlLmFkZE1hbmFnZWRQb2xpY3kocG9saWN5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFza1JvbGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhc2tEZWZpbml0aW9uKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgZXhlY3V0aW9uUm9sZTogUm9sZSxcbiAgICB0YXNrUm9sZTogUm9sZVxuICApOiBGYXJnYXRlVGFza0RlZmluaXRpb24gfCBFYzJUYXNrRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgY3B1ID0gc2VydmljZVByb3BzLmNwdSB8fCAyNTY7XG4gICAgY29uc3QgbWVtb3J5TGltaXRNaUIgPSBzZXJ2aWNlUHJvcHMubWVtb3J5TGltaXRNaUIgfHwgNTEyO1xuXG4gICAgaWYgKHRoaXMuaXNTZXJ2aWNlRmFyZ2F0ZShzZXJ2aWNlUHJvcHMpKSB7XG4gICAgICByZXR1cm4gbmV3IEZhcmdhdGVUYXNrRGVmaW5pdGlvbih0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsIHtcbiAgICAgICAgZmFtaWx5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfS0ke3NlcnZpY2VOYW1lfWAsXG4gICAgICAgIGNwdSxcbiAgICAgICAgbWVtb3J5TGltaXRNaUIsXG4gICAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICAgIHRhc2tSb2xlLFxuICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IENwdUFyY2hpdGVjdHVyZS5BUk02NCxcbiAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IE9wZXJhdGluZ1N5c3RlbUZhbWlseS5MSU5VWFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBFYzJUYXNrRGVmaW5pdGlvbih0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsIHtcbiAgICAgICAgZmFtaWx5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfS0ke3NlcnZpY2VOYW1lfWAsXG4gICAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICAgIHRhc2tSb2xlLFxuICAgICAgICAuLi4odGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkICYmIHsgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLkhPU1QgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29udGFpbmVyc1RvVGFzayhcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIHRhc2tEZWZpbml0aW9uOiBGYXJnYXRlVGFza0RlZmluaXRpb24gfCBFYzJUYXNrRGVmaW5pdGlvblxuICApOiB7XG4gICAgY29udGFpbmVyczogQ29udGFpbmVyRGVmaW5pdGlvbltdO1xuICAgIHByaW1hcnlDb250YWluZXI/OiBDb250YWluZXJEZWZpbml0aW9uO1xuICB9IHtcbiAgICBjb25zdCBjb250YWluZXJzOiBDb250YWluZXJEZWZpbml0aW9uW10gPSBbXTtcbiAgICBsZXQgcHJpbWFyeUNvbnRhaW5lcjogQ29udGFpbmVyRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgY29udGFpbmVyQ29uZmlnIG9mIHNlcnZpY2VQcm9wcy5jb250YWluZXJzKSB7XG4gICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0Q29udGFpbmVySW1hZ2UoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBjb250YWluZXJDb25maWcsXG4gICAgICAgIHNlcnZpY2VQcm9wc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzRmlyc3RXaXRoUG9ydCA9XG4gICAgICAgICFwcmltYXJ5Q29udGFpbmVyICYmIGNvbnRhaW5lckNvbmZpZy5wb3J0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIEVjc1NlY3JldD4gPSB7fTtcbiAgICAgIGlmIChjb250YWluZXJDb25maWcuc2VjcmV0c0ltcG9ydCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHNlY3JldEltcG9ydF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgY29udGFpbmVyQ29uZmlnLnNlY3JldHNJbXBvcnRcbiAgICAgICAgKSkge1xuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX0ke2NvbnRhaW5lckNvbmZpZy5uYW1lfSR7a2V5fVNlY3JldGAsXG4gICAgICAgICAgICBzZWNyZXRJbXBvcnQubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2VjcmV0c1trZXldID0gRWNzU2VjcmV0LmZyb21TZWNyZXRzTWFuYWdlcihcbiAgICAgICAgICAgIHNlY3JldCxcbiAgICAgICAgICAgIHNlY3JldEltcG9ydC5maWVsZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRhaW5lckNvbmZpZy5zZWNyZXRzICYmIGNvbnRhaW5lckNvbmZpZy5zZWNyZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGNvbnRhaW5lckNvbmZpZy5zZWNyZXRzSW1wb3J0KSB7XG4gICAgICAgICAgY29uc3Qgc2VjcmV0c0ltcG9ydEtleXMgPSBPYmplY3Qua2V5cyhjb250YWluZXJDb25maWcuc2VjcmV0c0ltcG9ydCk7XG4gICAgICAgICAgY29uc3QgZHVwbGljYXRlS2V5cyA9IGNvbnRhaW5lckNvbmZpZy5zZWNyZXRzLmZpbHRlcigoa2V5KSA9PlxuICAgICAgICAgICAgc2VjcmV0c0ltcG9ydEtleXMuaW5jbHVkZXMoa2V5KVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGR1cGxpY2F0ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQ29udGFpbmVyICcke2NvbnRhaW5lckNvbmZpZy5uYW1lfScgaW4gc2VydmljZSAnJHtzZXJ2aWNlTmFtZX0nIGhhcyBkdXBsaWNhdGUgc2VjcmV0IGtleXMgYCArXG4gICAgICAgICAgICAgICAgYGRlZmluZWQgaW4gYm90aCBzZWNyZXRzIGFuZCBzZWNyZXRzSW1wb3J0OiAke2R1cGxpY2F0ZUtleXMuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgICAgICAgYEVhY2ggc2VjcmV0IGtleSBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYm90aCBzb3VyY2VzLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3NtU2VjcmV0c1BhdGggPSB0aGlzLmRlcml2ZVNzbVNlY3JldHNQYXRoKFxuICAgICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICAgIHNlcnZpY2VQcm9wcy5zc21TZWNyZXRzUGF0aFxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBjb250YWluZXJDb25maWcuc2VjcmV0cykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtUGF0aCA9IGAke3NzbVNlY3JldHNQYXRofS8ke3NlY3JldE5hbWV9YDtcbiAgICAgICAgICBjb25zdCBwYXJhbSA9IFN0cmluZ1BhcmFtZXRlci5mcm9tU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9JHtjb250YWluZXJDb25maWcubmFtZX0ke3NlY3JldE5hbWV9U3NtUGFyYW1gLFxuICAgICAgICAgICAgeyBwYXJhbWV0ZXJOYW1lOiBwYXJhbVBhdGggfVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2VjcmV0c1tzZWNyZXROYW1lXSA9IEVjc1NlY3JldC5mcm9tU3NtUGFyYW1ldGVyKHBhcmFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IGNvbnRhaW5lckNvbmZpZy5uYW1lLFxuICAgICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgICAgc3RyZWFtUHJlZml4OiBgL2Vjcy8ke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LyR7c2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogY29udGFpbmVyQ29uZmlnLmVudmlyb25tZW50LFxuICAgICAgICAgIHNlY3JldHMsXG4gICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmNvbW1hbmQsXG4gICAgICAgICAgZW50cnlQb2ludDogY29udGFpbmVyQ29uZmlnLmVudHJ5UG9pbnQsXG4gICAgICAgICAgZXNzZW50aWFsOiBjb250YWluZXJDb25maWcuZXNzZW50aWFsID8/IHRydWUsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVja1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWw6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbClcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay50aW1lb3V0XG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZXRyaWVzOiBjb250YWluZXJDb25maWcuaGVhbHRoQ2hlY2sucmV0cmllcyxcbiAgICAgICAgICAgICAgICBzdGFydFBlcmlvZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kXG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uKHRoaXMuaXNTZXJ2aWNlRWMyKHNlcnZpY2VQcm9wcykgJiYge1xuICAgICAgICAgICAgbWVtb3J5TGltaXRNaUI6IHNlcnZpY2VQcm9wcy5lYzJDb25maWc/Lm1lbW9yeUxpbWl0TWlCID8/IDEwMjRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAoY29udGFpbmVyQ29uZmlnLnBvcnQpIHtcbiAgICAgICAgY29udGFpbmVyLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgICAgICAgY29udGFpbmVyUG9ydDogY29udGFpbmVyQ29uZmlnLnBvcnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ZpcnN0V2l0aFBvcnQpIHtcbiAgICAgICAgcHJpbWFyeUNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGFpbmVycywgcHJpbWFyeUNvbnRhaW5lciB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250YWluZXJJbWFnZShcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIGNvbnRhaW5lckNvbmZpZzogRWNzQ2x1c3RlckNvbnRhaW5lckNvbmZpZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBDb250YWluZXJJbWFnZSB7XG4gICAgY29uc3QgaW1hZ2VTb3VyY2UgPVxuICAgICAgY29udGFpbmVyQ29uZmlnLmltYWdlIHx8IHNlcnZpY2VQcm9wcy5pbWFnZSB8fCB0aGlzLnByb3BzLmVjclJlcG9zaXRvcnk7XG5cbiAgICBpZiAoIWltYWdlU291cmNlKSB7XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGltYWdlIHRhZyB3aXRoIG9wdGlvbmFsIGRvY2tlclRhcmdldCBzdWZmaXhcbiAgICAvLyBGb3JtYXQ6IDxzZXJ2aWNlPi1bPHRhcmdldD4tXWxhdGVzdFxuICAgIGNvbnN0IHRhcmdldFN1ZmZpeCA9IHNlcnZpY2VQcm9wcy5kb2NrZXJUYXJnZXRcbiAgICAgID8gYC0ke3NlcnZpY2VQcm9wcy5kb2NrZXJUYXJnZXQudG9Mb3dlckNhc2UoKX1gXG4gICAgICA6IFwiXCI7XG4gICAgY29uc3QgaW1hZ2VUYWcgPSBgJHtzZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpfSR7dGFyZ2V0U3VmZml4fS1sYXRlc3RgO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZVNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgaXNGdWxsUmVnaXN0cnlVcmwgPVxuICAgICAgICAoaW1hZ2VTb3VyY2UuaW5jbHVkZXMoXCIvXCIpICYmICFpbWFnZVNvdXJjZS5pbmNsdWRlcyhcIi5cIikpIHx8IC8vIERvY2tlciBIdWI6IGFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVxuICAgICAgICBpbWFnZVNvdXJjZS5zdGFydHNXaXRoKFwicHVibGljLmVjci5hd3MvXCIpIHx8IC8vIFB1YmxpYyBFQ1I6IHB1YmxpYy5lY3IuYXdzL2ZqYWxsL3dlbGNvbWVcbiAgICAgICAgaW1hZ2VTb3VyY2UuaW5jbHVkZXMoXCIuZGtyLmVjci5cIik7IC8vIFByaXZhdGUgRUNSIGZ1bGwgVVJMOiAxMjM0NTY3ODkwMTIuZGtyLmVjci51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9yZXBvOnRhZ1xuXG4gICAgICBpZiAoaXNGdWxsUmVnaXN0cnlVcmwpIHtcbiAgICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShpbWFnZVNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoXG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7c2VydmljZU5hbWV9JHtjb250YWluZXJDb25maWcubmFtZX1FY3JSZXBvYCxcbiAgICAgICAgICBpbWFnZVNvdXJjZVxuICAgICAgICApLFxuICAgICAgICBpbWFnZVRhZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2VTb3VyY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoaW1hZ2VTb3VyY2UsIGltYWdlVGFnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VTb3VyY2UgYXMgQ29udGFpbmVySW1hZ2U7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNlcnZpY2UoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wcyxcbiAgICB0YXNrRGVmaW5pdGlvbjogRmFyZ2F0ZVRhc2tEZWZpbml0aW9uIHwgRWMyVGFza0RlZmluaXRpb25cbiAgKTogRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlIHtcbiAgICBjb25zdCBkZXNpcmVkQ291bnQgPSBzZXJ2aWNlUHJvcHMuZGVzaXJlZENvdW50ID8/IDI7XG4gICAgY29uc3QgZWZmZWN0aXZlUHJvdmlkZXIgPSB0aGlzLmdldFNlcnZpY2VDYXBhY2l0eVByb3ZpZGVyKHNlcnZpY2VQcm9wcyk7XG5cbiAgICBpZiAodGhpcy5pc1NlcnZpY2VGYXJnYXRlKHNlcnZpY2VQcm9wcykpIHtcbiAgICAgIGNvbnN0IGhhc05hdCA9IHRoaXMudnBjSGFzTmF0R2F0ZXdheXMoKTtcbiAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgRmFyZ2F0ZVNlcnZpY2UodGhpcywgYCR7c2VydmljZU5hbWV9U2VydmljZWAsIHtcbiAgICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgICB0YXNrRGVmaW5pdGlvbjogdGFza0RlZmluaXRpb24gYXMgRmFyZ2F0ZVRhc2tEZWZpbml0aW9uLFxuICAgICAgICBkZXNpcmVkQ291bnQsXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogaGFzTmF0XG4gICAgICAgICAgICA/IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgICAgOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9LFxuICAgICAgICBhc3NpZ25QdWJsaWNJcDogIWhhc05hdCxcbiAgICAgICAgY2FwYWNpdHlQcm92aWRlclN0cmF0ZWdpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiBlZmZlY3RpdmVQcm92aWRlcixcbiAgICAgICAgICAgIHdlaWdodDogMVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgcHJvcGFnYXRlVGFnczogUHJvcGFnYXRlZFRhZ1NvdXJjZS5TRVJWSUNFLFxuICAgICAgICBjaXJjdWl0QnJlYWtlcjogeyBlbmFibGU6IHRydWUsIHJvbGxiYWNrOiB0cnVlIH0sXG4gICAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiB0cnVlLFxuICAgICAgICBlbmFibGVFeGVjdXRlQ29tbWFuZDogdHJ1ZSxcbiAgICAgICAgaGVhbHRoQ2hlY2tHcmFjZVBlcmlvZDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtaW5IZWFsdGh5UGVyY2VudDogMTAwLFxuICAgICAgICBtYXhIZWFsdGh5UGVyY2VudDogMjAwXG4gICAgICB9KTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsIHtcbiAgICAgICAga2V5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsXG4gICAgICAgIGV4cG9ydE5hbWU6IGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1TZXJ2aWNlQXJuYCxcbiAgICAgICAgdmFsdWU6IHNlcnZpY2Uuc2VydmljZUFybixcbiAgICAgICAgZGVzY3JpcHRpb246IGBFQ1MgU2VydmljZSBBUk4gZm9yICR7c2VydmljZU5hbWV9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYXNnUHJvdmlkZXIgPSB0aGlzLmdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlcihzZXJ2aWNlUHJvcHMpO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IEVjMlNlcnZpY2UodGhpcywgYCR7c2VydmljZU5hbWV9U2VydmljZWAsIHtcbiAgICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgICB0YXNrRGVmaW5pdGlvbjogdGFza0RlZmluaXRpb24gYXMgRWMyVGFza0RlZmluaXRpb24sXG4gICAgICAgIGRlc2lyZWRDb3VudCxcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVnaWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogYXNnUHJvdmlkZXIuY2FwYWNpdHlQcm92aWRlck5hbWUsXG4gICAgICAgICAgICB3ZWlnaHQ6IDFcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHByb3BhZ2F0ZVRhZ3M6IFByb3BhZ2F0ZWRUYWdTb3VyY2UuU0VSVklDRSxcbiAgICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgZW5hYmxlOiB0cnVlLCByb2xsYmFjazogdHJ1ZSB9LFxuICAgICAgICBwbGFjZW1lbnRTdHJhdGVnaWVzOiBbUGxhY2VtZW50U3RyYXRlZ3kuc3ByZWFkQWNyb3NzSW5zdGFuY2VzKCldLFxuICAgICAgICBlbmFibGVFQ1NNYW5hZ2VkVGFnczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDEwMCxcbiAgICAgICAgbWF4SGVhbHRoeVBlcmNlbnQ6IDIwMFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLCB7XG4gICAgICAgIGtleTogYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLFxuICAgICAgICBleHBvcnROYW1lOiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsXG4gICAgICAgIHZhbHVlOiBzZXJ2aWNlLnNlcnZpY2VBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRUNTIFNlcnZpY2UgQVJOIGZvciAke3NlcnZpY2VOYW1lfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclNlcnZpY2VXaXRoQUxCKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgc2VydmljZTogRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlLFxuICAgIHByaW1hcnlDb250YWluZXI6IENvbnRhaW5lckRlZmluaXRpb25cbiAgKTogSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAge1xuICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPSBwcmltYXJ5Q29udGFpbmVyLmNvbnRhaW5lclBvcnQ7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2tQYXRoID0gc2VydmljZVByb3BzLnJvdXRpbmc/LmhlYWx0aENoZWNrUGF0aCB8fCBcIi9cIjtcblxuICAgIGNvbnN0IHNlcnZpY2VzV2l0aFBvcnRzID0gdGhpcy5wcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgICBzLmNvbnRhaW5lcnMuc29tZSgoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgICBjb25zdCBpc1NpbmdsZVNlcnZpY2UgPSBzZXJ2aWNlc1dpdGhQb3J0cy5sZW5ndGggPT09IDE7XG5cbiAgICBjb25zdCBoZWFsdGhDaGVja0NvbmZpZyA9IHRoaXMuaXNTZXJ2aWNlRWMyKHNlcnZpY2VQcm9wcylcbiAgICAgID8ge1xuICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgICAgICBoZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgICAgcGF0aDogaGVhbHRoQ2hlY2tQYXRoLFxuICAgICAgICAgIHBvcnQ6IFwidHJhZmZpYy1wb3J0XCIgYXMgY29uc3QsXG4gICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxNSlcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgaW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgICAgICBwYXRoOiBoZWFsdGhDaGVja1BhdGgsXG4gICAgICAgICAgcG9ydDogYCR7Y29udGFpbmVyUG9ydH1gLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApXG4gICAgICAgIH07XG5cbiAgICBpZiAoaXNTaW5nbGVTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciEuYWRkVGFyZ2V0cyhcbiAgICAgICAgYCR7c2VydmljZU5hbWV9VGFyZ2V0R3JvdXBgLFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0czogW1xuICAgICAgICAgICAgc2VydmljZS5sb2FkQmFsYW5jZXJUYXJnZXQoe1xuICAgICAgICAgICAgICBjb250YWluZXJOYW1lOiBwcmltYXJ5Q29udGFpbmVyLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcnRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwb3J0OiBjb250YWluZXJQb3J0LFxuICAgICAgICAgIHByb3RvY29sOiBBcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGhlYWx0aENoZWNrQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByaW9yaXR5ID0gc2VydmljZVByb3BzLnJvdXRpbmc/LnByaW9yaXR5IHx8IHRoaXMubmV4dFByaW9yaXR5Kys7XG5cbiAgICAgIGNvbnN0IHRhcmdldEdyb3VwID0gdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciEuYWRkVGFyZ2V0cyhcbiAgICAgICAgYCR7c2VydmljZU5hbWV9VGFyZ2V0c2AsXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXRzOiBbXG4gICAgICAgICAgICBzZXJ2aWNlLmxvYWRCYWxhbmNlclRhcmdldCh7XG4gICAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHByaW1hcnlDb250YWluZXIuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgICAgY29udGFpbmVyUG9ydFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBvcnQ6IGNvbnRhaW5lclBvcnQsXG4gICAgICAgICAgcHJvdG9jb2w6IEFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgICAgICBoZWFsdGhDaGVjazogaGVhbHRoQ2hlY2tDb25maWcsXG4gICAgICAgICAgY29uZGl0aW9uczogdGhpcy5idWlsZFJvdXRpbmdDb25kaXRpb25zKHNlcnZpY2VQcm9wcyksXG4gICAgICAgICAgcHJpb3JpdHlcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRhcmdldEdyb3VwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3V0aW5nQ29uZGl0aW9ucyhcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBMaXN0ZW5lckNvbmRpdGlvbltdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBMaXN0ZW5lckNvbmRpdGlvbltdID0gW107XG5cbiAgICBpZiAoc2VydmljZVByb3BzLnJvdXRpbmc/LnBhdGgpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgTGlzdGVuZXJDb25kaXRpb24ucGF0aFBhdHRlcm5zKFtzZXJ2aWNlUHJvcHMucm91dGluZy5wYXRoXSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzZXJ2aWNlUHJvcHMucm91dGluZz8uaG9zdCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBMaXN0ZW5lckNvbmRpdGlvbi5ob3N0SGVhZGVycyhbc2VydmljZVByb3BzLnJvdXRpbmcuaG9zdF0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZXJ2aWNlU2NhbGluZyhcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIHNlcnZpY2U6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZVxuICApOiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3kge1xuICAgIGNvbnN0IHNjYWxhYmxlVGFyZ2V0ID0gbmV3IFNjYWxhYmxlVGFyZ2V0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3NlcnZpY2VOYW1lfVNjYWxhYmxlVGFyZ2V0YCxcbiAgICAgIHtcbiAgICAgICAgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZS5FQ1MsXG4gICAgICAgIHJlc291cmNlSWQ6IGBzZXJ2aWNlLyR7dGhpcy5jbHVzdGVyLmNsdXN0ZXJOYW1lfS8ke3NlcnZpY2Uuc2VydmljZU5hbWV9YCxcbiAgICAgICAgc2NhbGFibGVEaW1lbnNpb246IFwiZWNzOnNlcnZpY2U6RGVzaXJlZENvdW50XCIsXG4gICAgICAgIG1pbkNhcGFjaXR5OiBzZXJ2aWNlUHJvcHMubWluQ2FwYWNpdHkgPz8gMixcbiAgICAgICAgbWF4Q2FwYWNpdHk6IHNlcnZpY2VQcm9wcy5tYXhDYXBhY2l0eSA/PyAxMFxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtzZXJ2aWNlTmFtZX1TY2FsaW5nUG9saWN5YCxcbiAgICAgIHtcbiAgICAgICAgc2NhbGluZ1RhcmdldDogc2NhbGFibGVUYXJnZXQsXG4gICAgICAgIHByZWRlZmluZWRNZXRyaWM6XG4gICAgICAgICAgc2VydmljZVByb3BzLnNjYWxpbmdUeXBlID09PSBTY2FsaW5nVHlwZS5NRU1PUllcbiAgICAgICAgICAgID8gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxuICAgICAgICAgICAgOiBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfQ1BVX1VUSUxJWkFUSU9OLFxuICAgICAgICB0YXJnZXRWYWx1ZTogNTAsXG4gICAgICAgIHNjYWxlSW5Db29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIHNjYWxlT3V0Q29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgVlBDIGhhcyBOQVQgZ2F0ZXdheXMuXG4gICAqIC0gRm9yIEZqYWxsIFZwYzogdXNlcyBoYXNOYXRHYXRld2F5cyBwcm9wZXJ0eVxuICAgKiAtIEZvciBvdGhlciBWUENzOiBjaGVja3MgaWYgcHJpdmF0ZSBzdWJuZXRzIGV4aXN0IChhc3N1bWVzIE5BVCBpZiBwcmVzZW50KVxuICAgKi9cbiAgcHJpdmF0ZSB2cGNIYXNOYXRHYXRld2F5cygpOiBib29sZWFuIHtcbiAgICBjb25zdCB2cGMgPSB0aGlzLmNsdXN0ZXIudnBjO1xuICAgIGlmIChcImhhc05hdEdhdGV3YXlzXCIgaW4gdnBjICYmIHR5cGVvZiB2cGMuaGFzTmF0R2F0ZXdheXMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gdnBjLmhhc05hdEdhdGV3YXlzO1xuICAgIH1cbiAgICByZXR1cm4gdnBjLnByaXZhdGVTdWJuZXRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERlcGxveWFibGVTZXJ2aWNlIG91dHB1dHMgZm9yIGRlcGxveW1lbnQgYXV0b21hdGlvbi5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgYSBEZXBsb3lhYmxlU2VydmljZSBvdXRwdXQgc28gdGhlIGRlcGxveW1lbnQgc2VydmljZVxuICAgKiBjYW4gZmluZCBhbmQgZGVwbG95IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci5cbiAgICovXG4gIGFkZERlcGxveWFibGVTZXJ2aWNlT3V0cHV0cyhwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgZm9yIChjb25zdCBbc2VydmljZU5hbWUsIHNlcnZpY2VEYXRhXSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfURlcGxveWFibGVTZXJ2aWNlYCxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1EZXBsb3lhYmxlU2VydmljZWAsXG4gICAgICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1EZXBsb3lhYmxlU2VydmljZWAsXG4gICAgICAgICAgdmFsdWU6IHNlcnZpY2VEYXRhLnNlcnZpY2Uuc2VydmljZUFybixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYERlcGxveWFibGUgRUNTIFNlcnZpY2UgQVJOIGZvciAke3NlcnZpY2VOYW1lfSBpbiAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY2FwYWNpdHkgcHJvdmlkZXIgZm9yIGEgc2VydmljZS5cbiAgICogRWFjaCBzZXJ2aWNlIE1VU1Qgc3BlY2lmeSBpdHMgb3duIGNhcGFjaXR5UHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGdldFNlcnZpY2VDYXBhY2l0eVByb3ZpZGVyKFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzXG4gICk6IEVjc0NhcGFjaXR5UHJvdmlkZXIge1xuICAgIHJldHVybiBzZXJ2aWNlUHJvcHMuY2FwYWNpdHlQcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzZXJ2aWNlIHVzZXMgYSBGYXJnYXRlIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1NlcnZpY2VGYXJnYXRlKHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFNlcnZpY2VDYXBhY2l0eVByb3ZpZGVyKHNlcnZpY2VQcm9wcyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyID09PSBcIkZBUkdBVEVcIiB8fCBwcm92aWRlciA9PT0gXCJGQVJHQVRFX1NQT1RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzZXJ2aWNlIHVzZXMgYW4gRUMyIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1NlcnZpY2VFYzIoc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXJ2aWNlQ2FwYWNpdHlQcm92aWRlcihzZXJ2aWNlUHJvcHMpID09PSBcIkVDMlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBTU00gcGF0aCBjb21wb25lbnQgZm9yIGNvcnJlY3RuZXNzLlxuICAgKiBTU00gcGFyYW1ldGVyIHBhdGhzIGhhdmUgc3BlY2lmaWMgY29uc3RyYWludHMgdGhhdCBtdXN0IGJlIGVuZm9yY2VkLlxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIHBhdGggY29tcG9uZW50IHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBOYW1lIG9mIHRoZSBmaWVsZCBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgY29tcG9uZW50IGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTc21QYXRoQ29tcG9uZW50KGNvbXBvbmVudDogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29tcG9uZW50IHx8IGNvbXBvbmVudC50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZE5hbWV9IGNhbm5vdCBiZSBlbXB0eSBmb3IgU1NNIHBhdGggZGVyaXZhdGlvbmApO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtmaWVsZE5hbWV9IGNhbm5vdCBjb250YWluIGZvcndhcmQgc2xhc2hlcyAoLykuIEludmFsaWQgdmFsdWU6IFwiJHtjb21wb25lbnR9XCIuYFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gU1NNIHBhcmFtZXRlciBuYW1lIGhpZXJhcmNoeSBsYWJlbHMgaGF2ZSBhIG1heCBsZW5ndGggb2YgMjA0OCwgYnV0IHdlIHVzZSBhIG1vcmVcbiAgICAvLyByZWFzb25hYmxlIGxpbWl0IHNpbmNlIGVhY2ggY29tcG9uZW50IGlzIGp1c3Qgb25lIHBhcnQgb2YgdGhlIHBhdGhcbiAgICBpZiAoY29tcG9uZW50Lmxlbmd0aCA+IDEyOCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkTmFtZX0gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCAoMTI4IGNoYXJhY3RlcnMpLmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIHRoZSBTU00gc2VjcmV0cyBwYXRoIGZvciBhIHNlcnZpY2UuXG4gICAqIFVzZXMgZXhwbGljaXQgcGF0aCBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlcml2ZXMgZnJvbSBhcHAvY2x1c3Rlci9zZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBUaGUgc2VydmljZSBuYW1lXG4gICAqIEBwYXJhbSBleHBsaWNpdFBhdGggLSBPcHRpb25hbCBleHBsaWNpdCBwYXRoIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIFRoZSBTU00gc2VjcmV0cyBwYXRoIChlLmcuLCAvbXlhcHAvQXBpQ2x1c3Rlci91c2VycylcbiAgICovXG4gIC8qKlxuICAgKiBDb2xsZWN0cyBhbGwgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBuYW1lcyBmcm9tIHNlY3JldHNJbXBvcnQgYWNyb3NzIGFsbCBzZXJ2aWNlcy5cbiAgICogVXNlZCB0byBzY29wZSBJQU0gcGVybWlzc2lvbnMgZm9yIGxlYXN0LXByaXZpbGVnZSBhY2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3RTZWNyZXRzTWFuYWdlclNlY3JldE5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWNyZXROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiB0aGlzLnByb3BzLnNlcnZpY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBzZXJ2aWNlLmNvbnRhaW5lcnMpIHtcbiAgICAgICAgaWYgKGNvbnRhaW5lci5zZWNyZXRzSW1wb3J0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzZWNyZXRJbXBvcnQgb2YgT2JqZWN0LnZhbHVlcyhjb250YWluZXIuc2VjcmV0c0ltcG9ydCkpIHtcbiAgICAgICAgICAgIHNlY3JldE5hbWVzLmFkZChzZWNyZXRJbXBvcnQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHNlY3JldE5hbWVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlU3NtU2VjcmV0c1BhdGgoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBleHBsaWNpdFBhdGg/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoZXhwbGljaXRQYXRoKSB7XG4gICAgICByZXR1cm4gZXhwbGljaXRQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcE5hbWUgPSB0aGlzLnByb3BzLmFwcE5hbWU7XG4gICAgaWYgKCFhcHBOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgaGFzIHNlY3JldHMgZGVmaW5lZCBidXQgbm8gc3NtU2VjcmV0c1BhdGggaXMgc2V0IGAgK1xuICAgICAgICAgIGBhbmQgYXBwTmFtZSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGUgY2x1c3Rlci4gYCArXG4gICAgICAgICAgYEVpdGhlciBzZXQgc3NtU2VjcmV0c1BhdGggb24gdGhlIHNlcnZpY2UsIG9yIHNldCBhcHBOYW1lIG9uIHRoZSBjbHVzdGVyIHByb3BzIGAgK1xuICAgICAgICAgIGB0byBlbmFibGUgYXV0b21hdGljIHBhdGggZGVyaXZhdGlvbiAoLzxhcHBOYW1lPi88Y2x1c3Rlck5hbWU+LzxzZXJ2aWNlTmFtZT4pLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZVNzbVBhdGhDb21wb25lbnQoYXBwTmFtZSwgXCJhcHBOYW1lXCIpO1xuICAgIHRoaXMudmFsaWRhdGVTc21QYXRoQ29tcG9uZW50KHRoaXMucHJvcHMuY2x1c3Rlck5hbWUsIFwiY2x1c3Rlck5hbWVcIik7XG4gICAgdGhpcy52YWxpZGF0ZVNzbVBhdGhDb21wb25lbnQoc2VydmljZU5hbWUsIFwic2VydmljZU5hbWVcIik7XG5cbiAgICByZXR1cm4gYC8ke2FwcE5hbWV9LyR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0vJHtzZXJ2aWNlTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBrZXkgZm9yIEVDMiBjb25maWcgKGZvciBBU0cgZGVkdXBsaWNhdGlvbikuXG4gICAqIFNlcnZpY2VzIHdpdGggbWF0Y2hpbmcga2V5cyBzaGFyZSBhbiBBU0cuXG4gICAqL1xuICBwcml2YXRlIGdldEVjMkNvbmZpZ0tleShlYzJDb25maWc6IEVjMkNhcGFjaXR5Q29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSBlYzJDb25maWcuaW5zdGFuY2VUeXBlID8/IFwidDMubWljcm9cIjtcbiAgICBjb25zdCBhbWlIYXJkd2FyZVR5cGUgPSBlYzJDb25maWcuYW1pSGFyZHdhcmVUeXBlID8/IFwiU1RBTkRBUkRcIjtcbiAgICByZXR1cm4gYCR7aW5zdGFuY2VUeXBlfS0ke2FtaUhhcmR3YXJlVHlwZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgY3JlYXRlcyBhbiBBU0cgY2FwYWNpdHkgcHJvdmlkZXIgZm9yIGEgc2VydmljZS5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBFQzIgY29uZmlncyBzaGFyZSB0aGUgc2FtZSBBU0cuXG4gICAqL1xuICBwcml2YXRlIGdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlcihcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBBc2dDYXBhY2l0eVByb3ZpZGVyIHtcbiAgICBjb25zdCBlYzJDb25maWcgPSBzZXJ2aWNlUHJvcHMuZWMyQ29uZmlnID8/IHt9O1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0RWMyQ29uZmlnS2V5KGVjMkNvbmZpZyk7XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYXNnQ2FwYWNpdHlQcm92aWRlcnMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VUeXBlID0gZWMyQ29uZmlnLmluc3RhbmNlVHlwZSA/PyBcInQzLm1pY3JvXCI7XG4gICAgY29uc3QgYW1pSGFyZHdhcmVUeXBlID0gZWMyQ29uZmlnLmFtaUhhcmR3YXJlVHlwZVxuICAgICAgPyBlYzJDb25maWcuYW1pSGFyZHdhcmVUeXBlID09PSBcIlNUQU5EQVJEXCJcbiAgICAgICAgPyBBbWlIYXJkd2FyZVR5cGUuU1RBTkRBUkRcbiAgICAgICAgOiBBbWlIYXJkd2FyZVR5cGUuQVJNXG4gICAgICA6IGluZmVyQW1pSGFyZHdhcmVUeXBlKGluc3RhbmNlVHlwZSk7XG4gICAgY29uc3QgbWluQ2FwYWNpdHkgPSBlYzJDb25maWcubWluQ2FwYWNpdHkgPz8gMjtcbiAgICBjb25zdCBtYXhDYXBhY2l0eSA9IGVjMkNvbmZpZy5tYXhDYXBhY2l0eSA/PyAzO1xuXG4gICAgY29uc3QgYXNnU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2tleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIil9QXNnU2VjdXJpdHlHcm91cGAsXG4gICAgICB7XG4gICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgJHtrZXl9IGF1dG8gc2NhbGluZyBncm91cGBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCkge1xuICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHRoaXMucHJvcHMuc2VydmljZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZXJ2aWNlRWMyKHNlcnZpY2UpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc2VydmljZS5jb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLnBvcnQpIHtcbiAgICAgICAgICAgICAgYXNnU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgICAgICAgICAgICBQZWVyLmFueUlwdjQoKSxcbiAgICAgICAgICAgICAgICBQb3J0LnRjcChjb250YWluZXIucG9ydCksXG4gICAgICAgICAgICAgICAgYERpcmVjdCBhY2Nlc3MgdG8gY29udGFpbmVyIHBvcnQgJHtjb250YWluZXIucG9ydH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXNnID0gbmV3IEF1dG9TY2FsaW5nR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX1BdXRvU2NhbGluZ0dyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgYXV0b1NjYWxpbmdHcm91cE5hbWU6IGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LSR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX0tQXNnYCxcbiAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgfSxcbiAgICAgICAgc2VjdXJpdHlHcm91cDogYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgICAgbWluQ2FwYWNpdHksXG4gICAgICAgIG1heENhcGFjaXR5LFxuICAgICAgICBpbnN0YW5jZVR5cGU6IG5ldyBJbnN0YW5jZVR5cGUoaW5zdGFuY2VUeXBlKSxcbiAgICAgICAgY2FwYWNpdHlSZWJhbGFuY2U6IHRydWUsXG4gICAgICAgIGluc3RhbmNlTW9uaXRvcmluZzogTW9uaXRvcmluZy5CQVNJQyxcbiAgICAgICAgbWFjaGluZUltYWdlOiBFY3NPcHRpbWl6ZWRJbWFnZS5hbWF6b25MaW51eDIoYW1pSGFyZHdhcmVUeXBlKVxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBBc2dDYXBhY2l0eVByb3ZpZGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2tleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIil9QXNnQ2FwYWNpdHlQcm92aWRlcmAsXG4gICAgICB7XG4gICAgICAgIGF1dG9TY2FsaW5nR3JvdXA6IGFzZyxcbiAgICAgICAgZW5hYmxlTWFuYWdlZERyYWluaW5nOiB0cnVlLFxuICAgICAgICBlbmFibGVNYW5hZ2VkVGVybWluYXRpb25Qcm90ZWN0aW9uOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmNsdXN0ZXIuYWRkQXNnQ2FwYWNpdHlQcm92aWRlcihwcm92aWRlcik7XG4gICAgdGhpcy5hc2dDYXBhY2l0eVByb3ZpZGVycy5zZXQoa2V5LCBwcm92aWRlcik7XG5cbiAgICBpZiAoIXRoaXMuYXV0b1NjYWxpbmdHcm91cCkge1xuICAgICAgdGhpcy5hdXRvU2NhbGluZ0dyb3VwID0gYXNnO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXNnU2VjdXJpdHlHcm91cCkge1xuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwID0gYXNnU2VjdXJpdHlHcm91cDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFueSBzZXJ2aWNlIGluIHRoZSBjbHVzdGVyIHVzZXMgYSBGYXJnYXRlIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhbnlTZXJ2aWNlVXNlc0ZhcmdhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc2VydmljZXMuc29tZSgocykgPT4gdGhpcy5pc1NlcnZpY2VGYXJnYXRlKHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIgdXNlcyBhbiBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGFueVNlcnZpY2VVc2VzRWMyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnNlcnZpY2VzLnNvbWUoKHMpID0+IHRoaXMuaXNTZXJ2aWNlRWMyKHMpKTtcbiAgfVxuXG4gIGFkZENsdXN0ZXIocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIGNvbnN0IG5lZWRzRmFyZ2F0ZSA9IHRoaXMuYW55U2VydmljZVVzZXNGYXJnYXRlKCk7XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgQ2RrQ2x1c3Rlcih0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1gLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiBwcm9wcy5jbHVzdGVyTmFtZSxcbiAgICAgIGNvbnRhaW5lckluc2lnaHRzVjI6IENvbnRhaW5lckluc2lnaHRzLkVOQUJMRUQsXG4gICAgICBlbmFibGVGYXJnYXRlQ2FwYWNpdHlQcm92aWRlcnM6IG5lZWRzRmFyZ2F0ZVxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLFxuICAgICAgdmFsdWU6IHRoaXMuY2x1c3Rlci5jbHVzdGVyQXJuXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUNsdXN0ZXJBcm5gLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUNsdXN0ZXJBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9Q2x1c3RlckFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5jbHVzdGVyLmNsdXN0ZXJBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYEVDUyBDbHVzdGVyIEFSTiBmb3IgJHtwcm9wcy5jbHVzdGVyTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICAvLyBOb3RlOiBhZGRBdXRvU2NhbGluZ0dyb3VwIHJlbW92ZWQgLSBBU0dzIGFyZSBub3cgY3JlYXRlZCBwZXItc2VydmljZSB2aWEgZ2V0T3JDcmVhdGVBc2dDYXBhY2l0eVByb3ZpZGVyXG5cbiAgYWRkTG9hZEJhbGFuY2VyKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBjb25zdCBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZSA9IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlcmA7XG4gICAgY29uc3Qgc3VwcG9ydGVkTmFtZUxlbmd0aCA9IDMyO1xuXG4gICAgbGV0IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUgPVxuICAgICAgZGVmYXVsdExvYWRCYWxhbmNlck5hbWUubGVuZ3RoID4gc3VwcG9ydGVkTmFtZUxlbmd0aFxuICAgICAgICA/IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lLnN1YnN0cmluZygwLCBzdXBwb3J0ZWROYW1lTGVuZ3RoKVxuICAgICAgICA6IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lO1xuXG4gICAgdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSA9IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUucmVwbGFjZSgvLSskLywgXCJcIik7XG5cbiAgICBjb25zdCBpc0ludGVybmFsID0gcHJvcHMuY2x1c3Rlcj8ubG9hZEJhbGFuY2VyID09PSBcImludGVybmFsXCI7XG5cbiAgICBjb25zdCBoYXNFYzJTZXJ2aWNlcyA9IHRoaXMuYW55U2VydmljZVVzZXNFYzIoKTtcblxuICAgIGlmIChoYXNFYzJTZXJ2aWNlcykge1xuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXBgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgU2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSAke3Byb3BzLmNsdXN0ZXJOYW1lfSBsb2FkIGJhbGFuY2VyYFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5hc2dTZWN1cml0eUdyb3VwKSB7XG4gICAgICAgIHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgICAgICBQb3J0LmFsbFRjcCgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd0Zyb20oXG4gICAgICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgICAgIFBvcnQudGNwUmFuZ2UoNDkxNTIsIDY1NTM1KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRCYWxhbmNlciA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgICBpbnRlcm5ldEZhY2luZzogIWlzSW50ZXJuYWwsXG4gICAgICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgICAgIGxvYWRCYWxhbmNlck5hbWU6IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUsXG4gICAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgICAgc3VibmV0VHlwZTogaXNJbnRlcm5hbFxuICAgICAgICAgICAgICA/IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgICAgICA6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlciA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgICBpbnRlcm5ldEZhY2luZzogIWlzSW50ZXJuYWwsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyTmFtZTogdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSxcbiAgICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgICBzdWJuZXRUeXBlOiBpc0ludGVybmFsXG4gICAgICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgICAgIDogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJEbnNOYW1lYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJEbnNOYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMubG9hZEJhbGFuY2VyLmxvYWRCYWxhbmNlckRuc05hbWVcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyVXJsYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJVcmxgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyVXJsYCxcbiAgICAgIHZhbHVlOiBgaHR0cDovLyR7dGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IGBMb2FkIEJhbGFuY2VyIFVSTCBmb3IgJHtwcm9wcy5jbHVzdGVyTmFtZX1gXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvcnQgbG9hZCBiYWxhbmNlciBBUk4gZm9yIG1vbml0b3JpbmdcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckFybmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyQXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyQXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBMb2FkIEJhbGFuY2VyIEFSTiBmb3IgJHtwcm9wcy5jbHVzdGVyTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERpcmVjdEFjY2Vzc091dHB1dHMocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkIHx8ICF0aGlzLmF1dG9TY2FsaW5nR3JvdXApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPVxuICAgICAgcHJvcHMuc2VydmljZXMuZmxhdE1hcCgocykgPT4gcy5jb250YWluZXJzKS5maW5kKChjKSA9PiBjLnBvcnQpPy5wb3J0IHx8XG4gICAgICAzMDAwO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BdXRvU2NhbGluZ0dyb3VwTmFtZWAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cE5hbWVgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cE5hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMuYXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUnVuOiBhd3MgYXV0b3NjYWxpbmcgZGVzY3JpYmUtYXV0by1zY2FsaW5nLWdyb3VwcyAtLWF1dG8tc2NhbGluZy1ncm91cC1uYW1lcyA8bmFtZT4gdG8gZmluZCBpbnN0YW5jZSBJUGBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGlyZWN0QWNjZXNzUG9ydGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGlyZWN0QWNjZXNzUG9ydGAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EaXJlY3RBY2Nlc3NQb3J0YCxcbiAgICAgIHZhbHVlOiBTdHJpbmcoY29udGFpbmVyUG9ydCksXG4gICAgICBkZXNjcmlwdGlvbjogYEFjY2VzcyB5b3VyIGFwcCBhdCBodHRwOi8vPEVDMi1QVUJMSUMtSVA+OiR7Y29udGFpbmVyUG9ydH1gXG4gICAgfSk7XG4gIH1cblxuICBhZGRMb2FkQmFsYW5jZXJMaXN0ZW5lcihwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRCYWxhbmNlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9ydCA9IHRoaXMuY2VydGlmaWNhdGUgPyA0NDMgOiA4MDtcblxuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBMaXN0ZW5lckFjdGlvbi5maXhlZFJlc3BvbnNlKDQwNCwge1xuICAgICAgY29udGVudFR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgbWVzc2FnZUJvZHk6IFwiTm90IEZvdW5kXCJcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNlcnRpZmljYXRlKSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxpc3RlbmVyYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgY2VydGlmaWNhdGVzOiBbdGhpcy5jZXJ0aWZpY2F0ZV0sXG4gICAgICAgICAgZGVmYXVsdEFjdGlvblxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxpc3RlbmVyYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgZGVmYXVsdEFjdGlvblxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEhvc3RlZFpvbmUocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIGNvbnN0IGRvbWFpbkNvbmZpZyA9IHByb3BzLmNsdXN0ZXI/LmRvbWFpbkNvbmZpZztcbiAgICBjb25zdCBzaW1wbGVEb21haW4gPSBwcm9wcy5jbHVzdGVyPy5kb21haW47XG5cbiAgICBpZiAoIWRvbWFpbkNvbmZpZyAmJiAhc2ltcGxlRG9tYWluKSByZXR1cm47XG5cbiAgICBjb25zdCBkb21haW5OYW1lID0gZG9tYWluQ29uZmlnPy5kb21haW5OYW1lIHx8IHNpbXBsZURvbWFpbiE7XG5cbiAgICBpZiAoIWRvbWFpbkNvbmZpZz8uaG9zdGVkWm9uZSkge1xuICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IG5ldyBGamFsbEhvc3RlZFpvbmUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUhvc3RlZFpvbmVgLFxuICAgICAgICB7XG4gICAgICAgICAgem9uZU5hbWU6IGRvbWFpbk5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5ob3N0ZWRab25lID0gaG9zdGVkWm9uZS5nZXRJbnRlcm5hbEhvc3RlZFpvbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ob3N0ZWRab25lID0gZG9tYWluQ29uZmlnLmhvc3RlZFpvbmUuZ2V0SW50ZXJuYWxIb3N0ZWRab25lKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkb21haW5Db25maWc/LmNlcnRpZmljYXRlKSB7XG4gICAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1DZXJ0aWZpY2F0ZWAsXG4gICAgICAgIHtcbiAgICAgICAgICBkb21haW5OYW1lLFxuICAgICAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMuaG9zdGVkWm9uZSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZG9tYWluQ29uZmlnKSB7XG4gICAgICBjb25zdCBsYXRlbmN5Q29uZmlnID0gZG9tYWluQ29uZmlnIGFzIExhdGVuY3lEb21haW5Db25maWc7XG4gICAgICBjb25zdCB3ZWlnaHRlZENvbmZpZyA9IGRvbWFpbkNvbmZpZyBhcyBXZWlnaHRlZERvbWFpbkNvbmZpZztcbiAgICAgIGNvbnN0IGdlb0NvbmZpZyA9IGRvbWFpbkNvbmZpZyBhcyBHZW9Mb2NhdGlvbkRvbWFpbkNvbmZpZztcblxuICAgICAgY29uc3QgaGFzUm91dGluZ1BvbGljeTogYm9vbGVhbiA9XG4gICAgICAgICEhbGF0ZW5jeUNvbmZpZz8ucmVnaW9uIHx8XG4gICAgICAgIHdlaWdodGVkQ29uZmlnPy53ZWlnaHQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAhIWdlb0NvbmZpZz8uZ2VvTG9jYXRpb247XG5cbiAgICAgIGxldCBzZXRJZGVudGlmaWVyID0gZG9tYWluQ29uZmlnLnNldElkZW50aWZpZXI7XG4gICAgICBpZiAoaGFzUm91dGluZ1BvbGljeSAmJiAhc2V0SWRlbnRpZmllcikge1xuICAgICAgICBpZiAobGF0ZW5jeUNvbmZpZz8ucmVnaW9uKSB7XG4gICAgICAgICAgc2V0SWRlbnRpZmllciA9IGAke3Byb3BzLmNsdXN0ZXJOYW1lfSR7bGF0ZW5jeUNvbmZpZy5yZWdpb259YDtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWlnaHRlZENvbmZpZz8ud2VpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRJZGVudGlmaWVyID0gYCR7cHJvcHMuY2x1c3Rlck5hbWV9V2VpZ2h0JHt3ZWlnaHRlZENvbmZpZy53ZWlnaHR9YDtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9Db25maWc/Lmdlb0xvY2F0aW9uKSB7XG4gICAgICAgICAgc2V0SWRlbnRpZmllciA9IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUdlb2A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHRoaXMuYVJlY29yZCA9IG5ldyBBUmVjb3JkKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUFSZWNvcmRgLCB7XG4gICAgICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZSxcbiAgICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgICAgbmV3IExvYWRCYWxhbmNlclRhcmdldCh0aGlzLmxvYWRCYWxhbmNlciwge1xuICAgICAgICAgICAgICBldmFsdWF0ZVRhcmdldEhlYWx0aDogaGFzUm91dGluZ1BvbGljeVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlZ2lvbjogbGF0ZW5jeUNvbmZpZz8ucmVnaW9uLFxuICAgICAgICAgIHdlaWdodDogd2VpZ2h0ZWRDb25maWc/LndlaWdodCxcbiAgICAgICAgICBnZW9Mb2NhdGlvbjogZ2VvQ29uZmlnPy5nZW9Mb2NhdGlvbixcbiAgICAgICAgICBzZXRJZGVudGlmaWVyOiBzZXRJZGVudGlmaWVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2ltcGxlRG9tYWluICYmIHRoaXMubG9hZEJhbGFuY2VyKSB7XG4gICAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BUmVjb3JkYCwge1xuICAgICAgICByZWNvcmROYW1lOiBkb21haW5OYW1lLFxuICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgICBuZXcgTG9hZEJhbGFuY2VyVGFyZ2V0KHRoaXMubG9hZEJhbGFuY2VyKVxuICAgICAgICApXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogRWNzQ2x1c3RlclByb3BzXG4gICk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyA9IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IChzYi5nZXROZXR3b3JrKCkgYXMgSVZwYykgfHwgcHJvcHMudnBjXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IHRoaXMoc2IuZ2V0U3RhY2soKSwgaWQsIG5ld1Byb3BzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=