@fjall/components-infrastructure 0.75.3 → 0.77.1

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 (184) hide show
  1. package/dist/lib/app.d.ts +125 -20
  2. package/dist/lib/app.js +171 -56
  3. package/dist/lib/aspects/resourceInventory.d.ts +41 -0
  4. package/dist/lib/aspects/resourceInventory.js +56 -0
  5. package/dist/lib/config/audit.d.ts +18 -0
  6. package/dist/lib/config/audit.js +22 -0
  7. package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
  8. package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
  9. package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +1 -1
  12. package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
  13. package/dist/lib/config/aws/ecrDefaultImage.js +4 -4
  14. package/dist/lib/config/aws/identityCenter.d.ts +3 -3
  15. package/dist/lib/config/aws/identityCenter.js +1 -1
  16. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
  17. package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
  18. package/dist/lib/config/aws/ipam.js +2 -4
  19. package/dist/lib/config/aws/organisation.d.ts +3 -3
  20. package/dist/lib/config/aws/organisation.js +1 -1
  21. package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
  22. package/dist/lib/config/aws/organisationsAccess.js +1 -1
  23. package/dist/lib/config/monitoring.d.ts +18 -0
  24. package/dist/lib/config/monitoring.js +22 -0
  25. package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
  26. package/dist/lib/patterns/aws/auditRole.js +58 -0
  27. package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
  28. package/dist/lib/patterns/aws/buildkite.js +1 -1
  29. package/dist/lib/patterns/aws/compute.d.ts +17 -11
  30. package/dist/lib/patterns/aws/compute.js +7 -7
  31. package/dist/lib/patterns/aws/database.d.ts +185 -24
  32. package/dist/lib/patterns/aws/database.js +280 -42
  33. package/dist/lib/patterns/aws/ec2.d.ts +43 -0
  34. package/dist/lib/patterns/aws/ec2.js +123 -0
  35. package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
  36. package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
  37. package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
  38. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  39. package/dist/lib/patterns/aws/index.d.ts +1 -0
  40. package/dist/lib/patterns/aws/index.js +2 -1
  41. package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
  42. package/dist/lib/patterns/aws/managedAccount.js +1 -1
  43. package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
  44. package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
  45. package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
  46. package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
  47. package/dist/lib/patterns/aws/managedPlatform.js +2 -4
  48. package/dist/lib/patterns/aws/network.d.ts +75 -0
  49. package/dist/lib/patterns/aws/network.js +99 -0
  50. package/dist/lib/patterns/aws/storage.d.ts +4 -55
  51. package/dist/lib/patterns/aws/storage.js +3 -103
  52. package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
  53. package/dist/lib/resources/aws/audit/auditRole.js +46 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
  55. package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
  56. package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
  57. package/dist/lib/resources/aws/backup/backupVault.js +1 -1
  58. package/dist/lib/resources/aws/base/awsStack.js +1 -4
  59. package/dist/lib/resources/aws/compute/ec2.d.ts +4 -3
  60. package/dist/lib/resources/aws/compute/ec2.js +5 -3
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
  62. package/dist/lib/resources/aws/compute/ecs.js +68 -20
  63. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
  64. package/dist/lib/resources/aws/compute/ecsFreeTier.js +17 -10
  65. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
  66. package/dist/lib/resources/aws/compute/ecsSpot.js +19 -14
  67. package/dist/lib/resources/aws/compute/lambda.d.ts +15 -10
  68. package/dist/lib/resources/aws/compute/lambda.js +27 -19
  69. package/dist/lib/resources/aws/database/database.d.ts +2 -2
  70. package/dist/lib/resources/aws/database/database.js +1 -1
  71. package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
  72. package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
  73. package/dist/lib/resources/aws/database/index.d.ts +0 -1
  74. package/dist/lib/resources/aws/database/index.js +1 -2
  75. package/dist/lib/resources/aws/database/rdsAurora.d.ts +24 -6
  76. package/dist/lib/resources/aws/database/rdsAurora.js +212 -85
  77. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +41 -6
  78. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +38 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.d.ts +19 -10
  80. package/dist/lib/resources/aws/database/rdsInstance.js +220 -73
  81. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
  83. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
  84. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  85. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
  86. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
  88. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  89. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
  90. package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
  91. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
  92. package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
  93. package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
  94. package/dist/lib/resources/aws/iam/policy.js +1 -1
  95. package/dist/lib/resources/aws/iam/role.d.ts +1 -1
  96. package/dist/lib/resources/aws/iam/role.js +1 -1
  97. package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
  98. package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
  99. package/dist/lib/resources/aws/index.d.ts +1 -0
  100. package/dist/lib/resources/aws/index.js +2 -1
  101. package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
  102. package/dist/lib/resources/aws/logging/logGroup.js +1 -1
  103. package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
  104. package/dist/lib/resources/aws/monitoring/index.js +18 -0
  105. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  106. package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
  107. package/dist/lib/resources/aws/networking/index.d.ts +0 -1
  108. package/dist/lib/resources/aws/networking/index.js +1 -2
  109. package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
  110. package/dist/lib/resources/aws/networking/ipam.js +1 -1
  111. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  112. package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
  113. package/dist/lib/resources/aws/networking/vpc.d.ts +42 -23
  114. package/dist/lib/resources/aws/networking/vpc.js +185 -36
  115. package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
  116. package/dist/lib/resources/aws/secrets/alias.js +1 -1
  117. package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
  118. package/dist/lib/resources/aws/secrets/parameter.js +1 -1
  119. package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
  120. package/dist/lib/resources/aws/secrets/secret.js +19 -2
  121. package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
  122. package/dist/lib/resources/aws/storage/ecr.js +1 -1
  123. package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
  124. package/dist/lib/resources/aws/storage/s3.js +1 -1
  125. package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
  126. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  127. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
  128. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
  129. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
  130. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  131. package/dist/lib/resources/aws/utilities/customResource.d.ts +9 -7
  132. package/dist/lib/resources/aws/utilities/customResource.js +35 -11
  133. package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
  134. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
  135. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
  136. package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
  137. package/dist/lib/utils/getAsync.d.ts +1 -1
  138. package/dist/lib/utils/getAsync.js +1 -1
  139. package/dist/lib/utils/getCidr.d.ts +8 -0
  140. package/dist/lib/utils/getCidr.js +40 -0
  141. package/dist/lib/utils/getConfig.d.ts +2 -2
  142. package/dist/lib/utils/getConfig.js +3 -3
  143. package/dist/lib/utils/index.d.ts +1 -0
  144. package/dist/lib/utils/index.js +2 -1
  145. package/dist/lib/utils/resourceNaming.d.ts +41 -0
  146. package/dist/lib/utils/resourceNaming.js +77 -0
  147. package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
  148. package/dist/lib/utils/standardTagsAspect.js +6 -5
  149. package/dist/lib/utils/tagResource.d.ts +1 -1
  150. package/dist/lib/utils/tagResource.js +1 -1
  151. package/package.json +3 -3
  152. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
  153. package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
  154. package/dist/lib/__tests__/patterns/compute.test.js +0 -137
  155. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  156. package/dist/lib/__tests__/simple.test.js +0 -12
  157. package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
  158. package/dist/lib/resources/aws/organisations/account.js +0 -220
  159. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
  160. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
  161. package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
  162. package/dist/lib/resources/aws/organisations/index.js +0 -22
  163. package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
  164. package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
  165. package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
  166. package/dist/lib/resources/aws/organisations/organisation.js +0 -263
  167. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
  168. package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
  169. package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
  170. package/dist/lib/resources/aws/organisations/policy.js +0 -93
  171. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
  172. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
  173. package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
  174. package/dist/lib/resources/aws/organisations/types.js +0 -36
  175. package/dist/lib/utils/directTagging.d.ts +0 -31
  176. package/dist/lib/utils/directTagging.js +0 -86
  177. package/dist/lib/utils/fjallConstruct.d.ts +0 -8
  178. package/dist/lib/utils/fjallConstruct.js +0 -18
  179. package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
  180. package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
  181. package/dist/lib/utils/tagContext.d.ts +0 -28
  182. package/dist/lib/utils/tagContext.js +0 -53
  183. package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
  184. package/dist/lib/utils/tagSynthesizer.js +0 -55
