@aws-cdk/app-staging-synthesizer-alpha 2.127.0-alpha.0 → 2.128.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -8,7 +8,7 @@
8
8
  "url": "https://aws.amazon.com"
9
9
  },
10
10
  "dependencies": {
11
- "aws-cdk-lib": "^2.127.0",
11
+ "aws-cdk-lib": "^2.128.0",
12
12
  "constructs": "^10.0.0"
13
13
  },
14
14
  "dependencyClosure": {
@@ -3669,7 +3669,7 @@
3669
3669
  },
3670
3670
  "name": "@aws-cdk/app-staging-synthesizer-alpha",
3671
3671
  "readme": {
3672
- "markdown": "# App Staging Synthesizer\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nThis library includes constructs aimed at replacing the current model of bootstrapping and providing\ngreater control of the bootstrap experience to the CDK user. The important constructs in this library\nare as follows:\n\n- the `IStagingResources` interface: a framework for an app-level bootstrap stack that handles\n file assets and docker assets.\n- the `DefaultStagingStack`, which is a works-out-of-the-box implementation of the `IStagingResources`\n interface.\n- the `AppStagingSynthesizer`, a new CDK synthesizer that will synthesize CDK applications with\n the staging resources provided.\n\n> As this library is `experimental`, there are features that are not yet implemented. Please look\n> at the list of [Known Limitations](#known-limitations) before getting started.\n\nTo get started, update your CDK App with a new `defaultStackSynthesizer`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id', // put a unique id here\n }),\n});\n```\n\nThis will introduce a `DefaultStagingStack` in your CDK App and staging assets of your App\nwill live in the resources from that stack rather than the CDK Bootstrap stack.\n\nIf you are migrating from a different version of synthesis your updated CDK App will target\nthe resources in the `DefaultStagingStack` and no longer be tied to the bootstrapped resources\nin your account.\n\n## Bootstrap Model\n\nIn our default bootstrapping process, when you run `cdk bootstrap aws://<account>/<region>`, the following\nresources are created:\n\n- It creates Roles to assume for cross-account deployments and for Pipeline deployments;\n- It creates staging resources: a global S3 bucket and global ECR repository to hold CDK assets;\n- It creates Roles to write to the S3 bucket and ECR repository;\n\nBecause the bootstrapping resources include regional resources, you need to bootstrap\nevery region you plan to deploy to individually. All assets of all CDK apps deploying\nto that account and region will be written to the single S3 Bucket and ECR repository.\n\nBy using the synthesizer in this library, instead of the\n`DefaultStackSynthesizer`, a different set of staging resources will be created\nfor every CDK application, and they will be created automatically as part of a\nregular deployment, in a separate Stack that is deployed before your application\nStacks. The staging resources will be one S3 bucket, and *one ECR repository per\nimage*, and Roles necessary to access those buckets and ECR repositories. The\nRoles from the default bootstrap stack are still used (though their use can be\nturned off).\n\nThis has the following advantages:\n\n- Because staging resources are now application-specific, they can be fully cleaned up when you clean up\n the application.\n- Because there is now one ECR repository per image instead of one ECR repository for all images, it is\n possible to effectively use ECR life cycle rules (for example, retain only the most recent 5 images)\n to cut down on storage costs.\n- Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle\n controlled individually.\n- Because the only shared bootstrapping resources required are Roles, which are global resources,\n you now only need to bootstrap every account in one Region (instead of every Region). This makes it\n easier to do with CloudFormation StackSets.\n\nFor the deployment roles, this synthesizer still uses the Roles from the default\nbootstrap stack, and nothing else. The staging resources from that bootstrap\nstack will be unused. You can customize the template to remove those resources\nif you prefer. In the future, we will provide a bootstrap stack template with\nonly those Roles, specifically for use with this synthesizer.\n\n## Using the Default Staging Stack per Environment\n\nThe most common use case will be to use the built-in default resources. In this scenario, the\nsynthesizer will create a new Staging Stack in each environment the CDK App is deployed to store\nits staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});\n```\n\nEvery CDK App that uses the `DefaultStagingStack` must include an `appId`. This should\nbe an identifier unique to the app and is used to differentiate staging resources associated\nwith the app.\n\n### Default Staging Stack\n\nThe Default Staging Stack includes all the staging resources necessary for CDK Assets. The below example\nis of a CDK App using the `AppStagingSynthesizer` and creating a file asset for the Lambda Function\nsource code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role will be created that will be\nused to upload the asset to S3.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({ appId: 'my-app-id' }),\n});\n\nconst stack = new Stack(app, 'my-stack');\n\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')),\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n\napp.synth();\n```\n\n### Custom Roles\n\nYou can customize some or all of the roles you'd like to use in the synthesizer as well,\nif all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});\n```\n\nOr, you can ask to use the CLI credentials that exist at deploy-time.\nThese credentials must have the ability to perform CloudFormation calls,\nlookup resources in your account, and perform CloudFormation deployment.\nFor a full list of what is necessary, see `LookupRole`, `DeploymentActionRole`,\nand `CloudFormationExecutionRole` in the\n[bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.cliCredentials(),\n }),\n});\n```\n\nThe default staging stack will create roles to publish to the S3 bucket and ECR repositories,\nassumable by the deployment role. You can also specify an existing IAM role for the\n`fileAssetPublishingRole` or `imageAssetPublishingRole`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});\n```\n\n### Deploy Time S3 Assets\n\nThere are two types of assets:\n\n- Assets used only during deployment. These are used to hand off a large piece of data to another\nservice, that will make a private copy of that data. After deployment, the asset is only necessary for\na potential future rollback.\n- Assets accessed throughout the running life time of the application.\n\nExamples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code\nbundles. Examples of assets accessed throughout the life time of the application are script files\ndownloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application\nlife-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.\n\nLambda assets are by default marked as deploy time assets:\n\n```ts\ndeclare const stack: Stack;\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')), // lambda marks deployTime = true\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n```\n\nOr, if you want to create your own deploy time asset:\n\n```ts\nimport { Asset } from 'aws-cdk-lib/aws-s3-assets';\n\ndeclare const stack: Stack;\nconst asset = new Asset(stack, 'deploy-time-asset', {\n deployTime: true,\n path: path.join(__dirname, 'deploy-time-asset'),\n});\n```\n\nBy default, we store deploy time assets for 30 days, but you can change this number by specifying\n`deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back\nto a previous version of an application just by doing a CloudFormation deployment with the old\ntemplate, without rebuilding and republishing assets.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deployTimeFileAssetLifetime: Duration.days(100),\n }),\n});\n```\n\n### Lifecycle Rules on ECR Repositories\n\nBy default, we store a maximum of 3 revisions of a particular docker image asset. This allows\nfor smooth faciliation of rollback scenarios where we may reference previous versions of an\nimage. When more than 3 revisions of an asset exist in the ECR repository, the oldest one is\npurged.\n\nTo change the number of revisions stored, use `imageAssetVersionCount`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n imageAssetVersionCount: 10,\n }),\n});\n```\n\n### Auto Delete Staging Assets on Deletion\n\nBy default, the staging resources will be cleaned up on stack deletion. That means that the\nS3 Bucket and ECR Repositories are set to `RemovalPolicy.DESTROY` and have `autoDeleteObjects`\nor `emptyOnDelete` turned on. This creates custom resources under the hood to facilitate\ncleanup. To turn this off, specify `autoDeleteStagingAssets: false`.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n autoDeleteStagingAssets: false,\n }),\n});\n```\n\n### Staging Bucket Encryption\n\nBy default, the staging resources will be stored in an S3 Bucket with KMS encryption. To use\nSSE-S3, set `stagingBucketEncryption` to `BucketEncryption.S3_MANAGED`.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n }),\n});\n```\n\n## Using a Custom Staging Stack per Environment\n\nIf you want to customize some behavior that is not configurable via properties,\nyou can implement your own class that implements `IStagingResources`. To get a head start,\nyou can subclass `DefaultStagingStack`.\n\n```ts\ninterface CustomStagingStackOptions extends DefaultStagingStackOptions {}\n\nclass CustomStagingStack extends DefaultStagingStack {\n}\n```\n\nOr you can roll your own staging resources from scratch, as long as it implements `IStagingResources`.\n\n```ts\ninterface CustomStagingStackProps extends StackProps {}\n\nclass CustomStagingStack extends Stack implements IStagingResources {\n public constructor(scope: Construct, id: string, props: CustomStagingStackProps) {\n super(scope, id, props);\n }\n\n public addFile(asset: FileAssetSource): FileStagingLocation {\n return {\n bucketName: 'myBucket',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n\n public addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation {\n return {\n repoName: 'myRepo',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n}\n```\n\nUsing your custom staging resources means implementing a `CustomFactory` class and calling the\n`AppStagingSynthesizer.customFactory()` static method. This has the benefit of providing a\ncustom Staging Stack that can be created in every environment the CDK App is deployed to.\n\n```ts fixture=with-custom-staging\nclass CustomFactory implements IStagingResourcesFactory {\n public obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext) {\n const myApp = App.of(stack);\n\n return new CustomStagingStack(myApp!, `CustomStagingStack-${context.environmentString}`, {});\n }\n}\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customFactory({\n factory: new CustomFactory(),\n oncePerEnv: true, // by default\n }),\n});\n```\n\n## Using an Existing Staging Stack\n\nUse `AppStagingSynthesizer.customResources()` to supply an existing stack as the Staging Stack.\nMake sure that the custom stack you provide implements `IStagingResources`.\n\n```ts fixture=with-custom-staging\nconst resourceApp = new App();\nconst resources = new CustomStagingStack(resourceApp, 'CustomStagingStack', {});\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customResources({\n resources,\n }),\n});\n```\n\n## Known Limitations\n\nSince this module is experimental, there are some known limitations:\n\n- Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this\n synthesizer via `cdk deploy`. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26118)\n to indicate you want this.\n- This synthesizer only needs a bootstrap stack with Roles, without staging resources. We\n haven't written such a bootstrap stack yet; at the moment you can use the existing modern\n bootstrap stack, the staging resources in them will just go unused. You can customize the\n template to remove them if desired.\n- Due to limitations on the CloudFormation template size, CDK Applications can have\n at most 20 independent ECR images. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26119)\n if you need more than this.\n"
3672
+ "markdown": "# App Staging Synthesizer\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nThis library includes constructs aimed at replacing the current model of bootstrapping and providing\ngreater control of the bootstrap experience to the CDK user. The important constructs in this library\nare as follows:\n\n- the `IStagingResources` interface: a framework for an app-level bootstrap stack that handles\n file assets and docker assets.\n- the `DefaultStagingStack`, which is a works-out-of-the-box implementation of the `IStagingResources`\n interface.\n- the `AppStagingSynthesizer`, a new CDK synthesizer that will synthesize CDK applications with\n the staging resources provided.\n\n> As this library is `experimental`, there are features that are not yet implemented. Please look\n> at the list of [Known Limitations](#known-limitations) before getting started.\n\nTo get started, update your CDK App with a new `defaultStackSynthesizer`:\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id', // put a unique id here\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n }),\n});\n```\n\nThis will introduce a `DefaultStagingStack` in your CDK App and staging assets of your App\nwill live in the resources from that stack rather than the CDK Bootstrap stack.\n\nIf you are migrating from a different version of synthesis your updated CDK App will target\nthe resources in the `DefaultStagingStack` and no longer be tied to the bootstrapped resources\nin your account.\n\n## Bootstrap Model\n\nIn our default bootstrapping process, when you run `cdk bootstrap aws://<account>/<region>`, the following\nresources are created:\n\n- It creates Roles to assume for cross-account deployments and for Pipeline deployments;\n- It creates staging resources: a global S3 bucket and global ECR repository to hold CDK assets;\n- It creates Roles to write to the S3 bucket and ECR repository;\n\nBecause the bootstrapping resources include regional resources, you need to bootstrap\nevery region you plan to deploy to individually. All assets of all CDK apps deploying\nto that account and region will be written to the single S3 Bucket and ECR repository.\n\nBy using the synthesizer in this library, instead of the\n`DefaultStackSynthesizer`, a different set of staging resources will be created\nfor every CDK application, and they will be created automatically as part of a\nregular deployment, in a separate Stack that is deployed before your application\nStacks. The staging resources will be one S3 bucket, and *one ECR repository per\nimage*, and Roles necessary to access those buckets and ECR repositories. The\nRoles from the default bootstrap stack are still used (though their use can be\nturned off).\n\nThis has the following advantages:\n\n- Because staging resources are now application-specific, they can be fully cleaned up when you clean up\n the application.\n- Because there is now one ECR repository per image instead of one ECR repository for all images, it is\n possible to effectively use ECR life cycle rules (for example, retain only the most recent 5 images)\n to cut down on storage costs.\n- Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle\n controlled individually.\n- Because the only shared bootstrapping resources required are Roles, which are global resources,\n you now only need to bootstrap every account in one Region (instead of every Region). This makes it\n easier to do with CloudFormation StackSets.\n\nFor the deployment roles, this synthesizer still uses the Roles from the default\nbootstrap stack, and nothing else. The staging resources from that bootstrap\nstack will be unused. You can customize the template to remove those resources\nif you prefer. In the future, we will provide a bootstrap stack template with\nonly those Roles, specifically for use with this synthesizer.\n\n## Using the Default Staging Stack per Environment\n\nThe most common use case will be to use the built-in default resources. In this scenario, the\nsynthesizer will create a new Staging Stack in each environment the CDK App is deployed to store\nits staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});\n```\n\nEvery CDK App that uses the `DefaultStagingStack` must include an `appId`. This should\nbe an identifier unique to the app and is used to differentiate staging resources associated\nwith the app.\n\n### Default Staging Stack\n\nThe Default Staging Stack includes all the staging resources necessary for CDK Assets. The below example\nis of a CDK App using the `AppStagingSynthesizer` and creating a file asset for the Lambda Function\nsource code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role will be created that will be\nused to upload the asset to S3.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n }),\n});\n\nconst stack = new Stack(app, 'my-stack');\n\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')),\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n\napp.synth();\n```\n\n### Custom Roles\n\nYou can customize some or all of the roles you'd like to use in the synthesizer as well,\nif all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});\n```\n\nOr, you can ask to use the CLI credentials that exist at deploy-time.\nThese credentials must have the ability to perform CloudFormation calls,\nlookup resources in your account, and perform CloudFormation deployment.\nFor a full list of what is necessary, see `LookupRole`, `DeploymentActionRole`,\nand `CloudFormationExecutionRole` in the\n[bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.cliCredentials(),\n }),\n});\n```\n\nThe default staging stack will create roles to publish to the S3 bucket and ECR repositories,\nassumable by the deployment role. You can also specify an existing IAM role for the\n`fileAssetPublishingRole` or `imageAssetPublishingRole`:\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});\n```\n\n### Deploy Time S3 Assets\n\nThere are two types of assets:\n\n- Assets used only during deployment. These are used to hand off a large piece of data to another\nservice, that will make a private copy of that data. After deployment, the asset is only necessary for\na potential future rollback.\n- Assets accessed throughout the running life time of the application.\n\nExamples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code\nbundles. Examples of assets accessed throughout the life time of the application are script files\ndownloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application\nlife-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.\n\nLambda assets are by default marked as deploy time assets:\n\n```ts\ndeclare const stack: Stack;\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')), // lambda marks deployTime = true\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n```\n\nOr, if you want to create your own deploy time asset:\n\n```ts\nimport { Asset } from 'aws-cdk-lib/aws-s3-assets';\n\ndeclare const stack: Stack;\nconst asset = new Asset(stack, 'deploy-time-asset', {\n deployTime: true,\n path: path.join(__dirname, 'deploy-time-asset'),\n});\n```\n\nBy default, we store deploy time assets for 30 days, but you can change this number by specifying\n`deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back\nto a previous version of an application just by doing a CloudFormation deployment with the old\ntemplate, without rebuilding and republishing assets.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deployTimeFileAssetLifetime: Duration.days(100),\n }),\n});\n```\n\n### Lifecycle Rules on ECR Repositories\n\nBy default, we store a maximum of 3 revisions of a particular docker image asset. This allows\nfor smooth faciliation of rollback scenarios where we may reference previous versions of an\nimage. When more than 3 revisions of an asset exist in the ECR repository, the oldest one is\npurged.\n\nTo change the number of revisions stored, use `imageAssetVersionCount`:\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n imageAssetVersionCount: 10,\n }),\n});\n```\n\n### Auto Delete Staging Assets on Deletion\n\nBy default, the staging resources will be cleaned up on stack deletion. That means that the\nS3 Bucket and ECR Repositories are set to `RemovalPolicy.DESTROY` and have `autoDeleteObjects`\nor `emptyOnDelete` turned on. This creates custom resources under the hood to facilitate\ncleanup. To turn this off, specify `autoDeleteStagingAssets: false`.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n autoDeleteStagingAssets: false,\n }),\n});\n```\n\n### Staging Bucket Encryption\n\nYou must explicitly specify the encryption type for the staging bucket via the `stagingBucketEncryption` property. In\nfuture versions of this package, the default will be `BucketEncryption.S3_MANAGED`.\n\nIn previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost\n$1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module\nwe intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3\nmanaged encryption for existing buckets is not straightforward. Therefore, for now, this property is required.\n\nIf you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to\n`BucketEncryption.KMS`. If you are creating a new staging bucket, you can set this property to\n`BucketEncryption.S3_MANAGED` to avoid the cost of a KMS key.\n\nYou can learn more about choosing a bucket encryption type in the\n[S3 documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).\n\n## Using a Custom Staging Stack per Environment\n\nIf you want to customize some behavior that is not configurable via properties,\nyou can implement your own class that implements `IStagingResources`. To get a head start,\nyou can subclass `DefaultStagingStack`.\n\n```ts\ninterface CustomStagingStackOptions extends DefaultStagingStackOptions {}\n\nclass CustomStagingStack extends DefaultStagingStack {\n}\n```\n\nOr you can roll your own staging resources from scratch, as long as it implements `IStagingResources`.\n\n```ts\ninterface CustomStagingStackProps extends StackProps {}\n\nclass CustomStagingStack extends Stack implements IStagingResources {\n public constructor(scope: Construct, id: string, props: CustomStagingStackProps) {\n super(scope, id, props);\n }\n\n public addFile(asset: FileAssetSource): FileStagingLocation {\n return {\n bucketName: 'myBucket',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n\n public addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation {\n return {\n repoName: 'myRepo',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n}\n```\n\nUsing your custom staging resources means implementing a `CustomFactory` class and calling the\n`AppStagingSynthesizer.customFactory()` static method. This has the benefit of providing a\ncustom Staging Stack that can be created in every environment the CDK App is deployed to.\n\n```ts fixture=with-custom-staging\nclass CustomFactory implements IStagingResourcesFactory {\n public obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext) {\n const myApp = App.of(stack);\n\n return new CustomStagingStack(myApp!, `CustomStagingStack-${context.environmentString}`, {});\n }\n}\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customFactory({\n factory: new CustomFactory(),\n oncePerEnv: true, // by default\n }),\n});\n```\n\n## Using an Existing Staging Stack\n\nUse `AppStagingSynthesizer.customResources()` to supply an existing stack as the Staging Stack.\nMake sure that the custom stack you provide implements `IStagingResources`.\n\n```ts fixture=with-custom-staging\nconst resourceApp = new App();\nconst resources = new CustomStagingStack(resourceApp, 'CustomStagingStack', {});\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customResources({\n resources,\n }),\n});\n```\n\n## Known Limitations\n\nSince this module is experimental, there are some known limitations:\n\n- Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this\n synthesizer via `cdk deploy`. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26118)\n to indicate you want this.\n- This synthesizer only needs a bootstrap stack with Roles, without staging resources. We\n haven't written such a bootstrap stack yet; at the moment you can use the existing modern\n bootstrap stack, the staging resources in them will just go unused. You can customize the\n template to remove them if desired.\n- Due to limitations on the CloudFormation template size, CDK Applications can have\n at most 20 independent ECR images. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26119)\n if you need more than this.\n"
3673
3673
  },
