@fjall/components-infrastructure 0.79.1 → 0.80.4

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 (97) hide show
  1. package/dist/lib/app.d.ts +39 -2
  2. package/dist/lib/app.js +85 -4
  3. package/dist/lib/aspects/resourceInventory.d.ts +41 -0
  4. package/dist/lib/aspects/resourceInventory.js +56 -0
  5. package/dist/lib/config/audit.d.ts +18 -0
  6. package/dist/lib/config/audit.js +22 -0
  7. package/dist/lib/config/aws/accountId.js +3 -3
  8. package/dist/lib/config/aws/ecrDefaultImage.js +7 -7
  9. package/dist/lib/config/aws/identityCenter.js +7 -8
  10. package/dist/lib/config/aws/identityCenterGroupMembership.js +6 -6
  11. package/dist/lib/config/aws/ipam.js +3 -3
  12. package/dist/lib/config/aws/ipamPoolId.js +4 -4
  13. package/dist/lib/config/aws/organisation.js +2 -3
  14. package/dist/lib/config/aws/organisationId.js +4 -4
  15. package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
  16. package/dist/lib/patterns/aws/auditRole.js +58 -0
  17. package/dist/lib/patterns/aws/buildkite.js +12 -12
  18. package/dist/lib/patterns/aws/cdn.d.ts +133 -0
  19. package/dist/lib/patterns/aws/cdn.js +216 -0
  20. package/dist/lib/patterns/aws/compute.d.ts +32 -13
  21. package/dist/lib/patterns/aws/compute.js +24 -14
  22. package/dist/lib/patterns/aws/database.d.ts +8 -1
  23. package/dist/lib/patterns/aws/database.js +13 -5
  24. package/dist/lib/patterns/aws/dynamodb.d.ts +66 -0
  25. package/dist/lib/patterns/aws/dynamodb.js +106 -0
  26. package/dist/lib/patterns/aws/hostedZone.js +7 -2
  27. package/dist/lib/patterns/aws/index.d.ts +1 -0
  28. package/dist/lib/patterns/aws/index.js +2 -1
  29. package/dist/lib/patterns/aws/loadBalancer.d.ts +163 -0
  30. package/dist/lib/patterns/aws/loadBalancer.js +278 -0
  31. package/dist/lib/patterns/aws/managedAccount.js +3 -4
  32. package/dist/lib/patterns/aws/queue.d.ts +61 -0
  33. package/dist/lib/patterns/aws/queue.js +103 -0
  34. package/dist/lib/patterns/aws/storage.js +3 -2
  35. package/dist/lib/patterns/aws/subdomainHostedZone.js +2 -2
  36. package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
  37. package/dist/lib/resources/aws/audit/auditRole.js +44 -0
  38. package/dist/lib/resources/aws/backup/backupPlan.js +3 -4
  39. package/dist/lib/resources/aws/backup/backupVault.js +3 -4
  40. package/dist/lib/resources/aws/base/awsStack.js +1 -2
  41. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +65 -0
  42. package/dist/lib/resources/aws/cdn/cloudFront.js +135 -0
  43. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  44. package/dist/lib/resources/aws/cdn/index.js +18 -0
  45. package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.d.ts +20 -0
  46. package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.js +180 -0
  47. package/dist/lib/resources/aws/compute/ecs.d.ts +65 -11
  48. package/dist/lib/resources/aws/compute/ecs.js +293 -124
  49. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +1 -2
  50. package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -4
  51. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +1 -2
  52. package/dist/lib/resources/aws/compute/ecsSpot.js +1 -4
  53. package/dist/lib/resources/aws/compute/lambda.d.ts +10 -1
  54. package/dist/lib/resources/aws/compute/lambda.js +71 -4
  55. package/dist/lib/resources/aws/database/database.js +1 -1
  56. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  57. package/dist/lib/resources/aws/database/dynamodb.js +170 -0
  58. package/dist/lib/resources/aws/database/rdsAurora.d.ts +2 -0
  59. package/dist/lib/resources/aws/database/rdsAurora.js +9 -6
  60. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -0
  61. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +9 -8
  62. package/dist/lib/resources/aws/database/rdsDeletionWaiter.d.ts +33 -0
  63. package/dist/lib/resources/aws/database/rdsDeletionWaiter.js +74 -0
  64. package/dist/lib/resources/aws/database/rdsInstance.d.ts +2 -0
  65. package/dist/lib/resources/aws/database/rdsInstance.js +7 -4
  66. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +2 -2
  67. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  68. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  69. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  70. package/dist/lib/resources/aws/logging/cloudTrail.js +1 -1
  71. package/dist/lib/resources/aws/messaging/index.d.ts +1 -0
  72. package/dist/lib/resources/aws/messaging/index.js +18 -0
  73. package/dist/lib/resources/aws/messaging/sqs.d.ts +65 -0
  74. package/dist/lib/resources/aws/messaging/sqs.js +195 -0
  75. package/dist/lib/resources/aws/monitoring/monitoringRole.js +2 -3
  76. package/dist/lib/resources/aws/networking/ipamPool.js +1 -1
  77. package/dist/lib/resources/aws/networking/vpc.d.ts +1 -0
  78. package/dist/lib/resources/aws/networking/vpc.js +7 -3
  79. package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +20 -0
  80. package/dist/lib/resources/aws/networking/vpcEndpoint.js +59 -0
  81. package/dist/lib/resources/aws/networking/vpcEndpoints.d.ts +71 -0
  82. package/dist/lib/resources/aws/networking/vpcEndpoints.js +125 -0
  83. package/dist/lib/resources/aws/secrets/secret.js +1 -1
  84. package/dist/lib/resources/aws/storage/ecr.d.ts +1 -2
  85. package/dist/lib/resources/aws/storage/ecr.js +2 -2
  86. package/dist/lib/resources/aws/utilities/cfnOutput.test.d.ts +1 -0
  87. package/dist/lib/resources/aws/utilities/cfnOutput.test.js +102 -0
  88. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -2
  89. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  90. package/dist/lib/resources/aws/utilities/customResource.d.ts +2 -1
  91. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  92. package/dist/lib/utils/getStackOutput.js +2 -2
  93. package/dist/lib/utils/sanitizeCfnKey.d.ts +5 -0
  94. package/dist/lib/utils/sanitizeCfnKey.js +11 -0
  95. package/dist/lib/utils/tagResource.d.ts +24 -0
  96. package/dist/lib/utils/tagResource.js +30 -0
  97. package/package.json +6 -5
@@ -15,10 +15,81 @@ const aws_route53_1 = require("aws-cdk-lib/aws-route53");
15
15
  const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
16
16
  const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
17
17
  const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
18
- const cfnOutput_1 = require("../utilities/cfnOutput");
19
18
  const hostedZone_1 = require("../../../patterns/aws/hostedZone");
20
19
  const securityGroup_1 = require("../iam/securityGroup");
21
- const capacityProviderDrainWaiter_1 = require("./utilities/capacityProviderDrainWaiter");
20
+ /**
21
+ * Instance type prefixes that use ARM64 architecture (Graviton processors).
22
+ * All other prefixes are assumed to be x86-64 (STANDARD).
23
+ */
24
+ const ARM_INSTANCE_PREFIXES = [
25
+ "t4g",
26
+ "c6g",
27
+ "c6gd",
28
+ "c6gn",
29
+ "c7g",
30
+ "c7gd",
31
+ "c7gn",
32
+ "r6g",
33
+ "r6gd",
34
+ "r7g",
35
+ "r7gd",
36
+ "m6g",
37
+ "m6gd",
38
+ "m7g",
39
+ "m7gd",
40
+ "a1",
41
+ "x2gd",
42
+ "im4gn",
43
+ "is4gen",
44
+ "i4g",
45
+ "hpc7g"
46
+ ];
47
+ /**
48
+ * Infer the AMI hardware type from an EC2 instance type.
49
+ * Uses the instance type prefix to determine if it's ARM (Graviton) or x86-64.
50
+ *
51
+ * @param instanceType - EC2 instance type (e.g., "t4g.micro", "t3.small")
52
+ * @returns AmiHardwareType.ARM for Graviton instances, AmiHardwareType.STANDARD for Intel/AMD
53
+ */
54
+ function inferAmiHardwareType(instanceType) {
55
+ const prefix = instanceType.split(".")[0];
56
+ return ARM_INSTANCE_PREFIXES.includes(prefix)
57
+ ? aws_ecs_1.AmiHardwareType.ARM
58
+ : aws_ecs_1.AmiHardwareType.STANDARD;
59
+ }
60
+ /**
61
+ * CDK Aspect that fixes capacity provider deletion dependencies.
62
+ *
63
+ * This is a workaround for CDK bug #15366 where ECS services don't properly
64
+ * depend on CfnClusterCapacityProviderAssociations, causing "capacity provider
65
+ * is in use" errors during stack deletion.
66
+ *
67
+ * The aspect runs at synth time (when associations exist) and adds:
68
+ * - Service depends on CfnClusterCapacityProviderAssociations
69
+ *
70
+ * DELETE order becomes: Services → Associations → Cluster
71
+ *
72
+ * @see https://github.com/aws/aws-cdk/issues/15366
73
+ */
74
+ class CapacityProviderDependencyAspect {
75
+ constructor(cluster) {
76
+ this.cluster = cluster;
77
+ }
78
+ visit(node) {
79
+ // Find ECS services that belong to this cluster
80
+ if (node instanceof aws_ecs_1.FargateService || node instanceof aws_ecs_1.Ec2Service) {
81
+ // Find CfnClusterCapacityProviderAssociations in the cluster's descendants
82
+ const associations = this.cluster.node
83
+ .findAll()
84
+ .find((child) => child instanceof aws_ecs_1.CfnClusterCapacityProviderAssociations);
85
+ if (associations) {
86
+ // Add dependency: Service → Associations
87
+ // DELETE order: Service deleted first, then Associations
88
+ node.node.addDependency(associations);
89
+ }
90
+ }
91
+ }
92
+ }
22
93
  var Protocol;