@@ -8,124 +8,230 @@ const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
8
8
  const constructs_1 = require("constructs");
9
9
  const iam_1 = require("../iam");
10
10
  const secrets_1 = require("../secrets");
11
+ const resourceNaming_1 = require("../../../utils/resourceNaming");
12
+ const database_1 = require("../../../patterns/aws/database");
11
13
  class RdsAurora extends constructs_1.Construct {
12
14
  constructor(scope, id, props) {
13
15
  super(scope, id);
14
- this.port = props.port || 5432;
15
- // Database Credentials
16
- this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
17
- secretName: `${props.databaseName}Credentials`,
18
- generateSecretString: {
19
- secretStringTemplate: JSON.stringify({
20
- username: "postgres"
21
- }),
22
- excludePunctuation: true,
23
- includeSpace: false,
24
- generateStringKey: "password"
25
- }
26
- });
27
- // Customer Managed Keys
28
- const encryptionKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, {
29
- aliasName: `cmk/rds/${props.databaseName}/encryptionKey`
30
- });
31
- const primaryReaderInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}PrimaryReaderInsightsKey`, {
32
- aliasName: `cmk/rds/${props.databaseName}/PrimaryReaderInsightsKey`
16
+ this.port = props.port ?? 35255;
17
+ // PostgreSQL fallback for direct usage - ensure engine and engineConfig match
18
+ this.engineConfig = props.engineConfig ?? {
19
+ defaultUsername: "postgres",
20
+ sslParameters: { "rds.force_ssl": "1" },
21
+ rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
22
+ };
23
+ const piEnabled = props.performanceInsights !== false;
24
+ const piConfig = piEnabled && typeof props.performanceInsights === "object"
25
+ ? props.performanceInsights
26
+ : undefined;
27
+ const username = props.credentials?.username ?? this.engineConfig.defaultUsername;
28
+ // Global secondary clusters import replicated secret instead of creating new
29
+ if (props.isGlobalSecondary) {
30
+ this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
31
+ secretName: `${props.databaseName}Credentials`,
32
+ importExisting: true
33
+ });
34
+ }
35
+ else {
36
+ this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
37
+ secretName: `${props.databaseName}Credentials`,
38
+ generateSecretString: {
39
+ secretStringTemplate: JSON.stringify({ username }),
40
+ excludePunctuation: true,
41
+ includeSpace: false,
42
+ generateStringKey: "password"
43
+ },
44
+ replicaRegions: props.secretReplicaRegions
45
+ });
46
+ }
47
+ const storageEncryptionKey = (0, database_1.isCMKRequested)(props.encryption?.storageKey)
48
+ ? new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${props.databaseName}/encryptionKey` }).key
49
+ : (0, database_1.isAwsManagedKey)(props.encryption?.storageKey) ||
50
+ props.encryption?.storageKey === undefined
51
+ ? undefined // AWS Managed (default)
52
+ : props.encryption?.storageKey; // Use provided IKey
53
+ const performanceInsightsKey = piEnabled && (0, database_1.isCMKRequested)(piConfig?.encryptionKey)
54
+ ? new secrets_1.CustomerManagedKey(this, `${props.databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${props.databaseName}/InsightsKey` }).key
55
+ : undefined;
56
+ const clusterSecurityGroup = new iam_1.SecurityGroup(this, `${id}SecurityGroup`, {
57
+ vpc: props.vpc,
58
+ description: `Security group for Aurora cluster ${props.databaseName}`
33
59
  });
