image-scanner-with-trivy 2.1.4 → 2.1.5

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
@@ -3962,7 +3962,7 @@
3962
3962
  },
3963
3963
  "name": "image-scanner-with-trivy",
3964
3964
  "readme": {
3965
- "markdown": "# image-scanner-with-trivy\n\n## Detail Pages\n\nThe detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).\n\nTo my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://aquasecurity.github.io/trivy/latest/ecosystem/ide/#image-scanner-with-trivy-community)!\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **prevent the image from being pushed to the ECR for the application**.\n\nSince it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.\n\n## Trivy\n\n[Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\nThe following code is a minimal example.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Add properties you want for trivy options (ignoreUnfixed, severity, scanners, trivyIgnore, etc).\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// By adding `addDependency`, if the vulnerabilities are detected by `ImageScannerWithTrivy`, the following `ECRDeployment` will not be executed, deployment will fail.\nconst ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\necrDeployment.node.addDependency(imageScanner);\n```\n\n### Scan Logs Output\n\nIf you output the scan logs to other than the default log group, you can specify the `scanLogsOutput` option.\n\nThis option is useful when you want to choose where to output the scan logs.\n\nCurrently, CloudWatch Logs is only supported as an output destination.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.cloudWatchLogs` method to specify the log group.\n scanLogsOutput: ScanLogsOutput.cloudWatchLogs({ logGroup: new LogGroup(this, 'LogGroup') }),\n});\n```\n\n### Default Log Group\n\nIf you customize the default log group for Scanner Lambda, you can specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options.\nCurrently, only changing the removal policy and retention days are supported.\n\nIf the default log group is already created in your AWS Account and you specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options, the deployment will fail because of a conflict with the log group name.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Change the default log group removal policy to `Destroy`.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n // Change the default log group retention days to `One Year`.\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n```\n\nIf you use ImageScannerWithTrivy construct multiple times in the same stack, you have to set the same values for `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\nWhen you set the different values for each construct, the first one will be applied to all ImageScannerWithTrivy constructs in the same stack and warning message will be displayed.\n\nThe following code will produce warning message because of the different values of `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are applied to all ImageScannerWithTrivy constructs in the same stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n\n// NG example\n// Once you specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays, you have to set the same values for each construct.\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithDifferentDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are different from the above construct, and warning message will be displayed when synthesizing the stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.RETAIN, // This should be `RemovalPolicy.DESTROY` as the above construct.\n defaultLogGroupRetentionDays: RetentionDays.ONE_MONTH, // This should be `RetentionDays.ONE_YEAR` as the above construct.\n});\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // You should specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays if you have already set the values.\n});\n```\n\n### Rollback Error Suppression\n\nBy default, the `suppressErrorOnRollback` property is set to `true`.\n\nWhen image scanning fails, CloudFormation triggers a rollback and executes the previous version\nof the scanner Lambda. If this property is set to `true`, the previous version of the scanner\nLambda will not throw an error, even if the image scanning for the previous version fails.\n\nThis allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state\nwhen image scanning failures occur.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Default is true - suppress errors during rollback to prevent ROLLBACK_FAILED\n suppressErrorOnRollback: true,\n // Set to false if you want rollback errors to be thrown\n suppressErrorOnRollback: false,\n});\n```\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
3965
+ "markdown": "# image-scanner-with-trivy\n\n## Detail Pages\n\nThe detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).\n\nTo my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://trivy.dev/docs/latest/ecosystem/ide/#image-scanner-with-trivy-community)!\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **prevent the image from being pushed to the ECR for the application**.\n\nSince it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.\n\n## Trivy\n\n[Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\nThe following code is a minimal example.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Add properties you want for trivy options (ignoreUnfixed, severity, scanners, trivyIgnore, etc).\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// By adding `addDependency`, if the vulnerabilities are detected by `ImageScannerWithTrivy`, the following `ECRDeployment` will not be executed, deployment will fail.\nconst ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\necrDeployment.node.addDependency(imageScanner);\n```\n\n### Scan Logs Output\n\nIf you output the scan logs to other than the default log group, you can specify the `scanLogsOutput` option.\n\nThis option is useful when you want to choose where to output the scan logs.\n\nCurrently, CloudWatch Logs is only supported as an output destination.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.cloudWatchLogs` method to specify the log group.\n scanLogsOutput: ScanLogsOutput.cloudWatchLogs({ logGroup: new LogGroup(this, 'LogGroup') }),\n});\n```\n\n### Default Log Group\n\nIf you customize the default log group for Scanner Lambda, you can specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options.\nCurrently, only changing the removal policy and retention days are supported.\n\nIf the default log group is already created in your AWS Account and you specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options, the deployment will fail because of a conflict with the log group name.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Change the default log group removal policy to `Destroy`.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n // Change the default log group retention days to `One Year`.\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n```\n\nIf you use ImageScannerWithTrivy construct multiple times in the same stack, you have to set the same values for `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\nWhen you set the different values for each construct, the first one will be applied to all ImageScannerWithTrivy constructs in the same stack and warning message will be displayed.\n\nThe following code will produce warning message because of the different values of `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are applied to all ImageScannerWithTrivy constructs in the same stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n\n// NG example\n// Once you specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays, you have to set the same values for each construct.\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithDifferentDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are different from the above construct, and warning message will be displayed when synthesizing the stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.RETAIN, // This should be `RemovalPolicy.DESTROY` as the above construct.\n defaultLogGroupRetentionDays: RetentionDays.ONE_MONTH, // This should be `RetentionDays.ONE_YEAR` as the above construct.\n});\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // You should specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays if you have already set the values.\n});\n```\n\n### Rollback Error Suppression\n\nBy default, the `suppressErrorOnRollback` property is set to `true`.\n\nWhen image scanning fails, CloudFormation triggers a rollback and executes the previous version\nof the scanner Lambda. If this property is set to `true`, the previous version of the scanner\nLambda will not throw an error, even if the image scanning for the previous version fails.\n\nThis allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state\nwhen image scanning failures occur.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Default is true - suppress errors during rollback to prevent ROLLBACK_FAILED\n suppressErrorOnRollback: true,\n // Set to false if you want rollback errors to be thrown\n suppressErrorOnRollback: false,\n});\n```\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
3966
3966
  },
