@aws-cdk/aws-bedrock-agentcore-alpha 2.242.0-alpha.0 → 2.244.0-alpha.0

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 (33) hide show
  1. package/.jsii +70 -70
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/lib/gateway/gateway-base.js +1 -1
  4. package/lib/gateway/gateway.js +9 -9
  5. package/lib/gateway/inbound-auth/authorizer.js +5 -5
  6. package/lib/gateway/inbound-auth/custom-claim.js +6 -6
  7. package/lib/gateway/interceptor.js +1 -1
  8. package/lib/gateway/outbound-auth/api-key.js +1 -1
  9. package/lib/gateway/outbound-auth/credential-provider.js +1 -1
  10. package/lib/gateway/protocol.js +2 -2
  11. package/lib/gateway/targets/schema/api-schema.js +6 -6
  12. package/lib/gateway/targets/schema/tool-schema.js +7 -7
  13. package/lib/gateway/targets/target-base.js +1 -1
  14. package/lib/gateway/targets/target-configuration.js +25 -25
  15. package/lib/gateway/targets/target.js +4 -4
  16. package/lib/memory/memory-strategy.js +1 -1
  17. package/lib/memory/memory.js +2 -2
  18. package/lib/memory/strategies/managed-strategy.js +1 -1
  19. package/lib/memory/strategies/self-managed-strategy.js +1 -1
  20. package/lib/memory/validation-helpers.js +3 -3
  21. package/lib/network/network-configuration.js +4 -4
  22. package/lib/runtime/inbound-auth/custom-claim.js +6 -6
  23. package/lib/runtime/inbound-auth/runtime-authorizer-configuration.js +4 -4
  24. package/lib/runtime/runtime-artifact.js +5 -5
  25. package/lib/runtime/runtime-base.js +3 -3
  26. package/lib/runtime/runtime-endpoint-base.js +1 -1
  27. package/lib/runtime/runtime-endpoint.js +9 -9
  28. package/lib/runtime/runtime.js +20 -20
  29. package/lib/runtime/validation-helpers.js +2 -2
  30. package/lib/tools/browser.js +4 -4
  31. package/lib/tools/code-interpreter.js +4 -4
  32. package/lib/tools/validation-helpers.js +2 -2
  33. package/package.json +9 -9