34
- const secondaryReaderInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}SecondaryReaderInsightsKey`, {
35
- aliasName: `cmk/rds/${props.databaseName}/SecondaryReaderInsightsKey`
60
+ clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(this.port));
61
+ this.connections = new aws_ec2_1.Connections({
62
+ securityGroups: [clusterSecurityGroup],
63
+ defaultPort: aws_ec2_1.Port.tcp(this.port)
36
64
  });
37
- const primaryWriterPerformanceInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}PrimaryWriterPerformanceInsightsKey`, {
38
- aliasName: `cmk/rds/${props.databaseName}/PrimaryWriterInsightsKey`
65
+ const writerConfig = props.writer ?? {};
66
+ const writerPI = writerConfig.enablePerformanceInsights ?? piEnabled;
67
+ const writerSuffix = writerConfig.identifierSuffix ?? "primary-writer";
68
+ const performanceInsightsRetention = this.getPerformanceInsightRetention(piConfig?.retentionPeriod ?? 7);
69
+ const databaseName = props.databaseName || id;
70
+ const writer = aws_rds_1.ClusterInstance.serverlessV2(`${databaseName}Writer`, {
71
+ enablePerformanceInsights: writerPI,
72
+ performanceInsightEncryptionKey: writerPI
73
+ ? performanceInsightsKey
74
+ : undefined,
75
+ performanceInsightRetention: writerPI
76
+ ? performanceInsightsRetention
77
+ : undefined,
78
+ instanceIdentifier: resourceNaming_1.ResourceNaming.writerInstanceId(databaseName, writerSuffix),
79
+ caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
80
+ ...(writerConfig.availabilityZone && {
81
+ availabilityZone: writerConfig.availabilityZone
82
+ })
39
83
  });
40
- const clusterSecurityGroup = new iam_1.SecurityGroup(this, `${id}SecurityGroup`, {
41
- vpc: props.vpc,
42
- description: `Security group that allows inbound access to the postgres cluster for ${props.databaseName}`
84
+ const readers = this.buildReaders(props, piEnabled, performanceInsightsKey, performanceInsightsRetention);
85
+ const engine = props.engine ||
86
+ aws_rds_1.DatabaseClusterEngine.auroraPostgres({
87
+ version: aws_rds_1.AuroraPostgresEngineVersion.of("16.6", "16")
88
+ });
89
+ const parameterGroup = new aws_rds_1.ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
90
+ engine,
91
+ description: `Parameter group for ${props.databaseName} with security defaults`,
92
+ parameters: this.engineConfig.sslParameters
43
93
  });
44
- //TODO: Remove this line, that allows the proxy to connect to the database. Replace with seperated security groups
45
- clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(5432));
46
- this.connections = clusterSecurityGroup.connections;
47
- // Database Cluster
48
- const databaseCluster = new aws_rds_1.DatabaseCluster(this, `${id}Database`, {
94
+ const dbClusterProps = {
49
95
  vpc: props.vpc,
50
- vpcSubnets: {
51
- subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
52
- },
96
+ vpcSubnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS },
53
97
  securityGroups: [clusterSecurityGroup],
54
- engine: props.engine ||
55
- aws_rds_1.DatabaseClusterEngine.auroraPostgres({
56
- //TODO: Do we update these when we release a new version? Or try to keep them constantly updated?
57
- version: aws_rds_1.AuroraPostgresEngineVersion.VER_15_6
58
- }),
59
- backup: props.backup || {
60
- retention: aws_cdk_lib_1.Duration.days(14)
61
- },
98
+ engine,
99
+ parameterGroup,
100
+ backup: { retention: aws_cdk_lib_1.Duration.days(props.backupRetention ?? 14) },
62
101
  storageEncrypted: true,
63
- storageEncryptionKey: encryptionKey.key,
102
+ ...(storageEncryptionKey && { storageEncryptionKey }),
64
103
  clusterIdentifier: props.clusterIdentifier?.toLowerCase() ||
65
- `${props.databaseName?.toLowerCase()}-cluster`,
66
- credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret),
67
- defaultDatabaseName: props.databaseName || `${id.replace("Rds", "")}`,
104
+ resourceNaming_1.ResourceNaming.clusterId(props.databaseName || id),
68
105
  monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
69
106
  preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30",
70
- port: props.port || 5432,
107
+ port: this.port,
71
108
  removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
72
- writer: props.writer ||
73
- aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}Writer`, {
74
- enablePerformanceInsights: true,
75
- performanceInsightEncryptionKey: primaryWriterPerformanceInsightsKey.key,
76
- instanceIdentifier: `${props.databaseName}-primary-writer`,
77
- //TODO: Do we update these when we release a new version? Or try to keep them constantly updated?
78
- caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1
79
- }),
80
- readers: props.readers || [
81
- aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}PrimaryReader`, {
82
- scaleWithWriter: true,
83
- enablePerformanceInsights: true,
84
- performanceInsightEncryptionKey: primaryReaderInsightsKey.key,
85
- instanceIdentifier: `${props.databaseName}-primary-reader`,
86
- caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1
87
- }),
88
- aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}SecondaryReader`, {
89
- scaleWithWriter: false,
90
- enablePerformanceInsights: true,
91
- performanceInsightEncryptionKey: secondaryReaderInsightsKey.key,
92
- instanceIdentifier: `${props.databaseName}-secondary-reader`,
93
- caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1
109
+ deletionProtection: true,
110
+ iamAuthentication: true,
111
+ writer,
112
+ readers
113
+ };
114
+ if (!props.isGlobalSecondary) {
115
+ dbClusterProps.credentials = aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret);
116
+ dbClusterProps.defaultDatabaseName =
117
+ props.databaseName || `${id.replace("Rds", "")}`;
118
+ }
119
+ if (props.snapshotIdentifier) {
120
+ // Create from snapshot
121
+ const snapshotProps = {
122
+ ...dbClusterProps,
123
+ snapshotIdentifier: props.snapshotIdentifier
124
+ };
125
+ // For snapshots, override credentials if not a global secondary
126
+ if (!props.isGlobalSecondary) {
127
+ snapshotProps.credentials = aws_rds_1.SnapshotCredentials.fromSecret(this.databaseCredentials.secret);
128
+ }
129
+ this.databaseCluster = new aws_rds_1.DatabaseClusterFromSnapshot(this, `${id}Database`, snapshotProps);
130
+ }
131
+ else {
132
+ // Create new cluster
133
+ this.databaseCluster = new aws_rds_1.DatabaseCluster(this, `${id}Database`, dbClusterProps);
134
+ }
135
+ this.cfnCluster = this.databaseCluster.node.defaultChild;
136
+ // Global secondary clusters can't specify these properties
137
+ if (props.isGlobalSecondary && this.cfnCluster) {
138
+ this.cfnCluster.masterUsername = undefined;
139
+ this.cfnCluster.masterUserPassword = undefined;
140
+ this.cfnCluster.databaseName = undefined;
141
+ }
142
+ const proxyEnabled = props.proxy !== undefined && props.proxy !== false;
143
+ if (proxyEnabled) {
144
+ this.addProxy(props, clusterSecurityGroup);
145
+ }
146
+ // Secret rotation enabled by default (opt-out with secretRotation: false)
147
+ if (!props.isGlobalSecondary) {
148
+ const secretRotationDisabled = props.credentials?.secretRotation === false;
149
+ if (!secretRotationDisabled) {
150
+ this.addSecretRotation(props);
151
+ }
152
+ }
153
+ }
154
+ buildReaders(props, defaultPIEnabled, piKey, piRetention) {
155
+ if (props.readers === false) {
156
+ return [];
157
+ }
158
+ let readerConfigs;
159
+ if (props.readers?.instances) {
160
+ readerConfigs = props.readers.instances;
161
+ }
162
+ else {
163
+ const count = props.readers?.count ?? 1;
164
+ readerConfigs = Array.from({ length: count }, (_, i) => ({
165
+ scaleWithWriter: i === 0
166
+ }));
167
+ }
168
+ const defaultPI = props.readers && "defaultEnablePerformanceInsights" in props.readers
169
+ ? (props.readers.defaultEnablePerformanceInsights ?? defaultPIEnabled)
170
+ : defaultPIEnabled;
171
+ return readerConfigs.map((config, index) => {
172
+ const enablePI = config.enablePerformanceInsights ?? defaultPI;
173
+ const identifier = config.identifierSuffix ?? `reader-${index + 1}`;
174
+ return aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}Reader${index + 1}`, {
175
+ scaleWithWriter: config.scaleWithWriter ?? index === 0,
176
+ enablePerformanceInsights: enablePI,
177
+ performanceInsightEncryptionKey: enablePI ? piKey : undefined,
178
+ performanceInsightRetention: enablePI ? piRetention : undefined,
179
+ instanceIdentifier: resourceNaming_1.ResourceNaming.readerInstanceId(props.databaseName, index + 1, config.identifierSuffix),
180
+ caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
181
+ ...(config.availabilityZone && {
182
+ availabilityZone: config.availabilityZone
94
183
  })
95
- ]
184
+ });
96
185
  });
97
- // Capture the L1 DBCluster (Cfn) for external reference
98
- this.cfnCluster = databaseCluster.node.defaultChild;
186
+ }
187
+ addProxy(props, securityGroup) {
188
+ const proxyConfig = props.proxy;
189
+ const vpcSubnets = proxyConfig.vpcSubnets ?? {
190
+ subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
191
+ };
99
192
  this.databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
100
- proxyTarget: aws_rds_1.ProxyTarget.fromCluster(databaseCluster),
193
+ dbProxyName: resourceNaming_1.ResourceNaming.proxyName(props.databaseName),
194
+ proxyTarget: aws_rds_1.ProxyTarget.fromCluster(this.databaseCluster),
101
195
  secrets: [this.databaseCredentials.secret],
102
- securityGroups: [clusterSecurityGroup],
196
+ securityGroups: [securityGroup],
103
197
  vpc: props.vpc,
104
- vpcSubnets: {
105
- subnetType: aws_ec2_1.SubnetType.PUBLIC
106
- }
198
+ vpcSubnets,
199
+ requireTLS: proxyConfig.requireTLS ?? true,
200
+ borrowTimeout: proxyConfig.connectionBorrowTimeout
201
+ ? aws_cdk_lib_1.Duration.seconds(proxyConfig.connectionBorrowTimeout)
202
+ : aws_cdk_lib_1.Duration.seconds(120),
203
+ maxConnectionsPercent: proxyConfig.maxConnections,
204
+ maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
107
205
  });
