@fjall/components-infrastructure 0.89.4 → 0.89.6
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 +61 -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 +82 -70
- package/dist/lib/resources/aws/database/dynamodb.js +27 -28
- 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,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
10
|
-
const app_1 = require("../../app");
|
|
11
|
-
const validationLogger_1 = require("../../utils/validationLogger");
|
|
1
|
+
import { CfnOutput, Duration, RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { BackupVault, BackupPlan } from "../../resources/aws/backup/index.js";
|
|
4
|
+
import { BackupPlanRule, BackupVault as Vault } from "aws-cdk-lib/aws-backup";
|
|
5
|
+
import * as events from "aws-cdk-lib/aws-events";
|
|
6
|
+
import { AccountPrincipal, Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
|
|
7
|
+
import App from "../../app.js";
|
|
8
|
+
import { parseOrgConfig } from "../../utils/orgConfigParser.js";
|
|
12
9
|
// Backup retention constants (in days)
|
|
13
10
|
const RETENTION_PERIODS = {
|
|
14
11
|
STANDARD: 90,
|
|
@@ -20,45 +17,33 @@ const RETENTION_PERIODS = {
|
|
|
20
17
|
};
|
|
21
18
|
// Backup window constants
|
|
22
19
|
const BACKUP_WINDOWS = {
|
|
23
|
-
START:
|
|
24
|
-
COMPLETION:
|
|
25
|
-
COMPLETION_SHORT:
|
|
20
|
+
START: Duration.minutes(60),
|
|
21
|
+
COMPLETION: Duration.hours(12),
|
|
22
|
+
COMPLETION_SHORT: Duration.hours(2)
|
|
26
23
|
};
|
|
24
|
+
const BACKUP_VAULT_NAME = "backupVault";
|
|
27
25
|
// Vault lock constants
|
|
28
26
|
const VAULT_LOCK = {
|
|
29
|
-
MIN_RETENTION:
|
|
30
|
-
MAX_RETENTION:
|
|
31
|
-
GRACE_PERIOD:
|
|
27
|
+
MIN_RETENTION: Duration.days(365),
|
|
28
|
+
MAX_RETENTION: Duration.days(36500),
|
|
29
|
+
GRACE_PERIOD: Duration.days(3)
|
|
32
30
|
};
|
|
33
|
-
class DisasterRecovery extends
|
|
31
|
+
export class DisasterRecovery extends Construct {
|
|
32
|
+
backupVault;
|
|
33
|
+
backupPlans;
|
|
34
|
+
customBackupPlans;
|
|
34
35
|
constructor(scope, id, props) {
|
|
35
36
|
super(scope, id);
|
|
36
37
|
// Read org config from CDK context
|
|
37
|
-
const app =
|
|
38
|
+
const app = App.getInstance();
|
|
38
39
|
const orgConfigRaw = app.node.tryGetContext("orgConfig");
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
const parsed = JSON.parse(orgConfigRaw);
|
|
43
|
-
orgConfig =
|
|
44
|
-
typeof parsed === "object" && parsed !== null
|
|
45
|
-
? parsed
|
|
46
|
-
: undefined;
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
validationLogger_1.FjallLogger.warn(`[fjall] Failed to parse orgConfig from CDK context: ${err instanceof Error ? err.message : String(err)}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const providerAccounts = Array.isArray(orgConfig?.providerAccounts)
|
|
53
|
-
? orgConfig.providerAccounts
|
|
54
|
-
: [];
|
|
40
|
+
const orgConfig = parseOrgConfig(typeof orgConfigRaw === "string" ? orgConfigRaw : undefined);
|
|
41
|
+
const providerAccounts = orgConfig.providerAccounts;
|
|
55
42
|
// Determine if this is a compliance account
|
|
56
43
|
const account = providerAccounts.find((pa) => pa.id === props.accountId);
|
|
57
44
|
const isComplianceAccount = account?.environment === "compliance";
|
|
58
45
|
// Get DR configuration
|
|
59
|
-
const disasterRecoveryRegion =
|
|
60
|
-
? orgConfig.disasterRecoveryRegion
|
|
61
|
-
: undefined;
|
|
46
|
+
const disasterRecoveryRegion = orgConfig.disasterRecoveryRegion;
|
|
62
47
|
// Look up compliance account for cross-account replication
|
|
63
48
|
// Skip if the compliance account (prevent self-replication)
|
|
64
49
|
const disasterRecoveryAccount = isComplianceAccount
|
|
@@ -66,7 +51,7 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
66
51
|
: providerAccounts.find((pa) => pa.environment === "compliance");
|
|
67
52
|
// Construct cross-account DR vault ARN (compliance account in DR region)
|
|
68
53
|
const disasterRecoveryVaultArn = disasterRecoveryAccount && disasterRecoveryRegion
|
|
69
|
-
? `arn:aws:backup:${disasterRecoveryRegion}:${disasterRecoveryAccount.id}:backup-vault
|
|
54
|
+
? `arn:aws:backup:${disasterRecoveryRegion}:${disasterRecoveryAccount.id}:backup-vault:${BACKUP_VAULT_NAME}`
|
|
70
55
|
: undefined;
|
|
71
56
|
// Compliance accounts get vault locks for protection
|
|
72
57
|
const lockConfiguration = isComplianceAccount
|
|
@@ -77,9 +62,9 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
77
62
|
}
|
|
78
63
|
: undefined;
|
|
79
64
|
// Create primary backup vault
|
|
80
|
-
this.backupVault = new
|
|
81
|
-
vaultName:
|
|
82
|
-
removalPolicy:
|
|
65
|
+
this.backupVault = new BackupVault(this, "BackupVault", {
|
|
66
|
+
vaultName: BACKUP_VAULT_NAME,
|
|
67
|
+
removalPolicy: RemovalPolicy.RETAIN,
|
|
83
68
|
lockConfiguration: lockConfiguration
|
|
84
69
|
});
|
|
85
70
|
// Configure cross-account access policies
|
|
@@ -87,9 +72,9 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
87
72
|
const allAccounts = providerAccounts;
|
|
88
73
|
const productionAccounts = allAccounts.filter((acc) => acc.environment === "production");
|
|
89
74
|
if (productionAccounts.length > 0) {
|
|
90
|
-
const copyStatement = new
|
|
91
|
-
effect:
|
|
92
|
-
principals: productionAccounts.map((acc) => new
|
|
75
|
+
const copyStatement = new PolicyStatement({
|
|
76
|
+
effect: Effect.ALLOW,
|
|
77
|
+
principals: productionAccounts.map((acc) => new AccountPrincipal(acc.id)),
|
|
93
78
|
actions: ["backup:CopyIntoBackupVault"],
|
|
94
79
|
resources: ["*"]
|
|
95
80
|
});
|
|
@@ -99,23 +84,23 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
99
84
|
// Construct cross-region replication vault ARN (same account, DR region)
|
|
100
85
|
// Only replicate if DR region exists AND is different from current region
|
|
101
86
|
const replicationVaultArn = disasterRecoveryRegion && disasterRecoveryRegion !== props.region
|
|
102
|
-
? `arn:aws:backup:${disasterRecoveryRegion}:${props.accountId}:backup-vault
|
|
87
|
+
? `arn:aws:backup:${disasterRecoveryRegion}:${props.accountId}:backup-vault:${BACKUP_VAULT_NAME}`
|
|
103
88
|
: undefined;
|
|
104
89
|
// Create all three backup plans
|
|
105
90
|
this.backupPlans = {
|
|
106
|
-
standard: new
|
|
91
|
+
standard: new BackupPlan(this, "StandardBackupPlan", {
|
|
107
92
|
planName: "standard",
|
|
108
93
|
rules: this.createStandardBackupRules("standard"),
|
|
109
94
|
tagValue: "default",
|
|
110
95
|
backupVault: this.backupVault
|
|
111
96
|
}),
|
|
112
|
-
resilient: new
|
|
97
|
+
resilient: new BackupPlan(this, "ResilientBackupPlan", {
|
|
113
98
|
planName: "resilient",
|
|
114
99
|
rules: this.createResilientBackupRules("resilient", replicationVaultArn),
|
|
115
100
|
tagValue: "resilient",
|
|
116
101
|
backupVault: this.backupVault
|
|
117
102
|
}),
|
|
118
|
-
enterprise: new
|
|
103
|
+
enterprise: new BackupPlan(this, "EnterpriseBackupPlan", {
|
|
119
104
|
planName: "enterprise",
|
|
120
105
|
rules: this.createEnterpriseBackupRules("enterprise", replicationVaultArn, disasterRecoveryVaultArn),
|
|
121
106
|
tagValue: "enterprise",
|
|
@@ -124,8 +109,8 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
124
109
|
};
|
|
125
110
|
// Create custom backup plans if provided
|
|
126
111
|
if (props.customBackupPlans && props.customBackupPlans.length > 0) {
|
|
127
|
-
this.customBackupPlans = props.customBackupPlans.map((config
|
|
128
|
-
return new
|
|
112
|
+
this.customBackupPlans = props.customBackupPlans.map((config) => {
|
|
113
|
+
return new BackupPlan(this, `CustomBackupPlan-${config.planName}`, {
|
|
129
114
|
planName: config.planName,
|
|
130
115
|
rules: config.rules,
|
|
131
116
|
tagValue: config.tagValue,
|
|
@@ -134,44 +119,44 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
134
119
|
});
|
|
135
120
|
}
|
|
136
121
|
// Export disaster recovery configuration
|
|
137
|
-
new
|
|
122
|
+
new CfnOutput(this, "DisasterRecoveryEnabled", {
|
|
138
123
|
key: "DisasterRecoveryEnabled",
|
|
139
124
|
value: "true",
|
|
140
|
-
exportName:
|
|
125
|
+
exportName: `${id}DisasterRecoveryEnabled`
|
|
141
126
|
});
|
|
142
127
|
if (disasterRecoveryRegion) {
|
|
143
|
-
new
|
|
128
|
+
new CfnOutput(this, "ReplicationRegion", {
|
|
144
129
|
key: "ReplicationRegion",
|
|
145
130
|
value: disasterRecoveryRegion,
|
|
146
|
-
exportName:
|
|
131
|
+
exportName: `${id}ReplicationRegion`
|
|
147
132
|
});
|
|
148
133
|
}
|
|
149
134
|
if (isComplianceAccount) {
|
|
150
|
-
new
|
|
135
|
+
new CfnOutput(this, "VaultLockEnabled", {
|
|
151
136
|
key: "VaultLockEnabled",
|
|
152
137
|
value: "true",
|
|
153
|
-
exportName:
|
|
138
|
+
exportName: `${id}VaultLockEnabled`
|
|
154
139
|
});
|
|
155
140
|
}
|
|
156
141
|
}
|
|
157
142
|
createStandardBackupRules(planName) {
|
|
158
143
|
return [
|
|
159
|
-
new
|
|
144
|
+
new BackupPlanRule({
|
|
160
145
|
ruleName: `${planName}Daily`,
|
|
161
146
|
scheduleExpression: events.Schedule.cron({ hour: "2", minute: "0" }), // 2 AM daily
|
|
162
|
-
deleteAfter:
|
|
147
|
+
deleteAfter: Duration.days(RETENTION_PERIODS.STANDARD),
|
|
163
148
|
startWindow: BACKUP_WINDOWS.START,
|
|
164
149
|
completionWindow: BACKUP_WINDOWS.COMPLETION
|
|
165
150
|
})
|
|
166
151
|
];
|
|
167
152
|
}
|
|
168
153
|
createResilientBackupRules(planName, replicationVaultArn) {
|
|
169
|
-
const copyActions = this.createCopyActions(planName, replicationVaultArn, undefined,
|
|
154
|
+
const copyActions = this.createCopyActions(planName, replicationVaultArn, undefined, Duration.days(RETENTION_PERIODS.ENTERPRISE_CONTINUOUS), undefined);
|
|
170
155
|
return [
|
|
171
|
-
new
|
|
156
|
+
new BackupPlanRule({
|
|
172
157
|
ruleName: `${planName}Daily`,
|
|
173
158
|
scheduleExpression: events.Schedule.cron({ hour: "2", minute: "0" }), // 2 AM daily
|
|
174
|
-
deleteAfter:
|
|
159
|
+
deleteAfter: Duration.days(RETENTION_PERIODS.ENTERPRISE_CONTINUOUS),
|
|
175
160
|
enableContinuousBackup: true,
|
|
176
161
|
startWindow: BACKUP_WINDOWS.START,
|
|
177
162
|
completionWindow: BACKUP_WINDOWS.COMPLETION,
|
|
@@ -180,25 +165,25 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
180
165
|
];
|
|
181
166
|
}
|
|
182
167
|
createEnterpriseBackupRules(planName, replicationVaultArn, disasterRecoveryVaultArn) {
|
|
183
|
-
const continuousCopyActions = this.createCopyActions(`${planName}Continuous`, replicationVaultArn, disasterRecoveryVaultArn,
|
|
184
|
-
const complianceCopyActions = this.createCopyActions(`${planName}Compliance`, replicationVaultArn, disasterRecoveryVaultArn,
|
|
168
|
+
const continuousCopyActions = this.createCopyActions(`${planName}Continuous`, replicationVaultArn, disasterRecoveryVaultArn, Duration.days(RETENTION_PERIODS.ENTERPRISE_CONTINUOUS), undefined);
|
|
169
|
+
const complianceCopyActions = this.createCopyActions(`${planName}Compliance`, replicationVaultArn, disasterRecoveryVaultArn, Duration.days(RETENTION_PERIODS.ENTERPRISE_COMPLIANCE), Duration.days(RETENTION_PERIODS.COLD_STORAGE_ONE_YEAR));
|
|
185
170
|
return [
|
|
186
171
|
// Continuous backup (35-day max PITR window)
|
|
187
|
-
new
|
|
172
|
+
new BackupPlanRule({
|
|
188
173
|
ruleName: `${planName}Continuous`,
|
|
189
174
|
scheduleExpression: events.Schedule.cron({ hour: "2", minute: "0" }), // Daily for continuous backup
|
|
190
|
-
deleteAfter:
|
|
175
|
+
deleteAfter: Duration.days(RETENTION_PERIODS.ENTERPRISE_CONTINUOUS),
|
|
191
176
|
enableContinuousBackup: true,
|
|
192
177
|
startWindow: BACKUP_WINDOWS.START,
|
|
193
178
|
completionWindow: BACKUP_WINDOWS.COMPLETION,
|
|
194
179
|
copyActions: continuousCopyActions
|
|
195
180
|
}),
|
|
196
181
|
// Hourly snapshots for long-term compliance (7 years)
|
|
197
|
-
new
|
|
182
|
+
new BackupPlanRule({
|
|
198
183
|
ruleName: `${planName}HourlyCompliance`,
|
|
199
184
|
scheduleExpression: events.Schedule.cron({ minute: "0" }), // Every hour
|
|
200
|
-
deleteAfter:
|
|
201
|
-
moveToColdStorageAfter:
|
|
185
|
+
deleteAfter: Duration.days(RETENTION_PERIODS.ENTERPRISE_COMPLIANCE),
|
|
186
|
+
moveToColdStorageAfter: Duration.days(RETENTION_PERIODS.COLD_STORAGE_ONE_YEAR),
|
|
202
187
|
startWindow: BACKUP_WINDOWS.START,
|
|
203
188
|
completionWindow: BACKUP_WINDOWS.COMPLETION_SHORT,
|
|
204
189
|
copyActions: complianceCopyActions
|
|
@@ -210,7 +195,7 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
210
195
|
// Cross-region replication
|
|
211
196
|
if (replicationVaultArn) {
|
|
212
197
|
const replicationAction = {
|
|
213
|
-
destinationBackupVault:
|
|
198
|
+
destinationBackupVault: Vault.fromBackupVaultArn(this, `${planName}ReplicationVaultRef`, replicationVaultArn),
|
|
214
199
|
...(deleteAfter && { deleteAfter }),
|
|
215
200
|
// Only add cold storage if specified and >= 90 days
|
|
216
201
|
...(moveToColdStorageAfter &&
|
|
@@ -224,7 +209,7 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
224
209
|
// Cross-account DR vault
|
|
225
210
|
if (disasterRecoveryVaultArn) {
|
|
226
211
|
const drAction = {
|
|
227
|
-
destinationBackupVault:
|
|
212
|
+
destinationBackupVault: Vault.fromBackupVaultArn(this, `${planName}DisasterRecoveryVaultRef`, disasterRecoveryVaultArn),
|
|
228
213
|
...(deleteAfter && { deleteAfter }),
|
|
229
214
|
// Only add cold storage if specified and >= 90 days
|
|
230
215
|
...(moveToColdStorageAfter &&
|
|
@@ -238,5 +223,3 @@ class DisasterRecovery extends constructs_1.Construct {
|
|
|
238
223
|
return actions.length > 0 ? actions : undefined;
|
|
239
224
|
}
|
|
240
225
|
}
|
|
241
|
-
exports.DisasterRecovery = DisasterRecovery;
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzYXN0ZXJSZWNvdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25maWcvYXdzL2Rpc2FzdGVyUmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWlFO0FBQ2pFLDJDQUF1QztBQUN2Qyx1REFBcUU7QUFDckUsdURBSWdDO0FBQ2hDLGlEQUFpRDtBQUNqRCxpREFBZ0Y7QUFFaEYsbUNBQTRCO0FBQzVCLG1FQUEyRDtBQUUzRCx1Q0FBdUM7QUFDdkMsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixRQUFRLEVBQUUsRUFBRTtJQUNaLFNBQVMsRUFBRSxHQUFHO0lBQ2QscUJBQXFCLEVBQUUsRUFBRSxFQUFFLGdDQUFnQztJQUMzRCxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsVUFBVTtJQUN2QyxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsY0FBYztJQUN4QyxxQkFBcUIsRUFBRSxHQUFHO0NBQ2xCLENBQUM7QUFFWCwwQkFBMEI7QUFDMUIsTUFBTSxjQUFjLEdBQUc7SUFDckIsS0FBSyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMzQixVQUFVLEVBQUUsc0JBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzlCLGdCQUFnQixFQUFFLHNCQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUMzQixDQUFDO0FBRVgsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLGFBQWEsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDakMsYUFBYSxFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuQyxZQUFZLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ3RCLENBQUM7QUFjWCxNQUFhLGdCQUFpQixTQUFRLHNCQUFTO0lBUzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixtQ0FBbUM7UUFDbkMsTUFBTSxHQUFHLEdBQUcsYUFBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELElBQUksU0FBOEMsQ0FBQztRQUNuRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QyxTQUFTO29CQUNQLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSTt3QkFDM0MsQ0FBQyxDQUFFLE1BQWtDO3dCQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2xCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLDhCQUFXLENBQUMsSUFBSSxDQUNkLHVEQUF1RCxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDMUcsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztZQUNqRSxDQUFDLENBQUUsU0FBUyxDQUFDLGdCQUFzQztZQUNuRCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsNENBQTRDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekUsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLEVBQUUsV0FBVyxLQUFLLFlBQVksQ0FBQztRQUVsRSx1QkFBdUI7UUFDdkIsTUFBTSxzQkFBc0IsR0FDMUIsT0FBTyxTQUFTLEVBQUUsc0JBQXNCLEtBQUssUUFBUTtZQUNuRCxDQUFDLENBQUMsU0FBUyxDQUFDLHNCQUFzQjtZQUNsQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLDJEQUEyRDtRQUMzRCw0REFBNEQ7UUFDNUQsTUFBTSx1QkFBdUIsR0FBRyxtQkFBbUI7WUFDakQsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBRW5FLHlFQUF5RTtRQUN6RSxNQUFNLHdCQUF3QixHQUM1Qix1QkFBdUIsSUFBSSxzQkFBc0I7WUFDL0MsQ0FBQyxDQUFDLGtCQUFrQixzQkFBc0IsSUFBSSx1QkFBdUIsQ0FBQyxFQUFFLDJCQUEyQjtZQUNuRyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLHFEQUFxRDtRQUNyRCxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQjtZQUMzQyxDQUFDLENBQUM7Z0JBQ0UsWUFBWSxFQUFFLFVBQVUsQ0FBQyxhQUFhO2dCQUN0QyxZQUFZLEVBQUUsVUFBVSxDQUFDLGFBQWE7Z0JBQ3RDLGFBQWEsRUFBRSxVQUFVLENBQUMsWUFBWTthQUN2QztZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLG9CQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUN0RCxTQUFTLEVBQUUsYUFBYTtZQUN4QixhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQjtTQUNyQyxDQUFDLENBQUM7UUFFSCwwQ0FBMEM7UUFFMUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO1lBQ3JDLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FDM0MsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUMxQyxDQUFDO1lBRUYsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sYUFBYSxHQUFHLElBQUkseUJBQWUsQ0FBQztvQkFDeEMsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztvQkFDcEIsVUFBVSxFQUFFLGtCQUFrQixDQUFDLEdBQUcsQ0FDaEMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksMEJBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUN0QztvQkFDRCxPQUFPLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDdkMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFFRCx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLE1BQU0sbUJBQW1CLEdBQ3ZCLHNCQUFzQixJQUFJLHNCQUFzQixLQUFLLEtBQUssQ0FBQyxNQUFNO1lBQy9ELENBQUMsQ0FBQyxrQkFBa0Isc0JBQXNCLElBQUksS0FBSyxDQUFDLFNBQVMsMkJBQTJCO1lBQ3hGLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFaEIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsUUFBUSxFQUFFLElBQUksbUJBQVUsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQ25ELFFBQVEsRUFBRSxVQUFVO2dCQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQztnQkFDakQsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUM5QixDQUFDO1lBQ0YsU0FBUyxFQUFFLElBQUksbUJBQVUsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7Z0JBQ3JELFFBQVEsRUFBRSxXQUFXO2dCQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUNwQyxXQUFXLEVBQ1gsbUJBQW1CLENBQ3BCO2dCQUNELFFBQVEsRUFBRSxXQUFXO2dCQUNyQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDOUIsQ0FBQztZQUNGLFVBQVUsRUFBRSxJQUFJLG1CQUFVLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO2dCQUN2RCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FDckMsWUFBWSxFQUNaLG1CQUFtQixFQUNuQix3QkFBd0IsQ0FDekI7Z0JBQ0QsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUM5QixDQUFDO1NBQ0gsQ0FBQztRQUVGLHlDQUF5QztRQUN6QyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNyRSxPQUFPLElBQUksbUJBQVUsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEtBQUssRUFBRSxFQUFFO29CQUN0RCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7b0JBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztvQkFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO29CQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQzlCLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLHlCQUF5QixFQUFFO1lBQzdDLEdBQUcsRUFBRSx5QkFBeUI7WUFDOUIsS0FBSyxFQUFFLE1BQU07WUFDYixVQUFVLEVBQUUseUJBQXlCO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUMzQixJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO2dCQUN2QyxHQUFHLEVBQUUsbUJBQW1CO2dCQUN4QixLQUFLLEVBQUUsc0JBQXNCO2dCQUM3QixVQUFVLEVBQUUsbUJBQW1CO2FBQ2hDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFDdEMsR0FBRyxFQUFFLGtCQUFrQjtnQkFDdkIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsVUFBVSxFQUFFLGtCQUFrQjthQUMvQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHlCQUF5QixDQUFDLFFBQWdCO1FBQ2hELE9BQU87WUFDTCxJQUFJLDJCQUFjLENBQUM7Z0JBQ2pCLFFBQVEsRUFBRSxHQUFHLFFBQVEsT0FBTztnQkFDNUIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLGFBQWE7Z0JBQ25GLFdBQVcsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELFdBQVcsRUFBRSxjQUFjLENBQUMsS0FBSztnQkFDakMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLFVBQVU7YUFDNUMsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0lBRU8sMEJBQTBCLENBQ2hDLFFBQWdCLEVBQ2hCLG1CQUE0QjtRQUU1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3hDLFFBQVEsRUFDUixtQkFBbUIsRUFDbkIsU0FBUyxFQUNULHNCQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLEVBQ3RELFNBQVMsQ0FDVixDQUFDO1FBRUYsT0FBTztZQUNMLElBQUksMkJBQWMsQ0FBQztnQkFDakIsUUFBUSxFQUFFLEdBQUcsUUFBUSxPQUFPO2dCQUM1QixrQkFBa0IsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsYUFBYTtnQkFDbkYsV0FBVyxFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDO2dCQUNuRSxzQkFBc0IsRUFBRSxJQUFJO2dCQUM1QixXQUFXLEVBQUUsY0FBYyxDQUFDLEtBQUs7Z0JBQ2pDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxVQUFVO2dCQUMzQyxXQUFXO2FBQ1osQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0lBRU8sMkJBQTJCLENBQ2pDLFFBQWdCLEVBQ2hCLG1CQUE0QixFQUM1Qix3QkFBaUM7UUFFakMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ2xELEdBQUcsUUFBUSxZQUFZLEVBQ3ZCLG1CQUFtQixFQUNuQix3QkFBd0IsRUFDeEIsc0JBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsRUFDdEQsU0FBUyxDQUNWLENBQUM7UUFFRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEQsR0FBRyxRQUFRLFlBQVksRUFDdkIsbUJBQW1CLEVBQ25CLHdCQUF3QixFQUN4QixzQkFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUN0RCxzQkFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUN2RCxDQUFDO1FBRUYsT0FBTztZQUNMLDZDQUE2QztZQUM3QyxJQUFJLDJCQUFjLENBQUM7Z0JBQ2pCLFFBQVEsRUFBRSxHQUFHLFFBQVEsWUFBWTtnQkFDakMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLDhCQUE4QjtnQkFDcEcsV0FBVyxFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDO2dCQUNuRSxzQkFBc0IsRUFBRSxJQUFJO2dCQUM1QixXQUFXLEVBQUUsY0FBYyxDQUFDLEtBQUs7Z0JBQ2pDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxVQUFVO2dCQUMzQyxXQUFXLEVBQUUscUJBQXFCO2FBQ25DLENBQUM7WUFDRixzREFBc0Q7WUFDdEQsSUFBSSwyQkFBYyxDQUFDO2dCQUNqQixRQUFRLEVBQUUsR0FBRyxRQUFRLGtCQUFrQjtnQkFDdkMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxhQUFhO2dCQUN4RSxXQUFXLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUM7Z0JBQ25FLHNCQUFzQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUNuQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FDeEM7Z0JBQ0QsV0FBVyxFQUFFLGNBQWMsQ0FBQyxLQUFLO2dCQUNqQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWdCO2dCQUNqRCxXQUFXLEVBQUUscUJBQXFCO2FBQ25DLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUN2QixRQUFnQixFQUNoQixtQkFBNEIsRUFDNUIsd0JBQWlDLEVBQ2pDLFdBQXNCLEVBQ3RCLHNCQUFpQztRQUVqQyxNQUFNLE9BQU8sR0FBZ0MsRUFBRSxDQUFDO1FBRWhELDJCQUEyQjtRQUMzQixJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsTUFBTSxpQkFBaUIsR0FBOEI7Z0JBQ25ELHNCQUFzQixFQUFFLHdCQUFLLENBQUMsa0JBQWtCLENBQzlDLElBQUksRUFDSixHQUFHLFFBQVEscUJBQXFCLEVBQ2hDLG1CQUFtQixDQUNwQjtnQkFDRCxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLG9EQUFvRDtnQkFDcEQsR0FBRyxDQUFDLHNCQUFzQjtvQkFDMUIsc0JBQXNCLENBQUMsTUFBTSxFQUFFO3dCQUM3QixpQkFBaUIsQ0FBQyxvQkFBb0I7b0JBQ3RDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFO29CQUM1QixDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FBQztZQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBOEI7Z0JBQzFDLHNCQUFzQixFQUFFLHdCQUFLLENBQUMsa0JBQWtCLENBQzlDLElBQUksRUFDSixHQUFHLFFBQVEsMEJBQTBCLEVBQ3JDLHdCQUF3QixDQUN6QjtnQkFDRCxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLG9EQUFvRDtnQkFDcEQsR0FBRyxDQUFDLHNCQUFzQjtvQkFDMUIsc0JBQXNCLENBQUMsTUFBTSxFQUFFO3dCQUM3QixpQkFBaUIsQ0FBQyxvQkFBb0I7b0JBQ3RDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFO29CQUM1QixDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FBQztZQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQXpTRCw0Q0F5U0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQmFja3VwVmF1bHQsIEJhY2t1cFBsYW4gfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9iYWNrdXBcIjtcbmltcG9ydCB7XG4gIEJhY2t1cFBsYW5SdWxlLFxuICB0eXBlIEJhY2t1cFBsYW5Db3B5QWN0aW9uUHJvcHMsXG4gIEJhY2t1cFZhdWx0IGFzIFZhdWx0XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYmFja3VwXCI7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7IEFjY291bnRQcmluY2lwYWwsIEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IHR5cGUgUHJvdmlkZXJBY2NvdW50IH0gZnJvbSBcIkBmamFsbC91dGlsXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IEZqYWxsTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXJcIjtcblxuLy8gQmFja3VwIHJldGVudGlvbiBjb25zdGFudHMgKGluIGRheXMpXG5jb25zdCBSRVRFTlRJT05fUEVSSU9EUyA9IHtcbiAgU1RBTkRBUkQ6IDkwLFxuICBSRVNJTElFTlQ6IDM2NSxcbiAgRU5URVJQUklTRV9DT05USU5VT1VTOiAzNSwgLy8gQVdTIG1heCBmb3IgY29udGludW91cyBiYWNrdXBcbiAgRU5URVJQUklTRV9DT01QTElBTkNFOiAyNTU1LCAvLyA3IHllYXJzXG4gIENPTERfU1RPUkFHRV9NSU5JTVVNOiA5MCwgLy8gQVdTIG1pbmltdW1cbiAgQ09MRF9TVE9SQUdFX09ORV9ZRUFSOiAzNjVcbn0gYXMgY29uc3Q7XG5cbi8vIEJhY2t1cCB3aW5kb3cgY29uc3RhbnRzXG5jb25zdCBCQUNLVVBfV0lORE9XUyA9IHtcbiAgU1RBUlQ6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICBDT01QTEVUSU9OOiBEdXJhdGlvbi5ob3VycygxMiksXG4gIENPTVBMRVRJT05fU0hPUlQ6IER1cmF0aW9uLmhvdXJzKDIpXG59IGFzIGNvbnN0O1xuXG4vLyBWYXVsdCBsb2NrIGNvbnN0YW50c1xuY29uc3QgVkFVTFRfTE9DSyA9IHtcbiAgTUlOX1JFVEVOVElPTjogRHVyYXRpb24uZGF5cygzNjUpLFxuICBNQVhfUkVURU5USU9OOiBEdXJhdGlvbi5kYXlzKDM2NTAwKSxcbiAgR1JBQ0VfUEVSSU9EOiBEdXJhdGlvbi5kYXlzKDMpXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUJhY2t1cFBsYW5Db25maWcge1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICBydWxlczogQmFja3VwUGxhblJ1bGVbXTtcbiAgdGFnVmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNhc3RlclJlY292ZXJ5UHJvcHMge1xuICByZWdpb246IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIGN1c3RvbUJhY2t1cFBsYW5zPzogQ3VzdG9tQmFja3VwUGxhbkNvbmZpZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgRGlzYXN0ZXJSZWNvdmVyeSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBiYWNrdXBWYXVsdDogQmFja3VwVmF1bHQ7XG4gIHB1YmxpYyByZWFkb25seSBiYWNrdXBQbGFuczoge1xuICAgIHN0YW5kYXJkOiBCYWNrdXBQbGFuO1xuICAgIHJlc2lsaWVudDogQmFja3VwUGxhbjtcbiAgICBlbnRlcnByaXNlOiBCYWNrdXBQbGFuO1xuICB9O1xuICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tQmFja3VwUGxhbnM/OiBCYWNrdXBQbGFuW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERpc2FzdGVyUmVjb3ZlcnlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBSZWFkIG9yZyBjb25maWcgZnJvbSBDREsgY29udGV4dFxuICAgIGNvbnN0IGFwcCA9IEFwcC5nZXRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IG9yZ0NvbmZpZ1JhdyA9IGFwcC5ub2RlLnRyeUdldENvbnRleHQoXCJvcmdDb25maWdcIik7XG4gICAgbGV0IG9yZ0NvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBvcmdDb25maWdSYXcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uob3JnQ29uZmlnUmF3KTtcbiAgICAgICAgb3JnQ29uZmlnID1cbiAgICAgICAgICB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiICYmIHBhcnNlZCAhPT0gbnVsbFxuICAgICAgICAgICAgPyAocGFyc2VkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgICBgW2ZqYWxsXSBGYWlsZWQgdG8gcGFyc2Ugb3JnQ29uZmlnIGZyb20gQ0RLIGNvbnRleHQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvdmlkZXJBY2NvdW50cyA9IEFycmF5LmlzQXJyYXkob3JnQ29uZmlnPy5wcm92aWRlckFjY291bnRzKVxuICAgICAgPyAob3JnQ29uZmlnLnByb3ZpZGVyQWNjb3VudHMgYXMgUHJvdmlkZXJBY2NvdW50W10pXG4gICAgICA6IFtdO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBjb21wbGlhbmNlIGFjY291bnRcbiAgICBjb25zdCBhY2NvdW50ID0gcHJvdmlkZXJBY2NvdW50cy5maW5kKChwYSkgPT4gcGEuaWQgPT09IHByb3BzLmFjY291bnRJZCk7XG4gICAgY29uc3QgaXNDb21wbGlhbmNlQWNjb3VudCA9IGFjY291bnQ/LmVudmlyb25tZW50ID09PSBcImNvbXBsaWFuY2VcIjtcblxuICAgIC8vIEdldCBEUiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9XG4gICAgICB0eXBlb2Ygb3JnQ29uZmlnPy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gb3JnQ29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb25cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBMb29rIHVwIGNvbXBsaWFuY2UgYWNjb3VudCBmb3IgY3Jvc3MtYWNjb3VudCByZXBsaWNhdGlvblxuICAgIC8vIFNraXAgaWYgdGhlIGNvbXBsaWFuY2UgYWNjb3VudCAocHJldmVudCBzZWxmLXJlcGxpY2F0aW9uKVxuICAgIGNvbnN0IGRpc2FzdGVyUmVjb3ZlcnlBY2NvdW50ID0gaXNDb21wbGlhbmNlQWNjb3VudFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogcHJvdmlkZXJBY2NvdW50cy5maW5kKChwYSkgPT4gcGEuZW52aXJvbm1lbnQgPT09IFwiY29tcGxpYW5jZVwiKTtcblxuICAgIC8vIENvbnN0cnVjdCBjcm9zcy1hY2NvdW50IERSIHZhdWx0IEFSTiAoY29tcGxpYW5jZSBhY2NvdW50IGluIERSIHJlZ2lvbilcbiAgICBjb25zdCBkaXNhc3RlclJlY292ZXJ5VmF1bHRBcm4gPVxuICAgICAgZGlzYXN0ZXJSZWNvdmVyeUFjY291bnQgJiYgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvblxuICAgICAgICA/IGBhcm46YXdzOmJhY2t1cDoke2Rpc2FzdGVyUmVjb3ZlcnlSZWdpb259OiR7ZGlzYXN0ZXJSZWNvdmVyeUFjY291bnQuaWR9OmJhY2t1cC12YXVsdDpiYWNrdXBWYXVsdGBcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBDb21wbGlhbmNlIGFjY291bnRzIGdldCB2YXVsdCBsb2NrcyBmb3IgcHJvdGVjdGlvblxuICAgIGNvbnN0IGxvY2tDb25maWd1cmF0aW9uID0gaXNDb21wbGlhbmNlQWNjb3VudFxuICAgICAgPyB7XG4gICAgICAgICAgbWluUmV0ZW50aW9uOiBWQVVMVF9MT0NLLk1JTl9SRVRFTlRJT04sXG4gICAgICAgICAgbWF4UmV0ZW50aW9uOiBWQVVMVF9MT0NLLk1BWF9SRVRFTlRJT04sXG4gICAgICAgICAgY2hhbmdlYWJsZUZvcjogVkFVTFRfTE9DSy5HUkFDRV9QRVJJT0RcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgcHJpbWFyeSBiYWNrdXAgdmF1bHRcbiAgICB0aGlzLmJhY2t1cFZhdWx0ID0gbmV3IEJhY2t1cFZhdWx0KHRoaXMsIFwiQmFja3VwVmF1bHRcIiwge1xuICAgICAgdmF1bHROYW1lOiBcImJhY2t1cFZhdWx0XCIsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBsb2NrQ29uZmlndXJhdGlvbjogbG9ja0NvbmZpZ3VyYXRpb25cbiAgICB9KTtcblxuICAgIC8vIENvbmZpZ3VyZSBjcm9zcy1hY2NvdW50IGFjY2VzcyBwb2xpY2llc1xuXG4gICAgaWYgKGlzQ29tcGxpYW5jZUFjY291bnQpIHtcbiAgICAgIGNvbnN0IGFsbEFjY291bnRzID0gcHJvdmlkZXJBY2NvdW50cztcbiAgICAgIGNvbnN0IHByb2R1Y3Rpb25BY2NvdW50cyA9IGFsbEFjY291bnRzLmZpbHRlcihcbiAgICAgICAgKGFjYykgPT4gYWNjLmVudmlyb25tZW50ID09PSBcInByb2R1Y3Rpb25cIlxuICAgICAgKTtcblxuICAgICAgaWYgKHByb2R1Y3Rpb25BY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNvcHlTdGF0ZW1lbnQgPSBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBwcmluY2lwYWxzOiBwcm9kdWN0aW9uQWNjb3VudHMubWFwKFxuICAgICAgICAgICAgKGFjYykgPT4gbmV3IEFjY291bnRQcmluY2lwYWwoYWNjLmlkKVxuICAgICAgICAgICksXG4gICAgICAgICAgYWN0aW9uczogW1wiYmFja3VwOkNvcHlJbnRvQmFja3VwVmF1bHRcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJhY2t1cFZhdWx0LnZhdWx0LmFkZFRvQWNjZXNzUG9saWN5KGNvcHlTdGF0ZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCBjcm9zcy1yZWdpb24gcmVwbGljYXRpb24gdmF1bHQgQVJOIChzYW1lIGFjY291bnQsIERSIHJlZ2lvbilcbiAgICAvLyBPbmx5IHJlcGxpY2F0ZSBpZiBEUiByZWdpb24gZXhpc3RzIEFORCBpcyBkaWZmZXJlbnQgZnJvbSBjdXJyZW50IHJlZ2lvblxuICAgIGNvbnN0IHJlcGxpY2F0aW9uVmF1bHRBcm4gPVxuICAgICAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiAmJiBkaXNhc3RlclJlY292ZXJ5UmVnaW9uICE9PSBwcm9wcy5yZWdpb25cbiAgICAgICAgPyBgYXJuOmF3czpiYWNrdXA6JHtkaXNhc3RlclJlY292ZXJ5UmVnaW9ufToke3Byb3BzLmFjY291bnRJZH06YmFja3VwLXZhdWx0OmJhY2t1cFZhdWx0YFxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBhbGwgdGhyZWUgYmFja3VwIHBsYW5zXG4gICAgdGhpcy5iYWNrdXBQbGFucyA9IHtcbiAgICAgIHN0YW5kYXJkOiBuZXcgQmFja3VwUGxhbih0aGlzLCBcIlN0YW5kYXJkQmFja3VwUGxhblwiLCB7XG4gICAgICAgIHBsYW5OYW1lOiBcInN0YW5kYXJkXCIsXG4gICAgICAgIHJ1bGVzOiB0aGlzLmNyZWF0ZVN0YW5kYXJkQmFja3VwUnVsZXMoXCJzdGFuZGFyZFwiKSxcbiAgICAgICAgdGFnVmFsdWU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBiYWNrdXBWYXVsdDogdGhpcy5iYWNrdXBWYXVsdFxuICAgICAgfSksXG4gICAgICByZXNpbGllbnQ6IG5ldyBCYWNrdXBQbGFuKHRoaXMsIFwiUmVzaWxpZW50QmFja3VwUGxhblwiLCB7XG4gICAgICAgIHBsYW5OYW1lOiBcInJlc2lsaWVudFwiLFxuICAgICAgICBydWxlczogdGhpcy5jcmVhdGVSZXNpbGllbnRCYWNrdXBSdWxlcyhcbiAgICAgICAgICBcInJlc2lsaWVudFwiLFxuICAgICAgICAgIHJlcGxpY2F0aW9uVmF1bHRBcm5cbiAgICAgICAgKSxcbiAgICAgICAgdGFnVmFsdWU6IFwicmVzaWxpZW50XCIsXG4gICAgICAgIGJhY2t1cFZhdWx0OiB0aGlzLmJhY2t1cFZhdWx0XG4gICAgICB9KSxcbiAgICAgIGVudGVycHJpc2U6IG5ldyBCYWNrdXBQbGFuKHRoaXMsIFwiRW50ZXJwcmlzZUJhY2t1cFBsYW5cIiwge1xuICAgICAgICBwbGFuTmFtZTogXCJlbnRlcnByaXNlXCIsXG4gICAgICAgIHJ1bGVzOiB0aGlzLmNyZWF0ZUVudGVycHJpc2VCYWNrdXBSdWxlcyhcbiAgICAgICAgICBcImVudGVycHJpc2VcIixcbiAgICAgICAgICByZXBsaWNhdGlvblZhdWx0QXJuLFxuICAgICAgICAgIGRpc2FzdGVyUmVjb3ZlcnlWYXVsdEFyblxuICAgICAgICApLFxuICAgICAgICB0YWdWYWx1ZTogXCJlbnRlcnByaXNlXCIsXG4gICAgICAgIGJhY2t1cFZhdWx0OiB0aGlzLmJhY2t1cFZhdWx0XG4gICAgICB9KVxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgY3VzdG9tIGJhY2t1cCBwbGFucyBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5jdXN0b21CYWNrdXBQbGFucyAmJiBwcm9wcy5jdXN0b21CYWNrdXBQbGFucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmN1c3RvbUJhY2t1cFBsYW5zID0gcHJvcHMuY3VzdG9tQmFja3VwUGxhbnMubWFwKChjb25maWcsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFja3VwUGxhbih0aGlzLCBgQ3VzdG9tQmFja3VwUGxhbiR7aW5kZXh9YCwge1xuICAgICAgICAgIHBsYW5OYW1lOiBjb25maWcucGxhbk5hbWUsXG4gICAgICAgICAgcnVsZXM6IGNvbmZpZy5ydWxlcyxcbiAgICAgICAgICB0YWdWYWx1ZTogY29uZmlnLnRhZ1ZhbHVlLFxuICAgICAgICAgIGJhY2t1cFZhdWx0OiB0aGlzLmJhY2t1cFZhdWx0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwb3J0IGRpc2FzdGVyIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb25cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiRGlzYXN0ZXJSZWNvdmVyeUVuYWJsZWRcIiwge1xuICAgICAga2V5OiBcIkRpc2FzdGVyUmVjb3ZlcnlFbmFibGVkXCIsXG4gICAgICB2YWx1ZTogXCJ0cnVlXCIsXG4gICAgICBleHBvcnROYW1lOiBcIkRpc2FzdGVyUmVjb3ZlcnlFbmFibGVkXCJcbiAgICB9KTtcblxuICAgIGlmIChkaXNhc3RlclJlY292ZXJ5UmVnaW9uKSB7XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiUmVwbGljYXRpb25SZWdpb25cIiwge1xuICAgICAgICBrZXk6IFwiUmVwbGljYXRpb25SZWdpb25cIixcbiAgICAgICAgdmFsdWU6IGRpc2FzdGVyUmVjb3ZlcnlSZWdpb24sXG4gICAgICAgIGV4cG9ydE5hbWU6IFwiUmVwbGljYXRpb25SZWdpb25cIlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcGxpYW5jZUFjY291bnQpIHtcbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJWYXVsdExvY2tFbmFibGVkXCIsIHtcbiAgICAgICAga2V5OiBcIlZhdWx0TG9ja0VuYWJsZWRcIixcbiAgICAgICAgdmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICBleHBvcnROYW1lOiBcIlZhdWx0TG9ja0VuYWJsZWRcIlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGFuZGFyZEJhY2t1cFJ1bGVzKHBsYW5OYW1lOiBzdHJpbmcpOiBCYWNrdXBQbGFuUnVsZVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgbmV3IEJhY2t1cFBsYW5SdWxlKHtcbiAgICAgICAgcnVsZU5hbWU6IGAke3BsYW5OYW1lfURhaWx5YCxcbiAgICAgICAgc2NoZWR1bGVFeHByZXNzaW9uOiBldmVudHMuU2NoZWR1bGUuY3Jvbih7IGhvdXI6IFwiMlwiLCBtaW51dGU6IFwiMFwiIH0pLCAvLyAyIEFNIGRhaWx5XG4gICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKFJFVEVOVElPTl9QRVJJT0RTLlNUQU5EQVJEKSxcbiAgICAgICAgc3RhcnRXaW5kb3c6IEJBQ0tVUF9XSU5ET1dTLlNUQVJULFxuICAgICAgICBjb21wbGV0aW9uV2luZG93OiBCQUNLVVBfV0lORE9XUy5DT01QTEVUSU9OXG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc2lsaWVudEJhY2t1cFJ1bGVzKFxuICAgIHBsYW5OYW1lOiBzdHJpbmcsXG4gICAgcmVwbGljYXRpb25WYXVsdEFybj86IHN0cmluZ1xuICApOiBCYWNrdXBQbGFuUnVsZVtdIHtcbiAgICBjb25zdCBjb3B5QWN0aW9ucyA9IHRoaXMuY3JlYXRlQ29weUFjdGlvbnMoXG4gICAgICBwbGFuTmFtZSxcbiAgICAgIHJlcGxpY2F0aW9uVmF1bHRBcm4sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBEdXJhdGlvbi5kYXlzKFJFVEVOVElPTl9QRVJJT0RTLkVOVEVSUFJJU0VfQ09OVElOVU9VUyksXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBCYWNrdXBQbGFuUnVsZSh7XG4gICAgICAgIHJ1bGVOYW1lOiBgJHtwbGFuTmFtZX1EYWlseWAsXG4gICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogZXZlbnRzLlNjaGVkdWxlLmNyb24oeyBob3VyOiBcIjJcIiwgbWludXRlOiBcIjBcIiB9KSwgLy8gMiBBTSBkYWlseVxuICAgICAgICBkZWxldGVBZnRlcjogRHVyYXRpb24uZGF5cyhSRVRFTlRJT05fUEVSSU9EUy5FTlRFUlBSSVNFX0NPTlRJTlVPVVMpLFxuICAgICAgICBlbmFibGVDb250aW51b3VzQmFja3VwOiB0cnVlLFxuICAgICAgICBzdGFydFdpbmRvdzogQkFDS1VQX1dJTkRPV1MuU1RBUlQsXG4gICAgICAgIGNvbXBsZXRpb25XaW5kb3c6IEJBQ0tVUF9XSU5ET1dTLkNPTVBMRVRJT04sXG4gICAgICAgIGNvcHlBY3Rpb25zXG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVudGVycHJpc2VCYWNrdXBSdWxlcyhcbiAgICBwbGFuTmFtZTogc3RyaW5nLFxuICAgIHJlcGxpY2F0aW9uVmF1bHRBcm4/OiBzdHJpbmcsXG4gICAgZGlzYXN0ZXJSZWNvdmVyeVZhdWx0QXJuPzogc3RyaW5nXG4gICk6IEJhY2t1cFBsYW5SdWxlW10ge1xuICAgIGNvbnN0IGNvbnRpbnVvdXNDb3B5QWN0aW9ucyA9IHRoaXMuY3JlYXRlQ29weUFjdGlvbnMoXG4gICAgICBgJHtwbGFuTmFtZX1Db250aW51b3VzYCxcbiAgICAgIHJlcGxpY2F0aW9uVmF1bHRBcm4sXG4gICAgICBkaXNhc3RlclJlY292ZXJ5VmF1bHRBcm4sXG4gICAgICBEdXJhdGlvbi5kYXlzKFJFVEVOVElPTl9QRVJJT0RTLkVOVEVSUFJJU0VfQ09OVElOVU9VUyksXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgY29uc3QgY29tcGxpYW5jZUNvcHlBY3Rpb25zID0gdGhpcy5jcmVhdGVDb3B5QWN0aW9ucyhcbiAgICAgIGAke3BsYW5OYW1lfUNvbXBsaWFuY2VgLFxuICAgICAgcmVwbGljYXRpb25WYXVsdEFybixcbiAgICAgIGRpc2FzdGVyUmVjb3ZlcnlWYXVsdEFybixcbiAgICAgIER1cmF0aW9uLmRheXMoUkVURU5USU9OX1BFUklPRFMuRU5URVJQUklTRV9DT01QTElBTkNFKSxcbiAgICAgIER1cmF0aW9uLmRheXMoUkVURU5USU9OX1BFUklPRFMuQ09MRF9TVE9SQUdFX09ORV9ZRUFSKVxuICAgICk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ29udGludW91cyBiYWNrdXAgKDM1LWRheSBtYXggUElUUiB3aW5kb3cpXG4gICAgICBuZXcgQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICBydWxlTmFtZTogYCR7cGxhbk5hbWV9Q29udGludW91c2AsXG4gICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogZXZlbnRzLlNjaGVkdWxlLmNyb24oeyBob3VyOiBcIjJcIiwgbWludXRlOiBcIjBcIiB9KSwgLy8gRGFpbHkgZm9yIGNvbnRpbnVvdXMgYmFja3VwXG4gICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKFJFVEVOVElPTl9QRVJJT0RTLkVOVEVSUFJJU0VfQ09OVElOVU9VUyksXG4gICAgICAgIGVuYWJsZUNvbnRpbnVvdXNCYWNrdXA6IHRydWUsXG4gICAgICAgIHN0YXJ0V2luZG93OiBCQUNLVVBfV0lORE9XUy5TVEFSVCxcbiAgICAgICAgY29tcGxldGlvbldpbmRvdzogQkFDS1VQX1dJTkRPV1MuQ09NUExFVElPTixcbiAgICAgICAgY29weUFjdGlvbnM6IGNvbnRpbnVvdXNDb3B5QWN0aW9uc1xuICAgICAgfSksXG4gICAgICAvLyBIb3VybHkgc25hcHNob3RzIGZvciBsb25nLXRlcm0gY29tcGxpYW5jZSAoNyB5ZWFycylcbiAgICAgIG5ldyBCYWNrdXBQbGFuUnVsZSh7XG4gICAgICAgIHJ1bGVOYW1lOiBgJHtwbGFuTmFtZX1Ib3VybHlDb21wbGlhbmNlYCxcbiAgICAgICAgc2NoZWR1bGVFeHByZXNzaW9uOiBldmVudHMuU2NoZWR1bGUuY3Jvbih7IG1pbnV0ZTogXCIwXCIgfSksIC8vIEV2ZXJ5IGhvdXJcbiAgICAgICAgZGVsZXRlQWZ0ZXI6IER1cmF0aW9uLmRheXMoUkVURU5USU9OX1BFUklPRFMuRU5URVJQUklTRV9DT01QTElBTkNFKSxcbiAgICAgICAgbW92ZVRvQ29sZFN0b3JhZ2VBZnRlcjogRHVyYXRpb24uZGF5cyhcbiAgICAgICAgICBSRVRFTlRJT05fUEVSSU9EUy5DT0xEX1NUT1JBR0VfT05FX1lFQVJcbiAgICAgICAgKSxcbiAgICAgICAgc3RhcnRXaW5kb3c6IEJBQ0tVUF9XSU5ET1dTLlNUQVJULFxuICAgICAgICBjb21wbGV0aW9uV2luZG93OiBCQUNLVVBfV0lORE9XUy5DT01QTEVUSU9OX1NIT1JULFxuICAgICAgICBjb3B5QWN0aW9uczogY29tcGxpYW5jZUNvcHlBY3Rpb25zXG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvcHlBY3Rpb25zKFxuICAgIHBsYW5OYW1lOiBzdHJpbmcsXG4gICAgcmVwbGljYXRpb25WYXVsdEFybj86IHN0cmluZyxcbiAgICBkaXNhc3RlclJlY292ZXJ5VmF1bHRBcm4/OiBzdHJpbmcsXG4gICAgZGVsZXRlQWZ0ZXI/OiBEdXJhdGlvbixcbiAgICBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyPzogRHVyYXRpb25cbiAgKTogQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wc1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhY3Rpb25zOiBCYWNrdXBQbGFuQ29weUFjdGlvblByb3BzW10gPSBbXTtcblxuICAgIC8vIENyb3NzLXJlZ2lvbiByZXBsaWNhdGlvblxuICAgIGlmIChyZXBsaWNhdGlvblZhdWx0QXJuKSB7XG4gICAgICBjb25zdCByZXBsaWNhdGlvbkFjdGlvbjogQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wcyA9IHtcbiAgICAgICAgZGVzdGluYXRpb25CYWNrdXBWYXVsdDogVmF1bHQuZnJvbUJhY2t1cFZhdWx0QXJuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7cGxhbk5hbWV9UmVwbGljYXRpb25WYXVsdFJlZmAsXG4gICAgICAgICAgcmVwbGljYXRpb25WYXVsdEFyblxuICAgICAgICApLFxuICAgICAgICAuLi4oZGVsZXRlQWZ0ZXIgJiYgeyBkZWxldGVBZnRlciB9KSxcbiAgICAgICAgLy8gT25seSBhZGQgY29sZCBzdG9yYWdlIGlmIHNwZWNpZmllZCBhbmQgPj0gOTAgZGF5c1xuICAgICAgICAuLi4obW92ZVRvQ29sZFN0b3JhZ2VBZnRlciAmJlxuICAgICAgICBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyLnRvRGF5cygpID49XG4gICAgICAgICAgUkVURU5USU9OX1BFUklPRFMuQ09MRF9TVE9SQUdFX01JTklNVU1cbiAgICAgICAgICA/IHsgbW92ZVRvQ29sZFN0b3JhZ2VBZnRlciB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgICBhY3Rpb25zLnB1c2gocmVwbGljYXRpb25BY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIENyb3NzLWFjY291bnQgRFIgdmF1bHRcbiAgICBpZiAoZGlzYXN0ZXJSZWNvdmVyeVZhdWx0QXJuKSB7XG4gICAgICBjb25zdCBkckFjdGlvbjogQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wcyA9IHtcbiAgICAgICAgZGVzdGluYXRpb25CYWNrdXBWYXVsdDogVmF1bHQuZnJvbUJhY2t1cFZhdWx0QXJuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7cGxhbk5hbWV9RGlzYXN0ZXJSZWNvdmVyeVZhdWx0UmVmYCxcbiAgICAgICAgICBkaXNhc3RlclJlY292ZXJ5VmF1bHRBcm5cbiAgICAgICAgKSxcbiAgICAgICAgLi4uKGRlbGV0ZUFmdGVyICYmIHsgZGVsZXRlQWZ0ZXIgfSksXG4gICAgICAgIC8vIE9ubHkgYWRkIGNvbGQgc3RvcmFnZSBpZiBzcGVjaWZpZWQgYW5kID49IDkwIGRheXNcbiAgICAgICAgLi4uKG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXIgJiZcbiAgICAgICAgbW92ZVRvQ29sZFN0b3JhZ2VBZnRlci50b0RheXMoKSA+PVxuICAgICAgICAgIFJFVEVOVElPTl9QRVJJT0RTLkNPTERfU1RPUkFHRV9NSU5JTVVNXG4gICAgICAgICAgPyB7IG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXIgfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuICAgICAgYWN0aW9ucy5wdXNoKGRyQWN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9ucy5sZW5ndGggPiAwID8gYWN0aW9ucyA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
/**
|
|
3
|
+
* Enables EBS default encryption at the account level via a Custom Resource.
|
|
4
|
+
* Stack deletion does NOT revert this setting — security features are preserved.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EbsDefaultEncryption extends Construct {
|
|
7
|
+
constructor(scope: Construct, id: string);
|
|
8
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Duration } from "aws-cdk-lib";
|
|
2
|
+
import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
|
|
3
|
+
import { Runtime } from "aws-cdk-lib/aws-lambda";
|
|
4
|
+
import { Construct } from "constructs";
|
|
5
|
+
import { CustomResource } from "../../resources/aws/utilities/customResource.js";
|
|
6
|
+
/**
|
|
7
|
+
* Enables EBS default encryption at the account level via a Custom Resource.
|
|
8
|
+
* Stack deletion does NOT revert this setting — security features are preserved.
|
|
9
|
+
*/
|
|
10
|
+
export class EbsDefaultEncryption extends Construct {
|
|
11
|
+
constructor(scope, id) {
|
|
12
|
+
super(scope, id);
|
|
13
|
+
new CustomResource(this, "EbsDefaultEncryption", {
|
|
14
|
+
runtime: Runtime.NODEJS_22_X,
|
|
15
|
+
timeout: Duration.minutes(5),
|
|
16
|
+
lambdaDescription: "Enables EBS default encryption at account level",
|
|
17
|
+
inlinePolicy: [
|
|
18
|
+
new PolicyStatement({
|
|
19
|
+
effect: Effect.ALLOW,
|
|
20
|
+
actions: [
|
|
21
|
+
"ec2:EnableEbsEncryptionByDefault",
|
|
22
|
+
"ec2:GetEbsEncryptionByDefault"
|
|
23
|
+
],
|
|
24
|
+
resources: ["*"]
|
|
25
|
+
})
|
|
26
|
+
],
|
|
27
|
+
inlineCode: `
|
|
28
|
+
const { EC2Client, EnableEbsEncryptionByDefaultCommand } = require('@aws-sdk/client-ec2');
|
|
29
|
+
|
|
30
|
+
exports.handler = async (event) => {
|
|
31
|
+
const physicalResourceId = event.PhysicalResourceId || event.LogicalResourceId || 'ebs-default-encryption';
|
|
32
|
+
if (event.RequestType === 'Delete') {
|
|
33
|
+
return { PhysicalResourceId: physicalResourceId };
|
|
34
|
+
}
|
|
35
|
+
const client = new EC2Client({});
|
|
36
|
+
await client.send(new EnableEbsEncryptionByDefaultCommand({}));
|
|
37
|
+
return { PhysicalResourceId: physicalResourceId };
|
|
38
|
+
};`
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -1,34 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const aws_events_1 = require("aws-cdk-lib/aws-events");
|
|
12
|
-
const Targets = require("aws-cdk-lib/aws-events-targets");
|
|
13
|
-
class EcrDefaultImage extends constructs_1.Construct {
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { CodeBuildProject } from "../../resources/aws/utilities/codeBuild.js";
|
|
3
|
+
import { BuildSpec } from "aws-cdk-lib/aws-codebuild";
|
|
4
|
+
import { LogGroup } from "../../resources/aws/logging/logGroup.js";
|
|
5
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
6
|
+
import { Role } from "../../resources/aws/iam/role.js";
|
|
7
|
+
import { PolicyDocument, PolicyStatement, ServicePrincipal } from "aws-cdk-lib/aws-iam";
|
|
8
|
+
import { EventBus, EventField, Rule, RuleTargetInput } from "aws-cdk-lib/aws-events";
|
|
9
|
+
import * as Targets from "aws-cdk-lib/aws-events-targets";
|
|
10
|
+
export class EcrDefaultImage extends Construct {
|
|
14
11
|
constructor(scope, id, props) {
|
|
15
12
|
super(scope, id);
|
|
16
|
-
const logGroup = new
|
|
13
|
+
const logGroup = new LogGroup(this, `${id}LogGroup`, {
|
|
17
14
|
logGroupName: `/vpc/codebuild/${id}/`,
|
|
18
|
-
removalPolicy:
|
|
15
|
+
removalPolicy: RemovalPolicy.DESTROY
|
|
19
16
|
});
|
|
20
|
-
const ecrDefaultImageRole = new
|
|
17
|
+
const ecrDefaultImageRole = new Role(this, `${id}Role`, {
|
|
21
18
|
roleName: `ecrDefaultImageRole-${props.region.replace(/-/g, "")}`,
|
|
22
19
|
description: "Role to push default ECR images into new repositories",
|
|
23
|
-
assumedBy: new
|
|
20
|
+
assumedBy: new ServicePrincipal("codebuild.amazonaws.com"),
|
|
24
21
|
inlinePolicies: {
|
|
25
|
-
["pushEcrImage"]: new
|
|
22
|
+
["pushEcrImage"]: new PolicyDocument({
|
|
26
23
|
statements: [
|
|
27
|
-
new
|
|
24
|
+
new PolicyStatement({
|
|
28
25
|
actions: ["ecr:GetAuthorizationToken"],
|
|
29
26
|
resources: ["*"]
|
|
30
27
|
}),
|
|
31
|
-
new
|
|
28
|
+
new PolicyStatement({
|
|
32
29
|
actions: [
|
|
33
30
|
"ecr:BatchGetImage",
|
|
34
31
|
"ecr:GetDownloadUrlForLayer",
|
|
@@ -44,9 +41,9 @@ class EcrDefaultImage extends constructs_1.Construct {
|
|
|
44
41
|
})
|
|
45
42
|
]
|
|
46
43
|
}),
|
|
47
|
-
["writeLogs"]: new
|
|
44
|
+
["writeLogs"]: new PolicyDocument({
|
|
48
45
|
statements: [
|
|
49
|
-
new
|
|
46
|
+
new PolicyStatement({
|
|
50
47
|
actions: [
|
|
51
48
|
"logs:CreateLogGroup",
|
|
52
49
|
"logs:CreateLogStream",
|
|
@@ -58,10 +55,10 @@ class EcrDefaultImage extends constructs_1.Construct {
|
|
|
58
55
|
})
|
|
59
56
|
}
|
|
60
57
|
});
|
|
61
|
-
const codeBuildProject = new
|
|
58
|
+
const codeBuildProject = new CodeBuildProject(this, `${id}CodeBuildProject`, {
|
|
62
59
|
description: "Build and push the default ECR image to new repositories",
|
|
63
60
|
projectName: "ecrDefaultImage",
|
|
64
|
-
buildSpec:
|
|
61
|
+
buildSpec: BuildSpec.fromObject({
|
|
65
62
|
version: 0.2,
|
|
66
63
|
phases: {
|
|
67
64
|
install: {
|
|
@@ -90,7 +87,7 @@ class EcrDefaultImage extends constructs_1.Construct {
|
|
|
90
87
|
role: ecrDefaultImageRole
|
|
91
88
|
});
|
|
92
89
|
const eventInputMapping = {
|
|
93
|
-
repositoryUri:
|
|
90
|
+
repositoryUri: EventField.fromPath("$.detail.responseElements.repository.repositoryUri")
|
|
94
91
|
};
|
|
95
92
|
const eventInputTemplate = {
|
|
96
93
|
environmentVariablesOverride: [
|
|
@@ -100,11 +97,11 @@ class EcrDefaultImage extends constructs_1.Construct {
|
|
|
100
97
|
}
|
|
101
98
|
]
|
|
102
99
|
};
|
|
103
|
-
new
|
|
100
|
+
new Rule(this, `${id}EventRule`, {
|
|
104
101
|
ruleName: "ecrCreationRule",
|
|
105
102
|
description: "Trigger the default ECR image build when a new repository is created",
|
|
106
103
|
enabled: true,
|
|
107
|
-
eventBus:
|
|
104
|
+
eventBus: EventBus.fromEventBusArn(this, `${id}EventBus`, props.eventBusArn),
|
|
108
105
|
eventPattern: {
|
|
109
106
|
source: ["aws.ecr"],
|
|
110
107
|
detailType: ["AWS API Call via CloudTrail"],
|
|
@@ -115,11 +112,9 @@ class EcrDefaultImage extends constructs_1.Construct {
|
|
|
115
112
|
},
|
|
116
113
|
targets: [
|
|
117
114
|
new Targets.CodeBuildProject(codeBuildProject.project, {
|
|
118
|
-
event:
|
|
115
|
+
event: RuleTargetInput.fromObject(eventInputTemplate)
|
|
119
116
|
})
|
|
120
117
|
]
|
|
121
118
|
});
|
|
122
119
|
}
|
|
123
120
|
}
|
|
124
|
-
exports.EcrDefaultImage = EcrDefaultImage;
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNyRGVmYXVsdEltYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvZWNyRGVmYXVsdEltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyx1RUFBMkU7QUFDM0UsNkRBQXNEO0FBQ3RELG1FQUFnRTtBQUNoRSw2Q0FBNkQ7QUFDN0QsdURBQW9EO0FBQ3BELGlEQUk2QjtBQUM3Qix1REFLZ0M7QUFDaEMsMERBQTBEO0FBUTFELE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQUM1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFO1lBQ25ELFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHO1lBQ3JDLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87U0FDckMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRTtZQUN0RCxRQUFRLEVBQUUsdUJBQXVCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNqRSxXQUFXLEVBQUUsdURBQXVEO1lBQ3BFLFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLHlCQUF5QixDQUFDO1lBQzFELGNBQWMsRUFBRTtnQkFDZCxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksd0JBQWMsQ0FBQztvQkFDbkMsVUFBVSxFQUFFO3dCQUNWLElBQUkseUJBQWUsQ0FBQzs0QkFDbEIsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7NEJBQ3RDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzt5QkFDakIsQ0FB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Q0wsQ0FBQztDQUNGO0FBL0hELDBDQStIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDb2RlQnVpbGRQcm9qZWN0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2NvZGVCdWlsZFwiO1xuaW1wb3J0IHsgQnVpbGRTcGVjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlYnVpbGRcIjtcbmltcG9ydCB7IExvZ0dyb3VwIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbG9nZ2luZy9sb2dHcm91cFwiO1xuaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSwgdHlwZSBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvaWFtL3JvbGVcIjtcbmltcG9ydCB7XG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIEV2ZW50QnVzLFxuICBFdmVudEZpZWxkLFxuICBSdWxlLFxuICBSdWxlVGFyZ2V0SW5wdXRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCAqIGFzIFRhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuXG5pbnRlcmZhY2UgRWNyRGVmYXVsdEltYWdlUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBldmVudEJ1c0Fybjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRWNyRGVmYXVsdEltYWdlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjckRlZmF1bHRJbWFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGAke2lkfUxvZ0dyb3VwYCwge1xuICAgICAgbG9nR3JvdXBOYW1lOiBgL3ZwYy9jb2RlYnVpbGQvJHtpZH0vYCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgIH0pO1xuXG4gICAgY29uc3QgZWNyRGVmYXVsdEltYWdlUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke2lkfVJvbGVgLCB7XG4gICAgICByb2xlTmFtZTogYGVjckRlZmF1bHRJbWFnZVJvbGUtJHtwcm9wcy5yZWdpb24ucmVwbGFjZSgvLS9nLCBcIlwiKX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiUm9sZSB0byBwdXNoIGRlZmF1bHQgRUNSIGltYWdlcyBpbnRvIG5ldyByZXBvc2l0b3JpZXNcIixcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJjb2RlYnVpbGQuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIFtcInB1c2hFY3JJbWFnZVwiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wiZWNyOkdldEF1dGhvcml6YXRpb25Ub2tlblwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJlY3I6QmF0Y2hHZXRJbWFnZVwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXJcIixcbiAgICAgICAgICAgICAgICBcImVjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHlcIixcbiAgICAgICAgICAgICAgICBcImVjcjpJbml0aWF0ZUxheWVyVXBsb2FkXCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6VXBsb2FkTGF5ZXJQYXJ0XCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6Q29tcGxldGVMYXllclVwbG9hZFwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOlB1dEltYWdlXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6ZWNyOiR7cHJvcHMucmVnaW9ufToke3Byb3BzLmFjY291bnRJZH06cmVwb3NpdG9yeS8qYFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSksXG4gICAgICAgIFtcIndyaXRlTG9nc1wiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIFwibG9nczpDcmVhdGVMb2dHcm91cFwiLFxuICAgICAgICAgICAgICAgIFwibG9nczpDcmVhdGVMb2dTdHJlYW1cIixcbiAgICAgICAgICAgICAgICBcImxvZ3M6UHV0TG9nRXZlbnRzXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbbG9nR3JvdXAubG9nR3JvdXBBcm5dXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGNvZGVCdWlsZFByb2plY3QgPSBuZXcgQ29kZUJ1aWxkUHJvamVjdChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtpZH1Db2RlQnVpbGRQcm9qZWN0YCxcbiAgICAgIHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQnVpbGQgYW5kIHB1c2ggdGhlIGRlZmF1bHQgRUNSIGltYWdlIHRvIG5ldyByZXBvc2l0b3JpZXNcIixcbiAgICAgICAgcHJvamVjdE5hbWU6IFwiZWNyRGVmYXVsdEltYWdlXCIsXG4gICAgICAgIGJ1aWxkU3BlYzogQnVpbGRTcGVjLmZyb21PYmplY3Qoe1xuICAgICAgICAgIHZlcnNpb246IDAuMixcbiAgICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICAgIGluc3RhbGw6IHtcbiAgICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgYnVpbGR4IGlzIGF2YWlsYWJsZSAoaW5zdGFsbHMgbGF0ZXN0IGlmIG1pc3Npbmcvb3V0ZGF0ZWQpXG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGFyY2hpdGVjdHVyZSBkeW5hbWljYWxseSB0byBzdXBwb3J0IGJvdGggeDg2XzY0IGFuZCBBUk02NCBDb2RlQnVpbGRcbiAgICAgICAgICAgICAgICBcImRvY2tlciBidWlsZHggdmVyc2lvbiB8fCAobWtkaXIgLXAgfi8uZG9ja2VyL2NsaS1wbHVnaW5zICYmIEFSQ0g9JCh1bmFtZSAtbSB8IHNlZCAncy94ODZfNjQvYW1kNjQvJyB8IHNlZCAncy9hYXJjaDY0L2FybTY0LycpICYmIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vZG9ja2VyL2J1aWxkeC9yZWxlYXNlcy9sYXRlc3QvZG93bmxvYWQvYnVpbGR4LSQodW5hbWUgLXMgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyktJHtBUkNIfSAtbyB+Ly5kb2NrZXIvY2xpLXBsdWdpbnMvZG9ja2VyLWJ1aWxkeCAmJiBjaG1vZCAreCB+Ly5kb2NrZXIvY2xpLXBsdWdpbnMvZG9ja2VyLWJ1aWxkeClcIlxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgICAvLyBMb2dpbiB0byBwcml2YXRlIEVDUlxuICAgICAgICAgICAgICAgIGBhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAke3Byb3BzLnJlZ2lvbn0gfCBkb2NrZXIgbG9naW4gLS11c2VybmFtZSBBV1MgLS1wYXNzd29yZC1zdGRpbiAke3Byb3BzLmFjY291bnRJZH0uZGtyLmVjci4ke3Byb3BzLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsXG4gICAgICAgICAgICAgICAgLy8gQ29weSBtdWx0aS1hcmNoIG1hbmlmZXN0cyBkaXJlY3RseSAocHJlc2VydmVzIGFsbCBhcmNoaXRlY3R1cmVzKVxuICAgICAgICAgICAgICAgIFwiZG9ja2VyIGJ1aWxkeCBpbWFnZXRvb2xzIGNyZWF0ZSAtLXRhZyAkRUNSX1JFUE9TSVRPUlk6bGF0ZXN0IHB1YmxpYy5lY3IuYXdzL2ZqYWxsL3dlbGNvbWU6bGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgXCJkb2NrZXIgYnVpbGR4IGltYWdldG9vbHMgY3JlYXRlIC0tdGFnICRFQ1JfUkVQT1NJVE9SWTpiYWNrZW5kIHB1YmxpYy5lY3IuYXdzL2ZqYWxsL3dlbGNvbWU6YmFja2VuZFwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBsb2dnaW5nOiB7XG4gICAgICAgICAgY2xvdWRXYXRjaDoge1xuICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByb2xlOiBlY3JEZWZhdWx0SW1hZ2VSb2xlXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGV2ZW50SW5wdXRNYXBwaW5nID0ge1xuICAgICAgcmVwb3NpdG9yeVVyaTogRXZlbnRGaWVsZC5mcm9tUGF0aChcbiAgICAgICAgXCIkLmRldGFpbC5yZXNwb25zZUVsZW1lbnRzLnJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaVwiXG4gICAgICApXG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50SW5wdXRUZW1wbGF0ZSA9IHtcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzT3ZlcnJpZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiRUNSX1JFUE9TSVRPUllcIixcbiAgICAgICAgICB2YWx1ZTogZXZlbnRJbnB1dE1hcHBpbmcucmVwb3NpdG9yeVVyaVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIG5ldyBSdWxlKHRoaXMsIGAke2lkfUV2ZW50UnVsZWAsIHtcbiAgICAgIHJ1bGVOYW1lOiBcImVjckNyZWF0aW9uUnVsZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVHJpZ2dlciB0aGUgZGVmYXVsdCBFQ1IgaW1hZ2UgYnVpbGQgd2hlbiBhIG5ldyByZXBvc2l0b3J5IGlzIGNyZWF0ZWRcIixcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBldmVudEJ1czogRXZlbnRCdXMuZnJvbUV2ZW50QnVzQXJuKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1FdmVudEJ1c2AsXG4gICAgICAgIHByb3BzLmV2ZW50QnVzQXJuXG4gICAgICApLFxuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIHNvdXJjZTogW1wiYXdzLmVjclwiXSxcbiAgICAgICAgZGV0YWlsVHlwZTogW1wiQVdTIEFQSSBDYWxsIHZpYSBDbG91ZFRyYWlsXCJdLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBldmVudFNvdXJjZTogW1wiZWNyLmFtYXpvbmF3cy5jb21cIl0sXG4gICAgICAgICAgZXZlbnROYW1lOiBbXCJDcmVhdGVSZXBvc2l0b3J5XCJdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YXJnZXRzOiBbXG4gICAgICAgIG5ldyBUYXJnZXRzLkNvZGVCdWlsZFByb2plY3QoY29kZUJ1aWxkUHJvamVjdC5wcm9qZWN0LCB7XG4gICAgICAgICAgZXZlbnQ6IFJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KGV2ZW50SW5wdXRUZW1wbGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class DefaultEventBus extends constructs_1.Construct {
|
|
1
|
+
import { CfnOutput } from "aws-cdk-lib";
|
|
2
|
+
import * as Events from "aws-cdk-lib/aws-events";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
export class DefaultEventBus extends Construct {
|
|
5
|
+
defaultEventBusName;
|
|
6
|
+
defaultEventBusArn;
|
|
8
7
|
constructor(scope, id) {
|
|
9
8
|
super(scope, id);
|
|
10
9
|
const eventBridge = Events.EventBus.fromEventBusName(this, "defaultEventBus", "default");
|
|
11
|
-
this.defaultEventBusName = new
|
|
10
|
+
this.defaultEventBusName = new CfnOutput(this, "defaultEventBusName", {
|
|
12
11
|
key: `defaultEventBusName`,
|
|
13
12
|
value: eventBridge.eventBusName,
|
|
14
13
|
exportName: "defaultEventBusName"
|
|
15
14
|
});
|
|
16
|
-
this.defaultEventBusArn = new
|
|
15
|
+
this.defaultEventBusArn = new CfnOutput(this, "defaultEventBusArn", {
|
|
17
16
|
key: `defaultEventBusArn`,
|
|
18
17
|
value: eventBridge.eventBusArn,
|
|
19
18
|
exportName: "defaultEventBusArn"
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
exports.DefaultEventBus = DefaultEventBus;
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRCdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9ldmVudEJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBd0M7QUFDeEMsaURBQWlEO0FBQ2pELDJDQUF1QztBQUV2QyxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFJNUMsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUNsRCxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDcEUsR0FBRyxFQUFFLHFCQUFxQjtZQUMxQixLQUFLLEVBQUUsV0FBVyxDQUFDLFlBQVk7WUFDL0IsVUFBVSxFQUFFLHFCQUFxQjtTQUNsQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRSxHQUFHLEVBQUUsb0JBQW9CO1lBQ3pCLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVztZQUM5QixVQUFVLEVBQUUsb0JBQW9CO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpCRCwwQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGNsYXNzIERlZmF1bHRFdmVudEJ1cyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RXZlbnRCdXNOYW1lOiBDZm5PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RXZlbnRCdXNBcm46IENmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGV2ZW50QnJpZGdlID0gRXZlbnRzLkV2ZW50QnVzLmZyb21FdmVudEJ1c05hbWUoXG4gICAgICB0aGlzLFxuICAgICAgXCJkZWZhdWx0RXZlbnRCdXNcIixcbiAgICAgIFwiZGVmYXVsdFwiXG4gICAgKTtcblxuICAgIHRoaXMuZGVmYXVsdEV2ZW50QnVzTmFtZSA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJkZWZhdWx0RXZlbnRCdXNOYW1lXCIsIHtcbiAgICAgIGtleTogYGRlZmF1bHRFdmVudEJ1c05hbWVgLFxuICAgICAgdmFsdWU6IGV2ZW50QnJpZGdlLmV2ZW50QnVzTmFtZSxcbiAgICAgIGV4cG9ydE5hbWU6IFwiZGVmYXVsdEV2ZW50QnVzTmFtZVwiXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlZmF1bHRFdmVudEJ1c0FybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJkZWZhdWx0RXZlbnRCdXNBcm5cIiwge1xuICAgICAga2V5OiBgZGVmYXVsdEV2ZW50QnVzQXJuYCxcbiAgICAgIHZhbHVlOiBldmVudEJyaWRnZS5ldmVudEJ1c0FybixcbiAgICAgIGV4cG9ydE5hbWU6IFwiZGVmYXVsdEV2ZW50QnVzQXJuXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CfnDetector } from "aws-cdk-lib/aws-guardduty";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
export interface GuardDutyDetectorProps {
|
|
4
|
+
/** Enable S3 data event analysis. Default: true */
|
|
5
|
+
enableS3Logs?: boolean;
|
|
6
|
+
/** Enable EKS audit log analysis. Default: false */
|
|
7
|
+
enableEksAuditLogs?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Per-account GuardDuty detector for continuous threat detection.
|
|
11
|
+
* Analyses VPC Flow Logs, CloudTrail management events, and DNS logs.
|
|
12
|
+
*/
|
|
13
|
+
export declare class GuardDutyDetector extends Construct {
|
|
14
|
+
readonly detector: CfnDetector;
|
|
15
|
+
constructor(scope: Construct, id: string, props?: GuardDutyDetectorProps);
|
|
16
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CfnDetector } from "aws-cdk-lib/aws-guardduty";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
/**
|
|
4
|
+
* Per-account GuardDuty detector for continuous threat detection.
|
|
5
|
+
* Analyses VPC Flow Logs, CloudTrail management events, and DNS logs.
|
|
6
|
+
*/
|
|
7
|
+
export class GuardDutyDetector extends Construct {
|
|
8
|
+
detector;
|
|
9
|
+
constructor(scope, id, props) {
|
|
10
|
+
super(scope, id);
|
|
11
|
+
this.detector = new CfnDetector(this, "Detector", {
|
|
12
|
+
enable: true,
|
|
13
|
+
findingPublishingFrequency: "FIFTEEN_MINUTES",
|
|
14
|
+
features: [
|
|
15
|
+
{
|
|
16
|
+
name: "S3_DATA_EVENTS",
|
|
17
|
+
status: props?.enableS3Logs !== false ? "ENABLED" : "DISABLED"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "EKS_AUDIT_LOGS",
|
|
21
|
+
status: props?.enableEksAuditLogs ? "ENABLED" : "DISABLED"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Construct } from "constructs";
|
|
2
2
|
import { NestedStack, type NestedStackProps } from "aws-cdk-lib";
|
|
3
|
-
import { type KeyValue } from "../../types";
|
|
3
|
+
import { type KeyValue } from "../../types.js";
|
|
4
4
|
interface IdentityCenterProps extends NestedStackProps {
|
|
5
5
|
accounts: KeyValue;
|
|
6
6
|
tags?: KeyValue[];
|