3967
3967
  "repository": {
3968
3968
  "type": "git",
@@ -4664,6 +4664,6 @@
4664
4664
  "symbolId": "src/image-scanner-with-trivy:Severity"
4665
4665
  }
4666
4666
  },
4667
- "version": "2.1.4",
4668
- "fingerprint": "ZKHRzouX/LWRH2AxRsH7YXr2xDBUFqh23h+/yr1kTYc="
4667
+ "version": "2.1.5",
4668
+ "fingerprint": "P8GNks67A3VUqVeRDrF8FS5TvjWqhpYZ6MDu+lIPvKU="
4669
4669
  }
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  The detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).
6
6
 
7
- To my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://aquasecurity.github.io/trivy/latest/ecosystem/ide/#image-scanner-with-trivy-community)!
7
+ To my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://trivy.dev/docs/latest/ecosystem/ide/#image-scanner-with-trivy-community)!
8
8
 
9
9
  ## What is
10
10
 
@@ -60,7 +60,7 @@ class ScanLogsOutput {
60
60
  }
61
61
  exports.ScanLogsOutput = ScanLogsOutput;
62
62
  _a = JSII_RTTI_SYMBOL_1;
63
- ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.1.4" };
63
+ ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.1.5" };
64
64
  class CloudWatchLogsOutput extends ScanLogsOutput {
65
65
  constructor(options) {
66
66
  super();
@@ -191,5 +191,5 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
191
191
  }
192
192
  exports.ImageScannerWithTrivy = ImageScannerWithTrivy;
193
193
  _b = JSII_RTTI_SYMBOL_1;
194
- ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.1.4" };
194
+ ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.1.5" };
195
195
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBQ3RELGlEQUFrRTtBQUNsRSx1REFNZ0M7QUFDaEMsbURBQXVGO0FBQ3ZGLG1FQUF3RDtBQUN4RCwyQ0FBdUM7QUFDdkMsbUNBS2lCO0FBRWpCOzs7O0dBSUc7QUFDSCxJQUFZLFFBTVg7QUFORCxXQUFZLFFBQVE7SUFDbEIsK0JBQW1CLENBQUE7SUFDbkIsdUJBQVcsQ0FBQTtJQUNYLDZCQUFpQixDQUFBO0lBQ2pCLHlCQUFhLENBQUE7SUFDYixpQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBTlcsUUFBUSx3QkFBUixRQUFRLFFBTW5CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNsQix5QkFBYSxDQUFBO0lBQ2IsNkJBQWlCLENBQUE7SUFDakIsNkJBQWlCLENBQUE7SUFDakIsK0JBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUxXLFFBQVEsd0JBQVIsUUFBUSxRQUtuQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLG1CQUdYO0FBSEQsV0FBWSxtQkFBbUI7SUFDN0Isd0NBQWlCLENBQUE7SUFDakIsd0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhXLG1CQUFtQixtQ0FBbkIsbUJBQW1CLFFBRzlCO0FBWUQ7O0dBRUc7QUFDSCxNQUFzQixjQUFjO0lBQ2xDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFrQztRQUM3RCxPQUFPLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7QUFOSCx3Q0FZQzs7O0FBRUQsTUFBTSxvQkFBcUIsU0FBUSxjQUFjO0lBTS9DLFlBQVksT0FBa0M7UUFDNUMsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFtQjtRQUM3Qiw2RkFBNkY7UUFDN0Ysc0dBQXNHO1FBQ3RHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxDLE9BQU87WUFDTCxJQUFJLEVBQUUsMEJBQWtCLENBQUMsZUFBZTtZQUN4QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO1NBQ3pDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFrTkQsa0ZBQWtGO0FBQ2xGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBRWpDLE1BQWEscUJBQXNCLFNBQVEsc0JBQVM7SUFDbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQ0UsS0FBSyxDQUFDLFVBQVU7WUFDaEIsQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3JDLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsRUFDckQsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsMEVBQTBFLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FDOUYsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxtREFBbUQsQ0FBQztRQUMxRSxNQUFNLG9CQUFvQixHQUFHLElBQUksOEJBQWlCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQy9FLElBQUksRUFBRSxzQ0FBc0M7WUFDNUMsYUFBYTtZQUNiLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFVBQVU7WUFDM0IsT0FBTyxFQUFFLG9CQUFPLENBQUMsVUFBVTtZQUMzQixJQUFJLEVBQUUsc0JBQVMsQ0FBQyxjQUFjLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ2xFLFFBQVEsRUFBRSx5QkFBUSxDQUFDLFdBQVc7Z0JBQzlCLHVCQUF1QjtnQkFDdkIsK0ZBQStGO2dCQUMvRix3RkFBd0Y7Z0JBQ3hGLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUMxQixDQUFDO1lBQ0YsWUFBWSxFQUFFLHlCQUFZLENBQUMsTUFBTTtZQUNqQyxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzlCLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLG1CQUFtQjtZQUNuRCxvQkFBb0IsRUFBRSxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxpRUFBaUU7U0FDNUcsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUVqRCxnSEFBZ0g7UUFDaEgsTUFBTSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDO1FBQ3RFLElBQUksdUJBQXVCLEVBQUUsQ0FBQztZQUM1QixvQkFBb0IsQ0FBQyxlQUFlLENBQ2xDLElBQUkseUJBQWUsQ0FBQztnQkFDbEIsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUNwQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLHlDQUF5QyxHQUFHLHFCQUFxQixhQUFhLEVBQUUsQ0FBQztRQUV2RixJQUFJLENBQUMsb0NBQW9DLENBQUMseUNBQXlDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFNUYsSUFBSSxLQUFLLENBQUMsNEJBQTRCLElBQUksS0FBSyxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDN0UsSUFBSSxDQUFDLDJCQUEyQixDQUM5QixvQkFBb0IsRUFDcEIseUNBQXlDLEVBQ3pDLEtBQUssQ0FDTixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSwyQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDMUQsY0FBYyxFQUFFLG9CQUFvQjtTQUNyQyxDQUFDLENBQUM7UUFFSCxNQUFNLHNCQUFzQixHQUErQjtZQUN6RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQ3BCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDO1lBQ25ELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMvQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQzlCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxFQUFFO1lBQ3BELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUM7WUFDN0IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQztZQUMvQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxFQUFFO1lBQ3BDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDOUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hELHVCQUF1QixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQztTQUN6RCxDQUFDO1FBRUYsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbkMsWUFBWSxFQUFFLCtCQUErQjtZQUM3QyxVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxZQUFZO1NBQ2hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLG9DQUFvQyxDQUMxQyxxQkFBNkIsRUFDN0IsS0FBaUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FFMUQsQ0FBQztRQUNkLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUV0QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQTJCLENBQUM7UUFFOUQsSUFDRSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FDbEMsS0FBSyxDQUFDLDRCQUE0QixFQUNsQyxXQUFXLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FDdEM7WUFDRCxXQUFXLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyw0QkFBNEIsRUFDbEUsQ0FBQztZQUNELHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FDL0IsaUVBQWlFLEVBQ2pFLG1LQUFtSyxDQUNwSyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDJCQUEyQixDQUNqQyxpQkFBb0MsRUFDcEMscUJBQTZCLEVBQzdCLEtBQWlDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBRTFELENBQUM7UUFDZCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELE9BQU8sSUFBSSxtQkFBUSxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLHFCQUFxQixFQUFFO1lBQ3pELFlBQVksRUFBRSxlQUFlLGlCQUFpQixDQUFDLFlBQVksRUFBRTtZQUM3RCxTQUFTLEVBQUUsS0FBSyxDQUFDLDRCQUE0QjtZQUM3QyxhQUFhLEVBQUUsS0FBSyxDQUFDLDRCQUE0QjtTQUNsRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sOEJBQThCLENBQ3BDLGFBQTZCLEVBQzdCLGNBQWtDO1FBRWxDLFFBQVEsYUFBYSxFQUFFLENBQUM7WUFDdEIsS0FBSywyQkFBYSxDQUFDLE9BQU87Z0JBQ3hCLE9BQU8sY0FBYyxLQUFLLCtCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUNyRCxLQUFLLDJCQUFhLENBQUMsTUFBTTtnQkFDdkIsT0FBTyxjQUFjLEtBQUssK0JBQWlCLENBQUMsTUFBTSxDQUFDO1lBQ3JELEtBQUssMkJBQWEsQ0FBQyxRQUFRO2dCQUN6QixPQUFPLGNBQWMsS0FBSywrQkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFDdkQsS0FBSywyQkFBYSxDQUFDLDBCQUEwQjtnQkFDM0MsT0FBTyxjQUFjLEtBQUssK0JBQWlCLENBQUMsdUJBQXVCLENBQUM7WUFDdEUsS0FBSyxTQUFTO2dCQUNaLE9BQU8sY0FBYyxLQUFLLFNBQVMsQ0FBQztZQUN0QztnQkFDRSxPQUFPLGFBQTZCLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7O0FBM0pILHNEQTRKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFubm90YXRpb25zLFxuICBDZm5EZWxldGlvblBvbGljeSxcbiAgQ3VzdG9tUmVzb3VyY2UsXG4gIER1cmF0aW9uLFxuICBSZW1vdmFsUG9saWN5LFxuICBTaXplLFxuICBTdGFjayxcbiAgVG9rZW4sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzJztcbmltcG9ydCB7IElHcmFudGFibGUsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHtcbiAgQXJjaGl0ZWN0dXJlLFxuICBBc3NldENvZGUsXG4gIEhhbmRsZXIsXG4gIFJ1bnRpbWUsXG4gIFNpbmdsZXRvbkZ1bmN0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENmbkxvZ0dyb3VwLCBJTG9nR3JvdXAsIExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zLFxuICBTY2FuTG9nc091dHB1dE9wdGlvbnMsXG4gIFNjYW5Mb2dzT3V0cHV0VHlwZSxcbiAgU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVudW0gZm9yIFNldmVyaXR5IFNlbGVjdGlvblxuICpcbiAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jc2V2ZXJpdHktc2VsZWN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNldmVyaXR5IHtcbiAgVU5LTk9XTiA9ICdVTktOT1dOJyxcbiAgTE9XID0gJ0xPVycsXG4gIE1FRElVTSA9ICdNRURJVU0nLFxuICBISUdIID0gJ0hJR0gnLFxuICBDUklUSUNBTCA9ICdDUklUSUNBTCcsXG59XG5cbi8qKlxuICogRW51bSBmb3IgU2Nhbm5lcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICovXG5leHBvcnQgZW51bSBTY2FubmVycyB7XG4gIFZVTE4gPSAndnVsbicsXG4gIENPTkZJRyA9ICdjb25maWcnLFxuICBTRUNSRVQgPSAnc2VjcmV0JyxcbiAgTElDRU5TRSA9ICdsaWNlbnNlJyxcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gKlxuICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvdGFyZ2V0L2NvbnRhaW5lcl9pbWFnZS8jY29udGFpbmVyLWltYWdlLW1ldGFkYXRhXG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlQ29uZmlnU2Nhbm5lcnMge1xuICBDT05GSUcgPSAnY29uZmlnJyxcbiAgU0VDUkVUID0gJ3NlY3JldCcsXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dCB0byBDbG91ZFdhdGNoIExvZ3MgbG9nIGdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkV2F0Y2hMb2dzT3V0cHV0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGxvZyBncm91cCB0byBvdXRwdXQgc2NhbiBsb2dzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXA6IElMb2dHcm91cDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBvdXRwdXQgb2YgdGhlIHNjYW4gbG9ncy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNjYW5Mb2dzT3V0cHV0IHtcbiAgLyoqXG4gICAqIFNjYW4gbG9ncyBvdXRwdXQgdG8gQ2xvdWRXYXRjaCBMb2dzIGxvZyBncm91cC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xvdWRXYXRjaExvZ3Mob3B0aW9uczogQ2xvdWRXYXRjaExvZ3NPdXRwdXRQcm9wcyk6IFNjYW5Mb2dzT3V0cHV0IHtcbiAgICByZXR1cm4gbmV3IENsb3VkV2F0Y2hMb2dzT3V0cHV0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIGZvciBzY2FuIGxvZ3MuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmluZChncmFudGVlOiBJR3JhbnRhYmxlKTogU2NhbkxvZ3NPdXRwdXRPcHRpb25zO1xufVxuXG5jbGFzcyBDbG91ZFdhdGNoTG9nc091dHB1dCBleHRlbmRzIFNjYW5Mb2dzT3V0cHV0IHtcbiAgLyoqXG4gICAqIFRoZSBsb2cgZ3JvdXAgdG8gb3V0cHV0IHNjYW4gbG9ncy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nR3JvdXA6IElMb2dHcm91cDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDbG91ZFdhdGNoTG9nc091dHB1dFByb3BzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubG9nR3JvdXAgPSBvcHRpb25zLmxvZ0dyb3VwO1xuICB9XG5cbiAgcHVibGljIGJpbmQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IENsb3VkV2F0Y2hMb2dzT3V0cHV0T3B0aW9ucyB7XG4gICAgLy8gTW9zdCBMYW1iZGFzIGFyZSBncmFudGVkIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSBhbmQgY2FuIHdyaXRlIHRvIGFueSBDbG91ZFdhdGNoIExvZ3MuXG4gICAgLy8gSG93ZXZlciwganVzdCBpbiBjYXNlIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSBpcyBub3QgZ3JhbnRlZCwgYWxsb3cgd3JpdGluZyB0byBDbG91ZFdhdGNoIExvZ3MuXG4gICAgdGhpcy5sb2dHcm91cC5ncmFudFdyaXRlKGdyYW50ZWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFNjYW5Mb2dzT3V0cHV0VHlwZS5DTE9VRFdBVENIX0xPR1MsXG4gICAgICBsb2dHcm91cE5hbWU6IHRoaXMubG9nR3JvdXAubG9nR3JvdXBOYW1lLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcyB7XG4gIC8qKlxuICAgKiBJbWFnZSBVUkkgZm9yIHNjYW4gdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VVcmk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwb3NpdG9yeSBpbmNsdWRpbmcgdGhlIGltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqXG4gICAqIEJlY2F1c2Ugb2YgZ3JhbnRQdWxsIHRvIEN1c3RvbVJlc291cmNlTGFtYmRhLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogSVJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmZpeGVkL3VuZml4YWJsZSB2dWxuZXJhYmlsaXRpZXMgbWVhbiB0aGF0IHRoZSBwYXRjaCBoYXMgbm90IHlldCBiZWVuIHByb3ZpZGVkIG9uIHRoZWlyIGRpc3RyaWJ1dGlvbi5cbiAgICpcbiAgICogVG8gaGlkZSB1bmZpeGVkL3VuZml4YWJsZSB2dWxuZXJhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgLS1pZ25vcmUtdW5maXhlZGAgZmxhZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyN1bmZpeGVkLXZ1bG5lcmFiaWxpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlVW5maXhlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldmVyaXR5IFNlbGVjdGlvblxuICAgKlxuICAgKiBUaGUgc2V2ZXJpdHkgaXMgdGFrZW4gZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzb3VyY2Ugc2luY2UgdGhlIHNldmVyaXR5IGZyb20gdmVuZG9ycyBpcyBtb3JlIGFjY3VyYXRlLlxuICAgKiBVc2luZyBDVkUtMjAyMy0wNDY0IGFzIGFuIGV4YW1wbGUsIHdoaWxlIGl0IGlzIHJhdGVkIGFzIFwiSElHSFwiIGluIE5WRCwgUmVkIEhhdCBoYXMgbWFya2VkIGl0cyAnSW1wYWN0JyBhcyBcIkxvd1wiLiBBcyBhIHJlc3VsdCwgVHJpdnkgd2lsbCBkaXNwbGF5IGl0IGFzIFwiTG93XCIuXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBkZXBlbmRzIG9uIHRoZSBjb21waWxlIG9wdGlvbiwgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgZXRjLiBOVkQgZG9lc24ndCBrbm93IGhvdyB0aGUgdmVuZG9yIGRpc3RyaWJ1dGVzIHRoZSBzb2Z0d2FyZS5cbiAgICogUmVkIEhhdCBldmFsdWF0ZXMgdGhlIHNldmVyaXR5IG1vcmUgYWNjdXJhdGVseS4gVGhhdCdzIHdoeSBUcml2eSBwcmVmZXJzIHZlbmRvciBzY29yZXMgb3ZlciBOVkQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIGBDUklUSUNBTGAgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRCwgYnV0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgVHJpdnkgaXMgXCJDUklUSUNBTCxISUdILE1FRElVTSxMT1csVU5LTk9XTlwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbU2V2ZXJpdHkuQ1JJVElDQUxdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jc2V2ZXJpdHktc2VsZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eT86IFNldmVyaXR5W107XG5cbiAgLyoqXG4gICAqIEVuYWJsZS9EaXNhYmxlIFNjYW5uZXJzXG4gICAqXG4gICAqIFlvdSBjYW4gZW5hYmxlL2Rpc2FibGUgc2Nhbm5lcnMgd2l0aCB0aGUgYHNjYW5uZXJzYC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGNvbnRhaW5lciBpbWFnZSBzY2FubmluZyBlbmFibGVzIHZ1bG5lcmFiaWxpdHkgKFZVTE4pIGFuZCBzZWNyZXQgc2Nhbm5lcnMgKFNFQ1JFVCkgYnkgZGVmYXVsdC5cbiAgICogSWYgeW91IGRvbid0IG5lZWQgc2VjcmV0IHNjYW5uaW5nLCBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBTY2FubmVycy5WVUxOIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZWN1cml0eS5WVUxOLFNjYW5uZXJzLlNFQ1JFVF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2VuYWJsZWRpc2FibGUtc2Nhbm5lcnNcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5uZXJzPzogU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRW51bSBmb3IgSW1hZ2VDb25maWdTY2FubmVyc1xuICAgKlxuICAgKiBDb250YWluZXIgaW1hZ2VzIGhhdmUgY29uZmlndXJhdGlvbi4gZG9ja2VyIGluc3BlY3QgYW5kIGBkb2NrZXIgaGlzdG9yeWAgc2hvdyB0aGUgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKiBUcml2eSBzY2FucyB0aGUgY29uZmlndXJhdGlvbiBvZiBjb250YWluZXIgaW1hZ2VzIGZvclxuICAgKlxuICAgKiAtIE1pc2NvbmZpZ3VyYXRpb25zXG4gICAqIC0gU2VjcmV0c1xuICAgKlxuICAgKiBUaGV5IGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LiBZb3UgY2FuIGVuYWJsZSB0aGVtIHdpdGggYGltYWdlQ29uZmlnU2Nhbm5lcnNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM/OiBJbWFnZUNvbmZpZ1NjYW5uZXJzW107XG5cbiAgLyoqXG4gICAqIEV4aXQgQ29kZVxuICAgKlxuICAgKiBVc2UgdGhlIGBleGl0Q29kZWAgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZS5cbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IDAgaWYgeW91IGRvIG5vdCB3YW50IHRvIGV4aXQgZXZlbiB3aGVuIHZ1bG5lcmFiaWxpdGllcyBhcmUgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIDEgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRC4gSW4gdGhlIG9yaWdpbmFsIHRyaXZ5LCBpdCBpcyAwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNleGl0LWNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGl0IG9uIEVPTFxuICAgKlxuICAgKiBTb21ldGltZXMgeW91IG1heSBzdXJwcmlzaW5nbHkgZ2V0IDAgdnVsbmVyYWJpbGl0aWVzIGluIGFuIG9sZCBpbWFnZTpcbiAgICogIC0gRW5hYmxpbmcgLS1pZ25vcmUtdW5maXhlZCBvcHRpb24gd2hpbGUgYWxsIHBhY2thZ2VzIGhhdmUgbm8gZml4ZWQgdmVyc2lvbnMuXG4gICAqICAtIFNjYW5uaW5nIGEgcmF0aGVyIG91dGRhdGVkIE9TIChlLmcuIFVidW50dSAxMC4wNCkuXG4gICAqXG4gICAqIEFuIE9TIGF0IHRoZSBlbmQgb2Ygc2VydmljZS9saWZlIChFT0wpIHVzdWFsbHkgZ2V0cyBpbnRvIHRoaXMgc2l0dWF0aW9uLCB3aGljaCBpcyBkZWZpbml0ZWx5IGZ1bGwgb2YgdnVsbmVyYWJpbGl0aWVzLlxuICAgKiBgZXhpdE9uRW9sYCBjYW4gZmFpbCBzY2FubmluZyBvbiBFT0wgT1Mgd2l0aCBhIG5vbi16ZXJvIGNvZGUuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIDEgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRC4gSW4gdGhlIG9yaWdpbmFsIHRyaXZ5LCBpdCBpcyAwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNleGl0LW9uLWVvbFxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdE9uRW9sPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCeSBGaW5kaW5nIElEc1xuICAgKlxuICAgKiBUaGUgaWdub3JlIHJ1bGVzIHdyaXR0ZW4gdG8gdGhlIC50cml2eWlnbm9yZSBpbiB0cml2eS5cbiAgICogUHV0IGVhY2ggbGluZSB5b3Ugd3JpdGUgaW4gdGhlIGZpbGUgaW50byBvbmUgZWxlbWVudCBvZiB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgICAkIGNhdCAudHJpdnlpZ25vcmVcbiAgICogICAgICMgQWNjZXB0IHRoZSByaXNrXG4gICAqICAgICBDVkUtMjAxOC0xNDYxOFxuICAgKlxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2sgdW50aWwgMjAyMy0wMS0wMVxuICAgKiAgICAgQ1ZFLTIwMTktMTQ2OTcgZXhwOjIwMjMtMDEtMDFcbiAgICpcbiAgICogICAgICMgTm8gaW1wYWN0IGluIG91ciBzZXR0aW5nc1xuICAgKiAgICAgQ1ZFLTIwMTktMTU0M1xuICAgKlxuICAgKiAgICAgIyBJZ25vcmUgbWlzY29uZmlndXJhdGlvbnNcbiAgICogICAgIEFWRC1EUy0wMDAyXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBzZWNyZXRzXG4gICAqICAgICBnZW5lcmljLXVud2FudGVkLXJ1bGVcbiAgICogICAgIGF3cy1hY2NvdW50LWlkXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vZmlsdGVyaW5nLyN0cml2eWlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVtb3J5IFNpemUgKE1CKSBmb3IgU2Nhbm5lciBMYW1iZGFcbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gYDMwMDhgIGFuZCBgMTAyNDBgLlxuICAgKlxuICAgKiBJZiB0aGlzIENvbnN0cnVjdCBleGVjdXRpb24gdGVybWluYXRlcyBhYm5vcm1hbGx5IGR1ZSB0byBTSUdLSUxMLCB0cnkgYSBsYXJnZXIgc2l6ZS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZSAoYDMwMDhgIE1CKSBpcyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAzMDA4XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FuIEltYWdlIG9uIGEgc3BlY2lmaWMgQXJjaGl0ZWN0dXJlIGFuZCBPU1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBUcml2eSBsb2FkcyBhbiBpbWFnZSBvbiBhIGBsaW51eC9hbWQ2NGAgbWFjaGluZS5cbiAgICpcbiAgICogVG8gY3VzdG9taXplIHRoaXMsIHBhc3MgYSBgcGxhdGZvcm1gIGFyZ3VtZW50IGluIHRoZSBmb3JtYXQgT1MvQXJjaGl0ZWN0dXJlIGZvciB0aGUgaW1hZ2UsIHN1Y2ggYXMgYGxpbnV4L2FybTY0YFxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbW92YWwgcG9saWN5IHRvIGFwcGx5IHRvIFNjYW5uZXIgTGFtYmRhJ3MgZGVmYXVsdCBsb2cgZ3JvdXBcbiAgICpcbiAgICogSWYgeW91IHVzZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHN0YWNrLCB5b3UgY2Fubm90IHNldCBkaWZmZXJlbnQgcmVtb3ZhbCBwb2xpY2llcyBmb3IgdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKiBTZWUgYE5vdGVzYCBzZWN0aW9uIGluIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTY2FubmVyIExhbWJkYSBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cChgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCkuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXlzIGxvZyBldmVudHMgYXJlIGtlcHQgaW4gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZXRlbnRpb24gZGF5cyBmb3IgdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKiBTZWUgYE5vdGVzYCBzZWN0aW9uIGluIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTY2FubmVyIExhbWJkYSBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cChgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCkgYW5kIGxvZyBldmVudHMgbmV2ZXIgZXhwaXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cz86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyBvdXRwdXRcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc2NhbiBsb2dzIGFyZSBvdXRwdXQgdG8gZGVmYXVsdCBsb2cgZ3JvdXAgY3JlYXRlZCBieSBTY2FubmVyIExhbWJkYS5cbiAgICpcbiAgICogU3BlY2lmeSB0aGlzIGlmIHlvdSB3YW50IHRvIHNlbmQgc2NhbiBsb2dzIHRvIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKlxuICAgKiBDdXJyZW50bHksIG9ubHkgYGNsb3VkV2F0Y2hMb2dzYCBpcyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbiBsb2dzIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhbkxvZ3NPdXRwdXQ/OiBTY2FuTG9nc091dHB1dDtcblxuICAvKipcbiAgICogU3VwcHJlc3MgZXJyb3JzIGR1cmluZyByb2xsYmFjayBzY2FubmVyIExhbWJkYSBleGVjdXRpb25cbiAgICpcbiAgICogV2hlbiBpbWFnZSBzY2FubmluZyBmYWlscywgQ2xvdWRGb3JtYXRpb24gdHJpZ2dlcnMgYSByb2xsYmFjayBhbmQgZXhlY3V0ZXMgdGhlIHByZXZpb3VzXG4gICAqIHZlcnNpb24gb2YgdGhlIHNjYW5uZXIgTGFtYmRhLiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mXG4gICAqIHRoZSBzY2FubmVyIExhbWJkYSB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciwgZXZlbiBpZiB0aGUgaW1hZ2Ugc2Nhbm5pbmcgZm9yIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiBUaGlzIGFsbG93cyB0aGUgcm9sbGJhY2sgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCBhdm9pZGluZyBST0xMQkFDS19GQUlMRUQgc3RhdGVcbiAgICogd2hlbiBpbWFnZSBzY2FubmluZyBmYWlsdXJlcyBvY2N1ci5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlXG5jb25zdCBERUZBVUxUX01FTU9SWV9TSVpFID0gMzAwODtcblxuZXhwb3J0IGNsYXNzIEltYWdlU2Nhbm5lcldpdGhUcml2eSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZW1vcnlTaXplICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1lbW9yeVNpemUpICYmXG4gICAgICAocHJvcHMubWVtb3J5U2l6ZSA8IDMwMDggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gXFxgMzAwOFxcYCBhbmQgXFxgMTAyNDBcXGAgZm9yIFxcYG1lbW9yeVNpemVcXGAsIGdvdCAke3Byb3BzLm1lbW9yeVNpemV9LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYVB1cnBvc2UgPSAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnlDdXN0b21SZXNvdXJjZUxhbWJkYSc7XG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2VMYW1iZGEgPSBuZXcgU2luZ2xldG9uRnVuY3Rpb24odGhpcywgJ0N1c3RvbVJlc291cmNlTGFtYmRhJywge1xuICAgICAgdXVpZDogJzQ3MGI2MzQzLWQyNjctZjc1My0yMjZjLTFlOTlmMDlmMzE5YScsXG4gICAgICBsYW1iZGFQdXJwb3NlLFxuICAgICAgcnVudGltZTogUnVudGltZS5GUk9NX0lNQUdFLFxuICAgICAgaGFuZGxlcjogSGFuZGxlci5GUk9NX0lNQUdFLFxuICAgICAgY29kZTogQXNzZXRDb2RlLmZyb21Bc3NldEltYWdlKGpvaW4oX19kaXJuYW1lLCAnLi4vYXNzZXRzL2xhbWJkYScpLCB7XG4gICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5MSU5VWF9BUk02NCxcbiAgICAgICAgLy8gZXhjbHVkZSBub2RlX21vZHVsZXNcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgbmF0aXZlIGJpbmFyeSBvZiB0aGUgaW5zdGFsbGVkIGVzYnVpbGQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGNwdSBhcmNoaXRlY3R1cmVcbiAgICAgICAgLy8gYW5kIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbWFnZSBhc3NldCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICAgICAgICBleGNsdWRlOiBbJ25vZGVfbW9kdWxlcyddLFxuICAgICAgfSksXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDkwMCksXG4gICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyBERUZBVUxUX01FTU9SWV9TSVpFLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IFNpemUuZ2liaWJ5dGVzKDEwKSwgLy8gZm9yIGNhc2VzIHRoYXQgbmVlZCB0byB1cGRhdGUgdHJpdnkgREI6IC90bXAvdHJpdnkvZGIvdHJpdnkuZGJcbiAgICB9KTtcbiAgICBwcm9wcy5yZXBvc2l0b3J5LmdyYW50UHVsbChjdXN0b21SZXNvdXJjZUxhbWJkYSk7XG5cbiAgICAvLyBHcmFudCBDbG91ZEZvcm1hdGlvbiBEZXNjcmliZVN0YWNrcyBwZXJtaXNzaW9uIGZvciByb2xsYmFjayBkZXRlY3Rpb24gd2hlbiBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjayBpcyBlbmFibGVkXG4gICAgY29uc3Qgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2sgPSBwcm9wcy5zdXBwcmVzc0Vycm9yT25Sb2xsYmFjayA/PyB0cnVlO1xuICAgIGlmIChzdXBwcmVzc0Vycm9yT25Sb2xsYmFjaykge1xuICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGEuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbU3RhY2sub2YodGhpcykuc3RhY2tJZF0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYUxvZ0dyb3VwQ29uc3RydWN0TmFtZSA9IGBEZWZhdWx0TG9nR3JvdXBGb3Ike2xhbWJkYVB1cnBvc2V9YDtcblxuICAgIHRoaXMudmFsaWRhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zKGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSB8fCBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzKSB7XG4gICAgICB0aGlzLmVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgICAgIGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGN1c3RvbVJlc291cmNlTGFtYmRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvcGVydGllczogU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMgPSB7XG4gICAgICBhZGRyOiB0aGlzLm5vZGUuYWRkcixcbiAgICAgIGltYWdlVXJpOiBwcm9wcy5pbWFnZVVyaSxcbiAgICAgIGlnbm9yZVVuZml4ZWQ6IFN0cmluZyhwcm9wcy5pZ25vcmVVbmZpeGVkID8/IGZhbHNlKSxcbiAgICAgIHNldmVyaXR5OiBwcm9wcy5zZXZlcml0eSA/PyBbU2V2ZXJpdHkuQ1JJVElDQUxdLFxuICAgICAgc2Nhbm5lcnM6IHByb3BzLnNjYW5uZXJzID8/IFtdLFxuICAgICAgaW1hZ2VDb25maWdTY2FubmVyczogcHJvcHMuaW1hZ2VDb25maWdTY2FubmVycyA/PyBbXSxcbiAgICAgIGV4aXRDb2RlOiBwcm9wcy5leGl0Q29kZSA/PyAxLFxuICAgICAgZXhpdE9uRW9sOiBwcm9wcy5leGl0T25Fb2wgPz8gMSxcbiAgICAgIHRyaXZ5SWdub3JlOiBwcm9wcy50cml2eUlnbm9yZSA/PyBbXSxcbiAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSA/PyAnJyxcbiAgICAgIG91dHB1dDogcHJvcHMuc2NhbkxvZ3NPdXRwdXQ/LmJpbmQoY3VzdG9tUmVzb3VyY2VMYW1iZGEpLFxuICAgICAgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2s6IFN0cmluZyhzdXBwcmVzc0Vycm9yT25Sb2xsYmFjayksXG4gICAgfTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkltYWdlU2Nhbm5lcldpdGhUcml2eScsXG4gICAgICBwcm9wZXJ0aWVzOiBpbWFnZVNjYW5uZXJQcm9wZXJ0aWVzLFxuICAgICAgc2VydmljZVRva2VuOiBpbWFnZVNjYW5uZXJQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgc3BlY2lmaWVkIGRlZmF1bHQgbG9nIGdyb3VwIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGZvciBleGlzdGluZyBkZWZhdWx0IGxvZyBncm91cC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zKFxuICAgIGxvZ0dyb3VwQ29uc3RydWN0TmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZChsb2dHcm91cENvbnN0cnVjdE5hbWUpIGFzXG4gICAgICB8IExvZ0dyb3VwXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCBjZm5Mb2dHcm91cCA9IGV4aXN0aW5nLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkxvZ0dyb3VwO1xuXG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNTYW1lUmVzb3VyY2VEZWxldGlvbkJlaGF2aW9yKFxuICAgICAgICBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5LFxuICAgICAgICBjZm5Mb2dHcm91cC5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5LFxuICAgICAgKSB8fFxuICAgICAgY2ZuTG9nR3JvdXAucmV0ZW50aW9uSW5EYXlzICE9PSBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzXG4gICAgKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5OmR1cGxpY2F0ZUxhbWJkYURlZmF1bHRMb2dHcm91cE9wdGlvbnMnLFxuICAgICAgICBcIllvdSBoYXZlIHRvIHNldCB0aGUgc2FtZSB2YWx1ZXMgZm9yICdkZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5JyBhbmQgJ2RlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMnIGZvciBlYWNoIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgaW4gdGhlIHNhbWUgc3RhY2suXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cCBmb3IgU2Nhbm5lciBMYW1iZGEgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGV4aXN0cyBpbiBjaGlsZHJlbiBvZiB0aGUgc3RhY2sgY29uc3RydWN0LlxuICAgKiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgaXQgY3JlYXRlcyB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGFzIGEgY2hpbGQgb2YgdGhlIHN0YWNrIGNvbnN0cnVjdC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlTGFtYmRhRGVmYXVsdExvZ0dyb3VwKFxuICAgIHNpbmdsZXRvbkZ1bmN0aW9uOiBTaW5nbGV0b25GdW5jdGlvbixcbiAgICBsb2dHcm91cENvbnN0cnVjdE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMsXG4gICk6IExvZ0dyb3VwIHtcbiAgICBjb25zdCBleGlzdGluZyA9IFN0YWNrLm9mKHRoaXMpLm5vZGUudHJ5RmluZENoaWxkKGxvZ0dyb3VwQ29uc3RydWN0TmFtZSkgYXNcbiAgICAgIHwgTG9nR3JvdXBcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTG9nR3JvdXAoU3RhY2sub2YodGhpcyksIGxvZ0dyb3VwQ29uc3RydWN0TmFtZSwge1xuICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtzaW5nbGV0b25GdW5jdGlvbi5mdW5jdGlvbk5hbWV9YCxcbiAgICAgIHJldGVudGlvbjogcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cyxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLmRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3ksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZVJlc291cmNlRGVsZXRpb25CZWhhdmlvcihcbiAgICByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeSxcbiAgICBkZWxldGlvblBvbGljeT86IENmbkRlbGV0aW9uUG9saWN5LFxuICApOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHJlbW92YWxQb2xpY3kpIHtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5SRVRBSU46XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gQ2ZuRGVsZXRpb25Qb2xpY3kuUkVUQUlOO1xuICAgICAgY2FzZSBSZW1vdmFsUG9saWN5LlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlNOQVBTSE9UO1xuICAgICAgY2FzZSBSZW1vdmFsUG9saWN5LlJFVEFJTl9PTl9VUERBVEVfT1JfREVMRVRFOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlJFVEFJTl9FWENFUFRfT05fQ1JFQVRFO1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlbW92YWxQb2xpY3kgc2F0aXNmaWVzIG5ldmVyO1xuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -85,7 +85,7 @@
85
85
  "publishConfig": {
86
86
  "access": "public"
87
87
  },
88
- "version": "2.1.4",
88
+ "version": "2.1.5",
89
89
  "types": "lib/index.d.ts",
90
90
  "stability": "stable",
91
91
  "jsii": {