108
206
  new aws_cdk_lib_1.CfnOutput(this, `${props.databaseName}ProxyEndpointOutput`, {
109
207
  key: `${props.databaseName}ProxyEndpoint`,
110
208
  exportName: `${props.databaseName}ProxyEndpoint`,
111
209
  value: this.databaseProxy.endpoint
112
210
  });
113
- // Rotate the Secret every 30 days
211
+ }
212
+ addSecretRotation(props) {
213
+ const rotationConfig = props.credentials?.secretRotation;
214
+ const rotationPeriod = (typeof rotationConfig === "object" &&
215
+ rotationConfig?.automaticallyAfter) ||
216
+ aws_cdk_lib_1.Duration.days(30);
114
217
  const masterSecret = new secrets_1.Secret(this, `${props.databaseName}MasterSecret`, {
115
218
  secretName: `${props.databaseName}MasterSecret`
116
219
  });
117
220
  new aws_secretsmanager_1.SecretRotation(this, `${props.databaseName}SecretRotation`, {
118
- application: new aws_secretsmanager_1.SecretRotationApplication("SecretsManagerRDSPostgreSQLRotationMultiUser", "1.1.367", {
119
- isMultiUser: true
120
- }),
221
+ application: new aws_secretsmanager_1.SecretRotationApplication(this.engineConfig.rotationAppName, "1.1.367", { isMultiUser: true }),
121
222
  secret: this.databaseCredentials.secret,
122
223
  masterSecret: masterSecret.secret,
123
- target: databaseCluster,
124
- vpc: databaseCluster.vpc
224
+ target: this.databaseCluster,
225
+ vpc: this.databaseCluster.vpc,
226
+ automaticallyAfter: rotationPeriod
125
227
  });
126
228
  }
127
229
  getHostEndpoint() {
128
- return this.databaseProxy.endpoint;
230
+ // Return proxy endpoint if available, otherwise cluster endpoint
231
+ if (this.databaseProxy) {
232
+ return this.databaseProxy.endpoint;
233
+ }
234
+ return this.databaseCluster.clusterEndpoint.hostname;
129
235
  }