3674
3674
  "repository": {
3675
3675
  "directory": "packages/@aws-cdk/app-staging-synthesizer-alpha",
@@ -4059,7 +4059,7 @@
4059
4059
  "remarks": "These roles must exist already.\nThis class does not create new IAM Roles.",
4060
4060
  "stability": "experimental",
4061
4061
  "summary": "Bootstrapped role specifier.",
4062
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4062
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4063
4063
  "custom": {
4064
4064
  "exampleMetadata": "infused"
4065
4065
  }
@@ -4139,7 +4139,7 @@
4139
4139
  "docs": {
4140
4140
  "stability": "experimental",
4141
4141
  "summary": "Roles that are bootstrapped to your account.",
4142
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4142
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4143
4143
  "custom": {
4144
4144
  "exampleMetadata": "infused"
4145
4145
  }
@@ -4315,7 +4315,7 @@
4315
4315
  "docs": {
4316
4316
  "stability": "experimental",
4317
4317
  "summary": "Options for `DeploymentIdentities.defaultBootstrappedRoles`.",
4318
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4318
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4319
4319
  "custom": {
4320
4320
  "exampleMetadata": "infused"
4321
4321
  }
@@ -4356,7 +4356,7 @@
4356
4356
  "docs": {
4357
4357
  "stability": "experimental",
4358
4358
  "summary": "Properties for stackPerEnv static method.",
4359
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});",
4359
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});",
4360
4360
  "custom": {
4361
4361
  "exampleMetadata": "infused"
4362
4362
  }
@@ -4378,7 +4378,7 @@
4378
4378
  "assembly": "@aws-cdk/app-staging-synthesizer-alpha",
4379
4379
  "base": "aws-cdk-lib.Stack",
4380
4380
  "docs": {
4381
- "example": "const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });",
4381
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\nconst defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });",
4382
4382
  "stability": "experimental",
4383
4383
  "summary": "A default Staging Stack that implements IStagingResources."
4384
4384
  },
@@ -4389,7 +4389,7 @@
4389
4389
  },
4390
4390
  "locationInModule": {
4391
4391
  "filename": "lib/default-staging-stack.ts",
4392
- "line": 249
4392
+ "line": 259
4393
4393
  },
4394
4394
  "parameters": [
4395
4395
  {
@@ -4418,7 +4418,7 @@
4418
4418
  "kind": "class",
4419
4419
  "locationInModule": {
4420
4420
  "filename": "lib/default-staging-stack.ts",
4421
- "line": 160
4421
+ "line": 170
4422
4422
  },
4423
4423
  "methods": [
4424
4424
  {
@@ -4428,7 +4428,7 @@
4428
4428
  },
4429
4429
  "locationInModule": {
4430
4430
  "filename": "lib/default-staging-stack.ts",
4431
- "line": 164
4431
+ "line": 174
4432
4432
  },
4433
4433
  "name": "factory",
4434
4434
  "parameters": [
@@ -4453,7 +4453,7 @@
4453
4453
  },
4454
4454
  "locationInModule": {
4455
4455
  "filename": "lib/default-staging-stack.ts",
4456
- "line": 480
4456
+ "line": 490
4457
4457
  },
4458
4458
  "name": "addDockerImage",
4459
4459
  "overrides": "@aws-cdk/app-staging-synthesizer-alpha.IStagingResources",
@@ -4478,7 +4478,7 @@
4478
4478
  },
4479
4479
  "locationInModule": {
4480
4480
  "filename": "lib/default-staging-stack.ts",
4481
- "line": 468
4481
+ "line": 478
4482
4482
  },
4483
4483
  "name": "addFile",
4484
4484
  "overrides": "@aws-cdk/app-staging-synthesizer-alpha.IStagingResources",
@@ -4507,7 +4507,7 @@
4507
4507
  "immutable": true,
4508
4508
  "locationInModule": {
4509
4509
  "filename": "lib/default-staging-stack.ts",
4510
- "line": 225
4510
+ "line": 235
4511
4511
  },
4512
4512
  "name": "dependencyStack",
4513
4513
  "type": {
@@ -4522,7 +4522,7 @@
4522
4522
  "immutable": true,
4523
4523
  "locationInModule": {
4524
4524
  "filename": "lib/default-staging-stack.ts",
4525
- "line": 220
4525
+ "line": 230
4526
4526
  },
4527
4527
  "name": "stagingRepos",
4528
4528
  "type": {
@@ -4542,7 +4542,7 @@
4542
4542
  "immutable": true,
4543
4543
  "locationInModule": {
4544
4544
  "filename": "lib/default-staging-stack.ts",
4545
- "line": 215
4545
+ "line": 225
4546
4546
  },
4547
4547
  "name": "stagingBucket",
4548
4548
  "optional": true,
@@ -4559,7 +4559,7 @@
4559
4559
  "docs": {
4560
4560
  "stability": "experimental",
4561
4561
  "summary": "User configurable options to the DefaultStagingStack.",
4562
- "example": "const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });",
4562
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\nconst defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });",
4563
4563
  "custom": {
4564
4564
  "exampleMetadata": "infused"
4565
4565
  }
@@ -4589,6 +4589,23 @@
4589
4589
  "primitive": "string"
4590
4590
  }
4591
4591
  },
4592
+ {
4593
+ "abstract": true,
4594
+ "docs": {
4595
+ "remarks": "In future versions of this package, the default will be BucketEncryption.S3_MANAGED.\n\nIn previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost\n$1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module\nwe intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3\nmanaged encryption for existing buckets is not straightforward. Therefore, for now, this property is required.\n\nIf you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to\nBucketEncryption.KMS. If you are creating a new staging bucket, you can set this property to\nBucketEncryption.S3_MANAGED to avoid the cost of a KMS key.",
4596
+ "stability": "experimental",
4597
+ "summary": "Encryption type for staging bucket."
4598
+ },
4599
+ "immutable": true,
4600
+ "locationInModule": {
4601
+ "filename": "lib/default-staging-stack.ts",
4602
+ "line": 78
4603
+ },
4604
+ "name": "stagingBucketEncryption",
4605
+ "type": {
4606
+ "fqn": "aws-cdk-lib.aws_s3.BucketEncryption"
4607
+ }
4608
+ },
4592
4609
  {
4593
4610
  "abstract": true,
4594
4611
  "docs": {
@@ -4599,7 +4616,7 @@
4599
4616
  "immutable": true,
4600
4617
  "locationInModule": {
4601
4618
  "filename": "lib/default-staging-stack.ts",
4602
- "line": 120
4619
+ "line": 129
4603
4620
  },
4604
4621
  "name": "autoDeleteStagingAssets",
4605
4622
  "optional": true,
@@ -4618,7 +4635,7 @@
4618
4635
  "immutable": true,
4619
4636
  "locationInModule": {
4620
4637
  "filename": "lib/default-staging-stack.ts",
4621
- "line": 100
4638
+ "line": 109
4622
4639
  },
4623
4640
  "name": "deployTimeFileAssetLifetime",
4624
4641
  "optional": true,
@@ -4636,7 +4653,7 @@
4636
4653
  "immutable": true,
4637
4654
  "locationInModule": {
4638
4655
  "filename": "lib/default-staging-stack.ts",
4639
- "line": 76
4656
+ "line": 85
4640
4657
  },
4641
4658
  "name": "fileAssetPublishingRole",
4642
4659
  "optional": true,
@@ -4654,7 +4671,7 @@
4654
4671
  "immutable": true,
4655
4672
  "locationInModule": {
4656
4673
  "filename": "lib/default-staging-stack.ts",
4657
- "line": 83
4674
+ "line": 92
4658
4675
  },
4659
4676
  "name": "imageAssetPublishingRole",
4660
4677
  "optional": true,
@@ -4673,7 +4690,7 @@
4673
4690
  "immutable": true,
4674
4691
  "locationInModule": {
4675
4692
  "filename": "lib/default-staging-stack.ts",
4676
- "line": 112
4693
+ "line": 121
4677
4694
  },
4678
4695
  "name": "imageAssetVersionCount",
4679
4696
  "optional": true,
@@ -4681,24 +4698,6 @@
4681
4698
  "primitive": "number"
4682
4699
  }
4683
4700
  },
4684
- {
4685
- "abstract": true,
4686
- "docs": {
4687
- "default": "- s3.BucketEncryption.KMS",
4688
- "stability": "experimental",
4689
- "summary": "Encryption type for staging bucket."
4690
- },
4691
- "immutable": true,
4692
- "locationInModule": {
4693
- "filename": "lib/default-staging-stack.ts",
4694
- "line": 69
4695
- },
4696
- "name": "stagingBucketEncryption",
4697
- "optional": true,
4698
- "type": {
4699
- "fqn": "aws-cdk-lib.aws_s3.BucketEncryption"
4700
- }
4701
- },
4702
4701
  {
4703
4702
  "abstract": true,
4704
4703
  "docs": {
@@ -4728,7 +4727,7 @@
4728
4727
  "immutable": true,
4729
4728
  "locationInModule": {
4730
4729
  "filename": "lib/default-staging-stack.ts",
4731
- "line": 130
4730
+ "line": 139
4732
4731
  },
4733
4732
  "name": "stagingStackNamePrefix",
4734
4733
  "optional": true,
@@ -4745,7 +4744,7 @@
4745
4744
  "docs": {
4746
4745
  "stability": "experimental",
4747
4746
  "summary": "Default Staging Stack Properties.",
4748
- "example": "// The code below shows an example of how to instantiate this type.\n// The values are placeholders you should change.\nimport * as app_staging_synthesizer_alpha from '@aws-cdk/app-staging-synthesizer-alpha';\nimport * as cdk from 'aws-cdk-lib';\nimport { aws_s3 as s3 } from 'aws-cdk-lib';\n\ndeclare const bootstrapRole: app_staging_synthesizer_alpha.BootstrapRole;\ndeclare const permissionsBoundary: cdk.PermissionsBoundary;\ndeclare const stackSynthesizer: cdk.StackSynthesizer;\nconst defaultStagingStackProps: app_staging_synthesizer_alpha.DefaultStagingStackProps = {\n appId: 'appId',\n qualifier: 'qualifier',\n\n // the properties below are optional\n analyticsReporting: false,\n autoDeleteStagingAssets: false,\n crossRegionReferences: false,\n deployRoleArn: 'deployRoleArn',\n deployTimeFileAssetLifetime: cdk.Duration.minutes(30),\n description: 'description',\n env: {\n account: 'account',\n region: 'region',\n },\n fileAssetPublishingRole: bootstrapRole,\n imageAssetPublishingRole: bootstrapRole,\n imageAssetVersionCount: 123,\n permissionsBoundary: permissionsBoundary,\n stackName: 'stackName',\n stagingBucketEncryption: s3.BucketEncryption.UNENCRYPTED,\n stagingBucketName: 'stagingBucketName',\n stagingStackNamePrefix: 'stagingStackNamePrefix',\n suppressTemplateIndentation: false,\n synthesizer: stackSynthesizer,\n tags: {\n tagsKey: 'tags',\n },\n terminationProtection: false,\n};",
4747
+ "example": "// The code below shows an example of how to instantiate this type.\n// The values are placeholders you should change.\nimport * as app_staging_synthesizer_alpha from '@aws-cdk/app-staging-synthesizer-alpha';\nimport * as cdk from 'aws-cdk-lib';\nimport { aws_s3 as s3 } from 'aws-cdk-lib';\n\ndeclare const bootstrapRole: app_staging_synthesizer_alpha.BootstrapRole;\ndeclare const permissionsBoundary: cdk.PermissionsBoundary;\ndeclare const stackSynthesizer: cdk.StackSynthesizer;\nconst defaultStagingStackProps: app_staging_synthesizer_alpha.DefaultStagingStackProps = {\n appId: 'appId',\n qualifier: 'qualifier',\n stagingBucketEncryption: s3.BucketEncryption.UNENCRYPTED,\n\n // the properties below are optional\n analyticsReporting: false,\n autoDeleteStagingAssets: false,\n crossRegionReferences: false,\n deployRoleArn: 'deployRoleArn',\n deployTimeFileAssetLifetime: cdk.Duration.minutes(30),\n description: 'description',\n env: {\n account: 'account',\n region: 'region',\n },\n fileAssetPublishingRole: bootstrapRole,\n imageAssetPublishingRole: bootstrapRole,\n imageAssetVersionCount: 123,\n permissionsBoundary: permissionsBoundary,\n stackName: 'stackName',\n stagingBucketName: 'stagingBucketName',\n stagingStackNamePrefix: 'stagingStackNamePrefix',\n suppressTemplateIndentation: false,\n synthesizer: stackSynthesizer,\n tags: {\n tagsKey: 'tags',\n },\n terminationProtection: false,\n};",
4749
4748
  "custom": {
4750
4749
  "exampleMetadata": "fixture=_generated"
4751
4750
  }
@@ -4758,7 +4757,7 @@
4758
4757
  "kind": "interface",
4759
4758
  "locationInModule": {
4760
4759
  "filename": "lib/default-staging-stack.ts",
4761
- "line": 136
4760
+ "line": 145
4762
4761
  },
4763
4762
  "name": "DefaultStagingStackProps",
4764
4763
  "properties": [
@@ -4772,7 +4771,7 @@
4772
4771
  "immutable": true,
4773
4772
  "locationInModule": {
4774
4773
  "filename": "lib/default-staging-stack.ts",
4775
- "line": 151
4774
+ "line": 160
4776
4775
  },
4777
4776
  "name": "qualifier",
4778
4777
  "type": {
@@ -4790,7 +4789,7 @@
4790
4789
  "immutable": true,
4791
4790
  "locationInModule": {
4792
4791
  "filename": "lib/default-staging-stack.ts",
4793
- "line": 144
4792
+ "line": 153
4794
4793
  },
4795
4794
  "name": "deployRoleArn",
4796
4795
  "optional": true,
@@ -4806,7 +4805,7 @@
4806
4805
  "docs": {
4807
4806
  "stability": "experimental",
4808
4807
  "summary": "Deployment identities are the class of roles to be assumed by the CDK when deploying the App.",
4809
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4808
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4810
4809
  "custom": {
4811
4810
  "exampleMetadata": "infused"
4812
4811
  }
@@ -5408,6 +5407,6 @@
5408
5407
  "symbolId": "lib/default-staging-stack:UsingAppStagingSynthesizer"
5409
5408
  }
5410
5409
  },
5411
- "version": "2.127.0-alpha.0",
5410
+ "version": "2.128.0-alpha.0",
5412
5411
  "fingerprint": "**********"
5413
5412
  }
Binary file
package/README.md CHANGED
@@ -32,9 +32,12 @@ are as follows:
32
32
  To get started, update your CDK App with a new `defaultStackSynthesizer`:
33
33
 
34
34
  ```ts
35
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
36
+
35
37
  const app = new App({
36
38
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
37
39
  appId: 'my-app-id', // put a unique id here
40
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
38
41
  }),
39
42
  });
40
43
  ```
@@ -94,9 +97,12 @@ synthesizer will create a new Staging Stack in each environment the CDK App is d
94
97
  its staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.
95
98
 
96
99
  ```ts
100
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
101
+
97
102
  const app = new App({
98
103
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
99
104
  appId: 'my-app-id',
105
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
100
106
 
101
107
  // The following line is optional. By default it is assumed you have bootstrapped in the same
102
108
  // region(s) as the stack(s) you are deploying.
@@ -117,8 +123,13 @@ source code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role wil
117
123
  used to upload the asset to S3.
118
124
 
119
125
  ```ts
126
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
127
+
120
128
  const app = new App({
121
- defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({ appId: 'my-app-id' }),
129
+ defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
130
+ appId: 'my-app-id',
131
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
132
+ }),
122
133
  });
123
134
 
124
135
  const stack = new Stack(app, 'my-stack');
@@ -138,9 +149,12 @@ You can customize some or all of the roles you'd like to use in the synthesizer
138
149
  if all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):
139
150
 
140
151
  ```ts
152
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
153
+
141
154
  const app = new App({
142
155
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
143
156
  appId: 'my-app-id',
157
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
144
158
  deploymentIdentities: DeploymentIdentities.specifyRoles({
145
159
  cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),
146
160
  deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),
@@ -158,9 +172,12 @@ and `CloudFormationExecutionRole` in the
158
172
  [bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).
159
173
 
160
174
  ```ts
175
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
176
+
161
177
  const app = new App({
162
178
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
163
179
  appId: 'my-app-id',
180
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
164
181
  deploymentIdentities: DeploymentIdentities.cliCredentials(),
165
182
  }),
166
183
  });