@@ -92,7 +92,7 @@ let Runtime = (() => {
92
92
  Runtime = _classThis = _classDescriptor.value;
93
93
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
94
94
  }
95
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Runtime", version: "2.242.0-alpha.0" };
95
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Runtime", version: "2.244.0-alpha.0" };
96
96
  /** Uniquely identifies this class. */
97
97
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Runtime';
98
98
  /**
@@ -445,7 +445,7 @@ let Runtime = (() => {
445
445
  }
446
446
  }
447
447
  if (allErrors.length > 0) {
448
- throw new errors_1.ValidationError(allErrors.join('\n'), this);
448
+ throw new errors_1.ValidationError('InvalidRequestHeaderConfiguration', allErrors.join('\n'), this);
449
449
  }
450
450
  }
451
451
  /**
@@ -456,13 +456,13 @@ let Runtime = (() => {
456
456
  if (lifecycleConfiguration.idleRuntimeSessionTimeout && !lifecycleConfiguration.idleRuntimeSessionTimeout.isUnresolved()) {
457
457
  if (lifecycleConfiguration.idleRuntimeSessionTimeout.toSeconds() < LIFECYCLE_MIN_TIMEOUT.toSeconds()
458
458
  || lifecycleConfiguration.idleRuntimeSessionTimeout.toSeconds() > LIFECYCLE_MAX_LIFETIME.toSeconds()) {
459
- throw new errors_1.ValidationError(`Idle runtime session timeout must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`, this);
459
+ throw new errors_1.ValidationError('InvalidIdleRuntimeSessionTimeout', `Idle runtime session timeout must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`, this);
460
460
  }
461
461
  }
462
462
  if (lifecycleConfiguration.maxLifetime && !lifecycleConfiguration.maxLifetime.isUnresolved()) {
463
463
  if (lifecycleConfiguration.maxLifetime.toSeconds() < LIFECYCLE_MIN_TIMEOUT.toSeconds()
464
464
  || lifecycleConfiguration.maxLifetime.toSeconds() > LIFECYCLE_MAX_LIFETIME.toSeconds()) {
465
- throw new errors_1.ValidationError(`Maximum lifetime must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`, this);
465
+ throw new errors_1.ValidationError('InvalidMaxLifetime', `Maximum lifetime must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`, this);
466
466
  }
467
467
  }
468
468
  }
@@ -488,7 +488,7 @@ let Runtime = (() => {
488
488
  // Combine and throw if any errors
489
489
  const allErrors = [...lengthErrors, ...patternErrors];
490
490
  if (allErrors.length > 0) {
491
- throw new errors_1.ValidationError(allErrors.join('\n'), this);
491
+ throw new errors_1.ValidationError('InvalidRuntimeName', allErrors.join('\n'), this);
492
492
  }
493
493
  }
494
494
  /**
@@ -509,7 +509,7 @@ let Runtime = (() => {
509
509
  maxLength: 1200,
510
510
  });
511
511
  if (errors.length > 0) {
512
- throw new errors_1.ValidationError(errors.join('\n'), this);
512
+ throw new errors_1.ValidationError('InvalidDescription', errors.join('\n'), this);
513
513
  }
514
514
  }
515
515
  }
@@ -524,7 +524,7 @@ let Runtime = (() => {
524
524
  const entries = Object.entries(envVars);
525
525
  // Validate number of entries (0-50)
526
526
  if (entries.length > 50) {
527
- throw new errors_1.ValidationError(`Too many environment variables: ${entries.length}. Maximum allowed is 50`, this);
527
+ throw new errors_1.ValidationError('TooManyEnvironmentVariables', `Too many environment variables: ${entries.length}. Maximum allowed is 50`, this);
528
528
  }
529
529
  for (const [key, value] of entries) {
530
530
  // Skip validation if key or value contains CDK tokens
@@ -543,11 +543,11 @@ let Runtime = (() => {
543
543
  // Combine and throw if any errors
544
544
  const allErrors = [...lengthErrors, ...patternErrors];
545
545
  if (allErrors.length > 0) {
546
- throw new errors_1.ValidationError(allErrors.join('\n'), this);
546
+ throw new errors_1.ValidationError('InvalidEnvironmentVariableKey', allErrors.join('\n'), this);
547
547
  }
548
548
  // Validate value length (0-2048 characters per CloudFormation)
549
549
  if (value.length > 2048) {
550
- throw new errors_1.ValidationError(`Invalid environment variable value length for key '${key}': ${value.length} characters. ` +
550
+ throw new errors_1.ValidationError('InvalidEnvironmentVariableValue', `Invalid environment variable value length for key '${key}': ${value.length} characters. ` +
551
551
  'Values must not exceed 2048 characters', this);
552
552
  }
553
553
  }
@@ -576,10 +576,10 @@ let Runtime = (() => {
576
576
  // Combine key errors and throw if any
577
577
  const keyErrors = [...keyLengthErrors, ...keyPatternErrors];
578
578
  if (keyErrors.length > 0) {
579
- throw new errors_1.ValidationError(keyErrors.join('\n'), this);
579
+ throw new errors_1.ValidationError('InvalidTagKey', keyErrors.join('\n'), this);
580
580
  }
581
581
  if (value === undefined || value === null) {
582
- throw new errors_1.ValidationError(`Tag value for key "${key}" cannot be null or undefined`, this);
582
+ throw new errors_1.ValidationError('NullTagValue', `Tag value for key "${key}" cannot be null or undefined`, this);
583
583
  }
584
584
  // Validate tag value length
585
585
  const valueLengthErrors = (0, validation_helpers_1.validateStringField)({
@@ -593,7 +593,7 @@ let Runtime = (() => {
593
593
  // Combine value errors and throw if any
594
594
  const valueErrors = [...valueLengthErrors, ...valuePatternErrors];
595
595
  if (valueErrors.length > 0) {
596
- throw new errors_1.ValidationError(valueErrors.join('\n'), this);
596
+ throw new errors_1.ValidationError('InvalidTagValue', valueErrors.join('\n'), this);
597
597
  }
598
598
  }
599
599
  }
@@ -611,7 +611,7 @@ let Runtime = (() => {
611
611
  // Only validate if the URI is a concrete string (not a token)
612
612
  const pattern = /^\d{12}\.dkr\.ecr\.([a-z0-9-]+)\.amazonaws\.com\/((?:[a-z0-9]+(?:[._-][a-z0-9]+)*\/)*[a-z0-9]+(?:[._-][a-z0-9]+)*)([:@]\S+)$/;
613
613
  if (!pattern.test(uri)) {
614
- throw new errors_1.ValidationError(`Invalid container URI format: ${uri}. Must be a valid ECR URI (e.g., 123456789012.dkr.ecr.us-west-2.amazonaws.com/my-agent:latest)`, this);
614
+ throw new errors_1.ValidationError('InvalidContainerUri', `Invalid container URI format: ${uri}. Must be a valid ECR URI (e.g., 123456789012.dkr.ecr.us-west-2.amazonaws.com/my-agent:latest)`, this);
615
615
  }
616
616
  }
617
617
  /**
@@ -622,34 +622,34 @@ let Runtime = (() => {
622
622
  // Validate basic ARN format for IAM roles
623
623
  const arnPattern = /^arn:[a-z\-]+:iam::\d{12}:role\/[a-zA-Z0-9+=,.@\-_\/]+$/;
624
624
  if (!arnPattern.test(roleArn)) {
625
- throw new errors_1.ValidationError(`Invalid IAM role ARN format: ${roleArn}. ` +
625
+ throw new errors_1.ValidationError('InvalidRoleArnFormat', `Invalid IAM role ARN format: ${roleArn}. ` +
626
626
  'Expected format: arn:<partition>:iam::<account-id>:role/<role-name> or arn:<partition>:iam::<account-id>:role/<path>/<role-name>', this);
627
627
  }
628
628
  // Parse the ARN components using CDK's Arn.split()
629
629
  // Use SLASH_RESOURCE_NAME format for IAM roles (which use format: role/role-name or role/path/to/role-name)
630
630
  const arnComponents = aws_cdk_lib_1.Arn.split(roleArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME);
631
631
  if (arnComponents.service !== 'iam') {
632
- throw new errors_1.ValidationError(`Invalid service in ARN: ${arnComponents.service}. Expected 'iam' for IAM role ARN.`, this);
632
+ throw new errors_1.ValidationError('InvalidRoleArnService', `Invalid service in ARN: ${arnComponents.service}. Expected 'iam' for IAM role ARN.`, this);
633
633
  }
634
634
  const accountId = arnComponents.account;
635
635
  if (!accountId || !/^\d{12}$/.test(accountId)) {
636
- throw new errors_1.ValidationError(`Invalid AWS account ID in role ARN: ${accountId}. Must be a 12-digit number.`, this);
636
+ throw new errors_1.ValidationError('InvalidRoleArnAccountId', `Invalid AWS account ID in role ARN: ${accountId}. Must be a 12-digit number.`, this);
637
637
  }
638
638
  // Extract role name from resource
639
639
  // For IAM roles, resource will be "role" and resourceName will be the role name (with optional path)
640
640
  const resource = arnComponents.resource;
641
641
  const resourceName = arnComponents.resourceName;
642
642
  if (resource !== 'role') {
643
- throw new errors_1.ValidationError(`Invalid resource type in ARN: ${resource}. Expected 'role' for IAM role ARN.`, this);
643
+ throw new errors_1.ValidationError('InvalidRoleArnResourceType', `Invalid resource type in ARN: ${resource}. Expected 'role' for IAM role ARN.`, this);
644
644
  }
645
645
  if (!resourceName) {
646
- throw new errors_1.ValidationError('Role name is missing in the ARN', this);
646
+ throw new errors_1.ValidationError('MissingRoleName', 'Role name is missing in the ARN', this);
647
647
  }
648
648
  else {
649
649
  const rolePathParts = resourceName.split('/');
650
650
  const roleName = rolePathParts[rolePathParts.length - 1];
651
651
  if (roleName.length > 64) {
652
- throw new errors_1.ValidationError(`Role name exceeds maximum length of 64 characters: ${roleName}`, this);
652
+ throw new errors_1.ValidationError('RoleNameTooLong', `Role name exceeds maximum length of 64 characters: ${roleName}`, this);
653
653
  }
654
654
  }
655
655
  const stackAccount = aws_cdk_lib_1.Stack.of(this).account;
@@ -701,4 +701,4 @@ let Runtime = (() => {
701
701
  return Runtime = _classThis;
702
702
  })();
703
703
  exports.Runtime = Runtime;
704
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQStGO0FBQy9GLHFFQUFxRTtBQUNyRSwyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLHdEQUE4RDtBQUM5RCw4RUFBOEY7QUFDOUYsMEVBQTBFO0FBRzFFLG1DQVFpQjtBQUlqQixpREFBNkM7QUFDN0MseURBQXFEO0FBRXJELG1DQUF1QztBQUN2Qyw2REFBaUY7QUFDakYsNEVBQStFO0FBRS9FOzsrRUFFK0U7QUFDL0U7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVuRDs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBdUd2RDs7K0VBRStFO0FBRS9FOzs7Ozs7O0dBT0c7SUFFVSxPQUFPOzRCQURuQixvQ0FBa0I7Ozs7c0JBQ1UsMEJBQVc7Ozt1QkFBbkIsU0FBUSxXQUFXOzs7O3VDQXFxQnJDLElBQUEsa0NBQWMsR0FBRTtZQUNqQixvTEFBTyxXQUFXLDZEQWdCakI7WUF0ckJILDZLQXVyQkM7Ozs7O1FBdHJCQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLDhDQUE4QyxDQUFDO1FBRXRHOzs7Ozs7OztXQVFHO1FBQ0ksTUFBTSxDQUFDLDBCQUEwQixDQUN0QyxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBNkI7Ozs7Ozs7Ozs7WUFFN0IsTUFBTSwyQkFBNEIsU0FBUSwwQkFBVztnQkFDbkMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7Z0JBQ3hDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO2dCQUN0QyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENB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RTVCLHNFQUFzRTtZQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsWUFBWSxFQUFFLEVBQUU7Z0JBQ3BFLFlBQVksRUFBRSxZQUFZO2dCQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUc7Z0JBQ3hFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVzthQUNsQyxDQUFDLENBQUM7WUFFSCwrREFBK0Q7WUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWxELE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQXRyQlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjaywgQW5ub3RhdGlvbnMsIFRva2VuLCBBcm4sIEFybkZvcm1hdCwgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBiZWRyb2NrYWdlbnRjb3JlIGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2Vycm9ycyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9pbmJvdW5kLWF1dGgvcnVudGltZS1hdXRob3JpemVyLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtcbiAgUlVOVElNRV9MT0dTX0dST1VQX0FDVElPTlMsXG4gIFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gIFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG59IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFJ1bnRpbWVBcnRpZmFjdCB9IGZyb20gJy4vcnVudGltZS1hcnRpZmFjdCc7XG5cbmltcG9ydCB0eXBlIHsgSUJlZHJvY2tBZ2VudFJ1bnRpbWUsIEFnZW50UnVudGltZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3J1bnRpbWUtYmFzZSc7XG5pbXBvcnQgeyBSdW50aW1lQmFzZSB9IGZyb20gJy4vcnVudGltZS1iYXNlJztcbmltcG9ydCB7IFJ1bnRpbWVFbmRwb2ludCB9IGZyb20gJy4vcnVudGltZS1lbmRwb2ludCc7XG5pbXBvcnQgdHlwZSB7IExpZmVjeWNsZUNvbmZpZ3VyYXRpb24sIFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBQcm90b2NvbFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nRmllbGQsIHZhbGlkYXRlRmllbGRQYXR0ZXJuIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuaW1wb3J0IHsgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbmV0d29yay9uZXR3b3JrLWNvbmZpZ3VyYXRpb24nO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIE1pbmltdW0gdGltZW91dCBmb3IgaWRsZSBydW50aW1lIHNlc3Npb25zXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTElGRUNZQ0xFX01JTl9USU1FT1VUID0gRHVyYXRpb24uc2Vjb25kcyg2MCk7XG5cbi8qKlxuICogTWF4aW11bSBsaWZldGltZSBmb3IgdGhlIGluc3RhbmNlXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTElGRUNZQ0xFX01BWF9MSUZFVElNRSA9IER1cmF0aW9uLnNlY29uZHMoMjg4MDApO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIEJlZHJvY2sgQWdlbnQgQ29yZSBSdW50aW1lIHJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBDb250YWlucyB0aGUgY29udGFpbmVyIGNvbmZpZ3VyYXRpb24gd2l0aCBFQ1IgVVJJXG4gICAqL1xuICByZWFkb25seSBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogQWdlbnRSdW50aW1lQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgcm9sZSB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseVxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBkZWZhdWx0IC0gUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uLnVzaW5nUHVibGljTmV0d29yaygpXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICogTGVuZ3RoIE1pbmltdW06IDEgLCBNYXhpbXVtOiAxMjAwXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUHJvdG9jb2wgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGRlZmF1bHQgLSBQcm90b2NvbFR5cGUuSFRUUFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uPzogUHJvdG9jb2xUeXBlO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIC0gTWF4aW11bSA1MCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogLSBLZXk6IE11c3QgYmUgMS0xMDAgY2hhcmFjdGVycywgc3RhcnQgd2l0aCBsZXR0ZXIgb3IgdW5kZXJzY29yZSwgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3Jlc1xuICAgKiAtIFZhbHVlOiBNdXN0IGJlIDAtMjA0OCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQGRlZmF1bHQgLSBObyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50VmFyaWFibGVzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQXV0aG9yaXplciBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBVc2UgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIHN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvblxuICAgKiBAZGVmYXVsdCAtIFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbi5pYW0oKSAoSUFNIGF1dGhlbnRpY2F0aW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb24/OiBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRhZ3MgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIFJ1bnRpbWUgcmVzb3VyY2VcbiAgICogQGRlZmF1bHQge30gLSBubyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgSFRUUCByZXF1ZXN0IGhlYWRlcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBydW50aW1lLlxuICAgKiBAZGVmYXVsdCAtIE5vIHJlcXVlc3QgaGVhZGVycyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbj86IFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZSBjeWNsZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gICAqIEBkZWZhdWx0IC0gTm8gbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/OiBMaWZlY3ljbGVDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGFkZGluZyBhbiBlbmRwb2ludCB0byB0aGUgcnVudGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZEVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBmb3IgdGhlIGVuZHBvaW50LCBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTIwMCBjaGFyYWN0ZXJzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGhpcyBlbmRwb2ludFxuICAgKiBAZGVmYXVsdCAgMVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQmVkcm9jayBBZ2VudCBDb3JlIFJ1bnRpbWVcbiAqIEVuYWJsZXMgcnVubmluZyBjb250YWluZXJpemVkIGFnZW50cyB3aXRoIHNwZWNpZmljIG5ldHdvcmsgY29uZmlndXJhdGlvbnMsXG4gKiBzZWN1cml0eSBzZXR0aW5ncywgYW5kIHJ1bnRpbWUgYXJ0aWZhY3RzLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OlJ1bnRpbWVcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9ydW50aW1lLmh0bWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWJlZHJvY2stYWdlbnRjb3JlLWFscGhhLlJ1bnRpbWUnO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgQWdlbnQgUnVudGltZSB1c2luZyBhdHRyaWJ1dGVzXG4gICAqIFRoaXMgYWxsb3dzIHlvdSB0byByZWZlcmVuY2UgYW4gQWdlbnQgUnVudGltZSB0aGF0IHdhcyBjcmVhdGVkIG91dHNpZGUgb2YgQ0RLXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZXhpc3RpbmcgQWdlbnQgUnVudGltZVxuICAgKiBAcmV0dXJucyBBbiBJQmVkcm9ja0FnZW50UnVudGltZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGVkIHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFnZW50UnVudGltZUF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBBZ2VudFJ1bnRpbWVBdHRyaWJ1dGVzLFxuICApOiBJQmVkcm9ja0FnZW50UnVudGltZSB7XG4gICAgY2xhc3MgSW1wb3J0ZWRCZWRyb2NrQWdlbnRSdW50aW1lIGV4dGVuZHMgUnVudGltZUJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUFybiA9IGF0dHJzLmFnZW50UnVudGltZUFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVJZCA9IGF0dHJzLmFnZW50UnVudGltZUlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZU5hbWUgPSBhdHRycy5hZ2VudFJ1bnRpbWVOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZVZlcnNpb24gPSBhdHRycy5hZ2VudFJ1bnRpbWVWZXJzaW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50U3RhdHVzID0gYXR0cnMuYWdlbnRTdGF0dXM7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSBhdHRycy5kZXNjcmlwdGlvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQgPSBhdHRycy5jcmVhdGVkQXQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdCA9IGF0dHJzLmxhc3RVcGRhdGVkQXQ7XG5cbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gICAgICBjb25zdHJ1Y3RvcihzOiBDb25zdHJ1Y3QsIGk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzLCBpKTtcbiAgICAgICAgdGhpcy5yb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgJ1JvbGUnLCBhdHRycy5yb2xlQXJuKTtcbiAgICAgICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcbiAgICAgICAgaWYgKGF0dHJzLnNlY3VyaXR5R3JvdXBzKSB7XG4gICAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgZWMyLkNvbm5lY3Rpb25zKHtcbiAgICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBhdHRycy5zZWN1cml0eUdyb3VwcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRCZWRyb2NrQWdlbnRSdW50aW1lKHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBBUk4gb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRTdGF0dXM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgYWdlbnQgcnVudGltZSB3YXMgY3JlYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBhZ2VudCBydW50aW1lIHdhcyBsYXN0IHVwZGF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbGFzdCB1cGRhdGUgdGltZXN0YW1wIG9mIHRoaXMgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZVJlc291cmNlOiBiZWRyb2NrYWdlbnRjb3JlLkNmblJ1bnRpbWU7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aWZhY3QgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogQWdlbnRSdW50aW1lQXJ0aWZhY3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya0NvbmZpZ3VyYXRpb246IFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbiA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBQcm90b2NvbFR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb24/OiBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbj86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bnRpbWVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLy8gTWF4aW11bSBuYW1lIGxlbmd0aCBvZiA0OCBjaGFyYWN0ZXJzXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLWJlZHJvY2thZ2VudGNvcmUtcnVudGltZS5odG1sI2Nmbi1iZWRyb2NrYWdlbnRjb3JlLXJ1bnRpbWUtYWdlbnRydW50aW1lbmFtZVxuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5ydW50aW1lTmFtZSA/P1xuICAgICAgICBMYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiA0OCB9KSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMuYWdlbnRSdW50aW1lTmFtZSA9IHRoaXMucGh5c2ljYWxOYW1lO1xuICAgIHRoaXMudmFsaWRhdGVSdW50aW1lTmFtZSgpO1xuXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRGVzY3JpcHRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRhZ3MpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVUYWdzKHByb3BzLnRhZ3MpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5yZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZVJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24gPSBwcm9wcy5saWZlY3ljbGVDb25maWd1cmF0aW9uID8ge1xuICAgICAgaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dDogcHJvcHMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbj8uaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dCxcbiAgICAgIG1heExpZmV0aW1lOiBwcm9wcy5saWZlY3ljbGVDb25maWd1cmF0aW9uPy5tYXhMaWZldGltZSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZUxpZmVjeWNsZUNvbmZpZ3VyYXRpb24odGhpcy5saWZlY3ljbGVDb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZXhlY3V0aW9uUm9sZSkge1xuICAgICAgdGhpcy5yb2xlID0gcHJvcHMuZXhlY3V0aW9uUm9sZTtcbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmV4ZWN1dGlvblJvbGUucm9sZUFybikpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVJvbGVBcm4ocHJvcHMuZXhlY3V0aW9uUm9sZS5yb2xlQXJuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdFeGVjdXRpb25Sb2xlJywge1xuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0V4ZWN1dGlvbiByb2xlIGZvciBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZScsXG4gICAgICAgIG1heFNlc3Npb25EdXJhdGlvbjogRHVyYXRpb24uaG91cnMoOCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5hZGRFeGVjdXRpb25Sb2xlUGVybWlzc2lvbnMoKTtcblxuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdCA9IHByb3BzLmFnZW50UnVudGltZUFydGlmYWN0O1xuICAgIC8vIFNldCB1cCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gd2l0aCBWUEMgc3VwcG9ydFxuICAgIHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24gPSBwcm9wcy5uZXR3b3JrQ29uZmlndXJhdGlvbiA/PyBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb24udXNpbmdQdWJsaWNOZXR3b3JrKCk7XG4gICAgLy8gU2V0IGNvbm5lY3Rpb25zIC0gY3JlYXRlIGEgc2hhcmVkIGNvbm5lY3Rpb25zIG9iamVjdFxuICAgIGlmICh0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLmNvbm5lY3Rpb25zKSB7XG4gICAgICAvLyBVc2UgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbidzIGNvbm5lY3Rpb25zIGFzIHRoZSBzaGFyZWQgb2JqZWN0XG4gICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uY29ubmVjdGlvbnM7XG4gICAgfVxuICAgIHRoaXMucHJvdG9jb2xDb25maWd1cmF0aW9uID0gcHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uID8/IFByb3RvY29sVHlwZS5IVFRQO1xuICAgIHRoaXMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb24gPSBwcm9wcy5hdXRob3JpemVyQ29uZmlndXJhdGlvbjtcblxuICAgIGNvbnN0IGNmblByb3BzOiBhbnkgPSB7XG4gICAgICBhZ2VudFJ1bnRpbWVOYW1lOiB0aGlzLmFnZW50UnVudGltZU5hbWUsXG4gICAgICByb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIGFnZW50UnVudGltZUFydGlmYWN0OiBMYXp5LmFueSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMucmVuZGVyQWdlbnRSdW50aW1lQXJ0aWZhY3QoKSxcbiAgICAgIH0pLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb246IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5fcmVuZGVyKHRoaXMuX2Nvbm5lY3Rpb25zKSxcbiAgICAgIH0pLFxuICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMucHJvdG9jb2xDb25maWd1cmF0aW9uLFxuICAgICAgfSksXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbmRlckVudmlyb25tZW50VmFyaWFibGVzKHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKSxcbiAgICAgIH0pLFxuICAgICAgdGFnczogcHJvcHMudGFncyA/PyB7fSxcbiAgICAgIGxpZmVjeWNsZUNvbmZpZ3VyYXRpb246IHRoaXMucmVuZGVyTGlmZWN5Y2xlQ29uZmlndXJhdGlvbigpLFxuICAgIH07XG4gICAgaWYgKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKSB7XG4gICAgICBjZm5Qcm9wcy5yZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbiA9IHRoaXMucmVuZGVyUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24ocHJvcHMucmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNmblByb3BzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uIS5fcmVuZGVyKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bnRpbWVSZXNvdXJjZSA9IG5ldyBiZWRyb2NrYWdlbnRjb3JlLkNmblJ1bnRpbWUodGhpcywgJ1Jlc291cmNlJywgY2ZuUHJvcHMgYXMgYmVkcm9ja2FnZW50Y29yZS5DZm5SdW50aW1lUHJvcHMpO1xuXG4gICAgLy8gQWRkIGRlcGVuZGVuY3kgb24gdGhlIHJvbGUgKGZvciBib3RoIGN1c3RvbSBhbmQgYXV0by1jcmVhdGVkIHJvbGVzKVxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgUnVudGltZSB3YWl0cyBmb3IgdGhlIHJvbGUgYW5kIGFsbCBpdHMgcG9saWNpZXMgKGluY2x1ZGluZyBFQ1IgcGVybWlzc2lvbnMpIHRvIGJlIGNyZWF0ZWRcbiAgICB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcblxuICAgIHRoaXMuYWdlbnRSdW50aW1lSWQgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lSWQ7XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcm4gPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lQXJuO1xuICAgIHRoaXMuYWdlbnRTdGF0dXMgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyU3RhdHVzO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lVmVyc2lvbiA9IHRoaXMucnVudGltZVJlc291cmNlLmF0dHJBZ2VudFJ1bnRpbWVWZXJzaW9uO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLmxhc3RVcGRhdGVkQXQgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyTGFzdFVwZGF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IGFueSB7XG4gICAgaWYgKCFlbnZWYXJzIHx8IE9iamVjdC5rZXlzKGVudlZhcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBwcm9wZXIgcGVybWlzc2lvbnMgdG8gdGhlIGV4ZWN1dGlvbiByb2xlIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBCYXNlZCBvbjogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9ydW50aW1lLXBlcm1pc3Npb25zLmh0bWxcbiAgICovXG4gIHByaXZhdGUgYWRkRXhlY3V0aW9uUm9sZVBlcm1pc3Npb25zKCkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBhY2NvdW50ID0gU3RhY2sub2YodGhpcykuYWNjb3VudDtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIExvZyBHcm91cCBvcGVyYXRpb25zXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0xvZ0dyb3VwQWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfTE9HU19HUk9VUF9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6L2F3cy9iZWRyb2NrLWFnZW50Y29yZS9ydW50aW1lcy8qYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gRGVzY3JpYmUgYWxsIGxvZyBncm91cHNcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnRGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogUlVOVElNRV9MT0dTX0RFU0NSSUJFX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmxvZy1ncm91cDoqYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gTG9nIFN0cmVhbSBvcGVyYXRpb25zXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0xvZ1N0cmVhbUFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmxvZy1ncm91cDovYXdzL2JlZHJvY2stYWdlbnRjb3JlL3J1bnRpbWVzLyo6bG9nLXN0cmVhbToqYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gWC1SYXkgVHJhY2luZyAtIG11c3QgYmUgKiBmb3IgdHJhY2luZ1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdYUmF5QWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBDbG91ZFdhdGNoIE1ldHJpY3MgLSBzY29wZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUgbmFtZXNwYWNlXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0Nsb3VkV2F0Y2hNZXRyaWNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfQ0xPVURXQVRDSF9NRVRSSUNTX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnY2xvdWR3YXRjaDpuYW1lc3BhY2UnOiBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG5cbiAgICAvLyBCZWRyb2NrIEFnZW50Q29yZSBXb3JrbG9hZCBJZGVudGl0eSBBY2Nlc3NcbiAgICAvLyBOb3RlOiBUaGUgYWdlbnQgbmFtZSB3aWxsIGJlIGRldGVybWluZWQgYXQgcnVudGltZSwgc28gd2UgdXNlIGEgd2lsZGNhcmQgcGF0dGVyblxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdHZXRBZ2VudEFjY2Vzc1Rva2VuJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfV09SS0xPQURfSURFTlRJVFlfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpiZWRyb2NrLWFnZW50Y29yZToke3JlZ2lvbn06JHthY2NvdW50fTp3b3JrbG9hZC1pZGVudGl0eS1kaXJlY3RvcnkvZGVmYXVsdGAsXG4gICAgICAgIGBhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OmJlZHJvY2stYWdlbnRjb3JlOiR7cmVnaW9ufToke2FjY291bnR9Ondvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0L3dvcmtsb2FkLWlkZW50aXR5LypgLFxuICAgICAgXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYXJ0aWZhY3QgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckFnZW50UnVudGltZUFydGlmYWN0KCk6IGFueSB7XG4gICAgLy8gc2V0IHBlcm1pc3Npb24gd2l0aCBiaW5kXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdC5iaW5kKHRoaXMsIHRoaXMpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QuX3JlbmRlcigpO1xuICAgIGlmICgoY29uZmlnIGFzIGFueSkuY29kZSkgeyAvLyBTM0ltYWdlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvZGU6IChjb25maWcgYXMgYW55KS5jb2RlLFxuICAgICAgICAgIHJ1bnRpbWU6IChjb25maWcgYXMgYW55KS5ydW50aW1lLFxuICAgICAgICAgIGVudHJ5UG9pbnQ6IChjb25maWcgYXMgYW55KS5lbnRyeVBvaW50LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRWNySW1hZ2Ugb3IgQXNzZXRJbWFnZVxuICAgICAgY29uc3QgY29udGFpbmVyVXJpID0gKGNvbmZpZyBhcyBhbnkpLmNvbnRhaW5lclVyaTtcbiAgICAgIGlmIChjb250YWluZXJVcmkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhaW5lclVyaShjb250YWluZXJVcmkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGFpbmVyQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvbnRhaW5lclVyaTogY29udGFpbmVyVXJpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcmVxdWVzdCBoZWFkZXIgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uPzogUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pOiBhbnkge1xuICAgIGlmICghcmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24/LmFsbG93bGlzdGVkSGVhZGVycykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJBbGxvd2xpc3Q6IHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyTGlmZWN5Y2xlQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBpZGxlUnVudGltZVNlc3Npb25UaW1lb3V0OiB0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/LmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQ/LnRvU2Vjb25kcygpLFxuICAgICAgbWF4TGlmZXRpbWU6IHRoaXMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbj8ubWF4TGlmZXRpbWU/LnRvU2Vjb25kcygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSByZXF1ZXN0IGhlYWRlciBjb25maWd1cmF0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uOiBSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGFsbEVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAocmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24uYWxsb3dsaXN0ZWRIZWFkZXJzKSB7XG4gICAgICBpZiAocmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24uYWxsb3dsaXN0ZWRIZWFkZXJzLmxlbmd0aCA8IDEgfHwgcmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24uYWxsb3dsaXN0ZWRIZWFkZXJzLmxlbmd0aCA+IDIwKSB7XG4gICAgICAgIGFsbEVycm9ycy5wdXNoKCdSZXF1ZXN0IGhlYWRlciBhbGxvdyBsaXN0IGNvbnRhaW4gYmV0d2VlbiAxIGFuZCAyMCBoZWFkZXJzJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycykge1xuICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICAgICAgY29uc3QgbGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgICAgdmFsdWU6IGhlYWRlcixcbiAgICAgICAgICBmaWVsZE5hbWU6ICdSZXF1ZXN0IGhlYWRlcicsXG4gICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIG1heExlbmd0aDogMjU2LFxuICAgICAgICB9KTtcbiAgICAgICAgYWxsRXJyb3JzLnB1c2goLi4ubGVuZ3RoRXJyb3JzKTtcblxuICAgICAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICdSZXF1ZXN0IGhlYWRlcicsXG4gICAgICAgICAgLyhBdXRob3JpemF0aW9ufFgtQW16bi1CZWRyb2NrLUFnZW50Q29yZS1SdW50aW1lLUN1c3RvbS1bYS16QS1aMC05LV0rKS8sXG4gICAgICAgICAgJ1JlcXVlc3QgaGVhZGVyIG11c3QgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zJyxcbiAgICAgICAgKTtcbiAgICAgICAgYWxsRXJyb3JzLnB1c2goLi4ucGF0dGVybkVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihhbGxFcnJvcnMuam9pbignXFxuJyksIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUxpZmVjeWNsZUNvbmZpZ3VyYXRpb24obGlmZWN5Y2xlQ29uZmlndXJhdGlvbjogTGlmZWN5Y2xlQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQgJiYgIWxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dC5pc1VucmVzb2x2ZWQoKSkge1xuICAgICAgaWYgKGxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dC50b1NlY29uZHMoKSA8IExJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKVxuICAgICAgICB8fCBsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQudG9TZWNvbmRzKCkgPiBMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYElkbGUgcnVudGltZSBzZXNzaW9uIHRpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuICR7TElGRUNZQ0xFX01JTl9USU1FT1VULnRvU2Vjb25kcygpfSBzZWNvbmRzIGFuZCAke0xJRkVDWUNMRV9NQVhfTElGRVRJTUUudG9TZWNvbmRzKCl9IHNlY29uZHNgLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxpZmVjeWNsZUNvbmZpZ3VyYXRpb24ubWF4TGlmZXRpbWUgJiYgIWxpZmVjeWNsZUNvbmZpZ3VyYXRpb24ubWF4TGlmZXRpbWUuaXNVbnJlc29sdmVkKCkpIHtcbiAgICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLnRvU2Vjb25kcygpIDwgTElGRUNZQ0xFX01JTl9USU1FT1VULnRvU2Vjb25kcygpXG4gICAgICAgIHx8IGxpZmVjeWNsZUNvbmZpZ3VyYXRpb24ubWF4TGlmZXRpbWUudG9TZWNvbmRzKCkgPiBMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE1heGltdW0gbGlmZXRpbWUgbXVzdCBiZSBiZXR3ZWVuICR7TElGRUNZQ0xFX01JTl9USU1FT1VULnRvU2Vjb25kcygpfSBzZWNvbmRzIGFuZCAke0xJRkVDWUNMRV9NQVhfTElGRVRJTUUudG9TZWNvbmRzKCl9IHNlY29uZHNgLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBydW50aW1lIG5hbWUgZm9ybWF0XG4gICAqIFBhdHRlcm46IF5bYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSRcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUnVudGltZU5hbWUoKTogdm9pZCB7XG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIHRoZSBuYW1lIGNvbnRhaW5zIENESyB0b2tlbnMgKHVucmVzb2x2ZWQgdmFsdWVzKVxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5hZ2VudFJ1bnRpbWVOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxlbmd0aFxuICAgIGNvbnN0IGxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgdmFsdWU6IHRoaXMuYWdlbnRSdW50aW1lTmFtZSxcbiAgICAgIGZpZWxkTmFtZTogJ1J1bnRpbWUgbmFtZScsXG4gICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICBtYXhMZW5ndGg6IDQ4LFxuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgcGF0dGVyblxuICAgIGNvbnN0IHBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgIHRoaXMuYWdlbnRSdW50aW1lTmFtZSxcbiAgICAgICdSdW50aW1lIG5hbWUnLFxuICAgICAgL15bYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSQvLFxuICAgICAgJ1J1bnRpbWUgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdW5kZXJzY29yZXMnLFxuICAgICk7XG5cbiAgICAvLyBDb21iaW5lIGFuZCB0aHJvdyBpZiBhbnkgZXJyb3JzXG4gICAgY29uc3QgYWxsRXJyb3JzID0gWy4uLmxlbmd0aEVycm9ycywgLi4ucGF0dGVybkVycm9yc107XG4gICAgaWYgKGFsbEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGFsbEVycm9ycy5qb2luKCdcXG4nKSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgZGVzY3JpcHRpb24gZm9ybWF0XG4gICAqIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjAwIGNoYXJhY3RlcnMgKHBlciBDbG91ZEZvcm1hdGlvbiBzcGVjaWZpY2F0aW9uKVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVEZXNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIGRlc2NyaXB0aW9uIGNvbnRhaW5zIENESyB0b2tlbnMgKHVucmVzb2x2ZWQgdmFsdWVzKVxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5kZXNjcmlwdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICBmaWVsZE5hbWU6ICdEZXNjcmlwdGlvbicsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMjAwLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy5qb2luKCdcXG4nKSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogLSBNYXhpbXVtIDUwIGVudHJpZXNcbiAgICogLSBLZXk6IDEtMTAwIGNoYXJhY3RlcnNcbiAgICogLSBWYWx1ZTogMC0yMDQ4IGNoYXJhY3RlcnMgKHBlciBDbG91ZEZvcm1hdGlvbiBzcGVjaWZpY2F0aW9uKVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVFbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGVudlZhcnMpO1xuXG4gICAgLy8gVmFsaWRhdGUgbnVtYmVyIG9mIGVudHJpZXMgKDAtNTApXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID4gNTApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBUb28gbWFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7ZW50cmllcy5sZW5ndGh9LiBNYXhpbXVtIGFsbG93ZWQgaXMgNTBgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYga2V5IG9yIHZhbHVlIGNvbnRhaW5zIENESyB0b2tlbnNcbiAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoa2V5KSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBrZXkgbGVuZ3RoXG4gICAgICBjb25zdCBsZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgZmllbGROYW1lOiBgRW52aXJvbm1lbnQgdmFyaWFibGUga2V5ICcke2tleX0nYCxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDEwMCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBrZXkgcGF0dGVyblxuICAgICAgY29uc3QgcGF0dGVybkVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgICBrZXksXG4gICAgICAgIGBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgJyR7a2V5fSdgLFxuICAgICAgICAvXlthLXpBLVpfXVthLXpBLVowLTlfXSokLyxcbiAgICAgICAgYEVudmlyb25tZW50IHZhcmlhYmxlIGtleSAnJHtrZXl9JyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgb3IgdW5kZXJzY29yZSBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3Jlc2AsXG4gICAgICApO1xuXG4gICAgICAvLyBDb21iaW5lIGFuZCB0aHJvdyBpZiBhbnkgZXJyb3JzXG4gICAgICBjb25zdCBhbGxFcnJvcnMgPSBbLi4ubGVuZ3RoRXJyb3JzLCAuLi5wYXR0ZXJuRXJyb3JzXTtcbiAgICAgIGlmIChhbGxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGFsbEVycm9ycy5qb2luKCdcXG4nKSwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHZhbHVlIGxlbmd0aCAoMC0yMDQ4IGNoYXJhY3RlcnMgcGVyIENsb3VkRm9ybWF0aW9uKVxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDIwNDgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBsZW5ndGggZm9yIGtleSAnJHtrZXl9JzogJHt2YWx1ZS5sZW5ndGh9IGNoYXJhY3RlcnMuIGAgK1xuICAgICAgICAgICdWYWx1ZXMgbXVzdCBub3QgZXhjZWVkIDIwNDggY2hhcmFjdGVycycsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB0YWdzIGZvcm1hdFxuICAgKiBAcGFyYW0gdGFncyBUaGUgdGFncyBvYmplY3QgdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgZWFjaCB0YWcga2V5IGFuZCB2YWx1ZVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYga2V5IG9yIHZhbHVlIGNvbnRhaW5zIENESyB0b2tlbnNcbiAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoa2V5KSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IGxlbmd0aFxuICAgICAgY29uc3Qga2V5TGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogYFRhZyBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIGtleSBwYXR0ZXJuXG4gICAgICBjb25zdCBrZXlQYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIGtleSxcbiAgICAgICAgYFRhZyBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLyxcbiAgICAgICAgYFRhZyBrZXkgXCIke2tleX1cIiBjYW4gb25seSBjb250YWluIGxldHRlcnMgKGEteiwgQS1aKSwgbnVtYmVycyAoMC05KSwgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzICguXzovPStALSlgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSBrZXkgZXJyb3JzIGFuZCB0aHJvdyBpZiBhbnlcbiAgICAgIGNvbnN0IGtleUVycm9ycyA9IFsuLi5rZXlMZW5ndGhFcnJvcnMsIC4uLmtleVBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKGtleUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5RXJyb3JzLmpvaW4oJ1xcbicpLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWRgLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIHZhbHVlIGxlbmd0aFxuICAgICAgY29uc3QgdmFsdWVMZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBmaWVsZE5hbWU6IGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgbWluTGVuZ3RoOiAwLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWUgcGF0dGVyblxuICAgICAgY29uc3QgdmFsdWVQYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLyxcbiAgICAgICAgYFRhZyB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCIgY2FuIG9ubHkgY29udGFpbiBsZXR0ZXJzIChhLXosIEEtWiksIG51bWJlcnMgKDAtOSksIHNwYWNlcywgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyAoLl86Lz0rQC0pYCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbWJpbmUgdmFsdWUgZXJyb3JzIGFuZCB0aHJvdyBpZiBhbnlcbiAgICAgIGNvbnN0IHZhbHVlRXJyb3JzID0gWy4uLnZhbHVlTGVuZ3RoRXJyb3JzLCAuLi52YWx1ZVBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKHZhbHVlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2YWx1ZUVycm9ycy5qb2luKCdcXG4nKSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgY29udGFpbmVyIFVSSSBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDb250YWluZXJVcmkodXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIFVSSSBjb250YWlucyBDREsgdG9rZW5zICh1bnJlc29sdmVkIHZhbHVlcylcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHVyaSkpIHtcbiAgICAgIC8vIEFkZCBhIHdhcm5pbmcgdGhhdCB2YWxpZGF0aW9uIHdpbGwgYmUgc2tpcHBlZCBmb3IgdG9rZW4tYmFzZWQgVVJJc1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkSW5mbyhcbiAgICAgICAgJ0NvbnRhaW5lciBVUkkgdmFsaWRhdGlvbiBza2lwcGVkIGFzIGl0IGNvbnRhaW5zIHVucmVzb2x2ZWQgQ0RLIHRva2Vucy4gJyArXG4gICAgICAgICdUaGUgVVJJIHdpbGwgYmUgdmFsaWRhdGVkIGF0IGRlcGxveW1lbnQgdGltZS4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIHRoZSBVUkkgaXMgYSBjb25jcmV0ZSBzdHJpbmcgKG5vdCBhIHRva2VuKVxuICAgIGNvbnN0IHBhdHRlcm4gPSAvXlxcZHsxMn1cXC5ka3JcXC5lY3JcXC4oW2EtejAtOS1dKylcXC5hbWF6b25hd3NcXC5jb21cXC8oKD86W2EtejAtOV0rKD86Wy5fLV1bYS16MC05XSspKlxcLykqW2EtejAtOV0rKD86Wy5fLV1bYS16MC05XSspKikoWzpAXVxcUyspJC87XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QodXJpKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgY29udGFpbmVyIFVSSSBmb3JtYXQ6ICR7dXJpfS4gTXVzdCBiZSBhIHZhbGlkIEVDUiBVUkkgKGUuZy4sIDEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdClgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBJQU0gcm9sZSBBUk4gZm9ybWF0IGFuZCBzdHJ1Y3R1cmVcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUm9sZUFybihyb2xlQXJuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBiYXNpYyBBUk4gZm9ybWF0IGZvciBJQU0gcm9sZXNcbiAgICBjb25zdCBhcm5QYXR0ZXJuID0gL15hcm46W2EtelxcLV0rOmlhbTo6XFxkezEyfTpyb2xlXFwvW2EtekEtWjAtOSs9LC5AXFwtX1xcL10rJC87XG4gICAgaWYgKCFhcm5QYXR0ZXJuLnRlc3Qocm9sZUFybikpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIElBTSByb2xlIEFSTiBmb3JtYXQ6ICR7cm9sZUFybn0uIGAgK1xuICAgICAgICAnRXhwZWN0ZWQgZm9ybWF0OiBhcm46PHBhcnRpdGlvbj46aWFtOjo8YWNjb3VudC1pZD46cm9sZS88cm9sZS1uYW1lPiBvciBhcm46PHBhcnRpdGlvbj46aWFtOjo8YWNjb3VudC1pZD46cm9sZS88cGF0aD4vPHJvbGUtbmFtZT4nLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgQVJOIGNvbXBvbmVudHMgdXNpbmcgQ0RLJ3MgQXJuLnNwbGl0KClcbiAgICAvLyBVc2UgU0xBU0hfUkVTT1VSQ0VfTkFNRSBmb3JtYXQgZm9yIElBTSByb2xlcyAod2hpY2ggdXNlIGZvcm1hdDogcm9sZS9yb2xlLW5hbWUgb3Igcm9sZS9wYXRoL3RvL3JvbGUtbmFtZSlcbiAgICBjb25zdCBhcm5Db21wb25lbnRzID0gQXJuLnNwbGl0KHJvbGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcblxuICAgIGlmIChhcm5Db21wb25lbnRzLnNlcnZpY2UgIT09ICdpYW0nKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlcnZpY2UgaW4gQVJOOiAke2FybkNvbXBvbmVudHMuc2VydmljZX0uIEV4cGVjdGVkICdpYW0nIGZvciBJQU0gcm9sZSBBUk4uYCwgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudElkID0gYXJuQ29tcG9uZW50cy5hY2NvdW50O1xuICAgIGlmICghYWNjb3VudElkIHx8ICEvXlxcZHsxMn0kLy50ZXN0KGFjY291bnRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgQVdTIGFjY291bnQgSUQgaW4gcm9sZSBBUk46ICR7YWNjb3VudElkfS4gTXVzdCBiZSBhIDEyLWRpZ2l0IG51bWJlci5gLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHJvbGUgbmFtZSBmcm9tIHJlc291cmNlXG4gICAgLy8gRm9yIElBTSByb2xlcywgcmVzb3VyY2Ugd2lsbCBiZSBcInJvbGVcIiBhbmQgcmVzb3VyY2VOYW1lIHdpbGwgYmUgdGhlIHJvbGUgbmFtZSAod2l0aCBvcHRpb25hbCBwYXRoKVxuICAgIGNvbnN0IHJlc291cmNlID0gYXJuQ29tcG9uZW50cy5yZXNvdXJjZTtcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcm5Db21wb25lbnRzLnJlc291cmNlTmFtZTtcblxuICAgIGlmIChyZXNvdXJjZSAhPT0gJ3JvbGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHJlc291cmNlIHR5cGUgaW4gQVJOOiAke3Jlc291cmNlfS4gRXhwZWN0ZWQgJ3JvbGUnIGZvciBJQU0gcm9sZSBBUk4uYCwgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ1JvbGUgbmFtZSBpcyBtaXNzaW5nIGluIHRoZSBBUk4nLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgcm9sZVBhdGhQYXJ0cyA9IHJlc291cmNlTmFtZS5zcGxpdCgnLycpO1xuICAgICAgY29uc3Qgcm9sZU5hbWUgPSByb2xlUGF0aFBhcnRzW3JvbGVQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChyb2xlTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBSb2xlIG5hbWUgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiA2NCBjaGFyYWN0ZXJzOiAke3JvbGVOYW1lfWAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrQWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2tBY2NvdW50KSAmJiBhY2NvdW50SWQgIT09IHN0YWNrQWNjb3VudCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYElBTSByb2xlIGlzIGZyb20gYSBkaWZmZXJlbnQgYWNjb3VudCAoJHthY2NvdW50SWR9KSB0aGFuIHRoZSBzdGFjayBhY2NvdW50ICgke3N0YWNrQWNjb3VudH0pLiBgICtcbiAgICAgICAgJ0Vuc3VyZSBjcm9zcy1hY2NvdW50IHBlcm1pc3Npb25zIGFyZSBwcm9wZXJseSBjb25maWd1cmVkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZWdpb24gKElBTSBpcyBnbG9iYWwsIHNvIHJlZ2lvbiBzaG91bGQgYmUgZW1wdHkpXG4gICAgY29uc3QgcmVnaW9uID0gYXJuQ29tcG9uZW50cy5yZWdpb247XG4gICAgY29uc3Qgc3RhY2tSZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgaWYgKHJlZ2lvbiAmJiByZWdpb24gIT09ICcnICYmIHJlZ2lvbiAhPT0gc3RhY2tSZWdpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChzdGFja1JlZ2lvbikpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGBJQU0gcm9sZSBBUk4gY29udGFpbnMgYSByZWdpb24gKCR7cmVnaW9ufSkgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBzdGFjayByZWdpb24gKCR7c3RhY2tSZWdpb259KS4gYCArXG4gICAgICAgICdJQU0gaXMgYSBnbG9iYWwgc2VydmljZSwgc28gdGhpcyBtaWdodCBiZSBpbnRlbnRpb25hbC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGVuZHBvaW50IHRvIHRoaXMgcnVudGltZVxuICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIFJ1bnRpbWVFbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludE5hbWUgVGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbmRwb2ludFxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBSdW50aW1lRW5kcG9pbnRcbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhZGRFbmRwb2ludChcbiAgICBlbmRwb2ludE5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQWRkRW5kcG9pbnRPcHRpb25zLFxuICApOiBSdW50aW1lRW5kcG9pbnQge1xuICAgIC8vIENyZWF0ZSB0aGUgZW5kcG9pbnQgKHNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZClcbiAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBSdW50aW1lRW5kcG9pbnQodGhpcywgYEVuZHBvaW50JHtlbmRwb2ludE5hbWV9YCwge1xuICAgICAgZW5kcG9pbnROYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICBhZ2VudFJ1bnRpbWVJZDogdGhpcy5hZ2VudFJ1bnRpbWVJZCxcbiAgICAgIGFnZW50UnVudGltZVZlcnNpb246IG9wdGlvbnM/LnZlcnNpb24gPz8gdGhpcy5hZ2VudFJ1bnRpbWVWZXJzaW9uID8/ICcxJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zPy5kZXNjcmlwdGlvbixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5OiBlbmRwb2ludCBtdXN0IHdhaXQgZm9yIHJ1bnRpbWUgdG8gYmUgY3JlYXRlZFxuICAgIGVuZHBvaW50Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnJ1bnRpbWVSZXNvdXJjZSk7XG5cbiAgICByZXR1cm4gZW5kcG9pbnQ7XG4gIH1cbn1cbiJdfQ==
704
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQStGO0FBQy9GLHFFQUFxRTtBQUNyRSwyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLHdEQUE4RDtBQUM5RCw4RUFBOEY7QUFDOUYsMEVBQTBFO0FBRzFFLG1DQVFpQjtBQUlqQixpREFBNkM7QUFDN0MseURBQXFEO0FBRXJELG1DQUF1QztBQUN2Qyw2REFBaUY7QUFDakYsNEVBQStFO0FBRS9FOzsrRUFFK0U7QUFDL0U7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVuRDs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBdUd2RDs7K0VBRStFO0FBRS9FOzs7Ozs7O0dBT0c7SUFFVSxPQUFPOzRCQURuQixvQ0FBa0I7Ozs7c0JBQ1UsMEJBQVc7Ozt1QkFBbkIsU0FBUSxXQUFXOzs7O3VDQXlxQnJDLElBQUEsa0NBQWMsR0FBRTtZQUNqQixvTEFBTyxXQUFXLDZEQWdCakI7WUExckJILDZLQTJyQkM7Ozs7O1FBMXJCQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLDhDQUE4QyxDQUFDO1FBRXRHOzs7Ozs7OztXQVFHO1FBQ0ksTUFBTSxDQUFDLDBCQUEwQixDQUN0QyxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBNkI7Ozs7Ozs7Ozs7WUFFN0IsTUFBTSwyQkFBNEIsU0FBUSwwQkFBVztnQkFDbkMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7Z0JBQ3hDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO2dCQUN0QyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENB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QyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUM3QixtQ0FBbUMsTUFBTSwwQ0FBMEMsV0FBVyxLQUFLO29CQUNuRyx3REFBd0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUVEOzs7Ozs7O1dBT0c7UUFFSSxXQUFXLENBQ2hCLFlBQW9CLEVBQ3BCLE9BQTRCOzs7Ozs7Ozs7O1lBRTVCLHNFQUFzRTtZQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsWUFBWSxFQUFFLEVBQUU7Z0JBQ3BFLFlBQVksRUFBRSxZQUFZO2dCQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUc7Z0JBQ3hFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVzthQUNsQyxDQUFDLENBQUM7WUFFSCwrREFBK0Q7WUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWxELE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQTFyQlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjaywgQW5ub3RhdGlvbnMsIFRva2VuLCBBcm4sIEFybkZvcm1hdCwgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBiZWRyb2NrYWdlbnRjb3JlIGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2Vycm9ycyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9pbmJvdW5kLWF1dGgvcnVudGltZS1hdXRob3JpemVyLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtcbiAgUlVOVElNRV9MT0dTX0dST1VQX0FDVElPTlMsXG4gIFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gIFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG59IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFJ1bnRpbWVBcnRpZmFjdCB9IGZyb20gJy4vcnVudGltZS1hcnRpZmFjdCc7XG5cbmltcG9ydCB0eXBlIHsgSUJlZHJvY2tBZ2VudFJ1bnRpbWUsIEFnZW50UnVudGltZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3J1bnRpbWUtYmFzZSc7XG5pbXBvcnQgeyBSdW50aW1lQmFzZSB9IGZyb20gJy4vcnVudGltZS1iYXNlJztcbmltcG9ydCB7IFJ1bnRpbWVFbmRwb2ludCB9IGZyb20gJy4vcnVudGltZS1lbmRwb2ludCc7XG5pbXBvcnQgdHlwZSB7IExpZmVjeWNsZUNvbmZpZ3VyYXRpb24sIFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBQcm90b2NvbFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nRmllbGQsIHZhbGlkYXRlRmllbGRQYXR0ZXJuIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuaW1wb3J0IHsgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbmV0d29yay9uZXR3b3JrLWNvbmZpZ3VyYXRpb24nO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIE1pbmltdW0gdGltZW91dCBmb3IgaWRsZSBydW50aW1lIHNlc3Npb25zXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTElGRUNZQ0xFX01JTl9USU1FT1VUID0gRHVyYXRpb24uc2Vjb25kcyg2MCk7XG5cbi8qKlxuICogTWF4aW11bSBsaWZldGltZSBmb3IgdGhlIGluc3RhbmNlXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTElGRUNZQ0xFX01BWF9MSUZFVElNRSA9IER1cmF0aW9uLnNlY29uZHMoMjg4MDApO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIEJlZHJvY2sgQWdlbnQgQ29yZSBSdW50aW1lIHJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBDb250YWlucyB0aGUgY29udGFpbmVyIGNvbmZpZ3VyYXRpb24gd2l0aCBFQ1IgVVJJXG4gICAqL1xuICByZWFkb25seSBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogQWdlbnRSdW50aW1lQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0aGF0IHByb3ZpZGVzIHBlcm1pc3Npb25zIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgcm9sZSB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseVxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBkZWZhdWx0IC0gUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uLnVzaW5nUHVibGljTmV0d29yaygpXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICogTGVuZ3RoIE1pbmltdW06IDEgLCBNYXhpbXVtOiAxMjAwXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUHJvdG9jb2wgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGRlZmF1bHQgLSBQcm90b2NvbFR5cGUuSFRUUFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uPzogUHJvdG9jb2xUeXBlO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIC0gTWF4aW11bSA1MCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogLSBLZXk6IE11c3QgYmUgMS0xMDAgY2hhcmFjdGVycywgc3RhcnQgd2l0aCBsZXR0ZXIgb3IgdW5kZXJzY29yZSwgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3Jlc1xuICAgKiAtIFZhbHVlOiBNdXN0IGJlIDAtMjA0OCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQGRlZmF1bHQgLSBObyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50VmFyaWFibGVzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQXV0aG9yaXplciBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBVc2UgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIHN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvblxuICAgKiBAZGVmYXVsdCAtIFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbi5pYW0oKSAoSUFNIGF1dGhlbnRpY2F0aW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb24/OiBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRhZ3MgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIFJ1bnRpbWUgcmVzb3VyY2VcbiAgICogQGRlZmF1bHQge30gLSBubyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgSFRUUCByZXF1ZXN0IGhlYWRlcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBydW50aW1lLlxuICAgKiBAZGVmYXVsdCAtIE5vIHJlcXVlc3QgaGVhZGVycyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbj86IFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZSBjeWNsZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gICAqIEBkZWZhdWx0IC0gTm8gbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/OiBMaWZlY3ljbGVDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGFkZGluZyBhbiBlbmRwb2ludCB0byB0aGUgcnVudGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZEVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBmb3IgdGhlIGVuZHBvaW50LCBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTIwMCBjaGFyYWN0ZXJzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGhpcyBlbmRwb2ludFxuICAgKiBAZGVmYXVsdCAgMVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQmVkcm9jayBBZ2VudCBDb3JlIFJ1bnRpbWVcbiAqIEVuYWJsZXMgcnVubmluZyBjb250YWluZXJpemVkIGFnZW50cyB3aXRoIHNwZWNpZmljIG5ldHdvcmsgY29uZmlndXJhdGlvbnMsXG4gKiBzZWN1cml0eSBzZXR0aW5ncywgYW5kIHJ1bnRpbWUgYXJ0aWZhY3RzLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OlJ1bnRpbWVcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9ydW50aW1lLmh0bWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWJlZHJvY2stYWdlbnRjb3JlLWFscGhhLlJ1bnRpbWUnO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgQWdlbnQgUnVudGltZSB1c2luZyBhdHRyaWJ1dGVzXG4gICAqIFRoaXMgYWxsb3dzIHlvdSB0byByZWZlcmVuY2UgYW4gQWdlbnQgUnVudGltZSB0aGF0IHdhcyBjcmVhdGVkIG91dHNpZGUgb2YgQ0RLXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZXhpc3RpbmcgQWdlbnQgUnVudGltZVxuICAgKiBAcmV0dXJucyBBbiBJQmVkcm9ja0FnZW50UnVudGltZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGVkIHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFnZW50UnVudGltZUF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBBZ2VudFJ1bnRpbWVBdHRyaWJ1dGVzLFxuICApOiBJQmVkcm9ja0FnZW50UnVudGltZSB7XG4gICAgY2xhc3MgSW1wb3J0ZWRCZWRyb2NrQWdlbnRSdW50aW1lIGV4dGVuZHMgUnVudGltZUJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUFybiA9IGF0dHJzLmFnZW50UnVudGltZUFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVJZCA9IGF0dHJzLmFnZW50UnVudGltZUlkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZU5hbWUgPSBhdHRycy5hZ2VudFJ1bnRpbWVOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZVZlcnNpb24gPSBhdHRycy5hZ2VudFJ1bnRpbWVWZXJzaW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50U3RhdHVzID0gYXR0cnMuYWdlbnRTdGF0dXM7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSBhdHRycy5kZXNjcmlwdGlvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQgPSBhdHRycy5jcmVhdGVkQXQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdCA9IGF0dHJzLmxhc3RVcGRhdGVkQXQ7XG5cbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gICAgICBjb25zdHJ1Y3RvcihzOiBDb25zdHJ1Y3QsIGk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzLCBpKTtcbiAgICAgICAgdGhpcy5yb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgJ1JvbGUnLCBhdHRycy5yb2xlQXJuKTtcbiAgICAgICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcbiAgICAgICAgaWYgKGF0dHJzLnNlY3VyaXR5R3JvdXBzKSB7XG4gICAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgZWMyLkNvbm5lY3Rpb25zKHtcbiAgICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBhdHRycy5zZWN1cml0eUdyb3VwcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRCZWRyb2NrQWdlbnRSdW50aW1lKHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBBUk4gb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRTdGF0dXM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgYWdlbnQgcnVudGltZSB3YXMgY3JlYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBhZ2VudCBydW50aW1lIHdhcyBsYXN0IHVwZGF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbGFzdCB1cGRhdGUgdGltZXN0YW1wIG9mIHRoaXMgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZVJlc291cmNlOiBiZWRyb2NrYWdlbnRjb3JlLkNmblJ1bnRpbWU7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aWZhY3QgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogQWdlbnRSdW50aW1lQXJ0aWZhY3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya0NvbmZpZ3VyYXRpb246IFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbiA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBQcm90b2NvbFR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb24/OiBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbj86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bnRpbWVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLy8gTWF4aW11bSBuYW1lIGxlbmd0aCBvZiA0OCBjaGFyYWN0ZXJzXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLWJlZHJvY2thZ2VudGNvcmUtcnVudGltZS5odG1sI2Nmbi1iZWRyb2NrYWdlbnRjb3JlLXJ1bnRpbWUtYWdlbnRydW50aW1lbmFtZVxuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5ydW50aW1lTmFtZSA/P1xuICAgICAgICBMYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiA0OCB9KSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMuYWdlbnRSdW50aW1lTmFtZSA9IHRoaXMucGh5c2ljYWxOYW1lO1xuICAgIHRoaXMudmFsaWRhdGVSdW50aW1lTmFtZSgpO1xuXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRGVzY3JpcHRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRhZ3MpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVUYWdzKHByb3BzLnRhZ3MpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5yZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZVJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24gPSBwcm9wcy5saWZlY3ljbGVDb25maWd1cmF0aW9uID8ge1xuICAgICAgaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dDogcHJvcHMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbj8uaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dCxcbiAgICAgIG1heExpZmV0aW1lOiBwcm9wcy5saWZlY3ljbGVDb25maWd1cmF0aW9uPy5tYXhMaWZldGltZSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZUxpZmVjeWNsZUNvbmZpZ3VyYXRpb24odGhpcy5saWZlY3ljbGVDb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZXhlY3V0aW9uUm9sZSkge1xuICAgICAgdGhpcy5yb2xlID0gcHJvcHMuZXhlY3V0aW9uUm9sZTtcbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmV4ZWN1dGlvblJvbGUucm9sZUFybikpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVJvbGVBcm4ocHJvcHMuZXhlY3V0aW9uUm9sZS5yb2xlQXJuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdFeGVjdXRpb25Sb2xlJywge1xuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0V4ZWN1dGlvbiByb2xlIGZvciBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZScsXG4gICAgICAgIG1heFNlc3Npb25EdXJhdGlvbjogRHVyYXRpb24uaG91cnMoOCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5hZGRFeGVjdXRpb25Sb2xlUGVybWlzc2lvbnMoKTtcblxuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdCA9IHByb3BzLmFnZW50UnVudGltZUFydGlmYWN0O1xuICAgIC8vIFNldCB1cCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gd2l0aCBWUEMgc3VwcG9ydFxuICAgIHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24gPSBwcm9wcy5uZXR3b3JrQ29uZmlndXJhdGlvbiA/PyBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb24udXNpbmdQdWJsaWNOZXR3b3JrKCk7XG4gICAgLy8gU2V0IGNvbm5lY3Rpb25zIC0gY3JlYXRlIGEgc2hhcmVkIGNvbm5lY3Rpb25zIG9iamVjdFxuICAgIGlmICh0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLmNvbm5lY3Rpb25zKSB7XG4gICAgICAvLyBVc2UgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbidzIGNvbm5lY3Rpb25zIGFzIHRoZSBzaGFyZWQgb2JqZWN0XG4gICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uY29ubmVjdGlvbnM7XG4gICAgfVxuICAgIHRoaXMucHJvdG9jb2xDb25maWd1cmF0aW9uID0gcHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uID8/IFByb3RvY29sVHlwZS5IVFRQO1xuICAgIHRoaXMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb24gPSBwcm9wcy5hdXRob3JpemVyQ29uZmlndXJhdGlvbjtcblxuICAgIGNvbnN0IGNmblByb3BzOiBhbnkgPSB7XG4gICAgICBhZ2VudFJ1bnRpbWVOYW1lOiB0aGlzLmFnZW50UnVudGltZU5hbWUsXG4gICAgICByb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIGFnZW50UnVudGltZUFydGlmYWN0OiBMYXp5LmFueSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMucmVuZGVyQWdlbnRSdW50aW1lQXJ0aWZhY3QoKSxcbiAgICAgIH0pLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb246IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5fcmVuZGVyKHRoaXMuX2Nvbm5lY3Rpb25zKSxcbiAgICAgIH0pLFxuICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMucHJvdG9jb2xDb25maWd1cmF0aW9uLFxuICAgICAgfSksXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbmRlckVudmlyb25tZW50VmFyaWFibGVzKHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKSxcbiAgICAgIH0pLFxuICAgICAgdGFnczogcHJvcHMudGFncyA/PyB7fSxcbiAgICAgIGxpZmVjeWNsZUNvbmZpZ3VyYXRpb246IHRoaXMucmVuZGVyTGlmZWN5Y2xlQ29uZmlndXJhdGlvbigpLFxuICAgIH07XG4gICAgaWYgKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKSB7XG4gICAgICBjZm5Qcm9wcy5yZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbiA9IHRoaXMucmVuZGVyUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24ocHJvcHMucmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNmblByb3BzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uIS5fcmVuZGVyKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bnRpbWVSZXNvdXJjZSA9IG5ldyBiZWRyb2NrYWdlbnRjb3JlLkNmblJ1bnRpbWUodGhpcywgJ1Jlc291cmNlJywgY2ZuUHJvcHMgYXMgYmVkcm9ja2FnZW50Y29yZS5DZm5SdW50aW1lUHJvcHMpO1xuXG4gICAgLy8gQWRkIGRlcGVuZGVuY3kgb24gdGhlIHJvbGUgKGZvciBib3RoIGN1c3RvbSBhbmQgYXV0by1jcmVhdGVkIHJvbGVzKVxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgUnVudGltZSB3YWl0cyBmb3IgdGhlIHJvbGUgYW5kIGFsbCBpdHMgcG9saWNpZXMgKGluY2x1ZGluZyBFQ1IgcGVybWlzc2lvbnMpIHRvIGJlIGNyZWF0ZWRcbiAgICB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcblxuICAgIHRoaXMuYWdlbnRSdW50aW1lSWQgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lSWQ7XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcm4gPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lQXJuO1xuICAgIHRoaXMuYWdlbnRTdGF0dXMgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyU3RhdHVzO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lVmVyc2lvbiA9IHRoaXMucnVudGltZVJlc291cmNlLmF0dHJBZ2VudFJ1bnRpbWVWZXJzaW9uO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLmxhc3RVcGRhdGVkQXQgPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyTGFzdFVwZGF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IGFueSB7XG4gICAgaWYgKCFlbnZWYXJzIHx8IE9iamVjdC5rZXlzKGVudlZhcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBwcm9wZXIgcGVybWlzc2lvbnMgdG8gdGhlIGV4ZWN1dGlvbiByb2xlIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBCYXNlZCBvbjogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9ydW50aW1lLXBlcm1pc3Npb25zLmh0bWxcbiAgICovXG4gIHByaXZhdGUgYWRkRXhlY3V0aW9uUm9sZVBlcm1pc3Npb25zKCkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBhY2NvdW50ID0gU3RhY2sub2YodGhpcykuYWNjb3VudDtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIExvZyBHcm91cCBvcGVyYXRpb25zXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0xvZ0dyb3VwQWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfTE9HU19HUk9VUF9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6L2F3cy9iZWRyb2NrLWFnZW50Y29yZS9ydW50aW1lcy8qYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gRGVzY3JpYmUgYWxsIGxvZyBncm91cHNcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnRGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogUlVOVElNRV9MT0dTX0RFU0NSSUJFX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmxvZy1ncm91cDoqYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gTG9nIFN0cmVhbSBvcGVyYXRpb25zXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0xvZ1N0cmVhbUFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmxvZy1ncm91cDovYXdzL2JlZHJvY2stYWdlbnRjb3JlL3J1bnRpbWVzLyo6bG9nLXN0cmVhbToqYF0sXG4gICAgfSkpO1xuXG4gICAgLy8gWC1SYXkgVHJhY2luZyAtIG11c3QgYmUgKiBmb3IgdHJhY2luZ1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdYUmF5QWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBDbG91ZFdhdGNoIE1ldHJpY3MgLSBzY29wZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUgbmFtZXNwYWNlXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0Nsb3VkV2F0Y2hNZXRyaWNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfQ0xPVURXQVRDSF9NRVRSSUNTX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnY2xvdWR3YXRjaDpuYW1lc3BhY2UnOiBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG5cbiAgICAvLyBCZWRyb2NrIEFnZW50Q29yZSBXb3JrbG9hZCBJZGVudGl0eSBBY2Nlc3NcbiAgICAvLyBOb3RlOiBUaGUgYWdlbnQgbmFtZSB3aWxsIGJlIGRldGVybWluZWQgYXQgcnVudGltZSwgc28gd2UgdXNlIGEgd2lsZGNhcmQgcGF0dGVyblxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdHZXRBZ2VudEFjY2Vzc1Rva2VuJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfV09SS0xPQURfSURFTlRJVFlfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpiZWRyb2NrLWFnZW50Y29yZToke3JlZ2lvbn06JHthY2NvdW50fTp3b3JrbG9hZC1pZGVudGl0eS1kaXJlY3RvcnkvZGVmYXVsdGAsXG4gICAgICAgIGBhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OmJlZHJvY2stYWdlbnRjb3JlOiR7cmVnaW9ufToke2FjY291bnR9Ondvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0L3dvcmtsb2FkLWlkZW50aXR5LypgLFxuICAgICAgXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYXJ0aWZhY3QgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckFnZW50UnVudGltZUFydGlmYWN0KCk6IGFueSB7XG4gICAgLy8gc2V0IHBlcm1pc3Npb24gd2l0aCBiaW5kXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdC5iaW5kKHRoaXMsIHRoaXMpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QuX3JlbmRlcigpO1xuICAgIGlmICgoY29uZmlnIGFzIGFueSkuY29kZSkgeyAvLyBTM0ltYWdlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvZGU6IChjb25maWcgYXMgYW55KS5jb2RlLFxuICAgICAgICAgIHJ1bnRpbWU6IChjb25maWcgYXMgYW55KS5ydW50aW1lLFxuICAgICAgICAgIGVudHJ5UG9pbnQ6IChjb25maWcgYXMgYW55KS5lbnRyeVBvaW50LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRWNySW1hZ2Ugb3IgQXNzZXRJbWFnZVxuICAgICAgY29uc3QgY29udGFpbmVyVXJpID0gKGNvbmZpZyBhcyBhbnkpLmNvbnRhaW5lclVyaTtcbiAgICAgIGlmIChjb250YWluZXJVcmkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhaW5lclVyaShjb250YWluZXJVcmkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGFpbmVyQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvbnRhaW5lclVyaTogY29udGFpbmVyVXJpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcmVxdWVzdCBoZWFkZXIgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uPzogUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pOiBhbnkge1xuICAgIGlmICghcmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24/LmFsbG93bGlzdGVkSGVhZGVycykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJBbGxvd2xpc3Q6IHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyTGlmZWN5Y2xlQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBpZGxlUnVudGltZVNlc3Npb25UaW1lb3V0OiB0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/LmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQ/LnRvU2Vjb25kcygpLFxuICAgICAgbWF4TGlmZXRpbWU6IHRoaXMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbj8ubWF4TGlmZXRpbWU/LnRvU2Vjb25kcygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSByZXF1ZXN0IGhlYWRlciBjb25maWd1cmF0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uOiBSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGFsbEVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAocmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24uYWxsb3dsaXN0ZWRIZWFkZXJzKSB7XG4gICAgICBpZiAocmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24uYWxsb3dsaXN0ZWRIZWFkZXJzLmxlbmd0aCA8IDEgfHwgcmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24uYWxsb3dsaXN0ZWRIZWFkZXJzLmxlbmd0aCA+IDIwKSB7XG4gICAgICAgIGFsbEVycm9ycy5wdXNoKCdSZXF1ZXN0IGhlYWRlciBhbGxvdyBsaXN0IGNvbnRhaW4gYmV0d2VlbiAxIGFuZCAyMCBoZWFkZXJzJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycykge1xuICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICAgICAgY29uc3QgbGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgICAgdmFsdWU6IGhlYWRlcixcbiAgICAgICAgICBmaWVsZE5hbWU6ICdSZXF1ZXN0IGhlYWRlcicsXG4gICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIG1heExlbmd0aDogMjU2LFxuICAgICAgICB9KTtcbiAgICAgICAgYWxsRXJyb3JzLnB1c2goLi4ubGVuZ3RoRXJyb3JzKTtcblxuICAgICAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICdSZXF1ZXN0IGhlYWRlcicsXG4gICAgICAgICAgLyhBdXRob3JpemF0aW9ufFgtQW16bi1CZWRyb2NrLUFnZW50Q29yZS1SdW50aW1lLUN1c3RvbS1bYS16QS1aMC05LV0rKS8sXG4gICAgICAgICAgJ1JlcXVlc3QgaGVhZGVyIG11c3QgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zJyxcbiAgICAgICAgKTtcbiAgICAgICAgYWxsRXJyb3JzLnB1c2goLi4ucGF0dGVybkVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignSW52YWxpZFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uJywgYWxsRXJyb3JzLmpvaW4oJ1xcbicpLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVMaWZlY3ljbGVDb25maWd1cmF0aW9uKGxpZmVjeWNsZUNvbmZpZ3VyYXRpb246IExpZmVjeWNsZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAobGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0ICYmICFsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQuaXNVbnJlc29sdmVkKCkpIHtcbiAgICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQudG9TZWNvbmRzKCkgPCBMSUZFQ1lDTEVfTUlOX1RJTUVPVVQudG9TZWNvbmRzKClcbiAgICAgICAgfHwgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0LnRvU2Vjb25kcygpID4gTElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkSWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dCcsIGBJZGxlIHJ1bnRpbWUgc2Vzc2lvbiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAke0xJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKX0gc2Vjb25kcyBhbmQgJHtMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpfSBzZWNvbmRzYCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lICYmICFsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLmlzVW5yZXNvbHZlZCgpKSB7XG4gICAgICBpZiAobGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5tYXhMaWZldGltZS50b1NlY29uZHMoKSA8IExJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKVxuICAgICAgICB8fCBsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLnRvU2Vjb25kcygpID4gTElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkTWF4TGlmZXRpbWUnLCBgTWF4aW11bSBsaWZldGltZSBtdXN0IGJlIGJldHdlZW4gJHtMSUZFQ1lDTEVfTUlOX1RJTUVPVVQudG9TZWNvbmRzKCl9IHNlY29uZHMgYW5kICR7TElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKX0gc2Vjb25kc2AsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHJ1bnRpbWUgbmFtZSBmb3JtYXRcbiAgICogUGF0dGVybjogXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSdW50aW1lTmFtZSgpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIG5hbWUgY29udGFpbnMgQ0RLIHRva2VucyAodW5yZXNvbHZlZCB2YWx1ZXMpXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmFnZW50UnVudGltZU5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgY29uc3QgbGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICB2YWx1ZTogdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgZmllbGROYW1lOiAnUnVudGltZSBuYW1lJyxcbiAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgIG1heExlbmd0aDogNDgsXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXR0ZXJuXG4gICAgY29uc3QgcGF0dGVybkVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgJ1J1bnRpbWUgbmFtZScsXG4gICAgICAvXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JC8sXG4gICAgICAnUnVudGltZSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3JlcycsXG4gICAgKTtcblxuICAgIC8vIENvbWJpbmUgYW5kIHRocm93IGlmIGFueSBlcnJvcnNcbiAgICBjb25zdCBhbGxFcnJvcnMgPSBbLi4ubGVuZ3RoRXJyb3JzLCAuLi5wYXR0ZXJuRXJyb3JzXTtcbiAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0ludmFsaWRSdW50aW1lTmFtZScsIGFsbEVycm9ycy5qb2luKCdcXG4nKSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgZGVzY3JpcHRpb24gZm9ybWF0XG4gICAqIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjAwIGNoYXJhY3RlcnMgKHBlciBDbG91ZEZvcm1hdGlvbiBzcGVjaWZpY2F0aW9uKVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVEZXNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIGRlc2NyaXB0aW9uIGNvbnRhaW5zIENESyB0b2tlbnMgKHVucmVzb2x2ZWQgdmFsdWVzKVxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5kZXNjcmlwdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICBmaWVsZE5hbWU6ICdEZXNjcmlwdGlvbicsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMjAwLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkRGVzY3JpcHRpb24nLCBlcnJvcnMuam9pbignXFxuJyksIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIC0gTWF4aW11bSA1MCBlbnRyaWVzXG4gICAqIC0gS2V5OiAxLTEwMCBjaGFyYWN0ZXJzXG4gICAqIC0gVmFsdWU6IDAtMjA0OCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKTtcblxuICAgIC8vIFZhbGlkYXRlIG51bWJlciBvZiBlbnRyaWVzICgwLTUwKVxuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDUwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAnVG9vTWFueUVudmlyb25tZW50VmFyaWFibGVzJyxcbiAgICAgICAgYFRvbyBtYW55IGVudmlyb25tZW50IHZhcmlhYmxlczogJHtlbnRyaWVzLmxlbmd0aH0uIE1heGltdW0gYWxsb3dlZCBpcyA1MGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiBrZXkgb3IgdmFsdWUgY29udGFpbnMgQ0RLIHRva2Vuc1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXkpIHx8IFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGtleSBsZW5ndGhcbiAgICAgIGNvbnN0IGxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICBmaWVsZE5hbWU6IGBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgJyR7a2V5fSdgLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMTAwLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGtleSBwYXR0ZXJuXG4gICAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIGtleSxcbiAgICAgICAgYEVudmlyb25tZW50IHZhcmlhYmxlIGtleSAnJHtrZXl9J2AsXG4gICAgICAgIC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvLFxuICAgICAgICBgRW52aXJvbm1lbnQgdmFyaWFibGUga2V5ICcke2tleX0nIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzYCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbWJpbmUgYW5kIHRocm93IGlmIGFueSBlcnJvcnNcbiAgICAgIGNvbnN0IGFsbEVycm9ycyA9IFsuLi5sZW5ndGhFcnJvcnMsIC4uLnBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKGFsbEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0ludmFsaWRFbnZpcm9ubWVudFZhcmlhYmxlS2V5JywgYWxsRXJyb3JzLmpvaW4oJ1xcbicpLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdmFsdWUgbGVuZ3RoICgwLTIwNDggY2hhcmFjdGVycyBwZXIgQ2xvdWRGb3JtYXRpb24pXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMjA0OCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICdJbnZhbGlkRW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlJyxcbiAgICAgICAgICBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBsZW5ndGggZm9yIGtleSAnJHtrZXl9JzogJHt2YWx1ZS5sZW5ndGh9IGNoYXJhY3RlcnMuIGAgK1xuICAgICAgICAgICdWYWx1ZXMgbXVzdCBub3QgZXhjZWVkIDIwNDggY2hhcmFjdGVycycsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB0YWdzIGZvcm1hdFxuICAgKiBAcGFyYW0gdGFncyBUaGUgdGFncyBvYmplY3QgdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgZWFjaCB0YWcga2V5IGFuZCB2YWx1ZVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYga2V5IG9yIHZhbHVlIGNvbnRhaW5zIENESyB0b2tlbnNcbiAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoa2V5KSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IGxlbmd0aFxuICAgICAgY29uc3Qga2V5TGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogYFRhZyBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIGtleSBwYXR0ZXJuXG4gICAgICBjb25zdCBrZXlQYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIGtleSxcbiAgICAgICAgYFRhZyBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLyxcbiAgICAgICAgYFRhZyBrZXkgXCIke2tleX1cIiBjYW4gb25seSBjb250YWluIGxldHRlcnMgKGEteiwgQS1aKSwgbnVtYmVycyAoMC05KSwgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzICguXzovPStALSlgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSBrZXkgZXJyb3JzIGFuZCB0aHJvdyBpZiBhbnlcbiAgICAgIGNvbnN0IGtleUVycm9ycyA9IFsuLi5rZXlMZW5ndGhFcnJvcnMsIC4uLmtleVBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKGtleUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0ludmFsaWRUYWdLZXknLCBrZXlFcnJvcnMuam9pbignXFxuJyksIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdOdWxsVGFnVmFsdWUnLCBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWRgLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIHZhbHVlIGxlbmd0aFxuICAgICAgY29uc3QgdmFsdWVMZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBmaWVsZE5hbWU6IGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgbWluTGVuZ3RoOiAwLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWUgcGF0dGVyblxuICAgICAgY29uc3QgdmFsdWVQYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cImAsXG4gICAgICAgIC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLyxcbiAgICAgICAgYFRhZyB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCIgY2FuIG9ubHkgY29udGFpbiBsZXR0ZXJzIChhLXosIEEtWiksIG51bWJlcnMgKDAtOSksIHNwYWNlcywgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyAoLl86Lz0rQC0pYCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbWJpbmUgdmFsdWUgZXJyb3JzIGFuZCB0aHJvdyBpZiBhbnlcbiAgICAgIGNvbnN0IHZhbHVlRXJyb3JzID0gWy4uLnZhbHVlTGVuZ3RoRXJyb3JzLCAuLi52YWx1ZVBhdHRlcm5FcnJvcnNdO1xuICAgICAgaWYgKHZhbHVlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignSW52YWxpZFRhZ1ZhbHVlJywgdmFsdWVFcnJvcnMuam9pbignXFxuJyksIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGNvbnRhaW5lciBVUkkgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQ29udGFpbmVyVXJpKHVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIHRoZSBVUkkgY29udGFpbnMgQ0RLIHRva2VucyAodW5yZXNvbHZlZCB2YWx1ZXMpXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh1cmkpKSB7XG4gICAgICAvLyBBZGQgYSB3YXJuaW5nIHRoYXQgdmFsaWRhdGlvbiB3aWxsIGJlIHNraXBwZWQgZm9yIHRva2VuLWJhc2VkIFVSSXNcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZEluZm8oXG4gICAgICAgICdDb250YWluZXIgVVJJIHZhbGlkYXRpb24gc2tpcHBlZCBhcyBpdCBjb250YWlucyB1bnJlc29sdmVkIENESyB0b2tlbnMuICcgK1xuICAgICAgICAnVGhlIFVSSSB3aWxsIGJlIHZhbGlkYXRlZCBhdCBkZXBsb3ltZW50IHRpbWUuJyxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB2YWxpZGF0ZSBpZiB0aGUgVVJJIGlzIGEgY29uY3JldGUgc3RyaW5nIChub3QgYSB0b2tlbilcbiAgICBjb25zdCBwYXR0ZXJuID0gL15cXGR7MTJ9XFwuZGtyXFwuZWNyXFwuKFthLXowLTktXSspXFwuYW1hem9uYXdzXFwuY29tXFwvKCg/OlthLXowLTldKyg/OlsuXy1dW2EtejAtOV0rKSpcXC8pKlthLXowLTldKyg/OlsuXy1dW2EtejAtOV0rKSopKFs6QF1cXFMrKSQvO1xuICAgIGlmICghcGF0dGVybi50ZXN0KHVyaSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdJbnZhbGlkQ29udGFpbmVyVXJpJyxcbiAgICAgICAgYEludmFsaWQgY29udGFpbmVyIFVSSSBmb3JtYXQ6ICR7dXJpfS4gTXVzdCBiZSBhIHZhbGlkIEVDUiBVUkkgKGUuZy4sIDEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdClgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBJQU0gcm9sZSBBUk4gZm9ybWF0IGFuZCBzdHJ1Y3R1cmVcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUm9sZUFybihyb2xlQXJuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBiYXNpYyBBUk4gZm9ybWF0IGZvciBJQU0gcm9sZXNcbiAgICBjb25zdCBhcm5QYXR0ZXJuID0gL15hcm46W2EtelxcLV0rOmlhbTo6XFxkezEyfTpyb2xlXFwvW2EtekEtWjAtOSs9LC5AXFwtX1xcL10rJC87XG4gICAgaWYgKCFhcm5QYXR0ZXJuLnRlc3Qocm9sZUFybikpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdJbnZhbGlkUm9sZUFybkZvcm1hdCcsXG4gICAgICAgIGBJbnZhbGlkIElBTSByb2xlIEFSTiBmb3JtYXQ6ICR7cm9sZUFybn0uIGAgK1xuICAgICAgICAnRXhwZWN0ZWQgZm9ybWF0OiBhcm46PHBhcnRpdGlvbj46aWFtOjo8YWNjb3VudC1pZD46cm9sZS88cm9sZS1uYW1lPiBvciBhcm46PHBhcnRpdGlvbj46aWFtOjo8YWNjb3VudC1pZD46cm9sZS88cGF0aD4vPHJvbGUtbmFtZT4nLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgQVJOIGNvbXBvbmVudHMgdXNpbmcgQ0RLJ3MgQXJuLnNwbGl0KClcbiAgICAvLyBVc2UgU0xBU0hfUkVTT1VSQ0VfTkFNRSBmb3JtYXQgZm9yIElBTSByb2xlcyAod2hpY2ggdXNlIGZvcm1hdDogcm9sZS9yb2xlLW5hbWUgb3Igcm9sZS9wYXRoL3RvL3JvbGUtbmFtZSlcbiAgICBjb25zdCBhcm5Db21wb25lbnRzID0gQXJuLnNwbGl0KHJvbGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcblxuICAgIGlmIChhcm5Db21wb25lbnRzLnNlcnZpY2UgIT09ICdpYW0nKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkUm9sZUFyblNlcnZpY2UnLCBgSW52YWxpZCBzZXJ2aWNlIGluIEFSTjogJHthcm5Db21wb25lbnRzLnNlcnZpY2V9LiBFeHBlY3RlZCAnaWFtJyBmb3IgSUFNIHJvbGUgQVJOLmAsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRJZCA9IGFybkNvbXBvbmVudHMuYWNjb3VudDtcbiAgICBpZiAoIWFjY291bnRJZCB8fCAhL15cXGR7MTJ9JC8udGVzdChhY2NvdW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkUm9sZUFybkFjY291bnRJZCcsIGBJbnZhbGlkIEFXUyBhY2NvdW50IElEIGluIHJvbGUgQVJOOiAke2FjY291bnRJZH0uIE11c3QgYmUgYSAxMi1kaWdpdCBudW1iZXIuYCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByb2xlIG5hbWUgZnJvbSByZXNvdXJjZVxuICAgIC8vIEZvciBJQU0gcm9sZXMsIHJlc291cmNlIHdpbGwgYmUgXCJyb2xlXCIgYW5kIHJlc291cmNlTmFtZSB3aWxsIGJlIHRoZSByb2xlIG5hbWUgKHdpdGggb3B0aW9uYWwgcGF0aClcbiAgICBjb25zdCByZXNvdXJjZSA9IGFybkNvbXBvbmVudHMucmVzb3VyY2U7XG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYXJuQ29tcG9uZW50cy5yZXNvdXJjZU5hbWU7XG5cbiAgICBpZiAocmVzb3VyY2UgIT09ICdyb2xlJykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignSW52YWxpZFJvbGVBcm5SZXNvdXJjZVR5cGUnLCBgSW52YWxpZCByZXNvdXJjZSB0eXBlIGluIEFSTjogJHtyZXNvdXJjZX0uIEV4cGVjdGVkICdyb2xlJyBmb3IgSUFNIHJvbGUgQVJOLmAsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICghcmVzb3VyY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdNaXNzaW5nUm9sZU5hbWUnLCAnUm9sZSBuYW1lIGlzIG1pc3NpbmcgaW4gdGhlIEFSTicsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb2xlUGF0aFBhcnRzID0gcmVzb3VyY2VOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCByb2xlTmFtZSA9IHJvbGVQYXRoUGFydHNbcm9sZVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKHJvbGVOYW1lLmxlbmd0aCA+IDY0KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ1JvbGVOYW1lVG9vTG9uZycsIGBSb2xlIG5hbWUgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiA2NCBjaGFyYWN0ZXJzOiAke3JvbGVOYW1lfWAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrQWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2tBY2NvdW50KSAmJiBhY2NvdW50SWQgIT09IHN0YWNrQWNjb3VudCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYElBTSByb2xlIGlzIGZyb20gYSBkaWZmZXJlbnQgYWNjb3VudCAoJHthY2NvdW50SWR9KSB0aGFuIHRoZSBzdGFjayBhY2NvdW50ICgke3N0YWNrQWNjb3VudH0pLiBgICtcbiAgICAgICAgJ0Vuc3VyZSBjcm9zcy1hY2NvdW50IHBlcm1pc3Npb25zIGFyZSBwcm9wZXJseSBjb25maWd1cmVkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZWdpb24gKElBTSBpcyBnbG9iYWwsIHNvIHJlZ2lvbiBzaG91bGQgYmUgZW1wdHkpXG4gICAgY29uc3QgcmVnaW9uID0gYXJuQ29tcG9uZW50cy5yZWdpb247XG4gICAgY29uc3Qgc3RhY2tSZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgaWYgKHJlZ2lvbiAmJiByZWdpb24gIT09ICcnICYmIHJlZ2lvbiAhPT0gc3RhY2tSZWdpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChzdGFja1JlZ2lvbikpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGBJQU0gcm9sZSBBUk4gY29udGFpbnMgYSByZWdpb24gKCR7cmVnaW9ufSkgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBzdGFjayByZWdpb24gKCR7c3RhY2tSZWdpb259KS4gYCArXG4gICAgICAgICdJQU0gaXMgYSBnbG9iYWwgc2VydmljZSwgc28gdGhpcyBtaWdodCBiZSBpbnRlbnRpb25hbC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGVuZHBvaW50IHRvIHRoaXMgcnVudGltZVxuICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIFJ1bnRpbWVFbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludE5hbWUgVGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbmRwb2ludFxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBSdW50aW1lRW5kcG9pbnRcbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhZGRFbmRwb2ludChcbiAgICBlbmRwb2ludE5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQWRkRW5kcG9pbnRPcHRpb25zLFxuICApOiBSdW50aW1lRW5kcG9pbnQge1xuICAgIC8vIENyZWF0ZSB0aGUgZW5kcG9pbnQgKHNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZClcbiAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBSdW50aW1lRW5kcG9pbnQodGhpcywgYEVuZHBvaW50JHtlbmRwb2ludE5hbWV9YCwge1xuICAgICAgZW5kcG9pbnROYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICBhZ2VudFJ1bnRpbWVJZDogdGhpcy5hZ2VudFJ1bnRpbWVJZCxcbiAgICAgIGFnZW50UnVudGltZVZlcnNpb246IG9wdGlvbnM/LnZlcnNpb24gPz8gdGhpcy5hZ2VudFJ1bnRpbWVWZXJzaW9uID8/ICcxJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zPy5kZXNjcmlwdGlvbixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5OiBlbmRwb2ludCBtdXN0IHdhaXQgZm9yIHJ1bnRpbWUgdG8gYmUgY3JlYXRlZFxuICAgIGVuZHBvaW50Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnJ1bnRpbWVSZXNvdXJjZSk7XG5cbiAgICByZXR1cm4gZW5kcG9pbnQ7XG4gIH1cbn1cbiJdfQ==
@@ -68,8 +68,8 @@ function validateFieldPattern(value, fieldName, pattern, customMessage) {
68
68
  function throwIfInvalid(validationFn, param) {
69
69
  const errors = validationFn(param);
70
70
  if (errors.length > 0) {
71
- throw new errors_1.UnscopedValidationError(errors.join('\n'));
71
+ throw new errors_1.UnscopedValidationError('ValidationFailed', errors.join('\n'));
72
72
  }
73
73
  return param;
74
74
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmFsaWRhdGlvbi1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0JBLGtEQTBCQztBQVdELG9EQWdDQztBQUlELHdDQU1DO0FBckdELDZDQUFvQztBQUNwQyx3REFBc0U7QUFZdEU7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxNQUE4QjtJQUNoRSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsK0JBQStCO0lBQy9CLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixPQUFPLE1BQU0sQ0FBQyxDQUFDLDRDQUE0QztJQUM3RCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFMUMsaURBQWlEO0lBQ2pELElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsSUFBSSxDQUNULGFBQWEsTUFBTSxDQUFDLFNBQVMsT0FBTyxhQUFhLHNEQUFzRCxNQUFNLENBQUMsU0FBUyxhQUFhLENBQ3JJLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FDVCxhQUFhLE1BQU0sQ0FBQyxTQUFTLE9BQU8sYUFBYSx5Q0FBeUMsTUFBTSxDQUFDLFNBQVMsYUFBYSxDQUN4SCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixhQUFzQjtJQUV0QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsK0JBQStCO0lBQy9CLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLENBQUMsNENBQTRDO0lBQzdELENBQUM7SUFFRCxpREFBaUQ7SUFDakQsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsY0FBYztRQUNkLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsU0FBUyxTQUFTLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxjQUFjLEdBQUcsYUFBYSxTQUFTLGdCQUFnQixLQUFLLHlDQUF5QyxPQUFPLEVBQUUsQ0FBQztZQUNySCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFJRCxTQUFnQixjQUFjLENBQUksWUFBNkIsRUFBRSxLQUFRO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLGdDQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2Vycm9ycyc7XG5cbmludGVyZmFjZSBJbnRlcnZhbFZhbGlkYXRpb24ge1xuICBmaWVsZE5hbWU6IHN0cmluZztcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU3RyaW5nTGVuZ3RoVmFsaWRhdGlvbiBleHRlbmRzIEludGVydmFsVmFsaWRhdGlvbiB7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgZmllbGQgYWdhaW5zdCBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvbnN0cmFpbnRzLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHBhcmFtIG1pbkxlbmd0aCAtIE1pbmltdW0gYWxsb3dlZCBsZW5ndGggKGRlZmF1bHRzIHRvIDApXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIC0gTWF4aW11bSBhbGxvd2VkIGxlbmd0aFxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzIHdpdGggY3VycmVudCBsZW5ndGggaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nRmllbGQocGFyYW1zOiBTdHJpbmdMZW5ndGhWYWxpZGF0aW9uKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICBpZiAocGFyYW1zLnZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBTa2lwIHZhbGlkYXRpb24gZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICB9XG5cbiAgY29uc3QgY3VycmVudExlbmd0aCA9IHBhcmFtcy52YWx1ZS5sZW5ndGg7XG5cbiAgLy8gRXZhbHVhdGUgb25seSBpZiBpdCBpcyBub3QgYW4gdW5yZXNvbHZlZCBUb2tlblxuICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwYXJhbXMuZmllbGROYW1lKSkge1xuICAgIGlmIChwYXJhbXMudmFsdWUubGVuZ3RoID4gcGFyYW1zLm1heExlbmd0aCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGBUaGUgZmllbGQgJHtwYXJhbXMuZmllbGROYW1lfSBpcyAke2N1cnJlbnRMZW5ndGh9IGNoYXJhY3RlcnMgbG9uZyBidXQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtwYXJhbXMubWF4TGVuZ3RofSBjaGFyYWN0ZXJzYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy52YWx1ZS5sZW5ndGggPCBwYXJhbXMubWluTGVuZ3RoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYFRoZSBmaWVsZCAke3BhcmFtcy5maWVsZE5hbWV9IGlzICR7Y3VycmVudExlbmd0aH0gY2hhcmFjdGVycyBsb25nIGJ1dCBtdXN0IGJlIGF0IGxlYXN0ICR7cGFyYW1zLm1pbkxlbmd0aH0gY2hhcmFjdGVyc2AsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc3RyaW5nIGZpZWxkIGFnYWluc3QgYSByZWdleCBwYXR0ZXJuLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHBhcmFtIHBhdHRlcm4gLSBSZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byB0ZXN0IGFnYWluc3RcbiAqIEBwYXJhbSBjdXN0b21NZXNzYWdlIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscyB3aXRoIGRldGFpbGVkIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICB2YWx1ZTogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgcGF0dGVybjogUmVnRXhwLFxuICBjdXN0b21NZXNzYWdlPzogc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBlcnJvcnM7IC8vIFNraXAgdmFsaWRhdGlvbiBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzXG4gIH1cblxuICAvLyBFdmFsdWF0ZSBvbmx5IGlmIGl0IGlzIG5vdCBhbiB1bnJlc29sdmVkIFRva2VuXG4gIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSkge1xuICAgIC8vIFZlcmlmeSB0eXBlXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBFeHBlY3RlZCBzdHJpbmcgZm9yICR7ZmllbGROYW1lfSwgZ290ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBzcGVjaWZpZWQgcmVnZXhcbiAgICBpZiAoIShwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ1BhdHRlcm4gbXVzdCBiZSBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbicpO1xuICAgIH1cblxuICAgIC8vIFBhdHRlcm4gdmFsaWRhdGlvblxuICAgIGlmICghcGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSB3aXRoIHZhbHVlIFwiJHt2YWx1ZX1cIiBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgcGF0dGVybiAke3BhdHRlcm59YDtcbiAgICAgIGVycm9ycy5wdXNoKGN1c3RvbU1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25GbjxUPiA9IChwYXJhbTogVCkgPT4gc3RyaW5nW107XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmSW52YWxpZDxUPih2YWxpZGF0aW9uRm46IFZhbGlkYXRpb25GbjxUPiwgcGFyYW06IFQpOiBUIHtcbiAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGlvbkZuKHBhcmFtKTtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtO1xufVxuIl19
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmFsaWRhdGlvbi1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0JBLGtEQTBCQztBQVdELG9EQWdDQztBQUlELHdDQU1DO0FBckdELDZDQUFvQztBQUNwQyx3REFBc0U7QUFZdEU7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxNQUE4QjtJQUNoRSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsK0JBQStCO0lBQy9CLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixPQUFPLE1BQU0sQ0FBQyxDQUFDLDRDQUE0QztJQUM3RCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFMUMsaURBQWlEO0lBQ2pELElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsSUFBSSxDQUNULGFBQWEsTUFBTSxDQUFDLFNBQVMsT0FBTyxhQUFhLHNEQUFzRCxNQUFNLENBQUMsU0FBUyxhQUFhLENBQ3JJLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FDVCxhQUFhLE1BQU0sQ0FBQyxTQUFTLE9BQU8sYUFBYSx5Q0FBeUMsTUFBTSxDQUFDLFNBQVMsYUFBYSxDQUN4SCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixhQUFzQjtJQUV0QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsK0JBQStCO0lBQy9CLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLENBQUMsNENBQTRDO0lBQzdELENBQUM7SUFFRCxpREFBaUQ7SUFDakQsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsY0FBYztRQUNkLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsU0FBUyxTQUFTLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxjQUFjLEdBQUcsYUFBYSxTQUFTLGdCQUFnQixLQUFLLHlDQUF5QyxPQUFPLEVBQUUsQ0FBQztZQUNySCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFJRCxTQUFnQixjQUFjLENBQUksWUFBNkIsRUFBRSxLQUFRO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLGdDQUF1QixDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2Vycm9ycyc7XG5cbmludGVyZmFjZSBJbnRlcnZhbFZhbGlkYXRpb24ge1xuICBmaWVsZE5hbWU6IHN0cmluZztcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU3RyaW5nTGVuZ3RoVmFsaWRhdGlvbiBleHRlbmRzIEludGVydmFsVmFsaWRhdGlvbiB7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgZmllbGQgYWdhaW5zdCBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvbnN0cmFpbnRzLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHBhcmFtIG1pbkxlbmd0aCAtIE1pbmltdW0gYWxsb3dlZCBsZW5ndGggKGRlZmF1bHRzIHRvIDApXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIC0gTWF4aW11bSBhbGxvd2VkIGxlbmd0aFxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzIHdpdGggY3VycmVudCBsZW5ndGggaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nRmllbGQocGFyYW1zOiBTdHJpbmdMZW5ndGhWYWxpZGF0aW9uKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICBpZiAocGFyYW1zLnZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBTa2lwIHZhbGlkYXRpb24gZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICB9XG5cbiAgY29uc3QgY3VycmVudExlbmd0aCA9IHBhcmFtcy52YWx1ZS5sZW5ndGg7XG5cbiAgLy8gRXZhbHVhdGUgb25seSBpZiBpdCBpcyBub3QgYW4gdW5yZXNvbHZlZCBUb2tlblxuICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwYXJhbXMuZmllbGROYW1lKSkge1xuICAgIGlmIChwYXJhbXMudmFsdWUubGVuZ3RoID4gcGFyYW1zLm1heExlbmd0aCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGBUaGUgZmllbGQgJHtwYXJhbXMuZmllbGROYW1lfSBpcyAke2N1cnJlbnRMZW5ndGh9IGNoYXJhY3RlcnMgbG9uZyBidXQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtwYXJhbXMubWF4TGVuZ3RofSBjaGFyYWN0ZXJzYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy52YWx1ZS5sZW5ndGggPCBwYXJhbXMubWluTGVuZ3RoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYFRoZSBmaWVsZCAke3BhcmFtcy5maWVsZE5hbWV9IGlzICR7Y3VycmVudExlbmd0aH0gY2hhcmFjdGVycyBsb25nIGJ1dCBtdXN0IGJlIGF0IGxlYXN0ICR7cGFyYW1zLm1pbkxlbmd0aH0gY2hhcmFjdGVyc2AsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc3RyaW5nIGZpZWxkIGFnYWluc3QgYSByZWdleCBwYXR0ZXJuLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHBhcmFtIHBhdHRlcm4gLSBSZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byB0ZXN0IGFnYWluc3RcbiAqIEBwYXJhbSBjdXN0b21NZXNzYWdlIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscyB3aXRoIGRldGFpbGVkIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICB2YWx1ZTogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgcGF0dGVybjogUmVnRXhwLFxuICBjdXN0b21NZXNzYWdlPzogc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBlcnJvcnM7IC8vIFNraXAgdmFsaWRhdGlvbiBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzXG4gIH1cblxuICAvLyBFdmFsdWF0ZSBvbmx5IGlmIGl0IGlzIG5vdCBhbiB1bnJlc29sdmVkIFRva2VuXG4gIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSkge1xuICAgIC8vIFZlcmlmeSB0eXBlXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBFeHBlY3RlZCBzdHJpbmcgZm9yICR7ZmllbGROYW1lfSwgZ290ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBzcGVjaWZpZWQgcmVnZXhcbiAgICBpZiAoIShwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ1BhdHRlcm4gbXVzdCBiZSBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbicpO1xuICAgIH1cblxuICAgIC8vIFBhdHRlcm4gdmFsaWRhdGlvblxuICAgIGlmICghcGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSB3aXRoIHZhbHVlIFwiJHt2YWx1ZX1cIiBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgcGF0dGVybiAke3BhdHRlcm59YDtcbiAgICAgIGVycm9ycy5wdXNoKGN1c3RvbU1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25GbjxUPiA9IChwYXJhbTogVCkgPT4gc3RyaW5nW107XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmSW52YWxpZDxUPih2YWxpZGF0aW9uRm46IFZhbGlkYXRpb25GbjxUPiwgcGFyYW06IFQpOiBUIHtcbiAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGlvbkZuKHBhcmFtKTtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdWYWxpZGF0aW9uRmFpbGVkJywgZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgfVxuICByZXR1cm4gcGFyYW07XG59XG4iXX0=