130
236
  getHostPort() {
131
237
  return String(this.port);
@@ -136,6 +242,27 @@ class RdsAurora extends constructs_1.Construct {
136
242
  getCfnCluster() {
137
243
  return this.cfnCluster;
138
244
  }
245
+ getDatabaseCluster() {
246
+ return this.databaseCluster;
247
+ }
248
+ getPerformanceInsightRetention(days) {
249
+ switch (days) {
250
+ case 7:
251
+ return aws_rds_1.PerformanceInsightRetention.DEFAULT;
252
+ case 31:
253
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
254
+ case 93:
255
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_3;
256
+ case 186:
257
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_6;
258
+ case 372:
259
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_12;
260
+ case 731:
261
+ return aws_rds_1.PerformanceInsightRetention.LONG_TERM;
262
+ default:
263
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
264
+ }
265
+ }
139
266
  }
140
267
  exports.RdsAurora = RdsAurora;
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFNNkI7QUFDN0IsaURBWTZCO0FBQzdCLHVFQUd3QztBQUN4QywyQ0FBdUM7QUFDdkMsZ0NBQXVDO0FBQ3ZDLHdDQUF3RDtBQWdCeEQsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFVdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUUvQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksZ0JBQU0sQ0FDbkMsSUFBSSxFQUNKLEdBQUcsS0FBSyxDQUFDLFlBQVksYUFBYSxFQUNsQztZQUNFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLGFBQWE7WUFDOUMsb0JBQW9CLEVBQUU7Z0JBQ3BCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25DLFFBQVEsRUFBRSxVQUFVO2lCQUNyQixDQUFDO2dCQUNGLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixpQkFBaUIsRUFBRSxVQUFVO2FBQzlCO1NBQ0YsQ0FDRixDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLElBQUksNEJBQWtCLENBQzFDLElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxZQUFZLHNCQUFzQixFQUMzQztZQUNFLFNBQVMsRUFBRSxXQUFXLEtBQUssQ0FBQyxZQUFZLGdCQUFnQjtTQUN6RCxDQUNGLENBQUM7UUFFRixNQUFNLHdCQUF3QixHQUFHLElBQUksNEJB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UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBN0xELDhCQTZMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICBJQ29ubmVjdGFibGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQmFja3VwUHJvcHMsXG4gIENhQ2VydGlmaWNhdGUsXG4gIENsdXN0ZXJJbnN0YW5jZSxcbiAgQ3JlZGVudGlhbHMsXG4gIERhdGFiYXNlQ2x1c3RlcixcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIElDbHVzdGVyRW5naW5lLFxuICBQcm94eVRhcmdldFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIGJhY2t1cD86IEJhY2t1cFByb3BzO1xuICBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICB3cml0ZXI/OiBDbHVzdGVySW5zdGFuY2U7XG4gIHJlYWRlcnM/OiBDbHVzdGVySW5zdGFuY2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBwb3J0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5OiBEYXRhYmFzZVByb3h5O1xuICBwcml2YXRlIGRhdGFiYXNlQ3JlZGVudGlhbHM6IFNlY3JldDtcbiAgLy8gRXhwb3NlIHRoZSB1bmRlcmx5aW5nIEwxIERCQ2x1c3RlciBzbyBvdGhlciBjb25zdHJ1Y3RzIGNhbiByZWZlcmVuY2UgaXRcbiAgcHJpdmF0ZSBjZm5DbHVzdGVyPzogQ2ZuREJDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnBvcnQgPSBwcm9wcy5wb3J0IHx8IDU0MzI7XG5cbiAgICAvLyBEYXRhYmFzZSBDcmVkZW50aWFsc1xuICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgIHtcbiAgICAgICAgc2VjcmV0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdXNlcm5hbWU6IFwicG9zdGdyZXNcIlxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBDdXN0b21lciBNYW5hZ2VkIEtleXNcbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBwcmltYXJ5UmVhZGVySW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9QcmltYXJ5UmVhZGVySW5zaWdodHNLZXlgXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2Vjb25kYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9TZWNvbmRhcnlSZWFkZXJJbnNpZ2h0c0tleWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcHJpbWFyeVdyaXRlclBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICB7XG4gICAgICAgIGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L1ByaW1hcnlXcml0ZXJJbnNpZ2h0c0tleWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgY2x1c3RlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIHRoYXQgYWxsb3dzIGluYm91bmQgYWNjZXNzIHRvIHRoZSBwb3N0Z3JlcyBjbHVzdGVyIGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICAvL1RPRE86IFJlbW92ZSB0aGlzIGxpbmUsIHRoYXQgYWxsb3dzIHRoZSBwcm94eSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4gUmVwbGFjZSB3aXRoIHNlcGVyYXRlZCBzZWN1cml0eSBncm91cHNcbiAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShjbHVzdGVyU2VjdXJpdHlHcm91cCwgUG9ydC50Y3AoNTQzMikpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGNsdXN0ZXJTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zO1xuXG4gICAgLy8gRGF0YWJhc2UgQ2x1c3RlclxuICAgIGNvbnN0IGRhdGFiYXNlQ2x1c3RlciA9IG5ldyBEYXRhYmFzZUNsdXN0ZXIodGhpcywgYCR7aWR9RGF0YWJhc2VgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBlbmdpbmU6XG4gICAgICAgIHByb3BzLmVuZ2luZSB8fFxuICAgICAgICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhUG9zdGdyZXMoe1xuICAgICAgICAgIC8vVE9ETzogRG8gd2UgdXBkYXRlIHRoZXNlIHdoZW4gd2UgcmVsZWFzZSBhIG5ldyB2ZXJzaW9uPyBPciB0cnkgdG8ga2VlcCB0aGVtIGNvbnN0YW50bHkgdXBkYXRlZD9cbiAgICAgICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE1XzZcbiAgICAgICAgfSksXG4gICAgICBiYWNrdXA6IHByb3BzLmJhY2t1cCB8fCB7XG4gICAgICAgIHJldGVudGlvbjogRHVyYXRpb24uZGF5cygxNClcbiAgICAgIH0sXG4gICAgICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICAgICAgc3RvcmFnZUVuY3J5cHRpb25LZXk6IGVuY3J5cHRpb25LZXkua2V5LFxuICAgICAgY2x1c3RlcklkZW50aWZpZXI6XG4gICAgICAgIHByb3BzLmNsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZT8udG9Mb3dlckNhc2UoKX0tY2x1c3RlcmAsXG4gICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMuZnJvbVNlY3JldCh0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KSxcbiAgICAgIGRlZmF1bHREYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6XG4gICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCB8fCA1NDMyLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5TTkFQU0hPVCxcbiAgICAgIHdyaXRlcjpcbiAgICAgICAgcHJvcHMud3JpdGVyIHx8XG4gICAgICAgIENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVdyaXRlcmAsIHtcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6XG4gICAgICAgICAgICBwcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktd3JpdGVyYCxcbiAgICAgICAgICAvL1RPRE86IERvIHdlIHVwZGF0ZSB0aGVzZSB3aGVuIHdlIHJlbGVhc2UgYSBuZXcgdmVyc2lvbj8gT3IgdHJ5IHRvIGtlZXAgdGhlbSBjb25zdGFudGx5IHVwZGF0ZWQ/XG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KSxcbiAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMgfHwgW1xuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVyYCwge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHByaW1hcnlSZWFkZXJJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktcmVhZGVyYCxcbiAgICAgICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxXG4gICAgICAgIH0pLFxuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNvbmRhcnlSZWFkZXJgLCB7XG4gICAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBmYWxzZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5LmtleSxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX0tc2Vjb25kYXJ5LXJlYWRlcmAsXG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZSB0aGUgTDEgREJDbHVzdGVyIChDZm4pIGZvciBleHRlcm5hbCByZWZlcmVuY2VcbiAgICB0aGlzLmNmbkNsdXN0ZXIgPSBkYXRhYmFzZUNsdXN0ZXIubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuREJDbHVzdGVyO1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIoZGF0YWJhc2VDbHVzdGVyKSxcbiAgICAgICAgc2VjcmV0czogW3RoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRPdXRwdXRgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIHZhbHVlOiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnRcbiAgICB9KTtcblxuICAgIC8vIFJvdGF0ZSB0aGUgU2VjcmV0IGV2ZXJ5IDMwIGRheXNcbiAgICBjb25zdCBtYXN0ZXJTZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgLCB7XG4gICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YFxuICAgIH0pO1xuXG4gICAgbmV3IFNlY3JldFJvdGF0aW9uKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNyZXRSb3RhdGlvbmAsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiBuZXcgU2VjcmV0Um90YXRpb25BcHBsaWNhdGlvbihcbiAgICAgICAgXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiLFxuICAgICAgICBcIjEuMS4zNjdcIixcbiAgICAgICAge1xuICAgICAgICAgIGlzTXVsdGlVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBzZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICBtYXN0ZXJTZWNyZXQ6IG1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IGRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIHZwYzogZGF0YWJhc2VDbHVzdGVyLnZwY1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludDtcbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0Q2ZuQ2x1c3RlcigpOiBDZm5EQkNsdXN0ZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNmbkNsdXN0ZXI7XG4gIH1cbn1cbiJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFNNkI7QUFDN0IsaURBZ0I2QjtBQUM3Qix1RUFHd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLGdDQUF1QztBQUN2Qyx3Q0FBd0Q7QUFDeEQsa0VBQStEO0FBQy9ELDZEQVd3QztBQXlCeEMsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFVdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUVoQyw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJO1lBQ3hDLGVBQWUsRUFBRSxVQUFVO1lBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDdkMsZUFBZSxFQUFFLDhDQUE4QztTQUNoRSxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixLQUFLLEtBQUssQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FDWixTQUFTLElBQUksT0FBTyxLQUFLLENBQUMsbUJBQW1CLEtBQUssUUFBUTtZQUN4RCxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO1FBRW5FLDZFQUE2RTtRQUM3RSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FB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bUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVPLDhCQUE4QixDQUNwQyxJQUFhO1FBRWIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQztnQkFDSixPQUFPLHFDQUEyQixDQUFDLE9BQU8sQ0FBQztZQUM3QyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxxQ0FBMkIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxFQUFFO2dCQUNMLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1lBQzlDLEtBQUssR0FBRztnQkFDTixPQUFPLHFDQUEyQixDQUFDLFFBQVEsQ0FBQztZQUM5QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxxQ0FBMkIsQ0FBQyxTQUFTLENBQUM7WUFDL0MsS0FBSyxHQUFHO2dCQUNOLE9BQU8scUNBQTJCLENBQUMsU0FBUyxDQUFDO1lBQy9DO2dCQUNFLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4WEQsOEJBd1hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQ2FDZXJ0aWZpY2F0ZSxcbiAgQ2x1c3Rlckluc3RhbmNlLFxuICBDcmVkZW50aWFscyxcbiAgRGF0YWJhc2VDbHVzdGVyLFxuICBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3QsXG4gIERhdGFiYXNlQ2x1c3RlckVuZ2luZSxcbiAgdHlwZSBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIHR5cGUgSUNsdXN0ZXJFbmdpbmUsXG4gIHR5cGUgSUNsdXN0ZXJJbnN0YW5jZSxcbiAgUGFyYW1ldGVyR3JvdXAsXG4gIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbixcbiAgUHJveHlUYXJnZXQsXG4gIFNuYXBzaG90Q3JlZGVudGlhbHNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7XG4gIFNlY3JldFJvdGF0aW9uLFxuICBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW5naW5lQ29uZmlnLFxuICB0eXBlIFByb3h5Q29uZmlnLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICB0eXBlIEF1cm9yYUVuY3J5cHRpb25Db25maWcsXG4gIHR5cGUgQXVyb3JhV3JpdGVyQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlcnNDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyQ29uZmlnLFxuICB0eXBlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcsXG4gIGlzQXdzTWFuYWdlZEtleSxcbiAgaXNDTUtSZXF1ZXN0ZWRcbn0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9kYXRhYmFzZVwiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIGVuZ2luZUNvbmZpZz86IEVuZ2luZUNvbmZpZztcbiAgY2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBTa2lwcyBzZWNyZXQgcm90YXRpb24gZm9yIHNlY29uZGFyeSBjbHVzdGVycyBpbiBnbG9iYWwgZGF0YWJhc2UgKi9cbiAgaXNHbG9iYWxTZWNvbmRhcnk/OiBib29sZWFuO1xuICBzZWNyZXRSZXBsaWNhUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbmdpbmVDb25maWc6IEVuZ2luZUNvbmZpZztcbiAgcHJpdmF0ZSBkYXRhYmFzZUNsdXN0ZXI6IERhdGFiYXNlQ2x1c3RlcjtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5PzogRGF0YWJhc2VQcm94eTtcbiAgcHJpdmF0ZSBkYXRhYmFzZUNyZWRlbnRpYWxzOiBTZWNyZXQ7XG4gIHByaXZhdGUgY2ZuQ2x1c3Rlcj86IENmbkRCQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wb3J0ID0gcHJvcHMucG9ydCA/PyAzNTI1NTtcblxuICAgIC8vIFBvc3RncmVTUUwgZmFsbGJhY2sgZm9yIGRpcmVjdCB1c2FnZSAtIGVuc3VyZSBlbmdpbmUgYW5kIGVuZ2luZUNvbmZpZyBtYXRjaFxuICAgIHRoaXMuZW5naW5lQ29uZmlnID0gcHJvcHMuZW5naW5lQ29uZmlnID8/IHtcbiAgICAgIGRlZmF1bHRVc2VybmFtZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG4gICAgfTtcblxuICAgIGNvbnN0IHBpRW5hYmxlZCA9IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHBpQ29uZmlnID1cbiAgICAgIHBpRW5hYmxlZCAmJiB0eXBlb2YgcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB1c2VybmFtZSA9XG4gICAgICBwcm9wcy5jcmVkZW50aWFscz8udXNlcm5hbWUgPz8gdGhpcy5lbmdpbmVDb25maWcuZGVmYXVsdFVzZXJuYW1lO1xuXG4gICAgLy8gR2xvYmFsIHNlY29uZGFyeSBjbHVzdGVycyBpbXBvcnQgcmVwbGljYXRlZCBzZWNyZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBuZXdcbiAgICBpZiAocHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q3JlZGVudGlhbHNgLFxuICAgICAgICAgIGltcG9ydEV4aXN0aW5nOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q3JlZGVudGlhbHNgLFxuICAgICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZSB9KSxcbiAgICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGluY2x1ZGVTcGFjZTogZmFsc2UsXG4gICAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXBsaWNhUmVnaW9uczogcHJvcHMuc2VjcmV0UmVwbGljYVJlZ2lvbnNcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yYWdlRW5jcnlwdGlvbktleSA9IGlzQ01LUmVxdWVzdGVkKHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXkpXG4gICAgICA/IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAgICAgIHsgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vZW5jcnlwdGlvbktleWAgfVxuICAgICAgICApLmtleVxuICAgICAgOiBpc0F3c01hbmFnZWRLZXkocHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleSkgfHxcbiAgICAgICAgICBwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWQgLy8gQVdTIE1hbmFnZWQgKGRlZmF1bHQpXG4gICAgICAgIDogcHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleTsgLy8gVXNlIHByb3ZpZGVkIElLZXlcblxuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPVxuICAgICAgcGlFbmFibGVkICYmIGlzQ01LUmVxdWVzdGVkKHBpQ29uZmlnPy5lbmNyeXB0aW9uS2V5KVxuICAgICAgICA/IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBlcmZvcm1hbmNlSW5zaWdodHNLZXlgLFxuICAgICAgICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9JbnNpZ2h0c0tleWAgfVxuICAgICAgICAgICkua2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2x1c3RlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBBdXJvcmEgY2x1c3RlciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3AodGhpcy5wb3J0KVxuICAgICk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbY2x1c3RlclNlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQ6IFBvcnQudGNwKHRoaXMucG9ydClcbiAgICB9KTtcblxuICAgIGNvbnN0IHdyaXRlckNvbmZpZyA9IHByb3BzLndyaXRlciA/PyB7fTtcbiAgICBjb25zdCB3cml0ZXJQSSA9IHdyaXRlckNvbmZpZy5lbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IHBpRW5hYmxlZDtcbiAgICBjb25zdCB3cml0ZXJTdWZmaXggPSB3cml0ZXJDb25maWcuaWRlbnRpZmllclN1ZmZpeCA/PyBcInByaW1hcnktd3JpdGVyXCI7XG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbiA9IHRoaXMuZ2V0UGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uKFxuICAgICAgcGlDb25maWc/LnJldGVudGlvblBlcmlvZCA/PyA3XG4gICAgKTtcbiAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBwcm9wcy5kYXRhYmFzZU5hbWUgfHwgaWQ7XG5cbiAgICBjb25zdCB3cml0ZXIgPSBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke2RhdGFiYXNlTmFtZX1Xcml0ZXJgLCB7XG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB3cml0ZXJQSSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHdyaXRlclBJXG4gICAgICAgID8gcGVyZm9ybWFuY2VJbnNpZ2h0c0tleVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogd3JpdGVyUElcbiAgICAgICAgPyBwZXJmb3JtYW5jZUluc2lnaHRzUmV0ZW50aW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy53cml0ZXJJbnN0YW5jZUlkKFxuICAgICAgICBkYXRhYmFzZU5hbWUsXG4gICAgICAgIHdyaXRlclN1ZmZpeFxuICAgICAgKSxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAuLi4od3JpdGVyQ29uZmlnLmF2YWlsYWJpbGl0eVpvbmUgJiYge1xuICAgICAgICBhdmFpbGFiaWxpdHlab25lOiB3cml0ZXJDb25maWcuYXZhaWxhYmlsaXR5Wm9uZVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLmJ1aWxkUmVhZGVycyhcbiAgICAgIHByb3BzLFxuICAgICAgcGlFbmFibGVkLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0c0tleSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25cbiAgICApO1xuXG4gICAgY29uc3QgZW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSB8fFxuICAgICAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgICAgdmVyc2lvbjogQXVyb3JhUG9zdGdyZXNFbmdpbmVWZXJzaW9uLm9mKFwiMTYuNlwiLCBcIjE2XCIpXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHBhcmFtZXRlckdyb3VwID0gbmV3IFBhcmFtZXRlckdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QYXJhbWV0ZXJHcm91cGAsXG4gICAgICB7XG4gICAgICAgIGVuZ2luZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXJhbWV0ZXIgZ3JvdXAgZm9yICR7cHJvcHMuZGF0YWJhc2VOYW1lfSB3aXRoIHNlY3VyaXR5IGRlZmF1bHRzYCxcbiAgICAgICAgcGFyYW1ldGVyczogdGhpcy5lbmdpbmVDb25maWcuc3NsUGFyYW1ldGVyc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBkYkNsdXN0ZXJQcm9wczogYW55ID0ge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9LFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBlbmdpbmUsXG4gICAgICBwYXJhbWV0ZXJHcm91cCxcbiAgICAgIGJhY2t1cDogeyByZXRlbnRpb246IER1cmF0aW9uLmRheXMocHJvcHMuYmFja3VwUmV0ZW50aW9uID8/IDE0KSB9LFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIC4uLihzdG9yYWdlRW5jcnlwdGlvbktleSAmJiB7IHN0b3JhZ2VFbmNyeXB0aW9uS2V5IH0pLFxuICAgICAgY2x1c3RlcklkZW50aWZpZXI6XG4gICAgICAgIHByb3BzLmNsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgIFJlc291cmNlTmFtaW5nLmNsdXN0ZXJJZChwcm9wcy5kYXRhYmFzZU5hbWUgfHwgaWQpLFxuICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwgfHwgRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fCBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIixcbiAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuU05BUFNIT1QsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHRydWUsXG4gICAgICBpYW1BdXRoZW50aWNhdGlvbjogdHJ1ZSxcbiAgICAgIHdyaXRlcixcbiAgICAgIHJlYWRlcnNcbiAgICB9O1xuXG4gICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgZGJDbHVzdGVyUHJvcHMuY3JlZGVudGlhbHMgPSBDcmVkZW50aWFscy5mcm9tU2VjcmV0KFxuICAgICAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XG4gICAgICApO1xuICAgICAgZGJDbHVzdGVyUHJvcHMuZGVmYXVsdERhdGFiYXNlTmFtZSA9XG4gICAgICAgIHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWA7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNuYXBzaG90SWRlbnRpZmllcikge1xuICAgICAgLy8gQ3JlYXRlIGZyb20gc25hcHNob3RcbiAgICAgIGNvbnN0IHNuYXBzaG90UHJvcHMgPSB7XG4gICAgICAgIC4uLmRiQ2x1c3RlclByb3BzLFxuICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllclxuICAgICAgfTtcblxuICAgICAgLy8gRm9yIHNuYXBzaG90cywgb3ZlcnJpZGUgY3JlZGVudGlhbHMgaWYgbm90IGEgZ2xvYmFsIHNlY29uZGFyeVxuICAgICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgICBzbmFwc2hvdFByb3BzLmNyZWRlbnRpYWxzID0gU25hcHNob3RDcmVkZW50aWFscy5mcm9tU2VjcmV0KFxuICAgICAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyRnJvbVNuYXBzaG90KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICAgIHNuYXBzaG90UHJvcHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgY2x1c3RlclxuICAgICAgdGhpcy5kYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICAgIGRiQ2x1c3RlclByb3BzXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY2ZuQ2x1c3RlciA9IHRoaXMuZGF0YWJhc2VDbHVzdGVyLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkRCQ2x1c3RlcjtcblxuICAgIC8vIEdsb2JhbCBzZWNvbmRhcnkgY2x1c3RlcnMgY2FuJ3Qgc3BlY2lmeSB0aGVzZSBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BzLmlzR2xvYmFsU2Vjb25kYXJ5ICYmIHRoaXMuY2ZuQ2x1c3Rlcikge1xuICAgICAgdGhpcy5jZm5DbHVzdGVyLm1hc3RlclVzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jZm5DbHVzdGVyLm1hc3RlclVzZXJQYXNzd29yZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5kYXRhYmFzZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFbmFibGVkID0gcHJvcHMucHJveHkgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5wcm94eSAhPT0gZmFsc2U7XG4gICAgaWYgKHByb3h5RW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRQcm94eShwcm9wcywgY2x1c3RlclNlY3VyaXR5R3JvdXApO1xuICAgIH1cblxuICAgIC8vIFNlY3JldCByb3RhdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQgKG9wdC1vdXQgd2l0aCBzZWNyZXRSb3RhdGlvbjogZmFsc2UpXG4gICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgY29uc3Qgc2VjcmV0Um90YXRpb25EaXNhYmxlZCA9XG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbiA9PT0gZmFsc2U7XG4gICAgICBpZiAoIXNlY3JldFJvdGF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5hZGRTZWNyZXRSb3RhdGlvbihwcm9wcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlYWRlcnMoXG4gICAgcHJvcHM6IFJkc1Byb3BzLFxuICAgIGRlZmF1bHRQSUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgcGlLZXk/OiBhbnksXG4gICAgcGlSZXRlbnRpb24/OiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb25cbiAgKTogSUNsdXN0ZXJJbnN0YW5jZVtdIHtcbiAgICBpZiAocHJvcHMucmVhZGVycyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgcmVhZGVyQ29uZmlnczogQXVyb3JhUmVhZGVyQ29uZmlnW107XG4gICAgaWYgKHByb3BzLnJlYWRlcnM/Lmluc3RhbmNlcykge1xuICAgICAgcmVhZGVyQ29uZmlncyA9IHByb3BzLnJlYWRlcnMuaW5zdGFuY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb3VudCA9IHByb3BzLnJlYWRlcnM/LmNvdW50ID8/IDE7XG4gICAgICByZWFkZXJDb25maWdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgIHNjYWxlV2l0aFdyaXRlcjogaSA9PT0gMFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRQSSA9XG4gICAgICBwcm9wcy5yZWFkZXJzICYmIFwiZGVmYXVsdEVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHNcIiBpbiBwcm9wcy5yZWFkZXJzXG4gICAgICAgID8gKHByb3BzLnJlYWRlcnMuZGVmYXVsdEVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHMgPz8gZGVmYXVsdFBJRW5hYmxlZClcbiAgICAgICAgOiBkZWZhdWx0UElFbmFibGVkO1xuXG4gICAgcmV0dXJuIHJlYWRlckNvbmZpZ3MubWFwKChjb25maWcsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBlbmFibGVQSSA9IGNvbmZpZy5lbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IGRlZmF1bHRQSTtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjb25maWcuaWRlbnRpZmllclN1ZmZpeCA/PyBgcmVhZGVyLSR7aW5kZXggKyAxfWA7XG5cbiAgICAgIHJldHVybiBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZGVyJHtpbmRleCArIDF9YCxcbiAgICAgICAge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogY29uZmlnLnNjYWxlV2l0aFdyaXRlciA/PyBpbmRleCA9PT0gMCxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBlbmFibGVQSSxcbiAgICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiBlbmFibGVQSSA/IHBpS2V5IDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogZW5hYmxlUEkgPyBwaVJldGVudGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLnJlYWRlckluc3RhbmNlSWQoXG4gICAgICAgICAgICBwcm9wcy5kYXRhYmFzZU5hbWUhLFxuICAgICAgICAgICAgaW5kZXggKyAxLFxuICAgICAgICAgICAgY29uZmlnLmlkZW50aWZpZXJTdWZmaXhcbiAgICAgICAgICApLFxuICAgICAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAgICAgLi4uKGNvbmZpZy5hdmFpbGFiaWxpdHlab25lICYmIHtcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGNvbmZpZy5hdmFpbGFiaWxpdHlab25lXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHJveHkocHJvcHM6IFJkc1Byb3BzLCBzZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgcHJveHlDb25maWcgPSBwcm9wcy5wcm94eSBhcyBQcm94eUNvbmZpZztcbiAgICBjb25zdCB2cGNTdWJuZXRzID0gcHJveHlDb25maWcudnBjU3VibmV0cyA/PyB7XG4gICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBkYlByb3h5TmFtZTogUmVzb3VyY2VOYW1pbmcucHJveHlOYW1lKHByb3BzLmRhdGFiYXNlTmFtZSEpLFxuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIodGhpcy5kYXRhYmFzZUNsdXN0ZXIpLFxuICAgICAgICBzZWNyZXRzOiBbdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldF0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbc2VjdXJpdHlHcm91cF0sXG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzLFxuICAgICAgICByZXF1aXJlVExTOiBwcm94eUNvbmZpZy5yZXF1aXJlVExTID8/IHRydWUsXG4gICAgICAgIGJvcnJvd1RpbWVvdXQ6IHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0XG4gICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0KVxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtYXhDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heENvbm5lY3Rpb25zLFxuICAgICAgICBtYXhJZGxlQ29ubmVjdGlvbnNQZXJjZW50OiBwcm94eUNvbmZpZy5tYXhJZGxlQ29ubmVjdGlvbnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZWNyZXRSb3RhdGlvbihwcm9wczogUmRzUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbjtcbiAgICBjb25zdCByb3RhdGlvblBlcmlvZCA9XG4gICAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHJvdGF0aW9uQ29uZmlnPy5hdXRvbWF0aWNhbGx5QWZ0ZXIpIHx8XG4gICAgICBEdXJhdGlvbi5kYXlzKDMwKTtcblxuICAgIGNvbnN0IG1hc3RlclNlY3JldCA9IG5ldyBTZWNyZXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfU1hc3RlclNlY3JldGAsIHtcbiAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgXG4gICAgfSk7XG5cbiAgICBuZXcgU2VjcmV0Um90YXRpb24odGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVNlY3JldFJvdGF0aW9uYCwge1xuICAgICAgYXBwbGljYXRpb246IG5ldyBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uKFxuICAgICAgICB0aGlzLmVuZ2luZUNvbmZpZy5yb3RhdGlvbkFwcE5hbWUsXG4gICAgICAgIFwiMS4xLjM2N1wiLFxuICAgICAgICB7IGlzTXVsdGlVc2VyOiB0cnVlIH1cbiAgICAgICksXG4gICAgICBzZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICBtYXN0ZXJTZWNyZXQ6IG1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YWJhc2VDbHVzdGVyLFxuICAgICAgdnBjOiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci52cGMsXG4gICAgICBhdXRvbWF0aWNhbGx5QWZ0ZXI6IHJvdGF0aW9uUGVyaW9kXG4gICAgfSk7XG4gIH1cblxuICBnZXRIb3N0RW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICAvLyBSZXR1cm4gcHJveHkgZW5kcG9pbnQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2x1c3RlciBlbmRwb2ludFxuICAgIGlmICh0aGlzLmRhdGFiYXNlUHJveHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWU7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5wb3J0KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscztcbiAgfVxuXG4gIGdldENmbkNsdXN0ZXIoKTogQ2ZuREJDbHVzdGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZm5DbHVzdGVyO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VDbHVzdGVyKCk6IERhdGFiYXNlQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDbHVzdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24oXG4gICAgZGF5cz86IG51bWJlclxuICApOiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24ge1xuICAgIHN3aXRjaCAoZGF5cykge1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLkRFRkFVTFQ7XG4gICAgICBjYXNlIDMxOlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18xO1xuICAgICAgY2FzZSA5MzpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMztcbiAgICAgIGNhc2UgMTg2OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU182O1xuICAgICAgY2FzZSAzNzI6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzEyO1xuICAgICAgY2FzZSA3MzE6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTE9OR19URVJNO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,16 +1,51 @@
1
+ import { type Duration } from "aws-cdk-lib";
1
2
  import { Construct } from "constructs";
2
- import { IVpc, Connections, IConnectable } from "aws-cdk-lib/aws-ec2";
3
- import { IClusterEngine } from "aws-cdk-lib/aws-rds";
4
- import { Secret } from "../secrets";
3
+ import { type IVpc, type Connections, type IConnectable } from "aws-cdk-lib/aws-ec2";
4
+ import { type IClusterEngine } from "aws-cdk-lib/aws-rds";
5
+ import { type Secret } from "../secrets";
6
+ import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type PerformanceInsightsConfig } from "../../../patterns/aws/database";
5
7
  interface RdsAuroraGlobalProps {
6
8
  vpc: IVpc;
7
9
  databaseName: string;
8
- /** primary region where the initial cluster & global cluster resource are created */
10
+ /** Primary region where the initial cluster & global cluster resource are created */
9
11
  primaryRegion: string;
10
- /** optional deterministic id for the global cluster (should be shared across stacks/regions) */
12
+ /** Secondary regions where Aurora clusters will be deployed (for secret replication) */
13
+ secondaryRegions?: string[];
14
+ /** Optional deterministic id for the global cluster (should be shared across stacks/regions) */
11
15
  globalClusterIdentifier?: string;
12
- /** optional engine to forward to the underlying cluster */
16
+ /** Optional engine to forward to the underlying cluster */
13
17
  engine?: IClusterEngine;
18
+ /** Engine-specific configuration (username, SSL params, rotation app) */
19
+ engineConfig?: EngineConfig;
20
+ /** Enable write forwarding on secondary clusters to forward writes to primary region */
21
+ enableGlobalWriteForwarding?: boolean;
22
+ /** Writer instance configuration */
23
+ writer?: AuroraWriterConfig;
24
+ /**
25
+ * Reader instances configuration.
26
+ * - `{ count: N }` - Simple: N readers with defaults
27
+ * - `{ instances: [...] }` - Advanced: per-reader config
28
+ * - `false` - Explicitly disable readers (writer-only cluster)
29
+ * - Omit - Default: 1 reader
30
+ */
31
+ readers?: AuroraReadersConfig | false;
32
+ /** RDS Proxy configuration. Omit = no proxy, {} = defaults, false = disabled */
33
+ proxy?: ProxyConfig | false;
34
+ /** Credentials configuration including username and secret rotation */
35
+ credentials?: CredentialsConfig;
36
+ /** Encryption configuration */
37
+ encryption?: AuroraEncryptionConfig;
38
+ /** Backup retention in days. Default: 14 */
39
+ backupRetention?: number;
40
+ /** CloudWatch monitoring interval. Default: 1 minute */
41
+ monitoringInterval?: Duration;
42
+ /** Preferred maintenance window. Default: "Sat:12:30-Sat:20:30" */
43
+ preferredMaintenanceWindow?: string;
44
+ /** Database port. Default: 35255 (FJALL on phone keypad) */
45
+ port?: number;
46
+ performanceInsights?: PerformanceInsightsConfig | false;
47
+ /** ARN or identifier of DB cluster snapshot to restore from */
48
+ snapshotIdentifier?: string;
14
49
  }
15
50
  export declare class RdsAuroraGlobal extends Construct implements IConnectable {
16
51
  connections: Connections;