@@ -171,9 +188,12 @@ assumable by the deployment role. You can also specify an existing IAM role for
171
188
  `fileAssetPublishingRole` or `imageAssetPublishingRole`:
172
189
 
173
190
  ```ts
191
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
192
+
174
193
  const app = new App({
175
194
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
176
195
  appId: 'my-app-id',
196
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
177
197
  fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),
178
198
  imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),
179
199
  }),
@@ -223,9 +243,12 @@ to a previous version of an application just by doing a CloudFormation deploymen
223
243
  template, without rebuilding and republishing assets.
224
244
 
225
245
  ```ts
246
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
247
+
226
248
  const app = new App({
227
249
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
228
250
  appId: 'my-app-id',
251
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
229
252
  deployTimeFileAssetLifetime: Duration.days(100),
230
253
  }),
231
254
  });
@@ -241,9 +264,12 @@ purged.
241
264
  To change the number of revisions stored, use `imageAssetVersionCount`:
242
265
 
243
266
  ```ts
267
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
268
+
244
269
  const app = new App({
245
270
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
246
271
  appId: 'my-app-id',
272
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
247
273
  imageAssetVersionCount: 10,
248
274
  }),
249
275
  });
@@ -257,9 +283,12 @@ or `emptyOnDelete` turned on. This creates custom resources under the hood to fa
257
283
  cleanup. To turn this off, specify `autoDeleteStagingAssets: false`.
258
284
 
259
285
  ```ts
286
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
287
+
260
288
  const app = new App({
261
289
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
262
290
  appId: 'my-app-id',
291
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
263
292
  autoDeleteStagingAssets: false,
264
293
  }),
265
294
  });