23
94
  (function (Protocol) {
24
95
  Protocol[Protocol["HTTP"] = 0] = "HTTP";
@@ -70,19 +141,23 @@ class EcsCluster extends constructs_1.Construct {
70
141
  super(scope, id);
71
142
  // Per-service tracking
72
143
  this.services = new Map();
144
+ // Per-service ASG capacity providers (keyed by EC2 config signature)
145
+ this.asgCapacityProviders = new Map();
73
146
  this.nextPriority = 100;
74
147
  this.scope = scope;
75
148
  this.props = props;
76
- this.capacityProvider = props.capacityProvider || "FARGATE";
77
149
  this.directAccessEnabled = props.cluster?.directAccess === true;
78
150
  this.loadBalancerDisabled =
79
151
  props.cluster?.loadBalancer === false || this.directAccessEnabled;
80
152
  this.validateProps(props);
81
153
  // 1. Create the ECS cluster
82
154
  this.addCluster(props);
83
- // 2. Set up EC2 infrastructure if needed
84
- if (this.isEc2()) {
85
- this.addAutoScalingGroup(props);
155
+ // 2. Pre-create ASGs for services with EC2 capacity provider
156
+ // This ensures ASG security groups exist before load balancer creation
157
+ for (const serviceProps of props.services) {
158
+ if (serviceProps.capacityProvider === "EC2") {
159
+ this.getOrCreateAsgCapacityProvider(serviceProps);
160
+ }
86
161
  }
87
162
  // 3. Create ALB if not disabled (shared by all services)
88
163
  if (!this.loadBalancerDisabled) {
@@ -100,8 +175,13 @@ class EcsCluster extends constructs_1.Construct {
100
175
  for (const serviceProps of props.services) {
101
176
  this.addServiceToCluster(serviceProps);
102
177
  }
103
- // 5. Set up connections
178
+ // 5. Create DeployableService outputs for deployment automation
179
+ this.addDeployableServiceOutputs(props);
180
+ // 6. Set up connections
104
181
  this.setupConnections(props);
182
+ // 7. Apply aspect to fix capacity provider deletion dependencies (CDK bug workaround)
183
+ // This runs at synth time when CfnClusterCapacityProviderAssociations exists
184
+ aws_cdk_lib_1.Aspects.of(this).add(new CapacityProviderDependencyAspect(this.cluster));
105
185
  }
106
186
  /** Get the cluster's load balancer. Undefined if disabled. */
107
187
  getLoadBalancer() {
@@ -225,13 +305,20 @@ class EcsCluster extends constructs_1.Construct {
225
305
  break;
226
306
  }
227
307
  }
228
- let securityGroups = [];
229
- if (this.isEc2()) {
230
- securityGroups = [this.asgSecurityGroup];
308
+ // Collect security groups from EC2 ASGs and Fargate services
309
+ const securityGroups = [];
310
+ // Add ASG security group if any EC2 services exist
311
+ if (this.asgSecurityGroup) {
312
+ securityGroups.push(this.asgSecurityGroup);
231
313
  }
232
- else {
233
- const firstService = this.services.values().next().value;
234
- securityGroups = firstService?.service?.connections?.securityGroups || [];
314
+ // Add Fargate service security groups if any Fargate services exist
315
+ for (const serviceData of this.services.values()) {
316
+ const serviceSgs = serviceData.service?.connections?.securityGroups || [];
317
+ for (const sg of serviceSgs) {
318
+ if (!securityGroups.includes(sg)) {
319
+ securityGroups.push(sg);
320
+ }
321
+ }
235
322
  }
236
323
  this.connections = new aws_ec2_1.Connections({
237
324
  securityGroups,
@@ -324,7 +411,8 @@ class EcsCluster extends constructs_1.Construct {
324
411
  createTaskDefinition(serviceName, serviceProps, executionRole, taskRole) {
325
412
  const cpu = serviceProps.cpu || 256;
326
413
  const memoryLimitMiB = serviceProps.memoryLimitMiB || 512;
327
- if (this.isFargate()) {
414
+ // Use per-service capacity provider check
415
+ if (this.isServiceFargate(serviceProps)) {
328
416
  return new aws_ecs_1.FargateTaskDefinition(this, `${serviceName}TaskDefinition`, {
329
417
  family: `${this.props.clusterName}-${serviceName}`,
330
418
  cpu,
@@ -364,7 +452,7 @@ class EcsCluster extends constructs_1.Construct {
364
452
  image,
365
453
  containerName: containerConfig.name,
366
454
  logging: new aws_ecs_1.AwsLogDriver({
367
- streamPrefix: `/ecs/${this.props.clusterName}/${serviceName}/${containerConfig.name}`,
455
+ streamPrefix: `/ecs/${this.props.clusterName}/${serviceName}`,
368
456
  logRetention: 14
369
457
  }),
370
458
  environment: containerConfig.environment,
@@ -387,8 +475,8 @@ class EcsCluster extends constructs_1.Construct {
387
475
  : undefined
388
476
  }
389
477
  : undefined,
390
- ...(this.isEc2() && {
391
- memoryLimitMiB: this.props.ec2Config?.memoryLimitMiB || 1024
478
+ ...(this.isServiceEc2(serviceProps) && {
479
+ memoryLimitMiB: serviceProps.ec2Config?.memoryLimitMiB ?? 1024
392
480
  })
393
481
  });
394
482
  if (containerConfig.port) {
@@ -411,8 +499,10 @@ class EcsCluster extends constructs_1.Construct {
411
499
  }
412
500
  const imageTag = `${serviceName.toLowerCase()}-latest`;
413
501
  if (typeof imageSource === "string") {
414
- // Check if it's an ECR repository name or a public image
415
- if (imageSource.includes("/") && !imageSource.includes(".")) {
502
+ // Check if it's a registry image (public Docker Hub or public ECR) vs private ECR repository name
503
+ const isPublicImage = (imageSource.includes("/") && !imageSource.includes(".")) || // Docker Hub: amazon/amazon-ecs-sample
504
+ imageSource.startsWith("public.ecr.aws/"); // Public ECR: public.ecr.aws/fjall/welcome
505
+ if (isPublicImage) {
416
506
  return aws_ecs_1.ContainerImage.fromRegistry(imageSource);
417
507
  }
418
508
  return aws_ecs_1.ContainerImage.fromEcrRepository(aws_ecr_1.Repository.fromRepositoryName(this, `${serviceName}${containerConfig.name}EcrRepo`, imageSource), imageTag);
@@ -425,15 +515,24 @@ class EcsCluster extends constructs_1.Construct {
425
515
  }
426
516
  createService(serviceName, serviceProps, taskDefinition) {
427
517
  const desiredCount = serviceProps.desiredCount ?? 2;
428
- if (this.isFargate()) {
518
+ const effectiveProvider = this.getServiceCapacityProvider(serviceProps);
519
+ // Use per-service capacity provider check
520
+ if (this.isServiceFargate(serviceProps)) {
521
+ const hasNat = this.vpcHasNatGateways();
429
522
  const service = new aws_ecs_1.FargateService(this, `${serviceName}Service`, {
430
523
  cluster: this.cluster,
431
524
  taskDefinition: taskDefinition,
432
525
  desiredCount,
433
526
  serviceName,
527
+ vpcSubnets: {
528
+ subnetType: hasNat
529
+ ? aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
530
+ : aws_ec2_1.SubnetType.PUBLIC
531
+ },
532
+ assignPublicIp: !hasNat,
434
533
  capacityProviderStrategies: [
435
534
  {
436
- capacityProvider: this.capacityProvider,
535
+ capacityProvider: effectiveProvider,
437
536
  weight: 1
438
537
  }
439
538
  ],
@@ -445,24 +544,17 @@ class EcsCluster extends constructs_1.Construct {
445
544
  minHealthyPercent: 100,
446
545
  maxHealthyPercent: 200
447
546
  });
448
- new cfnOutput_1.CfnOutput(this, `${serviceName}ServiceArn`, {
449
- key: `${serviceName}ServiceArn`,
547
+ new aws_cdk_lib_1.CfnOutput(this, `${this.props.clusterName}${serviceName}ServiceArn`, {
548
+ key: `${this.props.clusterName}${serviceName}ServiceArn`,
450
549
  exportName: `${this.props.clusterName}${serviceName}ServiceArn`,
451
550
  value: service.serviceArn,
452
551
  description: `ECS Service ARN for ${serviceName}`
453
552
  });
454
- // Fargate service depends on capacity provider associations:
455
- // - CREATE: Associations created first, then Service (correct - providers ready before service)
456
- // - DELETE: Service deleted first, then Associations (correct - services gone before disassociation)
457
- // This ensures CloudFormation deletes all services BEFORE attempting to remove
458
- // the FARGATE/FARGATE_SPOT capacity provider associations from the cluster.
459
- // See: https://github.com/aws/aws-cdk/issues/15366
460
- if (this.fargateCapacityProviderAssociations) {
461
- service.node.addDependency(this.fargateCapacityProviderAssociations);
462
- }
463
553
  return service;
464
554
  }
465
555
  else {
556
+ // Get or create ASG capacity provider for this service's EC2 config
557
+ const asgProvider = this.getOrCreateAsgCapacityProvider(serviceProps);
466
558
  const service = new aws_ecs_1.Ec2Service(this, `${serviceName}Service`, {
467
559
  cluster: this.cluster,
468
560
  taskDefinition: taskDefinition,
@@ -470,7 +562,7 @@ class EcsCluster extends constructs_1.Construct {
470
562
  serviceName,
471
563
  capacityProviderStrategies: [
472
564
  {
473
- capacityProvider: this.asgCapacityProvider.capacityProviderName,
565
+ capacityProvider: asgProvider.capacityProviderName,
474
566
  weight: 1
475
567
  }
476
568
  ],
@@ -483,20 +575,12 @@ class EcsCluster extends constructs_1.Construct {
483
575
  minHealthyPercent: 100,
484
576
  maxHealthyPercent: 200
485
577
  });
486
- new cfnOutput_1.CfnOutput(this, `${serviceName}ServiceArn`, {
487
- key: `${serviceName}ServiceArn`,
578
+ new aws_cdk_lib_1.CfnOutput(this, `${this.props.clusterName}${serviceName}ServiceArn`, {
579
+ key: `${this.props.clusterName}${serviceName}ServiceArn`,
488
580
  exportName: `${this.props.clusterName}${serviceName}ServiceArn`,
489
581
  value: service.serviceArn,
490
582
  description: `ECS Service ARN for ${serviceName}`
491
583
  });
492
- // Service depends on DrainWaiter:
493
- // - CREATE: DrainWaiter created first, then Service (correct - infra ready before service)
494
- // - DELETE: Service deleted first, then DrainWaiter runs (correct - services gone before drain)
495
- // This ensures CloudFormation deletes all services BEFORE the DrainWaiter Lambda runs,
496
- // which then disassociates the capacity provider before it's deleted.
497
- if (this.drainWaiter) {
498
- service.node.addDependency(this.drainWaiter);
499
- }
500
584
  return service;
501
585
  }
502
586
  }
@@ -506,7 +590,8 @@ class EcsCluster extends constructs_1.Construct {
506
590
  // Determine routing conditions
507
591
  const servicesWithPorts = this.props.services.filter((s) => s.containers.some((c) => c.port !== undefined));
508
592
  const isSingleService = servicesWithPorts.length === 1;
509
- const healthCheckConfig = this.isEc2()
593
+ // Use per-service capacity provider check for health check config
594
+ const healthCheckConfig = this.isServiceEc2(serviceProps)
510
595
  ? {
511
596
  interval: aws_cdk_lib_1.Duration.seconds(30),
512
597
  healthyThresholdCount: 3,
@@ -582,74 +667,123 @@ class EcsCluster extends constructs_1.Construct {
582
667
  scaleOutCooldown: aws_cdk_lib_1.Duration.seconds(60)
583
668
  });
584
669
  }
585
- isEc2() {
586
- return this.capacityProvider === "EC2";
670
+ /**
671
+ * Checks if any service in the cluster uses EC2 capacity provider.
672
+ */
673
+ hasAnyEc2Service() {
674
+ return this.props.services.some((s) => s.capacityProvider === "EC2");
587
675
  }
588
- isFargate() {
589
- return (this.capacityProvider === "FARGATE" ||
590
- this.capacityProvider === "FARGATE_SPOT");
676
+ /**
677
+ * Checks if any service in the cluster uses Fargate capacity provider.
678
+ */
679
+ hasAnyFargateService() {
680
+ return this.props.services.some((s) => s.capacityProvider === "FARGATE" ||
681
+ s.capacityProvider === "FARGATE_SPOT");
591
682
  }
592
- addCluster(props) {
593
- this.cluster = new aws_ecs_1.Cluster(this, `${props.clusterName}`, {
594
- vpc: props.vpc,
595
- clusterName: props.clusterName,
596
- containerInsightsV2: aws_ecs_1.ContainerInsights.ENABLED,
597
- enableFargateCapacityProviders: this.isFargate()
598
- });
599
- // For Fargate clusters, find the internal CfnClusterCapacityProviderAssociations
600
- // that CDK creates when enableFargateCapacityProviders is true.
601
- // We need this reference to establish proper deletion dependencies.
602
- if (this.isFargate()) {
603
- // CDK creates this as a child of the cluster with a specific naming pattern
604
- const children = this.cluster.node.children;
605
- for (const child of children) {
606
- if (child instanceof aws_ecs_1.CfnClusterCapacityProviderAssociations) {
607
- this.fargateCapacityProviderAssociations = child;
608
- break;
609
- }
610
- }
683
+ /**
684
+ * Check if the VPC has NAT gateways.
685
+ * - For Fjall Vpc: uses hasNatGateways property
686
+ * - For other VPCs: checks if private subnets exist (assumes NAT if present)
687
+ */
688
+ vpcHasNatGateways() {
689
+ const vpc = this.cluster.vpc;
690
+ // Check if it's our custom Vpc class with hasNatGateways property
691
+ if ("hasNatGateways" in vpc && typeof vpc.hasNatGateways === "boolean") {
692
+ return vpc.hasNatGateways;
611
693
  }
612
- new cfnOutput_1.CfnOutput(this, `${props.clusterName}DeployableCluster`, {
613
- key: `${props.clusterName}DeployableCluster`,
614
- exportName: `${props.clusterName}DeployableCluster`,
615
- value: this.cluster.clusterArn
616
- });
617
- new cfnOutput_1.CfnOutput(this, `${props.clusterName}ClusterArn`, {
618
- key: "ClusterArn",
619
- exportName: `${props.clusterName}ClusterArn`,
620
- value: this.cluster.clusterArn,
621
- description: `ECS Cluster ARN for ${props.clusterName}`
622
- });
694
+ // Fallback: assume NAT if private subnets exist
695
+ return vpc.privateSubnets.length > 0;
696
+ }
697
+ /**
698
+ * Create DeployableService outputs for deployment automation.
699
+ * Each service gets a DeployableService output so the deployment service
700
+ * can find and deploy all services in the cluster.
701
+ */
702
+ addDeployableServiceOutputs(props) {
703
+ for (const [serviceName, serviceData] of this.services) {
704
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}${serviceName}DeployableService`, {
705
+ key: `${props.clusterName}${serviceName}DeployableService`,
706
+ exportName: `${props.clusterName}${serviceName}DeployableService`,
707
+ value: serviceData.service.serviceArn,
708
+ description: `Deployable ECS Service ARN for ${serviceName} in ${props.clusterName}`
709
+ });
710
+ }
711
+ }
712
+ /**
713
+ * Gets the capacity provider for a service.
714
+ * Each service MUST specify its own capacityProvider.
715
+ */
716
+ getServiceCapacityProvider(serviceProps) {
717
+ return serviceProps.capacityProvider;
623
718
  }
624
- addAutoScalingGroup(props) {
625
- const ec2Config = props.ec2Config || {};
626
- const instanceType = ec2Config.instanceType || "t3.micro";
627
- const amiHardwareType = ec2Config.amiHardwareType === "STANDARD"
628
- ? aws_ecs_1.AmiHardwareType.STANDARD
629
- : aws_ecs_1.AmiHardwareType.ARM;
719
+ /**
720
+ * Checks if a service uses a Fargate capacity provider.
721
+ */
722
+ isServiceFargate(serviceProps) {
723
+ const provider = this.getServiceCapacityProvider(serviceProps);
724
+ return provider === "FARGATE" || provider === "FARGATE_SPOT";
725
+ }
726
+ /**
727
+ * Checks if a service uses an EC2 capacity provider.
728
+ */
729
+ isServiceEc2(serviceProps) {
730
+ return this.getServiceCapacityProvider(serviceProps) === "EC2";
731
+ }
732
+ /**
733
+ * Generates a unique key for EC2 config (for ASG deduplication).
734
+ * Services with matching keys share an ASG.
735
+ */
736
+ getEc2ConfigKey(ec2Config) {
737
+ const instanceType = ec2Config.instanceType ?? "t3.micro";
738
+ const amiHardwareType = ec2Config.amiHardwareType ?? "STANDARD";
739
+ return `${instanceType}-${amiHardwareType}`;
740
+ }
741
+ /**
742
+ * Gets or creates an ASG capacity provider for a service.
743
+ * Services with matching EC2 configs share the same ASG.
744
+ */
745
+ getOrCreateAsgCapacityProvider(serviceProps) {
746
+ // Get EC2 config from service (required for EC2 capacity provider)
747
+ const ec2Config = serviceProps.ec2Config ?? {};
748
+ const key = this.getEc2ConfigKey(ec2Config);
749
+ // Return existing if found
750
+ const existing = this.asgCapacityProviders.get(key);
751
+ if (existing) {
752
+ return existing;
753
+ }
754
+ // Create new ASG and capacity provider
755
+ const instanceType = ec2Config.instanceType ?? "t3.micro";
756
+ const amiHardwareType = ec2Config.amiHardwareType
757
+ ? ec2Config.amiHardwareType === "STANDARD"
758
+ ? aws_ecs_1.AmiHardwareType.STANDARD
759
+ : aws_ecs_1.AmiHardwareType.ARM
760
+ : inferAmiHardwareType(instanceType);
630
761
  const minCapacity = ec2Config.minCapacity ?? 2;
631
762
  const maxCapacity = ec2Config.maxCapacity ?? 3;
632
- this.asgSecurityGroup = new securityGroup_1.SecurityGroup(this, `AsgSecurityGroup`, {
763
+ // Create security group for this ASG
764
+ const asgSecurityGroup = new securityGroup_1.SecurityGroup(this, `${key.replace(/[^a-zA-Z0-9]/g, "")}AsgSecurityGroup`, {
633
765
  vpc: this.cluster.vpc,
634
- description: `Security group for the ${props.clusterName} auto scaling group`
766
+ description: `Security group for ${key} auto scaling group`
635
767
  });
636
- // Open container ports for direct EC2 access
768
+ // Open container ports for direct EC2 access if enabled
637
769
  if (this.directAccessEnabled) {
638
- for (const service of props.services) {
639
- for (const container of service.containers) {
640
- if (container.port) {
641
- this.asgSecurityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcp(container.port), `Direct access to container port ${container.port}`);
770
+ for (const service of this.props.services) {
771
+ if (this.isServiceEc2(service)) {
772
+ for (const container of service.containers) {
773
+ if (container.port) {
774
+ asgSecurityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcp(container.port), `Direct access to container port ${container.port}`);
775
+ }
642
776
  }
643
777
  }
644
778
  }
645
779
  }
646
- this.autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "AutoScalingGroup", {
647
- autoScalingGroupName: `${props.clusterName}AutoScalingGroup`,
780
+ const asg = new aws_autoscaling_1.AutoScalingGroup(this, `${key.replace(/[^a-zA-Z0-9]/g, "")}AutoScalingGroup`, {
781
+ autoScalingGroupName: `${this.props.clusterName}${key.replace(/[^a-zA-Z0-9]/g, "")}Asg`,
648
782
  vpc: this.cluster.vpc,
649
783
  vpcSubnets: {
650
784
  subnetType: aws_ec2_1.SubnetType.PUBLIC
651
785
  },
652
- securityGroup: this.asgSecurityGroup,
786
+ securityGroup: asgSecurityGroup,
653
787
  minCapacity,
654
788
  maxCapacity,
655
789
  instanceType: new aws_ec2_1.InstanceType(instanceType),
@@ -657,30 +791,53 @@ class EcsCluster extends constructs_1.Construct {
657
791
  instanceMonitoring: aws_autoscaling_1.Monitoring.BASIC,
658
792
  machineImage: aws_ecs_1.EcsOptimizedImage.amazonLinux2(amiHardwareType)
659
793
  });
660
- this.asgCapacityProvider = new aws_ecs_1.AsgCapacityProvider(this, "AsgCapacityProvider", {
661
- autoScalingGroup: this.autoScalingGroup,
794
+ const provider = new aws_ecs_1.AsgCapacityProvider(this, `${key.replace(/[^a-zA-Z0-9]/g, "")}AsgCapacityProvider`, {
795
+ autoScalingGroup: asg,
662
796
  enableManagedDraining: true,
663
797
  enableManagedTerminationProtection: false
664
798
  });
665
- this.cluster.addAsgCapacityProvider(this.asgCapacityProvider);
666
- // Create drain waiter custom resource that handles capacity provider cleanup during deletion.
667
- // This resource waits for ECS services to drain, then disassociates the capacity provider
668
- // from the cluster before CloudFormation attempts to delete the AsgCapacityProvider.
669
- //
670
- // Dependency chain for DELETE order:
671
- // Services deleted → DrainWaiter runs → AsgCapacityProvider deleted → Cluster deleted
672
- //
673
- // The drain waiter must depend on AsgCapacityProvider so it runs BEFORE the provider is deleted.
674
- // Services must depend on the drain waiter so they're deleted BEFORE the drain waiter runs.
675
- this.drainWaiter = new capacityProviderDrainWaiter_1.CapacityProviderDrainWaiter(this, "CapacityProviderDrainWaiter", {
799
+ this.cluster.addAsgCapacityProvider(provider);
800
+ this.asgCapacityProviders.set(key, provider);
801
+ // Store first ASG security group for backwards compatibility
802
+ if (!this.asgSecurityGroup) {
803
+ this.asgSecurityGroup = asgSecurityGroup;
804
+ }
805
+ return provider;
806
+ }
807
+ /**
808
+ * Checks if any service in the cluster uses a Fargate capacity provider.
809
+ */
810
+ anyServiceUsesFargate() {
811
+ return this.props.services.some((s) => this.isServiceFargate(s));
812
+ }
813
+ /**
814
+ * Checks if any service in the cluster uses an EC2 capacity provider.
815
+ */
816
+ anyServiceUsesEc2() {
817
+ return this.props.services.some((s) => this.isServiceEc2(s));
818
+ }
819
+ addCluster(props) {
820
+ // Enable Fargate capacity providers if ANY service uses FARGATE or FARGATE_SPOT
821
+ const needsFargate = this.anyServiceUsesFargate();
822
+ this.cluster = new aws_ecs_1.Cluster(this, `${props.clusterName}`, {
823
+ vpc: props.vpc,
676
824
  clusterName: props.clusterName,
677
- capacityProviderName: this.asgCapacityProvider.capacityProviderName
825
+ containerInsightsV2: aws_ecs_1.ContainerInsights.ENABLED,
826
+ enableFargateCapacityProviders: needsFargate
827
+ });
828
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}DeployableCluster`, {
829
+ key: `${props.clusterName}DeployableCluster`,
830
+ exportName: `${props.clusterName}DeployableCluster`,
831
+ value: this.cluster.clusterArn
832
+ });
833
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}ClusterArn`, {
834
+ key: `${props.clusterName}ClusterArn`,
835
+ exportName: `${props.clusterName}ClusterArn`,
836
+ value: this.cluster.clusterArn,
837
+ description: `ECS Cluster ARN for ${props.clusterName}`
678
838
  });
679
- // DrainWaiter depends on AsgCapacityProvider:
680
- // - CREATE: AsgCapacityProvider created first, then DrainWaiter
681
- // - DELETE: DrainWaiter deleted first (runs Lambda), then AsgCapacityProvider
682
- this.drainWaiter.node.addDependency(this.asgCapacityProvider);
683
839
  }
840
+ // Note: addAutoScalingGroup removed - ASGs are now created per-service via getOrCreateAsgCapacityProvider
684
841
  addLoadBalancer(props) {
685
842
  const defaultLoadBalancerName = `${props.clusterName}LoadBalancer`;
686
843
  const supportedNameLength = 32;
@@ -689,12 +846,18 @@ class EcsCluster extends constructs_1.Construct {
689
846
  : defaultLoadBalancerName;
690
847
  truncatedLoadBalancerName = truncatedLoadBalancerName.replace(/-+$/, "");
691
848
  const isInternal = props.cluster?.loadBalancer === "internal";
692
- if (this.isEc2()) {
849
+ // Check if ANY service uses EC2 (cluster-level or per-service)
850
+ const hasEc2Services = this.anyServiceUsesEc2();
851
+ if (hasEc2Services) {
693
852
  this.loadBalancerSecurityGroup = new securityGroup_1.SecurityGroup(this, `LoadBalancerSecurityGroup`, {
694
853
  vpc: this.cluster.vpc,
695
854
  description: `Security group for the ${props.clusterName} load balancer`
696
855
  });
697
- this.loadBalancerSecurityGroup.connections.allowTo(this.asgSecurityGroup, aws_ec2_1.Port.allTcp());
856
+ // Allow traffic to all ASG security groups
857
+ if (this.asgSecurityGroup) {
858
+ this.loadBalancerSecurityGroup.connections.allowTo(this.asgSecurityGroup, aws_ec2_1.Port.allTcp());
859
+ this.asgSecurityGroup.connections.allowFrom(this.loadBalancerSecurityGroup, aws_ec2_1.Port.tcpRange(49152, 65535));
860
+ }
698
861
  this.loadBalancer = new aws_elasticloadbalancingv2_1.ApplicationLoadBalancer(this, `${props.clusterName}LoadBalancer`, {
699
862
  vpc: this.cluster.vpc,
700
863
  internetFacing: !isInternal,
@@ -706,7 +869,6 @@ class EcsCluster extends constructs_1.Construct {
706
869
  : aws_ec2_1.SubnetType.PUBLIC
707
870
  }
708
871
  });
709
- this.asgSecurityGroup.connections.allowFrom(this.loadBalancerSecurityGroup, aws_ec2_1.Port.tcpRange(49152, 65535));
710
872
  }
711
873
  else {
712
874
  this.loadBalancer = new aws_elasticloadbalancingv2_1.ApplicationLoadBalancer(this, `${props.clusterName}LoadBalancer`, {
@@ -720,17 +882,24 @@ class EcsCluster extends constructs_1.Construct {
720
882
  }
721
883
  });
722
884
  }
723
- new cfnOutput_1.CfnOutput(this, `${props.clusterName}LoadBalancerDnsName`, {
885
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}LoadBalancerDnsName`, {
724
886
  key: `${props.clusterName}LoadBalancerDnsName`,
725
887
  exportName: `${props.clusterName}LoadBalancerDnsName`,
726
888
  value: this.loadBalancer.loadBalancerDnsName
727
889
  });
728
- new cfnOutput_1.CfnOutput(this, `${props.clusterName}LoadBalancerUrl`, {
729
- key: "LoadBalancerUrl",
890
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}LoadBalancerUrl`, {
891
+ key: `${props.clusterName}LoadBalancerUrl`,
730
892
  exportName: `${props.clusterName}LoadBalancerUrl`,
731
893
  value: `http://${this.loadBalancer.loadBalancerDnsName}`,
732
894
  description: `Load Balancer URL for ${props.clusterName}`
733
895
  });
896
+ // Export load balancer ARN for monitoring
897
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}LoadBalancerArn`, {
898
+ key: `${props.clusterName}LoadBalancerArn`,
899
+ exportName: `${props.clusterName}LoadBalancerArn`,
900
+ value: this.loadBalancer.loadBalancerArn,
901
+ description: `Load Balancer ARN for ${props.clusterName}`
902
+ });
734
903
  }
735
904
  addDirectAccessOutputs(props) {
736
905
  if (!this.directAccessEnabled || !this.autoScalingGroup)
@@ -738,14 +907,14 @@ class EcsCluster extends constructs_1.Construct {
738
907
  // Get the first container port (for user instructions)
739
908
  const containerPort = props.services.flatMap((s) => s.containers).find((c) => c.port)?.port ||
740
909
  3000;
741
- new cfnOutput_1.CfnOutput(this, `${props.clusterName}AutoScalingGroupName`, {
742
- key: "AutoScalingGroupName",
910
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}AutoScalingGroupName`, {
911
+ key: `${props.clusterName}AutoScalingGroupName`,
743
912
  exportName: `${props.clusterName}AutoScalingGroupName`,
744
913
  value: this.autoScalingGroup.autoScalingGroupName,
745
914
  description: `Run: aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names <name> to find instance IP`
746
915
  });
747
- new cfnOutput_1.CfnOutput(this, `${props.clusterName}DirectAccessPort`, {
748
- key: "DirectAccessPort",
916
+ new aws_cdk_lib_1.CfnOutput(this, `${props.clusterName}DirectAccessPort`, {
917
+ key: `${props.clusterName}DirectAccessPort`,
749
918
  exportName: `${props.clusterName}DirectAccessPort`,
750
919
  value: String(containerPort),
751
920
  description: `Access your app at http://<EC2-PUBLIC-IP>:${containerPort}`
@@ -854,4 +1023,4 @@ class EcsCluster extends constructs_1.Construct {
854
1023
  }
855
1024
  }
856
1025
  exports.default = EcsCluster;
857
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBb0I2QjtBQUM3QixpREFTNkI7QUFDN0IsMkNBQXVDO0FBRXZDLDZDQUE4QztBQUM5Qyx1RkFPZ0Q7QUFDaEQsaURBUTZCO0FBQzdCLHVGQUtnRDtBQUNoRCxpREFBMEQ7QUFDMUQsdUVBQXdEO0FBQ3hELCtFQUc0QztBQUM1Qyx5REFLaUM7QUFDakMseUVBQXFFO0FBQ3JFLGlEQUFpRDtBQUNqRCxpRUFBMkU7QUFFM0Usc0RBQW1EO0FBQ25ELGlFQUFpRjtBQUNqRix3REFBcUQ7QUFDckQseUZBQXNGO0FBSXRGLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQix1Q0FBSSxDQUFBO0lBQ0oseUNBQUssQ0FBQTtBQUNQLENBQUMsRUFIVyxRQUFRLHdCQUFSLFFBQVEsUUFHbkI7QUFFRCxJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsc0RBQTBELENBQUE7SUFDMUQsNERBQWdFLENBQUE7QUFDbEUsQ0FBQyxFQUhXLFdBQVcsMkJBQVgsV0FBVyxRQUd0QjtBQWtSRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFDSCxNQUFxQixVQUFXLFNBQVEsc0JBQVM7SUFnQy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQVpuQix1QkFBdUI7UUFDZixhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFRMUMsaUJBQVksR0FBVyxHQUFHLENBQUM7UUFLakMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFH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QUFjLEVBQUUsTUFBTTtvQkFDOUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXO29CQUNuQyxhQUFhLEVBQUUsYUFBYTtpQkFDN0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0MsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxxQkFBTyxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxXQUFXLFNBQVMsRUFBRTtnQkFDOUQsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDckIsTUFBTSxFQUFFLDBCQUFZLENBQUMsU0FBUyxDQUM1QixJQUFJLHdDQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDMUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQ1YsRUFBVSxFQUNWLEtBQXNCO1FBRXRCLE9BQU8sQ0FBQyxFQUFnQixFQUFFLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQW9CO2dCQUNoQyxHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUcsRUFBRSxDQUFDLFVBQVUsRUFBVyxJQUFJLEtBQUssQ0FBQyxHQUFHO2lCQUM1QzthQUNGLENBQUM7WUFDRixPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBNWxDRCw2QkE0bENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXdzTG9nRHJpdmVyLFxuICBDbHVzdGVyIGFzIENka0NsdXN0ZXIsXG4gIENvbnRhaW5lckltYWdlLFxuICBGYXJnYXRlU2VydmljZSxcbiAgRmFyZ2F0ZVRhc2tEZWZpbml0aW9uLFxuICBFYzJTZXJ2aWNlLFxuICBFYzJUYXNrRGVmaW5pdGlvbixcbiAgTmV0d29ya01vZGUsXG4gIFByb3BhZ2F0ZWRUYWdTb3VyY2UsXG4gIHR5cGUgUmVwb3NpdG9yeUltYWdlLFxuICB0eXBlIENvbnRhaW5lckRlZmluaXRpb24sXG4gIENvbnRhaW5lckluc2lnaHRzLFxuICBQbGFjZW1lbnRTdHJhdGVneSxcbiAgQXNnQ2FwYWNpdHlQcm92aWRlcixcbiAgRWNzT3B0aW1pemVkSW1hZ2UsXG4gIEFtaUhhcmR3YXJlVHlwZSxcbiAgQ3B1QXJjaGl0ZWN0dXJlLFxuICBPcGVyYXRpbmdTeXN0ZW1GYW1pbHksXG4gIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIHR5cGUgSVNlY3VyaXR5R3JvdXAsXG4gIHR5cGUgSVZwYyxcbiAgSW5zdGFuY2VUeXBlLFxuICBQZWVyLFxuICBQb3J0LFxuICBTdWJuZXRUeXBlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgdHlwZSBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICB0eXBlIEFwcGxpY2F0aW9uTGlzdGVuZXIsXG4gIEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxuICBBcHBsaWNhdGlvblByb3RvY29sLFxuICB0eXBlIElBcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICBMaXN0ZW5lckFjdGlvbixcbiAgTGlzdGVuZXJDb25kaXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQge1xuICBFZmZlY3QsXG4gIHR5cGUgSU1hbmFnZWRQb2xpY3ksXG4gIFBvbGljeSxcbiAgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgUHJlZGVmaW5lZE1ldHJpYyxcbiAgU2NhbGFibGVUYXJnZXQsXG4gIFNlcnZpY2VOYW1lc3BhY2UsXG4gIFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwcGxpY2F0aW9uYXV0b3NjYWxpbmdcIjtcbmltcG9ydCB7IFNlY3JldCBhcyBFY3NTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGUsXG4gIENlcnRpZmljYXRlVmFsaWRhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQVJlY29yZCxcbiAgUmVjb3JkVGFyZ2V0LFxuICB0eXBlIElIb3N0ZWRab25lLFxuICB0eXBlIEdlb0xvY2F0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgTG9hZEJhbGFuY2VyVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjclwiO1xuaW1wb3J0IHsgQXV0b1NjYWxpbmdHcm91cCwgTW9uaXRvcmluZyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcblxuaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jZm5PdXRwdXRcIjtcbmltcG9ydCB7IEhvc3RlZFpvbmUgYXMgRmphbGxIb3N0ZWRab25lIH0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9ob3N0ZWRab25lXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbS9zZWN1cml0eUdyb3VwXCI7XG5pbXBvcnQgeyBDYXBhY2l0eVByb3ZpZGVyRHJhaW5XYWl0ZXIgfSBmcm9tIFwiLi91dGlsaXRpZXMvY2FwYWNpdHlQcm92aWRlckRyYWluV2FpdGVyXCI7XG5cbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uL3NlY3JldHNcIjtcblxuZXhwb3J0IGVudW0gUHJvdG9jb2wge1xuICBIVFRQLFxuICBIVFRQU1xufVxuXG5leHBvcnQgZW51bSBTY2FsaW5nVHlwZSB7XG4gIENQVSA9IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9DUFVfVVRJTElaQVRJT04sXG4gIE1FTU9SWSA9IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9NRU1PUllfVVRJTElaQVRJT05cbn1cblxuZXhwb3J0IHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlciA9IFwiRkFSR0FURVwiIHwgXCJGQVJHQVRFX1NQT1RcIiB8IFwiRUMyXCI7XG5cbi8qKlxuICogRUMyIGNhcGFjaXR5IGNvbmZpZ3VyYXRpb24gZm9yIEVDUyBFQzItYmFja2VkIGNsdXN0ZXJzLlxuICogT25seSB1c2VkIHdoZW4gY2FwYWNpdHlQcm92aWRlciBpcyBcIkVDMlwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjMkNhcGFjaXR5Q29uZmlnIHtcbiAgLyoqIEVDMiBpbnN0YW5jZSB0eXBlLiBEZWZhdWx0OiBcInQzLm1pY3JvXCIgKi9cbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuICAvKiogQU1JIGhhcmR3YXJlIHR5cGUuIERlZmF1bHQ6IFwiQVJNXCIgKEdyYXZpdG9uIC0gYmV0dGVyIGNvc3QvcGVyZm9ybWFuY2UpICovXG4gIGFtaUhhcmR3YXJlVHlwZT86IFwiQVJNXCIgfCBcIlNUQU5EQVJEXCI7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDIgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDMgKi9cbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgbGltaXQgaW4gTWlCIGZvciB0aGUgY29udGFpbmVyLiBEZWZhdWx0OiAxMDI0ICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIERvbWFpbiBjb25maWd1cmF0aW9uIGZvciBIVFRQUyBhbmQgRE5TLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvbWFpbkJhc2VDb25maWcge1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGhvc3RlZFpvbmU/OiBGamFsbEhvc3RlZFpvbmU7XG4gIGNlcnRpZmljYXRlPzogQ2VydGlmaWNhdGU7XG4gIHNldElkZW50aWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZW5jeURvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICByZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWlnaHRlZERvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW9Mb2NhdGlvbkRvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICBnZW9Mb2NhdGlvbjogR2VvTG9jYXRpb247XG59XG5cbmV4cG9ydCB0eXBlIERvbWFpbkNvbmZpZyA9XG4gIHwgRG9tYWluQmFzZUNvbmZpZ1xuICB8IExhdGVuY3lEb21haW5Db25maWdcbiAgfCBXZWlnaHRlZERvbWFpbkNvbmZpZ1xuICB8IEdlb0xvY2F0aW9uRG9tYWluQ29uZmlnO1xuXG4vKipcbiAqIEludGVybmFsIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29udGFpbmVyIGluIGEgbXVsdGktY29udGFpbmVyIEVDUyB0YXNrLlxuICpcbiAqIEluIG11bHRpLWNvbnRhaW5lciB0YXNrcywgdGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgYHBvcnRgIGlzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAqIHRoYXQgcmVjZWl2ZXMgbG9hZCBiYWxhbmNlciB0cmFmZmljLiBBbGwgb3RoZXIgY29udGFpbmVycyBhcmUgKipzaWRlY2FycyoqIHRoYXQgcHJvdmlkZVxuICogc3VwcG9ydGluZyBmdW5jdGlvbmFsaXR5IChsb2dnaW5nLCBtb25pdG9yaW5nLCBwcm94aWVzLCBldGMuKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJpbWFyeSBjb250YWluZXIgKGhhcyBwb3J0KSArIHNpZGVjYXIgKG5vIHBvcnQpXG4gKiBjb250YWluZXJzOiBbXG4gKiAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LCAgICAgICAgICAgLy8gUHJpbWFyeSAtIHJlY2VpdmVzIEFMQiB0cmFmZmljXG4gKiAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9ICAvLyBTaWRlY2FyIC0gbW9uaXRvcmluZ1xuICogXVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NsdXN0ZXJDb250YWluZXJDb25maWcge1xuICAvKiogVW5pcXVlIGNvbnRhaW5lciBuYW1lICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZS4gT3B0aW9uczpcbiAgICogLSBPbWl0OiBVc2VzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnkgKHByaW1hcnkgY29udGFpbmVyIG9ubHkpXG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbi5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBiZWNvbWVzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAgICogYW5kIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogU2VjcmV0cyBpbXBvcnRlZCBmcm9tIG90aGVyIHJlc291cmNlcyAqL1xuICBzZWNyZXRzSW1wb3J0PzogeyBba2V5OiBzdHJpbmddOiBTZWNyZXRJbXBvcnQgfTtcbiAgLyoqIENvbW1hbmQgdG8gcnVuIGluIHRoZSBjb250YWluZXIgKi9cbiAgY29tbWFuZD86IHN0cmluZ1tdO1xuICAvKiogRW50cnkgcG9pbnQgZm9yIHRoZSBjb250YWluZXIgKi9cbiAgZW50cnlQb2ludD86IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGNvbnRhaW5lciBpcyBlc3NlbnRpYWwuXG4gICAqIElmIGFuIGVzc2VudGlhbCBjb250YWluZXIgc3RvcHMsIGFsbCBjb250YWluZXJzIGluIHRoZSB0YXNrIHN0b3AuXG4gICAqIERlZmF1bHQ6IHRydWUgZm9yIHByaW1hcnkgY29udGFpbmVyLCB0cnVlIGZvciBzaWRlY2Fyc1xuICAgKi9cbiAgZXNzZW50aWFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhlYWx0aCBjaGVjayBjb25maWd1cmF0aW9uLlxuICAgKiBEZWZhdWx0OiBGb3IgcHJpbWFyeSBjb250YWluZXIgd2l0aCBwb3J0LCB1c2VzIGN1cmwgaGVhbHRoIGNoZWNrLlxuICAgKi9cbiAgaGVhbHRoQ2hlY2s/OiB7XG4gICAgY29tbWFuZDogc3RyaW5nW107XG4gICAgaW50ZXJ2YWw/OiBudW1iZXI7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICByZXRyaWVzPzogbnVtYmVyO1xuICAgIHN0YXJ0UGVyaW9kPzogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIENsdXN0ZXItbGV2ZWwgY29uZmlndXJhdGlvbi5cbiAqIENvbnRyb2xzIHRoZSBzaGFyZWQgQUxCIGZvciBhbGwgc2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NsdXN0ZXJDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9pbnRlcm5hbCBzZXJ2aWNlcylcbiAgICogLSBcInB1YmxpY1wiOiBJbnRlcm5ldC1mYWNpbmcgQUxCIChkZWZhdWx0KVxuICAgKiAtIFwiaW50ZXJuYWxcIjogVlBDLW9ubHkgQUxCXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogT3BlbnMgY29udGFpbmVyIHBvcnRzIG9uIHNlY3VyaXR5IGdyb3VwIGZvciBkaXJlY3QgYWNjZXNzIHZpYSBFQzIgcHVibGljIElQLlxuICAgKiBVc2VzIGhvc3QgbmV0d29yayBtb2RlIGZvciBwcmVkaWN0YWJsZSBwb3J0IG1hcHBpbmcgKGNvbnRhaW5lcjozMDAwIOKGkiBob3N0OjMwMDApLlxuICAgKiBPbmx5IHZhbGlkIHdpdGggRUMyIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgZGlyZWN0QWNjZXNzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRG9tYWluIGNvbmZpZ3VyYXRpb24gZm9yIGFkdmFuY2VkIHJvdXRpbmcgcG9saWNpZXMgKGxhdGVuY3ksIHdlaWdodGVkLCBnZW8pLlxuICAgKiBPbmx5IHVzZWQgd2hlbiBkb21haW4gaXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgZG9tYWluQ29uZmlnPzogRG9tYWluQ29uZmlnO1xufVxuXG4vKipcbiAqIFJvdXRpbmcgY29uZmlndXJhdGlvbiBmb3IgcGF0aC9ob3N0LWJhc2VkIHJvdXRpbmcgb24gdGhlIEFMQi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NSb3V0aW5nQ29uZmlnIHtcbiAgLyoqIFBhdGggcGF0dGVybiBmb3Igcm91dGluZyAoZS5nLiwgXCIvYXBpLypcIiwgXCIvdXNlcnMvKlwiKSAqL1xuICBwYXRoPzogc3RyaW5nO1xuICAvKiogSG9zdCBoZWFkZXIgZm9yIHJvdXRpbmcgKGUuZy4sIFwiYXBpLmV4YW1wbGUuY29tXCIpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBQcmlvcml0eSBmb3IgdGhpcyByb3V0aW5nIHJ1bGUgKDEtNTAwMDApLiBMb3dlciA9IGhpZ2hlciBwcmlvcml0eS4gKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKiBIZWFsdGggY2hlY2sgcGF0aCBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFyZ2V0IGdyb3VwLiBEZWZhdWx0OiBcIi9cIiAqL1xuICBoZWFsdGhDaGVja1BhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXJ2aWNlIGluIGFuIEVDUyBjbHVzdGVyLlxuICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2VydmljZVByb3BzIHtcbiAgLyoqIFNlcnZpY2UgbmFtZSAodW5pcXVlIHdpdGhpbiBjbHVzdGVyKSAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiAtIE9taXQ6IFVzZXMgY2x1c3RlcidzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnlcbiAgICogLSBzdHJpbmc6IEVDUiByZXBvc2l0b3J5IG5hbWUgb3IgcHVibGljIGltYWdlIFVSTFxuICAgKiAtIFJlcG9zaXRvcnk6IENESyBFQ1IgUmVwb3NpdG9yeSBjb25zdHJ1Y3RcbiAgICovXG4gIGltYWdlPzogc3RyaW5nIHwgUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogQ29udGFpbmVyIGNvbmZpZ3VyYXRpb25zIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIFRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgaXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKiAocmVjZWl2ZXMgQUxCIHRyYWZmaWMpLlxuICAgKi9cbiAgY29udGFpbmVyczogRWNzQ2x1c3RlckNvbnRhaW5lckNvbmZpZ1tdO1xuXG4gIC8qKiBDUFUgdW5pdHMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICgyNTYtNDA5NikgKi9cbiAgY3B1PzogbnVtYmVyO1xuXG4gIC8qKiBNZW1vcnkgaW4gTWlCIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoNTEyLTMwNzIwKSAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcblxuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgdGFza3MuIERlZmF1bHQ6IDIgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuXG4gIC8qKiBTY2FsaW5nIHR5cGUgKENQVSBvciBNRU1PUlkpLiBPbWl0IHRvIGRpc2FibGUgYXV0by1zY2FsaW5nLiAqL1xuICBzY2FsaW5nVHlwZT86IFNjYWxpbmdUeXBlO1xuXG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiB0YXNrcyBmb3IgYXV0by1zY2FsaW5nLiBEZWZhdWx0OiAyICovXG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiB0YXNrcyBmb3IgYXV0by1zY2FsaW5nLiBEZWZhdWx0OiAxMCAqL1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqL1xuICByb3V0aW5nPzogRWNzUm91dGluZ0NvbmZpZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBpbmxpbmUgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgdGFza1JvbGVJbmxpbmVQb2xpY2llcz86IHtcbiAgICBbbmFtZTogc3RyaW5nXTogUG9saWN5RG9jdW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgbWFuYWdlZCBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llcz86IElNYW5hZ2VkUG9saWN5W107XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIHNlcnZpY2UgbmVlZHMgdG8gY29ubmVjdCB0byAoZS5nLiwgZGF0YWJhc2VzKS5cbiAgICogQ3JlYXRlcyBzZWN1cml0eSBncm91cCBydWxlcyB0byBhbGxvdyB0cmFmZmljIGZyb20gdGhpcyBzcGVjaWZpYyBzZXJ2aWNlIG9ubHkuXG4gICAqL1xuICBjb25uZWN0aW9ucz86IElDb25uZWN0YWJsZVtdO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjcmVhdGluZyBhbiBFQ1MgY2x1c3RlciB3aXRoIG11bHRpcGxlIHNlcnZpY2VzLlxuICovXG5leHBvcnQgdHlwZSBFY3NDbHVzdGVyUHJvcHMgPSB7XG4gIC8qKiBDbHVzdGVyIG5hbWUgKi9cbiAgY2x1c3Rlck5hbWU6IHN0cmluZztcblxuICAvKiogVlBDIHRvIGRlcGxveSBpbnRvICovXG4gIHZwYz86IElWcGM7XG5cbiAgLyoqIERlZmF1bHQgRUNSIHJlcG9zaXRvcnkgb3IgY29udGFpbmVyIGltYWdlICovXG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2UgfCBzdHJpbmc7XG5cbiAgLyoqIENhcGFjaXR5IHByb3ZpZGVyIGRldGVybWluZXMgRmFyZ2F0ZSB2cyBFQzIgaW5mcmFzdHJ1Y3R1cmUgKi9cbiAgY2FwYWNpdHlQcm92aWRlcj86IEVjc0NhcGFjaXR5UHJvdmlkZXI7XG5cbiAgLyoqIEVDMi1zcGVjaWZpYyBjb25maWd1cmF0aW9uLiBPbmx5IHVzZWQgd2hlbiBjYXBhY2l0eVByb3ZpZGVyIGlzIFwiRUMyXCIgKi9cbiAgZWMyQ29uZmlnPzogRWMyQ2FwYWNpdHlDb25maWc7XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgY29uZmlndXJhdGlvbi5cbiAgICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcy5cbiAgICovXG4gIGNsdXN0ZXI/OiBFY3NDbHVzdGVyQ2x1c3RlckNvbmZpZztcblxuICAvKipcbiAgICogU2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLlxuICAgKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZywgYW5kIHRhcmdldCBncm91cC5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKiBUYXNrIHJvbGUgcG9saWNpZXMgYXJlIGNvbmZpZ3VyZWQgcGVyLXNlcnZpY2UgZm9yIGxlYXN0LXByaXZpbGVnZS5cbiAgICovXG4gIHNlcnZpY2VzOiBFY3NTZXJ2aWNlUHJvcHNbXTtcbn07XG5cbi8qKlxuICogRGF0YSB0cmFja2VkIGZvciBlYWNoIHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIuXG4gKi9cbmludGVyZmFjZSBTZXJ2aWNlRGF0YSB7XG4gIHNlcnZpY2U6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZTtcbiAgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uO1xuICAvKiogUm9sZSBmb3IgRUNTIGFnZW50IChwdWxsIGltYWdlcywgd3JpdGUgbG9ncywgaW5qZWN0IHNlY3JldHMpICovXG4gIGV4ZWN1dGlvblJvbGU6IFJvbGU7XG4gIC8qKiBSb2xlIGZvciBhcHBsaWNhdGlvbiBjb2RlICh1c2VyIHBvbGljaWVzLCBFQ1MgRXhlYykgKi9cbiAgdGFza1JvbGU6IFJvbGU7XG4gIGNvbnRhaW5lcnM6IENvbnRhaW5lckRlZmluaXRpb25bXTtcbiAgcHJpbWFyeUNvbnRhaW5lcj86IENvbnRhaW5lckRlZmluaXRpb247XG4gIHRhcmdldEdyb3VwPzogSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXA7XG4gIHNjYWxpbmdQb2xpY3k/OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG59XG5cbi8qKlxuICogRUNTIENsdXN0ZXIgc3VwcG9ydGluZyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIGEgc2hhcmVkIEFMQi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIHNlcnZpY2UgY2x1c3RlclxuICogbmV3IEVjc0NsdXN0ZXIoc2NvcGUsIFwiV2ViQ2x1c3RlclwiLCB7XG4gKiAgIGNsdXN0ZXJOYW1lOiBcIldlYkNsdXN0ZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogZWNyLFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9XSB9XG4gKiAgIF1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJBcGlDbHVzdGVyXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiQXBpQ2x1c3RlclwiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBlY3JSZXBvc2l0b3J5OiBlY3IsXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtlciBjbHVzdGVyIChubyBBTEIpXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJXb3JrZXJzXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiV29ya2Vyc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgZWNyUmVwb3NpdG9yeTogZWNyLFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJwcm9jZXNzb3JcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJ3b3JrZXJcIiB9XSB9XG4gKiAgIF1cbiAqIH0pO1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY3NDbHVzdGVyIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICAvLyBDbHVzdGVyLWxldmVsIHJlc291cmNlc1xuICBwcml2YXRlIGNsdXN0ZXI6IENka0NsdXN0ZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyPzogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyTGlzdGVuZXI/OiBBcHBsaWNhdGlvbkxpc3RlbmVyO1xuICBwcml2YXRlIGhvc3RlZFpvbmU/OiBJSG9zdGVkWm9uZTtcbiAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZT86IENlcnRpZmljYXRlO1xuICBwcml2YXRlIGFSZWNvcmQ/OiBBUmVjb3JkO1xuXG4gIC8vIEVDMi1zcGVjaWZpY1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA/OiBBdXRvU2NhbGluZ0dyb3VwO1xuICBwcml2YXRlIGFzZ1NlY3VyaXR5R3JvdXA/OiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGFzZ0NhcGFjaXR5UHJvdmlkZXI/OiBBc2dDYXBhY2l0eVByb3ZpZGVyO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXA/OiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGRyYWluV2FpdGVyPzogQ2FwYWNpdHlQcm92aWRlckRyYWluV2FpdGVyO1xuXG4gIC8vIEZhcmdhdGUtc3BlY2lmaWMgLSByZWZlcmVuY2UgdG8gQ0RLJ3MgaW50ZXJuYWwgY2FwYWNpdHkgcHJvdmlkZXIgYXNzb2NpYXRpb25zXG4gIHByaXZhdGUgZmFyZ2F0ZUNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnM/OiBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9ucztcblxuICAvLyBQZXItc2VydmljZSB0cmFja2luZ1xuICBwcml2YXRlIHNlcnZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIFNlcnZpY2VEYXRhPigpO1xuXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBzY29wZTogQ29uc3RydWN0O1xuICBwcml2YXRlIHByb3BzOiBFY3NDbHVzdGVyUHJvcHM7XG4gIHByaXZhdGUgY2FwYWNpdHlQcm92aWRlcjogRWNzQ2FwYWNpdHlQcm92aWRlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJEaXNhYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBkaXJlY3RBY2Nlc3NFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIG5leHRQcmlvcml0eTogbnVtYmVyID0gMTAwO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmNhcGFjaXR5UHJvdmlkZXIgPSBwcm9wcy5jYXBhY2l0eVByb3ZpZGVyIHx8IFwiRkFSR0FURVwiO1xuICAgIHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCA9IHByb3BzLmNsdXN0ZXI/LmRpcmVjdEFjY2VzcyA9PT0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkID1cbiAgICAgIHByb3BzLmNsdXN0ZXI/LmxvYWRCYWxhbmNlciA9PT0gZmFsc2UgfHwgdGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcblxuICAgIC8vIDEuIENyZWF0ZSB0aGUgRUNTIGNsdXN0ZXJcbiAgICB0aGlzLmFkZENsdXN0ZXIocHJvcHMpO1xuXG4gICAgLy8gMi4gU2V0IHVwIEVDMiBpbmZyYXN0cnVjdHVyZSBpZiBuZWVkZWRcbiAgICBpZiAodGhpcy5pc0VjMigpKSB7XG4gICAgICB0aGlzLmFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHMpO1xuICAgIH1cblxuICAgIC8vIDMuIENyZWF0ZSBBTEIgaWYgbm90IGRpc2FibGVkIChzaGFyZWQgYnkgYWxsIHNlcnZpY2VzKVxuICAgIGlmICghdGhpcy5sb2FkQmFsYW5jZXJEaXNhYmxlZCkge1xuICAgICAgdGhpcy5hZGRMb2FkQmFsYW5jZXIocHJvcHMpO1xuXG4gICAgICAvLyBTZXQgdXAgZG9tYWluL0hUVFBTIGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChwcm9wcy5jbHVzdGVyPy5kb21haW4gfHwgcHJvcHMuY2x1c3Rlcj8uZG9tYWluQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuYWRkSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZERpcmVjdEFjY2Vzc091dHB1dHMocHJvcHMpO1xuICAgIH1cblxuICAgIC8vIDQuIENyZWF0ZSBlYWNoIHNlcnZpY2VcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2VQcm9wcyBvZiBwcm9wcy5zZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlVG9DbHVzdGVyKHNlcnZpY2VQcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gNS4gU2V0IHVwIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5zZXR1cENvbm5lY3Rpb25zKHByb3BzKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsdXN0ZXIncyBsb2FkIGJhbGFuY2VyLiBVbmRlZmluZWQgaWYgZGlzYWJsZWQuICovXG4gIGdldExvYWRCYWxhbmNlcigpOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbG9hZCBiYWxhbmNlcidzIGxpc3RlbmVyLiBVbmRlZmluZWQgaWYgZGlzYWJsZWQuICovXG4gIGdldExpc3RlbmVyKCk6IEFwcGxpY2F0aW9uTGlzdGVuZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyO1xuICB9XG5cbiAgLyoqIEdldCBhIHNwZWNpZmljIHNlcnZpY2UgYnkgbmFtZS4gKi9cbiAgZ2V0U2VydmljZShuYW1lOiBzdHJpbmcpOiBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzLmdldChuYW1lKT8uc2VydmljZTtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci4gKi9cbiAgZ2V0U2VydmljZXMoKTogTWFwPHN0cmluZywgRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZT4oKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICByZXN1bHQuc2V0KG5hbWUsIGRhdGEuc2VydmljZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogR2V0IHRoZSBFQ1MgY2x1c3RlciBjb25zdHJ1Y3QuICovXG4gIGdldENsdXN0ZXIoKTogQ2RrQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuY2x1c3RlcjtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEFMQiBVUkwgKGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLiAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubG9hZEJhbGFuY2VyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5jZXJ0aWZpY2F0ZSA/IFwiaHR0cHNcIiA6IFwiaHR0cFwiO1xuICAgIGNvbnN0IGRvbWFpbiA9XG4gICAgICB0aGlzLnByb3BzLmNsdXN0ZXI/LmRvbWFpbiB8fCB0aGlzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2RvbWFpbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNlcnZpY2UgdG8gdGhlIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBjb250YWluZXJzLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTZXJ2aWNlVG9DbHVzdGVyKHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzKTogdm9pZCB7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlUHJvcHMubmFtZTtcblxuICAgIC8vIENyZWF0ZSBzZXBhcmF0ZSByb2xlcyBmb3Igc2VjdXJpdHkgYmVzdCBwcmFjdGljZVxuICAgIGNvbnN0IGV4ZWN1dGlvblJvbGUgPSB0aGlzLmNyZWF0ZUV4ZWN1dGlvblJvbGUoc2VydmljZU5hbWUpO1xuICAgIGNvbnN0IHRhc2tSb2xlID0gdGhpcy5jcmVhdGVUYXNrUm9sZShzZXJ2aWNlTmFtZSwgc2VydmljZVByb3BzKTtcblxuICAgIC8vIENyZWF0ZSB0YXNrIGRlZmluaXRpb24gd2l0aCBib3RoIHJvbGVzXG4gICAgY29uc3QgdGFza0RlZmluaXRpb24gPSB0aGlzLmNyZWF0ZVRhc2tEZWZpbml0aW9uKFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICBleGVjdXRpb25Sb2xlLFxuICAgICAgdGFza1JvbGVcbiAgICApO1xuXG4gICAgLy8gQWRkIGNvbnRhaW5lcnMgdG8gdGFzayBkZWZpbml0aW9uXG4gICAgY29uc3QgeyBjb250YWluZXJzLCBwcmltYXJ5Q29udGFpbmVyIH0gPSB0aGlzLmFkZENvbnRhaW5lcnNUb1Rhc2soXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgIHRhc2tEZWZpbml0aW9uXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgRUNTIHNlcnZpY2VcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5jcmVhdGVTZXJ2aWNlKFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICB0YXNrRGVmaW5pdGlvblxuICAgICk7XG5cbiAgICAvLyBSZWdpc3RlciB3aXRoIEFMQiBpZiBlbmFibGVkIGFuZCBoYXMgcHJpbWFyeSBjb250YWluZXIgd2l0aCBwb3J0XG4gICAgbGV0IHRhcmdldEdyb3VwOiBJQXBwbGljYXRpb25UYXJnZXRHcm91cCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sb2FkQmFsYW5jZXJEaXNhYmxlZCAmJlxuICAgICAgcHJpbWFyeUNvbnRhaW5lciAmJlxuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lclxuICAgICkge1xuICAgICAgdGFyZ2V0R3JvdXAgPSB0aGlzLnJlZ2lzdGVyU2VydmljZVdpdGhBTEIoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICAgIHNlcnZpY2UsXG4gICAgICAgIHByaW1hcnlDb250YWluZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNjYWxpbmcgaWYgY29uZmlndXJlZFxuICAgIGxldCBzY2FsaW5nUG9saWN5OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3kgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlcnZpY2VQcm9wcy5zY2FsaW5nVHlwZSkge1xuICAgICAgc2NhbGluZ1BvbGljeSA9IHRoaXMuYWRkU2VydmljZVNjYWxpbmcoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICAgIHNlcnZpY2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgc2VydmljZSBkYXRhXG4gICAgdGhpcy5zZXJ2aWNlcy5zZXQoc2VydmljZU5hbWUsIHtcbiAgICAgIHNlcnZpY2UsXG4gICAgICB0YXNrRGVmaW5pdGlvbixcbiAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICB0YXNrUm9sZSxcbiAgICAgIGNvbnRhaW5lcnMsXG4gICAgICBwcmltYXJ5Q29udGFpbmVyLFxuICAgICAgdGFyZ2V0R3JvdXAsXG4gICAgICBzY2FsaW5nUG9saWN5XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgc2VydmljZSBsZXZlbCBjb25uZWN0aW9uc1xuICAgIGlmIChzZXJ2aWNlUHJvcHMuY29ubmVjdGlvbnMgJiYgc2VydmljZVByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGFibGUgb2Ygc2VydmljZVByb3BzLmNvbm5lY3Rpb25zKSB7XG4gICAgICAgIHNlcnZpY2UuY29ubmVjdGlvbnMuYWxsb3dUb0RlZmF1bHRQb3J0KGNvbm5lY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUHJvcHMocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIHNlcnZpY2VzIGFycmF5XG4gICAgaWYgKCFwcm9wcy5zZXJ2aWNlcyB8fCBwcm9wcy5zZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIHNlcnZpY2UgbmFtZXNcbiAgICBjb25zdCBzZXJ2aWNlTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gICAgY29uc3QgZHVwbGljYXRlU2VydmljZXMgPSBzZXJ2aWNlTmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUsIGluZGV4KSA9PiBzZXJ2aWNlTmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gaW5kZXhcbiAgICApO1xuICAgIGlmIChkdXBsaWNhdGVTZXJ2aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEdXBsaWNhdGUgc2VydmljZSBuYW1lczogJHtbLi4ubmV3IFNldChkdXBsaWNhdGVTZXJ2aWNlcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJvdXRpbmcgd2hlbiBtdWx0aXBsZSBzZXJ2aWNlcyBoYXZlIHBvcnRzXG4gICAgY29uc3Qgc2VydmljZXNXaXRoUG9ydHMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgICBzLmNvbnRhaW5lcnMuc29tZSgoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWQpXG4gICAgKTtcblxuICAgIGlmIChzZXJ2aWNlc1dpdGhQb3J0cy5sZW5ndGggPiAxICYmICF0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkKSB7XG4gICAgICBjb25zdCBtaXNzaW5nUm91dGluZyA9IHNlcnZpY2VzV2l0aFBvcnRzLmZpbHRlcihcbiAgICAgICAgKHMpID0+ICFzLnJvdXRpbmc/LnBhdGggJiYgIXMucm91dGluZz8uaG9zdFxuICAgICAgKTtcbiAgICAgIGlmIChtaXNzaW5nUm91dGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZXMgd2l0aCBwb3J0cyByZXF1aXJlIHJvdXRpbmcgY29uZmlnIHdoZW4gY2x1c3RlciBoYXMgbXVsdGlwbGUgc2VydmljZXM6IGAgK1xuICAgICAgICAgICAgYCR7bWlzc2luZ1JvdXRpbmcubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSB0byBlYWNoIHNlcnZpY2UuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHNlcnZpY2UncyBjb250YWluZXJzXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgICBpZiAoIXNlcnZpY2UuY29udGFpbmVycyB8fCBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JzogQXQgbGVhc3Qgb25lIGNvbnRhaW5lciBtdXN0IGJlIHNwZWNpZmllZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzIHdpdGhpbiBzZXJ2aWNlXG4gICAgICBjb25zdCBjb250YWluZXJOYW1lcyA9IHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgICBjb25zdCBkdXBsaWNhdGVDb250YWluZXJzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFNlcnZpY2UgJyR7c2VydmljZS5uYW1lfSc6IER1cGxpY2F0ZSBjb250YWluZXIgbmFtZXM6IGAgK1xuICAgICAgICAgICAgYCR7Wy4uLm5ldyBTZXQoZHVwbGljYXRlQ29udGFpbmVycyldLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENvbm5lY3Rpb25zKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBzZXJ2aWNlIHdpdGggYSBwb3J0IGZvciBkZWZhdWx0IGNvbm5lY3Rpb25cbiAgICBsZXQgZGVmYXVsdFBvcnQgPSA4MDtcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgcHJvcHMuc2VydmljZXMpIHtcbiAgICAgIGNvbnN0IHByaW1hcnlDb250YWluZXIgPSBzZXJ2aWNlLmNvbnRhaW5lcnMuZmluZChcbiAgICAgICAgKGMpID0+IGMucG9ydCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgaWYgKHByaW1hcnlDb250YWluZXI/LnBvcnQpIHtcbiAgICAgICAgZGVmYXVsdFBvcnQgPSBwcmltYXJ5Q29udGFpbmVyLnBvcnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzZWN1cml0eUdyb3VwczogSVNlY3VyaXR5R3JvdXBbXSA9IFtdO1xuICAgIGlmICh0aGlzLmlzRWMyKCkpIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gW3RoaXMuYXNnU2VjdXJpdHlHcm91cCFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaXJzdFNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gZmlyc3RTZXJ2aWNlPy5zZXJ2aWNlPy5jb25uZWN0aW9ucz8uc2VjdXJpdHlHcm91cHMgfHwgW107XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwcyxcbiAgICAgIGRlZmF1bHRQb3J0OiBQb3J0LnRjcChkZWZhdWx0UG9ydClcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBleGVjdXRpb24gcm9sZSBmb3IgRUNTIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbnMuXG4gICAqIFVzZWQgYnkgdGhlIEVDUyBhZ2VudCB0byBwdWxsIGltYWdlcywgd3JpdGUgbG9ncywgYW5kIGluamVjdCBzZWNyZXRzLlxuICAgKiBOT1QgdXNlZCBieSBhcHBsaWNhdGlvbiBjb2RlIC0gdGhhdCdzIHRoZSB0YXNrIHJvbGUuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUV4ZWN1dGlvblJvbGUoc2VydmljZU5hbWU6IHN0cmluZyk6IFJvbGUge1xuICAgIGNvbnN0IGV4ZWN1dGlvblJvbGUgPSBuZXcgUm9sZSh0aGlzLCBgJHtzZXJ2aWNlTmFtZX1FeGVjdXRpb25Sb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImVjcy10YXNrcy5hbWF6b25hd3MuY29tXCIpXG4gICAgfSk7XG5cbiAgICAvLyBFQ1IgcHVsbCBwZXJtaXNzaW9uc1xuICAgIGV4ZWN1dGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImVjcjpHZXRBdXRob3JpemF0aW9uVG9rZW5cIixcbiAgICAgICAgICBcImVjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHlcIixcbiAgICAgICAgICBcImVjcjpHZXREb3dubG9hZFVybEZvckxheWVyXCIsXG4gICAgICAgICAgXCJlY3I6QmF0Y2hHZXRJbWFnZVwiXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIHBlcm1pc3Npb25zXG4gICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwibG9nczpDcmVhdGVMb2dTdHJlYW1cIixcbiAgICAgICAgICBcImxvZ3M6UHV0TG9nRXZlbnRzXCIsXG4gICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ0dyb3VwXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTZWNyZXRzIE1hbmFnZXIgYWNjZXNzIGZvciBpbmplY3Rpbmcgc2VjcmV0cyBpbnRvIGNvbnRhaW5lcnNcbiAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiLFxuICAgICAgICAgIFwic2VjcmV0c21hbmFnZXI6RGVzY3JpYmVTZWNyZXRcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEtNUyBkZWNyeXB0IGZvciBzZWNyZXRzIGVuY3J5cHRlZCB3aXRoIGN1c3RvbWVyLW1hbmFnZWQga2V5c1xuICAgIGV4ZWN1dGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBleGVjdXRpb25Sb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHRhc2sgcm9sZSBmb3IgYXBwbGljYXRpb24gY29kZSBydW5uaW5nIGluIHRoZSBjb250YWluZXIuXG4gICAqIFRoaXMgcm9sZSBpcyBhc3N1bWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgbm90IHRoZSBFQ1MgYWdlbnQuXG4gICAqIEluY2x1ZGVzIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMgcGx1cyBhbnkgc2VydmljZS1zcGVjaWZpYyBwb2xpY2llcy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVGFza1JvbGUoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBSb2xlIHtcbiAgICBjb25zdCB0YXNrUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke3NlcnZpY2VOYW1lfVRhc2tSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImVjcy10YXNrcy5hbWF6b25hd3MuY29tXCIpXG4gICAgfSk7XG5cbiAgICAvLyBEZWZhdWx0OiBTU00gcGVybWlzc2lvbnMgZm9yIEVDUyBFeGVjIChlY3MgZXhlY3V0ZS1jb21tYW5kKVxuICAgIHRhc2tSb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVDb250cm9sQ2hhbm5lbFwiLFxuICAgICAgICAgIFwic3NtbWVzc2FnZXM6Q3JlYXRlRGF0YUNoYW5uZWxcIixcbiAgICAgICAgICBcInNzbW1lc3NhZ2VzOk9wZW5Db250cm9sQ2hhbm5lbFwiLFxuICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkRhdGFDaGFubmVsXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBZGQgc2VydmljZS1zcGVjaWZpYyBpbmxpbmUgcG9saWNpZXNcbiAgICBpZiAoc2VydmljZVByb3BzLnRhc2tSb2xlSW5saW5lUG9saWNpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW3BvbGljeU5hbWUsIHBvbGljeURvY3VtZW50XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgc2VydmljZVByb3BzLnRhc2tSb2xlSW5saW5lUG9saWNpZXNcbiAgICAgICkpIHtcbiAgICAgICAgdGFza1JvbGUuYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgICAgIG5ldyBQb2xpY3kodGhpcywgYCR7c2VydmljZU5hbWV9JHtwb2xpY3lOYW1lfWAsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBwb2xpY3lEb2N1bWVudFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHNlcnZpY2Utc3BlY2lmaWMgbWFuYWdlZCBwb2xpY2llc1xuICAgIGlmIChzZXJ2aWNlUHJvcHMudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcG9saWN5IG9mIHNlcnZpY2VQcm9wcy50YXNrUm9sZU1hbmFnZWRQb2xpY2llcykge1xuICAgICAgICB0YXNrUm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhc2tSb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYXNrRGVmaW5pdGlvbihcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIGV4ZWN1dGlvblJvbGU6IFJvbGUsXG4gICAgdGFza1JvbGU6IFJvbGVcbiAgKTogRmFyZ2F0ZVRhc2tEZWZpbml0aW9uIHwgRWMyVGFza0RlZmluaXRpb24ge1xuICAgIGNvbnN0IGNwdSA9IHNlcnZpY2VQcm9wcy5jcHUgfHwgMjU2O1xuICAgIGNvbnN0IG1lbW9yeUxpbWl0TWlCID0gc2VydmljZVByb3BzLm1lbW9yeUxpbWl0TWlCIHx8IDUxMjtcblxuICAgIGlmICh0aGlzLmlzRmFyZ2F0ZSgpKSB7XG4gICAgICByZXR1cm4gbmV3IEZhcmdhdGVUYXNrRGVmaW5pdGlvbih0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsIHtcbiAgICAgICAgZmFtaWx5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfS0ke3NlcnZpY2VOYW1lfWAsXG4gICAgICAgIGNwdSxcbiAgICAgICAgbWVtb3J5TGltaXRNaUIsXG4gICAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICAgIHRhc2tSb2xlLFxuICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IENwdUFyY2hpdGVjdHVyZS5BUk02NCxcbiAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IE9wZXJhdGluZ1N5c3RlbUZhbWlseS5MSU5VWFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBFYzJUYXNrRGVmaW5pdGlvbih0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsIHtcbiAgICAgICAgZmFtaWx5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfS0ke3NlcnZpY2VOYW1lfWAsXG4gICAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICAgIHRhc2tSb2xlLFxuICAgICAgICAuLi4odGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkICYmIHsgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLkhPU1QgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29udGFpbmVyc1RvVGFzayhcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIHRhc2tEZWZpbml0aW9uOiBGYXJnYXRlVGFza0RlZmluaXRpb24gfCBFYzJUYXNrRGVmaW5pdGlvblxuICApOiB7XG4gICAgY29udGFpbmVyczogQ29udGFpbmVyRGVmaW5pdGlvbltdO1xuICAgIHByaW1hcnlDb250YWluZXI/OiBDb250YWluZXJEZWZpbml0aW9uO1xuICB9IHtcbiAgICBjb25zdCBjb250YWluZXJzOiBDb250YWluZXJEZWZpbml0aW9uW10gPSBbXTtcbiAgICBsZXQgcHJpbWFyeUNvbnRhaW5lcjogQ29udGFpbmVyRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgY29udGFpbmVyQ29uZmlnIG9mIHNlcnZpY2VQcm9wcy5jb250YWluZXJzKSB7XG4gICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0Q29udGFpbmVySW1hZ2UoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBjb250YWluZXJDb25maWcsXG4gICAgICAgIHNlcnZpY2VQcm9wc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzRmlyc3RXaXRoUG9ydCA9XG4gICAgICAgICFwcmltYXJ5Q29udGFpbmVyICYmIGNvbnRhaW5lckNvbmZpZy5wb3J0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEJ1aWxkIHNlY3JldHNcbiAgICAgIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIEVjc1NlY3JldD4gPSB7fTtcbiAgICAgIGlmIChjb250YWluZXJDb25maWcuc2VjcmV0c0ltcG9ydCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHNlY3JldEltcG9ydF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgY29udGFpbmVyQ29uZmlnLnNlY3JldHNJbXBvcnRcbiAgICAgICAgKSkge1xuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9JHtrZXl9U2VjcmV0YCxcbiAgICAgICAgICAgIHNlY3JldEltcG9ydC5uYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZWNyZXRzW2tleV0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICAgICAgc2VjcmV0LFxuICAgICAgICAgICAgc2VjcmV0SW1wb3J0LmZpZWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IGNvbnRhaW5lckNvbmZpZy5uYW1lLFxuICAgICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgICAgc3RyZWFtUHJlZml4OiBgL2Vjcy8ke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LyR7c2VydmljZU5hbWV9LyR7Y29udGFpbmVyQ29uZmlnLm5hbWV9YCxcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogY29udGFpbmVyQ29uZmlnLmVudmlyb25tZW50LFxuICAgICAgICAgIHNlY3JldHMsXG4gICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmNvbW1hbmQsXG4gICAgICAgICAgZW50cnlQb2ludDogY29udGFpbmVyQ29uZmlnLmVudHJ5UG9pbnQsXG4gICAgICAgICAgZXNzZW50aWFsOiBjb250YWluZXJDb25maWcuZXNzZW50aWFsID8/IHRydWUsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVja1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWw6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbClcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay50aW1lb3V0XG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZXRyaWVzOiBjb250YWluZXJDb25maWcuaGVhbHRoQ2hlY2sucmV0cmllcyxcbiAgICAgICAgICAgICAgICBzdGFydFBlcmlvZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kXG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uKHRoaXMuaXNFYzIoKSAmJiB7XG4gICAgICAgICAgICBtZW1vcnlMaW1pdE1pQjogdGhpcy5wcm9wcy5lYzJDb25maWc/Lm1lbW9yeUxpbWl0TWlCIHx8IDEwMjRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAoY29udGFpbmVyQ29uZmlnLnBvcnQpIHtcbiAgICAgICAgY29udGFpbmVyLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgICAgICAgY29udGFpbmVyUG9ydDogY29udGFpbmVyQ29uZmlnLnBvcnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ZpcnN0V2l0aFBvcnQpIHtcbiAgICAgICAgcHJpbWFyeUNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGFpbmVycywgcHJpbWFyeUNvbnRhaW5lciB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250YWluZXJJbWFnZShcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIGNvbnRhaW5lckNvbmZpZzogRWNzQ2x1c3RlckNvbnRhaW5lckNvbmZpZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBDb250YWluZXJJbWFnZSB7XG4gICAgLy8gUHJpb3JpdHk6IGNvbnRhaW5lci5pbWFnZSA+IHNlcnZpY2UuaW1hZ2UgPiBjbHVzdGVyIGRlZmF1bHRcbiAgICBjb25zdCBpbWFnZVNvdXJjZSA9XG4gICAgICBjb250YWluZXJDb25maWcuaW1hZ2UgfHwgc2VydmljZVByb3BzLmltYWdlIHx8IHRoaXMucHJvcHMuZWNyUmVwb3NpdG9yeTtcblxuICAgIGlmICghaW1hZ2VTb3VyY2UpIHtcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VUYWcgPSBgJHtzZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpfS1sYXRlc3RgO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZVNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIGEgcHVibGljIGltYWdlXG4gICAgICBpZiAoaW1hZ2VTb3VyY2UuaW5jbHVkZXMoXCIvXCIpICYmICFpbWFnZVNvdXJjZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShpbWFnZVNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoXG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7c2VydmljZU5hbWV9JHtjb250YWluZXJDb25maWcubmFtZX1FY3JSZXBvYCxcbiAgICAgICAgICBpbWFnZVNvdXJjZVxuICAgICAgICApLFxuICAgICAgICBpbWFnZVRhZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2VTb3VyY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoaW1hZ2VTb3VyY2UsIGltYWdlVGFnKTtcbiAgICB9XG5cbiAgICAvLyBSZXBvc2l0b3J5SW1hZ2UgZXh0ZW5kcyBDb250YWluZXJJbWFnZSwgc28gdGhpcyBpcyBhIHNhZmUgdXBjYXN0XG4gICAgcmV0dXJuIGltYWdlU291cmNlIGFzIENvbnRhaW5lckltYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTZXJ2aWNlKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uXG4gICk6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZSB7XG4gICAgY29uc3QgZGVzaXJlZENvdW50ID0gc2VydmljZVByb3BzLmRlc2lyZWRDb3VudCA/PyAyO1xuXG4gICAgaWYgKHRoaXMuaXNGYXJnYXRlKCkpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgRmFyZ2F0ZVNlcnZpY2UodGhpcywgYCR7c2VydmljZU5hbWV9U2VydmljZWAsIHtcbiAgICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgICB0YXNrRGVmaW5pdGlvbjogdGFza0RlZmluaXRpb24gYXMgRmFyZ2F0ZVRhc2tEZWZpbml0aW9uLFxuICAgICAgICBkZXNpcmVkQ291bnQsXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ2llczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6IHRoaXMuY2FwYWNpdHlQcm92aWRlcixcbiAgICAgICAgICAgIHdlaWdodDogMVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgcHJvcGFnYXRlVGFnczogUHJvcGFnYXRlZFRhZ1NvdXJjZS5TRVJWSUNFLFxuICAgICAgICBjaXJjdWl0QnJlYWtlcjogeyBlbmFibGU6IHRydWUsIHJvbGxiYWNrOiB0cnVlIH0sXG4gICAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiB0cnVlLFxuICAgICAgICBlbmFibGVFeGVjdXRlQ29tbWFuZDogdHJ1ZSxcbiAgICAgICAgaGVhbHRoQ2hlY2tHcmFjZVBlcmlvZDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtaW5IZWFsdGh5UGVyY2VudDogMTAwLFxuICAgICAgICBtYXhIZWFsdGh5UGVyY2VudDogMjAwXG4gICAgICB9KTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtzZXJ2aWNlTmFtZX1TZXJ2aWNlQXJuYCwge1xuICAgICAgICBrZXk6IGAke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLFxuICAgICAgICBleHBvcnROYW1lOiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsXG4gICAgICAgIHZhbHVlOiBzZXJ2aWNlLnNlcnZpY2VBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRUNTIFNlcnZpY2UgQVJOIGZvciAke3NlcnZpY2VOYW1lfWBcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGYXJnYXRlIHNlcnZpY2UgZGVwZW5kcyBvbiBjYXBhY2l0eSBwcm92aWRlciBhc3NvY2lhdGlvbnM6XG4gICAgICAvLyAtIENSRUFURTogQXNzb2NpYXRpb25zIGNyZWF0ZWQgZmlyc3QsIHRoZW4gU2VydmljZSAoY29ycmVjdCAtIHByb3ZpZGVycyByZWFkeSBiZWZvcmUgc2VydmljZSlcbiAgICAgIC8vIC0gREVMRVRFOiBTZXJ2aWNlIGRlbGV0ZWQgZmlyc3QsIHRoZW4gQXNzb2NpYXRpb25zIChjb3JyZWN0IC0gc2VydmljZXMgZ29uZSBiZWZvcmUgZGlzYXNzb2NpYXRpb24pXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ2xvdWRGb3JtYXRpb24gZGVsZXRlcyBhbGwgc2VydmljZXMgQkVGT1JFIGF0dGVtcHRpbmcgdG8gcmVtb3ZlXG4gICAgICAvLyB0aGUgRkFSR0FURS9GQVJHQVRFX1NQT1QgY2FwYWNpdHkgcHJvdmlkZXIgYXNzb2NpYXRpb25zIGZyb20gdGhlIGNsdXN0ZXIuXG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTUzNjZcbiAgICAgIGlmICh0aGlzLmZhcmdhdGVDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zKSB7XG4gICAgICAgIHNlcnZpY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuZmFyZ2F0ZUNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VydmljZSA9IG5ldyBFYzJTZXJ2aWNlKHRoaXMsIGAke3NlcnZpY2VOYW1lfVNlcnZpY2VgLCB7XG4gICAgICAgIGNsdXN0ZXI6IHRoaXMuY2x1c3RlcixcbiAgICAgICAgdGFza0RlZmluaXRpb246IHRhc2tEZWZpbml0aW9uIGFzIEVjMlRhc2tEZWZpbml0aW9uLFxuICAgICAgICBkZXNpcmVkQ291bnQsXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ2llczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6IHRoaXMuYXNnQ2FwYWNpdHlQcm92aWRlciEuY2FwYWNpdHlQcm92aWRlck5hbWUsXG4gICAgICAgICAgICB3ZWlnaHQ6IDFcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHByb3BhZ2F0ZVRhZ3M6IFByb3BhZ2F0ZWRUYWdTb3VyY2UuU0VSVklDRSxcbiAgICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgZW5hYmxlOiB0cnVlLCByb2xsYmFjazogdHJ1ZSB9LFxuICAgICAgICBwbGFjZW1lbnRTdHJhdGVnaWVzOiBbUGxhY2VtZW50U3RyYXRlZ3kuc3ByZWFkQWNyb3NzSW5zdGFuY2VzKCldLFxuICAgICAgICBlbmFibGVFQ1NNYW5hZ2VkVGFnczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDEwMCxcbiAgICAgICAgbWF4SGVhbHRoeVBlcmNlbnQ6IDIwMFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7c2VydmljZU5hbWV9U2VydmljZUFybmAsIHtcbiAgICAgICAga2V5OiBgJHtzZXJ2aWNlTmFtZX1TZXJ2aWNlQXJuYCxcbiAgICAgICAgZXhwb3J0TmFtZTogYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLFxuICAgICAgICB2YWx1ZTogc2VydmljZS5zZXJ2aWNlQXJuLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEVDUyBTZXJ2aWNlIEFSTiBmb3IgJHtzZXJ2aWNlTmFtZX1gXG4gICAgICB9KTtcblxuICAgICAgLy8gU2VydmljZSBkZXBlbmRzIG9uIERyYWluV2FpdGVyOlxuICAgICAgLy8gLSBDUkVBVEU6IERyYWluV2FpdGVyIGNyZWF0ZWQgZmlyc3QsIHRoZW4gU2VydmljZSAoY29ycmVjdCAtIGluZnJhIHJlYWR5IGJlZm9yZSBzZXJ2aWNlKVxuICAgICAgLy8gLSBERUxFVEU6IFNlcnZpY2UgZGVsZXRlZCBmaXJzdCwgdGhlbiBEcmFpbldhaXRlciBydW5zIChjb3JyZWN0IC0gc2VydmljZXMgZ29uZSBiZWZvcmUgZHJhaW4pXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ2xvdWRGb3JtYXRpb24gZGVsZXRlcyBhbGwgc2VydmljZXMgQkVGT1JFIHRoZSBEcmFpbldhaXRlciBMYW1iZGEgcnVucyxcbiAgICAgIC8vIHdoaWNoIHRoZW4gZGlzYXNzb2NpYXRlcyB0aGUgY2FwYWNpdHkgcHJvdmlkZXIgYmVmb3JlIGl0J3MgZGVsZXRlZC5cbiAgICAgIGlmICh0aGlzLmRyYWluV2FpdGVyKSB7XG4gICAgICAgIHNlcnZpY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuZHJhaW5XYWl0ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyU2VydmljZVdpdGhBTEIoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wcyxcbiAgICBzZXJ2aWNlOiBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2UsXG4gICAgcHJpbWFyeUNvbnRhaW5lcjogQ29udGFpbmVyRGVmaW5pdGlvblxuICApOiBJQXBwbGljYXRpb25UYXJnZXRHcm91cCB7XG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9IHByaW1hcnlDb250YWluZXIuY29udGFpbmVyUG9ydDtcbiAgICBjb25zdCBoZWFsdGhDaGVja1BhdGggPSBzZXJ2aWNlUHJvcHMucm91dGluZz8uaGVhbHRoQ2hlY2tQYXRoIHx8IFwiL1wiO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHJvdXRpbmcgY29uZGl0aW9uc1xuICAgIGNvbnN0IHNlcnZpY2VzV2l0aFBvcnRzID0gdGhpcy5wcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgICBzLmNvbnRhaW5lcnMuc29tZSgoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgICBjb25zdCBpc1NpbmdsZVNlcnZpY2UgPSBzZXJ2aWNlc1dpdGhQb3J0cy5sZW5ndGggPT09IDE7XG5cbiAgICBjb25zdCBoZWFsdGhDaGVja0NvbmZpZyA9IHRoaXMuaXNFYzIoKVxuICAgICAgPyB7XG4gICAgICAgICAgaW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgICB1bmhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgICBwYXRoOiBoZWFsdGhDaGVja1BhdGgsXG4gICAgICAgICAgcG9ydDogXCJ0cmFmZmljLXBvcnRcIiBhcyBjb25zdCxcbiAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDE1KVxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICAgIHBhdGg6IGhlYWx0aENoZWNrUGF0aCxcbiAgICAgICAgICBwb3J0OiBgJHtjb250YWluZXJQb3J0fWAsXG4gICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMClcbiAgICAgICAgfTtcblxuICAgIGlmIChpc1NpbmdsZVNlcnZpY2UpIHtcbiAgICAgIC8vIFNpbmdsZSBzZXJ2aWNlIC0gY3JlYXRlIHRhcmdldCBncm91cCB3aXRoIHNlcnZpY2UgYXMgZGVmYXVsdCB0YXJnZXRcbiAgICAgIHJldHVybiB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyIS5hZGRUYXJnZXRzKFxuICAgICAgICBgJHtzZXJ2aWNlTmFtZX1UYXJnZXRHcm91cGAsXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXRzOiBbXG4gICAgICAgICAgICBzZXJ2aWNlLmxvYWRCYWxhbmNlclRhcmdldCh7XG4gICAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHByaW1hcnlDb250YWluZXIuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgICAgY29udGFpbmVyUG9ydFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBvcnQ6IGNvbnRhaW5lclBvcnQsXG4gICAgICAgICAgcHJvdG9jb2w6IEFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgICAgICBoZWFsdGhDaGVjazogaGVhbHRoQ2hlY2tDb25maWdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGktc2VydmljZSAtIGNyZWF0ZSB0YXJnZXQgZ3JvdXAgd2l0aCByb3V0aW5nIHJ1bGVzXG4gICAgICBjb25zdCBwcmlvcml0eSA9IHNlcnZpY2VQcm9wcy5yb3V0aW5nPy5wcmlvcml0eSB8fCB0aGlzLm5leHRQcmlvcml0eSsrO1xuXG4gICAgICBjb25zdCB0YXJnZXRHcm91cCA9IHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIhLmFkZFRhcmdldHMoXG4gICAgICAgIGAke3NlcnZpY2VOYW1lfVRhcmdldHNgLFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0czogW1xuICAgICAgICAgICAgc2VydmljZS5sb2FkQmFsYW5jZXJUYXJnZXQoe1xuICAgICAgICAgICAgICBjb250YWluZXJOYW1lOiBwcmltYXJ5Q29udGFpbmVyLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcnRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwb3J0OiBjb250YWluZXJQb3J0LFxuICAgICAgICAgIHByb3RvY29sOiBBcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGhlYWx0aENoZWNrQ29uZmlnLFxuICAgICAgICAgIGNvbmRpdGlvbnM6IHRoaXMuYnVpbGRSb3V0aW5nQ29uZGl0aW9ucyhzZXJ2aWNlUHJvcHMpLFxuICAgICAgICAgIHByaW9yaXR5XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0YXJnZXRHcm91cDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUm91dGluZ0NvbmRpdGlvbnMoXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHNcbiAgKTogTGlzdGVuZXJDb25kaXRpb25bXSB7XG4gICAgY29uc3QgY29uZGl0aW9uczogTGlzdGVuZXJDb25kaXRpb25bXSA9IFtdO1xuXG4gICAgaWYgKHNlcnZpY2VQcm9wcy5yb3V0aW5nPy5wYXRoKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIExpc3RlbmVyQ29uZGl0aW9uLnBhdGhQYXR0ZXJucyhbc2VydmljZVByb3BzLnJvdXRpbmcucGF0aF0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc2VydmljZVByb3BzLnJvdXRpbmc/Lmhvc3QpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgTGlzdGVuZXJDb25kaXRpb24uaG9zdEhlYWRlcnMoW3NlcnZpY2VQcm9wcy5yb3V0aW5nLmhvc3RdKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkU2VydmljZVNjYWxpbmcoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wcyxcbiAgICBzZXJ2aWNlOiBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2VcbiAgKTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5IHtcbiAgICBjb25zdCBzY2FsYWJsZVRhcmdldCA9IG5ldyBTY2FsYWJsZVRhcmdldChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtzZXJ2aWNlTmFtZX1TY2FsYWJsZVRhcmdldGAsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IFNlcnZpY2VOYW1lc3BhY2UuRUNTLFxuICAgICAgICByZXNvdXJjZUlkOiBgc2VydmljZS8ke3RoaXMuY2x1c3Rlci5jbHVzdGVyTmFtZX0vJHtzZXJ2aWNlLnNlcnZpY2VOYW1lfWAsXG4gICAgICAgIHNjYWxhYmxlRGltZW5zaW9uOiBcImVjczpzZXJ2aWNlOkRlc2lyZWRDb3VudFwiLFxuICAgICAgICBtaW5DYXBhY2l0eTogc2VydmljZVByb3BzLm1pbkNhcGFjaXR5ID8/IDIsXG4gICAgICAgIG1heENhcGFjaXR5OiBzZXJ2aWNlUHJvcHMubWF4Q2FwYWNpdHkgPz8gMTBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3koXG4gICAgICB0aGlzLFxuICAgICAgYCR7c2VydmljZU5hbWV9U2NhbGluZ1BvbGljeWAsXG4gICAgICB7XG4gICAgICAgIHNjYWxpbmdUYXJnZXQ6IHNjYWxhYmxlVGFyZ2V0LFxuICAgICAgICBwcmVkZWZpbmVkTWV0cmljOlxuICAgICAgICAgIHNlcnZpY2VQcm9wcy5zY2FsaW5nVHlwZSA9PT0gU2NhbGluZ1R5cGUuTUVNT1JZXG4gICAgICAgICAgICA/IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9NRU1PUllfVVRJTElaQVRJT05cbiAgICAgICAgICAgIDogUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTixcbiAgICAgICAgdGFyZ2V0VmFsdWU6IDUwLFxuICAgICAgICBzY2FsZUluQ29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBzY2FsZU91dENvb2xkb3duOiBEdXJhdGlvbi5zZWNvbmRzKDYwKVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzRWMyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhcGFjaXR5UHJvdmlkZXIgPT09IFwiRUMyXCI7XG4gIH1cblxuICBwcml2YXRlIGlzRmFyZ2F0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkZBUkdBVEVcIiB8fFxuICAgICAgdGhpcy5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkZBUkdBVEVfU1BPVFwiXG4gICAgKTtcbiAgfVxuXG4gIGFkZENsdXN0ZXIocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuY2x1c3RlciA9IG5ldyBDZGtDbHVzdGVyKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfWAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgICAgY29udGFpbmVySW5zaWdodHNWMjogQ29udGFpbmVySW5zaWdodHMuRU5BQkxFRCxcbiAgICAgIGVuYWJsZUZhcmdhdGVDYXBhY2l0eVByb3ZpZGVyczogdGhpcy5pc0ZhcmdhdGUoKVxuICAgIH0pO1xuXG4gICAgLy8gRm9yIEZhcmdhdGUgY2x1c3RlcnMsIGZpbmQgdGhlIGludGVybmFsIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zXG4gICAgLy8gdGhhdCBDREsgY3JlYXRlcyB3aGVuIGVuYWJsZUZhcmdhdGVDYXBhY2l0eVByb3ZpZGVycyBpcyB0cnVlLlxuICAgIC8vIFdlIG5lZWQgdGhpcyByZWZlcmVuY2UgdG8gZXN0YWJsaXNoIHByb3BlciBkZWxldGlvbiBkZXBlbmRlbmNpZXMuXG4gICAgaWYgKHRoaXMuaXNGYXJnYXRlKCkpIHtcbiAgICAgIC8vIENESyBjcmVhdGVzIHRoaXMgYXMgYSBjaGlsZCBvZiB0aGUgY2x1c3RlciB3aXRoIGEgc3BlY2lmaWMgbmFtaW5nIHBhdHRlcm5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jbHVzdGVyLm5vZGUuY2hpbGRyZW47XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5mYXJnYXRlQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9ucyA9IGNoaWxkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLFxuICAgICAgdmFsdWU6IHRoaXMuY2x1c3Rlci5jbHVzdGVyQXJuXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUNsdXN0ZXJBcm5gLCB7XG4gICAgICBrZXk6IFwiQ2x1c3RlckFyblwiLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9Q2x1c3RlckFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5jbHVzdGVyLmNsdXN0ZXJBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYEVDUyBDbHVzdGVyIEFSTiBmb3IgJHtwcm9wcy5jbHVzdGVyTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBhZGRBdXRvU2NhbGluZ0dyb3VwKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBjb25zdCBlYzJDb25maWcgPSBwcm9wcy5lYzJDb25maWcgfHwge307XG4gICAgY29uc3QgaW5zdGFuY2VUeXBlID0gZWMyQ29uZmlnLmluc3RhbmNlVHlwZSB8fCBcInQzLm1pY3JvXCI7XG4gICAgY29uc3QgYW1pSGFyZHdhcmVUeXBlID1cbiAgICAgIGVjMkNvbmZpZy5hbWlIYXJkd2FyZVR5cGUgPT09IFwiU1RBTkRBUkRcIlxuICAgICAgICA/IEFtaUhhcmR3YXJlVHlwZS5TVEFOREFSRFxuICAgICAgICA6IEFtaUhhcmR3YXJlVHlwZS5BUk07XG4gICAgY29uc3QgbWluQ2FwYWNpdHkgPSBlYzJDb25maWcubWluQ2FwYWNpdHkgPz8gMjtcbiAgICBjb25zdCBtYXhDYXBhY2l0eSA9IGVjMkNvbmZpZy5tYXhDYXBhY2l0eSA/PyAzO1xuXG4gICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAodGhpcywgYEFzZ1NlY3VyaXR5R3JvdXBgLCB7XG4gICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHtwcm9wcy5jbHVzdGVyTmFtZX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgIH0pO1xuXG4gICAgLy8gT3BlbiBjb250YWluZXIgcG9ydHMgZm9yIGRpcmVjdCBFQzIgYWNjZXNzXG4gICAgaWYgKHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCkge1xuICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNlcnZpY2UuY29udGFpbmVycykge1xuICAgICAgICAgIGlmIChjb250YWluZXIucG9ydCkge1xuICAgICAgICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICAgICAgICBQZWVyLmFueUlwdjQoKSxcbiAgICAgICAgICAgICAgUG9ydC50Y3AoY29udGFpbmVyLnBvcnQpLFxuICAgICAgICAgICAgICBgRGlyZWN0IGFjY2VzcyB0byBjb250YWluZXIgcG9ydCAke2NvbnRhaW5lci5wb3J0fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvU2NhbGluZ0dyb3VwID0gbmV3IEF1dG9TY2FsaW5nR3JvdXAodGhpcywgXCJBdXRvU2NhbGluZ0dyb3VwXCIsIHtcbiAgICAgIGF1dG9TY2FsaW5nR3JvdXBOYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BdXRvU2NhbGluZ0dyb3VwYCxcbiAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eUdyb3VwOiB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAsXG4gICAgICBtaW5DYXBhY2l0eSxcbiAgICAgIG1heENhcGFjaXR5LFxuICAgICAgaW5zdGFuY2VUeXBlOiBuZXcgSW5zdGFuY2VUeXBlKGluc3RhbmNlVHlwZSksXG4gICAgICBjYXBhY2l0eVJlYmFsYW5jZTogdHJ1ZSxcbiAgICAgIGluc3RhbmNlTW9uaXRvcmluZzogTW9uaXRvcmluZy5CQVNJQyxcbiAgICAgIG1hY2hpbmVJbWFnZTogRWNzT3B0aW1pemVkSW1hZ2UuYW1hem9uTGludXgyKGFtaUhhcmR3YXJlVHlwZSlcbiAgICB9KTtcblxuICAgIHRoaXMuYXNnQ2FwYWNpdHlQcm92aWRlciA9IG5ldyBBc2dDYXBhY2l0eVByb3ZpZGVyKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQXNnQ2FwYWNpdHlQcm92aWRlclwiLFxuICAgICAge1xuICAgICAgICBhdXRvU2NhbGluZ0dyb3VwOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAsXG4gICAgICAgIGVuYWJsZU1hbmFnZWREcmFpbmluZzogdHJ1ZSxcbiAgICAgICAgZW5hYmxlTWFuYWdlZFRlcm1pbmF0aW9uUHJvdGVjdGlvbjogZmFsc2VcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5jbHVzdGVyLmFkZEFzZ0NhcGFjaXR5UHJvdmlkZXIodGhpcy5hc2dDYXBhY2l0eVByb3ZpZGVyKTtcblxuICAgIC8vIENyZWF0ZSBkcmFpbiB3YWl0ZXIgY3VzdG9tIHJlc291cmNlIHRoYXQgaGFuZGxlcyBjYXBhY2l0eSBwcm92aWRlciBjbGVhbnVwIGR1cmluZyBkZWxldGlvbi5cbiAgICAvLyBUaGlzIHJlc291cmNlIHdhaXRzIGZvciBFQ1Mgc2VydmljZXMgdG8gZHJhaW4sIHRoZW4gZGlzYXNzb2NpYXRlcyB0aGUgY2FwYWNpdHkgcHJvdmlkZXJcbiAgICAvLyBmcm9tIHRoZSBjbHVzdGVyIGJlZm9yZSBDbG91ZEZvcm1hdGlvbiBhdHRlbXB0cyB0byBkZWxldGUgdGhlIEFzZ0NhcGFjaXR5UHJvdmlkZXIuXG4gICAgLy9cbiAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGZvciBERUxFVEUgb3JkZXI6XG4gICAgLy8gICBTZXJ2aWNlcyBkZWxldGVkIOKGkiBEcmFpbldhaXRlciBydW5zIOKGkiBBc2dDYXBhY2l0eVByb3ZpZGVyIGRlbGV0ZWQg4oaSIENsdXN0ZXIgZGVsZXRlZFxuICAgIC8vXG4gICAgLy8gVGhlIGRyYWluIHdhaXRlciBtdXN0IGRlcGVuZCBvbiBBc2dDYXBhY2l0eVByb3ZpZGVyIHNvIGl0IHJ1bnMgQkVGT1JFIHRoZSBwcm92aWRlciBpcyBkZWxldGVkLlxuICAgIC8vIFNlcnZpY2VzIG11c3QgZGVwZW5kIG9uIHRoZSBkcmFpbiB3YWl0ZXIgc28gdGhleSdyZSBkZWxldGVkIEJFRk9SRSB0aGUgZHJhaW4gd2FpdGVyIHJ1bnMuXG4gICAgdGhpcy5kcmFpbldhaXRlciA9IG5ldyBDYXBhY2l0eVByb3ZpZGVyRHJhaW5XYWl0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgXCJDYXBhY2l0eVByb3ZpZGVyRHJhaW5XYWl0ZXJcIixcbiAgICAgIHtcbiAgICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgICAgICBjYXBhY2l0eVByb3ZpZGVyTmFtZTogdGhpcy5hc2dDYXBhY2l0eVByb3ZpZGVyLmNhcGFjaXR5UHJvdmlkZXJOYW1lXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIERyYWluV2FpdGVyIGRlcGVuZHMgb24gQXNnQ2FwYWNpdHlQcm92aWRlcjpcbiAgICAvLyAtIENSRUFURTogQXNnQ2FwYWNpdHlQcm92aWRlciBjcmVhdGVkIGZpcnN0LCB0aGVuIERyYWluV2FpdGVyXG4gICAgLy8gLSBERUxFVEU6IERyYWluV2FpdGVyIGRlbGV0ZWQgZmlyc3QgKHJ1bnMgTGFtYmRhKSwgdGhlbiBBc2dDYXBhY2l0eVByb3ZpZGVyXG4gICAgdGhpcy5kcmFpbldhaXRlci5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5hc2dDYXBhY2l0eVByb3ZpZGVyKTtcbiAgfVxuXG4gIGFkZExvYWRCYWxhbmNlcihwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgY29uc3QgZGVmYXVsdExvYWRCYWxhbmNlck5hbWUgPSBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgO1xuICAgIGNvbnN0IHN1cHBvcnRlZE5hbWVMZW5ndGggPSAzMjtcblxuICAgIGxldCB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lID1cbiAgICAgIGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lLmxlbmd0aCA+IHN1cHBvcnRlZE5hbWVMZW5ndGhcbiAgICAgICAgPyBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZS5zdWJzdHJpbmcoMCwgc3VwcG9ydGVkTmFtZUxlbmd0aClcbiAgICAgICAgOiBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZTtcblxuICAgIHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUgPSB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLnJlcGxhY2UoLy0rJC8sIFwiXCIpO1xuXG4gICAgY29uc3QgaXNJbnRlcm5hbCA9IHByb3BzLmNsdXN0ZXI/LmxvYWRCYWxhbmNlciA9PT0gXCJpbnRlcm5hbFwiO1xuXG4gICAgaWYgKHRoaXMuaXNFYzIoKSkge1xuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBMb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHtwcm9wcy5jbHVzdGVyTmFtZX0gbG9hZCBiYWxhbmNlcmBcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zLmFsbG93VG8oXG4gICAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCEsXG4gICAgICAgIFBvcnQuYWxsVGNwKClcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyID0gbmV3IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICAgIGludGVybmV0RmFjaW5nOiAhaXNJbnRlcm5hbCxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwOiB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyTmFtZTogdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSxcbiAgICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgICBzdWJuZXRUeXBlOiBpc0ludGVybmFsXG4gICAgICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgICAgIDogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCEuY29ubmVjdGlvbnMuYWxsb3dGcm9tKFxuICAgICAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gICAgICAgIFBvcnQudGNwUmFuZ2UoNDkxNTIsIDY1NTM1KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkQmFsYW5jZXIgPSBuZXcgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlcmAsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgICAgaW50ZXJuZXRGYWNpbmc6ICFpc0ludGVybmFsLFxuICAgICAgICAgIGxvYWRCYWxhbmNlck5hbWU6IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUsXG4gICAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgICAgc3VibmV0VHlwZTogaXNJbnRlcm5hbFxuICAgICAgICAgICAgICA/IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgICAgICA6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyRG5zTmFtZWAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyRG5zTmFtZWAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJEbnNOYW1lYCxcbiAgICAgIHZhbHVlOiB0aGlzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlclVybGAsIHtcbiAgICAgIGtleTogXCJMb2FkQmFsYW5jZXJVcmxcIixcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlclVybGAsXG4gICAgICB2YWx1ZTogYGh0dHA6Ly8ke3RoaXMubG9hZEJhbGFuY2VyLmxvYWRCYWxhbmNlckRuc05hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBgTG9hZCBCYWxhbmNlciBVUkwgZm9yICR7cHJvcHMuY2x1c3Rlck5hbWV9YFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREaXJlY3RBY2Nlc3NPdXRwdXRzKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBpZiAoIXRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCB8fCAhdGhpcy5hdXRvU2NhbGluZ0dyb3VwKSByZXR1cm47XG5cbiAgICAvLyBHZXQgdGhlIGZpcnN0IGNvbnRhaW5lciBwb3J0IChmb3IgdXNlciBpbnN0cnVjdGlvbnMpXG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9XG4gICAgICBwcm9wcy5zZXJ2aWNlcy5mbGF0TWFwKChzKSA9PiBzLmNvbnRhaW5lcnMpLmZpbmQoKGMpID0+IGMucG9ydCk/LnBvcnQgfHxcbiAgICAgIDMwMDA7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUF1dG9TY2FsaW5nR3JvdXBOYW1lYCwge1xuICAgICAga2V5OiBcIkF1dG9TY2FsaW5nR3JvdXBOYW1lXCIsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BdXRvU2NhbGluZ0dyb3VwTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5hdXRvU2NhbGluZ0dyb3VwLmF1dG9TY2FsaW5nR3JvdXBOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBSdW46IGF3cyBhdXRvc2NhbGluZyBkZXNjcmliZS1hdXRvLXNjYWxpbmctZ3JvdXBzIC0tYXV0by1zY2FsaW5nLWdyb3VwLW5hbWVzIDxuYW1lPiB0byBmaW5kIGluc3RhbmNlIElQYFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EaXJlY3RBY2Nlc3NQb3J0YCwge1xuICAgICAga2V5OiBcIkRpcmVjdEFjY2Vzc1BvcnRcIixcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfURpcmVjdEFjY2Vzc1BvcnRgLFxuICAgICAgdmFsdWU6IFN0cmluZyhjb250YWluZXJQb3J0KSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQWNjZXNzIHlvdXIgYXBwIGF0IGh0dHA6Ly88RUMyLVBVQkxJQy1JUD46JHtjb250YWluZXJQb3J0fWBcbiAgICB9KTtcbiAgfVxuXG4gIGFkZExvYWRCYWxhbmNlckxpc3RlbmVyKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBpZiAoIXRoaXMubG9hZEJhbGFuY2VyKSByZXR1cm47XG5cbiAgICAvLyBEZXRlcm1pbmUgcG9ydCBiYXNlZCBvbiB3aGV0aGVyIEhUVFBTIGlzIGNvbmZpZ3VyZWQgKGRvbWFpbiArIGNlcnQpXG4gICAgY29uc3QgcG9ydCA9IHRoaXMuY2VydGlmaWNhdGUgPyA0NDMgOiA4MDtcblxuICAgIC8vIERlZmF1bHQgYWN0aW9uIGZvciByZXF1ZXN0cyB0aGF0IGRvbid0IG1hdGNoIGFueSByb3V0aW5nIHJ1bGVcbiAgICAvLyBSZXR1cm5zIDQwNCBmb3IgbXVsdGktc2VydmljZSBjbHVzdGVycyB3aXRoIHJvdXRpbmcgcnVsZXNcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gTGlzdGVuZXJBY3Rpb24uZml4ZWRSZXNwb25zZSg0MDQsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIG1lc3NhZ2VCb2R5OiBcIk5vdCBGb3VuZFwiXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jZXJ0aWZpY2F0ZSkge1xuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1MaXN0ZW5lcmAsXG4gICAgICAgIHtcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIGNlcnRpZmljYXRlczogW3RoaXMuY2VydGlmaWNhdGVdLFxuICAgICAgICAgIGRlZmF1bHRBY3Rpb25cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1MaXN0ZW5lcmAsXG4gICAgICAgIHtcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIGRlZmF1bHRBY3Rpb25cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhZGRIb3N0ZWRab25lKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBTdXBwb3J0IGJvdGggbmV3IGNsdXN0ZXIuZG9tYWluIGFuZCBhZHZhbmNlZCBjbHVzdGVyLmRvbWFpbkNvbmZpZ1xuICAgIGNvbnN0IGRvbWFpbkNvbmZpZyA9IHByb3BzLmNsdXN0ZXI/LmRvbWFpbkNvbmZpZztcbiAgICBjb25zdCBzaW1wbGVEb21haW4gPSBwcm9wcy5jbHVzdGVyPy5kb21haW47XG5cbiAgICBpZiAoIWRvbWFpbkNvbmZpZyAmJiAhc2ltcGxlRG9tYWluKSByZXR1cm47XG5cbiAgICBjb25zdCBkb21haW5OYW1lID0gZG9tYWluQ29uZmlnPy5kb21haW5OYW1lIHx8IHNpbXBsZURvbWFpbiE7XG5cbiAgICBpZiAoIWRvbWFpbkNvbmZpZz8uaG9zdGVkWm9uZSkge1xuICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IG5ldyBGamFsbEhvc3RlZFpvbmUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUhvc3RlZFpvbmVgLFxuICAgICAgICB7XG4gICAgICAgICAgem9uZU5hbWU6IGRvbWFpbk5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5ob3N0ZWRab25lID0gaG9zdGVkWm9uZS5nZXRJbnRlcm5hbEhvc3RlZFpvbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ob3N0ZWRab25lID0gZG9tYWluQ29uZmlnLmhvc3RlZFpvbmUuZ2V0SW50ZXJuYWxIb3N0ZWRab25lKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkb21haW5Db25maWc/LmNlcnRpZmljYXRlKSB7XG4gICAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1DZXJ0aWZpY2F0ZWAsXG4gICAgICAgIHtcbiAgICAgICAgICBkb21haW5OYW1lLFxuICAgICAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMuaG9zdGVkWm9uZSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYWR2YW5jZWQgcm91dGluZyBwb2xpY2llcyAobGF0ZW5jeSwgd2VpZ2h0ZWQsIGdlbylcbiAgICBpZiAoZG9tYWluQ29uZmlnKSB7XG4gICAgICBjb25zdCBsYXRlbmN5Q29uZmlnID0gZG9tYWluQ29uZmlnIGFzIExhdGVuY3lEb21haW5Db25maWc7XG4gICAgICBjb25zdCB3ZWlnaHRlZENvbmZpZyA9IGRvbWFpbkNvbmZpZyBhcyBXZWlnaHRlZERvbWFpbkNvbmZpZztcbiAgICAgIGNvbnN0IGdlb0NvbmZpZyA9IGRvbWFpbkNvbmZpZyBhcyBHZW9Mb2NhdGlvbkRvbWFpbkNvbmZpZztcblxuICAgICAgY29uc3QgaGFzUm91dGluZ1BvbGljeTogYm9vbGVhbiA9XG4gICAgICAgICEhbGF0ZW5jeUNvbmZpZz8ucmVnaW9uIHx8XG4gICAgICAgIHdlaWdodGVkQ29uZmlnPy53ZWlnaHQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAhIWdlb0NvbmZpZz8uZ2VvTG9jYXRpb247XG5cbiAgICAgIGxldCBzZXRJZGVudGlmaWVyID0gZG9tYWluQ29uZmlnLnNldElkZW50aWZpZXI7XG4gICAgICBpZiAoaGFzUm91dGluZ1BvbGljeSAmJiAhc2V0SWRlbnRpZmllcikge1xuICAgICAgICBpZiAobGF0ZW5jeUNvbmZpZz8ucmVnaW9uKSB7XG4gICAgICAgICAgc2V0SWRlbnRpZmllciA9IGAke3Byb3BzLmNsdXN0ZXJOYW1lfSR7bGF0ZW5jeUNvbmZpZy5yZWdpb259YDtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWlnaHRlZENvbmZpZz8ud2VpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRJZGVudGlmaWVyID0gYCR7cHJvcHMuY2x1c3Rlck5hbWV9V2VpZ2h0JHt3ZWlnaHRlZENvbmZpZy53ZWlnaHR9YDtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9Db25maWc/Lmdlb0xvY2F0aW9uKSB7XG4gICAgICAgICAgc2V0SWRlbnRpZmllciA9IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUdlb2A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHRoaXMuYVJlY29yZCA9IG5ldyBBUmVjb3JkKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUFSZWNvcmRgLCB7XG4gICAgICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZSxcbiAgICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgICAgbmV3IExvYWRCYWxhbmNlclRhcmdldCh0aGlzLmxvYWRCYWxhbmNlciwge1xuICAgICAgICAgICAgICBldmFsdWF0ZVRhcmdldEhlYWx0aDogaGFzUm91dGluZ1BvbGljeVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlZ2lvbjogbGF0ZW5jeUNvbmZpZz8ucmVnaW9uLFxuICAgICAgICAgIHdlaWdodDogd2VpZ2h0ZWRDb25maWc/LndlaWdodCxcbiAgICAgICAgICBnZW9Mb2NhdGlvbjogZ2VvQ29uZmlnPy5nZW9Mb2NhdGlvbixcbiAgICAgICAgICBzZXRJZGVudGlmaWVyOiBzZXRJZGVudGlmaWVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2ltcGxlRG9tYWluICYmIHRoaXMubG9hZEJhbGFuY2VyKSB7XG4gICAgICAvLyBTaW1wbGUgZG9tYWluIC0ganVzdCBjcmVhdGUgQSByZWNvcmRcbiAgICAgIHRoaXMuYVJlY29yZCA9IG5ldyBBUmVjb3JkKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUFSZWNvcmRgLCB7XG4gICAgICAgIHJlY29yZE5hbWU6IGRvbWFpbk5hbWUsXG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyBMb2FkQmFsYW5jZXJUYXJnZXQodGhpcy5sb2FkQmFsYW5jZXIpXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBFY3NDbHVzdGVyUHJvcHNcbiAgKTogKHNiOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdCB7XG4gICAgcmV0dXJuIChzYjogU3RhY2tCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBuZXdQcm9wczogRWNzQ2x1c3RlclByb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogKHNiLmdldE5ldHdvcmsoKSBhcyBJVnBjKSB8fCBwcm9wcy52cGNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgdGhpcyhzYi5nZXRTdGFjaygpLCBpZCwgbmV3UHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
1026
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBb0I2QjtBQUM3QixpREFTNkI7QUFDN0IsMkNBQXVDO0FBR3ZDLDZDQUEyRDtBQUUzRCx1RkFPZ0Q7QUFDaEQsaURBUTZCO0FBQzdCLHVGQUtnRDtBQUNoRCxpREFBMEQ7QUFDMUQsdUVBQXdEO0FBQ3hELCtFQUc0QztBQUM1Qyx5REFLaUM7QUFDakMseUVBQXFFO0FBQ3JFLGlEQUFpRDtBQUNqRCxpRUFBMkU7QUFFM0UsaUVBQWlGO0FBQ2pGLHdEQUFxRDtBQUlyRDs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHO0lBQzVCLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLElBQUk7SUFDSixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsT0FBTztDQUNSLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLFlBQW9CO0lBQ2hELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzNDLENBQUMsQ0FBQyx5QkFBZSxDQUFDLEdBQUc7UUFDckIsQ0FBQyxDQUFDLHlCQUFlLENBQUMsUUFBUSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxnQ0FBZ0M7SUFHcEMsWUFBWSxPQUFtQjtRQUM3QixJQUFJ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Q0FDRjtBQXR0Q0QsNkJBc3RDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF3c0xvZ0RyaXZlcixcbiAgQ2x1c3RlciBhcyBDZGtDbHVzdGVyLFxuICBDb250YWluZXJJbWFnZSxcbiAgRmFyZ2F0ZVNlcnZpY2UsXG4gIEZhcmdhdGVUYXNrRGVmaW5pdGlvbixcbiAgRWMyU2VydmljZSxcbiAgRWMyVGFza0RlZmluaXRpb24sXG4gIE5ldHdvcmtNb2RlLFxuICBQcm9wYWdhdGVkVGFnU291cmNlLFxuICB0eXBlIFJlcG9zaXRvcnlJbWFnZSxcbiAgdHlwZSBDb250YWluZXJEZWZpbml0aW9uLFxuICBDb250YWluZXJJbnNpZ2h0cyxcbiAgUGxhY2VtZW50U3RyYXRlZ3ksXG4gIEFzZ0NhcGFjaXR5UHJvdmlkZXIsXG4gIEVjc09wdGltaXplZEltYWdlLFxuICBBbWlIYXJkd2FyZVR5cGUsXG4gIENwdUFyY2hpdGVjdHVyZSxcbiAgT3BlcmF0aW5nU3lzdGVtRmFtaWx5LFxuICBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwLFxuICB0eXBlIElWcGMsXG4gIEluc3RhbmNlVHlwZSxcbiAgUGVlcixcbiAgUG9ydCxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyB0eXBlIFN0YWNrQnVpbGRlciB9IGZyb20gXCIuLi9iYXNlL2F3c1N0YWNrXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBBc3BlY3RzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgdHlwZSB7IElBc3BlY3QgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXBwbGljYXRpb25MaXN0ZW5lcixcbiAgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gIEFwcGxpY2F0aW9uUHJvdG9jb2wsXG4gIHR5cGUgSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAsXG4gIExpc3RlbmVyQWN0aW9uLFxuICBMaXN0ZW5lckNvbmRpdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7XG4gIEVmZmVjdCxcbiAgdHlwZSBJTWFuYWdlZFBvbGljeSxcbiAgUG9saWN5LFxuICB0eXBlIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIFByZWRlZmluZWRNZXRyaWMsXG4gIFNjYWxhYmxlVGFyZ2V0LFxuICBTZXJ2aWNlTmFtZXNwYWNlLFxuICBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcHBsaWNhdGlvbmF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyBTZWNyZXQgYXMgRWNzU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlLFxuICBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFSZWNvcmQsXG4gIFJlY29yZFRhcmdldCxcbiAgdHlwZSBJSG9zdGVkWm9uZSxcbiAgdHlwZSBHZW9Mb2NhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IExvYWRCYWxhbmNlclRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXAsIE1vbml0b3JpbmcgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWF1dG9zY2FsaW5nXCI7XG5cbmltcG9ydCB7IEhvc3RlZFpvbmUgYXMgRmphbGxIb3N0ZWRab25lIH0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9ob3N0ZWRab25lXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbS9zZWN1cml0eUdyb3VwXCI7XG5cbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uL3NlY3JldHNcIjtcblxuLyoqXG4gKiBJbnN0YW5jZSB0eXBlIHByZWZpeGVzIHRoYXQgdXNlIEFSTTY0IGFyY2hpdGVjdHVyZSAoR3Jhdml0b24gcHJvY2Vzc29ycykuXG4gKiBBbGwgb3RoZXIgcHJlZml4ZXMgYXJlIGFzc3VtZWQgdG8gYmUgeDg2LTY0IChTVEFOREFSRCkuXG4gKi9cbmNvbnN0IEFSTV9JTlNUQU5DRV9QUkVGSVhFUyA9IFtcbiAgXCJ0NGdcIixcbiAgXCJjNmdcIixcbiAgXCJjNmdkXCIsXG4gIFwiYzZnblwiLFxuICBcImM3Z1wiLFxuICBcImM3Z2RcIixcbiAgXCJjN2duXCIsXG4gIFwicjZnXCIsXG4gIFwicjZnZFwiLFxuICBcInI3Z1wiLFxuICBcInI3Z2RcIixcbiAgXCJtNmdcIixcbiAgXCJtNmdkXCIsXG4gIFwibTdnXCIsXG4gIFwibTdnZFwiLFxuICBcImExXCIsXG4gIFwieDJnZFwiLFxuICBcImltNGduXCIsXG4gIFwiaXM0Z2VuXCIsXG4gIFwiaTRnXCIsXG4gIFwiaHBjN2dcIlxuXTtcblxuLyoqXG4gKiBJbmZlciB0aGUgQU1JIGhhcmR3YXJlIHR5cGUgZnJvbSBhbiBFQzIgaW5zdGFuY2UgdHlwZS5cbiAqIFVzZXMgdGhlIGluc3RhbmNlIHR5cGUgcHJlZml4IHRvIGRldGVybWluZSBpZiBpdCdzIEFSTSAoR3Jhdml0b24pIG9yIHg4Ni02NC5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VUeXBlIC0gRUMyIGluc3RhbmNlIHR5cGUgKGUuZy4sIFwidDRnLm1pY3JvXCIsIFwidDMuc21hbGxcIilcbiAqIEByZXR1cm5zIEFtaUhhcmR3YXJlVHlwZS5BUk0gZm9yIEdyYXZpdG9uIGluc3RhbmNlcywgQW1pSGFyZHdhcmVUeXBlLlNUQU5EQVJEIGZvciBJbnRlbC9BTURcbiAqL1xuZnVuY3Rpb24gaW5mZXJBbWlIYXJkd2FyZVR5cGUoaW5zdGFuY2VUeXBlOiBzdHJpbmcpOiBBbWlIYXJkd2FyZVR5cGUge1xuICBjb25zdCBwcmVmaXggPSBpbnN0YW5jZVR5cGUuc3BsaXQoXCIuXCIpWzBdO1xuICByZXR1cm4gQVJNX0lOU1RBTkNFX1BSRUZJWEVTLmluY2x1ZGVzKHByZWZpeClcbiAgICA/IEFtaUhhcmR3YXJlVHlwZS5BUk1cbiAgICA6IEFtaUhhcmR3YXJlVHlwZS5TVEFOREFSRDtcbn1cblxuLyoqXG4gKiBDREsgQXNwZWN0IHRoYXQgZml4ZXMgY2FwYWNpdHkgcHJvdmlkZXIgZGVsZXRpb24gZGVwZW5kZW5jaWVzLlxuICpcbiAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBDREsgYnVnICMxNTM2NiB3aGVyZSBFQ1Mgc2VydmljZXMgZG9uJ3QgcHJvcGVybHlcbiAqIGRlcGVuZCBvbiBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9ucywgY2F1c2luZyBcImNhcGFjaXR5IHByb3ZpZGVyXG4gKiBpcyBpbiB1c2VcIiBlcnJvcnMgZHVyaW5nIHN0YWNrIGRlbGV0aW9uLlxuICpcbiAqIFRoZSBhc3BlY3QgcnVucyBhdCBzeW50aCB0aW1lICh3aGVuIGFzc29jaWF0aW9ucyBleGlzdCkgYW5kIGFkZHM6XG4gKiAtIFNlcnZpY2UgZGVwZW5kcyBvbiBDZm5DbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9uc1xuICpcbiAqIERFTEVURSBvcmRlciBiZWNvbWVzOiBTZXJ2aWNlcyDihpIgQXNzb2NpYXRpb25zIOKGkiBDbHVzdGVyXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE1MzY2XG4gKi9cbmNsYXNzIENhcGFjaXR5UHJvdmlkZXJEZXBlbmRlbmN5QXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2x1c3RlcjogQ2RrQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihjbHVzdGVyOiBDZGtDbHVzdGVyKSB7XG4gICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjtcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBGaW5kIEVDUyBzZXJ2aWNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsdXN0ZXJcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEZhcmdhdGVTZXJ2aWNlIHx8IG5vZGUgaW5zdGFuY2VvZiBFYzJTZXJ2aWNlKSB7XG4gICAgICAvLyBGaW5kIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zIGluIHRoZSBjbHVzdGVyJ3MgZGVzY2VuZGFudHNcbiAgICAgIGNvbnN0IGFzc29jaWF0aW9ucyA9IHRoaXMuY2x1c3Rlci5ub2RlXG4gICAgICAgIC5maW5kQWxsKClcbiAgICAgICAgLmZpbmQoXG4gICAgICAgICAgKGNoaWxkKTogY2hpbGQgaXMgQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnMgPT5cbiAgICAgICAgICAgIGNoaWxkIGluc3RhbmNlb2YgQ2ZuQ2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgaWYgKGFzc29jaWF0aW9ucykge1xuICAgICAgICAvLyBBZGQgZGVwZW5kZW5jeTogU2VydmljZSDihpIgQXNzb2NpYXRpb25zXG4gICAgICAgIC8vIERFTEVURSBvcmRlcjogU2VydmljZSBkZWxldGVkIGZpcnN0LCB0aGVuIEFzc29jaWF0aW9uc1xuICAgICAgICBub2RlLm5vZGUuYWRkRGVwZW5kZW5jeShhc3NvY2lhdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZW51bSBQcm90b2NvbCB7XG4gIEhUVFAsXG4gIEhUVFBTXG59XG5cbmV4cG9ydCBlbnVtIFNjYWxpbmdUeXBlIHtcbiAgQ1BVID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTixcbiAgTUVNT1JZID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxufVxuXG5leHBvcnQgdHlwZSBFY3NDYXBhY2l0eVByb3ZpZGVyID0gXCJGQVJHQVRFXCIgfCBcIkZBUkdBVEVfU1BPVFwiIHwgXCJFQzJcIjtcblxuLyoqXG4gKiBFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBmb3IgRUNTIEVDMi1iYWNrZWQgY2x1c3RlcnMuXG4gKiBPbmx5IHVzZWQgd2hlbiBjYXBhY2l0eVByb3ZpZGVyIGlzIFwiRUMyXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWMyQ2FwYWNpdHlDb25maWcge1xuICAvKiogRUMyIGluc3RhbmNlIHR5cGUuIERlZmF1bHQ6IFwidDMubWljcm9cIiAqL1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIC8qKiBBTUkgaGFyZHdhcmUgdHlwZS4gRGVmYXVsdDogXCJBUk1cIiAoR3Jhdml0b24gLSBiZXR0ZXIgY29zdC9wZXJmb3JtYW5jZSkgKi9cbiAgYW1pSGFyZHdhcmVUeXBlPzogXCJBUk1cIiB8IFwiU1RBTkRBUkRcIjtcbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMiAqL1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMyAqL1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqIE1lbW9yeSBsaW1pdCBpbiBNaUIgZm9yIHRoZSBjb250YWluZXIuIERlZmF1bHQ6IDEwMjQgKi9cbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRG9tYWluIGNvbmZpZ3VyYXRpb24gZm9yIEhUVFBTIGFuZCBETlMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9tYWluQmFzZUNvbmZpZyB7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbiAgaG9zdGVkWm9uZT86IEZqYWxsSG9zdGVkWm9uZTtcbiAgY2VydGlmaWNhdGU/OiBDZXJ0aWZpY2F0ZTtcbiAgc2V0SWRlbnRpZmllcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXRlbmN5RG9tYWluQ29uZmlnIGV4dGVuZHMgRG9tYWluQmFzZUNvbmZpZyB7XG4gIHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlaWdodGVkRG9tYWluQ29uZmlnIGV4dGVuZHMgRG9tYWluQmFzZUNvbmZpZyB7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlb0xvY2F0aW9uRG9tYWluQ29uZmlnIGV4dGVuZHMgRG9tYWluQmFzZUNvbmZpZyB7XG4gIGdlb0xvY2F0aW9uOiBHZW9Mb2NhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgRG9tYWluQ29uZmlnID1cbiAgfCBEb21haW5CYXNlQ29uZmlnXG4gIHwgTGF0ZW5jeURvbWFpbkNvbmZpZ1xuICB8IFdlaWdodGVkRG9tYWluQ29uZmlnXG4gIHwgR2VvTG9jYXRpb25Eb21haW5Db25maWc7XG5cbi8qKlxuICogSW50ZXJuYWwgY29uZmlndXJhdGlvbiBmb3IgYSBjb250YWluZXIgaW4gYSBtdWx0aS1jb250YWluZXIgRUNTIHRhc2suXG4gKlxuICogSW4gbXVsdGktY29udGFpbmVyIHRhc2tzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBgcG9ydGAgaXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKlxuICogdGhhdCByZWNlaXZlcyBsb2FkIGJhbGFuY2VyIHRyYWZmaWMuIEFsbCBvdGhlciBjb250YWluZXJzIGFyZSAqKnNpZGVjYXJzKiogdGhhdCBwcm92aWRlXG4gKiBzdXBwb3J0aW5nIGZ1bmN0aW9uYWxpdHkgKGxvZ2dpbmcsIG1vbml0b3JpbmcsIHByb3hpZXMsIGV0Yy4pLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQcmltYXJ5IGNvbnRhaW5lciAoaGFzIHBvcnQpICsgc2lkZWNhciAobm8gcG9ydClcbiAqIGNvbnRhaW5lcnM6IFtcbiAqICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sICAgICAgICAgICAvLyBQcmltYXJ5IC0gcmVjZWl2ZXMgQUxCIHRyYWZmaWNcbiAqICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH0gIC8vIFNpZGVjYXIgLSBtb25pdG9yaW5nXG4gKiBdXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ2x1c3RlckNvbnRhaW5lckNvbmZpZyB7XG4gIC8qKiBVbmlxdWUgY29udGFpbmVyIG5hbWUgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlLiBPcHRpb25zOlxuICAgKiAtIE9taXQ6IFVzZXMgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeSAocHJpbWFyeSBjb250YWluZXIgb25seSlcbiAgICogLSBzdHJpbmc6IEVDUiByZXBvc2l0b3J5IG5hbWUgb3IgcHVibGljIGltYWdlIFVSTFxuICAgKiAtIFJlcG9zaXRvcnk6IENESyBFQ1IgUmVwb3NpdG9yeSBjb25zdHJ1Y3RcbiAgICovXG4gIGltYWdlPzogc3RyaW5nIHwgUmVwb3NpdG9yeTtcbiAgLyoqXG4gICAqIFBvcnQgdGhlIGNvbnRhaW5lciBsaXN0ZW5zIG9uLlxuICAgKiBUaGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGJlY29tZXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKlxuICAgKiBhbmQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyAqL1xuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgcmVzb3VyY2VzICovXG4gIHNlY3JldHNJbXBvcnQ/OiB7IFtrZXk6IHN0cmluZ106IFNlY3JldEltcG9ydCB9O1xuICAvKiogQ29tbWFuZCB0byBydW4gaW4gdGhlIGNvbnRhaW5lciAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG4gIC8qKiBFbnRyeSBwb2ludCBmb3IgdGhlIGNvbnRhaW5lciAqL1xuICBlbnRyeVBvaW50Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIGVzc2VudGlhbC5cbiAgICogSWYgYW4gZXNzZW50aWFsIGNvbnRhaW5lciBzdG9wcywgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgc3RvcC5cbiAgICogRGVmYXVsdDogdHJ1ZSBmb3IgcHJpbWFyeSBjb250YWluZXIsIHRydWUgZm9yIHNpZGVjYXJzXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogQ2x1c3Rlci1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ2x1c3RlckNsdXN0ZXJDb25maWcge1xuICAvKipcbiAgICogRG9tYWluIGZvciBIVFRQUyBhY2Nlc3MuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IEROUyAoKi5lbGIuYW1hem9uYXdzLmNvbSlcbiAgICogLSBTcGVjaWZpZWQ6IENyZWF0ZXMgQUNNIGNlcnRpZmljYXRlICsgUm91dGU1MyBETlMgQSByZWNvcmRcbiAgICovXG4gIGRvbWFpbj86IHN0cmluZztcblxuICAvKipcbiAgICogTG9hZCBiYWxhbmNlciBjb25maWd1cmF0aW9uLlxuICAgKiAtIGZhbHNlOiBObyBBTEIgKGZvciB3b3JrZXJzL2ludGVybmFsIHNlcnZpY2VzKVxuICAgKiAtIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICovXG4gIGxvYWRCYWxhbmNlcj86IGZhbHNlIHwgXCJwdWJsaWNcIiB8IFwiaW50ZXJuYWxcIjtcblxuICAvKipcbiAgICogRW5hYmxlIGRpcmVjdCBFQzIgYWNjZXNzIHdpdGhvdXQgQUxCLlxuICAgKiBPcGVucyBjb250YWluZXIgcG9ydHMgb24gc2VjdXJpdHkgZ3JvdXAgZm9yIGRpcmVjdCBhY2Nlc3MgdmlhIEVDMiBwdWJsaWMgSVAuXG4gICAqIFVzZXMgaG9zdCBuZXR3b3JrIG1vZGUgZm9yIHByZWRpY3RhYmxlIHBvcnQgbWFwcGluZyAoY29udGFpbmVyOjMwMDAg4oaSIGhvc3Q6MzAwMCkuXG4gICAqIE9ubHkgdmFsaWQgd2l0aCBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb21haW4gY29uZmlndXJhdGlvbiBmb3IgYWR2YW5jZWQgcm91dGluZyBwb2xpY2llcyAobGF0ZW5jeSwgd2VpZ2h0ZWQsIGdlbykuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGRvbWFpbiBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG59XG5cbi8qKlxuICogUm91dGluZyBjb25maWd1cmF0aW9uIGZvciBwYXRoL2hvc3QtYmFzZWQgcm91dGluZyBvbiB0aGUgQUxCLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1JvdXRpbmdDb25maWcge1xuICAvKiogUGF0aCBwYXR0ZXJuIGZvciByb3V0aW5nIChlLmcuLCBcIi9hcGkvKlwiLCBcIi91c2Vycy8qXCIpICovXG4gIHBhdGg/OiBzdHJpbmc7XG4gIC8qKiBIb3N0IGhlYWRlciBmb3Igcm91dGluZyAoZS5nLiwgXCJhcGkuZXhhbXBsZS5jb21cIikgKi9cbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIFByaW9yaXR5IGZvciB0aGlzIHJvdXRpbmcgcnVsZSAoMS01MDAwMCkuIExvd2VyID0gaGlnaGVyIHByaW9yaXR5LiAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcbiAgLyoqIEhlYWx0aCBjaGVjayBwYXRoIGZvciB0aGlzIHNlcnZpY2UncyB0YXJnZXQgZ3JvdXAuIERlZmF1bHQ6IFwiL1wiICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZywgYW5kIHRhcmdldCBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NTZXJ2aWNlUHJvcHMge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIC0gT21pdDogVXNlcyBjbHVzdGVyJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgc2VydmljZS5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqIChyZWNlaXZlcyBBTEIgdHJhZmZpYykuXG4gICAqL1xuICBjb250YWluZXJzOiBFY3NDbHVzdGVyQ29udGFpbmVyQ29uZmlnW107XG5cbiAgLyoqIENQVSB1bml0cyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDI1Ni00MDk2KSAqL1xuICBjcHU/OiBudW1iZXI7XG5cbiAgLyoqIE1lbW9yeSBpbiBNaUIgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICg1MTItMzA3MjApICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuXG4gIC8qKiBEZXNpcmVkIG51bWJlciBvZiB0YXNrcy4gRGVmYXVsdDogMiAqL1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqIFNjYWxpbmcgdHlwZSAoQ1BVIG9yIE1FTU9SWSkuIE9taXQgdG8gZGlzYWJsZSBhdXRvLXNjYWxpbmcuICovXG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG5cbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIHRhc2tzIGZvciBhdXRvLXNjYWxpbmcuIERlZmF1bHQ6IDIgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHRhc2tzIGZvciBhdXRvLXNjYWxpbmcuIERlZmF1bHQ6IDEwICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIHNlcnZpY2Ugb24gdGhlIGNsdXN0ZXIncyBBTEIuXG4gICAqIFJlcXVpcmVkIHdoZW4gY2x1c3RlciBoYXMgbXVsdGlwbGUgc2VydmljZXMgd2l0aCBwb3J0cy5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGlubGluZSBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtYW5hZ2VkIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzPzogSU1hbmFnZWRQb2xpY3lbXTtcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgc2VydmljZSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIHRvIGFsbG93IHRyYWZmaWMgZnJvbSB0aGlzIHNwZWNpZmljIHNlcnZpY2Ugb25seS5cbiAgICovXG4gIGNvbm5lY3Rpb25zPzogSUNvbm5lY3RhYmxlW107XG5cbiAgLyoqXG4gICAqIENhcGFjaXR5IHByb3ZpZGVyIGZvciB0aGlzIHNlcnZpY2UuIFJFUVVJUkVELlxuICAgKiBFYWNoIHNlcnZpY2Ugc3BlY2lmaWVzIGl0cyBvd24gY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBjYXBhY2l0eVByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBPbmx5IHVzZWQgd2hlbiBzZXJ2aWNlIGNhcGFjaXR5UHJvdmlkZXIgaXMgXCJFQzJcIi5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBlYzJDb25maWcgc2hhcmUgYW4gQVNHIGZvciBlZmZpY2llbmN5LlxuICAgKi9cbiAgZWMyQ29uZmlnPzogRWMyQ2FwYWNpdHlDb25maWc7XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIGNyZWF0aW5nIGFuIEVDUyBjbHVzdGVyIHdpdGggbXVsdGlwbGUgc2VydmljZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEVjc0NsdXN0ZXJQcm9wcyA9IHtcbiAgLyoqIENsdXN0ZXIgbmFtZSAqL1xuICBjbHVzdGVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBWUEMgdG8gZGVwbG95IGludG8gKi9cbiAgdnBjPzogSVZwYztcblxuICAvKiogRGVmYXVsdCBFQ1IgcmVwb3NpdG9yeSBvciBjb250YWluZXIgaW1hZ2UgKi9cbiAgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZSB8IHN0cmluZztcblxuICAvLyBOb3RlOiBjYXBhY2l0eVByb3ZpZGVyIGFuZCBlYzJDb25maWcgYXJlIHBlci1zZXJ2aWNlIG9ubHkgKGluIEVjc1NlcnZpY2VQcm9wcylcblxuICAvKipcbiAgICogQ2x1c3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzLlxuICAgKi9cbiAgY2x1c3Rlcj86IEVjc0NsdXN0ZXJDbHVzdGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBzY2FsaW5nLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKiBUYXNrIHJvbGUgcG9saWNpZXMgYXJlIGNvbmZpZ3VyZWQgcGVyLXNlcnZpY2UgZm9yIGxlYXN0LXByaXZpbGVnZS5cbiAgICovXG4gIHNlcnZpY2VzOiBFY3NTZXJ2aWNlUHJvcHNbXTtcbn07XG5cbi8qKlxuICogRGF0YSB0cmFja2VkIGZvciBlYWNoIHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIuXG4gKi9cbmludGVyZmFjZSBTZXJ2aWNlRGF0YSB7XG4gIHNlcnZpY2U6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZTtcbiAgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB8IEVjMlRhc2tEZWZpbml0aW9uO1xuICAvKiogUm9sZSBmb3IgRUNTIGFnZW50IChwdWxsIGltYWdlcywgd3JpdGUgbG9ncywgaW5qZWN0IHNlY3JldHMpICovXG4gIGV4ZWN1dGlvblJvbGU6IFJvbGU7XG4gIC8qKiBSb2xlIGZvciBhcHBsaWNhdGlvbiBjb2RlICh1c2VyIHBvbGljaWVzLCBFQ1MgRXhlYykgKi9cbiAgdGFza1JvbGU6IFJvbGU7XG4gIGNvbnRhaW5lcnM6IENvbnRhaW5lckRlZmluaXRpb25bXTtcbiAgcHJpbWFyeUNvbnRhaW5lcj86IENvbnRhaW5lckRlZmluaXRpb247XG4gIHRhcmdldEdyb3VwPzogSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXA7XG4gIHNjYWxpbmdQb2xpY3k/OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG59XG5cbi8qKlxuICogRUNTIENsdXN0ZXIgc3VwcG9ydGluZyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIGEgc2hhcmVkIEFMQi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIHNlcnZpY2UgY2x1c3RlclxuICogbmV3IEVjc0NsdXN0ZXIoc2NvcGUsIFwiV2ViQ2x1c3RlclwiLCB7XG4gKiAgIGNsdXN0ZXJOYW1lOiBcIldlYkNsdXN0ZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogZWNyLFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9XSB9XG4gKiAgIF1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJBcGlDbHVzdGVyXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiQXBpQ2x1c3RlclwiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBlY3JSZXBvc2l0b3J5OiBlY3IsXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtlciBjbHVzdGVyIChubyBBTEIpXG4gKiBuZXcgRWNzQ2x1c3RlcihzY29wZSwgXCJXb3JrZXJzXCIsIHtcbiAqICAgY2x1c3Rlck5hbWU6IFwiV29ya2Vyc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgZWNyUmVwb3NpdG9yeTogZWNyLFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJwcm9jZXNzb3JcIiwgY29udGFpbmVyczogW3sgbmFtZTogXCJ3b3JrZXJcIiB9XSB9XG4gKiAgIF1cbiAqIH0pO1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY3NDbHVzdGVyIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICAvLyBDbHVzdGVyLWxldmVsIHJlc291cmNlc1xuICBwcml2YXRlIGNsdXN0ZXI6IENka0NsdXN0ZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyPzogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyTGlzdGVuZXI/OiBBcHBsaWNhdGlvbkxpc3RlbmVyO1xuICBwcml2YXRlIGhvc3RlZFpvbmU/OiBJSG9zdGVkWm9uZTtcbiAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZT86IENlcnRpZmljYXRlO1xuICBwcml2YXRlIGFSZWNvcmQ/OiBBUmVjb3JkO1xuXG4gIC8vIEVDMi1zcGVjaWZpY1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA/OiBBdXRvU2NhbGluZ0dyb3VwO1xuICBwcml2YXRlIGFzZ1NlY3VyaXR5R3JvdXA/OiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGFzZ0NhcGFjaXR5UHJvdmlkZXI/OiBBc2dDYXBhY2l0eVByb3ZpZGVyO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXA/OiBTZWN1cml0eUdyb3VwO1xuXG4gIC8vIFBlci1zZXJ2aWNlIHRyYWNraW5nXG4gIHByaXZhdGUgc2VydmljZXMgPSBuZXcgTWFwPHN0cmluZywgU2VydmljZURhdGE+KCk7XG5cbiAgLy8gUGVyLXNlcnZpY2UgQVNHIGNhcGFjaXR5IHByb3ZpZGVycyAoa2V5ZWQgYnkgRUMyIGNvbmZpZyBzaWduYXR1cmUpXG4gIHByaXZhdGUgYXNnQ2FwYWNpdHlQcm92aWRlcnMgPSBuZXcgTWFwPHN0cmluZywgQXNnQ2FwYWNpdHlQcm92aWRlcj4oKTtcblxuICAvLyBDb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc2NvcGU6IENvbnN0cnVjdDtcbiAgcHJpdmF0ZSBwcm9wczogRWNzQ2x1c3RlclByb3BzO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlckRpc2FibGVkOiBib29sZWFuO1xuICBwcml2YXRlIGRpcmVjdEFjY2Vzc0VuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgbmV4dFByaW9yaXR5ID0gMTAwO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmRpcmVjdEFjY2Vzc0VuYWJsZWQgPSBwcm9wcy5jbHVzdGVyPy5kaXJlY3RBY2Nlc3MgPT09IHRydWU7XG4gICAgdGhpcy5sb2FkQmFsYW5jZXJEaXNhYmxlZCA9XG4gICAgICBwcm9wcy5jbHVzdGVyPy5sb2FkQmFsYW5jZXIgPT09IGZhbHNlIHx8IHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZDtcblxuICAgIHRoaXMudmFsaWRhdGVQcm9wcyhwcm9wcyk7XG5cbiAgICAvLyAxLiBDcmVhdGUgdGhlIEVDUyBjbHVzdGVyXG4gICAgdGhpcy5hZGRDbHVzdGVyKHByb3BzKTtcblxuICAgIC8vIDIuIFByZS1jcmVhdGUgQVNHcyBmb3Igc2VydmljZXMgd2l0aCBFQzIgY2FwYWNpdHkgcHJvdmlkZXJcbiAgICAvLyBUaGlzIGVuc3VyZXMgQVNHIHNlY3VyaXR5IGdyb3VwcyBleGlzdCBiZWZvcmUgbG9hZCBiYWxhbmNlciBjcmVhdGlvblxuICAgIGZvciAoY29uc3Qgc2VydmljZVByb3BzIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgICBpZiAoc2VydmljZVByb3BzLmNhcGFjaXR5UHJvdmlkZXIgPT09IFwiRUMyXCIpIHtcbiAgICAgICAgdGhpcy5nZXRPckNyZWF0ZUFzZ0NhcGFjaXR5UHJvdmlkZXIoc2VydmljZVByb3BzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiBDcmVhdGUgQUxCIGlmIG5vdCBkaXNhYmxlZCAoc2hhcmVkIGJ5IGFsbCBzZXJ2aWNlcylcbiAgICBpZiAoIXRoaXMubG9hZEJhbGFuY2VyRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyKHByb3BzKTtcblxuICAgICAgLy8gU2V0IHVwIGRvbWFpbi9IVFRQUyBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJvcHMuY2x1c3Rlcj8uZG9tYWluIHx8IHByb3BzLmNsdXN0ZXI/LmRvbWFpbkNvbmZpZykge1xuICAgICAgICB0aGlzLmFkZEhvc3RlZFpvbmUocHJvcHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZExvYWRCYWxhbmNlckxpc3RlbmVyKHByb3BzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGlyZWN0QWNjZXNzRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGREaXJlY3RBY2Nlc3NPdXRwdXRzKHByb3BzKTtcbiAgICB9XG5cbiAgICAvLyA0LiBDcmVhdGUgZWFjaCBzZXJ2aWNlXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlUHJvcHMgb2YgcHJvcHMuc2VydmljZXMpIHtcbiAgICAgIHRoaXMuYWRkU2VydmljZVRvQ2x1c3RlcihzZXJ2aWNlUHJvcHMpO1xuICAgIH1cblxuICAgIC8vIDUuIENyZWF0ZSBEZXBsb3lhYmxlU2VydmljZSBvdXRwdXRzIGZvciBkZXBsb3ltZW50IGF1dG9tYXRpb25cbiAgICB0aGlzLmFkZERlcGxveWFibGVTZXJ2aWNlT3V0cHV0cyhwcm9wcyk7XG5cbiAgICAvLyA2LiBTZXQgdXAgY29ubmVjdGlvbnNcbiAgICB0aGlzLnNldHVwQ29ubmVjdGlvbnMocHJvcHMpO1xuXG4gICAgLy8gNy4gQXBwbHkgYXNwZWN0IHRvIGZpeCBjYXBhY2l0eSBwcm92aWRlciBkZWxldGlvbiBkZXBlbmRlbmNpZXMgKENESyBidWcgd29ya2Fyb3VuZClcbiAgICAvLyBUaGlzIHJ1bnMgYXQgc3ludGggdGltZSB3aGVuIENmbkNsdXN0ZXJDYXBhY2l0eVByb3ZpZGVyQXNzb2NpYXRpb25zIGV4aXN0c1xuICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBDYXBhY2l0eVByb3ZpZGVyRGVwZW5kZW5jeUFzcGVjdCh0aGlzLmNsdXN0ZXIpKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsdXN0ZXIncyBsb2FkIGJhbGFuY2VyLiBVbmRlZmluZWQgaWYgZGlzYWJsZWQuICovXG4gIGdldExvYWRCYWxhbmNlcigpOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbG9hZCBiYWxhbmNlcidzIGxpc3RlbmVyLiBVbmRlZmluZWQgaWYgZGlzYWJsZWQuICovXG4gIGdldExpc3RlbmVyKCk6IEFwcGxpY2F0aW9uTGlzdGVuZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyO1xuICB9XG5cbiAgLyoqIEdldCBhIHNwZWNpZmljIHNlcnZpY2UgYnkgbmFtZS4gKi9cbiAgZ2V0U2VydmljZShuYW1lOiBzdHJpbmcpOiBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzLmdldChuYW1lKT8uc2VydmljZTtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci4gKi9cbiAgZ2V0U2VydmljZXMoKTogTWFwPHN0cmluZywgRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZT4oKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICByZXN1bHQuc2V0KG5hbWUsIGRhdGEuc2VydmljZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogR2V0IHRoZSBFQ1MgY2x1c3RlciBjb25zdHJ1Y3QuICovXG4gIGdldENsdXN0ZXIoKTogQ2RrQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuY2x1c3RlcjtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEFMQiBVUkwgKGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLiAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubG9hZEJhbGFuY2VyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5jZXJ0aWZpY2F0ZSA/IFwiaHR0cHNcIiA6IFwiaHR0cFwiO1xuICAgIGNvbnN0IGRvbWFpbiA9XG4gICAgICB0aGlzLnByb3BzLmNsdXN0ZXI/LmRvbWFpbiB8fCB0aGlzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2RvbWFpbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNlcnZpY2UgdG8gdGhlIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBjb250YWluZXJzLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTZXJ2aWNlVG9DbHVzdGVyKHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzKTogdm9pZCB7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlUHJvcHMubmFtZTtcblxuICAgIC8vIENyZWF0ZSBzZXBhcmF0ZSByb2xlcyBmb3Igc2VjdXJpdHkgYmVzdCBwcmFjdGljZVxuICAgIGNvbnN0IGV4ZWN1dGlvblJvbGUgPSB0aGlzLmNyZWF0ZUV4ZWN1dGlvblJvbGUoc2VydmljZU5hbWUpO1xuICAgIGNvbnN0IHRhc2tSb2xlID0gdGhpcy5jcmVhdGVUYXNrUm9sZShzZXJ2aWNlTmFtZSwgc2VydmljZVByb3BzKTtcblxuICAgIC8vIENyZWF0ZSB0YXNrIGRlZmluaXRpb24gd2l0aCBib3RoIHJvbGVzXG4gICAgY29uc3QgdGFza0RlZmluaXRpb24gPSB0aGlzLmNyZWF0ZVRhc2tEZWZpbml0aW9uKFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICBleGVjdXRpb25Sb2xlLFxuICAgICAgdGFza1JvbGVcbiAgICApO1xuXG4gICAgLy8gQWRkIGNvbnRhaW5lcnMgdG8gdGFzayBkZWZpbml0aW9uXG4gICAgY29uc3QgeyBjb250YWluZXJzLCBwcmltYXJ5Q29udGFpbmVyIH0gPSB0aGlzLmFkZENvbnRhaW5lcnNUb1Rhc2soXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHNlcnZpY2VQcm9wcyxcbiAgICAgIHRhc2tEZWZpbml0aW9uXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgRUNTIHNlcnZpY2VcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5jcmVhdGVTZXJ2aWNlKFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICB0YXNrRGVmaW5pdGlvblxuICAgICk7XG5cbiAgICAvLyBSZWdpc3RlciB3aXRoIEFMQiBpZiBlbmFibGVkIGFuZCBoYXMgcHJpbWFyeSBjb250YWluZXIgd2l0aCBwb3J0XG4gICAgbGV0IHRhcmdldEdyb3VwOiBJQXBwbGljYXRpb25UYXJnZXRHcm91cCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sb2FkQmFsYW5jZXJEaXNhYmxlZCAmJlxuICAgICAgcHJpbWFyeUNvbnRhaW5lciAmJlxuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lclxuICAgICkge1xuICAgICAgdGFyZ2V0R3JvdXAgPSB0aGlzLnJlZ2lzdGVyU2VydmljZVdpdGhBTEIoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICAgIHNlcnZpY2UsXG4gICAgICAgIHByaW1hcnlDb250YWluZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNjYWxpbmcgaWYgY29uZmlndXJlZFxuICAgIGxldCBzY2FsaW5nUG9saWN5OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3kgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlcnZpY2VQcm9wcy5zY2FsaW5nVHlwZSkge1xuICAgICAgc2NhbGluZ1BvbGljeSA9IHRoaXMuYWRkU2VydmljZVNjYWxpbmcoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBzZXJ2aWNlUHJvcHMsXG4gICAgICAgIHNlcnZpY2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgc2VydmljZSBkYXRhXG4gICAgdGhpcy5zZXJ2aWNlcy5zZXQoc2VydmljZU5hbWUsIHtcbiAgICAgIHNlcnZpY2UsXG4gICAgICB0YXNrRGVmaW5pdGlvbixcbiAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICB0YXNrUm9sZSxcbiAgICAgIGNvbnRhaW5lcnMsXG4gICAgICBwcmltYXJ5Q29udGFpbmVyLFxuICAgICAgdGFyZ2V0R3JvdXAsXG4gICAgICBzY2FsaW5nUG9saWN5XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgc2VydmljZSBsZXZlbCBjb25uZWN0aW9uc1xuICAgIGlmIChzZXJ2aWNlUHJvcHMuY29ubmVjdGlvbnMgJiYgc2VydmljZVByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGFibGUgb2Ygc2VydmljZVByb3BzLmNvbm5lY3Rpb25zKSB7XG4gICAgICAgIHNlcnZpY2UuY29ubmVjdGlvbnMuYWxsb3dUb0RlZmF1bHRQb3J0KGNvbm5lY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUHJvcHMocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIHNlcnZpY2VzIGFycmF5XG4gICAgaWYgKCFwcm9wcy5zZXJ2aWNlcyB8fCBwcm9wcy5zZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIHNlcnZpY2UgbmFtZXNcbiAgICBjb25zdCBzZXJ2aWNlTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gICAgY29uc3QgZHVwbGljYXRlU2VydmljZXMgPSBzZXJ2aWNlTmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUsIGluZGV4KSA9PiBzZXJ2aWNlTmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gaW5kZXhcbiAgICApO1xuICAgIGlmIChkdXBsaWNhdGVTZXJ2aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEdXBsaWNhdGUgc2VydmljZSBuYW1lczogJHtbLi4ubmV3IFNldChkdXBsaWNhdGVTZXJ2aWNlcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJvdXRpbmcgd2hlbiBtdWx0aXBsZSBzZXJ2aWNlcyBoYXZlIHBvcnRzXG4gICAgY29uc3Qgc2VydmljZXNXaXRoUG9ydHMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgICBzLmNvbnRhaW5lcnMuc29tZSgoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWQpXG4gICAgKTtcblxuICAgIGlmIChzZXJ2aWNlc1dpdGhQb3J0cy5sZW5ndGggPiAxICYmICF0aGlzLmxvYWRCYWxhbmNlckRpc2FibGVkKSB7XG4gICAgICBjb25zdCBtaXNzaW5nUm91dGluZyA9IHNlcnZpY2VzV2l0aFBvcnRzLmZpbHRlcihcbiAgICAgICAgKHMpID0+ICFzLnJvdXRpbmc/LnBhdGggJiYgIXMucm91dGluZz8uaG9zdFxuICAgICAgKTtcbiAgICAgIGlmIChtaXNzaW5nUm91dGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZXMgd2l0aCBwb3J0cyByZXF1aXJlIHJvdXRpbmcgY29uZmlnIHdoZW4gY2x1c3RlciBoYXMgbXVsdGlwbGUgc2VydmljZXM6IGAgK1xuICAgICAgICAgICAgYCR7bWlzc2luZ1JvdXRpbmcubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSB0byBlYWNoIHNlcnZpY2UuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHNlcnZpY2UncyBjb250YWluZXJzXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgICBpZiAoIXNlcnZpY2UuY29udGFpbmVycyB8fCBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JzogQXQgbGVhc3Qgb25lIGNvbnRhaW5lciBtdXN0IGJlIHNwZWNpZmllZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzIHdpdGhpbiBzZXJ2aWNlXG4gICAgICBjb25zdCBjb250YWluZXJOYW1lcyA9IHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgICBjb25zdCBkdXBsaWNhdGVDb250YWluZXJzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFNlcnZpY2UgJyR7c2VydmljZS5uYW1lfSc6IER1cGxpY2F0ZSBjb250YWluZXIgbmFtZXM6IGAgK1xuICAgICAgICAgICAgYCR7Wy4uLm5ldyBTZXQoZHVwbGljYXRlQ29udGFpbmVycyldLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENvbm5lY3Rpb25zKHByb3BzOiBFY3NDbHVzdGVyUHJvcHMpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBzZXJ2aWNlIHdpdGggYSBwb3J0IGZvciBkZWZhdWx0IGNvbm5lY3Rpb25cbiAgICBsZXQgZGVmYXVsdFBvcnQgPSA4MDtcbiAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgcHJvcHMuc2VydmljZXMpIHtcbiAgICAgIGNvbnN0IHByaW1hcnlDb250YWluZXIgPSBzZXJ2aWNlLmNvbnRhaW5lcnMuZmluZChcbiAgICAgICAgKGMpID0+IGMucG9ydCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgaWYgKHByaW1hcnlDb250YWluZXI/LnBvcnQpIHtcbiAgICAgICAgZGVmYXVsdFBvcnQgPSBwcmltYXJ5Q29udGFpbmVyLnBvcnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbGxlY3Qgc2VjdXJpdHkgZ3JvdXBzIGZyb20gRUMyIEFTR3MgYW5kIEZhcmdhdGUgc2VydmljZXNcbiAgICBjb25zdCBzZWN1cml0eUdyb3VwczogSVNlY3VyaXR5R3JvdXBbXSA9IFtdO1xuXG4gICAgLy8gQWRkIEFTRyBzZWN1cml0eSBncm91cCBpZiBhbnkgRUMyIHNlcnZpY2VzIGV4aXN0XG4gICAgaWYgKHRoaXMuYXNnU2VjdXJpdHlHcm91cCkge1xuICAgICAgc2VjdXJpdHlHcm91cHMucHVzaCh0aGlzLmFzZ1NlY3VyaXR5R3JvdXApO1xuICAgIH1cblxuICAgIC8vIEFkZCBGYXJnYXRlIHNlcnZpY2Ugc2VjdXJpdHkgZ3JvdXBzIGlmIGFueSBGYXJnYXRlIHNlcnZpY2VzIGV4aXN0XG4gICAgZm9yIChjb25zdCBzZXJ2aWNlRGF0YSBvZiB0aGlzLnNlcnZpY2VzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBzZXJ2aWNlU2dzID0gc2VydmljZURhdGEuc2VydmljZT8uY29ubmVjdGlvbnM/LnNlY3VyaXR5R3JvdXBzIHx8IFtdO1xuICAgICAgZm9yIChjb25zdCBzZyBvZiBzZXJ2aWNlU2dzKSB7XG4gICAgICAgIGlmICghc2VjdXJpdHlHcm91cHMuaW5jbHVkZXMoc2cpKSB7XG4gICAgICAgICAgc2VjdXJpdHlHcm91cHMucHVzaChzZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgZGVmYXVsdFBvcnQ6IFBvcnQudGNwKGRlZmF1bHRQb3J0KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGV4ZWN1dGlvbiByb2xlIGZvciBFQ1MgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucy5cbiAgICogVXNlZCBieSB0aGUgRUNTIGFnZW50IHRvIHB1bGwgaW1hZ2VzLCB3cml0ZSBsb2dzLCBhbmQgaW5qZWN0IHNlY3JldHMuXG4gICAqIE5PVCB1c2VkIGJ5IGFwcGxpY2F0aW9uIGNvZGUgLSB0aGF0J3MgdGhlIHRhc2sgcm9sZS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXhlY3V0aW9uUm9sZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogUm9sZSB7XG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke3NlcnZpY2VOYW1lfUV4ZWN1dGlvblJvbGVgLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiZWNzLXRhc2tzLmFtYXpvbmF3cy5jb21cIilcbiAgICB9KTtcblxuICAgIC8vIEVDUiBwdWxsIHBlcm1pc3Npb25zXG4gICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwiZWNyOkdldEF1dGhvcml6YXRpb25Ub2tlblwiLFxuICAgICAgICAgIFwiZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eVwiLFxuICAgICAgICAgIFwiZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXJcIixcbiAgICAgICAgICBcImVjcjpCYXRjaEdldEltYWdlXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBDbG91ZFdhdGNoIExvZ3MgcGVybWlzc2lvbnNcbiAgICBleGVjdXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ1N0cmVhbVwiLFxuICAgICAgICAgIFwibG9nczpQdXRMb2dFdmVudHNcIixcbiAgICAgICAgICBcImxvZ3M6Q3JlYXRlTG9nR3JvdXBcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFNlY3JldHMgTWFuYWdlciBhY2Nlc3MgZm9yIGluamVjdGluZyBzZWNyZXRzIGludG8gY29udGFpbmVyc1xuICAgIGV4ZWN1dGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcInNlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlXCIsXG4gICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpEZXNjcmliZVNlY3JldFwiXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gS01TIGRlY3J5cHQgZm9yIHNlY3JldHMgZW5jcnlwdGVkIHdpdGggY3VzdG9tZXItbWFuYWdlZCBrZXlzXG4gICAgZXhlY3V0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wia21zOkRlY3J5cHRcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4ZWN1dGlvblJvbGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdGFzayByb2xlIGZvciBhcHBsaWNhdGlvbiBjb2RlIHJ1bm5pbmcgaW4gdGhlIGNvbnRhaW5lci5cbiAgICogVGhpcyByb2xlIGlzIGFzc3VtZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBub3QgdGhlIEVDUyBhZ2VudC5cbiAgICogSW5jbHVkZXMgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucyBwbHVzIGFueSBzZXJ2aWNlLXNwZWNpZmljIHBvbGljaWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVUYXNrUm9sZShcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzXG4gICk6IFJvbGUge1xuICAgIGNvbnN0IHRhc2tSb2xlID0gbmV3IFJvbGUodGhpcywgYCR7c2VydmljZU5hbWV9VGFza1JvbGVgLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiZWNzLXRhc2tzLmFtYXpvbmF3cy5jb21cIilcbiAgICB9KTtcblxuICAgIC8vIERlZmF1bHQ6IFNTTSBwZXJtaXNzaW9ucyBmb3IgRUNTIEV4ZWMgKGVjcyBleGVjdXRlLWNvbW1hbmQpXG4gICAgdGFza1JvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcInNzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbFwiLFxuICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWxcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEFkZCBzZXJ2aWNlLXNwZWNpZmljIGlubGluZSBwb2xpY2llc1xuICAgIGlmIChzZXJ2aWNlUHJvcHMudGFza1JvbGVJbmxpbmVQb2xpY2llcykge1xuICAgICAgZm9yIChjb25zdCBbcG9saWN5TmFtZSwgcG9saWN5RG9jdW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICBzZXJ2aWNlUHJvcHMudGFza1JvbGVJbmxpbmVQb2xpY2llc1xuICAgICAgKSkge1xuICAgICAgICB0YXNrUm9sZS5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICAgICAgbmV3IFBvbGljeSh0aGlzLCBgJHtzZXJ2aWNlTmFtZX0ke3BvbGljeU5hbWV9YCwge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IHBvbGljeURvY3VtZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgc2VydmljZS1zcGVjaWZpYyBtYW5hZ2VkIHBvbGljaWVzXG4gICAgaWYgKHNlcnZpY2VQcm9wcy50YXNrUm9sZU1hbmFnZWRQb2xpY2llcykge1xuICAgICAgZm9yIChjb25zdCBwb2xpY3kgb2Ygc2VydmljZVByb3BzLnRhc2tSb2xlTWFuYWdlZFBvbGljaWVzKSB7XG4gICAgICAgIHRhc2tSb2xlLmFkZE1hbmFnZWRQb2xpY3kocG9saWN5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFza1JvbGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhc2tEZWZpbml0aW9uKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgZXhlY3V0aW9uUm9sZTogUm9sZSxcbiAgICB0YXNrUm9sZTogUm9sZVxuICApOiBGYXJnYXRlVGFza0RlZmluaXRpb24gfCBFYzJUYXNrRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgY3B1ID0gc2VydmljZVByb3BzLmNwdSB8fCAyNTY7XG4gICAgY29uc3QgbWVtb3J5TGltaXRNaUIgPSBzZXJ2aWNlUHJvcHMubWVtb3J5TGltaXRNaUIgfHwgNTEyO1xuXG4gICAgLy8gVXNlIHBlci1zZXJ2aWNlIGNhcGFjaXR5IHByb3ZpZGVyIGNoZWNrXG4gICAgaWYgKHRoaXMuaXNTZXJ2aWNlRmFyZ2F0ZShzZXJ2aWNlUHJvcHMpKSB7XG4gICAgICByZXR1cm4gbmV3IEZhcmdhdGVUYXNrRGVmaW5pdGlvbih0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsIHtcbiAgICAgICAgZmFtaWx5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfS0ke3NlcnZpY2VOYW1lfWAsXG4gICAgICAgIGNwdSxcbiAgICAgICAgbWVtb3J5TGltaXRNaUIsXG4gICAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICAgIHRhc2tSb2xlLFxuICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IENwdUFyY2hpdGVjdHVyZS5BUk02NCxcbiAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IE9wZXJhdGluZ1N5c3RlbUZhbWlseS5MSU5VWFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBFYzJUYXNrRGVmaW5pdGlvbih0aGlzLCBgJHtzZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsIHtcbiAgICAgICAgZmFtaWx5OiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfS0ke3NlcnZpY2VOYW1lfWAsXG4gICAgICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgICAgIHRhc2tSb2xlLFxuICAgICAgICAuLi4odGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkICYmIHsgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLkhPU1QgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29udGFpbmVyc1RvVGFzayhcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIHRhc2tEZWZpbml0aW9uOiBGYXJnYXRlVGFza0RlZmluaXRpb24gfCBFYzJUYXNrRGVmaW5pdGlvblxuICApOiB7XG4gICAgY29udGFpbmVyczogQ29udGFpbmVyRGVmaW5pdGlvbltdO1xuICAgIHByaW1hcnlDb250YWluZXI/OiBDb250YWluZXJEZWZpbml0aW9uO1xuICB9IHtcbiAgICBjb25zdCBjb250YWluZXJzOiBDb250YWluZXJEZWZpbml0aW9uW10gPSBbXTtcbiAgICBsZXQgcHJpbWFyeUNvbnRhaW5lcjogQ29udGFpbmVyRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgY29udGFpbmVyQ29uZmlnIG9mIHNlcnZpY2VQcm9wcy5jb250YWluZXJzKSB7XG4gICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0Q29udGFpbmVySW1hZ2UoXG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBjb250YWluZXJDb25maWcsXG4gICAgICAgIHNlcnZpY2VQcm9wc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzRmlyc3RXaXRoUG9ydCA9XG4gICAgICAgICFwcmltYXJ5Q29udGFpbmVyICYmIGNvbnRhaW5lckNvbmZpZy5wb3J0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEJ1aWxkIHNlY3JldHNcbiAgICAgIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIEVjc1NlY3JldD4gPSB7fTtcbiAgICAgIGlmIChjb250YWluZXJDb25maWcuc2VjcmV0c0ltcG9ydCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHNlY3JldEltcG9ydF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgY29udGFpbmVyQ29uZmlnLnNlY3JldHNJbXBvcnRcbiAgICAgICAgKSkge1xuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9JHtrZXl9U2VjcmV0YCxcbiAgICAgICAgICAgIHNlY3JldEltcG9ydC5uYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZWNyZXRzW2tleV0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICAgICAgc2VjcmV0LFxuICAgICAgICAgICAgc2VjcmV0SW1wb3J0LmZpZWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IGNvbnRhaW5lckNvbmZpZy5uYW1lLFxuICAgICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgICAgc3RyZWFtUHJlZml4OiBgL2Vjcy8ke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9LyR7c2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogY29udGFpbmVyQ29uZmlnLmVudmlyb25tZW50LFxuICAgICAgICAgIHNlY3JldHMsXG4gICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmNvbW1hbmQsXG4gICAgICAgICAgZW50cnlQb2ludDogY29udGFpbmVyQ29uZmlnLmVudHJ5UG9pbnQsXG4gICAgICAgICAgZXNzZW50aWFsOiBjb250YWluZXJDb25maWcuZXNzZW50aWFsID8/IHRydWUsXG4gICAgICAgICAgaGVhbHRoQ2hlY2s6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVja1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWw6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbClcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGNvbnRhaW5lckNvbmZpZy5oZWFsdGhDaGVjay50aW1lb3V0XG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZXRyaWVzOiBjb250YWluZXJDb25maWcuaGVhbHRoQ2hlY2sucmV0cmllcyxcbiAgICAgICAgICAgICAgICBzdGFydFBlcmlvZDogY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kXG4gICAgICAgICAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMoY29udGFpbmVyQ29uZmlnLmhlYWx0aENoZWNrLnN0YXJ0UGVyaW9kKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uKHRoaXMuaXNTZXJ2aWNlRWMyKHNlcnZpY2VQcm9wcykgJiYge1xuICAgICAgICAgICAgbWVtb3J5TGltaXRNaUI6IHNlcnZpY2VQcm9wcy5lYzJDb25maWc/Lm1lbW9yeUxpbWl0TWlCID8/IDEwMjRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAoY29udGFpbmVyQ29uZmlnLnBvcnQpIHtcbiAgICAgICAgY29udGFpbmVyLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgICAgICAgY29udGFpbmVyUG9ydDogY29udGFpbmVyQ29uZmlnLnBvcnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ZpcnN0V2l0aFBvcnQpIHtcbiAgICAgICAgcHJpbWFyeUNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGFpbmVycywgcHJpbWFyeUNvbnRhaW5lciB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250YWluZXJJbWFnZShcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIGNvbnRhaW5lckNvbmZpZzogRWNzQ2x1c3RlckNvbnRhaW5lckNvbmZpZyxcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBDb250YWluZXJJbWFnZSB7XG4gICAgLy8gUHJpb3JpdHk6IGNvbnRhaW5lci5pbWFnZSA+IHNlcnZpY2UuaW1hZ2UgPiBjbHVzdGVyIGRlZmF1bHRcbiAgICBjb25zdCBpbWFnZVNvdXJjZSA9XG4gICAgICBjb250YWluZXJDb25maWcuaW1hZ2UgfHwgc2VydmljZVByb3BzLmltYWdlIHx8IHRoaXMucHJvcHMuZWNyUmVwb3NpdG9yeTtcblxuICAgIGlmICghaW1hZ2VTb3VyY2UpIHtcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VUYWcgPSBgJHtzZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpfS1sYXRlc3RgO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZVNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHJlZ2lzdHJ5IGltYWdlIChwdWJsaWMgRG9ja2VyIEh1YiBvciBwdWJsaWMgRUNSKSB2cyBwcml2YXRlIEVDUiByZXBvc2l0b3J5IG5hbWVcbiAgICAgIGNvbnN0IGlzUHVibGljSW1hZ2UgPVxuICAgICAgICAoaW1hZ2VTb3VyY2UuaW5jbHVkZXMoXCIvXCIpICYmICFpbWFnZVNvdXJjZS5pbmNsdWRlcyhcIi5cIikpIHx8IC8vIERvY2tlciBIdWI6IGFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVxuICAgICAgICBpbWFnZVNvdXJjZS5zdGFydHNXaXRoKFwicHVibGljLmVjci5hd3MvXCIpOyAvLyBQdWJsaWMgRUNSOiBwdWJsaWMuZWNyLmF3cy9mamFsbC93ZWxjb21lXG5cbiAgICAgIGlmIChpc1B1YmxpY0ltYWdlKSB7XG4gICAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoaW1hZ2VTb3VyY2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21FY3JSZXBvc2l0b3J5KFxuICAgICAgICBSZXBvc2l0b3J5LmZyb21SZXBvc2l0b3J5TmFtZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3NlcnZpY2VOYW1lfSR7Y29udGFpbmVyQ29uZmlnLm5hbWV9RWNyUmVwb2AsXG4gICAgICAgICAgaW1hZ2VTb3VyY2VcbiAgICAgICAgKSxcbiAgICAgICAgaW1hZ2VUYWdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlU291cmNlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkge1xuICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21FY3JSZXBvc2l0b3J5KGltYWdlU291cmNlLCBpbWFnZVRhZyk7XG4gICAgfVxuXG4gICAgLy8gUmVwb3NpdG9yeUltYWdlIGV4dGVuZHMgQ29udGFpbmVySW1hZ2UsIHNvIHRoaXMgaXMgYSBzYWZlIHVwY2FzdFxuICAgIHJldHVybiBpbWFnZVNvdXJjZSBhcyBDb250YWluZXJJbWFnZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VydmljZShcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIHRhc2tEZWZpbml0aW9uOiBGYXJnYXRlVGFza0RlZmluaXRpb24gfCBFYzJUYXNrRGVmaW5pdGlvblxuICApOiBGYXJnYXRlU2VydmljZSB8IEVjMlNlcnZpY2Uge1xuICAgIGNvbnN0IGRlc2lyZWRDb3VudCA9IHNlcnZpY2VQcm9wcy5kZXNpcmVkQ291bnQgPz8gMjtcbiAgICBjb25zdCBlZmZlY3RpdmVQcm92aWRlciA9IHRoaXMuZ2V0U2VydmljZUNhcGFjaXR5UHJvdmlkZXIoc2VydmljZVByb3BzKTtcblxuICAgIC8vIFVzZSBwZXItc2VydmljZSBjYXBhY2l0eSBwcm92aWRlciBjaGVja1xuICAgIGlmICh0aGlzLmlzU2VydmljZUZhcmdhdGUoc2VydmljZVByb3BzKSkge1xuICAgICAgY29uc3QgaGFzTmF0ID0gdGhpcy52cGNIYXNOYXRHYXRld2F5cygpO1xuICAgICAgY29uc3Qgc2VydmljZSA9IG5ldyBGYXJnYXRlU2VydmljZSh0aGlzLCBgJHtzZXJ2aWNlTmFtZX1TZXJ2aWNlYCwge1xuICAgICAgICBjbHVzdGVyOiB0aGlzLmNsdXN0ZXIsXG4gICAgICAgIHRhc2tEZWZpbml0aW9uOiB0YXNrRGVmaW5pdGlvbiBhcyBGYXJnYXRlVGFza0RlZmluaXRpb24sXG4gICAgICAgIGRlc2lyZWRDb3VudCxcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBoYXNOYXRcbiAgICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgICA6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgIH0sXG4gICAgICAgIGFzc2lnblB1YmxpY0lwOiAhaGFzTmF0LFxuICAgICAgICBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ2llczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6IGVmZmVjdGl2ZVByb3ZpZGVyLFxuICAgICAgICAgICAgd2VpZ2h0OiAxXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBwcm9wYWdhdGVUYWdzOiBQcm9wYWdhdGVkVGFnU291cmNlLlNFUlZJQ0UsXG4gICAgICAgIGNpcmN1aXRCcmVha2VyOiB7IGVuYWJsZTogdHJ1ZSwgcm9sbGJhY2s6IHRydWUgfSxcbiAgICAgICAgZW5hYmxlRUNTTWFuYWdlZFRhZ3M6IHRydWUsXG4gICAgICAgIGVuYWJsZUV4ZWN1dGVDb21tYW5kOiB0cnVlLFxuICAgICAgICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgIG1pbkhlYWx0aHlQZXJjZW50OiAxMDAsXG4gICAgICAgIG1heEhlYWx0aHlQZXJjZW50OiAyMDBcbiAgICAgIH0pO1xuXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1TZXJ2aWNlQXJuYCwge1xuICAgICAgICBrZXk6IGAke3RoaXMucHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1TZXJ2aWNlQXJuYCxcbiAgICAgICAgZXhwb3J0TmFtZTogYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLFxuICAgICAgICB2YWx1ZTogc2VydmljZS5zZXJ2aWNlQXJuLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEVDUyBTZXJ2aWNlIEFSTiBmb3IgJHtzZXJ2aWNlTmFtZX1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZXJ2aWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgb3IgY3JlYXRlIEFTRyBjYXBhY2l0eSBwcm92aWRlciBmb3IgdGhpcyBzZXJ2aWNlJ3MgRUMyIGNvbmZpZ1xuICAgICAgY29uc3QgYXNnUHJvdmlkZXIgPSB0aGlzLmdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlcihzZXJ2aWNlUHJvcHMpO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IEVjMlNlcnZpY2UodGhpcywgYCR7c2VydmljZU5hbWV9U2VydmljZWAsIHtcbiAgICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgICB0YXNrRGVmaW5pdGlvbjogdGFza0RlZmluaXRpb24gYXMgRWMyVGFza0RlZmluaXRpb24sXG4gICAgICAgIGRlc2lyZWRDb3VudCxcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIGNhcGFjaXR5UHJvdmlkZXJTdHJhdGVnaWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogYXNnUHJvdmlkZXIuY2FwYWNpdHlQcm92aWRlck5hbWUsXG4gICAgICAgICAgICB3ZWlnaHQ6IDFcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHByb3BhZ2F0ZVRhZ3M6IFByb3BhZ2F0ZWRUYWdTb3VyY2UuU0VSVklDRSxcbiAgICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgZW5hYmxlOiB0cnVlLCByb2xsYmFjazogdHJ1ZSB9LFxuICAgICAgICBwbGFjZW1lbnRTdHJhdGVnaWVzOiBbUGxhY2VtZW50U3RyYXRlZ3kuc3ByZWFkQWNyb3NzSW5zdGFuY2VzKCldLFxuICAgICAgICBlbmFibGVFQ1NNYW5hZ2VkVGFnczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDEwMCxcbiAgICAgICAgbWF4SGVhbHRoeVBlcmNlbnQ6IDIwMFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLCB7XG4gICAgICAgIGtleTogYCR7dGhpcy5wcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfVNlcnZpY2VBcm5gLFxuICAgICAgICBleHBvcnROYW1lOiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7c2VydmljZU5hbWV9U2VydmljZUFybmAsXG4gICAgICAgIHZhbHVlOiBzZXJ2aWNlLnNlcnZpY2VBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRUNTIFNlcnZpY2UgQVJOIGZvciAke3NlcnZpY2VOYW1lfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclNlcnZpY2VXaXRoQUxCKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMsXG4gICAgc2VydmljZTogRmFyZ2F0ZVNlcnZpY2UgfCBFYzJTZXJ2aWNlLFxuICAgIHByaW1hcnlDb250YWluZXI6IENvbnRhaW5lckRlZmluaXRpb25cbiAgKTogSUFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAge1xuICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPSBwcmltYXJ5Q29udGFpbmVyLmNvbnRhaW5lclBvcnQ7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2tQYXRoID0gc2VydmljZVByb3BzLnJvdXRpbmc/LmhlYWx0aENoZWNrUGF0aCB8fCBcIi9cIjtcblxuICAgIC8vIERldGVybWluZSByb3V0aW5nIGNvbmRpdGlvbnNcbiAgICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHRoaXMucHJvcHMuc2VydmljZXMuZmlsdGVyKChzKSA9PlxuICAgICAgcy5jb250YWluZXJzLnNvbWUoKGMpID0+IGMucG9ydCAhPT0gdW5kZWZpbmVkKVxuICAgICk7XG4gICAgY29uc3QgaXNTaW5nbGVTZXJ2aWNlID0gc2VydmljZXNXaXRoUG9ydHMubGVuZ3RoID09PSAxO1xuXG4gICAgLy8gVXNlIHBlci1zZXJ2aWNlIGNhcGFjaXR5IHByb3ZpZGVyIGNoZWNrIGZvciBoZWFsdGggY2hlY2sgY29uZmlnXG4gICAgY29uc3QgaGVhbHRoQ2hlY2tDb25maWcgPSB0aGlzLmlzU2VydmljZUVjMihzZXJ2aWNlUHJvcHMpXG4gICAgICA/IHtcbiAgICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICAgICAgaGVhbHRoeVRocmVzaG9sZENvdW50OiAzLFxuICAgICAgICAgIHVuaGVhbHRoeVRocmVzaG9sZENvdW50OiAzLFxuICAgICAgICAgIHBhdGg6IGhlYWx0aENoZWNrUGF0aCxcbiAgICAgICAgICBwb3J0OiBcInRyYWZmaWMtcG9ydFwiIGFzIGNvbnN0LFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTUpXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgICAgcGF0aDogaGVhbHRoQ2hlY2tQYXRoLFxuICAgICAgICAgIHBvcnQ6IGAke2NvbnRhaW5lclBvcnR9YCxcbiAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKVxuICAgICAgICB9O1xuXG4gICAgaWYgKGlzU2luZ2xlU2VydmljZSkge1xuICAgICAgLy8gU2luZ2xlIHNlcnZpY2UgLSBjcmVhdGUgdGFyZ2V0IGdyb3VwIHdpdGggc2VydmljZSBhcyBkZWZhdWx0IHRhcmdldFxuICAgICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIhLmFkZFRhcmdldHMoXG4gICAgICAgIGAke3NlcnZpY2VOYW1lfVRhcmdldEdyb3VwYCxcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICAgIHNlcnZpY2UubG9hZEJhbGFuY2VyVGFyZ2V0KHtcbiAgICAgICAgICAgICAgY29udGFpbmVyTmFtZTogcHJpbWFyeUNvbnRhaW5lci5jb250YWluZXJOYW1lLFxuICAgICAgICAgICAgICBjb250YWluZXJQb3J0XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcG9ydDogY29udGFpbmVyUG9ydCxcbiAgICAgICAgICBwcm90b2NvbDogQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICAgIGhlYWx0aENoZWNrOiBoZWFsdGhDaGVja0NvbmZpZ1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aS1zZXJ2aWNlIC0gY3JlYXRlIHRhcmdldCBncm91cCB3aXRoIHJvdXRpbmcgcnVsZXNcbiAgICAgIGNvbnN0IHByaW9yaXR5ID0gc2VydmljZVByb3BzLnJvdXRpbmc/LnByaW9yaXR5IHx8IHRoaXMubmV4dFByaW9yaXR5Kys7XG5cbiAgICAgIGNvbnN0IHRhcmdldEdyb3VwID0gdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciEuYWRkVGFyZ2V0cyhcbiAgICAgICAgYCR7c2VydmljZU5hbWV9VGFyZ2V0c2AsXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXRzOiBbXG4gICAgICAgICAgICBzZXJ2aWNlLmxvYWRCYWxhbmNlclRhcmdldCh7XG4gICAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHByaW1hcnlDb250YWluZXIuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgICAgY29udGFpbmVyUG9ydFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBvcnQ6IGNvbnRhaW5lclBvcnQsXG4gICAgICAgICAgcHJvdG9jb2w6IEFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgICAgICBoZWFsdGhDaGVjazogaGVhbHRoQ2hlY2tDb25maWcsXG4gICAgICAgICAgY29uZGl0aW9uczogdGhpcy5idWlsZFJvdXRpbmdDb25kaXRpb25zKHNlcnZpY2VQcm9wcyksXG4gICAgICAgICAgcHJpb3JpdHlcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRhcmdldEdyb3VwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3V0aW5nQ29uZGl0aW9ucyhcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBMaXN0ZW5lckNvbmRpdGlvbltdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBMaXN0ZW5lckNvbmRpdGlvbltdID0gW107XG5cbiAgICBpZiAoc2VydmljZVByb3BzLnJvdXRpbmc/LnBhdGgpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgTGlzdGVuZXJDb25kaXRpb24ucGF0aFBhdHRlcm5zKFtzZXJ2aWNlUHJvcHMucm91dGluZy5wYXRoXSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzZXJ2aWNlUHJvcHMucm91dGluZz8uaG9zdCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBMaXN0ZW5lckNvbmRpdGlvbi5ob3N0SGVhZGVycyhbc2VydmljZVByb3BzLnJvdXRpbmcuaG9zdF0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZXJ2aWNlU2NhbGluZyhcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzLFxuICAgIHNlcnZpY2U6IEZhcmdhdGVTZXJ2aWNlIHwgRWMyU2VydmljZVxuICApOiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3kge1xuICAgIGNvbnN0IHNjYWxhYmxlVGFyZ2V0ID0gbmV3IFNjYWxhYmxlVGFyZ2V0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3NlcnZpY2VOYW1lfVNjYWxhYmxlVGFyZ2V0YCxcbiAgICAgIHtcbiAgICAgICAgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZS5FQ1MsXG4gICAgICAgIHJlc291cmNlSWQ6IGBzZXJ2aWNlLyR7dGhpcy5jbHVzdGVyLmNsdXN0ZXJOYW1lfS8ke3NlcnZpY2Uuc2VydmljZU5hbWV9YCxcbiAgICAgICAgc2NhbGFibGVEaW1lbnNpb246IFwiZWNzOnNlcnZpY2U6RGVzaXJlZENvdW50XCIsXG4gICAgICAgIG1pbkNhcGFjaXR5OiBzZXJ2aWNlUHJvcHMubWluQ2FwYWNpdHkgPz8gMixcbiAgICAgICAgbWF4Q2FwYWNpdHk6IHNlcnZpY2VQcm9wcy5tYXhDYXBhY2l0eSA/PyAxMFxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtzZXJ2aWNlTmFtZX1TY2FsaW5nUG9saWN5YCxcbiAgICAgIHtcbiAgICAgICAgc2NhbGluZ1RhcmdldDogc2NhbGFibGVUYXJnZXQsXG4gICAgICAgIHByZWRlZmluZWRNZXRyaWM6XG4gICAgICAgICAgc2VydmljZVByb3BzLnNjYWxpbmdUeXBlID09PSBTY2FsaW5nVHlwZS5NRU1PUllcbiAgICAgICAgICAgID8gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxuICAgICAgICAgICAgOiBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfQ1BVX1VUSUxJWkFUSU9OLFxuICAgICAgICB0YXJnZXRWYWx1ZTogNTAsXG4gICAgICAgIHNjYWxlSW5Db29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIHNjYWxlT3V0Q29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIgdXNlcyBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGhhc0FueUVjMlNlcnZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc2VydmljZXMuc29tZSgocykgPT4gcy5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIgdXNlcyBGYXJnYXRlIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNBbnlGYXJnYXRlU2VydmljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zZXJ2aWNlcy5zb21lKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMuY2FwYWNpdHlQcm92aWRlciA9PT0gXCJGQVJHQVRFXCIgfHxcbiAgICAgICAgcy5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkZBUkdBVEVfU1BPVFwiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgVlBDIGhhcyBOQVQgZ2F0ZXdheXMuXG4gICAqIC0gRm9yIEZqYWxsIFZwYzogdXNlcyBoYXNOYXRHYXRld2F5cyBwcm9wZXJ0eVxuICAgKiAtIEZvciBvdGhlciBWUENzOiBjaGVja3MgaWYgcHJpdmF0ZSBzdWJuZXRzIGV4aXN0IChhc3N1bWVzIE5BVCBpZiBwcmVzZW50KVxuICAgKi9cbiAgcHJpdmF0ZSB2cGNIYXNOYXRHYXRld2F5cygpOiBib29sZWFuIHtcbiAgICBjb25zdCB2cGMgPSB0aGlzLmNsdXN0ZXIudnBjO1xuICAgIC8vIENoZWNrIGlmIGl0J3Mgb3VyIGN1c3RvbSBWcGMgY2xhc3Mgd2l0aCBoYXNOYXRHYXRld2F5cyBwcm9wZXJ0eVxuICAgIGlmIChcImhhc05hdEdhdGV3YXlzXCIgaW4gdnBjICYmIHR5cGVvZiB2cGMuaGFzTmF0R2F0ZXdheXMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gdnBjLmhhc05hdEdhdGV3YXlzO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogYXNzdW1lIE5BVCBpZiBwcml2YXRlIHN1Ym5ldHMgZXhpc3RcbiAgICByZXR1cm4gdnBjLnByaXZhdGVTdWJuZXRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERlcGxveWFibGVTZXJ2aWNlIG91dHB1dHMgZm9yIGRlcGxveW1lbnQgYXV0b21hdGlvbi5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgYSBEZXBsb3lhYmxlU2VydmljZSBvdXRwdXQgc28gdGhlIGRlcGxveW1lbnQgc2VydmljZVxuICAgKiBjYW4gZmluZCBhbmQgZGVwbG95IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci5cbiAgICovXG4gIGFkZERlcGxveWFibGVTZXJ2aWNlT3V0cHV0cyhwcm9wczogRWNzQ2x1c3RlclByb3BzKSB7XG4gICAgZm9yIChjb25zdCBbc2VydmljZU5hbWUsIHNlcnZpY2VEYXRhXSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX0ke3NlcnZpY2VOYW1lfURlcGxveWFibGVTZXJ2aWNlYCxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1EZXBsb3lhYmxlU2VydmljZWAsXG4gICAgICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9JHtzZXJ2aWNlTmFtZX1EZXBsb3lhYmxlU2VydmljZWAsXG4gICAgICAgICAgdmFsdWU6IHNlcnZpY2VEYXRhLnNlcnZpY2Uuc2VydmljZUFybixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYERlcGxveWFibGUgRUNTIFNlcnZpY2UgQVJOIGZvciAke3NlcnZpY2VOYW1lfSBpbiAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY2FwYWNpdHkgcHJvdmlkZXIgZm9yIGEgc2VydmljZS5cbiAgICogRWFjaCBzZXJ2aWNlIE1VU1Qgc3BlY2lmeSBpdHMgb3duIGNhcGFjaXR5UHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGdldFNlcnZpY2VDYXBhY2l0eVByb3ZpZGVyKFxuICAgIHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzXG4gICk6IEVjc0NhcGFjaXR5UHJvdmlkZXIge1xuICAgIHJldHVybiBzZXJ2aWNlUHJvcHMuY2FwYWNpdHlQcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzZXJ2aWNlIHVzZXMgYSBGYXJnYXRlIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1NlcnZpY2VGYXJnYXRlKHNlcnZpY2VQcm9wczogRWNzU2VydmljZVByb3BzKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFNlcnZpY2VDYXBhY2l0eVByb3ZpZGVyKHNlcnZpY2VQcm9wcyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyID09PSBcIkZBUkdBVEVcIiB8fCBwcm92aWRlciA9PT0gXCJGQVJHQVRFX1NQT1RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzZXJ2aWNlIHVzZXMgYW4gRUMyIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1NlcnZpY2VFYzIoc2VydmljZVByb3BzOiBFY3NTZXJ2aWNlUHJvcHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXJ2aWNlQ2FwYWNpdHlQcm92aWRlcihzZXJ2aWNlUHJvcHMpID09PSBcIkVDMlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBrZXkgZm9yIEVDMiBjb25maWcgKGZvciBBU0cgZGVkdXBsaWNhdGlvbikuXG4gICAqIFNlcnZpY2VzIHdpdGggbWF0Y2hpbmcga2V5cyBzaGFyZSBhbiBBU0cuXG4gICAqL1xuICBwcml2YXRlIGdldEVjMkNvbmZpZ0tleShlYzJDb25maWc6IEVjMkNhcGFjaXR5Q29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSBlYzJDb25maWcuaW5zdGFuY2VUeXBlID8/IFwidDMubWljcm9cIjtcbiAgICBjb25zdCBhbWlIYXJkd2FyZVR5cGUgPSBlYzJDb25maWcuYW1pSGFyZHdhcmVUeXBlID8/IFwiU1RBTkRBUkRcIjtcbiAgICByZXR1cm4gYCR7aW5zdGFuY2VUeXBlfS0ke2FtaUhhcmR3YXJlVHlwZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgY3JlYXRlcyBhbiBBU0cgY2FwYWNpdHkgcHJvdmlkZXIgZm9yIGEgc2VydmljZS5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBFQzIgY29uZmlncyBzaGFyZSB0aGUgc2FtZSBBU0cuXG4gICAqL1xuICBwcml2YXRlIGdldE9yQ3JlYXRlQXNnQ2FwYWNpdHlQcm92aWRlcihcbiAgICBzZXJ2aWNlUHJvcHM6IEVjc1NlcnZpY2VQcm9wc1xuICApOiBBc2dDYXBhY2l0eVByb3ZpZGVyIHtcbiAgICAvLyBHZXQgRUMyIGNvbmZpZyBmcm9tIHNlcnZpY2UgKHJlcXVpcmVkIGZvciBFQzIgY2FwYWNpdHkgcHJvdmlkZXIpXG4gICAgY29uc3QgZWMyQ29uZmlnID0gc2VydmljZVByb3BzLmVjMkNvbmZpZyA/PyB7fTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEVjMkNvbmZpZ0tleShlYzJDb25maWcpO1xuXG4gICAgLy8gUmV0dXJuIGV4aXN0aW5nIGlmIGZvdW5kXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmFzZ0NhcGFjaXR5UHJvdmlkZXJzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXcgQVNHIGFuZCBjYXBhY2l0eSBwcm92aWRlclxuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IGVjMkNvbmZpZy5pbnN0YW5jZVR5cGUgPz8gXCJ0My5taWNyb1wiO1xuICAgIGNvbnN0IGFtaUhhcmR3YXJlVHlwZSA9IGVjMkNvbmZpZy5hbWlIYXJkd2FyZVR5cGVcbiAgICAgID8gZWMyQ29uZmlnLmFtaUhhcmR3YXJlVHlwZSA9PT0gXCJTVEFOREFSRFwiXG4gICAgICAgID8gQW1pSGFyZHdhcmVUeXBlLlNUQU5EQVJEXG4gICAgICAgIDogQW1pSGFyZHdhcmVUeXBlLkFSTVxuICAgICAgOiBpbmZlckFtaUhhcmR3YXJlVHlwZShpbnN0YW5jZVR5cGUpO1xuICAgIGNvbnN0IG1pbkNhcGFjaXR5ID0gZWMyQ29uZmlnLm1pbkNhcGFjaXR5ID8/IDI7XG4gICAgY29uc3QgbWF4Q2FwYWNpdHkgPSBlYzJDb25maWcubWF4Q2FwYWNpdHkgPz8gMztcblxuICAgIC8vIENyZWF0ZSBzZWN1cml0eSBncm91cCBmb3IgdGhpcyBBU0dcbiAgICBjb25zdCBhc2dTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX1Bc2dTZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciAke2tleX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBPcGVuIGNvbnRhaW5lciBwb3J0cyBmb3IgZGlyZWN0IEVDMiBhY2Nlc3MgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmRpcmVjdEFjY2Vzc0VuYWJsZWQpIHtcbiAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiB0aGlzLnByb3BzLnNlcnZpY2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VydmljZUVjMihzZXJ2aWNlKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNlcnZpY2UuY29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5wb3J0KSB7XG4gICAgICAgICAgICAgIGFzZ1NlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICAgICAgICAgICAgUGVlci5hbnlJcHY0KCksXG4gICAgICAgICAgICAgICAgUG9ydC50Y3AoY29udGFpbmVyLnBvcnQpLFxuICAgICAgICAgICAgICAgIGBEaXJlY3QgYWNjZXNzIHRvIGNvbnRhaW5lciBwb3J0ICR7Y29udGFpbmVyLnBvcnR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFzZyA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2tleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIil9QXV0b1NjYWxpbmdHcm91cGAsXG4gICAgICB7XG4gICAgICAgIGF1dG9TY2FsaW5nR3JvdXBOYW1lOiBgJHt0aGlzLnByb3BzLmNsdXN0ZXJOYW1lfSR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX1Bc2dgLFxuICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eUdyb3VwOiBhc2dTZWN1cml0eUdyb3VwLFxuICAgICAgICBtaW5DYXBhY2l0eSxcbiAgICAgICAgbWF4Q2FwYWNpdHksXG4gICAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShpbnN0YW5jZVR5cGUpLFxuICAgICAgICBjYXBhY2l0eVJlYmFsYW5jZTogdHJ1ZSxcbiAgICAgICAgaW5zdGFuY2VNb25pdG9yaW5nOiBNb25pdG9yaW5nLkJBU0lDLFxuICAgICAgICBtYWNoaW5lSW1hZ2U6IEVjc09wdGltaXplZEltYWdlLmFtYXpvbkxpbnV4MihhbWlIYXJkd2FyZVR5cGUpXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IEFzZ0NhcGFjaXR5UHJvdmlkZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7a2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKX1Bc2dDYXBhY2l0eVByb3ZpZGVyYCxcbiAgICAgIHtcbiAgICAgICAgYXV0b1NjYWxpbmdHcm91cDogYXNnLFxuICAgICAgICBlbmFibGVNYW5hZ2VkRHJhaW5pbmc6IHRydWUsXG4gICAgICAgIGVuYWJsZU1hbmFnZWRUZXJtaW5hdGlvblByb3RlY3Rpb246IGZhbHNlXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuY2x1c3Rlci5hZGRBc2dDYXBhY2l0eVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICB0aGlzLmFzZ0NhcGFjaXR5UHJvdmlkZXJzLnNldChrZXksIHByb3ZpZGVyKTtcblxuICAgIC8vIFN0b3JlIGZpcnN0IEFTRyBzZWN1cml0eSBncm91cCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoIXRoaXMuYXNnU2VjdXJpdHlHcm91cCkge1xuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwID0gYXNnU2VjdXJpdHlHcm91cDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFueSBzZXJ2aWNlIGluIHRoZSBjbHVzdGVyIHVzZXMgYSBGYXJnYXRlIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhbnlTZXJ2aWNlVXNlc0ZhcmdhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc2VydmljZXMuc29tZSgocykgPT4gdGhpcy5pc1NlcnZpY2VGYXJnYXRlKHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IHNlcnZpY2UgaW4gdGhlIGNsdXN0ZXIgdXNlcyBhbiBFQzIgY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqL1xuICBwcml2YXRlIGFueVNlcnZpY2VVc2VzRWMyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnNlcnZpY2VzLnNvbWUoKHMpID0+IHRoaXMuaXNTZXJ2aWNlRWMyKHMpKTtcbiAgfVxuXG4gIGFkZENsdXN0ZXIocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIC8vIEVuYWJsZSBGYXJnYXRlIGNhcGFjaXR5IHByb3ZpZGVycyBpZiBBTlkgc2VydmljZSB1c2VzIEZBUkdBVEUgb3IgRkFSR0FURV9TUE9UXG4gICAgY29uc3QgbmVlZHNGYXJnYXRlID0gdGhpcy5hbnlTZXJ2aWNlVXNlc0ZhcmdhdGUoKTtcblxuICAgIHRoaXMuY2x1c3RlciA9IG5ldyBDZGtDbHVzdGVyKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfWAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgICAgY29udGFpbmVySW5zaWdodHNWMjogQ29udGFpbmVySW5zaWdodHMuRU5BQkxFRCxcbiAgICAgIGVuYWJsZUZhcmdhdGVDYXBhY2l0eVByb3ZpZGVyczogbmVlZHNGYXJnYXRlXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVDbHVzdGVyYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsXG4gICAgICB2YWx1ZTogdGhpcy5jbHVzdGVyLmNsdXN0ZXJBcm5cbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9Q2x1c3RlckFybmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9Q2x1c3RlckFybmAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1DbHVzdGVyQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmNsdXN0ZXIuY2x1c3RlckFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgRUNTIENsdXN0ZXIgQVJOIGZvciAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE5vdGU6IGFkZEF1dG9TY2FsaW5nR3JvdXAgcmVtb3ZlZCAtIEFTR3MgYXJlIG5vdyBjcmVhdGVkIHBlci1zZXJ2aWNlIHZpYSBnZXRPckNyZWF0ZUFzZ0NhcGFjaXR5UHJvdmlkZXJcblxuICBhZGRMb2FkQmFsYW5jZXIocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIGNvbnN0IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lID0gYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYDtcbiAgICBjb25zdCBzdXBwb3J0ZWROYW1lTGVuZ3RoID0gMzI7XG5cbiAgICBsZXQgdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSA9XG4gICAgICBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZS5sZW5ndGggPiBzdXBwb3J0ZWROYW1lTGVuZ3RoXG4gICAgICAgID8gZGVmYXVsdExvYWRCYWxhbmNlck5hbWUuc3Vic3RyaW5nKDAsIHN1cHBvcnRlZE5hbWVMZW5ndGgpXG4gICAgICAgIDogZGVmYXVsdExvYWRCYWxhbmNlck5hbWU7XG5cbiAgICB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lID0gdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZS5yZXBsYWNlKC8tKyQvLCBcIlwiKTtcblxuICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBwcm9wcy5jbHVzdGVyPy5sb2FkQmFsYW5jZXIgPT09IFwiaW50ZXJuYWxcIjtcblxuICAgIC8vIENoZWNrIGlmIEFOWSBzZXJ2aWNlIHVzZXMgRUMyIChjbHVzdGVyLWxldmVsIG9yIHBlci1zZXJ2aWNlKVxuICAgIGNvbnN0IGhhc0VjMlNlcnZpY2VzID0gdGhpcy5hbnlTZXJ2aWNlVXNlc0VjMigpO1xuXG4gICAgaWYgKGhhc0VjMlNlcnZpY2VzKSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXBgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgU2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSAke3Byb3BzLmNsdXN0ZXJOYW1lfSBsb2FkIGJhbGFuY2VyYFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBBbGxvdyB0cmFmZmljIHRvIGFsbCBBU0cgc2VjdXJpdHkgZ3JvdXBzXG4gICAgICBpZiAodGhpcy5hc2dTZWN1cml0eUdyb3VwKSB7XG4gICAgICAgIHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgICAgICBQb3J0LmFsbFRjcCgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd0Zyb20oXG4gICAgICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgICAgIFBvcnQudGNwUmFuZ2UoNDkxNTIsIDY1NTM1KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRCYWxhbmNlciA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgICBpbnRlcm5ldEZhY2luZzogIWlzSW50ZXJuYWwsXG4gICAgICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgICAgIGxvYWRCYWxhbmNlck5hbWU6IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUsXG4gICAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgICAgc3VibmV0VHlwZTogaXNJbnRlcm5hbFxuICAgICAgICAgICAgICA/IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgICAgICA6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlciA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgICBpbnRlcm5ldEZhY2luZzogIWlzSW50ZXJuYWwsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyTmFtZTogdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSxcbiAgICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgICBzdWJuZXRUeXBlOiBpc0ludGVybmFsXG4gICAgICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgICAgIDogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJEbnNOYW1lYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJEbnNOYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMubG9hZEJhbGFuY2VyLmxvYWRCYWxhbmNlckRuc05hbWVcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyVXJsYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJVcmxgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyVXJsYCxcbiAgICAgIHZhbHVlOiBgaHR0cDovLyR7dGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IGBMb2FkIEJhbGFuY2VyIFVSTCBmb3IgJHtwcm9wcy5jbHVzdGVyTmFtZX1gXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvcnQgbG9hZCBiYWxhbmNlciBBUk4gZm9yIG1vbml0b3JpbmdcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckFybmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyQXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyQXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBMb2FkIEJhbGFuY2VyIEFSTiBmb3IgJHtwcm9wcy5jbHVzdGVyTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERpcmVjdEFjY2Vzc091dHB1dHMocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaXJlY3RBY2Nlc3NFbmFibGVkIHx8ICF0aGlzLmF1dG9TY2FsaW5nR3JvdXApIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgZmlyc3QgY29udGFpbmVyIHBvcnQgKGZvciB1c2VyIGluc3RydWN0aW9ucylcbiAgICBjb25zdCBjb250YWluZXJQb3J0ID1cbiAgICAgIHByb3BzLnNlcnZpY2VzLmZsYXRNYXAoKHMpID0+IHMuY29udGFpbmVycykuZmluZCgoYykgPT4gYy5wb3J0KT8ucG9ydCB8fFxuICAgICAgMzAwMDtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cE5hbWVgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUF1dG9TY2FsaW5nR3JvdXBOYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUF1dG9TY2FsaW5nR3JvdXBOYW1lYCxcbiAgICAgIHZhbHVlOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYFJ1bjogYXdzIGF1dG9zY2FsaW5nIGRlc2NyaWJlLWF1dG8tc2NhbGluZy1ncm91cHMgLS1hdXRvLXNjYWxpbmctZ3JvdXAtbmFtZXMgPG5hbWU+IHRvIGZpbmQgaW5zdGFuY2UgSVBgXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfURpcmVjdEFjY2Vzc1BvcnRgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfURpcmVjdEFjY2Vzc1BvcnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGlyZWN0QWNjZXNzUG9ydGAsXG4gICAgICB2YWx1ZTogU3RyaW5nKGNvbnRhaW5lclBvcnQpLFxuICAgICAgZGVzY3JpcHRpb246IGBBY2Nlc3MgeW91ciBhcHAgYXQgaHR0cDovLzxFQzItUFVCTElDLUlQPjoke2NvbnRhaW5lclBvcnR9YFxuICAgIH0pO1xuICB9XG5cbiAgYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5sb2FkQmFsYW5jZXIpIHJldHVybjtcblxuICAgIC8vIERldGVybWluZSBwb3J0IGJhc2VkIG9uIHdoZXRoZXIgSFRUUFMgaXMgY29uZmlndXJlZCAoZG9tYWluICsgY2VydClcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5jZXJ0aWZpY2F0ZSA/IDQ0MyA6IDgwO1xuXG4gICAgLy8gRGVmYXVsdCBhY3Rpb24gZm9yIHJlcXVlc3RzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IHJvdXRpbmcgcnVsZVxuICAgIC8vIFJldHVybnMgNDA0IGZvciBtdWx0aS1zZXJ2aWNlIGNsdXN0ZXJzIHdpdGggcm91dGluZyBydWxlc1xuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBMaXN0ZW5lckFjdGlvbi5maXhlZFJlc3BvbnNlKDQwNCwge1xuICAgICAgY29udGVudFR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgbWVzc2FnZUJvZHk6IFwiTm90IEZvdW5kXCJcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNlcnRpZmljYXRlKSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxpc3RlbmVyYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgY2VydGlmaWNhdGVzOiBbdGhpcy5jZXJ0aWZpY2F0ZV0sXG4gICAgICAgICAgZGVmYXVsdEFjdGlvblxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxpc3RlbmVyYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgZGVmYXVsdEFjdGlvblxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEhvc3RlZFpvbmUocHJvcHM6IEVjc0NsdXN0ZXJQcm9wcykge1xuICAgIC8vIFN1cHBvcnQgYm90aCBuZXcgY2x1c3Rlci5kb21haW4gYW5kIGFkdmFuY2VkIGNsdXN0ZXIuZG9tYWluQ29uZmlnXG4gICAgY29uc3QgZG9tYWluQ29uZmlnID0gcHJvcHMuY2x1c3Rlcj8uZG9tYWluQ29uZmlnO1xuICAgIGNvbnN0IHNpbXBsZURvbWFpbiA9IHByb3BzLmNsdXN0ZXI/LmRvbWFpbjtcblxuICAgIGlmICghZG9tYWluQ29uZmlnICYmICFzaW1wbGVEb21haW4pIHJldHVybjtcblxuICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBkb21haW5Db25maWc/LmRvbWFpbk5hbWUgfHwgc2ltcGxlRG9tYWluITtcblxuICAgIGlmICghZG9tYWluQ29uZmlnPy5ob3N0ZWRab25lKSB7XG4gICAgICBjb25zdCBob3N0ZWRab25lID0gbmV3IEZqYWxsSG9zdGVkWm9uZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9SG9zdGVkWm9uZWAsXG4gICAgICAgIHtcbiAgICAgICAgICB6b25lTmFtZTogZG9tYWluTmFtZVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLmhvc3RlZFpvbmUgPSBob3N0ZWRab25lLmdldEludGVybmFsSG9zdGVkWm9uZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhvc3RlZFpvbmUgPSBkb21haW5Db25maWcuaG9zdGVkWm9uZS5nZXRJbnRlcm5hbEhvc3RlZFpvbmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRvbWFpbkNvbmZpZz8uY2VydGlmaWNhdGUpIHtcbiAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgQ2VydGlmaWNhdGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUNlcnRpZmljYXRlYCxcbiAgICAgICAge1xuICAgICAgICAgIGRvbWFpbk5hbWUsXG4gICAgICAgICAgdmFsaWRhdGlvbjogQ2VydGlmaWNhdGVWYWxpZGF0aW9uLmZyb21EbnModGhpcy5ob3N0ZWRab25lKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhZHZhbmNlZCByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvKVxuICAgIGlmIChkb21haW5Db25maWcpIHtcbiAgICAgIGNvbnN0IGxhdGVuY3lDb25maWcgPSBkb21haW5Db25maWcgYXMgTGF0ZW5jeURvbWFpbkNvbmZpZztcbiAgICAgIGNvbnN0IHdlaWdodGVkQ29uZmlnID0gZG9tYWluQ29uZmlnIGFzIFdlaWdodGVkRG9tYWluQ29uZmlnO1xuICAgICAgY29uc3QgZ2VvQ29uZmlnID0gZG9tYWluQ29uZmlnIGFzIEdlb0xvY2F0aW9uRG9tYWluQ29uZmlnO1xuXG4gICAgICBjb25zdCBoYXNSb3V0aW5nUG9saWN5OiBib29sZWFuID1cbiAgICAgICAgISFsYXRlbmN5Q29uZmlnPy5yZWdpb24gfHxcbiAgICAgICAgd2VpZ2h0ZWRDb25maWc/LndlaWdodCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICEhZ2VvQ29uZmlnPy5nZW9Mb2NhdGlvbjtcblxuICAgICAgbGV0IHNldElkZW50aWZpZXIgPSBkb21haW5Db25maWcuc2V0SWRlbnRpZmllcjtcbiAgICAgIGlmIChoYXNSb3V0aW5nUG9saWN5ICYmICFzZXRJZGVudGlmaWVyKSB7XG4gICAgICAgIGlmIChsYXRlbmN5Q29uZmlnPy5yZWdpb24pIHtcbiAgICAgICAgICBzZXRJZGVudGlmaWVyID0gYCR7cHJvcHMuY2x1c3Rlck5hbWV9JHtsYXRlbmN5Q29uZmlnLnJlZ2lvbn1gO1xuICAgICAgICB9IGVsc2UgaWYgKHdlaWdodGVkQ29uZmlnPy53ZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNldElkZW50aWZpZXIgPSBgJHtwcm9wcy5jbHVzdGVyTmFtZX1XZWlnaHQke3dlaWdodGVkQ29uZmlnLndlaWdodH1gO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb0NvbmZpZz8uZ2VvTG9jYXRpb24pIHtcbiAgICAgICAgICBzZXRJZGVudGlmaWVyID0gYCR7cHJvcHMuY2x1c3Rlck5hbWV9R2VvYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5sb2FkQmFsYW5jZXIpIHtcbiAgICAgICAgdGhpcy5hUmVjb3JkID0gbmV3IEFSZWNvcmQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9QVJlY29yZGAsIHtcbiAgICAgICAgICByZWNvcmROYW1lOiBkb21haW5OYW1lLFxuICAgICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgICAgICB0YXJnZXQ6IFJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgICAgICBuZXcgTG9hZEJhbGFuY2VyVGFyZ2V0KHRoaXMubG9hZEJhbGFuY2VyLCB7XG4gICAgICAgICAgICAgIGV2YWx1YXRlVGFyZ2V0SGVhbHRoOiBoYXNSb3V0aW5nUG9saWN5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgcmVnaW9uOiBsYXRlbmN5Q29uZmlnPy5yZWdpb24sXG4gICAgICAgICAgd2VpZ2h0OiB3ZWlnaHRlZENvbmZpZz8ud2VpZ2h0LFxuICAgICAgICAgIGdlb0xvY2F0aW9uOiBnZW9Db25maWc/Lmdlb0xvY2F0aW9uLFxuICAgICAgICAgIHNldElkZW50aWZpZXI6IHNldElkZW50aWZpZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaW1wbGVEb21haW4gJiYgdGhpcy5sb2FkQmFsYW5jZXIpIHtcbiAgICAgIC8vIFNpbXBsZSBkb21haW4gLSBqdXN0IGNyZWF0ZSBBIHJlY29yZFxuICAgICAgdGhpcy5hUmVjb3JkID0gbmV3IEFSZWNvcmQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9QVJlY29yZGAsIHtcbiAgICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZSxcbiAgICAgICAgem9uZTogdGhpcy5ob3N0ZWRab25lLFxuICAgICAgICB0YXJnZXQ6IFJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgICAgbmV3IExvYWRCYWxhbmNlclRhcmdldCh0aGlzLmxvYWRCYWxhbmNlcilcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVjc0NsdXN0ZXJQcm9wc1xuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBFY3NDbHVzdGVyUHJvcHMgPSB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiAoc2IuZ2V0TmV0d29yaygpIGFzIElWcGMpIHx8IHByb3BzLnZwY1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19