@fjall/components-infrastructure 0.89.5 → 0.94.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.
- package/LICENSE +50 -21
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -18
- package/dist/lib/app.d.ts +12 -12
- package/dist/lib/app.js +61 -56
- package/dist/lib/aspects/index.d.ts +1 -1
- package/dist/lib/aspects/index.js +1 -6
- package/dist/lib/aspects/resourceInventory.js +6 -13
- package/dist/lib/config/audit.js +1 -5
- package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
- package/dist/lib/config/aws/accessAnalyser.js +17 -0
- package/dist/lib/config/aws/accountAuditRole.js +11 -15
- package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
- package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
- package/dist/lib/config/aws/alarmTopic.js +19 -0
- package/dist/lib/config/aws/cloudTrail.js +4 -9
- package/dist/lib/config/aws/configRecorder.d.ts +16 -0
- package/dist/lib/config/aws/configRecorder.js +51 -0
- package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
- package/dist/lib/config/aws/configRulePreset.js +62 -0
- package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
- package/dist/lib/config/aws/disasterRecovery.js +56 -73
- package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
- package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
- package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
- package/dist/lib/config/aws/eventBus.js +8 -11
- package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
- package/dist/lib/config/aws/guardDutyDetector.js +26 -0
- package/dist/lib/config/aws/identityCenter.d.ts +1 -1
- package/dist/lib/config/aws/identityCenter.js +23 -25
- package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
- package/dist/lib/config/aws/index.d.ts +19 -8
- package/dist/lib/config/aws/index.js +19 -25
- package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
- package/dist/lib/config/aws/inspectorEnablement.js +51 -0
- package/dist/lib/config/aws/ipam.js +9 -13
- package/dist/lib/config/aws/oidcConnector.js +8 -12
- package/dist/lib/config/aws/platform.js +1 -5
- package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
- package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
- package/dist/lib/config/aws/scpPreset.d.ts +21 -0
- package/dist/lib/config/aws/scpPreset.js +311 -0
- package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
- package/dist/lib/config/aws/securityBaseline.js +27 -0
- package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
- package/dist/lib/config/aws/securityHubHub.js +28 -0
- package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
- package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
- package/dist/lib/config/index.d.ts +2 -2
- package/dist/lib/config/index.js +2 -21
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.js +5 -26
- package/dist/lib/patterns/aws/account.d.ts +17 -1
- package/dist/lib/patterns/aws/account.js +60 -33
- package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
- package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
- package/dist/lib/patterns/aws/auditRole.js +13 -16
- package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
- package/dist/lib/patterns/aws/buildkite.js +70 -75
- package/dist/lib/patterns/aws/cdn.d.ts +5 -5
- package/dist/lib/patterns/aws/cdn.js +22 -28
- package/dist/lib/patterns/aws/compute.d.ts +1 -1
- package/dist/lib/patterns/aws/compute.js +31 -44
- package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
- package/dist/lib/patterns/aws/computeEc2.js +11 -14
- package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
- package/dist/lib/patterns/aws/computeEcs.js +41 -31
- package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
- package/dist/lib/patterns/aws/computeLambda.js +24 -31
- package/dist/lib/patterns/aws/database.d.ts +16 -7
- package/dist/lib/patterns/aws/database.js +81 -73
- package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
- package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
- package/dist/lib/patterns/aws/domain.d.ts +32 -0
- package/dist/lib/patterns/aws/domain.js +115 -0
- package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
- package/dist/lib/patterns/aws/domainDelegation.js +28 -37
- package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
- package/dist/lib/patterns/aws/domainFactory.js +48 -10
- package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
- package/dist/lib/patterns/aws/domainValidation.js +145 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
- package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
- package/dist/lib/patterns/aws/index.d.ts +21 -19
- package/dist/lib/patterns/aws/index.js +25 -36
- package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
- package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
- package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
- package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/database.js +6 -15
- package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
- package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
- package/dist/lib/patterns/aws/interfaces/index.js +8 -41
- package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
- package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
- package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
- package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
- package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
- package/dist/lib/patterns/aws/messaging.d.ts +7 -7
- package/dist/lib/patterns/aws/messaging.js +22 -33
- package/dist/lib/patterns/aws/network.d.ts +2 -2
- package/dist/lib/patterns/aws/network.js +9 -14
- package/dist/lib/patterns/aws/organisation.d.ts +6 -2
- package/dist/lib/patterns/aws/organisation.js +34 -35
- package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
- package/dist/lib/patterns/aws/organisationFactory.js +7 -12
- package/dist/lib/patterns/aws/pattern.js +6 -12
- package/dist/lib/patterns/aws/payload.js +73 -63
- package/dist/lib/patterns/aws/platform.d.ts +6 -3
- package/dist/lib/patterns/aws/platform.js +15 -15
- package/dist/lib/patterns/aws/storage.d.ts +6 -4
- package/dist/lib/patterns/aws/storage.js +35 -40
- package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
- package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
- package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
- package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
- package/dist/lib/patterns/aws/targets/index.js +2 -0
- package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
- package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
- package/dist/lib/patterns/index.d.ts +1 -0
- package/dist/lib/patterns/index.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
- package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
- package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
- package/dist/lib/resources/aws/analytics/index.js +1 -0
- package/dist/lib/resources/aws/audit/auditRole.js +10 -15
- package/dist/lib/resources/aws/audit/index.d.ts +1 -1
- package/dist/lib/resources/aws/audit/index.js +1 -6
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
- package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupVault.js +13 -15
- package/dist/lib/resources/aws/backup/index.d.ts +2 -2
- package/dist/lib/resources/aws/backup/index.js +2 -19
- package/dist/lib/resources/aws/base/awsStack.js +17 -19
- package/dist/lib/resources/aws/base/index.d.ts +1 -1
- package/dist/lib/resources/aws/base/index.js +1 -18
- package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
- package/dist/lib/resources/aws/cdn/index.js +1 -18
- package/dist/lib/resources/aws/compute/ec2.js +39 -39
- package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
- package/dist/lib/resources/aws/compute/ecs.js +105 -976
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
- package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
- package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
- package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
- package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
- package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
- package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
- package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
- package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
- package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
- package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
- package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
- package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
- package/dist/lib/resources/aws/compute/index.d.ts +3 -3
- package/dist/lib/resources/aws/compute/index.js +3 -20
- package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
- package/dist/lib/resources/aws/compute/lambda.js +81 -71
- package/dist/lib/resources/aws/database/dynamodb.js +24 -27
- package/dist/lib/resources/aws/database/index.d.ts +7 -7
- package/dist/lib/resources/aws/database/index.js +14 -33
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
- package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
- package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
- package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
- package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
- package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
- package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
- package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
- package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
- package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
- package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
- package/dist/lib/resources/aws/iam/index.d.ts +5 -4
- package/dist/lib/resources/aws/iam/index.js +5 -21
- package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
- package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
- package/dist/lib/resources/aws/iam/policy.js +2 -7
- package/dist/lib/resources/aws/iam/role.js +2 -7
- package/dist/lib/resources/aws/index.d.ts +7 -7
- package/dist/lib/resources/aws/index.js +7 -24
- package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
- package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
- package/dist/lib/resources/aws/logging/index.d.ts +2 -2
- package/dist/lib/resources/aws/logging/index.js +2 -19
- package/dist/lib/resources/aws/logging/logGroup.js +4 -10
- package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
- package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
- package/dist/lib/resources/aws/messaging/index.js +4 -21
- package/dist/lib/resources/aws/messaging/sns.js +11 -14
- package/dist/lib/resources/aws/messaging/sqs.js +32 -34
- package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
- package/dist/lib/resources/aws/messaging/utils.js +1 -6
- package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
- package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
- package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
- package/dist/lib/resources/aws/monitoring/index.js +4 -5
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
- package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
- package/dist/lib/resources/aws/networking/domain.js +32 -34
- package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
- package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
- package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
- package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
- package/dist/lib/resources/aws/networking/index.d.ts +8 -7
- package/dist/lib/resources/aws/networking/index.js +8 -24
- package/dist/lib/resources/aws/networking/ipam.js +2 -7
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
- package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
- package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
- package/dist/lib/resources/aws/networking/vpc.js +17 -21
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
- package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
- package/dist/lib/resources/aws/organisation/index.js +4 -12
- package/dist/lib/resources/aws/organisation/organisation.js +5 -7
- package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
- package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
- package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
- package/dist/lib/resources/aws/secrets/alias.js +2 -7
- package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
- package/dist/lib/resources/aws/secrets/index.js +4 -21
- package/dist/lib/resources/aws/secrets/kms.js +15 -18
- package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
- package/dist/lib/resources/aws/secrets/parameter.js +19 -22
- package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
- package/dist/lib/resources/aws/secrets/secret.js +12 -14
- package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
- package/dist/lib/resources/aws/storage/ecr.js +7 -13
- package/dist/lib/resources/aws/storage/index.d.ts +2 -2
- package/dist/lib/resources/aws/storage/index.js +2 -19
- package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
- package/dist/lib/resources/aws/storage/s3.js +24 -12
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
- package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
- package/dist/lib/resources/aws/utilities/customResource.js +14 -17
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
- package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
- package/dist/lib/resources/aws/utilities/index.js +5 -22
- package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
- package/dist/lib/resources/index.d.ts +1 -1
- package/dist/lib/resources/index.js +1 -18
- package/dist/lib/types.js +1 -3
- package/dist/lib/utils/accountsUtils.d.ts +5 -0
- package/dist/lib/utils/accountsUtils.js +18 -0
- package/dist/lib/utils/addSuffixToEmail.js +1 -5
- package/dist/lib/utils/backupTierMapping.js +2 -6
- package/dist/lib/utils/capitaliseString.js +1 -10
- package/dist/lib/utils/connections.js +9 -13
- package/dist/lib/utils/connector.js +10 -23
- package/dist/lib/utils/constructMap.d.ts +33 -0
- package/dist/lib/utils/constructMap.js +154 -0
- package/dist/lib/utils/databaseTypes.js +4 -10
- package/dist/lib/utils/dnsRecords.d.ts +1 -1
- package/dist/lib/utils/dnsRecords.js +23 -27
- package/dist/lib/utils/domainTypes.d.ts +0 -1
- package/dist/lib/utils/domainTypes.js +2 -10
- package/dist/lib/utils/env.js +14 -26
- package/dist/lib/utils/getAccountId.js +3 -7
- package/dist/lib/utils/getAsync.js +7 -10
- package/dist/lib/utils/getConfig.d.ts +0 -2
- package/dist/lib/utils/getConfig.js +29 -47
- package/dist/lib/utils/getStackOutput.js +4 -8
- package/dist/lib/utils/index.d.ts +12 -12
- package/dist/lib/utils/index.js +12 -29
- package/dist/lib/utils/manifestWriter.d.ts +14 -3
- package/dist/lib/utils/manifestWriter.js +60 -43
- package/dist/lib/utils/orgConfigParser.d.ts +14 -0
- package/dist/lib/utils/orgConfigParser.js +49 -0
- package/dist/lib/utils/removalPolicy.js +5 -9
- package/dist/lib/utils/resourceNaming.js +11 -16
- package/dist/lib/utils/standardTagsAspect.js +9 -16
- package/dist/lib/utils/stripAndCamelCase.js +1 -5
- package/dist/lib/utils/validationLogger.js +12 -18
- package/dist/lib/utils/vpcUtils.js +5 -10
- package/package.json +25 -8
- package/dist/lib/config/aws/accountId.d.ts +0 -6
- package/dist/lib/config/aws/accountId.js +0 -32
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
- package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
- package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
- package/dist/lib/config/aws/costAllocationTags.js +0 -47
- package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
- package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
- package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
- package/dist/lib/config/aws/ipamPoolId.js +0 -42
- package/dist/lib/config/aws/organisation.d.ts +0 -30
- package/dist/lib/config/aws/organisation.js +0 -92
- package/dist/lib/config/aws/organisationId.d.ts +0 -7
- package/dist/lib/config/aws/organisationId.js +0 -45
- package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
- package/dist/lib/config/aws/organisationsAccess.js +0 -49
- package/dist/lib/config/aws/ramSharing.d.ts +0 -4
- package/dist/lib/config/aws/ramSharing.js +0 -34
- package/dist/lib/config/monitoring.d.ts +0 -18
- package/dist/lib/config/monitoring.js +0 -22
- package/dist/lib/patterns/aws/connections.d.ts +0 -46
- package/dist/lib/patterns/aws/connections.js +0 -159
- package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
- package/dist/lib/patterns/aws/hostedZone.js +0 -150
- package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
- package/dist/lib/patterns/aws/managedAccount.js +0 -55
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
- package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
- package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
- package/dist/lib/patterns/aws/managedPlatform.js +0 -29
- package/dist/lib/resources/aws/database/database.d.ts +0 -14
- package/dist/lib/resources/aws/database/database.js +0 -28
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
- package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
- package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
- package/dist/lib/utils/capitalizeString.d.ts +0 -12
- package/dist/lib/utils/capitalizeString.js +0 -30
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { CfnOutput, Duration, Stack, Size } from "aws-cdk-lib";
|
|
2
|
+
import { SingletonFunction as singletonFunction, Function, Code, Architecture, FunctionUrlAuthType, StartingPosition, LayerVersion } from "aws-cdk-lib/aws-lambda";
|
|
3
|
+
import { FactName } from "aws-cdk-lib/region-info";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { SqsEventSource, DynamoEventSource, S3EventSource } from "aws-cdk-lib/aws-lambda-event-sources";
|
|
7
|
+
import { EventType } from "aws-cdk-lib/aws-s3";
|
|
8
|
+
import { PolicyStatement, Effect } from "aws-cdk-lib/aws-iam";
|
|
9
|
+
import { Rule, Schedule } from "aws-cdk-lib/aws-events";
|
|
10
|
+
import { LambdaFunction as LambdaTarget } from "aws-cdk-lib/aws-events-targets";
|
|
11
|
+
import { LogGroup, RetentionDays } from "aws-cdk-lib/aws-logs";
|
|
12
|
+
import { Secret } from "aws-cdk-lib/aws-secretsmanager";
|
|
13
|
+
import { v4 as uuid } from "uuid";
|
|
14
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
import { toPascalCase } from "../../../utils/capitaliseString.js";
|
|
16
|
+
import { resolvePrivateSubnetType } from "../../../utils/vpcUtils.js";
|
|
17
|
+
import { createLambdaAlarms } from "../monitoring/index.js";
|
|
18
18
|
function addPoliciesToRole(target, statements) {
|
|
19
19
|
for (const statement of statements) {
|
|
20
20
|
target.addToRolePolicy(statement);
|
|
@@ -30,16 +30,16 @@ const SECRETS_EXTENSION = {
|
|
|
30
30
|
/** Cache TTL in seconds - 60s supports secret rotation while reducing API calls */
|
|
31
31
|
CACHE_TTL_SECONDS: "60"
|
|
32
32
|
};
|
|
33
|
-
class SingletonFunction extends
|
|
33
|
+
export class SingletonFunction extends singletonFunction {
|
|
34
34
|
constructor(scope, id, props) {
|
|
35
35
|
super(scope, id, {
|
|
36
36
|
...props,
|
|
37
|
-
uuid: props.uuid ?? (
|
|
38
|
-
timeout:
|
|
37
|
+
uuid: props.uuid ?? uuid(),
|
|
38
|
+
timeout: Duration.seconds(300),
|
|
39
39
|
description: props.lambdaDescription || `${id} singleton lambda`,
|
|
40
40
|
runtime: props.runtime,
|
|
41
41
|
ephemeralStorageSize: props.ephemeralStorageSize
|
|
42
|
-
?
|
|
42
|
+
? Size.mebibytes(props.ephemeralStorageSize)
|
|
43
43
|
: undefined
|
|
44
44
|
});
|
|
45
45
|
addPoliciesToRole(this, props.inlinePolicy);
|
|
@@ -51,55 +51,67 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
|
|
|
51
51
|
return this.role;
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
export class LambdaFunction extends Function {
|
|
55
|
+
functionUrlValue;
|
|
56
56
|
constructor(scope, id, props) {
|
|
57
57
|
const vpcSubnets = props.vpc
|
|
58
|
-
? { subnetType:
|
|
58
|
+
? { subnetType: resolvePrivateSubnetType(props.vpc) }
|
|
59
59
|
: undefined;
|
|
60
60
|
super(scope, id, {
|
|
61
61
|
...props,
|
|
62
62
|
vpcSubnets,
|
|
63
63
|
timeout: props.timeout
|
|
64
|
-
?
|
|
65
|
-
:
|
|
64
|
+
? Duration.seconds(props.timeout)
|
|
65
|
+
: Duration.seconds(300),
|
|
66
66
|
memorySize: props.memorySize || 128,
|
|
67
67
|
ephemeralStorageSize: props.ephemeralStorageSize
|
|
68
|
-
?
|
|
68
|
+
? Size.mebibytes(props.ephemeralStorageSize)
|
|
69
69
|
: undefined,
|
|
70
70
|
description: props.lambdaDescription || `${id} Lambda`,
|
|
71
71
|
environment: props.environment,
|
|
72
|
-
logGroup: new
|
|
73
|
-
retention:
|
|
72
|
+
logGroup: new LogGroup(scope, `${id}LogGroup`, {
|
|
73
|
+
retention: RetentionDays.ONE_WEEK
|
|
74
74
|
})
|
|
75
75
|
});
|
|
76
76
|
addPoliciesToRole(this, props.inlinePolicy);
|
|
77
77
|
this.addSecretsSupport(props.secrets, props.ssmSecretsPath, props.secretsImport, props.appName, props.functionName, props.architecture);
|
|
78
78
|
// Sanitise id for CloudFormation output keys (must be alphanumeric)
|
|
79
|
-
const outputName =
|
|
79
|
+
const outputName = toPascalCase(id);
|
|
80
80
|
if (props.enableFunctionUrl) {
|
|
81
81
|
const functionUrl = this.addFunctionUrl({
|
|
82
|
-
authType: props.functionUrlAuthType ||
|
|
82
|
+
authType: props.functionUrlAuthType || FunctionUrlAuthType.AWS_IAM,
|
|
83
83
|
cors: props.functionUrlCors,
|
|
84
84
|
invokeMode: props.functionUrlInvokeMode
|
|
85
85
|
});
|
|
86
86
|
this.functionUrlValue = functionUrl.url;
|
|
87
|
-
new
|
|
87
|
+
new CfnOutput(this, `${outputName}FunctionUrl`, {
|
|
88
88
|
key: `${outputName}FunctionUrl`,
|
|
89
89
|
value: functionUrl.url,
|
|
90
90
|
description: `${id} Function URL`
|
|
91
91
|
});
|
|
92
92
|
}
|
|
93
|
-
new
|
|
93
|
+
new CfnOutput(this, `${outputName}FunctionArn`, {
|
|
94
94
|
key: `${outputName}FunctionArn`,
|
|
95
95
|
value: this.functionArn,
|
|
96
96
|
description: `${id} Function ARN`
|
|
97
97
|
});
|
|
98
98
|
if (props.scheduleExpression) {
|
|
99
|
-
const rule = new
|
|
100
|
-
schedule:
|
|
99
|
+
const rule = new Rule(this, `${id}ScheduleRule`, {
|
|
100
|
+
schedule: Schedule.expression(props.scheduleExpression)
|
|
101
|
+
});
|
|
102
|
+
rule.addTarget(new LambdaTarget(this));
|
|
103
|
+
}
|
|
104
|
+
if (props.alertsTopic && props.alarms !== false) {
|
|
105
|
+
const timeoutSeconds = props.timeout ?? 300;
|
|
106
|
+
createLambdaAlarms({
|
|
107
|
+
scope: this,
|
|
108
|
+
functionName: id,
|
|
109
|
+
lambdaFunction: this,
|
|
110
|
+
timeoutSeconds,
|
|
111
|
+
config: typeof props.alarms === "object" ? props.alarms : {},
|
|
112
|
+
alarmTopic: props.alertsTopic,
|
|
113
|
+
applicationId: props.applicationId
|
|
101
114
|
});
|
|
102
|
-
rule.addTarget(new aws_events_targets_1.LambdaFunction(this));
|
|
103
115
|
}
|
|
104
116
|
}
|
|
105
117
|
/**
|
|
@@ -119,10 +131,10 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
119
131
|
* This will trigger the Lambda when messages arrive in the queue.
|
|
120
132
|
*/
|
|
121
133
|
addSqsEventSource(queue, options) {
|
|
122
|
-
const eventSource = new
|
|
134
|
+
const eventSource = new SqsEventSource(queue, {
|
|
123
135
|
batchSize: options?.batchSize ?? 10,
|
|
124
136
|
maxBatchingWindow: options?.maxBatchingWindow
|
|
125
|
-
?
|
|
137
|
+
? Duration.seconds(options.maxBatchingWindow)
|
|
126
138
|
: undefined,
|
|
127
139
|
reportBatchItemFailures: options?.reportBatchItemFailures ?? true
|
|
128
140
|
});
|
|
@@ -135,13 +147,13 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
135
147
|
*/
|
|
136
148
|
addDynamoDbEventSource(table, options) {
|
|
137
149
|
const startingPosition = options?.startingPosition === "TRIM_HORIZON"
|
|
138
|
-
?
|
|
139
|
-
:
|
|
140
|
-
const eventSource = new
|
|
150
|
+
? StartingPosition.TRIM_HORIZON
|
|
151
|
+
: StartingPosition.LATEST;
|
|
152
|
+
const eventSource = new DynamoEventSource(table, {
|
|
141
153
|
startingPosition,
|
|
142
154
|
batchSize: options?.batchSize ?? 100,
|
|
143
155
|
maxBatchingWindow: options?.maxBatchingWindow
|
|
144
|
-
?
|
|
156
|
+
? Duration.seconds(options.maxBatchingWindow)
|
|
145
157
|
: undefined,
|
|
146
158
|
retryAttempts: options?.retryAttempts,
|
|
147
159
|
parallelizationFactor: options?.parallelizationFactor,
|
|
@@ -158,17 +170,17 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
158
170
|
const eventTypes = (options?.events ?? ["OBJECT_CREATED"]).map((event) => {
|
|
159
171
|
switch (event) {
|
|
160
172
|
case "OBJECT_CREATED":
|
|
161
|
-
return
|
|
173
|
+
return EventType.OBJECT_CREATED;
|
|
162
174
|
case "OBJECT_REMOVED":
|
|
163
|
-
return
|
|
175
|
+
return EventType.OBJECT_REMOVED;
|
|
164
176
|
case "OBJECT_CREATED_PUT":
|
|
165
|
-
return
|
|
177
|
+
return EventType.OBJECT_CREATED_PUT;
|
|
166
178
|
case "OBJECT_CREATED_POST":
|
|
167
|
-
return
|
|
179
|
+
return EventType.OBJECT_CREATED_POST;
|
|
168
180
|
case "OBJECT_CREATED_COPY":
|
|
169
|
-
return
|
|
181
|
+
return EventType.OBJECT_CREATED_COPY;
|
|
170
182
|
case "OBJECT_REMOVED_DELETE":
|
|
171
|
-
return
|
|
183
|
+
return EventType.OBJECT_REMOVED_DELETE;
|
|
172
184
|
default: {
|
|
173
185
|
const _exhaustive = event;
|
|
174
186
|
throw new Error(`Unknown S3 event type: ${_exhaustive}`);
|
|
@@ -179,7 +191,7 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
179
191
|
events: eventTypes,
|
|
180
192
|
filters: options?.filters
|
|
181
193
|
};
|
|
182
|
-
const eventSource = new
|
|
194
|
+
const eventSource = new S3EventSource(bucket, s3EventSourceProps);
|
|
183
195
|
this.addEventSource(eventSource);
|
|
184
196
|
}
|
|
185
197
|
/**
|
|
@@ -191,14 +203,14 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
191
203
|
if (!options.schedule && !options.eventPattern) {
|
|
192
204
|
throw new Error("EventBridge rule requires either schedule or eventPattern");
|
|
193
205
|
}
|
|
194
|
-
const rule = new
|
|
206
|
+
const rule = new Rule(this, ruleId, {
|
|
195
207
|
schedule: options.schedule
|
|
196
|
-
?
|
|
208
|
+
? Schedule.expression(options.schedule)
|
|
197
209
|
: undefined,
|
|
198
210
|
eventPattern: options.eventPattern,
|
|
199
211
|
description: options.description
|
|
200
212
|
});
|
|
201
|
-
rule.addTarget(new
|
|
213
|
+
rule.addTarget(new LambdaTarget(this));
|
|
202
214
|
return rule;
|
|
203
215
|
}
|
|
204
216
|
/**
|
|
@@ -232,11 +244,11 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
232
244
|
* Configures cache TTL for rotation support.
|
|
233
245
|
*/
|
|
234
246
|
addSecretsExtensionLayer(architecture) {
|
|
235
|
-
const stack =
|
|
236
|
-
const archString = architecture ===
|
|
237
|
-
const factName =
|
|
247
|
+
const stack = Stack.of(this);
|
|
248
|
+
const archString = architecture === Architecture.ARM_64 ? "arm64" : "x86_64";
|
|
249
|
+
const factName = FactName.paramsAndSecretsLambdaLayer(SECRETS_EXTENSION.VERSION, archString);
|
|
238
250
|
const layerArn = stack.regionalFact(factName);
|
|
239
|
-
this.addLayers(
|
|
251
|
+
this.addLayers(LayerVersion.fromLayerVersionArn(this, `${this.node.id}SecretsExtension`, layerArn));
|
|
240
252
|
this.addEnvironment("SECRETS_MANAGER_TTL", SECRETS_EXTENSION.CACHE_TTL_SECONDS);
|
|
241
253
|
this.addEnvironment("SSM_PARAMETER_STORE_TTL", SECRETS_EXTENSION.CACHE_TTL_SECONDS);
|
|
242
254
|
}
|
|
@@ -246,20 +258,20 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
246
258
|
*/
|
|
247
259
|
addSecretsManagerSupport(secretsImport) {
|
|
248
260
|
for (const [key, secretImport] of Object.entries(secretsImport)) {
|
|
249
|
-
const secret =
|
|
261
|
+
const secret = Secret.fromSecretNameV2(this, `${this.node.id}ImportedSecret${key}`, secretImport.name);
|
|
250
262
|
this.addEnvironment(`${key}_SECRET_ARN`, secret.secretArn);
|
|
251
263
|
if (secretImport.field) {
|
|
252
264
|
this.addEnvironment(`${key}_SECRET_FIELD`, secretImport.field);
|
|
253
265
|
}
|
|
254
266
|
secret.grantRead(this);
|
|
255
267
|
}
|
|
256
|
-
this.addToRolePolicy(new
|
|
257
|
-
effect:
|
|
268
|
+
this.addToRolePolicy(new PolicyStatement({
|
|
269
|
+
effect: Effect.ALLOW,
|
|
258
270
|
actions: ["kms:Decrypt", "kms:DescribeKey"],
|
|
259
271
|
resources: ["*"],
|
|
260
272
|
conditions: {
|
|
261
273
|
StringEquals: {
|
|
262
|
-
"kms:ViaService": `secretsmanager.${
|
|
274
|
+
"kms:ViaService": `secretsmanager.${Stack.of(this).region}.amazonaws.com`
|
|
263
275
|
}
|
|
264
276
|
}
|
|
265
277
|
}));
|
|
@@ -273,20 +285,20 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
273
285
|
this.addEnvironment("SSM_SECRETS_PATH", basePath);
|
|
274
286
|
this.addEnvironment("SSM_SECRET_NAMES", secrets.join(","));
|
|
275
287
|
const scopedPath = `${basePath}/*`;
|
|
276
|
-
this.addToRolePolicy(new
|
|
277
|
-
effect:
|
|
288
|
+
this.addToRolePolicy(new PolicyStatement({
|
|
289
|
+
effect: Effect.ALLOW,
|
|
278
290
|
actions: ["ssm:GetParameter", "ssm:GetParameters"],
|
|
279
291
|
resources: [
|
|
280
|
-
`arn:aws:ssm:${
|
|
292
|
+
`arn:aws:ssm:${Stack.of(this).region}:*:parameter${scopedPath}`
|
|
281
293
|
]
|
|
282
294
|
}));
|
|
283
|
-
this.addToRolePolicy(new
|
|
284
|
-
effect:
|
|
295
|
+
this.addToRolePolicy(new PolicyStatement({
|
|
296
|
+
effect: Effect.ALLOW,
|
|
285
297
|
actions: ["kms:Decrypt"],
|
|
286
298
|
resources: ["*"],
|
|
287
299
|
conditions: {
|
|
288
300
|
StringEquals: {
|
|
289
|
-
"kms:ViaService": `ssm.${
|
|
301
|
+
"kms:ViaService": `ssm.${Stack.of(this).region}.amazonaws.com`
|
|
290
302
|
}
|
|
291
303
|
}
|
|
292
304
|
}));
|
|
@@ -302,12 +314,12 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
302
314
|
* The layer is created once per stack and shared across all Lambda functions.
|
|
303
315
|
*/
|
|
304
316
|
addSecretsResolverLayer() {
|
|
305
|
-
const stack =
|
|
317
|
+
const stack = Stack.of(this);
|
|
306
318
|
const layerId = "FjallSecretsResolverLayer";
|
|
307
319
|
let resolverLayer = stack.node.tryFindChild(layerId);
|
|
308
320
|
if (!resolverLayer) {
|
|
309
|
-
resolverLayer = new
|
|
310
|
-
code:
|
|
321
|
+
resolverLayer = new LayerVersion(stack, layerId, {
|
|
322
|
+
code: Code.fromAsset(path.join(__dirname, "..", "..", "..", "layers", "secrets-resolver")),
|
|
311
323
|
description: "Fjall secrets resolver — resolves SSM and SM secrets before handler"
|
|
312
324
|
});
|
|
313
325
|
}
|
|
@@ -330,5 +342,3 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
330
342
|
return `/${appName}/lambda/${functionName}`;
|
|
331
343
|
}
|
|
332
344
|
}
|
|
333
|
-
exports.LambdaFunction = LambdaFunction;
|
|
334
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQStEO0FBQy9ELHVEQVdnQztBQUNoQyx5REFBbUQ7QUFDbkQsNkJBQTZCO0FBQzdCLG1GQUs4QztBQUM5QywrQ0FBNEQ7QUFDNUQsaURBQTBFO0FBRTFFLHVEQUEyRTtBQUMzRSx1RUFBZ0Y7QUFDaEYsbURBQStEO0FBQy9ELHVFQUF3RDtBQUl4RCwrQkFBa0M7QUFHbEMsc0VBQStEO0FBQy9ELHNEQUFtRTtBQUVuRSxTQUFTLGlCQUFpQixDQUN4QixNQUFpRSxFQUNqRSxVQUE2QjtJQUU3QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLDBGQUEwRjtJQUMxRixPQUFPLEVBQUUsU0FBUztJQUNsQixtRkFBbUY7SUFDbkYsaUJBQWlCLEVBQUUsSUFBSTtDQUNmLENBQUM7QUF5Q1gsTUFBYSxpQkFBa0IsU0FBUSw4QkFBaUI7SUFDdEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsS0FBSztZQUNSLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUEsU0FBSSxHQUFFO1lBQzFCLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDOUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsbUJBQW1CO1lBQ2hFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixvQkFBb0IsRUFBRSxL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Q2IsbUVBQW1FO2dCQUNqRSw4Q0FBOEM7Z0JBQzlDLGdGQUFnRixDQUNuRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxPQUFPLFdBQVcsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBMWFELHdDQTBhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRHVyYXRpb24sIFN0YWNrLCBTaXplIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBTaW5nbGV0b25GdW5jdGlvbiBhcyBzaW5nbGV0b25GdW5jdGlvbixcbiAgRnVuY3Rpb24sXG4gIENvZGUsXG4gIHR5cGUgUnVudGltZSxcbiAgQXJjaGl0ZWN0dXJlLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIHR5cGUgSW52b2tlTW9kZSxcbiAgU3RhcnRpbmdQb3NpdGlvbixcbiAgTGF5ZXJWZXJzaW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBGYWN0TmFtZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9yZWdpb24taW5mb1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHtcbiAgU3FzRXZlbnRTb3VyY2UsXG4gIER5bmFtb0V2ZW50U291cmNlLFxuICBTM0V2ZW50U291cmNlLFxuICB0eXBlIFMzRXZlbnRTb3VyY2VQcm9wc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1Y2tldCwgRXZlbnRUeXBlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCB0eXBlIElSb2xlLCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgdHlwZSBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IFJ1bGUsIFNjaGVkdWxlLCB0eXBlIEV2ZW50UGF0dGVybiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiBhcyBMYW1iZGFUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHsgU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBJUXVldWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHsgdHlwZSBJVGFibGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IHR5cGUgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uL3NlY3JldHNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nXCI7XG5pbXBvcnQgeyByZXNvbHZlUHJpdmF0ZVN1Ym5ldFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdnBjVXRpbHNcIjtcblxuZnVuY3Rpb24gYWRkUG9saWNpZXNUb1JvbGUoXG4gIHRhcmdldDogeyBhZGRUb1JvbGVQb2xpY3k6IChzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCkgPT4gdm9pZCB9LFxuICBzdGF0ZW1lbnRzOiBQb2xpY3lTdGF0ZW1lbnRbXVxuKSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMpIHtcbiAgICB0YXJnZXQuYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBV1MgUGFyYW1ldGVycyBhbmQgU2VjcmV0cyBMYW1iZGEgRXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zeXN0ZW1zLW1hbmFnZXIvbGF0ZXN0L3VzZXJndWlkZS9wcy1pbnRlZ3JhdGlvbi1sYW1iZGEtZXh0ZW5zaW9ucy5odG1sXG4gKi9cbmNvbnN0IFNFQ1JFVFNfRVhURU5TSU9OID0ge1xuICAvKiogRXh0ZW5zaW9uIHZlcnNpb24gZm9yIFJlZ2lvbkluZm8gbG9va3VwIChtYXRjaGVzIFBhcmFtc0FuZFNlY3JldHNWZXJzaW9ucy5WMV8wXzEwMykgKi9cbiAgVkVSU0lPTjogXCIxLjAuMTAzXCIsXG4gIC8qKiBDYWNoZSBUVEwgaW4gc2Vjb25kcyAtIDYwcyBzdXBwb3J0cyBzZWNyZXQgcm90YXRpb24gd2hpbGUgcmVkdWNpbmcgQVBJIGNhbGxzICovXG4gIENBQ0hFX1RUTF9TRUNPTkRTOiBcIjYwXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Qcm9wcyB7XG4gIGNvZGU6IENvZGU7XG4gIGhhbmRsZXI6IHN0cmluZztcbiAgbGFtYmRhRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJvbGVEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcnVudGltZTogUnVudGltZTtcbiAgLyoqIExhbWJkYSBDUFUgYXJjaGl0ZWN0dXJlLiBEZWZhdWx0OiB4ODZfNjQgKi9cbiAgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICB2cGM/OiBJVnBjO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBtZW1vcnlTaXplPzogbnVtYmVyO1xuICAvKiogRXBoZW1lcmFsIHN0b3JhZ2Ugc2l6ZSBpbiBNaUIgKi9cbiAgZXBoZW1lcmFsU3RvcmFnZVNpemU/OiBudW1iZXI7XG4gIGlubGluZVBvbGljeTogUG9saWN5U3RhdGVtZW50W107XG5cbiAgZW5hYmxlRnVuY3Rpb25Vcmw/OiBib29sZWFuO1xuICBmdW5jdGlvblVybEF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgZnVuY3Rpb25VcmxDb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcbiAgLyoqIEludm9rZSBtb2RlIGZvciBGdW5jdGlvbiBVUkwuIFVzZSBSRVNQT05TRV9TVFJFQU0gZm9yIExhbWJkYSBzdHJlYW1pbmcuICovXG4gIGZ1bmN0aW9uVXJsSW52b2tlTW9kZT86IEludm9rZU1vZGU7XG5cbiAgZW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcblxuICB0YWdzPzogS2V5VmFsdWU7XG5cbiAgc2NoZWR1bGVFeHByZXNzaW9uPzogc3RyaW5nO1xuXG4gIHNlY3JldHM/OiBzdHJpbmdbXTtcbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xldG9uRnVuY3Rpb25Qcm9wcyBleHRlbmRzIExhbWJkYUZ1bmN0aW9uUHJvcHMge1xuICB1dWlkPzogc3RyaW5nO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbmdsZXRvbkZ1bmN0aW9uIGV4dGVuZHMgc2luZ2xldG9uRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2luZ2xldG9uRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB1dWlkOiBwcm9wcy51dWlkID8/IHV1aWQoKSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5sYW1iZGFEZXNjcmlwdGlvbiB8fCBgJHtpZH0gc2luZ2xldG9uIGxhbWJkYWAsXG4gICAgICBydW50aW1lOiBwcm9wcy5ydW50aW1lLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplXG4gICAgICAgID8gU2l6ZS5tZWJpYnl0ZXMocHJvcHMuZXBoZW1lcmFsU3RvcmFnZVNpemUpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBhZGRQb2xpY2llc1RvUm9sZSh0aGlzLCBwcm9wcy5pbmxpbmVQb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEncyBleGVjdXRpb24gcm9sZSAoYXV0by1nZW5lcmF0ZWQgYnkgQ0RLKVxuICAgKi9cbiAgcHVibGljIGdldCBleGVjdXRpb25Sb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbiBleHRlbmRzIEZ1bmN0aW9uIHtcbiAgcHJpdmF0ZSBmdW5jdGlvblVybFZhbHVlPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBMYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgY29uc3QgdnBjU3VibmV0cyA9IHByb3BzLnZwY1xuICAgICAgPyB7IHN1Ym5ldFR5cGU6IHJlc29sdmVQcml2YXRlU3VibmV0VHlwZShwcm9wcy52cGMpIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhwcm9wcy50aW1lb3V0KVxuICAgICAgICA6IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgfHwgMTI4LFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplXG4gICAgICAgID8gU2l6ZS5tZWJpYnl0ZXMocHJvcHMuZXBoZW1lcmFsU3RvcmFnZVNpemUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBMYW1iZGFgLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgbG9nR3JvdXA6IG5ldyBMb2dHcm91cChzY29wZSwgYCR7aWR9TG9nR3JvdXBgLCB7XG4gICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfV0VFS1xuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGFkZFBvbGljaWVzVG9Sb2xlKHRoaXMsIHByb3BzLmlubGluZVBvbGljeSk7XG5cbiAgICB0aGlzLmFkZFNlY3JldHNTdXBwb3J0KFxuICAgICAgcHJvcHMuc2VjcmV0cyxcbiAgICAgIHByb3BzLnNzbVNlY3JldHNQYXRoLFxuICAgICAgcHJvcHMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIHByb3BzLmFwcE5hbWUsXG4gICAgICBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBwcm9wcy5hcmNoaXRlY3R1cmVcbiAgICApO1xuXG4gICAgLy8gU2FuaXRpc2UgaWQgZm9yIENsb3VkRm9ybWF0aW9uIG91dHB1dCBrZXlzIChtdXN0IGJlIGFscGhhbnVtZXJpYylcbiAgICBjb25zdCBvdXRwdXROYW1lID0gdG9QYXNjYWxDYXNlKGlkKTtcblxuICAgIGlmIChwcm9wcy5lbmFibGVGdW5jdGlvblVybCkge1xuICAgICAgY29uc3QgZnVuY3Rpb25VcmwgPSB0aGlzLmFkZEZ1bmN0aW9uVXJsKHtcbiAgICAgICAgYXV0aFR5cGU6IHByb3BzLmZ1bmN0aW9uVXJsQXV0aFR5cGUgfHwgRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICBjb3JzOiBwcm9wcy5mdW5jdGlvblVybENvcnMsXG4gICAgICAgIGludm9rZU1vZGU6IHByb3BzLmZ1bmN0aW9uVXJsSW52b2tlTW9kZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZnVuY3Rpb25VcmxWYWx1ZSA9IGZ1bmN0aW9uVXJsLnVybDtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfUZ1bmN0aW9uVXJsYCwge1xuICAgICAgICBrZXk6IGAke291dHB1dE5hbWV9RnVuY3Rpb25VcmxgLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb25VcmwudXJsLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7aWR9IEZ1bmN0aW9uIFVSTGBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7b3V0cHV0TmFtZX1GdW5jdGlvbkFybmAsIHtcbiAgICAgIGtleTogYCR7b3V0cHV0TmFtZX1GdW5jdGlvbkFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5mdW5jdGlvbkFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtpZH0gRnVuY3Rpb24gQVJOYFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgY29uc3QgcnVsZSA9IG5ldyBSdWxlKHRoaXMsIGAke2lkfVNjaGVkdWxlUnVsZWAsIHtcbiAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uKVxuICAgICAgfSk7XG4gICAgICBydWxlLmFkZFRhcmdldChuZXcgTGFtYmRhVGFyZ2V0KHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIExhbWJkYSdzIGV4ZWN1dGlvbiByb2xlIChhdXRvLWdlbmVyYXRlZCBieSBDREspXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4ZWN1dGlvblJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBMYW1iZGEgZnVuY3Rpb24gVVJMIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RnVuY3Rpb25VcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvblVybFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBTUVMgcXVldWUgYXMgYW4gZXZlbnQgc291cmNlIGZvciB0aGlzIExhbWJkYSBmdW5jdGlvbi5cbiAgICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIExhbWJkYSB3aGVuIG1lc3NhZ2VzIGFycml2ZSBpbiB0aGUgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgYWRkU3FzRXZlbnRTb3VyY2UoXG4gICAgcXVldWU6IElRdWV1ZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c/OiBudW1iZXI7XG4gICAgICByZXBvcnRCYXRjaEl0ZW1GYWlsdXJlcz86IGJvb2xlYW47XG4gICAgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBTcXNFdmVudFNvdXJjZShxdWV1ZSwge1xuICAgICAgYmF0Y2hTaXplOiBvcHRpb25zPy5iYXRjaFNpemUgPz8gMTAsXG4gICAgICBtYXhCYXRjaGluZ1dpbmRvdzogb3B0aW9ucz8ubWF4QmF0Y2hpbmdXaW5kb3dcbiAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKG9wdGlvbnMubWF4QmF0Y2hpbmdXaW5kb3cpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM6IG9wdGlvbnM/LnJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzID8/IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50U291cmNlKGV2ZW50U291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gYXMgYW4gZXZlbnQgc291cmNlIGZvciB0aGlzIExhbWJkYSBmdW5jdGlvbi5cbiAgICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIExhbWJkYSB3aGVuIGl0ZW1zIGFyZSBtb2RpZmllZCBpbiB0aGUgdGFibGUuXG4gICAqIFJlcXVpcmVzIER5bmFtb0RCIFN0cmVhbXMgdG8gYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgYWRkRHluYW1vRGJFdmVudFNvdXJjZShcbiAgICB0YWJsZTogSVRhYmxlLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBiYXRjaFNpemU/OiBudW1iZXI7XG4gICAgICBzdGFydGluZ1Bvc2l0aW9uPzogXCJUUklNX0hPUklaT05cIiB8IFwiTEFURVNUXCI7XG4gICAgICBtYXhCYXRjaGluZ1dpbmRvdz86IG51bWJlcjtcbiAgICAgIHJldHJ5QXR0ZW1wdHM/OiBudW1iZXI7XG4gICAgICBwYXJhbGxlbGl6YXRpb25GYWN0b3I/OiBudW1iZXI7XG4gICAgICByZXBvcnRCYXRjaEl0ZW1GYWlsdXJlcz86IGJvb2xlYW47XG4gICAgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydGluZ1Bvc2l0aW9uID1cbiAgICAgIG9wdGlvbnM/LnN0YXJ0aW5nUG9zaXRpb24gPT09IFwiVFJJTV9IT1JJWk9OXCJcbiAgICAgICAgPyBTdGFydGluZ1Bvc2l0aW9uLlRSSU1fSE9SSVpPTlxuICAgICAgICA6IFN0YXJ0aW5nUG9zaXRpb24uTEFURVNUO1xuXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRHluYW1vRXZlbnRTb3VyY2UodGFibGUsIHtcbiAgICAgIHN0YXJ0aW5nUG9zaXRpb24sXG4gICAgICBiYXRjaFNpemU6IG9wdGlvbnM/LmJhdGNoU2l6ZSA/PyAxMDAsXG4gICAgICBtYXhCYXRjaGluZ1dpbmRvdzogb3B0aW9ucz8ubWF4QmF0Y2hpbmdXaW5kb3dcbiAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKG9wdGlvbnMubWF4QmF0Y2hpbmdXaW5kb3cpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmV0cnlBdHRlbXB0czogb3B0aW9ucz8ucmV0cnlBdHRlbXB0cyxcbiAgICAgIHBhcmFsbGVsaXphdGlvbkZhY3Rvcjogb3B0aW9ucz8ucGFyYWxsZWxpemF0aW9uRmFjdG9yLFxuICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM6IG9wdGlvbnM/LnJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzID8/IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50U291cmNlKGV2ZW50U291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gUzMgYnVja2V0IGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBvYmplY3RzIGFyZSBjcmVhdGVkLCBtb2RpZmllZCwgb3IgZGVsZXRlZC5cbiAgICogVXNlZnVsIGZvciBJU1IgY2FjaGUgaW52YWxpZGF0aW9uIGFuZCBmaWxlIHByb2Nlc3Npbmcgd29ya2Zsb3dzLlxuICAgKi9cbiAgcHVibGljIGFkZFMzRXZlbnRTb3VyY2UoXG4gICAgYnVja2V0OiBCdWNrZXQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGV2ZW50cz86IEFycmF5PFxuICAgICAgICB8IFwiT0JKRUNUX0NSRUFURURcIlxuICAgICAgICB8IFwiT0JKRUNUX1JFTU9WRURcIlxuICAgICAgICB8IFwiT0JKRUNUX0NSRUFURURfUFVUXCJcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEX1BPU1RcIlxuICAgICAgICB8IFwiT0JKRUNUX0NSRUFURURfQ09QWVwiXG4gICAgICAgIHwgXCJPQkpFQ1RfUkVNT1ZFRF9ERUxFVEVcIlxuICAgICAgPjtcbiAgICAgIGZpbHRlcnM/OiBBcnJheTx7IHByZWZpeD86IHN0cmluZzsgc3VmZml4Pzogc3RyaW5nIH0+O1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRUeXBlcyA9IChvcHRpb25zPy5ldmVudHMgPz8gW1wiT0JKRUNUX0NSRUFURURcIl0pLm1hcCgoZXZlbnQpID0+IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQpIHtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9DUkVBVEVEXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRDtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9SRU1PVkVEXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRDtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9DUkVBVEVEX1BVVFwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUFVUO1xuICAgICAgICBjYXNlIFwiT0JKRUNUX0NSRUFURURfUE9TVFwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUE9TVDtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9DUkVBVEVEX0NPUFlcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX0NPUFk7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfUkVNT1ZFRF9ERUxFVEVcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9SRU1PVkVEX0RFTEVURTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IGV2ZW50O1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBTMyBldmVudCB0eXBlOiAke19leGhhdXN0aXZlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzM0V2ZW50U291cmNlUHJvcHM6IFMzRXZlbnRTb3VyY2VQcm9wcyA9IHtcbiAgICAgIGV2ZW50czogZXZlbnRUeXBlcyxcbiAgICAgIGZpbHRlcnM6IG9wdGlvbnM/LmZpbHRlcnNcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgUzNFdmVudFNvdXJjZShidWNrZXQsIHMzRXZlbnRTb3VyY2VQcm9wcyk7XG4gICAgdGhpcy5hZGRFdmVudFNvdXJjZShldmVudFNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIEV2ZW50QnJpZGdlIHJ1bGUgYXMgYW4gZXZlbnQgc291cmNlIGZvciB0aGlzIExhbWJkYSBmdW5jdGlvbi5cbiAgICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIExhbWJkYSB3aGVuIGV2ZW50cyBtYXRjaGluZyB0aGUgcGF0dGVybiBhcmUgcHVibGlzaGVkLlxuICAgKiBVc2VmdWwgZm9yIHNjaGVkdWxlZCBqb2JzLCBjcm9zcy1zZXJ2aWNlIGV2ZW50IGhhbmRsaW5nLCBhbmQgY3VzdG9tIGV2ZW50IHBhdHRlcm5zLlxuICAgKi9cbiAgcHVibGljIGFkZEV2ZW50QnJpZGdlRXZlbnRTb3VyY2UoXG4gICAgcnVsZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgc2NoZWR1bGU/OiBzdHJpbmc7XG4gICAgICBldmVudFBhdHRlcm4/OiBFdmVudFBhdHRlcm47XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9XG4gICk6IFJ1bGUge1xuICAgIGlmICghb3B0aW9ucy5zY2hlZHVsZSAmJiAhb3B0aW9ucy5ldmVudFBhdHRlcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFdmVudEJyaWRnZSBydWxlIHJlcXVpcmVzIGVpdGhlciBzY2hlZHVsZSBvciBldmVudFBhdHRlcm5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBydWxlID0gbmV3IFJ1bGUodGhpcywgcnVsZUlkLCB7XG4gICAgICBzY2hlZHVsZTogb3B0aW9ucy5zY2hlZHVsZVxuICAgICAgICA/IFNjaGVkdWxlLmV4cHJlc3Npb24ob3B0aW9ucy5zY2hlZHVsZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBldmVudFBhdHRlcm46IG9wdGlvbnMuZXZlbnRQYXR0ZXJuLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb25cbiAgICB9KTtcblxuICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyBMYW1iZGFUYXJnZXQodGhpcykpO1xuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzZWNyZXRzIHN1cHBvcnQgdXNpbmcgQVdTIFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbi5cbiAgICpcbiAgICogVGhlIGV4dGVuc2lvbiBmZXRjaGVzIHNlY3JldHMgYXQgcnVudGltZSBmcm9tOlxuICAgKiAtIFNTTSBQYXJhbWV0ZXIgU3RvcmU6IHZpYSBodHRwOi8vbG9jYWxob3N0OjI3NzMvc3lzdGVtc21hbmFnZXIvcGFyYW1ldGVycy9nZXRcbiAgICogLSBTZWNyZXRzIE1hbmFnZXI6IHZpYSBodHRwOi8vbG9jYWxob3N0OjI3NzMvc2VjcmV0c21hbmFnZXIvZ2V0XG4gICAqXG4gICAqIFRoaXMgcmVwbGFjZXMgdGhlIGluc2VjdXJlIHVuc2FmZVVud3JhcCgpIHBhdHRlcm4gd2hpY2ggcmVzb2x2ZWQgc2VjcmV0cyBhdFxuICAgKiBkZXBsb3kgdGltZSBhbmQgZXhwb3NlZCB0aGVtIGluIExhbWJkYSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTZWNyZXRzU3VwcG9ydChcbiAgICBzZWNyZXRzPzogc3RyaW5nW10sXG4gICAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmcsXG4gICAgc2VjcmV0c0ltcG9ydD86IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD4sXG4gICAgYXBwTmFtZT86IHN0cmluZyxcbiAgICBmdW5jdGlvbk5hbWU/OiBzdHJpbmcsXG4gICAgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhhc1NlY3JldHNNYW5hZ2VyID1cbiAgICAgIHNlY3JldHNJbXBvcnQgJiYgT2JqZWN0LmtleXMoc2VjcmV0c0ltcG9ydCkubGVuZ3RoID4gMDtcblxuICAgIGlmICghaGFzU2VjcmV0c01hbmFnZXIgJiYgIShzZWNyZXRzICYmIHNlY3JldHMubGVuZ3RoID4gMCkpIHJldHVybjtcblxuICAgIHRoaXMuYWRkU2VjcmV0c0V4dGVuc2lvbkxheWVyKGFyY2hpdGVjdHVyZSk7XG5cbiAgICBpZiAoaGFzU2VjcmV0c01hbmFnZXIpIHtcbiAgICAgIHRoaXMuYWRkU2VjcmV0c01hbmFnZXJTdXBwb3J0KHNlY3JldHNJbXBvcnQpO1xuICAgIH1cblxuICAgIGlmIChzZWNyZXRzICYmIHNlY3JldHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRTc21TZWNyZXRzU3VwcG9ydChzZWNyZXRzLCBzc21TZWNyZXRzUGF0aCwgYXBwTmFtZSwgZnVuY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFNlY3JldHNSZXNvbHZlckxheWVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBBV1MgUGFyYW1ldGVycyBhbmQgU2VjcmV0cyBMYW1iZGEgRXh0ZW5zaW9uIGxheWVyLlxuICAgKiBVc2VzIENESydzIHJlZ2lvbmFsRmFjdCgpIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgQVJOIGF0IGRlcGxveSB0aW1lLFxuICAgKiBoYW5kbGluZyB0aGUgZmFjdCB0aGF0IEFXUyBwdWJsaXNoZXMgdGhlIGxheWVyIGZyb20gZGlmZmVyZW50IGFjY291bnRzXG4gICAqIGluIGRpZmZlcmVudCByZWdpb25zLiBUaGlzIGFwcHJvYWNoIHdvcmtzIHdpdGggQ0RLIHRva2Vucy5cbiAgICogQ29uZmlndXJlcyBjYWNoZSBUVEwgZm9yIHJvdGF0aW9uIHN1cHBvcnQuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlY3JldHNFeHRlbnNpb25MYXllcihhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmUpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IGFyY2hTdHJpbmcgPVxuICAgICAgYXJjaGl0ZWN0dXJlID09PSBBcmNoaXRlY3R1cmUuQVJNXzY0ID8gXCJhcm02NFwiIDogXCJ4ODZfNjRcIjtcblxuICAgIGNvbnN0IGZhY3ROYW1lID0gRmFjdE5hbWUucGFyYW1zQW5kU2VjcmV0c0xhbWJkYUxheWVyKFxuICAgICAgU0VDUkVUU19FWFRFTlNJT04uVkVSU0lPTixcbiAgICAgIGFyY2hTdHJpbmdcbiAgICApO1xuXG4gICAgY29uc3QgbGF5ZXJBcm4gPSBzdGFjay5yZWdpb25hbEZhY3QoZmFjdE5hbWUpO1xuXG4gICAgdGhpcy5hZGRMYXllcnMoXG4gICAgICBMYXllclZlcnNpb24uZnJvbUxheWVyVmVyc2lvbkFybihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5ub2RlLmlkfVNlY3JldHNFeHRlbnNpb25gLFxuICAgICAgICBsYXllckFyblxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFxuICAgICAgXCJTRUNSRVRTX01BTkFHRVJfVFRMXCIsXG4gICAgICBTRUNSRVRTX0VYVEVOU0lPTi5DQUNIRV9UVExfU0VDT05EU1xuICAgICk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudChcbiAgICAgIFwiU1NNX1BBUkFNRVRFUl9TVE9SRV9UVExcIixcbiAgICAgIFNFQ1JFVFNfRVhURU5TSU9OLkNBQ0hFX1RUTF9TRUNPTkRTXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgU2VjcmV0cyBNYW5hZ2VyIHN1cHBvcnQgZm9yIENESy1tYW5hZ2VkIHNlY3JldHMgKGUuZy4sIGRhdGFiYXNlIGNyZWRlbnRpYWxzKS5cbiAgICogU3RvcmVzIEFSTiArIGZpZWxkIGFzIGVudiB2YXJzIC0gdGhlIExhbWJkYSBFeHRlbnNpb24gZmV0Y2hlcyBhY3R1YWwgdmFsdWVzIGF0IHJ1bnRpbWUuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlY3JldHNNYW5hZ2VyU3VwcG9ydChcbiAgICBzZWNyZXRzSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+XG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgc2VjcmV0SW1wb3J0XSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzSW1wb3J0KSkge1xuICAgICAgY29uc3Qgc2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMubm9kZS5pZH1JbXBvcnRlZFNlY3JldCR7a2V5fWAsXG4gICAgICAgIHNlY3JldEltcG9ydC5uYW1lXG4gICAgICApO1xuXG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGAke2tleX1fU0VDUkVUX0FSTmAsIHNlY3JldC5zZWNyZXRBcm4pO1xuICAgICAgaWYgKHNlY3JldEltcG9ydC5maWVsZCkge1xuICAgICAgICB0aGlzLmFkZEVudmlyb25tZW50KGAke2tleX1fU0VDUkVUX0ZJRUxEYCwgc2VjcmV0SW1wb3J0LmZpZWxkKTtcbiAgICAgIH1cblxuICAgICAgc2VjcmV0LmdyYW50UmVhZCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wia21zOkRlY3J5cHRcIiwgXCJrbXM6RGVzY3JpYmVLZXlcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgXCJrbXM6VmlhU2VydmljZVwiOiBgc2VjcmV0c21hbmFnZXIuJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFNTTSBQYXJhbWV0ZXIgU3RvcmUgc3VwcG9ydCBmb3IgdXNlci1tYW5hZ2VkIHNlY3JldHMgKHZpYSBmamFsbCBzZWNyZXQgYWRkKS5cbiAgICogU3RvcmVzIGJhc2UgcGF0aCBhbmQgc2VjcmV0IG5hbWVzIGFzIGVudiB2YXJzIGZvciBjb25zdW1lciBjb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTc21TZWNyZXRzU3VwcG9ydChcbiAgICBzZWNyZXRzOiBzdHJpbmdbXSxcbiAgICBzc21TZWNyZXRzUGF0aD86IHN0cmluZyxcbiAgICBhcHBOYW1lPzogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMuZGVyaXZlU3NtU2VjcmV0c1BhdGgoXG4gICAgICBzc21TZWNyZXRzUGF0aCxcbiAgICAgIGFwcE5hbWUsXG4gICAgICBmdW5jdGlvbk5hbWVcbiAgICApO1xuXG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudChcIlNTTV9TRUNSRVRTX1BBVEhcIiwgYmFzZVBhdGgpO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoXCJTU01fU0VDUkVUX05BTUVTXCIsIHNlY3JldHMuam9pbihcIixcIikpO1xuXG4gICAgY29uc3Qgc2NvcGVkUGF0aCA9IGAke2Jhc2VQYXRofS8qYDtcbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlclwiLCBcInNzbTpHZXRQYXJhbWV0ZXJzXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgYXJuOmF3czpzc206JHtTdGFjay5vZih0aGlzKS5yZWdpb259Oio6cGFyYW1ldGVyJHtzY29wZWRQYXRofWBcbiAgICAgICAgXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgIFwia21zOlZpYVNlcnZpY2VcIjogYHNzbS4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIEZqYWxsIHNlY3JldHMgcmVzb2x2ZXIgbGF5ZXIgYW5kIHNldCBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUi5cbiAgICpcbiAgICogVGhlIHJlc29sdmVyIGlzIGEgYmFzaCB3cmFwcGVyICsgTm9kZS5qcyBzY3JpcHQgdGhhdCBydW5zIGJlZm9yZSB0aGUgTGFtYmRhXG4gICAqIHJ1bnRpbWUuIEl0IGNhbGxzIHRoZSBFeHRlbnNpb24gSFRUUCBBUEkgKGxvY2FsaG9zdDoyNzczKSB0byByZXNvbHZlIFNTTVxuICAgKiBwYXJhbWV0ZXJzIGFuZCBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0cywgZXhwb3J0aW5nIHRoZW0gYXMgcGxhaW4gZW52aXJvbm1lbnRcbiAgICogdmFyaWFibGVzIHNvIGhhbmRsZXIgY29kZSBjYW4gc2ltcGx5IHJlYWQgcHJvY2Vzcy5lbnYuXG4gICAqXG4gICAqIFRoZSBsYXllciBpcyBjcmVhdGVkIG9uY2UgcGVyIHN0YWNrIGFuZCBzaGFyZWQgYWNyb3NzIGFsbCBMYW1iZGEgZnVuY3Rpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTZWNyZXRzUmVzb2x2ZXJMYXllcigpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IGxheWVySWQgPSBcIkZqYWxsU2VjcmV0c1Jlc29sdmVyTGF5ZXJcIjtcbiAgICBsZXQgcmVzb2x2ZXJMYXllciA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGxheWVySWQpIGFzXG4gICAgICB8IExheWVyVmVyc2lvblxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIXJlc29sdmVyTGF5ZXIpIHtcbiAgICAgIHJlc29sdmVyTGF5ZXIgPSBuZXcgTGF5ZXJWZXJzaW9uKHN0YWNrLCBsYXllcklkLCB7XG4gICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KFxuICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcIi4uXCIsIFwibGF5ZXJzXCIsIFwic2VjcmV0cy1yZXNvbHZlclwiKVxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIkZqYWxsIHNlY3JldHMgcmVzb2x2ZXIg4oCUIHJlc29sdmVzIFNTTSBhbmQgU00gc2VjcmV0cyBiZWZvcmUgaGFuZGxlclwiXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZExheWVycyhyZXNvbHZlckxheWVyKTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFwiQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVJcIiwgXCIvb3B0L2Jpbi9yZXNvbHZlLXNlY3JldHNcIik7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIFNTTSBzZWNyZXRzIHBhdGggZm9yIExhbWJkYSBmdW5jdGlvbnMuXG4gICAqIFBhdHRlcm46IC88YXBwTmFtZT4vbGFtYmRhLzxmdW5jdGlvbk5hbWU+XG4gICAqL1xuICBwcml2YXRlIGRlcml2ZVNzbVNlY3JldHNQYXRoKFxuICAgIGV4cGxpY2l0UGF0aD86IHN0cmluZyxcbiAgICBhcHBOYW1lPzogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGlmIChleHBsaWNpdFBhdGgpIHtcbiAgICAgIHJldHVybiBleHBsaWNpdFBhdGg7XG4gICAgfVxuXG4gICAgaWYgKCFhcHBOYW1lIHx8ICFmdW5jdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJMYW1iZGEgZnVuY3Rpb24gaGFzIHNlY3JldHMgZGVmaW5lZCBidXQgbm8gc3NtU2VjcmV0c1BhdGggaXMgc2V0IFwiICtcbiAgICAgICAgICBcImFuZCBhcHBOYW1lL2Z1bmN0aW9uTmFtZSBhcmUgbm90IGF2YWlsYWJsZS4gXCIgK1xuICAgICAgICAgIFwiRWl0aGVyIHNldCBzc21TZWNyZXRzUGF0aCBleHBsaWNpdGx5LCBvciBlbnN1cmUgQXBwLmdldE5hbWUoKSByZXR1cm5zIGEgdmFsdWUuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAvJHthcHBOYW1lfS9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YDtcbiAgfVxufVxuIl19
|
|
@@ -1,39 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
-
const removalPolicy_1 = require("../../../utils/removalPolicy");
|
|
7
|
-
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { CfnOutput } from "aws-cdk-lib";
|
|
3
|
+
import { toRemovalPolicy } from "../../../utils/removalPolicy.js";
|
|
4
|
+
import { Table, AttributeType, BillingMode, StreamViewType, ProjectionType } from "aws-cdk-lib/aws-dynamodb";
|
|
8
5
|
function toAttributeType(type) {
|
|
9
6
|
switch (type) {
|
|
10
7
|
case "S":
|
|
11
|
-
return
|
|
8
|
+
return AttributeType.STRING;
|
|
12
9
|
case "N":
|
|
13
|
-
return
|
|
10
|
+
return AttributeType.NUMBER;
|
|
14
11
|
case "B":
|
|
15
|
-
return
|
|
12
|
+
return AttributeType.BINARY;
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
15
|
function toBillingMode(mode) {
|
|
19
16
|
switch (mode) {
|
|
20
17
|
case "PROVISIONED":
|
|
21
|
-
return
|
|
18
|
+
return BillingMode.PROVISIONED;
|
|
22
19
|
case "PAY_PER_REQUEST":
|
|
23
20
|
default:
|
|
24
|
-
return
|
|
21
|
+
return BillingMode.PAY_PER_REQUEST;
|
|
25
22
|
}
|
|
26
23
|
}
|
|
27
24
|
function toStreamViewType(stream) {
|
|
28
25
|
switch (stream) {
|
|
29
26
|
case "NEW_IMAGE":
|
|
30
|
-
return
|
|
27
|
+
return StreamViewType.NEW_IMAGE;
|
|
31
28
|
case "OLD_IMAGE":
|
|
32
|
-
return
|
|
29
|
+
return StreamViewType.OLD_IMAGE;
|
|
33
30
|
case "NEW_AND_OLD_IMAGES":
|
|
34
|
-
return
|
|
31
|
+
return StreamViewType.NEW_AND_OLD_IMAGES;
|
|
35
32
|
case "KEYS_ONLY":
|
|
36
|
-
return
|
|
33
|
+
return StreamViewType.KEYS_ONLY;
|
|
37
34
|
default:
|
|
38
35
|
return undefined;
|
|
39
36
|
}
|
|
@@ -41,20 +38,22 @@ function toStreamViewType(stream) {
|
|
|
41
38
|
function toProjectionType(type) {
|
|
42
39
|
switch (type) {
|
|
43
40
|
case "ALL":
|
|
44
|
-
return
|
|
41
|
+
return ProjectionType.ALL;
|
|
45
42
|
case "KEYS_ONLY":
|
|
46
|
-
return
|
|
43
|
+
return ProjectionType.KEYS_ONLY;
|
|
47
44
|
case "INCLUDE":
|
|
48
|
-
return
|
|
45
|
+
return ProjectionType.INCLUDE;
|
|
49
46
|
default:
|
|
50
47
|
return undefined;
|
|
51
48
|
}
|
|
52
49
|
}
|
|
53
|
-
class DynamoDBTable extends
|
|
50
|
+
export class DynamoDBTable extends Construct {
|
|
51
|
+
id;
|
|
52
|
+
table;
|
|
54
53
|
constructor(scope, id, props) {
|
|
55
54
|
super(scope, id);
|
|
56
55
|
this.id = id;
|
|
57
|
-
this.table = new
|
|
56
|
+
this.table = new Table(this, `${id}Table`, {
|
|
58
57
|
tableName: props.tableName,
|
|
59
58
|
partitionKey: {
|
|
60
59
|
name: props.partitionKey.name,
|
|
@@ -73,7 +72,7 @@ class DynamoDBTable extends constructs_1.Construct {
|
|
|
73
72
|
pointInTimeRecoverySpecification: {
|
|
74
73
|
pointInTimeRecoveryEnabled: props.pointInTimeRecovery ?? true
|
|
75
74
|
},
|
|
76
|
-
removalPolicy:
|
|
75
|
+
removalPolicy: toRemovalPolicy(props.removalPolicy),
|
|
77
76
|
timeToLiveAttribute: props.timeToLiveAttribute
|
|
78
77
|
});
|
|
79
78
|
if (props.globalSecondaryIndexes) {
|
|
@@ -96,18 +95,18 @@ class DynamoDBTable extends constructs_1.Construct {
|
|
|
96
95
|
this.table.addGlobalSecondaryIndex(gsiProps);
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
|
-
new
|
|
98
|
+
new CfnOutput(this, `${id}TableName`, {
|
|
100
99
|
key: `${id}TableName`,
|
|
101
100
|
value: this.table.tableName,
|
|
102
101
|
description: `DynamoDB table name for ${id}`
|
|
103
102
|
});
|
|
104
|
-
new
|
|
103
|
+
new CfnOutput(this, `${id}TableArn`, {
|
|
105
104
|
key: `${id}TableArn`,
|
|
106
105
|
value: this.table.tableArn,
|
|
107
106
|
description: `DynamoDB table ARN for ${id}`
|
|
108
107
|
});
|
|
109
108
|
if (props.stream) {
|
|
110
|
-
new
|
|
109
|
+
new CfnOutput(this, `${id}TableStreamArn`, {
|
|
111
110
|
key: `${id}TableStreamArn`,
|
|
112
111
|
value: this.table.tableStreamArn || "",
|
|
113
112
|
description: `DynamoDB table stream ARN for ${id}`
|
|
@@ -169,5 +168,3 @@ class DynamoDBTable extends constructs_1.Construct {
|
|
|
169
168
|
return this.table.grantStreamRead(grantee);
|
|
170
169
|
}
|
|
171
170
|
}
|
|
172
|
-
exports.DynamoDBTable = DynamoDBTable;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1vZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9keW5hbW9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQXdDO0FBQ3hDLGdFQUErRDtBQUMvRCwyREFRa0M7QUFpQ2xDLFNBQVMsZUFBZSxDQUFDLElBQTJCO0lBQ2xELFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLEdBQUc7WUFDTixPQUFPLDRCQUFhLENBQUMsTUFBTSxDQUFDO1FBQzlCLEtBQUssR0FBRztZQUNOLE9BQU8sNEJBQWEsQ0FBQyxNQUFNLENBQUM7UUFDOUIsS0FBSyxHQUFHO1lBQ04sT0FBTyw0QkFBYSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLElBQXdDO0lBQzdELFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLGFBQWE7WUFDaEIsT0FBTywwQkFBVyxDQUFDLFdBQVcsQ0FBQztRQUNqQyxLQUFLLGlCQUFpQixDQUFDO1FBQ3ZCO1lBQ0UsT0FBTywwQkFBVyxDQUFDLGVBQWUsQ0FBQztJQUN2QyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQ3ZCLE1BQXVFO0lBRXZFLFFBQVEsTUFBTSxFQUFFLENBQUM7UUFDZixLQUFLLFdBQVc7WUFDZCxPQUFPLDZCQUFjLENBQUMsU0FBUyxDQUFDO1FBQ2xDLEtBQUssV0FBVztZQUNkLE9BQU8sNkJBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEMsS0FBSyxvQkFBb0I7WUFDdkIsT0FBTyw2QkFBYyxDQUFDLGtCQUFrQixDQUFDO1FBQzNDLEtBQUssV0FBVztZQUNkLE9BQU8sNkJBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEM7WUFDRSxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdC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RUc7SUFDSSxTQUFTLENBQUMsT0FBbUI7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsT0FBbUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQUMsT0FBbUI7UUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUFtQjtRQUN4QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUFtQjtRQUN4QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQXpJRCxzQ0F5SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0b1JlbW92YWxQb2xpY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVtb3ZhbFBvbGljeVwiO1xuaW1wb3J0IHtcbiAgVGFibGUsXG4gIEF0dHJpYnV0ZVR5cGUsXG4gIEJpbGxpbmdNb2RlLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgUHJvamVjdGlvblR5cGUsXG4gIHR5cGUgR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgdHlwZSBJVGFibGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuZXhwb3J0IHR5cGUgRHluYW1vREJBdHRyaWJ1dGVUeXBlID0gXCJTXCIgfCBcIk5cIiB8IFwiQlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCS2V5U2NoZW1hIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1vREJHbG9iYWxTZWNvbmRhcnlJbmRleCB7XG4gIGluZGV4TmFtZTogc3RyaW5nO1xuICBwYXJ0aXRpb25LZXk6IER5bmFtb0RCS2V5U2NoZW1hO1xuICBzb3J0S2V5PzogRHluYW1vREJLZXlTY2hlbWE7XG4gIHByb2plY3Rpb25UeXBlPzogXCJBTExcIiB8IFwiS0VZU19PTkxZXCIgfCBcIklOQ0xVREVcIjtcbiAgbm9uS2V5QXR0cmlidXRlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCVGFibGVQcm9wcyB7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbiAgcGFydGl0aW9uS2V5OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgc29ydEtleT86IER5bmFtb0RCS2V5U2NoZW1hO1xuICBiaWxsaW5nTW9kZT86IFwiUEFZX1BFUl9SRVFVRVNUXCIgfCBcIlBST1ZJU0lPTkVEXCI7XG4gIHJlYWRDYXBhY2l0eT86IG51bWJlcjtcbiAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXhbXTtcbiAgdGltZVRvTGl2ZUF0dHJpYnV0ZT86IHN0cmluZztcbiAgc3RyZWFtPzogXCJORVdfSU1BR0VcIiB8IFwiT0xEX0lNQUdFXCIgfCBcIk5FV19BTkRfT0xEX0lNQUdFU1wiIHwgXCJLRVlTX09OTFlcIjtcbiAgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIGVuY3J5cHRpb24/OiBcIkFXU19PV05FRFwiIHwgXCJBV1NfTUFOQUdFRFwiIHwgXCJDVVNUT01FUl9NQU5BR0VEXCI7XG4gIHJlbW92YWxQb2xpY3k/OiBcIkRFU1RST1lcIiB8IFwiUkVUQUlOXCIgfCBcIlNOQVBTSE9UXCI7XG59XG5cbmZ1bmN0aW9uIHRvQXR0cmlidXRlVHlwZSh0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGUpOiBBdHRyaWJ1dGVUeXBlIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIlNcIjpcbiAgICAgIHJldHVybiBBdHRyaWJ1dGVUeXBlLlNUUklORztcbiAgICBjYXNlIFwiTlwiOlxuICAgICAgcmV0dXJuIEF0dHJpYnV0ZVR5cGUuTlVNQkVSO1xuICAgIGNhc2UgXCJCXCI6XG4gICAgICByZXR1cm4gQXR0cmlidXRlVHlwZS5CSU5BUlk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CaWxsaW5nTW9kZShtb2RlPzogXCJQQVlfUEVSX1JFUVVFU1RcIiB8IFwiUFJPVklTSU9ORURcIik6IEJpbGxpbmdNb2RlIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBcIlBST1ZJU0lPTkVEXCI6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUFJPVklTSU9ORUQ7XG4gICAgY2FzZSBcIlBBWV9QRVJfUkVRVUVTVFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3RyZWFtVmlld1R5cGUoXG4gIHN0cmVhbT86IFwiTkVXX0lNQUdFXCIgfCBcIk9MRF9JTUFHRVwiIHwgXCJORVdfQU5EX09MRF9JTUFHRVNcIiB8IFwiS0VZU19PTkxZXCJcbik6IFN0cmVhbVZpZXdUeXBlIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChzdHJlYW0pIHtcbiAgICBjYXNlIFwiTkVXX0lNQUdFXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuTkVXX0lNQUdFO1xuICAgIGNhc2UgXCJPTERfSU1BR0VcIjpcbiAgICAgIHJldHVybiBTdHJlYW1WaWV3VHlwZS5PTERfSU1BR0U7XG4gICAgY2FzZSBcIk5FV19BTkRfT0xEX0lNQUdFU1wiOlxuICAgICAgcmV0dXJuIFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUztcbiAgICBjYXNlIFwiS0VZU19PTkxZXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuS0VZU19PTkxZO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUHJvamVjdGlvblR5cGUoXG4gIHR5cGU/OiBcIkFMTFwiIHwgXCJLRVlTX09OTFlcIiB8IFwiSU5DTFVERVwiXG4pOiBQcm9qZWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJBTExcIjpcbiAgICAgIHJldHVybiBQcm9qZWN0aW9uVHlwZS5BTEw7XG4gICAgY2FzZSBcIktFWVNfT05MWVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLktFWVNfT05MWTtcbiAgICBjYXNlIFwiSU5DTFVERVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLklOQ0xVREU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIER5bmFtb0RCVGFibGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0YWJsZTogVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IER5bmFtb0RCVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBgJHtpZH1UYWJsZWAsIHtcbiAgICAgIHRhYmxlTmFtZTogcHJvcHMudGFibGVOYW1lLFxuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6IHByb3BzLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUocHJvcHMucGFydGl0aW9uS2V5LnR5cGUpXG4gICAgICB9LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG5hbWU6IHByb3BzLnNvcnRLZXkubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHRvQXR0cmlidXRlVHlwZShwcm9wcy5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGJpbGxpbmdNb2RlOiB0b0JpbGxpbmdNb2RlKHByb3BzLmJpbGxpbmdNb2RlKSxcbiAgICAgIHJlYWRDYXBhY2l0eTpcbiAgICAgICAgcHJvcHMuYmlsbGluZ01vZGUgPT09IFwiUFJPVklTSU9ORURcIiA/IHByb3BzLnJlYWRDYXBhY2l0eSA6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRlQ2FwYWNpdHk6XG4gICAgICAgIHByb3BzLmJpbGxpbmdNb2RlID09PSBcIlBST1ZJU0lPTkVEXCIgPyBwcm9wcy53cml0ZUNhcGFjaXR5IDogdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiB0b1N0cmVhbVZpZXdUeXBlKHByb3BzLnN0cmVhbSksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbjoge1xuICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZDogcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeSA/PyB0cnVlXG4gICAgICB9LFxuICAgICAgcmVtb3ZhbFBvbGljeTogdG9SZW1vdmFsUG9saWN5KHByb3BzLnJlbW92YWxQb2xpY3kpLFxuICAgICAgdGltZVRvTGl2ZUF0dHJpYnV0ZTogcHJvcHMudGltZVRvTGl2ZUF0dHJpYnV0ZVxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZ3NpIG9mIHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMpIHtcbiAgICAgICAgY29uc3QgZ3NpUHJvcHM6IEdsb2JhbFNlY29uZGFyeUluZGV4UHJvcHMgPSB7XG4gICAgICAgICAgaW5kZXhOYW1lOiBnc2kuaW5kZXhOYW1lLFxuICAgICAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICAgICAgbmFtZTogZ3NpLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogdG9BdHRyaWJ1dGVUeXBlKGdzaS5wYXJ0aXRpb25LZXkudHlwZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvcnRLZXk6IGdzaS5zb3J0S2V5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBnc2kuc29ydEtleS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHRvQXR0cmlidXRlVHlwZShnc2kuc29ydEtleS50eXBlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcm9qZWN0aW9uVHlwZTogdG9Qcm9qZWN0aW9uVHlwZShnc2kucHJvamVjdGlvblR5cGUpLFxuICAgICAgICAgIG5vbktleUF0dHJpYnV0ZXM6IGdzaS5ub25LZXlBdHRyaWJ1dGVzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGFibGUuYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgoZ3NpUHJvcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9VGFibGVOYW1lYCwge1xuICAgICAga2V5OiBgJHtpZH1UYWJsZU5hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBEeW5hbW9EQiB0YWJsZSBuYW1lIGZvciAke2lkfWBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9VGFibGVBcm5gLCB7XG4gICAgICBrZXk6IGAke2lkfVRhYmxlQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLnRhYmxlLnRhYmxlQXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBEeW5hbW9EQiB0YWJsZSBBUk4gZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnN0cmVhbSkge1xuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZVN0cmVhbUFybmAsIHtcbiAgICAgICAga2V5OiBgJHtpZH1UYWJsZVN0cmVhbUFybmAsXG4gICAgICAgIHZhbHVlOiB0aGlzLnRhYmxlLnRhYmxlU3RyZWFtQXJuIHx8IFwiXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRHluYW1vREIgdGFibGUgc3RyZWFtIEFSTiBmb3IgJHtpZH1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBEeW5hbW9EQiB0YWJsZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIGdldFRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLnRhYmxlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIER5bmFtb0RCIHRhYmxlIEFSTi5cbiAgICovXG4gIHB1YmxpYyBnZXRUYWJsZUFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLnRhYmxlQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRHluYW1vREIgdGFibGUgc3RyZWFtIEFSTiAoaWYgc3RyZWFtaW5nIGlzIGVuYWJsZWQpLlxuICAgKi9cbiAgcHVibGljIGdldFRhYmxlU3RyZWFtQXJuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVTdHJlYW1Bcm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIENESyBUYWJsZSBjb25zdHJ1Y3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGUoKTogSVRhYmxlIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50UmVhZERhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoZSBncmFudGVlLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGZ1bGwgYWNjZXNzIChyZWFkLCB3cml0ZSwgZGVsZXRlKSB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgc3RyZWFtIHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRTdHJlYW1SZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRTdHJlYW1SZWFkKGdyYW50ZWUpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { DatabaseInsightsMode, PerformanceInsightRetention } from "aws-cdk-lib/aws-rds";
|
|
2
|
-
export * from "./dynamodb";
|
|
3
|
-
export * from "./rdsAurora";
|
|
4
|
-
export * from "./rdsAuroraGlobal";
|
|
5
|
-
export * from "./rdsDefaults";
|
|
6
|
-
export * from "./rdsHelpers";
|
|
7
|
-
export * from "./rdsInstance";
|
|
8
|
-
export * from "./rdsProxyOutput";
|
|
2
|
+
export * from "./dynamodb.js";
|
|
3
|
+
export * from "./rdsAurora.js";
|
|
4
|
+
export * from "./rdsAuroraGlobal.js";
|
|
5
|
+
export * from "./rdsDefaults.js";
|
|
6
|
+
export * from "./rdsHelpers.js";
|
|
7
|
+
export * from "./rdsInstance.js";
|
|
8
|
+
export * from "./rdsProxyOutput.js";
|
|
9
9
|
export declare function getDatabaseInsightsRetention(mode: "standard" | "advanced"): PerformanceInsightRetention;
|
|
10
10
|
export declare function getCdkDatabaseInsightsMode(mode: "standard" | "advanced"): DatabaseInsightsMode;
|
|
@@ -1,37 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getDatabaseInsightsRetention = getDatabaseInsightsRetention;
|
|
18
|
-
exports.getCdkDatabaseInsightsMode = getCdkDatabaseInsightsMode;
|
|
19
|
-
const aws_rds_1 = require("aws-cdk-lib/aws-rds");
|
|
20
|
-
__exportStar(require("./dynamodb"), exports);
|
|
21
|
-
__exportStar(require("./rdsAurora"), exports);
|
|
22
|
-
__exportStar(require("./rdsAuroraGlobal"), exports);
|
|
23
|
-
__exportStar(require("./rdsDefaults"), exports);
|
|
24
|
-
__exportStar(require("./rdsHelpers"), exports);
|
|
25
|
-
__exportStar(require("./rdsInstance"), exports);
|
|
26
|
-
__exportStar(require("./rdsProxyOutput"), exports);
|
|
27
|
-
function getDatabaseInsightsRetention(mode) {
|
|
1
|
+
import { DatabaseInsightsMode, PerformanceInsightRetention } from "aws-cdk-lib/aws-rds";
|
|
2
|
+
export * from "./dynamodb.js";
|
|
3
|
+
export * from "./rdsAurora.js";
|
|
4
|
+
export * from "./rdsAuroraGlobal.js";
|
|
5
|
+
export * from "./rdsDefaults.js";
|
|
6
|
+
export * from "./rdsHelpers.js";
|
|
7
|
+
export * from "./rdsInstance.js";
|
|
8
|
+
export * from "./rdsProxyOutput.js";
|
|
9
|
+
export function getDatabaseInsightsRetention(mode) {
|
|
28
10
|
return mode === "advanced"
|
|
29
|
-
?
|
|
30
|
-
:
|
|
11
|
+
? PerformanceInsightRetention.MONTHS_15
|
|
12
|
+
: PerformanceInsightRetention.DEFAULT;
|
|
31
13
|
}
|
|
32
|
-
function getCdkDatabaseInsightsMode(mode) {
|
|
14
|
+
export function getCdkDatabaseInsightsMode(mode) {
|
|
33
15
|
return mode === "advanced"
|
|
34
|
-
?
|
|
35
|
-
:
|
|
16
|
+
? DatabaseInsightsMode.ADVANCED
|
|
17
|
+
: DatabaseInsightsMode.STANDARD;
|
|
36
18
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBYUEsb0VBTUM7QUFFRCxnRUFNQztBQTNCRCxpREFHNkI7QUFFN0IsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixvREFBa0M7QUFDbEMsZ0RBQThCO0FBQzlCLCtDQUE2QjtBQUM3QixnREFBOEI7QUFDOUIsbURBQWlDO0FBRWpDLFNBQWdCLDRCQUE0QixDQUMxQyxJQUE2QjtJQUU3QixPQUFPLElBQUksS0FBSyxVQUFVO1FBQ3hCLENBQUMsQ0FBQyxxQ0FBMkIsQ0FBQyxTQUFTO1FBQ3ZDLENBQUMsQ0FBQyxxQ0FBMkIsQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQWdCLDBCQUEwQixDQUN4QyxJQUE2QjtJQUU3QixPQUFPLElBQUksS0FBSyxVQUFVO1FBQ3hCLENBQUMsQ0FBQyw4QkFBb0IsQ0FBQyxRQUFRO1FBQy9CLENBQUMsQ0FBQyw4QkFBb0IsQ0FBQyxRQUFRLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERhdGFiYXNlSW5zaWdodHNNb2RlLFxuICBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZHluYW1vZGJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzQXVyb3JhR2xvYmFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZHNEZWZhdWx0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzSGVscGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzSW5zdGFuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jkc1Byb3h5T3V0cHV0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUluc2lnaHRzUmV0ZW50aW9uKFxuICBtb2RlOiBcInN0YW5kYXJkXCIgfCBcImFkdmFuY2VkXCJcbik6IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbiB7XG4gIHJldHVybiBtb2RlID09PSBcImFkdmFuY2VkXCJcbiAgICA/IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTVcbiAgICA6IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5ERUZBVUxUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RrRGF0YWJhc2VJbnNpZ2h0c01vZGUoXG4gIG1vZGU6IFwic3RhbmRhcmRcIiB8IFwiYWR2YW5jZWRcIlxuKTogRGF0YWJhc2VJbnNpZ2h0c01vZGUge1xuICByZXR1cm4gbW9kZSA9PT0gXCJhZHZhbmNlZFwiXG4gICAgPyBEYXRhYmFzZUluc2lnaHRzTW9kZS5BRFZBTkNFRFxuICAgIDogRGF0YWJhc2VJbnNpZ2h0c01vZGUuU1RBTkRBUkQ7XG59XG4iXX0=
|