@@ -267,19 +296,20 @@ const app = new App({
267
296
 
268
297
  ### Staging Bucket Encryption
269
298
 
270
- By default, the staging resources will be stored in an S3 Bucket with KMS encryption. To use
271
- SSE-S3, set `stagingBucketEncryption` to `BucketEncryption.S3_MANAGED`.
299
+ You must explicitly specify the encryption type for the staging bucket via the `stagingBucketEncryption` property. In
300
+ future versions of this package, the default will be `BucketEncryption.S3_MANAGED`.
272
301
 
273
- ```ts
274
- import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
302
+ In previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost
303
+ $1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module
304
+ we intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3
305
+ managed encryption for existing buckets is not straightforward. Therefore, for now, this property is required.
275
306
 
276
- const app = new App({
277
- defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
278
- appId: 'my-app-id',
279
- stagingBucketEncryption: BucketEncryption.S3_MANAGED,
280
- }),
281
- });
282
- ```
307
+ If you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to
308
+ `BucketEncryption.KMS`. If you are creating a new staging bucket, you can set this property to
309
+ `BucketEncryption.S3_MANAGED` to avoid the cost of a KMS key.
310
+
311
+ You can learn more about choosing a bucket encryption type in the
312
+ [S3 documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).
283
313
 
284
314
  ## Using a Custom Staging Stack per Environment
285
315
 
@@ -171,7 +171,7 @@ class AppStagingSynthesizer extends core_1.StackSynthesizer {
171
171
  }
172
172
  exports.AppStagingSynthesizer = AppStagingSynthesizer;
173
173
  _a = JSII_RTTI_SYMBOL_1;
174
- AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.127.0-alpha.0" };
174
+ AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.128.0-alpha.0" };
175
175
  /**
176
176
  * Default ARN qualifier
177
177
  */
@@ -54,7 +54,7 @@ class BootstrapRole {
54
54
  }
55
55
  exports.BootstrapRole = BootstrapRole;
56
56
  _a = JSII_RTTI_SYMBOL_1;
57
- BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.127.0-alpha.0" };
57
+ BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.128.0-alpha.0" };
58
58
  BootstrapRole.CLI_CREDS = 'cli-credentials';
59
59
  /**
60
60
  * Deployment identities are the class of roles to be assumed by the CDK
@@ -122,5 +122,5 @@ class DeploymentIdentities {
122
122
  }
123
123
  exports.DeploymentIdentities = DeploymentIdentities;
124
124
  _b = JSII_RTTI_SYMBOL_1;
125
- DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.127.0-alpha.0" };
125
+ DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.128.0-alpha.0" };
126
126
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLXJvbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRFQUF3STtBQUN4SSx1RUFBa0U7QUFFbEU7OztHQUdHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbkQ7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBVztRQUNuQyxvQ0FBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQy9CO0lBSUQsWUFBcUMsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7S0FBSTtJQUV4RDs7T0FFRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQztLQUNqRDtJQUVEOztPQUVHO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnREFBNkIsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDMUY7SUFFRDs7T0FFRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0RBQTZCLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzFGO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsSUFBdUI7UUFDeEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ3pEOztBQTlDSCxzQ0ErQ0M7OztBQS9CZ0IsdUJBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQWlDL0M7OztHQUdHO0FBQ0gsTUFBYSxvQkFBb0I7SUFDL0I7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYztRQUMxQixPQUFPLElBQUksb0JBQW9CLENBQUM7WUFDOUIsMkJBQTJCLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtZQUMzRCxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtZQUM5QyxVQUFVLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtTQUMzQyxDQUFDLENBQUM7S0FDSjtJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBcUI7Ozs7Ozs7Ozs7UUFDOUMsT0FBTyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMscUJBQXFCLENBQUMsVUFBd0MsRUFBRTs7Ozs7Ozs7OztRQUM1RSxTQUFTLG1CQUFtQixDQUFDLENBQVM7WUFDcEMsSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQztZQUM5QixjQUFjLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQywrQ0FBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzdHLDJCQUEyQixFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsK0NBQXFCLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNsSSxVQUFVLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQywrQ0FBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzFHLENBQUMsQ0FBQztLQUNKO0lBa0JEO0lBQ0UsbURBQW1EO0lBQ25ELEtBQXFCO1FBRXJCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUMsMkJBQTJCLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztLQUNwQzs7QUE3REgsb0RBOERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIsIHRyYW5zbGF0ZUFzc2V0VG9rZW5Ub0NmblRva2VuLCB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIH0gZnJvbSAnLi9hcHAtc3RhZ2luZy1zeW50aGVzaXplcic7XG5cbi8qKlxuICogQm9vdHN0cmFwcGVkIHJvbGUgc3BlY2lmaWVyLiBUaGVzZSByb2xlcyBtdXN0IGV4aXN0IGFscmVhZHkuXG4gKiBUaGlzIGNsYXNzIGRvZXMgbm90IGNyZWF0ZSBuZXcgSUFNIFJvbGVzLlxuICovXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwUm9sZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGN1cnJlbnRseSBhc3N1bWVkIHJvbGUvY3JlZGVudGlhbHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xpQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIG5ldyBCb290c3RyYXBSb2xlKEJvb3RzdHJhcFJvbGUuQ0xJX0NSRURTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGFuIGV4aXN0aW5nIElBTSBSb2xlIHRvIGFzc3VtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm9sZUFybihhcm46IHN0cmluZykge1xuICAgIFN0cmluZ1NwZWNpYWxpemVyLnZhbGlkYXRlTm9Ub2tlbnMoYXJuLCAnQm9vdHN0cmFwUm9sZSBBUk4nKTtcbiAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJvbGUoYXJuKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIENMSV9DUkVEUyA9ICdjbGktY3JlZGVudGlhbHMnO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb2xlQXJuOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgb2JqZWN0IHdhcyBjcmVhdGVkIHVzaW5nIEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKVxuICAgKi9cbiAgcHVibGljIGlzQ2xpQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9sZUFybiA9PT0gQm9vdHN0cmFwUm9sZS5DTElfQ1JFRFM7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FybkZvckNsb3VkRm9ybWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmlzQ2xpQ3JlZGVudGlhbHMoKSA/IHVuZGVmaW5lZCA6IHRyYW5zbGF0ZUFzc2V0VG9rZW5Ub0NmblRva2VuKHRoaXMucm9sZUFybik7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FybkZvckNsb3VkQXNzZW1ibHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGlDcmVkZW50aWFscygpID8gdW5kZWZpbmVkIDogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4odGhpcy5yb2xlQXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc3BlY2lhbGl6ZShzcGVjOiBTdHJpbmdTcGVjaWFsaXplcikge1xuICAgIHJldHVybiBuZXcgQm9vdHN0cmFwUm9sZShzcGVjLnNwZWNpYWxpemUodGhpcy5yb2xlQXJuKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXBsb3ltZW50IGlkZW50aXRpZXMgYXJlIHRoZSBjbGFzcyBvZiByb2xlcyB0byBiZSBhc3N1bWVkIGJ5IHRoZSBDREtcbiAqIHdoZW4gZGVwbG95aW5nIHRoZSBBcHAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gIC8qKlxuICAgKiBVc2UgQ0xJIGNyZWRlbnRpYWxzIGZvciBhbGwgZGVwbG95bWVudCBpZGVudGl0aWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGlDcmVkZW50aWFscygpOiBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyh7XG4gICAgICBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICAgIGRlcGxveW1lbnRSb2xlOiBCb290c3RyYXBSb2xlLmNsaUNyZWRlbnRpYWxzKCksXG4gICAgICBsb29rdXBSb2xlOiBCb290c3RyYXBSb2xlLmNsaUNyZWRlbnRpYWxzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSB5b3VyIG93biByb2xlcyBmb3IgYWxsIGRlcGxveW1lbnQgaWRlbnRpdGllcy4gVGhlc2Ugcm9sZXNcbiAgICogbXVzdCBhbHJlYWR5IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVjaWZ5Um9sZXMocm9sZXM6IEJvb3RzdHJhcFJvbGVzKTogRGVwbG95bWVudElkZW50aXRpZXMge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudElkZW50aXRpZXMocm9sZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgUm9sZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgZGVmYXVsdCBib290c3RyYXAgc3RhY2tcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdEJvb3RzdHJhcFJvbGVzKG9wdGlvbnM6IERlZmF1bHRCb290c3RyYXBSb2xlc09wdGlvbnMgPSB7fSk6IERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgICBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzKHg6IHN0cmluZykge1xuICAgICAgaWYgKG9wdGlvbnMuYm9vdHN0cmFwUmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeCA9IHgucmVwbGFjZSgvXFwkXFx7QVdTOjpSZWdpb25cXH0vZywgb3B0aW9ucy5ib290c3RyYXBSZWdpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyh7XG4gICAgICBkZXBsb3ltZW50Um9sZTogQm9vdHN0cmFwUm9sZS5mcm9tUm9sZUFybihyZXBsYWNlUGxhY2Vob2xkZXJzKEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX0RFUExPWV9ST0xFX0FSTikpLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBCb290c3RyYXBSb2xlLmZyb21Sb2xlQXJuKHJlcGxhY2VQbGFjZWhvbGRlcnMoQXBwU3RhZ2luZ1N5bnRoZXNpemVyLkRFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4pKSxcbiAgICAgIGxvb2t1cFJvbGU6IEJvb3RzdHJhcFJvbGUuZnJvbVJvbGVBcm4ocmVwbGFjZVBsYWNlaG9sZGVycyhBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9MT09LVVBfUk9MRV9BUk4pKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiBFeGVjdXRpb24gUm9sZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgQWN0aW9uIFJvbGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50Um9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBSb2xlXG4gICAgQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKiByb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LiAqL1xuICAgIHJvbGVzOiBCb290c3RyYXBSb2xlcyxcbiAgKSB7XG4gICAgdGhpcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGUgPSByb2xlcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU7XG4gICAgdGhpcy5kZXBsb3ltZW50Um9sZSA9IHJvbGVzLmRlcGxveW1lbnRSb2xlO1xuICAgIHRoaXMubG9va3VwUm9sZSA9IHJvbGVzLmxvb2t1cFJvbGU7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgRGVwbG95bWVudElkZW50aXRpZXMuZGVmYXVsdEJvb3RzdHJhcHBlZFJvbGVzYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRCb290c3RyYXBSb2xlc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiB3aGVyZSB0aGUgZGVmYXVsdCBib290c3RyYXAgcm9sZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIHJlZ2lvbiBpbiB3aGljaCB0aGUgc3RhY2sgaXMgZGVwbG95ZWQgaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgc3RhY2sncyBjdXJyZW50IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwUmVnaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJvbGVzIHRoYXQgYXJlIGJvb3RzdHJhcHBlZCB0byB5b3VyIGFjY291bnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUm9sZXMge1xuICAvKipcbiAgICogQ2xvdWRGb3JtYXRpb24gRXhlY3V0aW9uIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgQWN0aW9uIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vc3RyYXBwZWQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgUm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSBib290c3RyYXBwZWQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZT86IEJvb3RzdHJhcFJvbGU7XG59XG5cbi8qKlxuICogUm9sZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIFN0YWdpbmcgU3RhY2tcbiAqIChmb3IgYWNjZXNzIHRvIFN0YWdpbmcgUmVzb3VyY2VzKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdpbmdSb2xlcyB7XG4gIC8qKlxuICAgKiBGaWxlIEFzc2V0IFB1Ymxpc2hpbmcgUm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0YWdpbmcgc3RhY2sgY3JlYXRlcyBhIGZpbGUgYXNzZXQgcHVibGlzaGluZyByb2xlXG4gICAqL1xuICByZWFkb25seSBmaWxlQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERvY2tlciBBc3NldCBQdWJsaXNoaW5nIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdGFnaW5nIHN0YWNrIGNyZWF0ZXMgYSBkb2NrZXIgYXNzZXQgcHVibGlzaGluZyByb2xlXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJBc3NldFB1Ymxpc2hpbmdSb2xlPzogQm9vdHN0cmFwUm9sZTtcbn1cbiJdfQ==
@@ -39,9 +39,18 @@ export interface DefaultStagingStackOptions {
39
39
  /**
40
40
  * Encryption type for staging bucket
41
41
  *
42
- * @default - s3.BucketEncryption.KMS
42
+ * In future versions of this package, the default will be BucketEncryption.S3_MANAGED.
43
+ *
44
+ * In previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost
45
+ * $1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module
46
+ * we intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3
47
+ * managed encryption for existing buckets is not straightforward. Therefore, for now, this property is required.
48
+ *
49
+ * If you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to
50
+ * BucketEncryption.KMS. If you are creating a new staging bucket, you can set this property to
51
+ * BucketEncryption.S3_MANAGED to avoid the cost of a KMS key.
43
52
  */
44
- readonly stagingBucketEncryption?: s3.BucketEncryption;
53
+ readonly stagingBucketEncryption: s3.BucketEncryption;
45
54
  /**
46
55
  * Pass in an existing role to be used as the file publishing role.
47
56
  *
@@ -121,7 +130,8 @@ export interface DefaultStagingStackProps extends DefaultStagingStackOptions, St
121
130
  * A default Staging Stack that implements IStagingResources.
122
131
  *
123
132
  * @example
124
- * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
133
+ * import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
134
+ * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });
125
135
  */
126
136
  export declare class DefaultStagingStack extends Stack implements IStagingResources {
127
137
  private readonly props;
@@ -151,7 +161,7 @@ export declare class DefaultStagingStack extends Stack implements IStagingResour
151
161
  readonly dependencyStack: Stack;
152
162
  private readonly appId;
153
163
  private readonly stagingBucketName?;
154
- private stagingBucketEncryption?;
164
+ private stagingBucketEncryption;
155
165
  /**
156
166
  * File publish role ARN in asset manifest format
157
167
  */
@@ -30,12 +30,13 @@ class UsingAppStagingSynthesizer extends constructs_1.Construct {
30
30
  }
31
31
  exports.UsingAppStagingSynthesizer = UsingAppStagingSynthesizer;
32
32
  _a = JSII_RTTI_SYMBOL_1;
33
- UsingAppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.UsingAppStagingSynthesizer", version: "2.127.0-alpha.0" };
33
+ UsingAppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.UsingAppStagingSynthesizer", version: "2.128.0-alpha.0" };
34
34
  /**
35
35
  * A default Staging Stack that implements IStagingResources.
36
36
  *
37
37
  * @example
38
- * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
38
+ * import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
39
+ * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });
39
40
  */
40
41
  class DefaultStagingStack extends core_1.Stack {
41
42
  /**
@@ -122,6 +123,8 @@ class DefaultStagingStack extends core_1.Stack {
122
123
  this.dependencyStack = this;
123
124
  this.deployRoleArn = props.deployRoleArn;
124
125
  this.stagingBucketName = props.stagingBucketName;
126
+ // FIXME: when stabilizing this module, we should make `stagingBucketEncryption` optional, defaulting to S3_MANAGED.
127
+ // See https://github.com/aws/aws-cdk/pull/28978#issuecomment-1930007176 for details on this decision.
125
128
  this.stagingBucketEncryption = props.stagingBucketEncryption;
126
129
  const specializer = new helpers_internal_1.StringSpecializer(this, props.qualifier);
127
130
  this.providedFileRole = props.fileAssetPublishingRole?._specialize(specializer);
@@ -211,11 +214,7 @@ class DefaultStagingStack extends core_1.Stack {
211
214
  }
212
215
  this.ensureFileRole();
213
216
  let key = undefined;
214
- if (this.stagingBucketEncryption === s3.BucketEncryption.KMS || this.stagingBucketEncryption === undefined) {
215
- if (this.stagingBucketEncryption === undefined) {
216
- // default is KMS as an AWS best practice, and for backwards compatibility
217
- this.stagingBucketEncryption = s3.BucketEncryption.KMS;
218
- }
217
+ if (this.stagingBucketEncryption === s3.BucketEncryption.KMS) {
219
218
  key = this.createBucketKey();
220
219
  }
221
220
  // Create the bucket once the dependencies have been created
@@ -329,5 +328,5 @@ class DefaultStagingStack extends core_1.Stack {
329
328
  }
330
329
  exports.DefaultStagingStack = DefaultStagingStack;
331
330
  _b = JSII_RTTI_SYMBOL_1;
332
- DefaultStagingStack[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.127.0-alpha.0" };
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQVkwQjtBQUMxQiw0RUFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLDJDQUF1QztBQUkxQixRQUFBLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxzQkFBUztJQUN2RCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCOztBQUhILGdFQUlDOzs7QUFrSEQ7Ozs7O0dBS0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLFlBQUs7SUFDNUM7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQW1DOzs7Ozs7Ozs7O1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekYsT0FBTztZQUNMLHNCQUFzQixDQUFDLEtBQUssRUFBRSxPQUFPO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxVQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsVUFBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLFNBQVMseUJBQXlCLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFFRCw0RUFBNEU7Z0JBQzVF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O1FBQ25DLG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFMUMsT0FBTztZQUNMLFVBQVU7WUFDVixhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsMEJBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRU0sY0FBYyxDQUFDLEtBQTZCO1FBQ2pELG9DQUFvQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLE9BQU87WUFDTCxRQUFRO1lBQ1IsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDeEMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRUQ7OztPQUdHO0lBQ0ksbUJBQW1CLENBQUMsT0FBMEIsRUFBRSxhQUFrQztRQUN2RixLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7S0FDRjs7QUF4Vkgsa0RBeVZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQge1xuICBBcHAsXG4gIEFybkZvcm1hdCxcbiAgQm9vdHN0cmFwbGVzc1N5bnRoZXNpemVyLFxuICBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICBEdXJhdGlvbixcbiAgRmlsZUFzc2V0U291cmNlLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU3RhY2ssXG4gIFN0YWNrUHJvcHMsXG4gIElOTElORV9DVVNUT01fUkVTT1VSQ0VfQ09OVEVYVCxcbn0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnYXdzLWNkay1saWIvY3gtYXBpJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQm9vdHN0cmFwUm9sZSB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IEZpbGVTdGFnaW5nTG9jYXRpb24sIElTdGFnaW5nUmVzb3VyY2VzLCBJU3RhZ2luZ1Jlc291cmNlc0ZhY3RvcnksIEltYWdlU3RhZ2luZ0xvY2F0aW9uIH0gZnJvbSAnLi9zdGFnaW5nLXN0YWNrJztcblxuZXhwb3J0IGNvbnN0IERFUExPWV9USU1FX1BSRUZJWCA9ICdkZXBsb3ktdGltZS8nO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBkdW1teSBjb25zdHJ1Y3QgbWVhbnQgdG8gc2lnbmlmeSB0aGF0IGEgc3RhY2sgaXMgdXRpbGl6aW5nXG4gKiB0aGUgQXBwU3RhZ2luZ1N5bnRoZXNpemVyLiBJdCBkb2VzIG5vdCBkbyBhbnl0aGluZywgYW5kIGlzIG5vdCBtZWFudFxuICogdG8gYmUgY3JlYXRlZCBvbiBpdHMgb3duLiBUaGlzIGNvbnN0cnVjdCB3aWxsIGJlIGEgcGFydCBvZiB0aGVcbiAqIGNvbnN0cnVjdCB0cmVlIG9ubHkgYW5kIG5vdCB0aGUgQ2ZuIHRlbXBsYXRlLiBUaGUgY29uc3RydWN0IHRyZWUgaXNcbiAqIHRoZW4gZW5jb2RlZCBpbiB0aGUgQVdTOjpDREs6Ok1ldGFkYXRhIHJlc291cmNlIG9mIHRoZSBzdGFjayBhbmRcbiAqIGluamVzdGVkIGluIG91ciBtZXRyaWNzIGxpa2UgZXZlcnkgb3RoZXIgY29uc3RydWN0LlxuICovXG5leHBvcnQgY2xhc3MgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXIgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlIHN0YWdpbmcgc3RhY2sgYmVsb25ncyB0by5cbiAgICpcbiAgICogVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmFtZSBvZiBzdGFnaW5nIHJlc291cmNlc1xuICAgKiBjcmVhdGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgQ0RLIGFwcHMuXG4gICAqXG4gICAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBpbmNsdWRlIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCBkYXNoZXMgKCctJykgb25seVxuICAgKiBhbmQgaGF2ZSBhIG1heGltdW0gb2YgMjAgY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IG5hbWUgZm9yIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgd2VsbC1rbm93biBuYW1lIHVuaXF1ZSB0byB0aGlzIGFwcC9lbnYuXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiB0eXBlIGZvciBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbj86IHMzLkJ1Y2tldEVuY3J5cHRpb247XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBQYXNzIGluIGFuIGV4aXN0aW5nIHJvbGUgdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZXRpbWUgZm9yIGRlcGxveSB0aW1lIGZpbGUgYXNzZXRzLlxuICAgKlxuICAgKiBBc3NldHMgdGhhdCBhcmUgb25seSBuZWNlc3NhcnkgYXQgZGVwbG95bWVudCB0aW1lIChmb3IgaW5zdGFuY2UsXG4gICAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgTGFtYmRhIHNvdXJjZSBjb2RlIGJ1bmRsZXMpIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoaXMgbWFueSBkYXlzLiBBc3NldHMgdGhhdCBtYXkgYmVcbiAgICogcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldCBkdXJpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJ1biB0aW1lXG4gICAqIHdpbGwgbm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIHRoZSBsZW5ndGggb2YgdGltZSB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIHJvbGwgYmFjayB0b1xuICAgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGEgbmV3XG4gICAqIGBjZGsgc3ludGhgIGFuZCByZS11cGxvYWQgb2YgYXNzZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIER1cmF0aW9uLmRheXMoMzApXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHZlcnNpb25zIHRvIHN0b3JlIGluIGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogUHJldmlvdXMgdmVyc2lvbnMgb2YgYW4gaW1hZ2UgY2FuIGJlIHN0b3JlZCBmb3Igcm9sbGJhY2sgcHVycG9zZXMuXG4gICAqIE9uY2UgYSByZXBvc2l0b3J5IGhhcyBtb3JlIHRoYW4gMyBpbWFnZSB2ZXJzaW9ucyBzdG9yZWQsIHRoZSBvbGRlc3RcbiAgICogdmVyc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcyBhbGxvd3MgZm9yIHNlbnNpYmxlIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgKiB3aGlsZSBtYWludGFpbmluZyBhIGZldyBwcmV2aW91cyB2ZXJzaW9ucyBmb3Igcm9sbGJhY2sgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVwIHRvIDMgdmVyc2lvbnMgc3RvcmVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0VmVyc2lvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRvIGRlbGV0ZXMgb2JqZWN0cyBpbiB0aGUgc3RhZ2luZyBTMyBidWNrZXQgYW5kIGltYWdlcyBpbiB0aGVcbiAgICogc3RhZ2luZyBFQ1IgcmVwb3NpdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gcHJlZml4IHRvIGJlIHVzZWQgYXMgdGhlIHN0YWdpbmcgc3RhY2sgbmFtZSBhbmRcbiAgICogY29uc3RydWN0IElELiBUaGUgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBhcHBJZCwgd2hpY2hcbiAgICogaXMgcmVxdWlyZWQgdG8gYmUgcGFydCBvZiB0aGUgc3RhY2sgbmFtZSBhbmQgY29uc3RydWN0IElEIHRvXG4gICAqIGVuc3VyZSB1bmlxdWVuZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnU3RhZ2luZ1N0YWNrJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ1N0YWNrTmFtZVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IFN0YWdpbmcgU3RhY2sgUHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcyBleHRlbmRzIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zLCBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGRlcGxveSBhY3Rpb24gcm9sZSwgaWYgZ2l2ZW5cbiAgICpcbiAgICogVGhpcyByb2xlIHdpbGwgbmVlZCBwZXJtaXNzaW9ucyB0byByZWFkIGZyb20gdG8gdGhlIHN0YWdpbmcgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBDTEkgY3JlZGVudGlhbHMgYXJlIGFzc3VtZWQsIG5vIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVhbGlmaWVyIHVzZWQgdG8gc3BlY2lhbGl6ZSBzdHJpbmdzXG4gICAqXG4gICAqIFNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IHdobyBrbm93cyB3aGF0IHBlb3BsZSBtaWdodCBkby5cbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBTdGFnaW5nIFN0YWNrIHRoYXQgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGVmYXVsdFN0YWdpbmdTdGFjayA9IERlZmF1bHRTdGFnaW5nU3RhY2suZmFjdG9yeSh7IGFwcElkOiAnbXktYXBwLWlkJyB9KTtcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRTdGFnaW5nU3RhY2sgZXh0ZW5kcyBTdGFjayBpbXBsZW1lbnRzIElTdGFnaW5nUmVzb3VyY2VzIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIGZhY3RvcnkgdGhhdCB3aWxsIGNyZWF0ZSBEZWZhdWx0U3RhZ2luZ1N0YWNrc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmYWN0b3J5KG9wdGlvbnM6IERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zKTogSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5IHtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQudG9Mb2NhbGVMb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykuc2xpY2UoMCwgMjApO1xuICAgIHJldHVybiB7XG4gICAgICBvYnRhaW5TdGFnaW5nUmVzb3VyY2VzKHN0YWNrLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IEFwcC5vZihzdGFjayk7XG4gICAgICAgIGlmICghQXBwLmlzQXBwKGFwcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWNrICR7c3RhY2suc3RhY2tOYW1lfSBtdXN0IGJlIHBhcnQgb2YgYW4gQXBwYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZWNhdXNlIHdlIGRvIG5vdCBrZWVwIG1ldHJpY3MgaW4gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2ssIHdlIHdpbGwgaW5qZWN0XG4gICAgICAgIC8vIGEgZHVtbXkgY29uc3RydWN0IGludG8gdGhlIHN0YWNrIHVzaW5nIHRoZSBEZWZhdWx0U3RhZ2luZ1N0YWNrIGluc3RlYWQuXG4gICAgICAgIGlmIChjeGFwaS5BTkFMWVRJQ1NfUkVQT1JUSU5HX0VOQUJMRURfQ09OVEVYVCkge1xuICAgICAgICAgIG5ldyBVc2luZ0FwcFN0YWdpbmdTeW50aGVzaXplcihzdGFjaywgYFVzaW5nQXBwU3RhZ2luZ1N5bnRoZXNpemVyLyR7c3RhY2suc3RhY2tOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhY2tQcmVmaXggPSBvcHRpb25zLnN0YWdpbmdTdGFja05hbWVQcmVmaXggPz8gJ1N0YWdpbmdTdGFjayc7XG4gICAgICAgIC8vIFN0YWNrIG5hbWUgZG9lcyBub3QgbmVlZCB0byBjb250YWluIGVudmlyb25tZW50IGJlY2F1c2UgYXBwSWQgaXMgdW5pcXVlIGluc2lkZSBhbiBlbnZcbiAgICAgICAgY29uc3Qgc3RhY2tOYW1lID0gYCR7c3RhY2tQcmVmaXh9LSR7YXBwSWR9YDtcbiAgICAgICAgY29uc3Qgc3RhY2tJZCA9IGAke3N0YWNrTmFtZX0tJHtjb250ZXh0LmVudmlyb25tZW50U3RyaW5nfWA7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFN0YWdpbmdTdGFjayhhcHAsIHN0YWNrSWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHN0YWNrTmFtZSxcbiAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmFjY291bnQsXG4gICAgICAgICAgICByZWdpb246IHN0YWNrLnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwcElkLFxuICAgICAgICAgIHF1YWxpZmllcjogY29udGV4dC5xdWFsaWZpZXIsXG4gICAgICAgICAgZGVwbG95Um9sZUFybjogY29udGV4dC5kZXBsb3lSb2xlQXJuLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGFzc2V0IHB1Ymxpc2hpbmcgcm9sZSBuYW1lIGZvciBmaWxlIChTMykgYXNzZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZmlsZVJvbGVOYW1lKCkge1xuICAgIHJldHVybiBgY2RrLSR7dGhpcy5hcHBJZH0tZmlsZS1yb2xlLSR7dGhpcy5yZWdpb259YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGFzc2V0IHB1Ymxpc2hpbmcgcm9sZSBuYW1lIGZvciBkb2NrZXIgKEVDUikgYXNzZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaW1hZ2VSb2xlTmFtZSgpIHtcbiAgICByZXR1cm4gYGNkay0ke3RoaXMuYXBwSWR9LWltYWdlLXJvbGUtJHt0aGlzLnJlZ2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhcHAtc2NvcGVkLCBldmlyb25tZW50LWtleWVkIHN0YWdpbmcgYnVja2V0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdpbmdCdWNrZXQ/OiBzMy5CdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhcHAtc2NvcGVkLCBlbnZpcm9ubWVudC1rZXllZCBlY3IgcmVwb3NpdG9yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFwcC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGFnaW5nUmVwb3M6IFJlY29yZDxzdHJpbmcsIGVjci5SZXBvc2l0b3J5PjtcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRvIGFkZCBkZXBlbmRlbmNpZXMgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jeVN0YWNrOiBTdGFjaztcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb24/OiBzMy5CdWNrZXRFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBGaWxlIHB1Ymxpc2ggcm9sZSBBUk4gaW4gYXNzZXQgbWFuaWZlc3QgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVkRmlsZVJvbGU/OiBCb290c3RyYXBSb2xlO1xuICBwcml2YXRlIGZpbGVSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGZpbGVSb2xlTWFuaWZlc3RBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1Ymxpc2hpbmcgcm9sZSBBUk4gaW4gYXNzZXQgbWFuaWZlc3QgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVkSW1hZ2VSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBpbWFnZVJvbGU/OiBpYW0uSVJvbGU7XG4gIHByaXZhdGUgZGlkSW1hZ2VSb2xlID0gZmFsc2U7XG4gIHByaXZhdGUgaW1hZ2VSb2xlTWFuaWZlc3RBcm4/OiBzdHJpbmc7XG4gIHByaXZhdGUgYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBBcHAsIGlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBzeW50aGVzaXplcjogbmV3IEJvb3RzdHJhcGxlc3NTeW50aGVzaXplcigpLFxuICAgICAgZGVzY3JpcHRpb246IGBUaGlzIHN0YWNrIGluY2x1ZGVzIHJlc291cmNlcyBuZWVkZWQgdG8gZGVwbG95IHRoZSBBV1MgQ0RLIGFwcCAke3Byb3BzLmFwcElkfSBpbnRvIHRoaXMgZW52aXJvbm1lbnRgLFxuICAgICAgYW5hbHl0aWNzUmVwb3J0aW5nOiBmYWxzZSwgLy8gcmVtb3ZpbmcgQVdTOjpDREs6Ok1ldGFkYXRhIGNvbnN0cnVjdCBzYXZlcyB+M0tCXG4gICAgfSk7XG4gICAgLy8gcmVtb3ZpbmcgcGF0aCBtZXRhZGF0YSBzYXZlcyB+MktCXG4gICAgdGhpcy5ub2RlLnNldENvbnRleHQoY3hhcGkuUEFUSF9NRVRBREFUQV9FTkFCTEVfQ09OVEVYVCwgZmFsc2UpO1xuXG4gICAgLy8gRm9yIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIGRlZmF1bHQgc3RhZ2luZyBzdGFjaywgd2Ugd2FudCB0byBpbmxpbmUgY3VzdG9tXG4gICAgLy8gcmVzb3VyY2VzIGJlY2F1c2UgdGhlIHN0YWdpbmcgYnVja2V0IG5lY2Vzc2FyeSBmb3IgY3VzdG9tIHJlc291cmNlIGFzc2V0c1xuICAgIC8vIGRvZXMgbm90IGV4aXN0IHlldC5cbiAgICB0aGlzLm5vZGUuc2V0Q29udGV4dChJTkxJTkVfQ1VTVE9NX1JFU09VUkNFX0NPTlRFWFQsIHRydWUpO1xuICAgIHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPSBwcm9wcy5hdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cyA/PyB0cnVlO1xuXG4gICAgdGhpcy5hcHBJZCA9IHRoaXMudmFsaWRhdGVBcHBJZChwcm9wcy5hcHBJZCk7XG4gICAgdGhpcy5kZXBlbmRlbmN5U3RhY2sgPSB0aGlzO1xuXG4gICAgdGhpcy5kZXBsb3lSb2xlQXJuID0gcHJvcHMuZGVwbG95Um9sZUFybjtcbiAgICB0aGlzLnN0YWdpbmdCdWNrZXROYW1lID0gcHJvcHMuc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgdGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9IHByb3BzLnN0YWdpbmdCdWNrZXRFbmNyeXB0aW9uO1xuICAgIGNvbnN0IHNwZWNpYWxpemVyID0gbmV3IFN0cmluZ1NwZWNpYWxpemVyKHRoaXMsIHByb3BzLnF1YWxpZmllcik7XG5cbiAgICB0aGlzLnByb3ZpZGVkRmlsZVJvbGUgPSBwcm9wcy5maWxlQXNzZXRQdWJsaXNoaW5nUm9sZT8uX3NwZWNpYWxpemUoc3BlY2lhbGl6ZXIpO1xuICAgIHRoaXMucHJvdmlkZWRJbWFnZVJvbGUgPSBwcm9wcy5pbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/Ll9zcGVjaWFsaXplKHNwZWNpYWxpemVyKTtcbiAgICB0aGlzLnN0YWdpbmdSZXBvcyA9IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFwcElkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBpZiAoaWQubGVuZ3RoID4gMjApIHtcbiAgICAgIGVycm9ycy5wdXNoKGBhcHBJZCBleHBlY3RlZCBubyBtb3JlIHRoYW4gMjAgY2hhcmFjdGVycyBidXQgZ290ICR7aWQubGVuZ3RofSBjaGFyYWN0ZXJzLmApO1xuICAgIH1cbiAgICBpZiAoaWQgIT09IGlkLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBvbmx5IGFjY2VwdHMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGlmICghL15bYS16MC05LV0qJC8udGVzdChpZCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBleHBlY3RzIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcyAoXFwnLVxcJyknKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBhcHBJZCAke2lkfSBoYXMgZXJyb3JzOmAsXG4gICAgICAgIC4uLmVycm9ycyxcbiAgICAgIF0uam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUZpbGVSb2xlKCkge1xuICAgIGlmICh0aGlzLnByb3ZpZGVkRmlsZVJvbGUpIHtcbiAgICAgIC8vIE92ZXJyaWRlXG4gICAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSB0aGlzLnByb3ZpZGVkRmlsZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRGaWxlUm9sZS5fYXJuRm9yQ2xvdWRGb3JtYXRpb24oKTtcbiAgICAgIHRoaXMuZmlsZVJvbGUgPSBjZm5Bcm4gPyBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ2RrRmlsZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5maWxlUm9sZU5hbWU7XG4gICAgdGhpcy5maWxlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ2RrRmlsZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgcGFydGl0aW9uOiAnJHtBV1M6OlBhcnRpdGlvbn0nLFxuICAgICAgcmVnaW9uOiAnJywgLy8gaWFtIGlzIGdsb2JhbFxuICAgICAgc2VydmljZTogJ2lhbScsXG4gICAgICByZXNvdXJjZTogJ3JvbGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiByb2xlTmFtZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUltYWdlUm9sZSgpIHtcbiAgICAvLyBJdCBtYXkgZW5kIHVwIHNldHRpbmcgaW1hZ2VSb2xlIHRvIHVuZGVmaW5lZCwgYnV0IGF0IGxlYXN0IHdlIHRyaWVkXG4gICAgaWYgKHRoaXMuZGlkSW1hZ2VSb2xlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlkSW1hZ2VSb2xlID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlKSB7XG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICB0aGlzLmltYWdlUm9sZSA9IGNmbkFybiA/IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdDZGtJbWFnZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5pbWFnZVJvbGVOYW1lO1xuICAgIHRoaXMuaW1hZ2VSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDZGtJbWFnZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBwYXJ0aXRpb246ICcke0FXUzo6UGFydGl0aW9ufScsXG4gICAgICByZWdpb246ICcnLCAvLyBpYW0gaXMgZ2xvYmFsXG4gICAgICBzZXJ2aWNlOiAnaWFtJyxcbiAgICAgIHJlc291cmNlOiAncm9sZScsXG4gICAgICByZXNvdXJjZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnVja2V0S2V5KCk6IGttcy5JS2V5IHtcbiAgICByZXR1cm4gbmV3IGttcy5LZXkodGhpcywgJ0J1Y2tldEtleScsIHtcbiAgICAgIGFsaWFzOiBgYWxpYXMvY2RrLSR7dGhpcy5hcHBJZH0tc3RhZ2luZ2AsXG4gICAgICBhZG1pbnM6IFtuZXcgaWFtLkFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KV0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENyZWF0ZUJ1Y2tldCgpIHtcbiAgICBjb25zdCBzdGFnaW5nQnVja2V0TmFtZSA9IHRoaXMuc3RhZ2luZ0J1Y2tldE5hbWUgPz8gYGNkay0ke3RoaXMuYXBwSWR9LXN0YWdpbmctJHt0aGlzLmFjY291bnR9LSR7dGhpcy5yZWdpb259YDtcbiAgICBjb25zdCBidWNrZXRJZCA9ICdDZGtTdGFnaW5nQnVja2V0JztcbiAgICBjb25zdCBjcmVhdGVkQnVja2V0ID0gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChidWNrZXRJZCkgYXMgczMuQnVja2V0O1xuICAgIGlmIChjcmVhdGVkQnVja2V0KSB7XG4gICAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVGaWxlUm9sZSgpO1xuXG4gICAgbGV0IGtleSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9PT0gczMuQnVja2V0RW5jcnlwdGlvbi5LTVMgfHwgdGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgaXMgS01TIGFzIGFuIEFXUyBiZXN0IHByYWN0aWNlLCBhbmQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHRoaXMuc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb24gPSBzMy5CdWNrZXRFbmNyeXB0aW9uLktNUztcbiAgICAgIH1cbiAgICAgIGtleSA9IHRoaXMuY3JlYXRlQnVja2V0S2V5KCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBidWNrZXQgb25jZSB0aGUgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBjcmVhdGVkXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCBidWNrZXRJZCwge1xuICAgICAgYnVja2V0TmFtZTogc3RhZ2luZ0J1Y2tldE5hbWUsXG4gICAgICAuLi4odGhpcy5hdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cyA/IHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIH0gOiB7XG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgfSksXG4gICAgICBlbmNyeXB0aW9uOiB0aGlzLnN0YWdpbmdCdWNrZXRFbmNyeXB0aW9uLFxuICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gYnVja2V0cyBhcmVuJ3QgdmVyc2lvbmVkXG4gICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gU1NMIGlzbid0IGVuZm9yY2VkXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZmlsZVJvbGUpIHtcbiAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmZpbGVSb2xlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXBsb3lSb2xlQXJuKSB7XG4gICAgICBidWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6R2V0T2JqZWN0KicsXG4gICAgICAgICAgJ3MzOkdldEJ1Y2tldConLFxuICAgICAgICAgICdzMzpMaXN0KicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW2J1Y2tldC5idWNrZXRBcm4sIGJ1Y2tldC5hcm5Gb3JPYmplY3RzKCcqJyldLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5Bcm5QcmluY2lwYWwodGhpcy5kZXBsb3lSb2xlQXJuKV0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0cyBzaG91bGQgbmV2ZXIgYmUgb3ZlcndyaXR0ZW4sIGJ1dCBsZXQncyBtYWtlIHN1cmUgd2UgaGF2ZSBhIGxpZmVjeWNsZSBwb2xpY3lcbiAgICAvLyBmb3IgaXQgYW55d2F5LlxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIG5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgIH0pO1xuXG4gICAgYnVja2V0LmFkZExpZmVjeWNsZVJ1bGUoe1xuICAgICAgcHJlZml4OiBERVBMT1lfVElNRV9QUkVGSVgsXG4gICAgICBleHBpcmF0aW9uOiB0aGlzLnByb3BzLmRlcGxveVRpbWVGaWxlQXNzZXRMaWZldGltZSA/PyBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGFnaW5nQnVja2V0TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgdGhlIHJlcG9cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUmVwbyhhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IHN0cmluZyB7XG4gICAgaWYgKCFhc3NldC5hc3NldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXRzIHN5bnRoZXNpemVkIHdpdGggQXBwU2NvcGVkU3RhZ2luZ1N5bnRoZXNpemVyIG11c3QgaW5jbHVkZSBhbiBcXCdhc3NldE5hbWVcXCcgaW4gdGhlIGFzc2V0IHNvdXJjZSBkZWZpbml0aW9uLicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbWFnZSBwdWJsaXNoaW5nIHJvbGUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIHRoaXMuZW5zdXJlSW1hZ2VSb2xlKCk7XG5cbiAgICBjb25zdCByZXBvTmFtZSA9IGdlbmVyYXRlUmVwb05hbWUoYCR7dGhpcy5hcHBJZH0vJHthc3NldC5hc3NldE5hbWV9YCk7XG4gICAgaWYgKHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXSA9IG5ldyBlY3IuUmVwb3NpdG9yeSh0aGlzLCByZXBvTmFtZSwge1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwb05hbWUsXG4gICAgICAgIGltYWdlVGFnTXV0YWJpbGl0eTogZWNyLlRhZ011dGFiaWxpdHkuSU1NVVRBQkxFLFxuICAgICAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0dhcmJhZ2UgY29sbGVjdCBvbGQgaW1hZ2UgdmVyc2lvbnMnLFxuICAgICAgICAgIG1heEltYWdlQ291bnQ6IHRoaXMucHJvcHMuaW1hZ2VBc3NldFZlcnNpb25Db3VudCA/PyAzLFxuICAgICAgICB9XSxcbiAgICAgICAgLi4uKHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPyB7XG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgIGVtcHR5T25EZWxldGU6IHRydWUsXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmltYWdlUm9sZSkge1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UHVsbFB1c2godGhpcy5pbWFnZVJvbGUpO1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UmVhZCh0aGlzLmltYWdlUm9sZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXBvTmFtZTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICctJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZEZpbGUoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVTdGFnaW5nTG9jYXRpb24ge1xuICAgIC8vIEhhcyBzaWRlIGVmZmVjdHMgc28gbXVzdCBnbyBmaXJzdFxuICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSB0aGlzLmdldENyZWF0ZUJ1Y2tldCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4sXG4gICAgICBwcmVmaXg6IGFzc2V0LmRlcGxveVRpbWUgPyBERVBMT1lfVElNRV9QUkVGSVggOiB1bmRlZmluZWQsXG4gICAgICBkZXBlbmRlbmN5U3RhY2s6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZShhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IEltYWdlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgICAvLyBIYXMgc2lkZSBlZmZlY3RzIHNvIG11c3QgZ28gZmlyc3RcbiAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuZ2V0Q3JlYXRlUmVwbyhhc3NldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVwb05hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmltYWdlUm9sZU1hbmlmZXN0QXJuLFxuICAgICAgZGVwZW5kZW5jeVN0YWNrOiB0aGlzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgdGhlIGNsb3VkZm9ybWF0aW9uIHRlbXBsYXRlIGludG8gYSBjbG91ZCBhc3NlbWJseS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3N5bnRoZXNpemVUZW1wbGF0ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbiwgbG9va3VwUm9sZUFybj86IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHN1cGVyLl9zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbiwgbG9va3VwUm9sZUFybik7XG5cbiAgICBjb25zdCBidWlsZGVyID0gc2Vzc2lvbi5hc3NlbWJseTtcbiAgICBjb25zdCBvdXRQYXRoID0gcGF0aC5qb2luKGJ1aWxkZXIub3V0ZGlyLCB0aGlzLnRlbXBsYXRlRmlsZSk7XG4gICAgY29uc3Qgc2l6ZSA9IGZzLnN0YXRTeW5jKG91dFBhdGgpLnNpemU7XG4gICAgaWYgKHNpemUgPiA1MTIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFnaW5nIHJlc291cmNlIHRlbXBsYXRlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gNTEyMDAgYnl0ZXMsIGJ1dCBnb3QgJHtzaXplfSBieXRlc2ApO1xuICAgIH1cbiAgfVxufVxuIl19
331
+ DefaultStagingStack[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.128.0-alpha.0" };
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQVkwQjtBQUMxQiw0RUFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLDJDQUF1QztBQUkxQixRQUFBLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxzQkFBUztJQUN2RCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCOztBQUhILGdFQUlDOzs7QUEySEQ7Ozs7OztHQU1HO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxZQUFLO0lBQzVDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFtQzs7Ozs7Ozs7OztRQUN2RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLE9BQU87WUFDTCxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsT0FBTztnQkFDbkMsTUFBTSxHQUFHLEdBQUcsVUFBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFVBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssQ0FBQyxTQUFTLHlCQUF5QixDQUFDLENBQUM7Z0JBQ3JFLENBQUM7Z0JBRUQsNEVBQTRFO2dCQUM1RSwwRUFBMEU7Z0JBQzFFLElBQUksS0FBSyxDQUFDLG1DQUFtQyxFQUFFLENBQUM7b0JBQzlDLElBQUksMEJBQTBCLENBQUMsS0FBSyxFQUFFLDhCQUE4QixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDekYsQ0FBQztnQkFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsc0JBQXNCLElBQUksY0FBYyxDQUFDO2dCQUNyRSx3RkFBd0Y7Z0JBQ3hGLE1BQU0sU0FBUyxHQUFHLEdBQUcsV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxHQUFHLFNBQVMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDNUQsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7b0JBQzNDLEdBQUcsT0FBTztvQkFDVixTQUFTO29CQUNULEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87d0JBQ3RCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtxQkFDckI7b0JBQ0QsS0FBSztvQkFDTCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtpQkFDckMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUM7S0FDSDtJQUVEOztPQUVHO0lBQ0gsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxjQUFjLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNyRDtJQUVEOztPQUVHO0lBQ0gsSUFBWSxhQUFhO1FBQ3ZCLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxlQUFlLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUN0RDtJQXVDRCxZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQW1CLEtBQStCO1FBQ2xGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsV0FBVyxFQUFFLElBQUksK0JBQXdCLEVBQUU7WUFDM0MsV0FBVyxFQUFFLGtFQUFrRSxLQUFLLENBQUMsS0FBSyx3QkFBd0I7WUFDbEgsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLG1EQUFtRDtTQUMvRSxDQUFDLENBQUM7UUFOZ0QsVUFBSyxHQUFMLEtBQUssQ0FBMEI7UUFONUUsaUJBQVksR0FBRyxLQUFLLENBQUM7Ozs7OzsrQ0FuRmxCLG1CQUFtQjs7OztRQWdHNUIsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVoRSw4RUFBOEU7UUFDOUUsNEVBQTRFO1FBQzVFLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQ0FBOEIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQztRQUVyRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBRWpELG9IQUFvSDtRQUNwSCxzR0FBc0c7UUFDdEcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztRQUU3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLG9DQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7S0FDeEI7SUFFTyxhQUFhLENBQUMsRUFBVTtRQUM5QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMscURBQXFELEVBQUUsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDO2dCQUNkLFNBQVMsRUFBRSxjQUFjO2dCQUN6QixHQUFHLE1BQU07YUFDVixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLFdBQVc7WUFDWCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN2RixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUNoRCxRQUFRO1lBQ1IsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFlBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2xELFNBQVMsRUFBRSxtQkFBbUI7WUFDOUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0I7WUFDNUIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsTUFBTTtZQUNoQixZQUFZLEVBQUUsUUFBUTtZQUN0QixTQUFTLEVBQUUsZ0JBQVMsQ0FBQyxtQkFBbUI7U0FDekMsQ0FBQyxDQUFDO0tBQ0o7SUFFTyxlQUFlO1FBQ3JCLHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsV0FBVztZQUNYLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3pGLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ2xELFFBQVE7WUFDUixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNsRCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsWUFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkQsU0FBUyxFQUFFLG1CQUFtQjtZQUM5QixNQUFNLEVBQUUsRUFBRSxFQUFFLGdCQUFnQjtZQUM1QixPQUFPLEVBQUUsS0FBSztZQUNkLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFlBQVksRUFBRSxRQUFRO1lBQ3RCLFNBQVMsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQjtTQUN6QyxDQUFDLENBQUM7S0FDSjtJQUVPLGVBQWU7UUFDckIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNwQyxLQUFLLEVBQUUsYUFBYSxJQUFJLENBQUMsS0FBSyxVQUFVO1lBQ3hDLE1BQU0sRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqRCxDQUFDLENBQUM7S0FDSjtJQUVPLGVBQWU7UUFDckIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9HLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBYyxDQUFDO1FBQ3BFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0QsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsNERBQTREO1FBQzVELE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQzNDLFVBQVUsRUFBRSxpQkFBaUI7WUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLGFBQWEsRUFBRSxvQkFBYSxDQUFDLE9BQU87Z0JBQ3BDLGlCQUFpQixFQUFFLElBQUk7YUFDeEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0YsYUFBYSxFQUFFLG9CQUFhLENBQUMsTUFBTTthQUNwQyxDQUFDO1lBQ0YsVUFBVSxFQUFFLElBQUksQ0FBQyx1QkFBdUI7WUFDeEMsYUFBYSxFQUFFLEdBQUc7WUFFbEIsK0VBQStFO1lBQy9FLFNBQVMsRUFBRSxJQUFJO1lBQ2YseUVBQXlFO1lBQ3pFLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUNqRCxPQUFPLEVBQUU7b0JBQ1AsZUFBZTtvQkFDZixlQUFlO29CQUNmLFVBQVU7aUJBQ1g7Z0JBQ0QsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4RCxVQUFVLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELHNGQUFzRjtRQUN0RixpQkFBaUI7UUFDakIsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RCLDJCQUEyQixFQUFFLGVBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2hELENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0QixNQUFNLEVBQUUsMEJBQWtCO1lBQzFCLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixJQUFJLGVBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ3hFLENBQUMsQ0FBQztRQUVILE9BQU8saUJBQWlCLENBQUM7S0FDMUI7SUFFRDs7T0FFRztJQUNLLGFBQWEsQ0FBQyxLQUE2QjtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUhBQW1ILENBQUMsQ0FBQztRQUN2SSxDQUFDO1FBRUQsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDdEUsY0FBYyxFQUFFLFFBQVE7Z0JBQ3hCLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUztnQkFDL0MsY0FBYyxFQUFFLENBQUM7d0JBQ2YsV0FBVyxFQUFFLG9DQUFvQzt3QkFDakQsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQztxQkFDdEQsQ0FBQztnQkFDRixHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztvQkFDakMsYUFBYSxFQUFFLG9CQUFhLENBQUMsT0FBTztvQkFDcEMsYUFBYSxFQUFFLElBQUk7aUJBQ3BCLENBQUMsQ0FBQyxDQUFDO29CQUNGLGFBQWEsRUFBRSxvQkFBYSxDQUFDLE1BQU07aUJBQ3BDLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO1FBRWhCLFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtZQUNwQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQztLQUNGO0lBRU0sT0FBTyxDQUFDLEtBQXNCO1FBQ25DLG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFMUMsT0FBTztZQUNMLFVBQVU7WUFDVixhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsMEJBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRU0sY0FBYyxDQUFDLEtBQTZCO1FBQ2pELG9DQUFvQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLE9BQU87WUFDTCxRQUFRO1lBQ1IsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDeEMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRUQ7OztPQUdHO0lBQ0ksbUJBQW1CLENBQUMsT0FBMEIsRUFBRSxhQUFrQztRQUN2RixLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7S0FDRjs7QUF4Vkgsa0RBeVZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQge1xuICBBcHAsXG4gIEFybkZvcm1hdCxcbiAgQm9vdHN0cmFwbGVzc1N5bnRoZXNpemVyLFxuICBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICBEdXJhdGlvbixcbiAgRmlsZUFzc2V0U291cmNlLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU3RhY2ssXG4gIFN0YWNrUHJvcHMsXG4gIElOTElORV9DVVNUT01fUkVTT1VSQ0VfQ09OVEVYVCxcbn0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnYXdzLWNkay1saWIvY3gtYXBpJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQm9vdHN0cmFwUm9sZSB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IEZpbGVTdGFnaW5nTG9jYXRpb24sIElTdGFnaW5nUmVzb3VyY2VzLCBJU3RhZ2luZ1Jlc291cmNlc0ZhY3RvcnksIEltYWdlU3RhZ2luZ0xvY2F0aW9uIH0gZnJvbSAnLi9zdGFnaW5nLXN0YWNrJztcblxuZXhwb3J0IGNvbnN0IERFUExPWV9USU1FX1BSRUZJWCA9ICdkZXBsb3ktdGltZS8nO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBkdW1teSBjb25zdHJ1Y3QgbWVhbnQgdG8gc2lnbmlmeSB0aGF0IGEgc3RhY2sgaXMgdXRpbGl6aW5nXG4gKiB0aGUgQXBwU3RhZ2luZ1N5bnRoZXNpemVyLiBJdCBkb2VzIG5vdCBkbyBhbnl0aGluZywgYW5kIGlzIG5vdCBtZWFudFxuICogdG8gYmUgY3JlYXRlZCBvbiBpdHMgb3duLiBUaGlzIGNvbnN0cnVjdCB3aWxsIGJlIGEgcGFydCBvZiB0aGVcbiAqIGNvbnN0cnVjdCB0cmVlIG9ubHkgYW5kIG5vdCB0aGUgQ2ZuIHRlbXBsYXRlLiBUaGUgY29uc3RydWN0IHRyZWUgaXNcbiAqIHRoZW4gZW5jb2RlZCBpbiB0aGUgQVdTOjpDREs6Ok1ldGFkYXRhIHJlc291cmNlIG9mIHRoZSBzdGFjayBhbmRcbiAqIGluamVzdGVkIGluIG91ciBtZXRyaWNzIGxpa2UgZXZlcnkgb3RoZXIgY29uc3RydWN0LlxuICovXG5leHBvcnQgY2xhc3MgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXIgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlIHN0YWdpbmcgc3RhY2sgYmVsb25ncyB0by5cbiAgICpcbiAgICogVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmFtZSBvZiBzdGFnaW5nIHJlc291cmNlc1xuICAgKiBjcmVhdGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgQ0RLIGFwcHMuXG4gICAqXG4gICAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBpbmNsdWRlIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCBkYXNoZXMgKCctJykgb25seVxuICAgKiBhbmQgaGF2ZSBhIG1heGltdW0gb2YgMjAgY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IG5hbWUgZm9yIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgd2VsbC1rbm93biBuYW1lIHVuaXF1ZSB0byB0aGlzIGFwcC9lbnYuXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiB0eXBlIGZvciBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBJbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBwYWNrYWdlLCB0aGUgZGVmYXVsdCB3aWxsIGJlIEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRC5cbiAgICpcbiAgICogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBwYWNrYWdlLCB0aGUgZGVmYXVsdCB3YXMgdG8gdXNlIEtNUyBlbmNyeXB0aW9uIGZvciB0aGUgc3RhZ2luZyBidWNrZXQuIEtNUyBrZXlzIGNvc3RcbiAgICogJDEvbW9udGgsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGNvc3RzIGZvciB1c2VycyB3aG8gYXJlIG5vdCBhd2FyZSBvZiB0aGlzLiBBcyB3ZSBzdGFiaWxpemUgdGhpcyBtb2R1bGVcbiAgICogd2UgaW50ZW5kIHRvIG1ha2UgdGhlIGRlZmF1bHQgUzMtbWFuYWdlZCBlbmNyeXB0aW9uLCB3aGljaCBpcyBmcmVlLiBIb3dldmVyLCB0aGUgbWlncmF0aW9uIHBhdGggZnJvbSBLTVMgdG8gUzNcbiAgICogbWFuYWdlZCBlbmNyeXB0aW9uIGZvciBleGlzdGluZyBidWNrZXRzIGlzIG5vdCBzdHJhaWdodGZvcndhcmQuIFRoZXJlZm9yZSwgZm9yIG5vdywgdGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogSWYgeW91IGhhdmUgYW4gZXhpc3Rpbmcgc3RhZ2luZyBidWNrZXQgZW5jcnlwdGVkIHdpdGggYSBLTVMga2V5LCB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0b1xuICAgKiBCdWNrZXRFbmNyeXB0aW9uLktNUy4gSWYgeW91IGFyZSBjcmVhdGluZyBhIG5ldyBzdGFnaW5nIGJ1Y2tldCwgeW91IGNhbiBzZXQgdGhpcyBwcm9wZXJ0eSB0b1xuICAgKiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgYSBLTVMga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb247XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBQYXNzIGluIGFuIGV4aXN0aW5nIHJvbGUgdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZXRpbWUgZm9yIGRlcGxveSB0aW1lIGZpbGUgYXNzZXRzLlxuICAgKlxuICAgKiBBc3NldHMgdGhhdCBhcmUgb25seSBuZWNlc3NhcnkgYXQgZGVwbG95bWVudCB0aW1lIChmb3IgaW5zdGFuY2UsXG4gICAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgTGFtYmRhIHNvdXJjZSBjb2RlIGJ1bmRsZXMpIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoaXMgbWFueSBkYXlzLiBBc3NldHMgdGhhdCBtYXkgYmVcbiAgICogcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldCBkdXJpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJ1biB0aW1lXG4gICAqIHdpbGwgbm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIHRoZSBsZW5ndGggb2YgdGltZSB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIHJvbGwgYmFjayB0b1xuICAgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGEgbmV3XG4gICAqIGBjZGsgc3ludGhgIGFuZCByZS11cGxvYWQgb2YgYXNzZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIER1cmF0aW9uLmRheXMoMzApXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHZlcnNpb25zIHRvIHN0b3JlIGluIGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogUHJldmlvdXMgdmVyc2lvbnMgb2YgYW4gaW1hZ2UgY2FuIGJlIHN0b3JlZCBmb3Igcm9sbGJhY2sgcHVycG9zZXMuXG4gICAqIE9uY2UgYSByZXBvc2l0b3J5IGhhcyBtb3JlIHRoYW4gMyBpbWFnZSB2ZXJzaW9ucyBzdG9yZWQsIHRoZSBvbGRlc3RcbiAgICogdmVyc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcyBhbGxvd3MgZm9yIHNlbnNpYmxlIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgKiB3aGlsZSBtYWludGFpbmluZyBhIGZldyBwcmV2aW91cyB2ZXJzaW9ucyBmb3Igcm9sbGJhY2sgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVwIHRvIDMgdmVyc2lvbnMgc3RvcmVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0VmVyc2lvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRvIGRlbGV0ZXMgb2JqZWN0cyBpbiB0aGUgc3RhZ2luZyBTMyBidWNrZXQgYW5kIGltYWdlcyBpbiB0aGVcbiAgICogc3RhZ2luZyBFQ1IgcmVwb3NpdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gcHJlZml4IHRvIGJlIHVzZWQgYXMgdGhlIHN0YWdpbmcgc3RhY2sgbmFtZSBhbmRcbiAgICogY29uc3RydWN0IElELiBUaGUgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBhcHBJZCwgd2hpY2hcbiAgICogaXMgcmVxdWlyZWQgdG8gYmUgcGFydCBvZiB0aGUgc3RhY2sgbmFtZSBhbmQgY29uc3RydWN0IElEIHRvXG4gICAqIGVuc3VyZSB1bmlxdWVuZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnU3RhZ2luZ1N0YWNrJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ1N0YWNrTmFtZVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IFN0YWdpbmcgU3RhY2sgUHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcyBleHRlbmRzIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zLCBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGRlcGxveSBhY3Rpb24gcm9sZSwgaWYgZ2l2ZW5cbiAgICpcbiAgICogVGhpcyByb2xlIHdpbGwgbmVlZCBwZXJtaXNzaW9ucyB0byByZWFkIGZyb20gdG8gdGhlIHN0YWdpbmcgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBDTEkgY3JlZGVudGlhbHMgYXJlIGFzc3VtZWQsIG5vIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVhbGlmaWVyIHVzZWQgdG8gc3BlY2lhbGl6ZSBzdHJpbmdzXG4gICAqXG4gICAqIFNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IHdobyBrbm93cyB3aGF0IHBlb3BsZSBtaWdodCBkby5cbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBTdGFnaW5nIFN0YWNrIHRoYXQgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgQnVja2V0RW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG4gKiBjb25zdCBkZWZhdWx0U3RhZ2luZ1N0YWNrID0gRGVmYXVsdFN0YWdpbmdTdGFjay5mYWN0b3J5KHsgYXBwSWQ6ICdteS1hcHAtaWQnLCBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEIH0pO1xuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdFN0YWdpbmdTdGFjayBleHRlbmRzIFN0YWNrIGltcGxlbWVudHMgSVN0YWdpbmdSZXNvdXJjZXMge1xuICAvKipcbiAgICogUmV0dXJuIGEgZmFjdG9yeSB0aGF0IHdpbGwgY3JlYXRlIERlZmF1bHRTdGFnaW5nU3RhY2tzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZhY3Rvcnkob3B0aW9uczogRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMpOiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnkge1xuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZC50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5zbGljZSgwLCAyMCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9idGFpblN0YWdpbmdSZXNvdXJjZXMoc3RhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgYXBwID0gQXBwLm9mKHN0YWNrKTtcbiAgICAgICAgaWYgKCFBcHAuaXNBcHAoYXBwKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhY2sgJHtzdGFjay5zdGFja05hbWV9IG11c3QgYmUgcGFydCBvZiBhbiBBcHBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgZG8gbm90IGtlZXAgbWV0cmljcyBpbiB0aGUgRGVmYXVsdFN0YWdpbmdTdGFjaywgd2Ugd2lsbCBpbmplY3RcbiAgICAgICAgLy8gYSBkdW1teSBjb25zdHJ1Y3QgaW50byB0aGUgc3RhY2sgdXNpbmcgdGhlIERlZmF1bHRTdGFnaW5nU3RhY2sgaW5zdGVhZC5cbiAgICAgICAgaWYgKGN4YXBpLkFOQUxZVElDU19SRVBPUlRJTkdfRU5BQkxFRF9DT05URVhUKSB7XG4gICAgICAgICAgbmV3IFVzaW5nQXBwU3RhZ2luZ1N5bnRoZXNpemVyKHN0YWNrLCBgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIvJHtzdGFjay5zdGFja05hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFja1ByZWZpeCA9IG9wdGlvbnMuc3RhZ2luZ1N0YWNrTmFtZVByZWZpeCA/PyAnU3RhZ2luZ1N0YWNrJztcbiAgICAgICAgLy8gU3RhY2sgbmFtZSBkb2VzIG5vdCBuZWVkIHRvIGNvbnRhaW4gZW52aXJvbm1lbnQgYmVjYXVzZSBhcHBJZCBpcyB1bmlxdWUgaW5zaWRlIGFuIGVudlxuICAgICAgICBjb25zdCBzdGFja05hbWUgPSBgJHtzdGFja1ByZWZpeH0tJHthcHBJZH1gO1xuICAgICAgICBjb25zdCBzdGFja0lkID0gYCR7c3RhY2tOYW1lfS0ke2NvbnRleHQuZW52aXJvbm1lbnRTdHJpbmd9YDtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0U3RhZ2luZ1N0YWNrKGFwcCwgc3RhY2tJZCwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgc3RhY2tOYW1lLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2sucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwSWQsXG4gICAgICAgICAgcXVhbGlmaWVyOiBjb250ZXh0LnF1YWxpZmllcixcbiAgICAgICAgICBkZXBsb3lSb2xlQXJuOiBjb250ZXh0LmRlcGxveVJvbGVBcm4sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGZpbGUgKFMzKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmaWxlUm9sZU5hbWUoKSB7XG4gICAgcmV0dXJuIGBjZGstJHt0aGlzLmFwcElkfS1maWxlLXJvbGUtJHt0aGlzLnJlZ2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGRvY2tlciAoRUNSKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBpbWFnZVJvbGVOYW1lKCkge1xuICAgIHJldHVybiBgY2RrLSR7dGhpcy5hcHBJZH0taW1hZ2Utcm9sZS0ke3RoaXMucmVnaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGV2aXJvbm1lbnQta2V5ZWQgc3RhZ2luZyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldD86IHMzLkJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGVudmlyb25tZW50LWtleWVkIGVjciByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdpbmdSZXBvczogUmVjb3JkPHN0cmluZywgZWNyLlJlcG9zaXRvcnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gYWRkIGRlcGVuZGVuY2llcyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmN5U3RhY2s6IFN0YWNrO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogRmlsZSBwdWJsaXNoIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEZpbGVSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZT86IGlhbS5JUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBwdWJsaXNoaW5nIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEltYWdlUm9sZT86IEJvb3RzdHJhcFJvbGU7XG4gIHByaXZhdGUgaW1hZ2VSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGRpZEltYWdlUm9sZSA9IGZhbHNlO1xuICBwcml2YXRlIGltYWdlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuICBwcml2YXRlIGF1dG9EZWxldGVTdGFnaW5nQXNzZXRzOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQXBwLCBpZDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3ludGhlc2l6ZXI6IG5ldyBCb290c3RyYXBsZXNzU3ludGhlc2l6ZXIoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgVGhpcyBzdGFjayBpbmNsdWRlcyByZXNvdXJjZXMgbmVlZGVkIHRvIGRlcGxveSB0aGUgQVdTIENESyBhcHAgJHtwcm9wcy5hcHBJZH0gaW50byB0aGlzIGVudmlyb25tZW50YCxcbiAgICAgIGFuYWx5dGljc1JlcG9ydGluZzogZmFsc2UsIC8vIHJlbW92aW5nIEFXUzo6Q0RLOjpNZXRhZGF0YSBjb25zdHJ1Y3Qgc2F2ZXMgfjNLQlxuICAgIH0pO1xuICAgIC8vIHJlbW92aW5nIHBhdGggbWV0YWRhdGEgc2F2ZXMgfjJLQlxuICAgIHRoaXMubm9kZS5zZXRDb250ZXh0KGN4YXBpLlBBVEhfTUVUQURBVEFfRU5BQkxFX0NPTlRFWFQsIGZhbHNlKTtcblxuICAgIC8vIEZvciBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBkZWZhdWx0IHN0YWdpbmcgc3RhY2ssIHdlIHdhbnQgdG8gaW5saW5lIGN1c3RvbVxuICAgIC8vIHJlc291cmNlcyBiZWNhdXNlIHRoZSBzdGFnaW5nIGJ1Y2tldCBuZWNlc3NhcnkgZm9yIGN1c3RvbSByZXNvdXJjZSBhc3NldHNcbiAgICAvLyBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgdGhpcy5ub2RlLnNldENvbnRleHQoSU5MSU5FX0NVU1RPTV9SRVNPVVJDRV9DT05URVhULCB0cnVlKTtcbiAgICB0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID0gcHJvcHMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPz8gdHJ1ZTtcblxuICAgIHRoaXMuYXBwSWQgPSB0aGlzLnZhbGlkYXRlQXBwSWQocHJvcHMuYXBwSWQpO1xuICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrID0gdGhpcztcblxuICAgIHRoaXMuZGVwbG95Um9sZUFybiA9IHByb3BzLmRlcGxveVJvbGVBcm47XG4gICAgdGhpcy5zdGFnaW5nQnVja2V0TmFtZSA9IHByb3BzLnN0YWdpbmdCdWNrZXROYW1lO1xuXG4gICAgLy8gRklYTUU6IHdoZW4gc3RhYmlsaXppbmcgdGhpcyBtb2R1bGUsIHdlIHNob3VsZCBtYWtlIGBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbmAgb3B0aW9uYWwsIGRlZmF1bHRpbmcgdG8gUzNfTUFOQUdFRC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMjg5NzgjaXNzdWVjb21tZW50LTE5MzAwMDcxNzYgZm9yIGRldGFpbHMgb24gdGhpcyBkZWNpc2lvbi5cbiAgICB0aGlzLnN0YWdpbmdCdWNrZXRFbmNyeXB0aW9uID0gcHJvcHMuc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb247XG5cbiAgICBjb25zdCBzcGVjaWFsaXplciA9IG5ldyBTdHJpbmdTcGVjaWFsaXplcih0aGlzLCBwcm9wcy5xdWFsaWZpZXIpO1xuXG4gICAgdGhpcy5wcm92aWRlZEZpbGVSb2xlID0gcHJvcHMuZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/Ll9zcGVjaWFsaXplKHNwZWNpYWxpemVyKTtcbiAgICB0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlID0gcHJvcHMuaW1hZ2VBc3NldFB1Ymxpc2hpbmdSb2xlPy5fc3BlY2lhbGl6ZShzcGVjaWFsaXplcik7XG4gICAgdGhpcy5zdGFnaW5nUmVwb3MgPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBcHBJZChpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgaWYgKGlkLmxlbmd0aCA+IDIwKSB7XG4gICAgICBlcnJvcnMucHVzaChgYXBwSWQgZXhwZWN0ZWQgbm8gbW9yZSB0aGFuIDIwIGNoYXJhY3RlcnMgYnV0IGdvdCAke2lkLmxlbmd0aH0gY2hhcmFjdGVycy5gKTtcbiAgICB9XG4gICAgaWYgKGlkICE9PSBpZC50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnYXBwSWQgb25seSBhY2NlcHRzIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLicpO1xuICAgIH1cbiAgICBpZiAoIS9eW2EtejAtOS1dKiQvLnRlc3QoaWQpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnYXBwSWQgZXhwZWN0cyBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCBkYXNoZXMgKFxcJy1cXCcpJyk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICBgYXBwSWQgJHtpZH0gaGFzIGVycm9yczpgLFxuICAgICAgICAuLi5lcnJvcnMsXG4gICAgICBdLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVGaWxlUm9sZSgpIHtcbiAgICBpZiAodGhpcy5wcm92aWRlZEZpbGVSb2xlKSB7XG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgdGhpcy5maWxlUm9sZU1hbmlmZXN0QXJuID0gdGhpcy5wcm92aWRlZEZpbGVSb2xlLl9hcm5Gb3JDbG91ZEFzc2VtYmx5KCk7XG4gICAgICBjb25zdCBjZm5Bcm4gPSB0aGlzLnByb3ZpZGVkRmlsZVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICB0aGlzLmZpbGVSb2xlID0gY2ZuQXJuID8gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgJ0Nka0ZpbGVSb2xlJywgY2ZuQXJuKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlTmFtZSA9IHRoaXMuZmlsZVJvbGVOYW1lO1xuICAgIHRoaXMuZmlsZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ0Nka0ZpbGVSb2xlJywge1xuICAgICAgcm9sZU5hbWUsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQWNjb3VudFByaW5jaXBhbCh0aGlzLmFjY291bnQpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5maWxlUm9sZU1hbmlmZXN0QXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHBhcnRpdGlvbjogJyR7QVdTOjpQYXJ0aXRpb259JyxcbiAgICAgIHJlZ2lvbjogJycsIC8vIGlhbSBpcyBnbG9iYWxcbiAgICAgIHNlcnZpY2U6ICdpYW0nLFxuICAgICAgcmVzb3VyY2U6ICdyb2xlJyxcbiAgICAgIHJlc291cmNlTmFtZTogcm9sZU5hbWUsXG4gICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVJbWFnZVJvbGUoKSB7XG4gICAgLy8gSXQgbWF5IGVuZCB1cCBzZXR0aW5nIGltYWdlUm9sZSB0byB1bmRlZmluZWQsIGJ1dCBhdCBsZWFzdCB3ZSB0cmllZFxuICAgIGlmICh0aGlzLmRpZEltYWdlUm9sZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpZEltYWdlUm9sZSA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5wcm92aWRlZEltYWdlUm9sZSkge1xuICAgICAgLy8gT3ZlcnJpZGVcbiAgICAgIHRoaXMuaW1hZ2VSb2xlTWFuaWZlc3RBcm4gPSB0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlLl9hcm5Gb3JDbG91ZEFzc2VtYmx5KCk7XG4gICAgICBjb25zdCBjZm5Bcm4gPSB0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlLl9hcm5Gb3JDbG91ZEZvcm1hdGlvbigpO1xuICAgICAgdGhpcy5pbWFnZVJvbGUgPSBjZm5Bcm4gPyBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ2RrSW1hZ2VSb2xlJywgY2ZuQXJuKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlTmFtZSA9IHRoaXMuaW1hZ2VSb2xlTmFtZTtcbiAgICB0aGlzLmltYWdlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ2RrSW1hZ2VSb2xlJywge1xuICAgICAgcm9sZU5hbWUsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQWNjb3VudFByaW5jaXBhbCh0aGlzLmFjY291bnQpLFxuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VSb2xlTWFuaWZlc3RBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgcGFydGl0aW9uOiAnJHtBV1M6OlBhcnRpdGlvbn0nLFxuICAgICAgcmVnaW9uOiAnJywgLy8gaWFtIGlzIGdsb2JhbFxuICAgICAgc2VydmljZTogJ2lhbScsXG4gICAgICByZXNvdXJjZTogJ3JvbGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiByb2xlTmFtZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJ1Y2tldEtleSgpOiBrbXMuSUtleSB7XG4gICAgcmV0dXJuIG5ldyBrbXMuS2V5KHRoaXMsICdCdWNrZXRLZXknLCB7XG4gICAgICBhbGlhczogYGFsaWFzL2Nkay0ke3RoaXMuYXBwSWR9LXN0YWdpbmdgLFxuICAgICAgYWRtaW5zOiBbbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCldLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDcmVhdGVCdWNrZXQoKSB7XG4gICAgY29uc3Qgc3RhZ2luZ0J1Y2tldE5hbWUgPSB0aGlzLnN0YWdpbmdCdWNrZXROYW1lID8/IGBjZGstJHt0aGlzLmFwcElkfS1zdGFnaW5nLSR7dGhpcy5hY2NvdW50fS0ke3RoaXMucmVnaW9ufWA7XG4gICAgY29uc3QgYnVja2V0SWQgPSAnQ2RrU3RhZ2luZ0J1Y2tldCc7XG4gICAgY29uc3QgY3JlYXRlZEJ1Y2tldCA9IHRoaXMubm9kZS50cnlGaW5kQ2hpbGQoYnVja2V0SWQpIGFzIHMzLkJ1Y2tldDtcbiAgICBpZiAoY3JlYXRlZEJ1Y2tldCkge1xuICAgICAgcmV0dXJuIHN0YWdpbmdCdWNrZXROYW1lO1xuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlRmlsZVJvbGUoKTtcblxuICAgIGxldCBrZXkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb24gPT09IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TKSB7XG4gICAgICBrZXkgPSB0aGlzLmNyZWF0ZUJ1Y2tldEtleSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgYnVja2V0IG9uY2UgdGhlIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gY3JlYXRlZFxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgYnVja2V0SWQsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHN0YWdpbmdCdWNrZXROYW1lLFxuICAgICAgLi4uKHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPyB7XG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICB9IDoge1xuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIH0pLFxuICAgICAgZW5jcnlwdGlvbjogdGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbixcbiAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcblxuICAgICAgLy8gTWFueSBBV1MgYWNjb3VudCBzYWZldHkgY2hlY2tlcnMgd2lsbCBjb21wbGFpbiB3aGVuIGJ1Y2tldHMgYXJlbid0IHZlcnNpb25lZFxuICAgICAgdmVyc2lvbmVkOiB0cnVlLFxuICAgICAgLy8gTWFueSBBV1MgYWNjb3VudCBzYWZldHkgY2hlY2tlcnMgd2lsbCBjb21wbGFpbiB3aGVuIFNTTCBpc24ndCBlbmZvcmNlZFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmZpbGVSb2xlKSB7XG4gICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5maWxlUm9sZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwbG95Um9sZUFybikge1xuICAgICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOkdldE9iamVjdConLFxuICAgICAgICAgICdzMzpHZXRCdWNrZXQqJyxcbiAgICAgICAgICAnczM6TGlzdConLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtidWNrZXQuYnVja2V0QXJuLCBidWNrZXQuYXJuRm9yT2JqZWN0cygnKicpXSxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQXJuUHJpbmNpcGFsKHRoaXMuZGVwbG95Um9sZUFybildLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIE9iamVjdHMgc2hvdWxkIG5ldmVyIGJlIG92ZXJ3cml0dGVuLCBidXQgbGV0J3MgbWFrZSBzdXJlIHdlIGhhdmUgYSBsaWZlY3ljbGUgcG9saWN5XG4gICAgLy8gZm9yIGl0IGFueXdheS5cbiAgICBidWNrZXQuYWRkTGlmZWN5Y2xlUnVsZSh7XG4gICAgICBub25jdXJyZW50VmVyc2lvbkV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICB9KTtcblxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIHByZWZpeDogREVQTE9ZX1RJTUVfUFJFRklYLFxuICAgICAgZXhwaXJhdGlvbjogdGhpcy5wcm9wcy5kZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWUgPz8gRHVyYXRpb24uZGF5cygzMCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIHRoZSByZXBvXG4gICAqL1xuICBwcml2YXRlIGdldENyZWF0ZVJlcG8oYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBzdHJpbmcge1xuICAgIGlmICghYXNzZXQuYXNzZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0cyBzeW50aGVzaXplZCB3aXRoIEFwcFNjb3BlZFN0YWdpbmdTeW50aGVzaXplciBtdXN0IGluY2x1ZGUgYW4gXFwnYXNzZXROYW1lXFwnIGluIHRoZSBhc3NldCBzb3VyY2UgZGVmaW5pdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW1hZ2UgcHVibGlzaGluZyByb2xlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICB0aGlzLmVuc3VyZUltYWdlUm9sZSgpO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBnZW5lcmF0ZVJlcG9OYW1lKGAke3RoaXMuYXBwSWR9LyR7YXNzZXQuYXNzZXROYW1lfWApO1xuICAgIGlmICh0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPSBuZXcgZWNyLlJlcG9zaXRvcnkodGhpcywgcmVwb05hbWUsIHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLFxuICAgICAgICBpbWFnZVRhZ011dGFiaWxpdHk6IGVjci5UYWdNdXRhYmlsaXR5LklNTVVUQUJMRSxcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdHYXJiYWdlIGNvbGxlY3Qgb2xkIGltYWdlIHZlcnNpb25zJyxcbiAgICAgICAgICBtYXhJbWFnZUNvdW50OiB0aGlzLnByb3BzLmltYWdlQXNzZXRWZXJzaW9uQ291bnQgPz8gMyxcbiAgICAgICAgfV0sXG4gICAgICAgIC4uLih0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID8ge1xuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICBlbXB0eU9uRGVsZXRlOiB0cnVlLFxuICAgICAgICB9IDoge1xuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5pbWFnZVJvbGUpIHtcbiAgICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXS5ncmFudFB1bGxQdXNoKHRoaXMuaW1hZ2VSb2xlKTtcbiAgICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXS5ncmFudFJlYWQodGhpcy5pbWFnZVJvbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVwb05hbWU7XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoJy4nLCAnLScpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGFzc2V0OiBGaWxlQXNzZXRTb3VyY2UpOiBGaWxlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgICAvLyBIYXMgc2lkZSBlZmZlY3RzIHNvIG11c3QgZ28gZmlyc3RcbiAgICBjb25zdCBidWNrZXROYW1lID0gdGhpcy5nZXRDcmVhdGVCdWNrZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBidWNrZXROYW1lLFxuICAgICAgYXNzdW1lUm9sZUFybjogdGhpcy5maWxlUm9sZU1hbmlmZXN0QXJuLFxuICAgICAgcHJlZml4OiBhc3NldC5kZXBsb3lUaW1lID8gREVQTE9ZX1RJTUVfUFJFRklYIDogdW5kZWZpbmVkLFxuICAgICAgZGVwZW5kZW5jeVN0YWNrOiB0aGlzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYWRkRG9ja2VySW1hZ2UoYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBJbWFnZVN0YWdpbmdMb2NhdGlvbiB7XG4gICAgLy8gSGFzIHNpZGUgZWZmZWN0cyBzbyBtdXN0IGdvIGZpcnN0XG4gICAgY29uc3QgcmVwb05hbWUgPSB0aGlzLmdldENyZWF0ZVJlcG8oYXNzZXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgYXNzdW1lUm9sZUFybjogdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybixcbiAgICAgIGRlcGVuZGVuY3lTdGFjazogdGhpcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoZXNpemVzIHRoZSBjbG91ZGZvcm1hdGlvbiB0ZW1wbGF0ZSBpbnRvIGEgY2xvdWQgYXNzZW1ibHkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24sIGxvb2t1cFJvbGVBcm4/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBzdXBlci5fc3ludGhlc2l6ZVRlbXBsYXRlKHNlc3Npb24sIGxvb2t1cFJvbGVBcm4pO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IHNlc3Npb24uYXNzZW1ibHk7XG4gICAgY29uc3Qgb3V0UGF0aCA9IHBhdGguam9pbihidWlsZGVyLm91dGRpciwgdGhpcy50ZW1wbGF0ZUZpbGUpO1xuICAgIGNvbnN0IHNpemUgPSBmcy5zdGF0U3luYyhvdXRQYXRoKS5zaXplO1xuICAgIGlmIChzaXplID4gNTEyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhZ2luZyByZXNvdXJjZSB0ZW1wbGF0ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDUxMjAwIGJ5dGVzLCBidXQgZ290ICR7c2l6ZX0gYnl0ZXNgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aws-cdk/app-staging-synthesizer-alpha",
3
3
  "private": false,
4
- "version": "2.127.0-alpha.0",
4
+ "version": "2.128.0-alpha.0",
5
5
  "description": "Cdk synthesizer for with app-scoped staging stack",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -84,15 +84,15 @@
84
84
  }
85
85
  },
86
86
  "devDependencies": {
87
- "aws-cdk-lib": "2.127.0",
88
- "@aws-cdk/integ-runner": "2.127.0-alpha.0",
89
- "@aws-cdk/integ-tests-alpha": "2.127.0-alpha.0",
87
+ "aws-cdk-lib": "2.128.0",
88
+ "@aws-cdk/integ-runner": "2.128.0-alpha.0",
89
+ "@aws-cdk/integ-tests-alpha": "2.128.0-alpha.0",
90
90
  "constructs": "^10.0.0",
91
- "@aws-cdk/cdk-build-tools": "2.127.0-alpha.0",
92
- "@aws-cdk/pkglint": "2.127.0-alpha.0"
91
+ "@aws-cdk/cdk-build-tools": "2.128.0-alpha.0",
92
+ "@aws-cdk/pkglint": "2.128.0-alpha.0"
93
93
  },
94
94
  "peerDependencies": {
95
- "aws-cdk-lib": "^2.127.0",
95
+ "aws-cdk-lib": "^2.128.0",
96
96
  "constructs": "^10.0.0"
97
97
  },
98
98
  "publishConfig": {