@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,31 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const customResource_1 = require("../utilities/customResource");
|
|
11
|
-
const getAccountId_1 = require("../../../utils/getAccountId");
|
|
12
|
-
const validationLogger_1 = require("../../../utils/validationLogger");
|
|
13
|
-
// IPAM enforces a low concurrent-mutation limit (not publicly documented).
|
|
14
|
-
// Account pools are serialised WITHIN each region (they mutate the same regional
|
|
15
|
-
// pool parent). Across regions, account pools run in parallel because they mutate
|
|
16
|
-
// DIFFERENT regional pool parents — this keeps effective concurrency at 2 (one
|
|
17
|
-
// per region), well within observed AWS limits (~2-3).
|
|
18
|
-
const IPAM_POOL_BATCH_SIZE = 1;
|
|
1
|
+
import { CfnOutput, Duration, Fn, Stack } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { CfnIPAMPool as IpamPoolClass, CfnIPAMPoolCidr } from "aws-cdk-lib/aws-ec2";
|
|
4
|
+
import { Runtime } from "aws-cdk-lib/aws-lambda";
|
|
5
|
+
import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
|
|
6
|
+
import { ResourceShare } from "../utilities/resourceShare.js";
|
|
7
|
+
import { CustomResource } from "../utilities/customResource.js";
|
|
8
|
+
import getAccountId from "../../../utils/getAccountId.js";
|
|
9
|
+
import { FjallLogger } from "../../../utils/validationLogger.js";
|
|
19
10
|
const IPAM_TAGS = {
|
|
20
11
|
OPERATIONS_POOL: "fjall:operations:pool",
|
|
21
12
|
COST_ALLOCATION_ENVIRONMENT: "fjall:costAllocation:environment",
|
|
22
13
|
COST_ALLOCATION_ACCOUNT_NAME: "fjall:costAllocation:accountName"
|
|
23
14
|
};
|
|
24
|
-
class IpamPool extends
|
|
15
|
+
export class IpamPool extends Construct {
|
|
25
16
|
constructor(scope, id, props) {
|
|
26
17
|
super(scope, id);
|
|
27
18
|
// Get the default IPAM scope ID from props, or CFN import
|
|
28
|
-
const
|
|
19
|
+
const ipamScopeId = props.ipamScope || Fn.importValue("ipamPrivateDefaultScopeId");
|
|
29
20
|
const regions = props.regions;
|
|
30
21
|
if (!regions || regions.length === 0) {
|
|
31
22
|
throw new Error("At least one region must be specified for IPAM pools");
|
|
@@ -44,14 +35,14 @@ class IpamPool extends constructs_1.Construct {
|
|
|
44
35
|
}
|
|
45
36
|
// Warn if user requests VPC allocations larger than the provisioned pool
|
|
46
37
|
if (defaultNetmaskLength < provisionedNetmaskLength) {
|
|
47
|
-
|
|
38
|
+
FjallLogger.warn(`'allocationDefaultNetmaskLength' (/${defaultNetmaskLength}) is larger than 'provisionedNetmaskLength' (/${provisionedNetmaskLength}). ` +
|
|
48
39
|
`VPC allocation may fail if the pool cannot satisfy the request.`);
|
|
49
40
|
}
|
|
50
41
|
// Top Level Pool
|
|
51
|
-
const rootPool = new
|
|
42
|
+
const rootPool = new IpamPoolClass(this, "TopLevelIpamPool", {
|
|
52
43
|
description: `Root IPAM pool (Global)`,
|
|
53
44
|
addressFamily: "ipv4",
|
|
54
|
-
ipamScopeId
|
|
45
|
+
ipamScopeId,
|
|
55
46
|
provisionedCidrs: [
|
|
56
47
|
{ cidr: "10.0.0.0/8" },
|
|
57
48
|
{ cidr: "172.16.0.0/12" },
|
|
@@ -77,10 +68,10 @@ class IpamPool extends constructs_1.Construct {
|
|
|
77
68
|
for (const region of regions) {
|
|
78
69
|
const regionSuffix = region.replace(/-/g, "");
|
|
79
70
|
// Create a regional pool for this specific region
|
|
80
|
-
const regionalPool = new
|
|
71
|
+
const regionalPool = new IpamPoolClass(this, `RegionalPool${regionSuffix}`, {
|
|
81
72
|
description: `Regional IPAM pool - ${region}`,
|
|
82
73
|
addressFamily: "ipv4",
|
|
83
|
-
ipamScopeId
|
|
74
|
+
ipamScopeId,
|
|
84
75
|
locale: region,
|
|
85
76
|
sourceIpamPoolId: rootPool.attrIpamPoolId,
|
|
86
77
|
autoImport: true,
|
|
@@ -101,7 +92,7 @@ class IpamPool extends constructs_1.Construct {
|
|
|
101
92
|
if (previousRegionalCidr) {
|
|
102
93
|
regionalPool.addDependency(previousRegionalCidr);
|
|
103
94
|
}
|
|
104
|
-
const regionalCidrAllocation = new
|
|
95
|
+
const regionalCidrAllocation = new CfnIPAMPoolCidr(this, `RegionalPoolCidr${regionSuffix}`, {
|
|
105
96
|
ipamPoolId: regionalPool.attrIpamPoolId,
|
|
106
97
|
netmaskLength: 10 // Each region gets a /10 (4,194,304 IPs)
|
|
107
98
|
});
|
|
@@ -113,14 +104,13 @@ class IpamPool extends constructs_1.Construct {
|
|
|
113
104
|
//
|
|
114
105
|
// Uses CfnResource.addDependency() (not node.addDependency) for
|
|
115
106
|
// guaranteed CloudFormation DependsOn generation between L1 constructs.
|
|
116
|
-
let
|
|
117
|
-
for (
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
const ipamPool = new aws_ec2_1.CfnIPAMPool(this, `${account}IpamPool${regionSuffix}`, {
|
|
107
|
+
let previousAccountCidr;
|
|
108
|
+
for (const account of organisationAccounts) {
|
|
109
|
+
const accountId = getAccountId(account);
|
|
110
|
+
const ipamPool = new IpamPoolClass(this, `${account}IpamPool${regionSuffix}`, {
|
|
121
111
|
description: `${account} - IPAM pool - ${region}`,
|
|
122
112
|
addressFamily: "ipv4",
|
|
123
|
-
ipamScopeId
|
|
113
|
+
ipamScopeId,
|
|
124
114
|
locale: region,
|
|
125
115
|
sourceIpamPoolId: regionalPool.attrIpamPoolId,
|
|
126
116
|
allocationDefaultNetmaskLength: defaultNetmaskLength,
|
|
@@ -144,33 +134,28 @@ class IpamPool extends constructs_1.Construct {
|
|
|
144
134
|
});
|
|
145
135
|
// Ensure the account pool is created after the regional CIDR allocation
|
|
146
136
|
ipamPool.addDependency(regionalCidrAllocation);
|
|
147
|
-
//
|
|
148
|
-
if (
|
|
149
|
-
ipamPool.addDependency(
|
|
137
|
+
// Each account pool depends on the previous account's CIDR completing
|
|
138
|
+
if (previousAccountCidr) {
|
|
139
|
+
ipamPool.addDependency(previousAccountCidr);
|
|
150
140
|
}
|
|
151
|
-
const cidrAllocation = new
|
|
141
|
+
const cidrAllocation = new CfnIPAMPoolCidr(this, `${account}PoolCidr${provisionedNetmaskLength}${regionSuffix}`, {
|
|
152
142
|
ipamPoolId: ipamPool.attrIpamPoolId,
|
|
153
143
|
netmaskLength: provisionedNetmaskLength
|
|
154
144
|
});
|
|
155
|
-
|
|
156
|
-
const isLastInWave = (i + 1) % IPAM_POOL_BATCH_SIZE === 0 ||
|
|
157
|
-
i === organisationAccounts.length - 1;
|
|
158
|
-
if (isLastInWave) {
|
|
159
|
-
previousWaveAnchorCidr = cidrAllocation;
|
|
160
|
-
}
|
|
145
|
+
previousAccountCidr = cidrAllocation;
|
|
161
146
|
// On stack deletion, VPC allocations (not managed by CloudFormation)
|
|
162
147
|
// block CIDR deprovisioning. This custom resource releases them first.
|
|
163
|
-
const allocationCleanup = new
|
|
164
|
-
runtime:
|
|
165
|
-
timeout:
|
|
148
|
+
const allocationCleanup = new CustomResource(this, `${account}IpamCleanup${regionSuffix}`, {
|
|
149
|
+
runtime: Runtime.NODEJS_22_X,
|
|
150
|
+
timeout: Duration.minutes(5),
|
|
166
151
|
lambdaDescription: `${account} IPAM pool allocation cleanup - ${region}`,
|
|
167
152
|
properties: {
|
|
168
153
|
IpamPoolId: ipamPool.attrIpamPoolId,
|
|
169
154
|
PoolRegion: region
|
|
170
155
|
},
|
|
171
156
|
inlinePolicy: [
|
|
172
|
-
new
|
|
173
|
-
effect:
|
|
157
|
+
new PolicyStatement({
|
|
158
|
+
effect: Effect.ALLOW,
|
|
174
159
|
actions: [
|
|
175
160
|
"ec2:GetIpamPoolAllocations",
|
|
176
161
|
"ec2:ReleaseIpamPoolAllocation"
|
|
@@ -178,6 +163,8 @@ class IpamPool extends constructs_1.Construct {
|
|
|
178
163
|
resources: ["*"]
|
|
179
164
|
})
|
|
180
165
|
],
|
|
166
|
+
// Inline because CDK CustomResource requires a string for inlineCode —
|
|
167
|
+
// extracting to a separate file would require switching to NodejsFunction + Provider
|
|
181
168
|
inlineCode: `
|
|
182
169
|
const { EC2Client, GetIpamPoolAllocationsCommand, ReleaseIpamPoolAllocationCommand } = require('@aws-sdk/client-ec2');
|
|
183
170
|
|
|
@@ -202,7 +189,13 @@ exports.handler = async (event) => {
|
|
|
202
189
|
Cidr: alloc.Cidr,
|
|
203
190
|
IpamPoolAllocationId: alloc.IpamPoolAllocationId
|
|
204
191
|
}));
|
|
205
|
-
} catch (e) {
|
|
192
|
+
} catch (e) {
|
|
193
|
+
if (e && typeof e === 'object' && (e.name === 'InvalidParameterValue' || (e.message && e.message.includes('already been released')))) {
|
|
194
|
+
// Already released — safe to skip
|
|
195
|
+
} else {
|
|
196
|
+
throw e;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
206
199
|
}
|
|
207
200
|
nextToken = res.NextToken;
|
|
208
201
|
} while (nextToken);
|
|
@@ -211,7 +204,7 @@ exports.handler = async (event) => {
|
|
|
211
204
|
});
|
|
212
205
|
allocationCleanup.node.addDependency(cidrAllocation);
|
|
213
206
|
// Share the pool with the target account so that VPCs can allocate
|
|
214
|
-
const share = new
|
|
207
|
+
const share = new ResourceShare(this, `${account}IpamResourceShare${regionSuffix}`, {
|
|
215
208
|
name: `${account}IpamResourceShare.${region}`,
|
|
216
209
|
allowExternalPrincipals: false,
|
|
217
210
|
principals: [accountId],
|
|
@@ -226,12 +219,12 @@ exports.handler = async (event) => {
|
|
|
226
219
|
// Delete order: share → cleanup (releases VPC allocations) → cidrAllocation → pool
|
|
227
220
|
share.node.addDependency(allocationCleanup.resource);
|
|
228
221
|
// Expose the pool ID for cross-stack usage (e.g. VPC allocations)
|
|
229
|
-
new
|
|
222
|
+
new CfnOutput(this, `IpamPoolId${accountId}${regionSuffix}`, {
|
|
230
223
|
key: `IpamPoolId${accountId}${regionSuffix}`,
|
|
231
224
|
value: ipamPool.attrIpamPoolId,
|
|
232
225
|
exportName: `IpamPoolId${accountId}${regionSuffix}`
|
|
233
226
|
});
|
|
234
|
-
new
|
|
227
|
+
new CfnOutput(this, `IpamPoolArn${accountId}${regionSuffix}`, {
|
|
235
228
|
key: `IpamPoolArn${accountId}${regionSuffix}`,
|
|
236
229
|
value: ipamPool.attrArn,
|
|
237
230
|
exportName: `IpamPoolArn${accountId}${regionSuffix}`
|
|
@@ -242,8 +235,7 @@ exports.handler = async (event) => {
|
|
|
242
235
|
}
|
|
243
236
|
}
|
|
244
237
|
}
|
|
245
|
-
|
|
246
|
-
class IpamPoolStack extends aws_cdk_lib_1.Stack {
|
|
238
|
+
export class IpamPoolStack extends Stack {
|
|
247
239
|
constructor(scope, id, props) {
|
|
248
240
|
super(scope, id);
|
|
249
241
|
new IpamPool(this, "IpamPool", {
|
|
@@ -252,5 +244,3 @@ class IpamPoolStack extends aws_cdk_lib_1.Stack {
|
|
|
252
244
|
});
|
|
253
245
|
}
|
|
254
246
|
}
|
|
255
|
-
exports.IpamPoolStack = IpamPoolStack;
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbVBvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL2lwYW1Qb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RTtBQUM5RSwyQ0FBdUM7QUFDdkMsaURBRzZCO0FBQzdCLHVEQUFpRDtBQUNqRCxpREFBOEQ7QUFDOUQsOERBQTJEO0FBQzNELGdFQUE2RDtBQUM3RCw4REFBdUQ7QUFDdkQsc0VBQThEO0FBRTlELDJFQUEyRTtBQUMzRSxpRkFBaUY7QUFDakYsa0ZBQWtGO0FBQ2xGLCtFQUErRTtBQUMvRSx1REFBdUQ7QUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QywyQkFBMkIsRUFBRSxrQ0FBa0M7SUFDL0QsNEJBQTRCLEVBQUUsa0NBQWtDO0NBQ3hELENBQUM7QUF5QlgsTUFBYSxRQUFTLFNBQVEsc0JBQVM7SUFDckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDBEQUEwRDtRQUMxRCxNQUFNLHlCQUF5QixHQUM3QixLQUFLLENBQUMsU0FBUyxJQUFJLGdCQUFFLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFakUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDN0QsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUN0QixDQUFDO1FBRUYsdURBQXVEO1FBQ3ZELE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQztRQUN4RSxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUM7UUFFdEUsa0ZBQWtGO1FBQ2xGLElBQUksb0JBQW9CLEdBQUcsRUFBRSxJQUFJLG9CQUFvQixHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxLQUFLLENBQ2IsbUZBQW1GLG9CQUFvQixFQUFFLENBQzFHLENBQUM7UUFDSixDQUFDO1FBRUQsK0NBQStDO1FBQy9DLElBQUksd0JBQXdCLEdBQUcsRUFBRSxJQUFJLHdCQUF3QixHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25FLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkVBQTZFLHdCQUF3QixFQUFFLENBQ3hHLENBQUM7UUFDSixDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksb0JBQW9CLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztZQUNwRCw4QkFBVyxDQUFDLElBQUksQ0FDZCxzQ0FBc0Msb0JBQW9CLGlEQUFpRCx3QkFBd0IsS0FBSztnQkFDdEksaUVBQWlFLENBQ3BFLENBQUM7UUFDSixDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQWEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDM0QsV0FBVyxFQUFFLHlCQUF5QjtZQUN0QyxhQUFhLEVBQUUsTUFBTTtZQUNyQixXQUFXLEVBQUUseUJBQXlCO1lBQ3RDLGdCQUFnQixFQUFFO2dCQUNoQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ3RCLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRTtnQkFDekIsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7YUFDM0I7WUFDRCxVQUFVLEVBQUUsSUFBSTtZQUNoQixJQUFJLEVBQUU7Z0JBQ0o7b0JBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQyxlQUFlO29CQUM5QixLQUFLLEVBQUUsV0FBVztpQkFDbkI7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQywyQkFBMkI7b0JBQzFDLEtBQUssRUFBRSxZQUFZO2lCQUNwQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsc0RBQXNEO1FBQ3RELHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUsc0RBQXNEO1FBQ3RELElBQUksb0JBQWlELENBQUM7UUFFdEQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU5QyxrREFBa0Q7WUFDbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxxQkFBYSxDQUNwQyxJQUFJLEVBQ0osZUFBZSxZQUFZLEVBQUUsRUFDN0I7Z0JBQ0UsV0FBVyxFQUFFLHdCQUF3QixNQUFNLEVBQUU7Z0JBQzdDLGFBQWEsRUFBRSxNQUFNO2dCQUNyQixXQUFXLEVBQUUseUJBQXlCO2dCQUN0QyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsY0FBYztnQkFDekMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLElBQUksRUFBRTtvQkFDSjt3QkFDRSxHQUFHLEVBQUUsU0FBUyxDQUFDLGVBQWU7d0JBQzlCLEtBQUssRUFBRSxZQUFZLE1BQU0sRUFBRTtxQkFDNUI7b0JBQ0Q7d0JBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQywyQkFBMkI7d0JBQzFDLEtBQUssRUFBRSxZQUFZO3FCQUNwQjtpQkFDRjthQUNGLENBQ0YsQ0FBQztZQUVGLDhFQUE4RTtZQUM5RSwwRUFBMEU7WUFDMUUsNkJBQTZCO1lBQzdCLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxNQUFNLHNCQUFzQixHQUFHLElBQUkseUJBQWUsQ0FDaEQsSUFBSSxFQUNKLG1CQUFtQixZQUFZLEVBQUUsRUFDakM7Z0JBQ0UsVUFBVSxFQUFFLFlBQVksQ0FBQyxjQUFjO2dCQUN2QyxhQUFhLEVBQUUsRUFBRSxDQUFDLHlDQUF5QzthQUM1RCxDQUNGLENBQUM7WUFFRixvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztZQUU5Qyx1REFBdUQ7WUFDdkQsMEVBQTBFO1lBQzFFLHdFQUF3RTtZQUN4RSx1RUFBdUU7WUFDdkUsRUFBRTtZQUNGLGdFQUFnRTtZQUNoRSx3RUFBd0U7WUFDeEUsSUFBSSxzQkFBbUQsQ0FBQztZQUV4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLFNBQVMsR0FBRyxJQUFBLHNCQUFZLEVBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhDLE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQWEsQ0FDaEMsSUFBSSxFQUNKLEdBQUcsT0FBTyxXQUFXLFlBQVksRUFBRSxFQUNuQztvQkFDRSxXQUFXLEVBQUUsR0FBRyxPQUFPLGtCQUFrQixNQUFNLEVBQUU7b0JBQ2pELGFBQWEsRUFBRSxNQUFNO29CQUNyQixXQUFXLEVBQUUseUJBQXlCO29CQUN0QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsY0FBYztvQkFDN0MsOEJBQThCLEVBQUUsb0JBQW9CO29CQUNwRCxzQkFBc0IsRUFBRTt3QkFDdEI7NEJBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQyxlQUFlOzRCQUM5QixLQUFLLEVBQUUsR0FBRyxTQUFTLElBQUksTUFBTSxFQUFFO3lCQUNoQztxQkFDRjtvQkFDRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNKOzRCQUNFLEdBQUcsRUFBRSxTQUFTLENBQUMsZUFBZTs0QkFDOUIsS0FBSyxFQUFFLEdBQUcsU0FBUyxJQUFJLE1BQU0sRUFBRTt5QkFDaEM7d0JBQ0Q7NEJBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQyw0QkFBNEI7NEJBQzNDLEtBQUssRUFBRSxPQUFPO3lCQUNmO3FCQUNGO2lCQUNGLENBQ0YsQ0FBQztnQkFFRix3RUFBd0U7Z0JBQ3hFLFFBQVEsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFFL0MsdUVBQXVFO2dCQUN2RSxJQUFJLHNCQUFzQixFQUFFLENBQUM7b0JBQzNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDakQsQ0FBQztnQkFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLHlCQUFlLENBQ3hDLElBQUksRUFDSixHQUFHLE9BQU8sV0FBVyx3QkFBd0IsR0FBRyxZQUFZLEVBQUUsRUFDOUQ7b0JBQ0UsVUFBVSxFQUFFLFFBQVEsQ0FBQyxjQUFjO29CQUNuQyxhQUFhLEVBQUUsd0JBQXdCO2lCQUN4QyxDQUNGLENBQUM7Z0JBRUYsZ0VBQWdFO2dCQUNoRSxNQUFNLFlBQVksR0FDaEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLEtBQUssQ0FBQztvQkFDcEMsQ0FBQyxLQUFLLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBRXhDLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLHNCQUFzQixHQUFHLGNBQWMsQ0FBQztnQkFDMUMsQ0FBQztnQkFFRCxxRUFBcUU7Z0JBQ3JFLHVFQUF1RTtnQkFDdkUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLCtCQUFjLENBQzFDLElBQUksRUFDSixHQUFHLE9BQU8sY0FBYyxZQUFZLEVBQUUsRUFDdEM7b0JBQ0UsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztvQkFDNUIsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsaUJBQWlCLEVBQUUsR0FBRyxPQUFPLG1DQUFtQyxNQUFNLEVBQUU7b0JBQ3hFLFVBQVUsRUFBRTt3QkFDVixVQUFVLEVBQUUsUUFBUSxDQUFDLGNBQWM7d0JBQ25DLFVBQVUsRUFBRSxNQUFNO3FCQUNuQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osSUFBSSx5QkFBZSxDQUFDOzRCQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLOzRCQUNwQixPQUFPLEVBQUU7Z0NBQ1AsNEJBQTRCO2dDQUM1QiwrQkFBK0I7NkJBQ2hDOzRCQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzt5QkFDakIsQ0FBQztxQkFDSDtvQkFDRCxVQUFVLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJyQjtpQkFDUSxDQUNGLENBQUM7Z0JBQ0YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFckQsbUVBQW1FO2dCQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLDZCQUFhLENBQzdCLElBQUksRUFDSixHQUFHLE9BQU8sb0JBQW9CLFlBQVksRUFBRSxFQUM1QztvQkFDRSxJQUFJLEVBQUUsR0FBRyxPQUFPLHFCQUFxQixNQUFNLEVBQUU7b0JBQzdDLHVCQUF1QixFQUFFLEtBQUs7b0JBQzlCLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztvQkFDdkIsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsSUFBSSxFQUFFO3dCQUNKOzRCQUNFLEdBQUcsRUFBRSxTQUFTLENBQUMsMkJBQTJCOzRCQUMxQyxLQUFLLEVBQUUsWUFBWTt5QkFDcEI7cUJBQ0Y7aUJBQ0YsQ0FDRixDQUFDO2dCQUVGLG1GQUFtRjtnQkFDbkYsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRXJELGtFQUFrRTtnQkFDbEUsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxhQUFhLFNBQVMsR0FBRyxZQUFZLEVBQUUsRUFBRTtvQkFDM0QsR0FBRyxFQUFFLGFBQWEsU0FBUyxHQUFHLFlBQVksRUFBRTtvQkFDNUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxjQUFjO29CQUM5QixVQUFVLEVBQUUsYUFBYSxTQUFTLEdBQUcsWUFBWSxFQUFFO2lCQUNwRCxDQUFDLENBQUM7Z0JBRUgsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxjQUFjLFNBQVMsR0FBRyxZQUFZLEVBQUUsRUFBRTtvQkFDNUQsR0FBRyxFQUFFLGNBQWMsU0FBUyxHQUFHLFlBQVksRUFBRTtvQkFDN0MsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPO29CQUN2QixVQUFVLEVBQUUsY0FBYyxTQUFTLEdBQUcsWUFBWSxFQUFFO2lCQUNyRCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsc0VBQXNFO1lBQ3RFLG9FQUFvRTtRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMVJELDRCQTBSQztBQUVELE1BQWEsYUFBYyxTQUFRLG1CQUFLO0lBQ3RDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzdCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBVEQsc0NBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBGbiwgdHlwZSBTdGFja1Byb3BzLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIENmbklQQU1Qb29sIGFzIElwYW1Qb29sQ2xhc3MsXG4gIENmbklQQU1Qb29sQ2lkclxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVNoYXJlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9yZXNvdXJjZVNoYXJlXCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCBnZXRBY2NvdW50SWQgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2dldEFjY291bnRJZFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlclwiO1xuXG4vLyBJUEFNIGVuZm9yY2VzIGEgbG93IGNvbmN1cnJlbnQtbXV0YXRpb24gbGltaXQgKG5vdCBwdWJsaWNseSBkb2N1bWVudGVkKS5cbi8vIEFjY291bnQgcG9vbHMgYXJlIHNlcmlhbGlzZWQgV0lUSElOIGVhY2ggcmVnaW9uICh0aGV5IG11dGF0ZSB0aGUgc2FtZSByZWdpb25hbFxuLy8gcG9vbCBwYXJlbnQpLiBBY3Jvc3MgcmVnaW9ucywgYWNjb3VudCBwb29scyBydW4gaW4gcGFyYWxsZWwgYmVjYXVzZSB0aGV5IG11dGF0ZVxuLy8gRElGRkVSRU5UIHJlZ2lvbmFsIHBvb2wgcGFyZW50cyDigJQgdGhpcyBrZWVwcyBlZmZlY3RpdmUgY29uY3VycmVuY3kgYXQgMiAob25lXG4vLyBwZXIgcmVnaW9uKSwgd2VsbCB3aXRoaW4gb2JzZXJ2ZWQgQVdTIGxpbWl0cyAofjItMykuXG5jb25zdCBJUEFNX1BPT0xfQkFUQ0hfU0laRSA9IDE7XG5cbmNvbnN0IElQQU1fVEFHUyA9IHtcbiAgT1BFUkFUSU9OU19QT09MOiBcImZqYWxsOm9wZXJhdGlvbnM6cG9vbFwiLFxuICBDT1NUX0FMTE9DQVRJT05fRU5WSVJPTk1FTlQ6IFwiZmphbGw6Y29zdEFsbG9jYXRpb246ZW52aXJvbm1lbnRcIixcbiAgQ09TVF9BTExPQ0FUSU9OX0FDQ09VTlRfTkFNRTogXCJmamFsbDpjb3N0QWxsb2NhdGlvbjphY2NvdW50TmFtZVwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElwYW1Qb29sUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgb3JnQWNjb3VudHM6IHN0cmluZ1tdO1xuICBpcGFtU2NvcGU/OiBzdHJpbmc7XG4gIHJlZ2lvbnM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIG5ldG1hc2sgbGVuZ3RoICgvQ0lEUikgZWFjaCBjaGlsZCBJUEFNIHBvb2wgc2hvdWxkIHJlY2VpdmUuXG4gICAqIENvbnRyb2xzIHRoZSBzaXplIG9mIENJRFIgYmxvY2tzIGF1dG9tYXRpY2FsbHkgYWxsb2NhdGVkIHRvIFZQQ3MgZnJvbSB0aGUgcG9vbC5cbiAgICogQWNjZXB0ZWQgcmFuZ2U6IC8xNiAoNjUsNTM2IElQcykg4oCTIC8yOCAoMTYgSVBzKS4gRGVmYXVsdHMgdG8gLzIwICg0LDA5NiBJUHMpLlxuICAgKi9cbiAgYWxsb2NhdGlvbkRlZmF1bHROZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5ldG1hc2sgbGVuZ3RoICgvQ0lEUikgcHJvdmlzaW9uZWQgaW50byBlYWNoIGNoaWxkIElQQU0gcG9vbCBvbiBjcmVhdGlvbi5cbiAgICogRGV0ZXJtaW5lcyB0aGUgdG90YWwgYWRkcmVzcyBzcGFjZSBhdmFpbGFibGUgZm9yIFZQQyBhbGxvY2F0aW9ucyBpbiB0aGF0IGFjY291bnQuXG4gICAqIEFjY2VwdGVkIHJhbmdlOiAvMTMgKDUyNCwyODggSVBzKSDigJMgLzE2ICg2NSw1MzYgSVBzKS4gRGVmYXVsdHMgdG8gLzE0LlxuICAgKi9cbiAgcHJvdmlzaW9uZWROZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSXBhbVBvb2xTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIG9yZ0FjY291bnRzOiBzdHJpbmdbXTtcbiAgcmVnaW9uczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBJcGFtUG9vbCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJcGFtUG9vbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCBJUEFNIHNjb3BlIElEIGZyb20gcHJvcHMsIG9yIENGTiBpbXBvcnRcbiAgICBjb25zdCBJcGFtUHJpdmF0ZURlZmF1bHRTY29wZUlkID1cbiAgICAgIHByb3BzLmlwYW1TY29wZSB8fCBGbi5pbXBvcnRWYWx1ZShcIklwYW1Qcml2YXRlRGVmYXVsdFNjb3BlSWRcIik7XG5cbiAgICBjb25zdCByZWdpb25zID0gcHJvcHMucmVnaW9ucztcbiAgICBpZiAoIXJlZ2lvbnMgfHwgcmVnaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSByZWdpb24gbXVzdCBiZSBzcGVjaWZpZWQgZm9yIElQQU0gcG9vbHNcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JnYW5pc2F0aW9uQWNjb3VudHMgPSBwcm9wcy5vcmdBY2NvdW50cy5tYXAoKGFjY291bnQpID0+XG4gICAgICBhY2NvdW50LnRvTG93ZXJDYXNlKClcbiAgICApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBjaGlsZC1wb29sIENJRFIgc2l6ZSAoZGVmYXVsdHMgdG8gLzIwKVxuICAgIGNvbnN0IGRlZmF1bHROZXRtYXNrTGVuZ3RoID0gcHJvcHMuYWxsb2NhdGlvbkRlZmF1bHROZXRtYXNrTGVuZ3RoID8/IDIwO1xuICAgIGNvbnN0IHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA9IHByb3BzLnByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA/PyAxNDtcblxuICAgIC8vIEJhc2ljIHZhbGlkYXRpb24g4oCTIC8xNiB0byAvMjggaW5jbHVzaXZlIGFyZSBjb25zaWRlcmVkIHNhZmUgZm9yIFZQQyBhbGxvY2F0aW9uc1xuICAgIGlmIChkZWZhdWx0TmV0bWFza0xlbmd0aCA8IDE2IHx8IGRlZmF1bHROZXRtYXNrTGVuZ3RoID4gMjgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGFsbG9jYXRpb25EZWZhdWx0TmV0bWFza0xlbmd0aCBtdXN0IGJlIGJldHdlZW4gMTYgYW5kIDI4IChpbmNsdXNpdmUpLiBSZWNlaXZlZDogJHtkZWZhdWx0TmV0bWFza0xlbmd0aH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHByb3Zpc2lvbmVkIGJsb2NrIHNpemUgKC8xMyB0byAvMTYpXG4gICAgaWYgKHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA8IDEzIHx8IHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA+IDE2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcm92aXNpb25lZE5ldG1hc2tMZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEzIGFuZCAxNiAoaW5jbHVzaXZlKS4gUmVjZWl2ZWQ6ICR7cHJvdmlzaW9uZWROZXRtYXNrTGVuZ3RofWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiB1c2VyIHJlcXVlc3RzIFZQQyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiB0aGUgcHJvdmlzaW9uZWQgcG9vbFxuICAgIGlmIChkZWZhdWx0TmV0bWFza0xlbmd0aCA8IHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCkge1xuICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgYCdhbGxvY2F0aW9uRGVmYXVsdE5ldG1hc2tMZW5ndGgnICgvJHtkZWZhdWx0TmV0bWFza0xlbmd0aH0pIGlzIGxhcmdlciB0aGFuICdwcm92aXNpb25lZE5ldG1hc2tMZW5ndGgnICgvJHtwcm92aXNpb25lZE5ldG1hc2tMZW5ndGh9KS4gYCArXG4gICAgICAgICAgYFZQQyBhbGxvY2F0aW9uIG1heSBmYWlsIGlmIHRoZSBwb29sIGNhbm5vdCBzYXRpc2Z5IHRoZSByZXF1ZXN0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVG9wIExldmVsIFBvb2xcbiAgICBjb25zdCByb290UG9vbCA9IG5ldyBJcGFtUG9vbENsYXNzKHRoaXMsIFwiVG9wTGV2ZWxJcGFtUG9vbFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYFJvb3QgSVBBTSBwb29sIChHbG9iYWwpYCxcbiAgICAgIGFkZHJlc3NGYW1pbHk6IFwiaXB2NFwiLFxuICAgICAgaXBhbVNjb3BlSWQ6IElwYW1Qcml2YXRlRGVmYXVsdFNjb3BlSWQsXG4gICAgICBwcm92aXNpb25lZENpZHJzOiBbXG4gICAgICAgIHsgY2lkcjogXCIxMC4wLjAuMC84XCIgfSxcbiAgICAgICAgeyBjaWRyOiBcIjE3Mi4xNi4wLjAvMTJcIiB9LFxuICAgICAgICB7IGNpZHI6IFwiMTkyLjE2OC4wLjAvMTZcIiB9XG4gICAgICBdLFxuICAgICAgYXV0b0ltcG9ydDogdHJ1ZSxcbiAgICAgIHRhZ3M6IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogSVBBTV9UQUdTLk9QRVJBVElPTlNfUE9PTCxcbiAgICAgICAgICB2YWx1ZTogXCJ0b3AtbGV2ZWxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBJUEFNX1RBR1MuQ09TVF9BTExPQ0FUSU9OX0VOVklST05NRU5ULFxuICAgICAgICAgIHZhbHVlOiBcIm1hbmFnZW1lbnRcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgcmVnaW9uYWwgcG9vbHMgYXMgY2hpbGRyZW4gb2YgdGhlIHJvb3QgcG9vbC5cbiAgICAvLyBTZXJpYWxpc2VkIHRvIGF2b2lkIEVDMiBJUEFNIFwidG9vIG1hbnkgY29uY3VycmVudCBtdXRhdGlvbnNcIiBlcnJvcnMg4oCUXG4gICAgLy8gZWFjaCByZWdpb25hbCBwb29sICsgQ0lEUiBtdXRhdGVzIHRoZSBwYXJlbnQgcm9vdCBwb29sIHJlc291cmNlLCBhbmRcbiAgICAvLyBJUEFNIHJlamVjdHMgcGFyYWxsZWwgbXV0YXRpb25zIG9uIHRoZSBzYW1lIHBhcmVudC5cbiAgICBsZXQgcHJldmlvdXNSZWdpb25hbENpZHI6IENmbklQQU1Qb29sQ2lkciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGNvbnN0IHJlZ2lvblN1ZmZpeCA9IHJlZ2lvbi5yZXBsYWNlKC8tL2csIFwiXCIpO1xuXG4gICAgICAvLyBDcmVhdGUgYSByZWdpb25hbCBwb29sIGZvciB0aGlzIHNwZWNpZmljIHJlZ2lvblxuICAgICAgY29uc3QgcmVnaW9uYWxQb29sID0gbmV3IElwYW1Qb29sQ2xhc3MoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBSZWdpb25hbFBvb2wke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBSZWdpb25hbCBJUEFNIHBvb2wgLSAke3JlZ2lvbn1gLFxuICAgICAgICAgIGFkZHJlc3NGYW1pbHk6IFwiaXB2NFwiLFxuICAgICAgICAgIGlwYW1TY29wZUlkOiBJcGFtUHJpdmF0ZURlZmF1bHRTY29wZUlkLFxuICAgICAgICAgIGxvY2FsZTogcmVnaW9uLFxuICAgICAgICAgIHNvdXJjZUlwYW1Qb29sSWQ6IHJvb3RQb29sLmF0dHJJcGFtUG9vbElkLFxuICAgICAgICAgIGF1dG9JbXBvcnQ6IHRydWUsXG4gICAgICAgICAgdGFnczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IElQQU1fVEFHUy5PUEVSQVRJT05TX1BPT0wsXG4gICAgICAgICAgICAgIHZhbHVlOiBgcmVnaW9uYWwtJHtyZWdpb259YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBJUEFNX1RBR1MuQ09TVF9BTExPQ0FUSU9OX0VOVklST05NRU5ULFxuICAgICAgICAgICAgICB2YWx1ZTogXCJtYW5hZ2VtZW50XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIENoYWluOiBlYWNoIHJlZ2lvbmFsIHBvb2wgd2FpdHMgZm9yIHRoZSBwcmV2aW91cyByZWdpb24ncyBDSURSIHRvIGNvbXBsZXRlLlxuICAgICAgLy8gVGhpcyBzZXJpYWxpc2VzIHJlZ2lvbmFsIHBvb2wgY3JlYXRpb24sIHByZXZlbnRpbmcgY29uY3VycmVudCBtdXRhdGlvbnNcbiAgICAgIC8vIG9uIHRoZSByb290IHBvb2wgcmVzb3VyY2UuXG4gICAgICBpZiAocHJldmlvdXNSZWdpb25hbENpZHIpIHtcbiAgICAgICAgcmVnaW9uYWxQb29sLmFkZERlcGVuZGVuY3kocHJldmlvdXNSZWdpb25hbENpZHIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWdpb25hbENpZHJBbGxvY2F0aW9uID0gbmV3IENmbklQQU1Qb29sQ2lkcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYFJlZ2lvbmFsUG9vbENpZHIke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICB7XG4gICAgICAgICAgaXBhbVBvb2xJZDogcmVnaW9uYWxQb29sLmF0dHJJcGFtUG9vbElkLFxuICAgICAgICAgIG5ldG1hc2tMZW5ndGg6IDEwIC8vIEVhY2ggcmVnaW9uIGdldHMgYSAvMTAgKDQsMTk0LDMwNCBJUHMpXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHByZXZpb3VzUmVnaW9uYWxDaWRyID0gcmVnaW9uYWxDaWRyQWxsb2NhdGlvbjtcblxuICAgICAgLy8gU2VyaWFsaXNlZCBhY2NvdW50IHBvb2wgY3JlYXRpb24gd2l0aGluIGVhY2ggcmVnaW9uLlxuICAgICAgLy8gQWNjb3VudCBwb29scyB3aXRoaW4gYSByZWdpb24gYWxsIG11dGF0ZSB0aGUgc2FtZSByZWdpb25hbCBwb29sIHBhcmVudCxcbiAgICAgIC8vIHNvIHRoZXkgbXVzdCBiZSBzZXJpYWxpc2VkLiBBY2NvdW50IHBvb2xzIGluIERJRkZFUkVOVCByZWdpb25zIG11dGF0ZVxuICAgICAgLy8gZGlmZmVyZW50IHJlZ2lvbmFsIHBvb2wgcGFyZW50cywgc28gdGhleSBjYW4gc2FmZWx5IHJ1biBpbiBwYXJhbGxlbC5cbiAgICAgIC8vXG4gICAgICAvLyBVc2VzIENmblJlc291cmNlLmFkZERlcGVuZGVuY3koKSAobm90IG5vZGUuYWRkRGVwZW5kZW5jeSkgZm9yXG4gICAgICAvLyBndWFyYW50ZWVkIENsb3VkRm9ybWF0aW9uIERlcGVuZHNPbiBnZW5lcmF0aW9uIGJldHdlZW4gTDEgY29uc3RydWN0cy5cbiAgICAgIGxldCBwcmV2aW91c1dhdmVBbmNob3JDaWRyOiBDZm5JUEFNUG9vbENpZHIgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JnYW5pc2F0aW9uQWNjb3VudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IG9yZ2FuaXNhdGlvbkFjY291bnRzW2ldO1xuICAgICAgICBjb25zdCBhY2NvdW50SWQgPSBnZXRBY2NvdW50SWQoYWNjb3VudCk7XG5cbiAgICAgICAgY29uc3QgaXBhbVBvb2wgPSBuZXcgSXBhbVBvb2xDbGFzcyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke2FjY291bnR9SXBhbVBvb2wke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHthY2NvdW50fSAtIElQQU0gcG9vbCAtICR7cmVnaW9ufWAsXG4gICAgICAgICAgICBhZGRyZXNzRmFtaWx5OiBcImlwdjRcIixcbiAgICAgICAgICAgIGlwYW1TY29wZUlkOiBJcGFtUHJpdmF0ZURlZmF1bHRTY29wZUlkLFxuICAgICAgICAgICAgbG9jYWxlOiByZWdpb24sXG4gICAgICAgICAgICBzb3VyY2VJcGFtUG9vbElkOiByZWdpb25hbFBvb2wuYXR0cklwYW1Qb29sSWQsXG4gICAgICAgICAgICBhbGxvY2F0aW9uRGVmYXVsdE5ldG1hc2tMZW5ndGg6IGRlZmF1bHROZXRtYXNrTGVuZ3RoLFxuICAgICAgICAgICAgYWxsb2NhdGlvblJlc291cmNlVGFnczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBJUEFNX1RBR1MuT1BFUkFUSU9OU19QT09MLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBgJHthY2NvdW50SWR9LSR7cmVnaW9ufWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGF1dG9JbXBvcnQ6IHRydWUsXG4gICAgICAgICAgICB0YWdzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IElQQU1fVEFHUy5PUEVSQVRJT05TX1BPT0wsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGAke2FjY291bnRJZH0tJHtyZWdpb259YFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBJUEFNX1RBR1MuQ09TVF9BTExPQ0FUSU9OX0FDQ09VTlRfTkFNRSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYWNjb3VudFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGUgYWNjb3VudCBwb29sIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIHJlZ2lvbmFsIENJRFIgYWxsb2NhdGlvblxuICAgICAgICBpcGFtUG9vbC5hZGREZXBlbmRlbmN5KHJlZ2lvbmFsQ2lkckFsbG9jYXRpb24pO1xuXG4gICAgICAgIC8vIFdhdmUgYm91bmRhcnk6IHBvb2xzIGluIHdhdmUgTisxIGRlcGVuZCBvbiB0aGUgbGFzdCBDSURSIGZyb20gd2F2ZSBOXG4gICAgICAgIGlmIChwcmV2aW91c1dhdmVBbmNob3JDaWRyKSB7XG4gICAgICAgICAgaXBhbVBvb2wuYWRkRGVwZW5kZW5jeShwcmV2aW91c1dhdmVBbmNob3JDaWRyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpZHJBbGxvY2F0aW9uID0gbmV3IENmbklQQU1Qb29sQ2lkcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke2FjY291bnR9UG9vbENpZHIke3Byb3Zpc2lvbmVkTmV0bWFza0xlbmd0aH0ke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlwYW1Qb29sSWQ6IGlwYW1Qb29sLmF0dHJJcGFtUG9vbElkLFxuICAgICAgICAgICAgbmV0bWFza0xlbmd0aDogcHJvdmlzaW9uZWROZXRtYXNrTGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSBsYXN0IHBvb2wgaW4gZWFjaCB3YXZlIGFuY2hvcnMgdGhlIG5leHQgd2F2ZSdzIGRlcGVuZGVuY3lcbiAgICAgICAgY29uc3QgaXNMYXN0SW5XYXZlID1cbiAgICAgICAgICAoaSArIDEpICUgSVBBTV9QT09MX0JBVENIX1NJWkUgPT09IDAgfHxcbiAgICAgICAgICBpID09PSBvcmdhbmlzYXRpb25BY2NvdW50cy5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmIChpc0xhc3RJbldhdmUpIHtcbiAgICAgICAgICBwcmV2aW91c1dhdmVBbmNob3JDaWRyID0gY2lkckFsbG9jYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbiBzdGFjayBkZWxldGlvbiwgVlBDIGFsbG9jYXRpb25zIChub3QgbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbilcbiAgICAgICAgLy8gYmxvY2sgQ0lEUiBkZXByb3Zpc2lvbmluZy4gVGhpcyBjdXN0b20gcmVzb3VyY2UgcmVsZWFzZXMgdGhlbSBmaXJzdC5cbiAgICAgICAgY29uc3QgYWxsb2NhdGlvbkNsZWFudXAgPSBuZXcgQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHthY2NvdW50fUlwYW1DbGVhbnVwJHtyZWdpb25TdWZmaXh9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBgJHthY2NvdW50fSBJUEFNIHBvb2wgYWxsb2NhdGlvbiBjbGVhbnVwIC0gJHtyZWdpb259YCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgSXBhbVBvb2xJZDogaXBhbVBvb2wuYXR0cklwYW1Qb29sSWQsXG4gICAgICAgICAgICAgIFBvb2xSZWdpb246IHJlZ2lvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlubGluZVBvbGljeTogW1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICBcImVjMjpHZXRJcGFtUG9vbEFsbG9jYXRpb25zXCIsXG4gICAgICAgICAgICAgICAgICBcImVjMjpSZWxlYXNlSXBhbVBvb2xBbGxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGlubGluZUNvZGU6IGBcbmNvbnN0IHsgRUMyQ2xpZW50LCBHZXRJcGFtUG9vbEFsbG9jYXRpb25zQ29tbWFuZCwgUmVsZWFzZUlwYW1Qb29sQWxsb2NhdGlvbkNvbW1hbmQgfSA9IHJlcXVpcmUoJ0Bhd3Mtc2RrL2NsaWVudC1lYzInKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCB8fCAnaXBhbS1wb29sLWNsZWFudXAnO1xuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgIT09ICdEZWxldGUnKSB7XG4gICAgcmV0dXJuIHsgUGh5c2ljYWxSZXNvdXJjZUlkOiBwaHlzaWNhbFJlc291cmNlSWQgfTtcbiAgfVxuICBjb25zdCBwb29sSWQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuSXBhbVBvb2xJZDtcbiAgY29uc3QgcG9vbFJlZ2lvbiA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5Qb29sUmVnaW9uO1xuICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHsgcmVnaW9uOiBwb29sUmVnaW9uIH0pO1xuICBsZXQgbmV4dFRva2VuO1xuICBkbyB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZWMyLnNlbmQobmV3IEdldElwYW1Qb29sQWxsb2NhdGlvbnNDb21tYW5kKHtcbiAgICAgIElwYW1Qb29sSWQ6IHBvb2xJZCwgLi4uKG5leHRUb2tlbiAmJiB7IE5leHRUb2tlbjogbmV4dFRva2VuIH0pXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgYWxsb2Mgb2YgKHJlcy5JcGFtUG9vbEFsbG9jYXRpb25zIHx8IFtdKSkge1xuICAgICAgaWYgKGFsbG9jLlJlc291cmNlVHlwZSA9PT0gJ2lwYW0tcG9vbCcpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFJlbGVhc2VJcGFtUG9vbEFsbG9jYXRpb25Db21tYW5kKHtcbiAgICAgICAgICBJcGFtUG9vbElkOiBwb29sSWQsXG4gICAgICAgICAgQ2lkcjogYWxsb2MuQ2lkcixcbiAgICAgICAgICBJcGFtUG9vbEFsbG9jYXRpb25JZDogYWxsb2MuSXBhbVBvb2xBbGxvY2F0aW9uSWRcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmxvZygnUmVsZWFzZSBmYWlsZWQgKG1heSBhbHJlYWR5IGJlIHJlbGVhc2VkKTonLCBlLm1lc3NhZ2UpOyB9XG4gICAgfVxuICAgIG5leHRUb2tlbiA9IHJlcy5OZXh0VG9rZW47XG4gIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gIHJldHVybiB7IFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkIH07XG59O2BcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGFsbG9jYXRpb25DbGVhbnVwLm5vZGUuYWRkRGVwZW5kZW5jeShjaWRyQWxsb2NhdGlvbik7XG5cbiAgICAgICAgLy8gU2hhcmUgdGhlIHBvb2wgd2l0aCB0aGUgdGFyZ2V0IGFjY291bnQgc28gdGhhdCBWUENzIGNhbiBhbGxvY2F0ZVxuICAgICAgICBjb25zdCBzaGFyZSA9IG5ldyBSZXNvdXJjZVNoYXJlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7YWNjb3VudH1JcGFtUmVzb3VyY2VTaGFyZSR7cmVnaW9uU3VmZml4fWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYCR7YWNjb3VudH1JcGFtUmVzb3VyY2VTaGFyZS4ke3JlZ2lvbn1gLFxuICAgICAgICAgICAgYWxsb3dFeHRlcm5hbFByaW5jaXBhbHM6IGZhbHNlLFxuICAgICAgICAgICAgcHJpbmNpcGFsczogW2FjY291bnRJZF0sXG4gICAgICAgICAgICByZXNvdXJjZUFybnM6IFtpcGFtUG9vbC5hdHRyQXJuXSxcbiAgICAgICAgICAgIHRhZ3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogSVBBTV9UQUdTLkNPU1RfQUxMT0NBVElPTl9FTlZJUk9OTUVOVCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJtYW5hZ2VtZW50XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgb3JkZXI6IHNoYXJlIOKGkiBjbGVhbnVwIChyZWxlYXNlcyBWUEMgYWxsb2NhdGlvbnMpIOKGkiBjaWRyQWxsb2NhdGlvbiDihpIgcG9vbFxuICAgICAgICBzaGFyZS5ub2RlLmFkZERlcGVuZGVuY3koYWxsb2NhdGlvbkNsZWFudXAucmVzb3VyY2UpO1xuXG4gICAgICAgIC8vIEV4cG9zZSB0aGUgcG9vbCBJRCBmb3IgY3Jvc3Mtc3RhY2sgdXNhZ2UgKGUuZy4gVlBDIGFsbG9jYXRpb25zKVxuICAgICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGBJcGFtUG9vbElkJHthY2NvdW50SWR9JHtyZWdpb25TdWZmaXh9YCwge1xuICAgICAgICAgIGtleTogYElwYW1Qb29sSWQke2FjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHZhbHVlOiBpcGFtUG9vbC5hdHRySXBhbVBvb2xJZCxcbiAgICAgICAgICBleHBvcnROYW1lOiBgSXBhbVBvb2xJZCR7YWNjb3VudElkfSR7cmVnaW9uU3VmZml4fWBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgSXBhbVBvb2xBcm4ke2FjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gLCB7XG4gICAgICAgICAga2V5OiBgSXBhbVBvb2xBcm4ke2FjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHZhbHVlOiBpcGFtUG9vbC5hdHRyQXJuLFxuICAgICAgICAgIGV4cG9ydE5hbWU6IGBJcGFtUG9vbEFybiR7YWNjb3VudElkfSR7cmVnaW9uU3VmZml4fWBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGNyb3NzLXJlZ2lvbiBjaGFpbmluZyBuZWVkZWQ6IGFjY291bnQgcG9vbHMgaW4gZGlmZmVyZW50IHJlZ2lvbnNcbiAgICAgIC8vIG11dGF0ZSBkaWZmZXJlbnQgcGFyZW50IHJlc291cmNlcyBhbmQgY2FuIHNhZmVseSBydW4gaW4gcGFyYWxsZWwuXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJcGFtUG9vbFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBhbVBvb2xTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBJcGFtUG9vbCh0aGlzLCBcIklwYW1Qb29sXCIsIHtcbiAgICAgIG9yZ0FjY291bnRzOiBwcm9wcy5vcmdBY2NvdW50cyxcbiAgICAgIHJlZ2lvbnM6IHByb3BzLnJlZ2lvbnNcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.SecurityGroup = void 0;
|
|
4
|
-
const ec2 = require("aws-cdk-lib/aws-ec2");
|
|
5
|
-
class SecurityGroup extends ec2.SecurityGroup {
|
|
1
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
2
|
+
export class SecurityGroup extends ec2.SecurityGroup {
|
|
6
3
|
constructor(scope, id, props) {
|
|
7
4
|
super(scope, id, {
|
|
8
5
|
...props,
|
|
@@ -10,5 +7,3 @@ class SecurityGroup extends ec2.SecurityGroup {
|
|
|
10
7
|
});
|
|
11
8
|
}
|
|
12
9
|
}
|
|
13
|
-
exports.SecurityGroup = SecurityGroup;
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlHcm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvc2VjdXJpdHlHcm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBMkM7QUFHM0MsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLGFBQWE7SUFDbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsS0FBSztZQUNSLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEdBQUcsRUFBRSxpQkFBaUI7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBUEQsc0NBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5R3JvdXAgZXh0ZW5kcyBlYzIuU2VjdXJpdHlHcm91cCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBlYzIuU2VjdXJpdHlHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBgJHtpZH0gU2VjdXJpdHkgR3JvdXBgXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Construct } from "constructs";
|
|
2
2
|
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
3
|
-
import { type StackBuilder } from "../base/awsStack";
|
|
3
|
+
import { type StackBuilder } from "../base/awsStack.js";
|
|
4
4
|
export interface VpcFlowLogConfig {
|
|
5
5
|
destination?: "cloudwatch" | "s3";
|
|
6
6
|
retentionDays?: number;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { Duration, RemovalPolicy, Stack } from "aws-cdk-lib";
|
|
2
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
3
|
+
import * as s3 from "aws-cdk-lib/aws-s3";
|
|
4
|
+
import { LogGroup } from "../logging/logGroup.js";
|
|
5
|
+
import { S3Bucket } from "../storage/index.js";
|
|
6
|
+
export class Vpc extends ec2.Vpc {
|
|
7
|
+
gatewayEndpoints = [];
|
|
8
|
+
interfaceEndpoints = [];
|
|
9
|
+
hasNatGateways;
|
|
10
10
|
constructor(scope, id, props) {
|
|
11
11
|
const { maxAzs: maxAzsFromProps, vpcName: explicitName, ...restProps } = props ?? {};
|
|
12
12
|
const maxAzs = maxAzsFromProps ?? 3;
|
|
@@ -21,8 +21,6 @@ class Vpc extends ec2.Vpc {
|
|
|
21
21
|
ipAddresses: Vpc.ipAddresses(scope, id, props),
|
|
22
22
|
gatewayEndpoints: Vpc.gatewayEndpoints(props)
|
|
23
23
|
});
|
|
24
|
-
this.gatewayEndpoints = [];
|
|
25
|
-
this.interfaceEndpoints = [];
|
|
26
24
|
this.hasNatGateways = natGateways !== 0;
|
|
27
25
|
this.addInterfaceEndpoints(id, props, this.hasNatGateways);
|
|
28
26
|
}
|
|
@@ -143,7 +141,7 @@ class Vpc extends ec2.Vpc {
|
|
|
143
141
|
return natConfig.count ?? 1;
|
|
144
142
|
}
|
|
145
143
|
static availabilityZones(scope, maxAzs = 3) {
|
|
146
|
-
return
|
|
144
|
+
return Stack.of(scope).availabilityZones.slice(0, maxAzs);
|
|
147
145
|
}
|
|
148
146
|
static flowLogs(scope, id, props) {
|
|
149
147
|
if (props?.flowLogConfig === false) {
|
|
@@ -155,9 +153,9 @@ class Vpc extends ec2.Vpc {
|
|
|
155
153
|
}
|
|
156
154
|
return {
|
|
157
155
|
[`${id}VpcFlowLogs`]: {
|
|
158
|
-
destination: ec2.FlowLogDestination.toCloudWatchLogs(new
|
|
156
|
+
destination: ec2.FlowLogDestination.toCloudWatchLogs(new LogGroup(scope, `${id}FlowLogGroup`, {
|
|
159
157
|
logGroupName: `/vpc/flowlogs/vpc-${id}/`,
|
|
160
|
-
removalPolicy:
|
|
158
|
+
removalPolicy: RemovalPolicy.DESTROY
|
|
161
159
|
}))
|
|
162
160
|
}
|
|
163
161
|
};
|
|
@@ -165,11 +163,11 @@ class Vpc extends ec2.Vpc {
|
|
|
165
163
|
const config = props.flowLogConfig;
|
|
166
164
|
const trafficType = Vpc.resolveTrafficType(config.trafficType);
|
|
167
165
|
if (config.destination === "s3") {
|
|
168
|
-
const bucket = new
|
|
169
|
-
bucketName: `vpc-flowlogs-${id.toLowerCase()}-${
|
|
166
|
+
const bucket = new S3Bucket(scope, `${id}FlowLogBucket`, {
|
|
167
|
+
bucketName: `vpc-flowlogs-${id.toLowerCase()}-${Stack.of(scope).account}`,
|
|
170
168
|
encryption: s3.BucketEncryption.S3_MANAGED,
|
|
171
169
|
lifecycleRules: config.retentionDays
|
|
172
|
-
? [{ expiration:
|
|
170
|
+
? [{ expiration: Duration.days(config.retentionDays), enabled: true }]
|
|
173
171
|
: undefined
|
|
174
172
|
});
|
|
175
173
|
return {
|
|
@@ -182,9 +180,9 @@ class Vpc extends ec2.Vpc {
|
|
|
182
180
|
const retentionDays = config.retentionDays ?? 14;
|
|
183
181
|
return {
|
|
184
182
|
[`${id}VpcFlowLogs`]: {
|
|
185
|
-
destination: ec2.FlowLogDestination.toCloudWatchLogs(new
|
|
183
|
+
destination: ec2.FlowLogDestination.toCloudWatchLogs(new LogGroup(scope, `${id}FlowLogGroup`, {
|
|
186
184
|
logGroupName: `/vpc/flowlogs/vpc-${id}/`,
|
|
187
|
-
removalPolicy:
|
|
185
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
188
186
|
retention: Vpc.daysToRetention(retentionDays)
|
|
189
187
|
})),
|
|
190
188
|
trafficType
|
|
@@ -234,5 +232,3 @@ class Vpc extends ec2.Vpc {
|
|
|
234
232
|
};
|
|
235
233
|
}
|
|
236
234
|
}
|
|
237
|
-
exports.Vpc = Vpc;
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQTZEO0FBQzdELDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFFekMsa0RBQStDO0FBQy9DLHdDQUFzQztBQTZDdEMsTUFBYSxHQUFJLFNBQVEsR0FBRyxDQUFDLEdBQUc7SUFLOUIsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxNQUFNLEVBQ0osTUFBTSxFQUFFLGVBQWUsRUFDdkIsT0FBTyxFQUFFLFlBQVksRUFDckIsR0FBRyxTQUFTLEVBQ2IsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1lBQ3hCLEdBQUcsU0FBUztZQUNaLE9BQU87WUFDUCxXQUFXO1lBQ1gsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7WUFDdkQsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUM7WUFDeEMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUM7WUFDOUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztTQUM5QyxDQUFDLENBQUM7UUF0QlcscUJBQWdCLEdBQTZCLEVBQUUsQ0FBQztRQUNoRCx1QkFBa0IsR0FBK0Is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SyxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNoRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFFbEQsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1lBQ3ZDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxpQkFBaUIsRUFBRSxXQUFXO1lBQzlCLDhCQUE4QixFQUFFLGNBQWM7U0FDL0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQWdCO1FBQ3ZDLE9BQU8sQ0FBQyxFQUFnQixFQUFFLEVBQUU7WUFDMUIsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUNYLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRTtnQkFDM0MsT0FBTyxFQUFFLEdBQUcsWUFBWSxJQUFJLEVBQUUsRUFBRTthQUNqQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsVEQsa0JBa1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IExvZ0dyb3VwIH0gZnJvbSBcIi4uL2xvZ2dpbmcvbG9nR3JvdXBcIjtcbmltcG9ydCB7IFMzQnVja2V0IH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWcGNGbG93TG9nQ29uZmlnIHtcbiAgZGVzdGluYXRpb24/OiBcImNsb3Vkd2F0Y2hcIiB8IFwiczNcIjtcbiAgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgdHJhZmZpY1R5cGU/OiBcIkFMTFwiIHwgXCJBQ0NFUFRcIiB8IFwiUkVKRUNUXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVnBjTmF0Q29uZmlnIHtcbiAgY291bnQ/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBHYXRld2F5RW5kcG9pbnRzIHtcbiAgczM/OiBib29sZWFuO1xuICBkeW5hbW9kYj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnRlcmZhY2VFbmRwb2ludHMge1xuICBlY3I/OiBib29sZWFuO1xuICBzZWNyZXRzTWFuYWdlcj86IGJvb2xlYW47XG4gIGttcz86IGJvb2xlYW47XG4gIGNsb3Vkd2F0Y2hMb2dzPzogYm9vbGVhbjtcbiAgc3NtPzogYm9vbGVhbjtcbiAgc3RzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEVuZHBvaW50c0NvbmZpZyB7XG4gIGdhdGV3YXk/OiBHYXRld2F5RW5kcG9pbnRzIHwgZmFsc2U7XG4gIGludGVyZmFjZT86IEludGVyZmFjZUVuZHBvaW50cyB8IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZwY1Byb3BzIGV4dGVuZHMgZWMyLlZwY1Byb3BzIHtcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eVpvbmVzPzogc3RyaW5nW107XG4gIGlwdjRJcGFtUG9vbElkPzogc3RyaW5nO1xuICBtYXhBenM/OiBudW1iZXI7XG4gIG5hdEdhdGV3YXlDb25maWc/OiBWcGNOYXRDb25maWcgfCBmYWxzZTtcbiAgZmxvd0xvZ0NvbmZpZz86IFZwY0Zsb3dMb2dDb25maWcgfCBmYWxzZTtcbiAgZW5kcG9pbnRzQ29uZmlnPzogRW5kcG9pbnRzQ29uZmlnIHwgZmFsc2U7XG4gIHZwY0NpZHJNYXNrPzogbnVtYmVyO1xuICBzdWJuZXRDaWRyTWFzaz86IG51bWJlcjtcbiAgdnBjTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFZwYyBleHRlbmRzIGVjMi5WcGMge1xuICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUVuZHBvaW50czogZWMyLkdhdGV3YXlWcGNFbmRwb2ludFtdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmZhY2VFbmRwb2ludHM6IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludFtdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBoYXNOYXRHYXRld2F5czogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFZwY1Byb3BzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4QXpzOiBtYXhBenNGcm9tUHJvcHMsXG4gICAgICB2cGNOYW1lOiBleHBsaWNpdE5hbWUsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gcHJvcHMgPz8ge307XG4gICAgY29uc3QgbWF4QXpzID0gbWF4QXpzRnJvbVByb3BzID8/IDM7XG4gICAgY29uc3QgbmF0R2F0ZXdheXMgPSBWcGMucmVzb2x2ZU5hdEdhdGV3YXlzKHByb3BzKTtcbiAgICBjb25zdCB2cGNOYW1lID0gZXhwbGljaXROYW1lID8/IGlkO1xuXG4gICAgc3VwZXIoc2NvcGUsIGB2cGMtJHtpZH1gLCB7XG4gICAgICAuLi5yZXN0UHJvcHMsXG4gICAgICB2cGNOYW1lLFxuICAgICAgbmF0R2F0ZXdheXMsXG4gICAgICBhdmFpbGFiaWxpdHlab25lczogVnBjLmF2YWlsYWJpbGl0eVpvbmVzKHNjb3BlLCBtYXhBenMpLFxuICAgICAgZmxvd0xvZ3M6IFZwYy5mbG93TG9ncyhzY29wZSwgaWQsIHByb3BzKSxcbiAgICAgIGlwQWRkcmVzc2VzOiBWcGMuaXBBZGRyZXNzZXMoc2NvcGUsIGlkLCBwcm9wcyksXG4gICAgICBnYXRld2F5RW5kcG9pbnRzOiBWcGMuZ2F0ZXdheUVuZHBvaW50cyhwcm9wcylcbiAgICB9KTtcblxuICAgIHRoaXMuaGFzTmF0R2F0ZXdheXMgPSBuYXRHYXRld2F5cyAhPT0gMDtcbiAgICB0aGlzLmFkZEludGVyZmFjZUVuZHBvaW50cyhpZCwgcHJvcHMsIHRoaXMuaGFzTmF0R2F0ZXdheXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2F0ZXdheUVuZHBvaW50cyhcbiAgICBwcm9wcz86IFZwY1Byb3BzXG4gICk6IFJlY29yZDxzdHJpbmcsIGVjMi5HYXRld2F5VnBjRW5kcG9pbnRPcHRpb25zPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzPy5lbmRwb2ludHNDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGdhdGV3YXlDb25maWcgPSBwcm9wcz8uZW5kcG9pbnRzQ29uZmlnPy5nYXRld2F5O1xuICAgIGlmIChnYXRld2F5Q29uZmlnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVTMyA9IGdhdGV3YXlDb25maWc/LnMzID8/IHRydWU7XG4gICAgY29uc3QgZW5hYmxlRHluYW1vZGIgPSBnYXRld2F5Q29uZmlnPy5keW5hbW9kYiA/PyB0cnVlO1xuXG4gICAgaWYgKCFlbmFibGVTMyAmJiAhZW5hYmxlRHluYW1vZGIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBlYzIuR2F0ZXdheVZwY0VuZHBvaW50T3B0aW9ucz4gPSB7fTtcblxuICAgIGlmIChlbmFibGVTMykge1xuICAgICAgZW5kcG9pbnRzLlMzID0geyBzZXJ2aWNlOiBlYzIuR2F0ZXdheVZwY0VuZHBvaW50QXdzU2VydmljZS5TMyB9O1xuICAgIH1cbiAgICBpZiAoZW5hYmxlRHluYW1vZGIpIHtcbiAgICAgIGVuZHBvaW50cy5EeW5hbW9EQiA9IHtcbiAgICAgICAgc2VydmljZTogZWMyLkdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuRFlOQU1PREJcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxuXG4gIHByaXZhdGUgYWRkSW50ZXJmYWNlRW5kcG9pbnRzKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFZwY1Byb3BzIHwgdW5kZWZpbmVkLFxuICAgIGhhc05hdEdhdGV3YXlzOiBib29sZWFuXG4gICkge1xuICAgIGlmIChwcm9wcz8uZW5kcG9pbnRzQ29uZmlnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyZmFjZUNvbmZpZyA9IHByb3BzPy5lbmRwb2ludHNDb25maWc/LmludGVyZmFjZTtcbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnID09PSBmYWxzZSB8fCBpbnRlcmZhY2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZQQyBlbmRwb2ludHMgbXVzdCBiZSBpbiB0aGUgc2FtZSBzdWJuZXQgdHlwZSBhcyB0aGUgcmVzb3VyY2VzIHVzaW5nIHRoZW06XG4gICAgLy8gLSBXaXRoIE5BVDogUFJJVkFURV9XSVRIX0VHUkVTUyAoTGFtYmRhIHVzZXMgdGhlc2Ugd2hlbiBOQVQgaXMgYXZhaWxhYmxlKVxuICAgIC8vIC0gV2l0aG91dCBOQVQ6IFBSSVZBVEVfSVNPTEFURUQgKExhbWJkYSBmYWxscyBiYWNrIHRvIHRoZXNlIHdoZW4gbm8gTkFUIGV4aXN0cylcbiAgICBjb25zdCBzdWJuZXRUeXBlID0gaGFzTmF0R2F0ZXdheXNcbiAgICAgID8gZWMyLlN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgOiBlYzIuU3VibmV0VHlwZS5QUklWQVRFX0lTT0xBVEVEO1xuICAgIGNvbnN0IHN1Ym5ldFNlbGVjdGlvbiA9IHsgc3VibmV0VHlwZSB9O1xuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5lY3IpIHtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goXG4gICAgICAgIG5ldyBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgYCR7aWR9RWNyRG9ja2VyYCwge1xuICAgICAgICAgIHZwYzogdGhpcyxcbiAgICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkVDUl9ET0NLRVIsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1FY3JBcGlgLCB7XG4gICAgICAgICAgdnBjOiB0aGlzLFxuICAgICAgICAgIHNlcnZpY2U6IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuRUNSLFxuICAgICAgICAgIHByaXZhdGVEbnNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHN1Ym5ldHM6IHN1Ym5ldFNlbGVjdGlvblxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnLnNlY3JldHNNYW5hZ2VyKSB7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKFxuICAgICAgICBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIGAke2lkfVNlY3JldHNNYW5hZ2VyYCwge1xuICAgICAgICAgIHZwYzogdGhpcyxcbiAgICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLlNFQ1JFVFNfTUFOQUdFUixcbiAgICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBzdWJuZXRzOiBzdWJuZXRTZWxlY3Rpb25cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5rbXMpIHtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goXG4gICAgICAgIG5ldyBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgYCR7aWR9S21zYCwge1xuICAgICAgICAgIHZwYzogdGhpcyxcbiAgICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLktNUyxcbiAgICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBzdWJuZXRzOiBzdWJuZXRTZWxlY3Rpb25cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5jbG91ZHdhdGNoTG9ncykge1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1DbG91ZFdhdGNoTG9nc2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5DTE9VRFdBVENIX0xPR1MsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpbnRlcmZhY2VDb25maWcuc3NtKSB7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKFxuICAgICAgICBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIGAke2lkfVNzbWAsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TU00sXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1Tc21NZXNzYWdlc2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TU01fTUVTU0FHRVMsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1FYzJNZXNzYWdlc2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5FQzJfTUVTU0FHRVMsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpbnRlcmZhY2VDb25maWcuc3RzKSB7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKFxuICAgICAgICBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIGAke2lkfVN0c2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TVFMsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlTmF0R2F0ZXdheXMocHJvcHM/OiBWcGNQcm9wcyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbmF0Q29uZmlnID0gcHJvcHM/Lm5hdEdhdGV3YXlDb25maWc7XG5cbiAgICBpZiAobmF0Q29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKG5hdENvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBuYXRDb25maWcuY291bnQgPz8gMTtcbiAgfVxuXG4gIHN0YXRpYyBhdmFpbGFiaWxpdHlab25lcyhzY29wZTogQ29uc3RydWN0LCBtYXhBenMgPSAzKSB7XG4gICAgcmV0dXJuIFN0YWNrLm9mKHNjb3BlKS5hdmFpbGFiaWxpdHlab25lcy5zbGljZSgwLCBtYXhBenMpO1xuICB9XG5cbiAgc3RhdGljIGZsb3dMb2dzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IFZwY1Byb3BzXG4gICk6IFJlY29yZDxzdHJpbmcsIGVjMi5GbG93TG9nT3B0aW9ucz4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcz8uZmxvd0xvZ0NvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzPy5mbG93TG9nQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghcHJvcHM/LmFjY291bnRJZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake2lkfVZwY0Zsb3dMb2dzYF06IHtcbiAgICAgICAgICBkZXN0aW5hdGlvbjogZWMyLkZsb3dMb2dEZXN0aW5hdGlvbi50b0Nsb3VkV2F0Y2hMb2dzKFxuICAgICAgICAgICAgbmV3IExvZ0dyb3VwKHNjb3BlLCBgJHtpZH1GbG93TG9nR3JvdXBgLCB7XG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC92cGMvZmxvd2xvZ3MvdnBjLSR7aWR9L2AsXG4gICAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gcHJvcHMuZmxvd0xvZ0NvbmZpZztcbiAgICBjb25zdCB0cmFmZmljVHlwZSA9IFZwYy5yZXNvbHZlVHJhZmZpY1R5cGUoY29uZmlnLnRyYWZmaWNUeXBlKTtcblxuICAgIGlmIChjb25maWcuZGVzdGluYXRpb24gPT09IFwiczNcIikge1xuICAgICAgY29uc3QgYnVja2V0ID0gbmV3IFMzQnVja2V0KHNjb3BlLCBgJHtpZH1GbG93TG9nQnVja2V0YCwge1xuICAgICAgICBidWNrZXROYW1lOiBgdnBjLWZsb3dsb2dzLSR7aWQudG9Mb3dlckNhc2UoKX0tJHtTdGFjay5vZihzY29wZSkuYWNjb3VudH1gLFxuICAgICAgICBlbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBjb25maWcucmV0ZW50aW9uRGF5c1xuICAgICAgICAgID8gW3sgZXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cyhjb25maWcucmV0ZW50aW9uRGF5cyksIGVuYWJsZWQ6IHRydWUgfV1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgJHtpZH1WcGNGbG93TG9nc2BdOiB7XG4gICAgICAgICAgZGVzdGluYXRpb246IGVjMi5GbG93TG9nRGVzdGluYXRpb24udG9TMyhidWNrZXQpLFxuICAgICAgICAgIHRyYWZmaWNUeXBlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ZW50aW9uRGF5cyA9IGNvbmZpZy5yZXRlbnRpb25EYXlzID8/IDE0O1xuICAgIHJldHVybiB7XG4gICAgICBbYCR7aWR9VnBjRmxvd0xvZ3NgXToge1xuICAgICAgICBkZXN0aW5hdGlvbjogZWMyLkZsb3dMb2dEZXN0aW5hdGlvbi50b0Nsb3VkV2F0Y2hMb2dzKFxuICAgICAgICAgIG5ldyBMb2dHcm91cChzY29wZSwgYCR7aWR9Rmxvd0xvZ0dyb3VwYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL3ZwYy9mbG93bG9ncy92cGMtJHtpZH0vYCxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIHJldGVudGlvbjogVnBjLmRheXNUb1JldGVudGlvbihyZXRlbnRpb25EYXlzKVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRyYWZmaWNUeXBlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRheXNUb1JldGVudGlvbihkYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbGlkUmV0ZW50aW9ucyA9IFtcbiAgICAgIDEsIDMsIDUsIDcsIDE0LCAzMCwgNjAsIDkwLCAxMjAsIDE1MCwgMTgwLCAzNjUsIDQwMCwgNTQ1LCA3MzEsIDEwOTYsIDE4MjcsXG4gICAgICAyMTkyLCAyNTU3LCAyOTIyLCAzMjg4LCAzNjUzXG4gICAgXTtcbiAgICByZXR1cm4gdmFsaWRSZXRlbnRpb25zLmZpbmQoKHIpID0+IHIgPj0gZGF5cykgPz8gMzY1MztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVUcmFmZmljVHlwZShcbiAgICB0cmFmZmljVHlwZT86IFwiQUxMXCIgfCBcIkFDQ0VQVFwiIHwgXCJSRUpFQ1RcIlxuICApOiBlYzIuRmxvd0xvZ1RyYWZmaWNUeXBlIHtcbiAgICBzd2l0Y2ggKHRyYWZmaWNUeXBlKSB7XG4gICAgICBjYXNlIFwiQUNDRVBUXCI6XG4gICAgICAgIHJldHVybiBlYzIuRmxvd0xvZ1RyYWZmaWNUeXBlLkFDQ0VQVDtcbiAgICAgIGNhc2UgXCJSRUpFQ1RcIjpcbiAgICAgICAgcmV0dXJuIGVjMi5GbG93TG9nVHJhZmZpY1R5cGUuUkVKRUNUO1xuICAgICAgY2FzZSBcIkFMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGVjMi5GbG93TG9nVHJhZmZpY1R5cGUuQUxMO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpcEFkZHJlc3NlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFZwY1Byb3BzKSB7XG4gICAgaWYgKCFwcm9wcz8uYWNjb3VudElkIHx8ICFwcm9wcz8uaXB2NElwYW1Qb29sSWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdnBjQ2lkck1hc2sgPSBwcm9wcy52cGNDaWRyTWFzayA/PyAyMDtcbiAgICBjb25zdCBzdWJuZXRDaWRyTWFzayA9IHByb3BzLnN1Ym5ldENpZHJNYXNrID8/IDIzO1xuXG4gICAgcmV0dXJuIGVjMi5JcEFkZHJlc3Nlcy5hd3NJcGFtQWxsb2NhdGlvbih7XG4gICAgICBpcHY0SXBhbVBvb2xJZDogcHJvcHMuaXB2NElwYW1Qb29sSWQsXG4gICAgICBpcHY0TmV0bWFza0xlbmd0aDogdnBjQ2lkck1hc2ssXG4gICAgICBkZWZhdWx0U3VibmV0SXB2NE5ldG1hc2tMZW5ndGg6IHN1Ym5ldENpZHJNYXNrXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM/OiBWcGNQcm9wcyk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBwcm9wcyk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBpbXBvcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICB2cGNTdGFja05hbWU6IHN0cmluZ1xuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIHJldHVybiBlYzIuVnBjLmZyb21Mb29rdXAoc2IuZ2V0U3RhY2soKSwgaWQsIHtcbiAgICAgICAgdnBjTmFtZTogYCR7dnBjU3RhY2tOYW1lfS8ke2lkfWBcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Construct } from "constructs";
|
|
2
|
-
import { LambdaFunction } from "../compute/lambda";
|
|
2
|
+
import { LambdaFunction } from "../compute/lambda.js";
|
|
3
3
|
export interface CostAllocationTagActivatorProps {
|
|
4
4
|
/** EventBridge schedule expression. Default: "rate(24 hours)" */
|
|
5
5
|
scheduleExpression?: string;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
6
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
7
|
-
const lambda_1 = require("../compute/lambda");
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { Code, Runtime } from "aws-cdk-lib/aws-lambda";
|
|
3
|
+
import { PolicyStatement, Effect } from "aws-cdk-lib/aws-iam";
|
|
4
|
+
import { LambdaFunction } from "../compute/lambda.js";
|
|
8
5
|
/**
|
|
9
6
|
* Deploys a Lambda that auto-discovers and activates cost allocation tags.
|
|
10
7
|
*
|
|
@@ -12,21 +9,22 @@ const lambda_1 = require("../compute/lambda");
|
|
|
12
9
|
* (via app.addTags() or CDK aspects) is automatically activated in Cost
|
|
13
10
|
* Explorer within 24 hours — no manual intervention required.
|
|
14
11
|
*/
|
|
15
|
-
class CostAllocationTagActivator extends
|
|
12
|
+
export class CostAllocationTagActivator extends Construct {
|
|
13
|
+
lambda;
|
|
16
14
|
constructor(scope, id, props) {
|
|
17
15
|
super(scope, id);
|
|
18
16
|
const schedule = props?.scheduleExpression ?? "rate(24 hours)";
|
|
19
|
-
this.lambda = new
|
|
20
|
-
runtime:
|
|
17
|
+
this.lambda = new LambdaFunction(this, "TagActivatorFunction", {
|
|
18
|
+
runtime: Runtime.NODEJS_22_X,
|
|
21
19
|
handler: "index.handler",
|
|
22
|
-
code:
|
|
20
|
+
code: Code.fromInline(HANDLER_CODE),
|
|
23
21
|
lambdaDescription: "Auto-discovers and activates cost allocation tags in Cost Explorer",
|
|
24
22
|
memorySize: 128,
|
|
25
23
|
timeout: 60,
|
|
26
24
|
scheduleExpression: schedule,
|
|
27
25
|
inlinePolicy: [
|
|
28
|
-
new
|
|
29
|
-
effect:
|
|
26
|
+
new PolicyStatement({
|
|
27
|
+
effect: Effect.ALLOW,
|
|
30
28
|
actions: [
|
|
31
29
|
"ce:ListCostAllocationTags",
|
|
32
30
|
"ce:UpdateCostAllocationTagsStatus"
|
|
@@ -37,7 +35,6 @@ class CostAllocationTagActivator extends constructs_1.Construct {
|
|
|
37
35
|
});
|
|
38
36
|
}
|
|
39
37
|
}
|
|
40
|
-
exports.CostAllocationTagActivator = CostAllocationTagActivator;
|
|
41
38
|
const HANDLER_CODE = `
|
|
42
39
|
const { CostExplorerClient, ListCostAllocationTagsCommand, UpdateCostAllocationTagsStatusCommand } = require("@aws-sdk/client-cost-explorer");
|
|
43
40
|
|
|
@@ -63,4 +60,3 @@ exports.handler = async () => {
|
|
|
63
60
|
return { activated: inactive.length, tags: inactive.map((t) => t.TagKey) };
|
|
64
61
|
};
|
|
65
62
|
`.trim();
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb24vY29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLHVEQUF1RDtBQUN2RCxpREFBOEQ7QUFFOUQsOENBQW1EO0FBT25EOzs7Ozs7R0FNRztBQUNILE1BQWEsMEJBQTJCLFNBQVEsc0JBQVM7SUFHdkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBdUM7UUFFdkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsa0JBQWtCLElBQUksZ0JBQWdCLENBQUM7UUFFL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHVCQUFjLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUNuQyxpQkFBaUIsRUFDZixvRUFBb0U7WUFDdEUsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLGtCQUFrQixFQUFFLFFBQVE7WUFDNUIsWUFBWSxFQUFFO2dCQUNaLElBQUkseUJBQWUsQ0FBQztvQkFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztvQkFDcEIsT0FBTyxFQUFFO3dCQUNQLDJCQUEyQjt3QkFDM0IsbUNBQW1DO3FCQUNwQztvQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7aUJBQ2pCLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpDRCxnRUFpQ0M7QUFFRCxNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0JwQixDQUFDLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENvZGUsIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gXCIuLi9jb21wdXRlL2xhbWJkYVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvc3RBbGxvY2F0aW9uVGFnQWN0aXZhdG9yUHJvcHMge1xuICAvKiogRXZlbnRCcmlkZ2Ugc2NoZWR1bGUgZXhwcmVzc2lvbi4gRGVmYXVsdDogXCJyYXRlKDI0IGhvdXJzKVwiICovXG4gIHNjaGVkdWxlRXhwcmVzc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZXBsb3lzIGEgTGFtYmRhIHRoYXQgYXV0by1kaXNjb3ZlcnMgYW5kIGFjdGl2YXRlcyBjb3N0IGFsbG9jYXRpb24gdGFncy5cbiAqXG4gKiBSdW5zIGRhaWx5IGluIHRoZSBtYW5hZ2VtZW50IGFjY291bnQuIEFueSBub24tQVdTIHRhZyBhcHBsaWVkIHRvIHJlc291cmNlc1xuICogKHZpYSBhcHAuYWRkVGFncygpIG9yIENESyBhc3BlY3RzKSBpcyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCBpbiBDb3N0XG4gKiBFeHBsb3JlciB3aXRoaW4gMjQgaG91cnMg4oCUIG5vIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3N0QWxsb2NhdGlvblRhZ0FjdGl2YXRvciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IENvc3RBbGxvY2F0aW9uVGFnQWN0aXZhdG9yUHJvcHNcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHNjaGVkdWxlID0gcHJvcHM/LnNjaGVkdWxlRXhwcmVzc2lvbiA/PyBcInJhdGUoMjQgaG91cnMpXCI7XG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBMYW1iZGFGdW5jdGlvbih0aGlzLCBcIlRhZ0FjdGl2YXRvckZ1bmN0aW9uXCIsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShIQU5ETEVSX0NPREUpLFxuICAgICAgbGFtYmRhRGVzY3JpcHRpb246XG4gICAgICAgIFwiQXV0by1kaXNjb3ZlcnMgYW5kIGFjdGl2YXRlcyBjb3N0IGFsbG9jYXRpb24gdGFncyBpbiBDb3N0IEV4cGxvcmVyXCIsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiA2MCxcbiAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogc2NoZWR1bGUsXG4gICAgICBpbmxpbmVQb2xpY3k6IFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJjZTpMaXN0Q29zdEFsbG9jYXRpb25UYWdzXCIsXG4gICAgICAgICAgICBcImNlOlVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBIQU5ETEVSX0NPREUgPSBgXG5jb25zdCB7IENvc3RFeHBsb3JlckNsaWVudCwgTGlzdENvc3RBbGxvY2F0aW9uVGFnc0NvbW1hbmQsIFVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c0NvbW1hbmQgfSA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtY29zdC1leHBsb3JlclwiKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ29zdEV4cGxvcmVyQ2xpZW50KHt9KTtcbiAgY29uc3QgeyBDb3N0QWxsb2NhdGlvblRhZ3MgPSBbXSB9ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IExpc3RDb3N0QWxsb2NhdGlvblRhZ3NDb21tYW5kKHsgTWF4UmVzdWx0czogMTAwMCB9KSk7XG5cbiAgY29uc3QgaW5hY3RpdmUgPSBDb3N0QWxsb2NhdGlvblRhZ3MuZmlsdGVyKFxuICAgICh0KSA9PiB0LlRhZ0tleSAmJiB0LlN0YXR1cyA9PT0gXCJJbmFjdGl2ZVwiICYmICF0LlRhZ0tleS5zdGFydHNXaXRoKFwiYXdzOlwiKVxuICApO1xuXG4gIGlmIChpbmFjdGl2ZS5sZW5ndGggPT09IDApIHJldHVybiB7IGFjdGl2YXRlZDogMCB9O1xuXG4gIC8vIEFQSSBsaW1pdDogbWF4IDIwIHRhZ3MgcGVyIFVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1cyBjYWxsXG4gIGNvbnN0IEJBVENIX1NJWkUgPSAyMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmFjdGl2ZS5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xuICAgIGNvbnN0IGJhdGNoID0gaW5hY3RpdmUuc2xpY2UoaSwgaSArIEJBVENIX1NJWkUpO1xuICAgIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBVcGRhdGVDb3N0QWxsb2NhdGlvblRhZ3NTdGF0dXNDb21tYW5kKHtcbiAgICAgIENvc3RBbGxvY2F0aW9uVGFnc1N0YXR1czogYmF0Y2gubWFwKCh0KSA9PiAoeyBUYWdLZXk6IHQuVGFnS2V5LCBTdGF0dXM6IFwiQWN0aXZlXCIgfSkpXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIHsgYWN0aXZhdGVkOiBpbmFjdGl2ZS5sZW5ndGgsIHRhZ3M6IGluYWN0aXZlLm1hcCgodCkgPT4gdC5UYWdLZXkpIH07XG59O1xuYC50cmltKCk7XG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { Organisation as OrganisationResource, type OrganisationProps as OrganisationResourceProps } from "./organisation";
|
|
2
|
-
export { type OrganisationalUnitProps } from "./organisationalUnit";
|
|
3
|
-
export { OrganisationAccount, type OrganisationAccountProps } from "./organisationAccount";
|
|
4
|
-
export { OrganisationPolicy, type OrganisationPolicyProps, type OrganisationPolicyType } from "./organisationPolicy";
|
|
5
|
-
export { CostAllocationTagActivator, type CostAllocationTagActivatorProps } from "./costAllocationTagActivator";
|
|
1
|
+
export { Organisation as OrganisationResource, type OrganisationProps as OrganisationResourceProps } from "./organisation.js";
|
|
2
|
+
export { type OrganisationalUnitProps } from "./organisationalUnit.js";
|
|
3
|
+
export { OrganisationAccount, type OrganisationAccountProps } from "./organisationAccount.js";
|
|
4
|
+
export { OrganisationPolicy, type OrganisationPolicyProps, type OrganisationPolicyType } from "./organisationPolicy.js";
|
|
5
|
+
export { CostAllocationTagActivator, type CostAllocationTagActivatorProps } from "./costAllocationTagActivator.js";
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "OrganisationResource", { enumerable: true, get: function () { return organisation_1.Organisation; } });
|
|
6
|
-
var organisationAccount_1 = require("./organisationAccount");
|
|
7
|
-
Object.defineProperty(exports, "OrganisationAccount", { enumerable: true, get: function () { return organisationAccount_1.OrganisationAccount; } });
|
|
8
|
-
var organisationPolicy_1 = require("./organisationPolicy");
|
|
9
|
-
Object.defineProperty(exports, "OrganisationPolicy", { enumerable: true, get: function () { return organisationPolicy_1.OrganisationPolicy; } });
|
|
10
|
-
var costAllocationTagActivator_1 = require("./costAllocationTagActivator");
|
|
11
|
-
Object.defineProperty(exports, "CostAllocationTagActivator", { enumerable: true, get: function () { return costAllocationTagActivator_1.CostAllocationTagActivator; } });
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBR3dCO0FBRnRCLG9IQUFBLFlBQVksT0FBd0I7QUFJdEMsNkRBRytCO0FBRjdCLDBIQUFBLG1CQUFtQixPQUFBO0FBR3JCLDJEQUk4QjtBQUg1Qix3SEFBQSxrQkFBa0IsT0FBQTtBQUlwQiwyRUFHc0M7QUFGcEMsd0lBQUEsMEJBQTBCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBPcmdhbmlzYXRpb24gYXMgT3JnYW5pc2F0aW9uUmVzb3VyY2UsXG4gIHR5cGUgT3JnYW5pc2F0aW9uUHJvcHMgYXMgT3JnYW5pc2F0aW9uUmVzb3VyY2VQcm9wc1xufSBmcm9tIFwiLi9vcmdhbmlzYXRpb25cIjtcbmV4cG9ydCB7IHR5cGUgT3JnYW5pc2F0aW9uYWxVbml0UHJvcHMgfSBmcm9tIFwiLi9vcmdhbmlzYXRpb25hbFVuaXRcIjtcbmV4cG9ydCB7XG4gIE9yZ2FuaXNhdGlvbkFjY291bnQsXG4gIHR5cGUgT3JnYW5pc2F0aW9uQWNjb3VudFByb3BzXG59IGZyb20gXCIuL29yZ2FuaXNhdGlvbkFjY291bnRcIjtcbmV4cG9ydCB7XG4gIE9yZ2FuaXNhdGlvblBvbGljeSxcbiAgdHlwZSBPcmdhbmlzYXRpb25Qb2xpY3lQcm9wcyxcbiAgdHlwZSBPcmdhbmlzYXRpb25Qb2xpY3lUeXBlXG59IGZyb20gXCIuL29yZ2FuaXNhdGlvblBvbGljeVwiO1xuZXhwb3J0IHtcbiAgQ29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3IsXG4gIHR5cGUgQ29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3JQcm9wc1xufSBmcm9tIFwiLi9jb3N0QWxsb2NhdGlvblRhZ0FjdGl2YXRvclwiO1xuIl19
|
|
1
|
+
export { Organisation as OrganisationResource } from "./organisation.js";
|
|
2
|
+
export { OrganisationAccount } from "./organisationAccount.js";
|
|
3
|
+
export { OrganisationPolicy } from "./organisationPolicy.js";
|
|
4
|
+
export { CostAllocationTagActivator } from "./costAllocationTagActivator.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
export class Organisation extends Construct {
|
|
3
|
+
orgId;
|
|
4
|
+
rootId;
|
|
5
|
+
managementAccountId;
|
|
6
6
|
constructor(scope, id, props) {
|
|
7
7
|
super(scope, id);
|
|
8
8
|
this.orgId = props.orgId;
|
|
@@ -10,5 +10,3 @@ class Organisation extends constructs_1.Construct {
|
|
|
10
10
|
this.managementAccountId = props.managementAccountId;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
exports.Organisation = Organisation;
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3Mvb3JnYW5pc2F0aW9uL29yZ2FuaXNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFRdkMsTUFBYSxZQUFhLFNBQVEsc0JBQVM7SUFLekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUFYRCxvQ0FXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pc2F0aW9uUHJvcHMge1xuICBvcmdJZDogc3RyaW5nO1xuICByb290SWQ6IHN0cmluZztcbiAgbWFuYWdlbWVudEFjY291bnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgT3JnYW5pc2F0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb290SWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1hbmFnZW1lbnRBY2NvdW50SWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMub3JnSWQgPSBwcm9wcy5vcmdJZDtcbiAgICB0aGlzLnJvb3RJZCA9IHByb3BzLnJvb3RJZDtcbiAgICB0aGlzLm1hbmFnZW1lbnRBY2NvdW50SWQgPSBwcm9wcy5tYW5hZ2VtZW50QWNjb3VudElkO1xuICB9XG59XG4iXX0=
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.OrganisationAccount = void 0;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
const constructs_1 = require("constructs");
|
|
1
|
+
import { CfnOutput } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from "constructs";
|
|
6
3
|
/**
|
|
7
4
|
* CDK construct that exports account ID and ARN as CloudFormation outputs.
|
|
8
5
|
*
|
|
@@ -10,22 +7,22 @@ const constructs_1 = require("constructs");
|
|
|
10
7
|
* (AwsAccountService.ensureMissingAccountsCreated / placeAccountsInOUs).
|
|
11
8
|
* This construct only produces the CfnOutputs needed for cross-stack references.
|
|
12
9
|
*/
|
|
13
|
-
class OrganisationAccount extends
|
|
10
|
+
export class OrganisationAccount extends Construct {
|
|
11
|
+
accountId;
|
|
12
|
+
accountArn;
|
|
14
13
|
constructor(scope, id, props) {
|
|
15
14
|
super(scope, id);
|
|
16
15
|
this.accountId = props.accountId;
|
|
17
16
|
this.accountArn = `arn:aws:organizations::${props.managementAccountId}:account/${props.orgId}/${props.accountId}`;
|
|
18
|
-
new
|
|
17
|
+
new CfnOutput(this, `${id}Id`, {
|
|
19
18
|
key: `${id}Id`,
|
|
20
19
|
value: this.accountId,
|
|
21
20
|
exportName: `${id}Id`
|
|
22
21
|
});
|
|
23
|
-
new
|
|
22
|
+
new CfnOutput(this, `${id}Arn`, {
|
|
24
23
|
key: `${id}Arn`,
|
|
25
24
|
value: this.accountArn,
|
|
26
25
|
exportName: `${id}Arn`
|
|
27
26
|
});
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
|
-
exports.OrganisationAccount = OrganisationAccount;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uQWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL29yZ2FuaXNhdGlvbi9vcmdhbmlzYXRpb25BY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF3QztBQUN4QywyQ0FBdUM7QUFRdkM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQUloRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsMEJBQTBCLEtBQUssQ0FBQyxtQkFBbUIsWUFBWSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVsSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7WUFDN0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3RCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF0QkQsa0RBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXNhdGlvbkFjY291bnRQcm9wcyB7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBtYW5hZ2VtZW50QWNjb3VudElkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ0RLIGNvbnN0cnVjdCB0aGF0IGV4cG9ydHMgYWNjb3VudCBJRCBhbmQgQVJOIGFzIENsb3VkRm9ybWF0aW9uIG91dHB1dHMuXG4gKlxuICogQWNjb3VudCBjcmVhdGlvbiBhbmQgT1UgcGxhY2VtZW50IGFyZSBoYW5kbGVkIGJ5IHRoZSBDTEkgcHJlLWRlcGxveSBzdGVwc1xuICogKEF3c0FjY291bnRTZXJ2aWNlLmVuc3VyZU1pc3NpbmdBY2NvdW50c0NyZWF0ZWQgLyBwbGFjZUFjY291bnRzSW5PVXMpLlxuICogVGhpcyBjb25zdHJ1Y3Qgb25seSBwcm9kdWNlcyB0aGUgQ2ZuT3V0cHV0cyBuZWVkZWQgZm9yIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmdhbmlzYXRpb25BY2NvdW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjb3VudEFybjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPcmdhbmlzYXRpb25BY2NvdW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hY2NvdW50SWQgPSBwcm9wcy5hY2NvdW50SWQ7XG4gICAgdGhpcy5hY2NvdW50QXJuID0gYGFybjphd3M6b3JnYW5pemF0aW9uczo6JHtwcm9wcy5tYW5hZ2VtZW50QWNjb3VudElkfTphY2NvdW50LyR7cHJvcHMub3JnSWR9LyR7cHJvcHMuYWNjb3VudElkfWA7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUlkYCwge1xuICAgICAga2V5OiBgJHtpZH1JZGAsXG4gICAgICB2YWx1ZTogdGhpcy5hY2NvdW50SWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtpZH1JZGBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QXJuYCwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMuYWNjb3VudEFybixcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUFybmBcbiAgICB9KTtcbiAgfVxufVxuIl19
|