@aws-mdaa/datawarehouse 1.5.0 → 1.6.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.
@@ -2346,10 +2346,6 @@
2346
2346
  "additionalProperties": false,
2347
2347
  "type": "object"
2348
2348
  },
2349
- "Record<string,string>": {
2350
- "additionalProperties": false,
2351
- "type": "object"
2352
- },
2353
2349
  "ResourceEnvironment": {
2354
2350
  "additionalProperties": false,
2355
2351
  "description": "Represents the environment a given resource lives in.\nUsed as the return value for the `IResource.env` property.",
@@ -2938,9 +2934,13 @@
2938
2934
  "description": "Number of days automated snapshots are retained (1-35). Set to 0 to disable.\n\nUse cases: Backup management; Point-in-time recovery; Data protection compliance\n\nAWS: Redshift automated snapshot retention\n\nValidation: Optional; integer 0-35",
2939
2935
  "type": "number"
2940
2936
  },
2937
+ "backupRegion": {
2938
+ "description": "Target region for cross-region snapshot copies. When set, enables cross-region snapshot copy to this region.\n\nUse cases: Disaster recovery; Cross-region backup; Business continuity\n\nAWS: Redshift snapshot copy destination region\n\nValidation: Optional; valid AWS region string, must differ from the deployment region",
2939
+ "type": "string"
2940
+ },
2941
2941
  "clusterPort": {
2942
2942
  "default": 5440,
2943
- "description": "TCP port for client connections to the cluster.\n\nUse cases: Custom port configuration; Network security; Port standardization\n\nAWS: Redshift cluster listening port\n\nValidation: Optional; valid port number",
2943
+ "description": "TCP port for client connections to the cluster.\n\nUse cases: Custom port configuration; Network security; Port standardization\n\nAWS: Redshift cluster listening port\n\nValidation: Optional; valid port number; must be in range 5431-5455 or 8191-8215 when multiAz is true",
2944
2944
  "type": "number"
2945
2945
  },
2946
2946
  "createWarehouseBucket": {
@@ -2989,6 +2989,10 @@
2989
2989
  },
2990
2990
  "type": "array"
2991
2991
  },
2992
+ "multiAz": {
2993
+ "description": "Enable multi-AZ deployment for high availability.\n\nUse cases: High availability; Fault tolerance; Production deployments\n\nAWS: Redshift multi-AZ deployment\n\nValidation: Optional; boolean. When true, requires: numberOfNodes >= 2, subnetIds in >= 3 AZs,\nclusterPort in range 5431-5455 or 8191-8215, and pause/resume scheduled actions are not supported.",
2994
+ "type": "boolean"
2995
+ },
2992
2996
  "multiNode": {
2993
2997
  "description": "Multi-node cluster flag. When true, creates a multi-node cluster for distributed processing;\nwhen false, creates a single-node cluster for development or small workloads.\n\nUse cases: Cluster architecture selection; Dev vs production deployment; Cost optimization\n\nAWS: Redshift cluster type (single-node or multi-node)\n\nValidation: Optional; boolean",
2994
2998
  "type": "boolean"
@@ -3002,17 +3006,25 @@
3002
3006
  "type": "string"
3003
3007
  },
3004
3008
  "numberOfNodes": {
3005
- "description": "Number of nodes in the Redshift cluster.\n\nUse cases: Cluster sizing; Performance scaling; Cost management\n\nAWS: Redshift cluster node count\n\nValidation: Required; positive integer",
3009
+ "description": "Number of nodes in the Redshift cluster.\n\nUse cases: Cluster sizing; Performance scaling; Cost management\n\nAWS: Redshift cluster node count\n\nValidation: Required; positive integer; must be >= 2 when multiAz is true",
3006
3010
  "type": "number"
3007
3011
  },
3008
3012
  "parameterGroupParams": {
3009
- "$ref": "#/definitions/Record%3Cstring%2Cstring%3E",
3010
- "description": "Additional cluster parameter group parameters for performance tuning.\nSecurity-sensitive values are automatically overridden for compliance (e.g., SSL enforcement).\n\nUse cases: Performance tuning; Custom cluster configuration; Workload optimization\n\nAWS: Redshift parameter group parameters\n\nValidation: Optional; string key-value pairs"
3013
+ "additionalProperties": {
3014
+ "type": "string"
3015
+ },
3016
+ "description": "Additional cluster parameter group parameters for performance tuning.\nSecurity-sensitive values are automatically overridden for compliance (e.g., SSL enforcement).\n\nUse cases: Performance tuning; Custom cluster configuration; Workload optimization\n\nAWS: Redshift parameter group parameters\n\nValidation: Optional; string key-value pairs",
3017
+ "type": "object"
3011
3018
  },
3012
3019
  "preferredMaintenanceWindow": {
3013
3020
  "description": "Weekly maintenance window in ddd:hh24:mi-ddd:hh24:mi format (UTC).\nExample: 'Sun:23:45-Mon:00:15'.\n\nUse cases: Maintenance scheduling; Business continuity; Downtime management\n\nAWS: Redshift preferred maintenance window\n\nValidation: Required; valid time window format",
3014
3021
  "type": "string"
3015
3022
  },
3023
+ "publicAccessBlockManagedExternally": {
3024
+ "default": false,
3025
+ "description": "When true, omits the explicit blockPublicAccess setting on S3 buckets so CDK does not emit\na PutBucketPublicAccessBlock API call. Use when public access block is managed externally\n(e.g., by AWS account-level settings and/or SCPs that deny s3:PutBucketPublicAccessBlock).\n\nUse cases: SCP-restricted environments; Externally managed public access block;\nOrganizations enforcing account-level S3 Block Public Access\n\nAWS: S3 PutBucketPublicAccessBlock\n\nValidation: Optional; boolean; default false",
3026
+ "type": "boolean"
3027
+ },
3016
3028
  "redshiftManageMasterPassword": {
3017
3029
  "type": "boolean"
3018
3030
  },
@@ -3056,10 +3068,13 @@
3056
3068
  },
3057
3069
  "snapshotOwnerAccount": {
3058
3070
  "description": "ownerAccount Refers to snapshot owner account. Applicable if restoring the cluster from snapshot and snapshot belongs to another account\nOptional - By default, snapshots are searched within current account",
3059
- "type": "number"
3071
+ "type": [
3072
+ "string",
3073
+ "number"
3074
+ ]
3060
3075
  },
3061
3076
  "subnetIds": {
3062
- "description": "Subnet IDs for Redshift cluster node placement. For automatic cluster relocation,\nspecify at least one subnet per AZ.\n\nUse cases: Multi-AZ placement; Subnet-specific deployment; Cluster relocation support\n\nAWS: VPC subnets for Redshift subnet group\n\nValidation: Required; array of valid subnet IDs in the specified VPC",
3077
+ "description": "Subnet IDs for Redshift cluster node placement. For automatic cluster relocation,\nspecify at least one subnet per AZ.\n\nUse cases: Multi-AZ placement; Subnet-specific deployment; Cluster relocation support\n\nAWS: VPC subnets for Redshift subnet group\n\nValidation: Required; array of valid subnet IDs in the specified VPC; must contain >= 3 subnets in different AZs when multiAz is true",
3063
3078
  "items": {
3064
3079
  "type": "string"
3065
3080
  },
@@ -90,7 +90,7 @@ export interface DataWarehouseConfigContents extends MdaaBaseConfigContents {
90
90
  *
91
91
  * AWS: VPC subnets for Redshift subnet group
92
92
  *
93
- * Validation: Required; array of valid subnet IDs in the specified VPC
93
+ * Validation: Required; array of valid subnet IDs in the specified VPC; must contain >= 3 subnets in different AZs when multiAz is true
94
94
  */
95
95
  readonly subnetIds: string[];
96
96
  /**
@@ -124,7 +124,7 @@ export interface DataWarehouseConfigContents extends MdaaBaseConfigContents {
124
124
  *
125
125
  * AWS: Redshift cluster node count
126
126
  *
127
- * Validation: Required; positive integer
127
+ * Validation: Required; positive integer; must be >= 2 when multiAz is true
128
128
  */
129
129
  readonly numberOfNodes: number;
130
130
  /**
@@ -145,7 +145,7 @@ export interface DataWarehouseConfigContents extends MdaaBaseConfigContents {
145
145
  *
146
146
  * AWS: Redshift cluster listening port
147
147
  *
148
- * Validation: Optional; valid port number
148
+ * Validation: Optional; valid port number; must be in range 5431-5455 or 8191-8215 when multiAz is true
149
149
  * @default 5440
150
150
  */
151
151
  readonly clusterPort?: number;
@@ -181,7 +181,9 @@ export interface DataWarehouseConfigContents extends MdaaBaseConfigContents {
181
181
  *
182
182
  * Validation: Optional; string key-value pairs
183
183
  */
184
- readonly parameterGroupParams?: Record<string, string>;
184
+ readonly parameterGroupParams?: {
185
+ [key: string]: string;
186
+ };
185
187
  /**
186
188
  * Workload management (WLM) configuration for query queue management and resource allocation.
187
189
  *
@@ -285,8 +287,43 @@ export interface DataWarehouseConfigContents extends MdaaBaseConfigContents {
285
287
  * ownerAccount Refers to snapshot owner account. Applicable if restoring the cluster from snapshot and snapshot belongs to another account
286
288
  * Optional - By default, snapshots are searched within current account
287
289
  */
288
- readonly snapshotOwnerAccount?: number;
290
+ readonly snapshotOwnerAccount?: string | number;
289
291
  readonly redshiftManageMasterPassword?: boolean;
292
+ /**
293
+ * Enable multi-AZ deployment for high availability.
294
+ *
295
+ * Use cases: High availability; Fault tolerance; Production deployments
296
+ *
297
+ * AWS: Redshift multi-AZ deployment
298
+ *
299
+ * Validation: Optional; boolean. When true, requires: numberOfNodes >= 2, subnetIds in >= 3 AZs,
300
+ * clusterPort in range 5431-5455 or 8191-8215, and pause/resume scheduled actions are not supported.
301
+ */
302
+ readonly multiAz?: boolean;
303
+ /**
304
+ * Target region for cross-region snapshot copies. When set, enables cross-region snapshot copy to this region.
305
+ *
306
+ * Use cases: Disaster recovery; Cross-region backup; Business continuity
307
+ *
308
+ * AWS: Redshift snapshot copy destination region
309
+ *
310
+ * Validation: Optional; valid AWS region string, must differ from the deployment region
311
+ */
312
+ readonly backupRegion?: string;
313
+ /**
314
+ * When true, omits the explicit blockPublicAccess setting on S3 buckets so CDK does not emit
315
+ * a PutBucketPublicAccessBlock API call. Use when public access block is managed externally
316
+ * (e.g., by AWS account-level settings and/or SCPs that deny s3:PutBucketPublicAccessBlock).
317
+ *
318
+ * Use cases: SCP-restricted environments; Externally managed public access block;
319
+ * Organizations enforcing account-level S3 Block Public Access
320
+ *
321
+ * AWS: S3 PutBucketPublicAccessBlock
322
+ *
323
+ * Validation: Optional; boolean; default false
324
+ * @default false
325
+ */
326
+ readonly publicAccessBlockManagedExternally?: boolean;
290
327
  }
291
328
  export declare class DataWarehouseConfigParser extends MdaaAppConfigParser<DataWarehouseConfigContents> {
292
329
  readonly adminUsername: string;
@@ -308,7 +345,9 @@ export declare class DataWarehouseConfigParser extends MdaaAppConfigParser<DataW
308
345
  ipv4?: string[];
309
346
  sg?: string[];
310
347
  };
311
- readonly parameterGroupParams: Record<string, string>;
348
+ readonly parameterGroupParams: {
349
+ [key: string]: string;
350
+ };
312
351
  readonly workloadManagement: ConfigurationElement[];
313
352
  readonly additionalBucketKmsKeyArns?: string[];
314
353
  static readonly defaultClusterPort = 5440;
@@ -318,7 +357,10 @@ export declare class DataWarehouseConfigParser extends MdaaAppConfigParser<DataW
318
357
  readonly eventNotifications?: EventNotificationsProps;
319
358
  readonly dbName?: string;
320
359
  readonly snapshotIdentifier?: string;
321
- readonly snapshotOwnerAccount?: number;
360
+ readonly snapshotOwnerAccount?: string;
322
361
  readonly redshiftManageMasterPassword?: boolean;
362
+ readonly multiAz?: boolean;
363
+ readonly backupRegion?: string;
364
+ readonly publicAccessBlockManagedExternally?: boolean;
323
365
  constructor(stack: Stack, props: MdaaAppConfigParserProps);
324
366
  }
@@ -39,10 +39,15 @@ class DataWarehouseConfigParser extends app_1.MdaaAppConfigParser {
39
39
  this.eventNotifications = this.configContents.eventNotifications;
40
40
  this.dbName = this.configContents.dbName;
41
41
  this.snapshotIdentifier = this.configContents.snapshotIdentifier;
42
- this.snapshotOwnerAccount = this.configContents.snapshotOwnerAccount;
42
+ this.snapshotOwnerAccount = this.configContents.snapshotOwnerAccount
43
+ ? String(this.configContents.snapshotOwnerAccount)
44
+ : undefined;
43
45
  this.redshiftManageMasterPassword = this.configContents.redshiftManageMasterPassword;
46
+ this.multiAz = this.configContents.multiAz;
47
+ this.backupRegion = this.configContents.backupRegion;
48
+ this.publicAccessBlockManagedExternally = this.configContents.publicAccessBlockManagedExternally;
44
49
  }
45
50
  }
46
51
  exports.DataWarehouseConfigParser = DataWarehouseConfigParser;
47
52
  DataWarehouseConfigParser.defaultClusterPort = 5440;
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXdhcmVob3VzZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkYXRhd2FyZWhvdXNlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFFSCx1Q0FBc0c7QUFVdEcscURBQXFEO0FBMlJyRCxNQUFhLHlCQUEwQixTQUFRLHlCQUFnRDtJQThCN0YsWUFBWSxLQUFZLEVBQUUsS0FBK0I7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBc0IsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUM7UUFDL0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUM7UUFDNUQsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUM7UUFDaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUM7UUFDekUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVc7WUFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVztZQUNqQyxDQUFDLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQztRQUNqRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0I7WUFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CO1lBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9HLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQztRQUN2RSxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQztRQUN6RixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDO1FBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1FBQ3JFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDO0lBQ3ZGLENBQUM7O0FBaEVILDhEQWlFQztBQTdDd0IsNENBQWtCLEdBQUcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgTWRhYUFwcENvbmZpZ1BhcnNlciwgTWRhYUFwcENvbmZpZ1BhcnNlclByb3BzLCBNZGFhQmFzZUNvbmZpZ0NvbnRlbnRzIH0gZnJvbSAnQGF3cy1tZGFhL2FwcCc7XG5pbXBvcnQge1xuICBGZWRlcmF0aW9uUHJvcHMsXG4gIFNjaGVkdWxlZEFjdGlvblByb3BzLFxuICBEYXRhYmFzZVVzZXJzUHJvcHMsXG4gIEV2ZW50Tm90aWZpY2F0aW9uc1Byb3BzLFxufSBmcm9tICdAYXdzLW1kYWEvZGF0YXdhcmVob3VzZS1sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgTWRhYVJvbGVSZWYgfSBmcm9tICdAYXdzLW1kYWEvaWFtLXJvbGUtaGVscGVyJztcbmltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ2Fqdic7XG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNvbmZpZ1NjaGVtYSBmcm9tICcuL2NvbmZpZy1zY2hlbWEuanNvbic7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRWxlbWVudCB9IGZyb20gJ0Bhd3MtbWRhYS9jb25maWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFXYXJlaG91c2VDb25maWdDb250ZW50cyBleHRlbmRzIE1kYWFCYXNlQ29uZmlnQ29udGVudHMge1xuICAvKipcbiAgICogQWRtaW4gdXNlcm5hbWUgZm9yIHRoZSBSZWRzaGlmdCBjbHVzdGVyLiBBIHNlY3JldCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmb3IgdGhlIHBhc3N3b3JkLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IENsdXN0ZXIgYWRtaW5pc3RyYXRpb247IERhdGFiYXNlIG1hbmFnZW1lbnQ7IEluaXRpYWwgdXNlciBwcm92aXNpb25pbmdcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBjbHVzdGVyIG1hc3RlciB1c2VybmFtZVxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgdmFsaWQgUmVkc2hpZnQgdXNlcm5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGFkbWluVXNlcm5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERheXMgYmV0d2VlbiBhdXRvbWF0aWMgYWRtaW4gcGFzc3dvcmQgcm90YXRpb25zIHZpYSBTZWNyZXRzIE1hbmFnZXIuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQXV0b21hdGVkIGNyZWRlbnRpYWwgcm90YXRpb247IFNlY3VyaXR5IGNvbXBsaWFuY2U7IFBhc3N3b3JkIHBvbGljeSBlbmZvcmNlbWVudFxuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IGFkbWluIHBhc3N3b3JkIHJvdGF0aW9uIHZpYSBTZWNyZXRzIE1hbmFnZXJcbiAgICpcbiAgICogVmFsaWRhdGlvbjogUmVxdWlyZWQ7IHBvc2l0aXZlIGludGVnZXJcbiAgICovXG4gIHJlYWRvbmx5IGFkbWluUGFzc3dvcmRSb3RhdGlvbkRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFNBTUwgb3IgT0lEQyBmZWRlcmF0aW9uIGNvbmZpZ3VyYXRpb25zIGZvciBmZWRlcmF0ZWQgUmVkc2hpZnQgYWNjZXNzLlxuICAgKiBFYWNoIGZlZGVyYXRpb24gY3JlYXRlcyBhbiBJQU0gcm9sZSB3aXRoIFNBTUwgdHJ1c3QgZm9yIGR5bmFtaWMgY3JlZGVudGlhbCBnZW5lcmF0aW9uXG4gICAqIGFuZCBncm91cC1iYXNlZCBjbHVzdGVyIGFjY2Vzcy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTQU1MIGZlZGVyYXRpb24gc2V0dXA7IFNTTyBpbnRlZ3JhdGlvbjsgRmVkZXJhdGVkIGNsdXN0ZXIgYWNjZXNzXG4gICAqXG4gICAqIEFXUzogSUFNIFNBTUwgaWRlbnRpdHkgcHJvdmlkZXIgcm9sZXMgZm9yIFJlZHNoaWZ0IGZlZGVyYXRlZCBhY2Nlc3NcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGFycmF5IG9mIHZhbGlkIEZlZGVyYXRpb25Qcm9wc1xuICAgKi9cbiAgcmVhZG9ubHkgZmVkZXJhdGlvbnM/OiBGZWRlcmF0aW9uUHJvcHNbXTtcbiAgLyoqXG4gICAqIEFkbWluIHJvbGVzIGdyYW50ZWQgZnVsbCBhY2Nlc3MgdG8gY2x1c3RlciByZXNvdXJjZXMgaW5jbHVkaW5nIEtNUyBrZXlzIGFuZCBTMyBidWNrZXRzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEFkbWluaXN0cmF0aXZlIGFjY2VzcyBjb250cm9sOyBTZWN1cml0eSBtYW5hZ2VtZW50OyBSZXNvdXJjZSBhZG1pbmlzdHJhdGlvblxuICAgKlxuICAgKiBBV1M6IElBTSByb2xlcyB3aXRoIGZ1bGwgUmVkc2hpZnQgY2x1c3RlciBhbmQgcmVzb3VyY2UgYWNjZXNzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyBhcnJheSBvZiB2YWxpZCBNZGFhUm9sZVJlZlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUFkbWluUm9sZXM6IE1kYWFSb2xlUmVmW107XG4gIC8qKlxuICAgKiBSb2xlcyBncmFudGVkIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoZSBkYXRhIHdhcmVob3VzZSBTMyBidWNrZXQgZm9yIGRhdGEgbG9hZGluZy91bmxvYWRpbmcuXG4gICAqXG4gICAqIFVzZSBjYXNlczogRVRMIGRhdGEgbG9hZGluZzsgRGF0YSB1bmxvYWRpbmcgb3BlcmF0aW9uczsgQnVja2V0IGFjY2VzcyBmb3IgYW5hbHl0aWNzXG4gICAqXG4gICAqIEFXUzogSUFNIHJvbGVzIHdpdGggUzMgYnVja2V0IGFjY2VzcyBmb3IgUmVkc2hpZnQgZGF0YSBvcGVyYXRpb25zXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBhcnJheSBvZiB2YWxpZCBNZGFhUm9sZVJlZlxuICAgKi9cbiAgcmVhZG9ubHkgd2FyZWhvdXNlQnVja2V0VXNlclJvbGVzPzogTWRhYVJvbGVSZWZbXTtcbiAgLyoqXG4gICAqIEV4dGVybmFsIGV4ZWN1dGlvbiByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlZHNoaWZ0IGNsdXN0ZXIgZm9yIGNyb3NzLXNlcnZpY2Ugb3BlcmF0aW9ucy5cbiAgICogSWYgYSByb2xlIGFsc28gbmVlZHMgd2FyZWhvdXNlIGJ1Y2tldCBhY2Nlc3MsIGFkZCBpdCB0byB3YXJlaG91c2VCdWNrZXRVc2VyUm9sZXMgZXhwbGljaXRseS5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDcm9zcy1zZXJ2aWNlIGludGVncmF0aW9uczsgRXh0ZXJuYWwgZGF0YSBhY2Nlc3M7IEdsdWUvTGFtYmRhIGludGVncmF0aW9uXG4gICAqXG4gICAqIEFXUzogSUFNIGV4ZWN1dGlvbiByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlZHNoaWZ0IGNsdXN0ZXJcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGFycmF5IG9mIHZhbGlkIE1kYWFSb2xlUmVmOyByb2xlcyBtdXN0IGJlIGFzc3VtYWJsZSBieSBSZWRzaGlmdFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZXM/OiBNZGFhUm9sZVJlZltdO1xuICAvKipcbiAgICogVlBDIElEIGZvciBSZWRzaGlmdCBjbHVzdGVyIGRlcGxveW1lbnQuIFRoZSBjbHVzdGVyIGlzIGRlcGxveWVkIHdpdGhpbiB0aGlzIFZQQ1xuICAgKiB3aXRoIG5ldHdvcmsgYWNjZXNzIGNvbnRyb2xsZWQgYnkgc2VjdXJpdHkgZ3JvdXBzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IE5ldHdvcmsgaXNvbGF0aW9uOyBWUEMtYmFzZWQgZGVwbG95bWVudDsgU2VjdXJlIG5ldHdvcmtpbmdcbiAgICpcbiAgICogQVdTOiBWUEMgZm9yIFJlZHNoaWZ0IGNsdXN0ZXIgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyB2YWxpZCBWUEMgSURcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdWJuZXQgSURzIGZvciBSZWRzaGlmdCBjbHVzdGVyIG5vZGUgcGxhY2VtZW50LiBGb3IgYXV0b21hdGljIGNsdXN0ZXIgcmVsb2NhdGlvbixcbiAgICogc3BlY2lmeSBhdCBsZWFzdCBvbmUgc3VibmV0IHBlciBBWi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBNdWx0aS1BWiBwbGFjZW1lbnQ7IFN1Ym5ldC1zcGVjaWZpYyBkZXBsb3ltZW50OyBDbHVzdGVyIHJlbG9jYXRpb24gc3VwcG9ydFxuICAgKlxuICAgKiBBV1M6IFZQQyBzdWJuZXRzIGZvciBSZWRzaGlmdCBzdWJuZXQgZ3JvdXBcbiAgICpcbiAgICogVmFsaWRhdGlvbjogUmVxdWlyZWQ7IGFycmF5IG9mIHZhbGlkIHN1Ym5ldCBJRHMgaW4gdGhlIHNwZWNpZmllZCBWUENcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldElkczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBpbmdyZXNzIHJ1bGVzIGRlZmluaW5nIGFsbG93ZWQgaW5ib3VuZCBjb25uZWN0aW9ucyB0byB0aGUgY2x1c3RlciBwb3J0LlxuICAgKiBTdXBwb3J0cyBJUHY0IENJRFIgYmxvY2tzIGFuZCBzZWN1cml0eSBncm91cCByZWZlcmVuY2VzLiBBbGwgb3RoZXIgdHJhZmZpYyBpcyBibG9ja2VkLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IE5ldHdvcmsgYWNjZXNzIGNvbnRyb2w7IENsaWVudCBjb25uZWN0aXZpdHk7IFNlY3VyaXR5IGdyb3VwIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBWUEMgc2VjdXJpdHkgZ3JvdXAgaW5ncmVzcyBydWxlcyBmb3IgUmVkc2hpZnQgY2x1c3RlclxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgb2JqZWN0IHdpdGggb3B0aW9uYWwgaXB2NCBhbmQvb3Igc2cgYXJyYXlzXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwSW5ncmVzczogeyBpcHY0Pzogc3RyaW5nW107IHNnPzogc3RyaW5nW10gfTtcbiAgLyoqXG4gICAqIFJlZHNoaWZ0IG5vZGUgdHlwZSBkZXRlcm1pbmluZyBjb21wdXRlIGFuZCBzdG9yYWdlIGNhcGFjaXR5IChlLmcuLCBSQTNfNFhMQVJHRSkuXG4gICAqXG4gICAqIFVzZSBjYXNlczogUGVyZm9ybWFuY2Ugc2l6aW5nOyBDb3N0IG9wdGltaXphdGlvbjsgV29ya2xvYWQtc3BlY2lmaWMgY2FwYWNpdHlcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBub2RlIHR5cGUgKGluc3RhbmNlIHR5cGUpXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyB2YWxpZCBSZWRzaGlmdCBub2RlIHR5cGUgc3RyaW5nXG4gICAqL1xuICByZWFkb25seSBub2RlVHlwZTogc3RyaW5nO1xuICAvKipcbiAgICogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBSZWRzaGlmdCBjbHVzdGVyLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IENsdXN0ZXIgc2l6aW5nOyBQZXJmb3JtYW5jZSBzY2FsaW5nOyBDb3N0IG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBjbHVzdGVyIG5vZGUgY291bnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogUmVxdWlyZWQ7IHBvc2l0aXZlIGludGVnZXJcbiAgICovXG4gIHJlYWRvbmx5IG51bWJlck9mTm9kZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEVuYWJsZSBhdWRpdCBsb2dnaW5nIHRvIGEgZGVkaWNhdGVkIFMzIGJ1Y2tldC4gVGhlIGF1ZGl0IGJ1Y2tldCB1c2VzIFNTRS1TMyBlbmNyeXB0aW9uXG4gICAqIChub3QgS01TKSBkdWUgdG8gUmVkc2hpZnQgYXVkaXQgbG9nZ2luZyByZXF1aXJlbWVudHMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29tcGxpYW5jZSBhdWRpdGluZzsgU2VjdXJpdHkgbW9uaXRvcmluZzsgVXNlciBhY3Rpdml0eSB0cmFja2luZ1xuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IGF1ZGl0IGxvZ2dpbmcgdG8gUzMgd2l0aCBTU0UtUzMgZW5jcnlwdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgYm9vbGVhblxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlQXVkaXRMb2dnaW5nVG9TMzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRDUCBwb3J0IGZvciBjbGllbnQgY29ubmVjdGlvbnMgdG8gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ3VzdG9tIHBvcnQgY29uZmlndXJhdGlvbjsgTmV0d29yayBzZWN1cml0eTsgUG9ydCBzdGFuZGFyZGl6YXRpb25cbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBjbHVzdGVyIGxpc3RlbmluZyBwb3J0XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyB2YWxpZCBwb3J0IG51bWJlclxuICAgKiBAZGVmYXVsdCA1NDQwXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyUG9ydD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE11bHRpLW5vZGUgY2x1c3RlciBmbGFnLiBXaGVuIHRydWUsIGNyZWF0ZXMgYSBtdWx0aS1ub2RlIGNsdXN0ZXIgZm9yIGRpc3RyaWJ1dGVkIHByb2Nlc3Npbmc7XG4gICAqIHdoZW4gZmFsc2UsIGNyZWF0ZXMgYSBzaW5nbGUtbm9kZSBjbHVzdGVyIGZvciBkZXZlbG9wbWVudCBvciBzbWFsbCB3b3JrbG9hZHMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ2x1c3RlciBhcmNoaXRlY3R1cmUgc2VsZWN0aW9uOyBEZXYgdnMgcHJvZHVjdGlvbiBkZXBsb3ltZW50OyBDb3N0IG9wdGltaXphdGlvblxuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IGNsdXN0ZXIgdHlwZSAoc2luZ2xlLW5vZGUgb3IgbXVsdGktbm9kZSlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGJvb2xlYW5cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpTm9kZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXZWVrbHkgbWFpbnRlbmFuY2Ugd2luZG93IGluIGRkZDpoaDI0Om1pLWRkZDpoaDI0Om1pIGZvcm1hdCAoVVRDKS5cbiAgICogRXhhbXBsZTogJ1N1bjoyMzo0NS1Nb246MDA6MTUnLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IE1haW50ZW5hbmNlIHNjaGVkdWxpbmc7IEJ1c2luZXNzIGNvbnRpbnVpdHk7IERvd250aW1lIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBwcmVmZXJyZWQgbWFpbnRlbmFuY2Ugd2luZG93XG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyB2YWxpZCB0aW1lIHdpbmRvdyBmb3JtYXRcbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGNsdXN0ZXIgcGFyYW1ldGVyIGdyb3VwIHBhcmFtZXRlcnMgZm9yIHBlcmZvcm1hbmNlIHR1bmluZy5cbiAgICogU2VjdXJpdHktc2Vuc2l0aXZlIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSBvdmVycmlkZGVuIGZvciBjb21wbGlhbmNlIChlLmcuLCBTU0wgZW5mb3JjZW1lbnQpLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFBlcmZvcm1hbmNlIHR1bmluZzsgQ3VzdG9tIGNsdXN0ZXIgY29uZmlndXJhdGlvbjsgV29ya2xvYWQgb3B0aW1pemF0aW9uXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgcGFyYW1ldGVyIGdyb3VwIHBhcmFtZXRlcnNcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IHN0cmluZyBrZXktdmFsdWUgcGFpcnNcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlckdyb3VwUGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIFdvcmtsb2FkIG1hbmFnZW1lbnQgKFdMTSkgY29uZmlndXJhdGlvbiBmb3IgcXVlcnkgcXVldWUgbWFuYWdlbWVudCBhbmQgcmVzb3VyY2UgYWxsb2NhdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBRdWVyeSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb247IENvbmN1cnJlbmN5IGNvbnRyb2w7IFJlc291cmNlIGFsbG9jYXRpb25cbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBXTE0gY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgYXJyYXkgb2YgdmFsaWQgQ29uZmlndXJhdGlvbkVsZW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtsb2FkTWFuYWdlbWVudD86IENvbmZpZ3VyYXRpb25FbGVtZW50W107XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIEtNUyBrZXkgQVJOcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoZSBjbHVzdGVyIGJ1Y2tldC5cbiAgICogVXNlZnVsIGZvciBhbGxvd2luZyBHbHVlIGpvYnMgb3Igb3RoZXIgc2VydmljZXMgdG8gd3JpdGUgZW5jcnlwdGVkIGRhdGEgdG8gdGhlIHdhcmVob3VzZSBidWNrZXQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ3Jvc3Mtc2VydmljZSBlbmNyeXB0aW9uOyBHbHVlIGpvYiBpbnRlZ3JhdGlvbjsgTXVsdGkta2V5IGJ1Y2tldCBhY2Nlc3NcbiAgICpcbiAgICogQVdTOiBLTVMga2V5IEFSTnMgZm9yIHdhcmVob3VzZSBidWNrZXQgZW5jcnlwdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgYXJyYXkgb2YgdmFsaWQgS01TIGtleSBBUk5zXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsQnVja2V0S21zS2V5QXJucz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogU2NoZWR1bGVkIGFjdGlvbnMgZm9yIGF1dG9tYXRlZCBjbHVzdGVyIHBhdXNlL3Jlc3VtZSBvcGVyYXRpb25zLlxuICAgKiBFYWNoIGFjdGlvbiBzcGVjaWZpZXMgYSB0YXJnZXQgYWN0aW9uIChwYXVzZUNsdXN0ZXIvcmVzdW1lQ2x1c3RlciksIGNyb24gc2NoZWR1bGUsXG4gICAqIGFuZCBhY3RpdmUgdGltZSB3aW5kb3cuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29zdCBvcHRpbWl6YXRpb24gdmlhIHNjaGVkdWxlZCBwYXVzZTsgQXV0b21hdGVkIG9wZXJhdGlvbnM7IEJ1c2luZXNzLWhvdXJzIHNjaGVkdWxpbmdcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBzY2hlZHVsZWQgYWN0aW9ucyBmb3IgY2x1c3RlciBsaWZlY3ljbGUgbWFuYWdlbWVudFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgYXJyYXkgb2YgdmFsaWQgU2NoZWR1bGVkQWN0aW9uUHJvcHNcbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlZEFjdGlvbnM/OiBTY2hlZHVsZWRBY3Rpb25Qcm9wc1tdO1xuICAvKipcbiAgICogRGF0YWJhc2UgdXNlcnMgY3JlYXRlZCBpbiBSZWRzaGlmdCB3aXRoIGNyZWRlbnRpYWxzIHN0b3JlZCBpbiBTZWNyZXRzIE1hbmFnZXIuXG4gICAqIFN1cHBvcnRzIGF1dG9tYXRlZCBzZWNyZXQgcm90YXRpb24gb24gYSBjb25maWd1cmFibGUgY3ljbGUuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQXV0b21hdGVkIHVzZXIgcHJvdmlzaW9uaW5nOyBDcmVkZW50aWFsIG1hbmFnZW1lbnQ7IFNlY3JldCByb3RhdGlvblxuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IGRhdGFiYXNlIHVzZXJzIHdpdGggU2VjcmV0cyBNYW5hZ2VyIGNyZWRlbnRpYWwgc3RvcmFnZSBhbmQgcm90YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGFycmF5IG9mIHZhbGlkIERhdGFiYXNlVXNlcnNQcm9wc1xuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VVc2Vycz86IERhdGFiYXNlVXNlcnNQcm9wc1tdO1xuICAvKipcbiAgICogQ29udHJvbCB3aGV0aGVyIGEgZGVkaWNhdGVkIFMzIGJ1Y2tldCBpcyBjcmVhdGVkIGZvciB3YXJlaG91c2UgZGF0YSBvcGVyYXRpb25zXG4gICAqIChsb2FkaW5nLCB1bmxvYWRpbmcsIGJhY2t1cCkuXG4gICAqXG4gICAqIFVzZSBjYXNlczogU3RvcmFnZSByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhIG9wZXJhdGlvbnM7IEJ1Y2tldCBsaWZlY3ljbGUgY29udHJvbFxuICAgKlxuICAgKiBBV1M6IFMzIGJ1Y2tldCBmb3IgUmVkc2hpZnQgZGF0YSB3YXJlaG91c2Ugb3BlcmF0aW9uc1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgYm9vbGVhblxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVXYXJlaG91c2VCdWNrZXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogTnVtYmVyIG9mIGRheXMgYXV0b21hdGVkIHNuYXBzaG90cyBhcmUgcmV0YWluZWQgKDEtMzUpLiBTZXQgdG8gMCB0byBkaXNhYmxlLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEJhY2t1cCBtYW5hZ2VtZW50OyBQb2ludC1pbi10aW1lIHJlY292ZXJ5OyBEYXRhIHByb3RlY3Rpb24gY29tcGxpYW5jZVxuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IGF1dG9tYXRlZCBzbmFwc2hvdCByZXRlbnRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGludGVnZXIgMC0zNVxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0ZWRTbmFwc2hvdFJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFdmVudCBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbiBmb3IgY2x1c3RlciBhbmQgc2NoZWR1bGVkIGFjdGlvbiBtb25pdG9yaW5nLlxuICAgKiBDb25maWd1cmVzIFNOUyBub3RpZmljYXRpb25zIHdpdGggZW1haWwgZGVsaXZlcnksIHNldmVyaXR5IGZpbHRlcmluZywgYW5kIGV2ZW50IGNhdGVnb3J5IHNlbGVjdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBPcGVyYXRpb25hbCBtb25pdG9yaW5nOyBFdmVudCBhbGVydGluZzsgQ2x1c3RlciBzdGF0dXMgdHJhY2tpbmdcbiAgICpcbiAgICogQVdTOiBTTlMgbm90aWZpY2F0aW9ucyBmb3IgUmVkc2hpZnQgY2x1c3RlciBldmVudHNcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IHZhbGlkIEV2ZW50Tm90aWZpY2F0aW9uc1Byb3BzXG4gICAqL1xuICByZWFkb25seSBldmVudE5vdGlmaWNhdGlvbnM/OiBFdmVudE5vdGlmaWNhdGlvbnNQcm9wcztcbiAgLyoqXG4gICAqIEluaXRpYWwgZGF0YWJhc2UgbmFtZSBjcmVhdGVkIGluIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEN1c3RvbSBkYXRhYmFzZSBuYW1pbmc7IEluaXRpYWwgZGF0YWJhc2Ugc2V0dXBcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBpbml0aWFsIGRhdGFiYXNlXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyB2YWxpZCBkYXRhYmFzZSBuYW1lXG4gICAqIEBkZWZhdWx0IFwiZGVmYXVsdF9kYlwiXG4gICAqL1xuICByZWFkb25seSBkYk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTbmFwc2hvdCBpZGVudGlmaWVyIGZvciBjbHVzdGVyIHJlc3RvcmF0aW9uLiBPbmx5IHByb3ZpZGUgd2hlbiByZXN0b3JpbmcgZnJvbSBhbiBleGlzdGluZyBzbmFwc2hvdC5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBEaXNhc3RlciByZWNvdmVyeTsgRGF0YSBtaWdyYXRpb247IENsdXN0ZXIgcmVzdG9yYXRpb25cbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBzbmFwc2hvdCBmb3IgY2x1c3RlciByZXN0b3JhdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgdmFsaWQgc25hcHNob3QgaWRlbnRpZmllclxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKipcbiAgICogb3duZXJBY2NvdW50IFJlZmVycyB0byBzbmFwc2hvdCBvd25lciBhY2NvdW50LiBBcHBsaWNhYmxlIGlmIHJlc3RvcmluZyB0aGUgY2x1c3RlciBmcm9tIHNuYXBzaG90IGFuZCBzbmFwc2hvdCBiZWxvbmdzIHRvIGFub3RoZXIgYWNjb3VudFxuICAgKiBPcHRpb25hbCAtIEJ5IGRlZmF1bHQsIHNuYXBzaG90cyBhcmUgc2VhcmNoZWQgd2l0aGluIGN1cnJlbnQgYWNjb3VudFxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3RPd25lckFjY291bnQ/OiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgcmVkc2hpZnRNYW5hZ2VNYXN0ZXJQYXNzd29yZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhV2FyZWhvdXNlQ29uZmlnUGFyc2VyIGV4dGVuZHMgTWRhYUFwcENvbmZpZ1BhcnNlcjxEYXRhV2FyZWhvdXNlQ29uZmlnQ29udGVudHM+IHtcbiAgcHVibGljIHJlYWRvbmx5IGFkbWluVXNlcm5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGFkbWluUGFzc3dvcmRSb3RhdGlvbkRheXM6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGZlZGVyYXRpb25zOiBGZWRlcmF0aW9uUHJvcHNbXTtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlVXNlcnM6IERhdGFiYXNlVXNlcnNQcm9wc1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YUFkbWluUm9sZVJlZnM6IE1kYWFSb2xlUmVmW107XG4gIHB1YmxpYyByZWFkb25seSB3YXJlaG91c2VCdWNrZXRVc2VyUm9sZVJlZnM/OiBNZGFhUm9sZVJlZltdO1xuICBwdWJsaWMgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZVJlZnM/OiBNZGFhUm9sZVJlZltdO1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXJQb3J0OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBzdWJuZXRJZHM6IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgbm9kZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVuYWJsZUF1ZGl0TG9nZ2luZ1RvUzM6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBudW1iZXJPZk5vZGVzOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBtdWx0aU5vZGU/OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBJbmdyZXNzOiB7IGlwdjQ/OiBzdHJpbmdbXTsgc2c/OiBzdHJpbmdbXSB9O1xuICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyR3JvdXBQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHB1YmxpYyByZWFkb25seSB3b3JrbG9hZE1hbmFnZW1lbnQ6IENvbmZpZ3VyYXRpb25FbGVtZW50W107XG4gIHB1YmxpYyByZWFkb25seSBhZGRpdGlvbmFsQnVja2V0S21zS2V5QXJucz86IHN0cmluZ1tdO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRDbHVzdGVyUG9ydCA9IDU0NDA7XG4gIHB1YmxpYyByZWFkb25seSBzY2hlZHVsZWRBY3Rpb25zOiBTY2hlZHVsZWRBY3Rpb25Qcm9wc1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlV2FyZWhvdXNlQnVja2V0PzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGF1dG9tYXRlZFNuYXBzaG90UmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGV2ZW50Tm90aWZpY2F0aW9ucz86IEV2ZW50Tm90aWZpY2F0aW9uc1Byb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgZGJOYW1lPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc25hcHNob3RPd25lckFjY291bnQ/OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWRzaGlmdE1hbmFnZU1hc3RlclBhc3N3b3JkPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzdGFjazogU3RhY2ssIHByb3BzOiBNZGFhQXBwQ29uZmlnUGFyc2VyUHJvcHMpIHtcbiAgICBzdXBlcihzdGFjaywgcHJvcHMsIGNvbmZpZ1NjaGVtYSBhcyBTY2hlbWEpO1xuXG4gICAgdGhpcy5hZG1pblVzZXJuYW1lID0gdGhpcy5jb25maWdDb250ZW50cy5hZG1pblVzZXJuYW1lO1xuICAgIHRoaXMuYWRtaW5QYXNzd29yZFJvdGF0aW9uRGF5cyA9IHRoaXMuY29uZmlnQ29udGVudHMuYWRtaW5QYXNzd29yZFJvdGF0aW9uRGF5cztcbiAgICB0aGlzLmZlZGVyYXRpb25zID0gdGhpcy5jb25maWdDb250ZW50cy5mZWRlcmF0aW9ucyA/IHRoaXMuY29uZmlnQ29udGVudHMuZmVkZXJhdGlvbnMgOiBbXTtcbiAgICB0aGlzLmRhdGFBZG1pblJvbGVSZWZzID0gdGhpcy5jb25maWdDb250ZW50cy5kYXRhQWRtaW5Sb2xlcztcbiAgICB0aGlzLndhcmVob3VzZUJ1Y2tldFVzZXJSb2xlUmVmcyA9IHRoaXMuY29uZmlnQ29udGVudHMud2FyZWhvdXNlQnVja2V0VXNlclJvbGVzO1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZVJlZnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmV4ZWN1dGlvblJvbGVzO1xuICAgIHRoaXMudnBjSWQgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLnZwY0lkO1xuICAgIHRoaXMuc3VibmV0SWRzID0gdGhpcy5jb25maWdDb250ZW50cy5zdWJuZXRJZHM7XG4gICAgdGhpcy5zZWN1cml0eUdyb3VwSW5ncmVzcyA9IHRoaXMuY29uZmlnQ29udGVudHMuc2VjdXJpdHlHcm91cEluZ3Jlc3M7XG4gICAgdGhpcy5ub2RlVHlwZSA9IHRoaXMuY29uZmlnQ29udGVudHMubm9kZVR5cGU7XG4gICAgdGhpcy5udW1iZXJPZk5vZGVzID0gdGhpcy5jb25maWdDb250ZW50cy5udW1iZXJPZk5vZGVzO1xuICAgIHRoaXMuZW5hYmxlQXVkaXRMb2dnaW5nVG9TMyA9IHRoaXMuY29uZmlnQ29udGVudHMuZW5hYmxlQXVkaXRMb2dnaW5nVG9TMztcbiAgICB0aGlzLmNsdXN0ZXJQb3J0ID0gdGhpcy5jb25maWdDb250ZW50cy5jbHVzdGVyUG9ydFxuICAgICAgPyB0aGlzLmNvbmZpZ0NvbnRlbnRzLmNsdXN0ZXJQb3J0XG4gICAgICA6IERhdGFXYXJlaG91c2VDb25maWdQYXJzZXIuZGVmYXVsdENsdXN0ZXJQb3J0O1xuICAgIHRoaXMubXVsdGlOb2RlID0gdGhpcy5jb25maWdDb250ZW50cy5tdWx0aU5vZGU7XG4gICAgdGhpcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyA9IHRoaXMuY29uZmlnQ29udGVudHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c7XG4gICAgdGhpcy5wYXJhbWV0ZXJHcm91cFBhcmFtcyA9IHRoaXMuY29uZmlnQ29udGVudHMucGFyYW1ldGVyR3JvdXBQYXJhbXNcbiAgICAgID8gdGhpcy5jb25maWdDb250ZW50cy5wYXJhbWV0ZXJHcm91cFBhcmFtc1xuICAgICAgOiB7fTtcbiAgICB0aGlzLndvcmtsb2FkTWFuYWdlbWVudCA9IHRoaXMuY29uZmlnQ29udGVudHMud29ya2xvYWRNYW5hZ2VtZW50ID8gdGhpcy5jb25maWdDb250ZW50cy53b3JrbG9hZE1hbmFnZW1lbnQgOiBbXTtcbiAgICB0aGlzLmFkZGl0aW9uYWxCdWNrZXRLbXNLZXlBcm5zID0gdGhpcy5jb25maWdDb250ZW50cy5hZGRpdGlvbmFsQnVja2V0S21zS2V5QXJucztcbiAgICB0aGlzLnNjaGVkdWxlZEFjdGlvbnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLnNjaGVkdWxlZEFjdGlvbnMgPyB0aGlzLmNvbmZpZ0NvbnRlbnRzLnNjaGVkdWxlZEFjdGlvbnMgOiBbXTtcbiAgICB0aGlzLmRhdGFiYXNlVXNlcnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmRhdGFiYXNlVXNlcnMgPyB0aGlzLmNvbmZpZ0NvbnRlbnRzLmRhdGFiYXNlVXNlcnMgOiBbXTtcbiAgICB0aGlzLmNyZWF0ZVdhcmVob3VzZUJ1Y2tldCA9IHRoaXMuY29uZmlnQ29udGVudHMuY3JlYXRlV2FyZWhvdXNlQnVja2V0O1xuICAgIHRoaXMuYXV0b21hdGVkU25hcHNob3RSZXRlbnRpb25EYXlzID0gdGhpcy5jb25maWdDb250ZW50cy5hdXRvbWF0ZWRTbmFwc2hvdFJldGVudGlvbkRheXM7XG4gICAgdGhpcy5ldmVudE5vdGlmaWNhdGlvbnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmV2ZW50Tm90aWZpY2F0aW9ucztcbiAgICB0aGlzLmRiTmFtZSA9IHRoaXMuY29uZmlnQ29udGVudHMuZGJOYW1lO1xuICAgIHRoaXMuc25hcHNob3RJZGVudGlmaWVyID0gdGhpcy5jb25maWdDb250ZW50cy5zbmFwc2hvdElkZW50aWZpZXI7XG4gICAgdGhpcy5zbmFwc2hvdE93bmVyQWNjb3VudCA9IHRoaXMuY29uZmlnQ29udGVudHMuc25hcHNob3RPd25lckFjY291bnQ7XG4gICAgdGhpcy5yZWRzaGlmdE1hbmFnZU1hc3RlclBhc3N3b3JkID0gdGhpcy5jb25maWdDb250ZW50cy5yZWRzaGlmdE1hbmFnZU1hc3RlclBhc3N3b3JkO1xuICB9XG59XG4iXX0=
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXdhcmVob3VzZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkYXRhd2FyZWhvdXNlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFFSCx1Q0FBc0c7QUFVdEcscURBQXFEO0FBOFRyRCxNQUFhLHlCQUEwQixTQUFRLHlCQUFnRDtJQWlDN0YsWUFBWSxLQUFZLEVBQUUsS0FBK0I7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBc0IsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUM7UUFDL0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUM7UUFDNUQsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUM7UUFDaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUM7UUFDekUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVc7WUFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVztZQUNqQyxDQUFDLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQztRQUNqRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0I7WUFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CO1lBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9HLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQztRQUN2RSxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQztRQUN6RixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDO1FBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQjtZQUNsRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUM7WUFDbEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDO1FBQ3JGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQztRQUNyRCxJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQ0FBa0MsQ0FBQztJQUNuRyxDQUFDOztBQXhFSCw4REF5RUM7QUFyRHdCLDRDQUFrQixHQUFHLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7IE1kYWFBcHBDb25maWdQYXJzZXIsIE1kYWFBcHBDb25maWdQYXJzZXJQcm9wcywgTWRhYUJhc2VDb25maWdDb250ZW50cyB9IGZyb20gJ0Bhd3MtbWRhYS9hcHAnO1xuaW1wb3J0IHtcbiAgRmVkZXJhdGlvblByb3BzLFxuICBTY2hlZHVsZWRBY3Rpb25Qcm9wcyxcbiAgRGF0YWJhc2VVc2Vyc1Byb3BzLFxuICBFdmVudE5vdGlmaWNhdGlvbnNQcm9wcyxcbn0gZnJvbSAnQGF3cy1tZGFhL2RhdGF3YXJlaG91c2UtbDMtY29uc3RydWN0JztcbmltcG9ydCB7IE1kYWFSb2xlUmVmIH0gZnJvbSAnQGF3cy1tZGFhL2lhbS1yb2xlLWhlbHBlcic7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICdhanYnO1xuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjb25maWdTY2hlbWEgZnJvbSAnLi9jb25maWctc2NoZW1hLmpzb24nO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVsZW1lbnQgfSBmcm9tICdAYXdzLW1kYWEvY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhV2FyZWhvdXNlQ29uZmlnQ29udGVudHMgZXh0ZW5kcyBNZGFhQmFzZUNvbmZpZ0NvbnRlbnRzIHtcbiAgLyoqXG4gICAqIEFkbWluIHVzZXJuYW1lIGZvciB0aGUgUmVkc2hpZnQgY2x1c3Rlci4gQSBzZWNyZXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZm9yIHRoZSBwYXNzd29yZC5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDbHVzdGVyIGFkbWluaXN0cmF0aW9uOyBEYXRhYmFzZSBtYW5hZ2VtZW50OyBJbml0aWFsIHVzZXIgcHJvdmlzaW9uaW5nXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgY2x1c3RlciBtYXN0ZXIgdXNlcm5hbWVcbiAgICpcbiAgICogVmFsaWRhdGlvbjogUmVxdWlyZWQ7IHZhbGlkIFJlZHNoaWZ0IHVzZXJuYW1lXG4gICAqL1xuICByZWFkb25seSBhZG1pblVzZXJuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEYXlzIGJldHdlZW4gYXV0b21hdGljIGFkbWluIHBhc3N3b3JkIHJvdGF0aW9ucyB2aWEgU2VjcmV0cyBNYW5hZ2VyLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEF1dG9tYXRlZCBjcmVkZW50aWFsIHJvdGF0aW9uOyBTZWN1cml0eSBjb21wbGlhbmNlOyBQYXNzd29yZCBwb2xpY3kgZW5mb3JjZW1lbnRcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBhZG1pbiBwYXNzd29yZCByb3RhdGlvbiB2aWEgU2VjcmV0cyBNYW5hZ2VyXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyBwb3NpdGl2ZSBpbnRlZ2VyXG4gICAqL1xuICByZWFkb25seSBhZG1pblBhc3N3b3JkUm90YXRpb25EYXlzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBTQU1MIG9yIE9JREMgZmVkZXJhdGlvbiBjb25maWd1cmF0aW9ucyBmb3IgZmVkZXJhdGVkIFJlZHNoaWZ0IGFjY2Vzcy5cbiAgICogRWFjaCBmZWRlcmF0aW9uIGNyZWF0ZXMgYW4gSUFNIHJvbGUgd2l0aCBTQU1MIHRydXN0IGZvciBkeW5hbWljIGNyZWRlbnRpYWwgZ2VuZXJhdGlvblxuICAgKiBhbmQgZ3JvdXAtYmFzZWQgY2x1c3RlciBhY2Nlc3MuXG4gICAqXG4gICAqIFVzZSBjYXNlczogU0FNTCBmZWRlcmF0aW9uIHNldHVwOyBTU08gaW50ZWdyYXRpb247IEZlZGVyYXRlZCBjbHVzdGVyIGFjY2Vzc1xuICAgKlxuICAgKiBBV1M6IElBTSBTQU1MIGlkZW50aXR5IHByb3ZpZGVyIHJvbGVzIGZvciBSZWRzaGlmdCBmZWRlcmF0ZWQgYWNjZXNzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBhcnJheSBvZiB2YWxpZCBGZWRlcmF0aW9uUHJvcHNcbiAgICovXG4gIHJlYWRvbmx5IGZlZGVyYXRpb25zPzogRmVkZXJhdGlvblByb3BzW107XG4gIC8qKlxuICAgKiBBZG1pbiByb2xlcyBncmFudGVkIGZ1bGwgYWNjZXNzIHRvIGNsdXN0ZXIgcmVzb3VyY2VzIGluY2x1ZGluZyBLTVMga2V5cyBhbmQgUzMgYnVja2V0cy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBBZG1pbmlzdHJhdGl2ZSBhY2Nlc3MgY29udHJvbDsgU2VjdXJpdHkgbWFuYWdlbWVudDsgUmVzb3VyY2UgYWRtaW5pc3RyYXRpb25cbiAgICpcbiAgICogQVdTOiBJQU0gcm9sZXMgd2l0aCBmdWxsIFJlZHNoaWZ0IGNsdXN0ZXIgYW5kIHJlc291cmNlIGFjY2Vzc1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgYXJyYXkgb2YgdmFsaWQgTWRhYVJvbGVSZWZcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFBZG1pblJvbGVzOiBNZGFhUm9sZVJlZltdO1xuICAvKipcbiAgICogUm9sZXMgZ3JhbnRlZCByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGUgZGF0YSB3YXJlaG91c2UgUzMgYnVja2V0IGZvciBkYXRhIGxvYWRpbmcvdW5sb2FkaW5nLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEVUTCBkYXRhIGxvYWRpbmc7IERhdGEgdW5sb2FkaW5nIG9wZXJhdGlvbnM7IEJ1Y2tldCBhY2Nlc3MgZm9yIGFuYWx5dGljc1xuICAgKlxuICAgKiBBV1M6IElBTSByb2xlcyB3aXRoIFMzIGJ1Y2tldCBhY2Nlc3MgZm9yIFJlZHNoaWZ0IGRhdGEgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgYXJyYXkgb2YgdmFsaWQgTWRhYVJvbGVSZWZcbiAgICovXG4gIHJlYWRvbmx5IHdhcmVob3VzZUJ1Y2tldFVzZXJSb2xlcz86IE1kYWFSb2xlUmVmW107XG4gIC8qKlxuICAgKiBFeHRlcm5hbCBleGVjdXRpb24gcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZWRzaGlmdCBjbHVzdGVyIGZvciBjcm9zcy1zZXJ2aWNlIG9wZXJhdGlvbnMuXG4gICAqIElmIGEgcm9sZSBhbHNvIG5lZWRzIHdhcmVob3VzZSBidWNrZXQgYWNjZXNzLCBhZGQgaXQgdG8gd2FyZWhvdXNlQnVja2V0VXNlclJvbGVzIGV4cGxpY2l0bHkuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ3Jvc3Mtc2VydmljZSBpbnRlZ3JhdGlvbnM7IEV4dGVybmFsIGRhdGEgYWNjZXNzOyBHbHVlL0xhbWJkYSBpbnRlZ3JhdGlvblxuICAgKlxuICAgKiBBV1M6IElBTSBleGVjdXRpb24gcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZWRzaGlmdCBjbHVzdGVyXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBhcnJheSBvZiB2YWxpZCBNZGFhUm9sZVJlZjsgcm9sZXMgbXVzdCBiZSBhc3N1bWFibGUgYnkgUmVkc2hpZnRcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVzPzogTWRhYVJvbGVSZWZbXTtcbiAgLyoqXG4gICAqIFZQQyBJRCBmb3IgUmVkc2hpZnQgY2x1c3RlciBkZXBsb3ltZW50LiBUaGUgY2x1c3RlciBpcyBkZXBsb3llZCB3aXRoaW4gdGhpcyBWUENcbiAgICogd2l0aCBuZXR3b3JrIGFjY2VzcyBjb250cm9sbGVkIGJ5IHNlY3VyaXR5IGdyb3Vwcy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBOZXR3b3JrIGlzb2xhdGlvbjsgVlBDLWJhc2VkIGRlcGxveW1lbnQ7IFNlY3VyZSBuZXR3b3JraW5nXG4gICAqXG4gICAqIEFXUzogVlBDIGZvciBSZWRzaGlmdCBjbHVzdGVyIG5ldHdvcmsgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgdmFsaWQgVlBDIElEXG4gICAqL1xuICByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3VibmV0IElEcyBmb3IgUmVkc2hpZnQgY2x1c3RlciBub2RlIHBsYWNlbWVudC4gRm9yIGF1dG9tYXRpYyBjbHVzdGVyIHJlbG9jYXRpb24sXG4gICAqIHNwZWNpZnkgYXQgbGVhc3Qgb25lIHN1Ym5ldCBwZXIgQVouXG4gICAqXG4gICAqIFVzZSBjYXNlczogTXVsdGktQVogcGxhY2VtZW50OyBTdWJuZXQtc3BlY2lmaWMgZGVwbG95bWVudDsgQ2x1c3RlciByZWxvY2F0aW9uIHN1cHBvcnRcbiAgICpcbiAgICogQVdTOiBWUEMgc3VibmV0cyBmb3IgUmVkc2hpZnQgc3VibmV0IGdyb3VwXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyBhcnJheSBvZiB2YWxpZCBzdWJuZXQgSURzIGluIHRoZSBzcGVjaWZpZWQgVlBDOyBtdXN0IGNvbnRhaW4gPj0gMyBzdWJuZXRzIGluIGRpZmZlcmVudCBBWnMgd2hlbiBtdWx0aUF6IGlzIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldElkczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBpbmdyZXNzIHJ1bGVzIGRlZmluaW5nIGFsbG93ZWQgaW5ib3VuZCBjb25uZWN0aW9ucyB0byB0aGUgY2x1c3RlciBwb3J0LlxuICAgKiBTdXBwb3J0cyBJUHY0IENJRFIgYmxvY2tzIGFuZCBzZWN1cml0eSBncm91cCByZWZlcmVuY2VzLiBBbGwgb3RoZXIgdHJhZmZpYyBpcyBibG9ja2VkLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IE5ldHdvcmsgYWNjZXNzIGNvbnRyb2w7IENsaWVudCBjb25uZWN0aXZpdHk7IFNlY3VyaXR5IGdyb3VwIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBWUEMgc2VjdXJpdHkgZ3JvdXAgaW5ncmVzcyBydWxlcyBmb3IgUmVkc2hpZnQgY2x1c3RlclxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgb2JqZWN0IHdpdGggb3B0aW9uYWwgaXB2NCBhbmQvb3Igc2cgYXJyYXlzXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwSW5ncmVzczogeyBpcHY0Pzogc3RyaW5nW107IHNnPzogc3RyaW5nW10gfTtcbiAgLyoqXG4gICAqIFJlZHNoaWZ0IG5vZGUgdHlwZSBkZXRlcm1pbmluZyBjb21wdXRlIGFuZCBzdG9yYWdlIGNhcGFjaXR5IChlLmcuLCBSQTNfNFhMQVJHRSkuXG4gICAqXG4gICAqIFVzZSBjYXNlczogUGVyZm9ybWFuY2Ugc2l6aW5nOyBDb3N0IG9wdGltaXphdGlvbjsgV29ya2xvYWQtc3BlY2lmaWMgY2FwYWNpdHlcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBub2RlIHR5cGUgKGluc3RhbmNlIHR5cGUpXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyB2YWxpZCBSZWRzaGlmdCBub2RlIHR5cGUgc3RyaW5nXG4gICAqL1xuICByZWFkb25seSBub2RlVHlwZTogc3RyaW5nO1xuICAvKipcbiAgICogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBSZWRzaGlmdCBjbHVzdGVyLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IENsdXN0ZXIgc2l6aW5nOyBQZXJmb3JtYW5jZSBzY2FsaW5nOyBDb3N0IG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBjbHVzdGVyIG5vZGUgY291bnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogUmVxdWlyZWQ7IHBvc2l0aXZlIGludGVnZXI7IG11c3QgYmUgPj0gMiB3aGVuIG11bHRpQXogaXMgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbnVtYmVyT2ZOb2RlczogbnVtYmVyO1xuICAvKipcbiAgICogRW5hYmxlIGF1ZGl0IGxvZ2dpbmcgdG8gYSBkZWRpY2F0ZWQgUzMgYnVja2V0LiBUaGUgYXVkaXQgYnVja2V0IHVzZXMgU1NFLVMzIGVuY3J5cHRpb25cbiAgICogKG5vdCBLTVMpIGR1ZSB0byBSZWRzaGlmdCBhdWRpdCBsb2dnaW5nIHJlcXVpcmVtZW50cy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDb21wbGlhbmNlIGF1ZGl0aW5nOyBTZWN1cml0eSBtb25pdG9yaW5nOyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgYXVkaXQgbG9nZ2luZyB0byBTMyB3aXRoIFNTRS1TMyBlbmNyeXB0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IFJlcXVpcmVkOyBib29sZWFuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVBdWRpdExvZ2dpbmdUb1MzOiBib29sZWFuO1xuICAvKipcbiAgICogVENQIHBvcnQgZm9yIGNsaWVudCBjb25uZWN0aW9ucyB0byB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDdXN0b20gcG9ydCBjb25maWd1cmF0aW9uOyBOZXR3b3JrIHNlY3VyaXR5OyBQb3J0IHN0YW5kYXJkaXphdGlvblxuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IGNsdXN0ZXIgbGlzdGVuaW5nIHBvcnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IHZhbGlkIHBvcnQgbnVtYmVyOyBtdXN0IGJlIGluIHJhbmdlIDU0MzEtNTQ1NSBvciA4MTkxLTgyMTUgd2hlbiBtdWx0aUF6IGlzIHRydWVcbiAgICogQGRlZmF1bHQgNTQ0MFxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlclBvcnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNdWx0aS1ub2RlIGNsdXN0ZXIgZmxhZy4gV2hlbiB0cnVlLCBjcmVhdGVzIGEgbXVsdGktbm9kZSBjbHVzdGVyIGZvciBkaXN0cmlidXRlZCBwcm9jZXNzaW5nO1xuICAgKiB3aGVuIGZhbHNlLCBjcmVhdGVzIGEgc2luZ2xlLW5vZGUgY2x1c3RlciBmb3IgZGV2ZWxvcG1lbnQgb3Igc21hbGwgd29ya2xvYWRzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IENsdXN0ZXIgYXJjaGl0ZWN0dXJlIHNlbGVjdGlvbjsgRGV2IHZzIHByb2R1Y3Rpb24gZGVwbG95bWVudDsgQ29zdCBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBjbHVzdGVyIHR5cGUgKHNpbmdsZS1ub2RlIG9yIG11bHRpLW5vZGUpXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBib29sZWFuXG4gICAqL1xuICByZWFkb25seSBtdWx0aU5vZGU/OiBib29sZWFuO1xuICAvKipcbiAgICogV2Vla2x5IG1haW50ZW5hbmNlIHdpbmRvdyBpbiBkZGQ6aGgyNDptaS1kZGQ6aGgyNDptaSBmb3JtYXQgKFVUQykuXG4gICAqIEV4YW1wbGU6ICdTdW46MjM6NDUtTW9uOjAwOjE1Jy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBNYWludGVuYW5jZSBzY2hlZHVsaW5nOyBCdXNpbmVzcyBjb250aW51aXR5OyBEb3dudGltZSBtYW5hZ2VtZW50XG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgcHJlZmVycmVkIG1haW50ZW5hbmNlIHdpbmRvd1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBSZXF1aXJlZDsgdmFsaWQgdGltZSB3aW5kb3cgZm9ybWF0XG4gICAqL1xuICByZWFkb25seSBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBjbHVzdGVyIHBhcmFtZXRlciBncm91cCBwYXJhbWV0ZXJzIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcuXG4gICAqIFNlY3VyaXR5LXNlbnNpdGl2ZSB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgb3ZlcnJpZGRlbiBmb3IgY29tcGxpYW5jZSAoZS5nLiwgU1NMIGVuZm9yY2VtZW50KS5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBQZXJmb3JtYW5jZSB0dW5pbmc7IEN1c3RvbSBjbHVzdGVyIGNvbmZpZ3VyYXRpb247IFdvcmtsb2FkIG9wdGltaXphdGlvblxuICAgKlxuICAgKiBBV1M6IFJlZHNoaWZ0IHBhcmFtZXRlciBncm91cCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBzdHJpbmcga2V5LXZhbHVlIHBhaXJzXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJHcm91cFBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBXb3JrbG9hZCBtYW5hZ2VtZW50IChXTE0pIGNvbmZpZ3VyYXRpb24gZm9yIHF1ZXJ5IHF1ZXVlIG1hbmFnZW1lbnQgYW5kIHJlc291cmNlIGFsbG9jYXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUXVlcnkgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBDb25jdXJyZW5jeSBjb250cm9sOyBSZXNvdXJjZSBhbGxvY2F0aW9uXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgV0xNIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGFycmF5IG9mIHZhbGlkIENvbmZpZ3VyYXRpb25FbGVtZW50XG4gICAqL1xuICByZWFkb25seSB3b3JrbG9hZE1hbmFnZW1lbnQ/OiBDb25maWd1cmF0aW9uRWxlbWVudFtdO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBLTVMga2V5IEFSTnMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGUgY2x1c3RlciBidWNrZXQuXG4gICAqIFVzZWZ1bCBmb3IgYWxsb3dpbmcgR2x1ZSBqb2JzIG9yIG90aGVyIHNlcnZpY2VzIHRvIHdyaXRlIGVuY3J5cHRlZCBkYXRhIHRvIHRoZSB3YXJlaG91c2UgYnVja2V0LlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IENyb3NzLXNlcnZpY2UgZW5jcnlwdGlvbjsgR2x1ZSBqb2IgaW50ZWdyYXRpb247IE11bHRpLWtleSBidWNrZXQgYWNjZXNzXG4gICAqXG4gICAqIEFXUzogS01TIGtleSBBUk5zIGZvciB3YXJlaG91c2UgYnVja2V0IGVuY3J5cHRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGFycmF5IG9mIHZhbGlkIEtNUyBrZXkgQVJOc1xuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJ1Y2tldEttc0tleUFybnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFNjaGVkdWxlZCBhY3Rpb25zIGZvciBhdXRvbWF0ZWQgY2x1c3RlciBwYXVzZS9yZXN1bWUgb3BlcmF0aW9ucy5cbiAgICogRWFjaCBhY3Rpb24gc3BlY2lmaWVzIGEgdGFyZ2V0IGFjdGlvbiAocGF1c2VDbHVzdGVyL3Jlc3VtZUNsdXN0ZXIpLCBjcm9uIHNjaGVkdWxlLFxuICAgKiBhbmQgYWN0aXZlIHRpbWUgd2luZG93LlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IENvc3Qgb3B0aW1pemF0aW9uIHZpYSBzY2hlZHVsZWQgcGF1c2U7IEF1dG9tYXRlZCBvcGVyYXRpb25zOyBCdXNpbmVzcy1ob3VycyBzY2hlZHVsaW5nXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgc2NoZWR1bGVkIGFjdGlvbnMgZm9yIGNsdXN0ZXIgbGlmZWN5Y2xlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGFycmF5IG9mIHZhbGlkIFNjaGVkdWxlZEFjdGlvblByb3BzXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZWRBY3Rpb25zPzogU2NoZWR1bGVkQWN0aW9uUHJvcHNbXTtcbiAgLyoqXG4gICAqIERhdGFiYXNlIHVzZXJzIGNyZWF0ZWQgaW4gUmVkc2hpZnQgd2l0aCBjcmVkZW50aWFscyBzdG9yZWQgaW4gU2VjcmV0cyBNYW5hZ2VyLlxuICAgKiBTdXBwb3J0cyBhdXRvbWF0ZWQgc2VjcmV0IHJvdGF0aW9uIG9uIGEgY29uZmlndXJhYmxlIGN5Y2xlLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEF1dG9tYXRlZCB1c2VyIHByb3Zpc2lvbmluZzsgQ3JlZGVudGlhbCBtYW5hZ2VtZW50OyBTZWNyZXQgcm90YXRpb25cbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBkYXRhYmFzZSB1c2VycyB3aXRoIFNlY3JldHMgTWFuYWdlciBjcmVkZW50aWFsIHN0b3JhZ2UgYW5kIHJvdGF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBhcnJheSBvZiB2YWxpZCBEYXRhYmFzZVVzZXJzUHJvcHNcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlVXNlcnM/OiBEYXRhYmFzZVVzZXJzUHJvcHNbXTtcbiAgLyoqXG4gICAqIENvbnRyb2wgd2hldGhlciBhIGRlZGljYXRlZCBTMyBidWNrZXQgaXMgY3JlYXRlZCBmb3Igd2FyZWhvdXNlIGRhdGEgb3BlcmF0aW9uc1xuICAgKiAobG9hZGluZywgdW5sb2FkaW5nLCBiYWNrdXApLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFN0b3JhZ2UgcmVzb3VyY2UgbWFuYWdlbWVudDsgRGF0YSBvcGVyYXRpb25zOyBCdWNrZXQgbGlmZWN5Y2xlIGNvbnRyb2xcbiAgICpcbiAgICogQVdTOiBTMyBidWNrZXQgZm9yIFJlZHNoaWZ0IGRhdGEgd2FyZWhvdXNlIG9wZXJhdGlvbnNcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlV2FyZWhvdXNlQnVja2V0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE51bWJlciBvZiBkYXlzIGF1dG9tYXRlZCBzbmFwc2hvdHMgYXJlIHJldGFpbmVkICgxLTM1KS4gU2V0IHRvIDAgdG8gZGlzYWJsZS5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBCYWNrdXAgbWFuYWdlbWVudDsgUG9pbnQtaW4tdGltZSByZWNvdmVyeTsgRGF0YSBwcm90ZWN0aW9uIGNvbXBsaWFuY2VcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBhdXRvbWF0ZWQgc25hcHNob3QgcmV0ZW50aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBpbnRlZ2VyIDAtMzVcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b21hdGVkU25hcHNob3RSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICAvKipcbiAgICogRXZlbnQgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGNsdXN0ZXIgYW5kIHNjaGVkdWxlZCBhY3Rpb24gbW9uaXRvcmluZy5cbiAgICogQ29uZmlndXJlcyBTTlMgbm90aWZpY2F0aW9ucyB3aXRoIGVtYWlsIGRlbGl2ZXJ5LCBzZXZlcml0eSBmaWx0ZXJpbmcsIGFuZCBldmVudCBjYXRlZ29yeSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogT3BlcmF0aW9uYWwgbW9uaXRvcmluZzsgRXZlbnQgYWxlcnRpbmc7IENsdXN0ZXIgc3RhdHVzIHRyYWNraW5nXG4gICAqXG4gICAqIEFXUzogU05TIG5vdGlmaWNhdGlvbnMgZm9yIFJlZHNoaWZ0IGNsdXN0ZXIgZXZlbnRzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyB2YWxpZCBFdmVudE5vdGlmaWNhdGlvbnNQcm9wc1xuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnROb3RpZmljYXRpb25zPzogRXZlbnROb3RpZmljYXRpb25zUHJvcHM7XG4gIC8qKlxuICAgKiBJbml0aWFsIGRhdGFiYXNlIG5hbWUgY3JlYXRlZCBpbiB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDdXN0b20gZGF0YWJhc2UgbmFtaW5nOyBJbml0aWFsIGRhdGFiYXNlIHNldHVwXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgaW5pdGlhbCBkYXRhYmFzZVxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgdmFsaWQgZGF0YWJhc2UgbmFtZVxuICAgKiBAZGVmYXVsdCBcImRlZmF1bHRfZGJcIlxuICAgKi9cbiAgcmVhZG9ubHkgZGJOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogU25hcHNob3QgaWRlbnRpZmllciBmb3IgY2x1c3RlciByZXN0b3JhdGlvbi4gT25seSBwcm92aWRlIHdoZW4gcmVzdG9yaW5nIGZyb20gYW4gZXhpc3Rpbmcgc25hcHNob3QuXG4gICAqXG4gICAqIFVzZSBjYXNlczogRGlzYXN0ZXIgcmVjb3Zlcnk7IERhdGEgbWlncmF0aW9uOyBDbHVzdGVyIHJlc3RvcmF0aW9uXG4gICAqXG4gICAqIEFXUzogUmVkc2hpZnQgc25hcHNob3QgZm9yIGNsdXN0ZXIgcmVzdG9yYXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IHZhbGlkIHNuYXBzaG90IGlkZW50aWZpZXJcbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIG93bmVyQWNjb3VudCBSZWZlcnMgdG8gc25hcHNob3Qgb3duZXIgYWNjb3VudC4gQXBwbGljYWJsZSBpZiByZXN0b3JpbmcgdGhlIGNsdXN0ZXIgZnJvbSBzbmFwc2hvdCBhbmQgc25hcHNob3QgYmVsb25ncyB0byBhbm90aGVyIGFjY291bnRcbiAgICogT3B0aW9uYWwgLSBCeSBkZWZhdWx0LCBzbmFwc2hvdHMgYXJlIHNlYXJjaGVkIHdpdGhpbiBjdXJyZW50IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90T3duZXJBY2NvdW50Pzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIHJlYWRvbmx5IHJlZHNoaWZ0TWFuYWdlTWFzdGVyUGFzc3dvcmQ/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIG11bHRpLUFaIGRlcGxveW1lbnQgZm9yIGhpZ2ggYXZhaWxhYmlsaXR5LlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEhpZ2ggYXZhaWxhYmlsaXR5OyBGYXVsdCB0b2xlcmFuY2U7IFByb2R1Y3Rpb24gZGVwbG95bWVudHNcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBtdWx0aS1BWiBkZXBsb3ltZW50XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE9wdGlvbmFsOyBib29sZWFuLiBXaGVuIHRydWUsIHJlcXVpcmVzOiBudW1iZXJPZk5vZGVzID49IDIsIHN1Ym5ldElkcyBpbiA+PSAzIEFacyxcbiAgICogY2x1c3RlclBvcnQgaW4gcmFuZ2UgNTQzMS01NDU1IG9yIDgxOTEtODIxNSwgYW5kIHBhdXNlL3Jlc3VtZSBzY2hlZHVsZWQgYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpQXo/OiBib29sZWFuO1xuICAvKipcbiAgICogVGFyZ2V0IHJlZ2lvbiBmb3IgY3Jvc3MtcmVnaW9uIHNuYXBzaG90IGNvcGllcy4gV2hlbiBzZXQsIGVuYWJsZXMgY3Jvc3MtcmVnaW9uIHNuYXBzaG90IGNvcHkgdG8gdGhpcyByZWdpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogRGlzYXN0ZXIgcmVjb3Zlcnk7IENyb3NzLXJlZ2lvbiBiYWNrdXA7IEJ1c2luZXNzIGNvbnRpbnVpdHlcbiAgICpcbiAgICogQVdTOiBSZWRzaGlmdCBzbmFwc2hvdCBjb3B5IGRlc3RpbmF0aW9uIHJlZ2lvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBPcHRpb25hbDsgdmFsaWQgQVdTIHJlZ2lvbiBzdHJpbmcsIG11c3QgZGlmZmVyIGZyb20gdGhlIGRlcGxveW1lbnQgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSBiYWNrdXBSZWdpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIG9taXRzIHRoZSBleHBsaWNpdCBibG9ja1B1YmxpY0FjY2VzcyBzZXR0aW5nIG9uIFMzIGJ1Y2tldHMgc28gQ0RLIGRvZXMgbm90IGVtaXRcbiAgICogYSBQdXRCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jayBBUEkgY2FsbC4gVXNlIHdoZW4gcHVibGljIGFjY2VzcyBibG9jayBpcyBtYW5hZ2VkIGV4dGVybmFsbHlcbiAgICogKGUuZy4sIGJ5IEFXUyBhY2NvdW50LWxldmVsIHNldHRpbmdzIGFuZC9vciBTQ1BzIHRoYXQgZGVueSBzMzpQdXRCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jaykuXG4gICAqXG4gICAqIFVzZSBjYXNlczogU0NQLXJlc3RyaWN0ZWQgZW52aXJvbm1lbnRzOyBFeHRlcm5hbGx5IG1hbmFnZWQgcHVibGljIGFjY2VzcyBibG9jaztcbiAgICogT3JnYW5pemF0aW9ucyBlbmZvcmNpbmcgYWNjb3VudC1sZXZlbCBTMyBCbG9jayBQdWJsaWMgQWNjZXNzXG4gICAqXG4gICAqIEFXUzogUzMgUHV0QnVja2V0UHVibGljQWNjZXNzQmxvY2tcbiAgICpcbiAgICogVmFsaWRhdGlvbjogT3B0aW9uYWw7IGJvb2xlYW47IGRlZmF1bHQgZmFsc2VcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0FjY2Vzc0Jsb2NrTWFuYWdlZEV4dGVybmFsbHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YVdhcmVob3VzZUNvbmZpZ1BhcnNlciBleHRlbmRzIE1kYWFBcHBDb25maWdQYXJzZXI8RGF0YVdhcmVob3VzZUNvbmZpZ0NvbnRlbnRzPiB7XG4gIHB1YmxpYyByZWFkb25seSBhZG1pblVzZXJuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBhZG1pblBhc3N3b3JkUm90YXRpb25EYXlzOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBmZWRlcmF0aW9uczogRmVkZXJhdGlvblByb3BzW107XG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZVVzZXJzOiBEYXRhYmFzZVVzZXJzUHJvcHNbXTtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFBZG1pblJvbGVSZWZzOiBNZGFhUm9sZVJlZltdO1xuICBwdWJsaWMgcmVhZG9ubHkgd2FyZWhvdXNlQnVja2V0VXNlclJvbGVSZWZzPzogTWRhYVJvbGVSZWZbXTtcbiAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVSZWZzPzogTWRhYVJvbGVSZWZbXTtcbiAgcHVibGljIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyUG9ydDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0SWRzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IG5vZGVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBlbmFibGVBdWRpdExvZ2dpbmdUb1MzOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgbnVtYmVyT2ZOb2RlczogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgbXVsdGlOb2RlPzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzZWN1cml0eUdyb3VwSW5ncmVzczogeyBpcHY0Pzogc3RyaW5nW107IHNnPzogc3RyaW5nW10gfTtcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlckdyb3VwUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2xvYWRNYW5hZ2VtZW50OiBDb25maWd1cmF0aW9uRWxlbWVudFtdO1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkaXRpb25hbEJ1Y2tldEttc0tleUFybnM/OiBzdHJpbmdbXTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0Q2x1c3RlclBvcnQgPSA1NDQwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZWR1bGVkQWN0aW9uczogU2NoZWR1bGVkQWN0aW9uUHJvcHNbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZVdhcmVob3VzZUJ1Y2tldD86IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBhdXRvbWF0ZWRTbmFwc2hvdFJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBldmVudE5vdGlmaWNhdGlvbnM/OiBFdmVudE5vdGlmaWNhdGlvbnNQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGRiTmFtZT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNuYXBzaG90T3duZXJBY2NvdW50Pzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVkc2hpZnRNYW5hZ2VNYXN0ZXJQYXNzd29yZD86IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBtdWx0aUF6PzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGJhY2t1cFJlZ2lvbj86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHB1YmxpY0FjY2Vzc0Jsb2NrTWFuYWdlZEV4dGVybmFsbHk/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHN0YWNrOiBTdGFjaywgcHJvcHM6IE1kYWFBcHBDb25maWdQYXJzZXJQcm9wcykge1xuICAgIHN1cGVyKHN0YWNrLCBwcm9wcywgY29uZmlnU2NoZW1hIGFzIFNjaGVtYSk7XG5cbiAgICB0aGlzLmFkbWluVXNlcm5hbWUgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmFkbWluVXNlcm5hbWU7XG4gICAgdGhpcy5hZG1pblBhc3N3b3JkUm90YXRpb25EYXlzID0gdGhpcy5jb25maWdDb250ZW50cy5hZG1pblBhc3N3b3JkUm90YXRpb25EYXlzO1xuICAgIHRoaXMuZmVkZXJhdGlvbnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmZlZGVyYXRpb25zID8gdGhpcy5jb25maWdDb250ZW50cy5mZWRlcmF0aW9ucyA6IFtdO1xuICAgIHRoaXMuZGF0YUFkbWluUm9sZVJlZnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmRhdGFBZG1pblJvbGVzO1xuICAgIHRoaXMud2FyZWhvdXNlQnVja2V0VXNlclJvbGVSZWZzID0gdGhpcy5jb25maWdDb250ZW50cy53YXJlaG91c2VCdWNrZXRVc2VyUm9sZXM7XG4gICAgdGhpcy5leGVjdXRpb25Sb2xlUmVmcyA9IHRoaXMuY29uZmlnQ29udGVudHMuZXhlY3V0aW9uUm9sZXM7XG4gICAgdGhpcy52cGNJZCA9IHRoaXMuY29uZmlnQ29udGVudHMudnBjSWQ7XG4gICAgdGhpcy5zdWJuZXRJZHMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLnN1Ym5ldElkcztcbiAgICB0aGlzLnNlY3VyaXR5R3JvdXBJbmdyZXNzID0gdGhpcy5jb25maWdDb250ZW50cy5zZWN1cml0eUdyb3VwSW5ncmVzcztcbiAgICB0aGlzLm5vZGVUeXBlID0gdGhpcy5jb25maWdDb250ZW50cy5ub2RlVHlwZTtcbiAgICB0aGlzLm51bWJlck9mTm9kZXMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLm51bWJlck9mTm9kZXM7XG4gICAgdGhpcy5lbmFibGVBdWRpdExvZ2dpbmdUb1MzID0gdGhpcy5jb25maWdDb250ZW50cy5lbmFibGVBdWRpdExvZ2dpbmdUb1MzO1xuICAgIHRoaXMuY2x1c3RlclBvcnQgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmNsdXN0ZXJQb3J0XG4gICAgICA/IHRoaXMuY29uZmlnQ29udGVudHMuY2x1c3RlclBvcnRcbiAgICAgIDogRGF0YVdhcmVob3VzZUNvbmZpZ1BhcnNlci5kZWZhdWx0Q2x1c3RlclBvcnQ7XG4gICAgdGhpcy5tdWx0aU5vZGUgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLm11bHRpTm9kZTtcbiAgICB0aGlzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93ID0gdGhpcy5jb25maWdDb250ZW50cy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdztcbiAgICB0aGlzLnBhcmFtZXRlckdyb3VwUGFyYW1zID0gdGhpcy5jb25maWdDb250ZW50cy5wYXJhbWV0ZXJHcm91cFBhcmFtc1xuICAgICAgPyB0aGlzLmNvbmZpZ0NvbnRlbnRzLnBhcmFtZXRlckdyb3VwUGFyYW1zXG4gICAgICA6IHt9O1xuICAgIHRoaXMud29ya2xvYWRNYW5hZ2VtZW50ID0gdGhpcy5jb25maWdDb250ZW50cy53b3JrbG9hZE1hbmFnZW1lbnQgPyB0aGlzLmNvbmZpZ0NvbnRlbnRzLndvcmtsb2FkTWFuYWdlbWVudCA6IFtdO1xuICAgIHRoaXMuYWRkaXRpb25hbEJ1Y2tldEttc0tleUFybnMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmFkZGl0aW9uYWxCdWNrZXRLbXNLZXlBcm5zO1xuICAgIHRoaXMuc2NoZWR1bGVkQWN0aW9ucyA9IHRoaXMuY29uZmlnQ29udGVudHMuc2NoZWR1bGVkQWN0aW9ucyA/IHRoaXMuY29uZmlnQ29udGVudHMuc2NoZWR1bGVkQWN0aW9ucyA6IFtdO1xuICAgIHRoaXMuZGF0YWJhc2VVc2VycyA9IHRoaXMuY29uZmlnQ29udGVudHMuZGF0YWJhc2VVc2VycyA/IHRoaXMuY29uZmlnQ29udGVudHMuZGF0YWJhc2VVc2VycyA6IFtdO1xuICAgIHRoaXMuY3JlYXRlV2FyZWhvdXNlQnVja2V0ID0gdGhpcy5jb25maWdDb250ZW50cy5jcmVhdGVXYXJlaG91c2VCdWNrZXQ7XG4gICAgdGhpcy5hdXRvbWF0ZWRTbmFwc2hvdFJldGVudGlvbkRheXMgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmF1dG9tYXRlZFNuYXBzaG90UmV0ZW50aW9uRGF5cztcbiAgICB0aGlzLmV2ZW50Tm90aWZpY2F0aW9ucyA9IHRoaXMuY29uZmlnQ29udGVudHMuZXZlbnROb3RpZmljYXRpb25zO1xuICAgIHRoaXMuZGJOYW1lID0gdGhpcy5jb25maWdDb250ZW50cy5kYk5hbWU7XG4gICAgdGhpcy5zbmFwc2hvdElkZW50aWZpZXIgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLnNuYXBzaG90SWRlbnRpZmllcjtcbiAgICB0aGlzLnNuYXBzaG90T3duZXJBY2NvdW50ID0gdGhpcy5jb25maWdDb250ZW50cy5zbmFwc2hvdE93bmVyQWNjb3VudFxuICAgICAgPyBTdHJpbmcodGhpcy5jb25maWdDb250ZW50cy5zbmFwc2hvdE93bmVyQWNjb3VudClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVkc2hpZnRNYW5hZ2VNYXN0ZXJQYXNzd29yZCA9IHRoaXMuY29uZmlnQ29udGVudHMucmVkc2hpZnRNYW5hZ2VNYXN0ZXJQYXNzd29yZDtcbiAgICB0aGlzLm11bHRpQXogPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLm11bHRpQXo7XG4gICAgdGhpcy5iYWNrdXBSZWdpb24gPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLmJhY2t1cFJlZ2lvbjtcbiAgICB0aGlzLnB1YmxpY0FjY2Vzc0Jsb2NrTWFuYWdlZEV4dGVybmFsbHkgPSB0aGlzLmNvbmZpZ0NvbnRlbnRzLnB1YmxpY0FjY2Vzc0Jsb2NrTWFuYWdlZEV4dGVybmFsbHk7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -8,38 +8,37 @@
8
8
  "bin": {
9
9
  "datawarehouse-cdk": "bin/datawarehouse.js"
10
10
  },
11
- "version": "1.5.0",
11
+ "version": "1.6.0",
12
12
  "license": "Apache-2.0",
13
13
  "scripts": {
14
- "build": "tsc && typescript-json-schema --required --noExtraProps tsconfig.json DataWarehouseConfigContents --include 'lib/*.ts' --include '../../../../node_modules/@types/**/*.ts' --include 'lib/config-schema.json' > lib/config-schema.json && cp lib/config-schema.json ../../../../schemas/${npm_package_name}.json",
14
+ "build": "../../../../scripts/build/build_package.sh DataWarehouseConfigContents",
15
15
  "watch": "tsc -w",
16
- "test": "jest --passWithNoTests --testPathIgnorePatterns='.*\\.snapshot\\.test\\.ts'",
16
+ "test": "jest --passWithNoTests --coverage",
17
17
  "cdk": "cdk",
18
18
  "lint": "eslint --max-warnings 0 -c ../../../../eslint.config.mjs",
19
- "test:coverage": "jest --passWithNoTests --coverage --testPathIgnorePatterns='.*\\.snapshot\\.test\\.ts'",
20
- "test:snapshots": "jest --passWithNoTests --testPathPattern='.*\\.snapshot\\.test\\.ts'",
21
- "test:snapshots:update": "jest --passWithNoTests --testPathPattern='.*\\.snapshot\\.test\\.ts' --updateSnapshot"
19
+ "test:update-baselines": "UPDATE_BASELINES=true jest --passWithNoTests --testPathPattern='.*\\.diff\\.test\\.ts'",
20
+ "test:package-docs": "../../../../scripts/generate_docs/test_package_docs.sh"
22
21
  },
23
22
  "main": "lib/index.js",
24
23
  "types": "lib/index.d.ts",
25
24
  "devDependencies": {
26
- "@aws-mdaa/testing": "1.5.0",
25
+ "@aws-mdaa/testing": "1.6.0",
27
26
  "@types/jest": "29.5.14",
28
27
  "@types/node": "22.9.0",
29
28
  "@types/prettier": "2.6.0",
30
29
  "jest": "29.7.0",
31
- "ts-jest": "29.4.6",
30
+ "ts-jest": "29.4.9",
32
31
  "ts-node": "10.9.2",
33
32
  "typescript": "5.9.3",
34
- "typescript-json-schema": "0.67.1"
33
+ "typescript-json-schema": "0.67.4"
35
34
  },
36
35
  "dependencies": {
37
- "@aws-mdaa/app": "1.5.0",
38
- "@aws-mdaa/config": "1.5.0",
39
- "@aws-mdaa/datawarehouse-l3-construct": "1.5.0",
40
- "@aws-mdaa/iam-role-helper": "1.5.0",
41
- "@aws-mdaa/l3-construct": "1.5.0",
42
- "ajv": "8.17.1",
36
+ "@aws-mdaa/app": "1.6.0",
37
+ "@aws-mdaa/config": "1.6.0",
38
+ "@aws-mdaa/datawarehouse-l3-construct": "1.6.0",
39
+ "@aws-mdaa/iam-role-helper": "1.6.0",
40
+ "@aws-mdaa/l3-construct": "1.6.0",
41
+ "ajv": "8.18.0",
43
42
  "aws-cdk-lib": "2.220.0",
44
43
  "cdk-nag": "2.37.55",
45
44
  "constructs": "10.0.96",
@@ -50,5 +49,8 @@
50
49
  "repository": {
51
50
  "type": "git",
52
51
  "url": "https://github.com/aws/modern-data-architecture-accelerator"
52
+ },
53
+ "mdaa": {
54
+ "deployStage": "2"
53
55
  }
54
56
  }
@@ -0,0 +1,212 @@
1
+ # Sample config for the Redshift Data Warehouse module.
2
+ # Deploys a multi-node Redshift cluster with SAML federation,
3
+ # scheduled pause/resume, audit logging, database users with
4
+ # secret rotation, event notifications, workload management,
5
+ # parameter group tuning, and VPC networking.
6
+ # This comprehensive config exercises every compatible non-excluded
7
+ # property at full depth.
8
+
9
+ # Admin username for the Redshift cluster. A secret is
10
+ # automatically generated for the password.
11
+ adminUsername: admin
12
+
13
+ # Number of days between admin password rotation
14
+ adminPasswordRotationDays: 30
15
+
16
+ # (Optional) Number of days automated snapshots are retained
17
+ # (1-35). Set to 0 to disable. (default: 1)
18
+ automatedSnapshotRetentionDays: 3
19
+
20
+ # (Optional) Additional KMS key ARNs allowed to write to the
21
+ # cluster bucket. Useful for allowing Glue jobs or other services
22
+ # to write encrypted data to the warehouse bucket.
23
+ additionalBucketKmsKeyArns:
24
+ - arn:{{partition}}:kms:{{region}}:{{account}}:key/abcd-123123-abcd-12312421
25
+
26
+ # (Optional) SAML or OIDC federation configurations for federated
27
+ # Redshift access. Each federation creates an IAM role with SAML
28
+ # trust for dynamic credential generation and group-based cluster
29
+ # access.
30
+ federations:
31
+ # Name of the federation for reference
32
+ - federationName: 'test'
33
+ # ARN of the IAM Identity Provider
34
+ providerArn: arn:{{partition}}:iam::{{account}}:saml-provider/sample-saml-identity-provider
35
+
36
+ # See CONFIGURATION.md for role reference options (name, arn, id).
37
+ # Admin roles granted full access to cluster resources including
38
+ # KMS keys and S3 buckets. Roles can be referenced by name, arn,
39
+ # or id.
40
+ dataAdminRoles:
41
+ - arn: arn:{{partition}}:iam::{{account}}:role/Admin
42
+
43
+ # (Optional) Roles granted read/write access to the data warehouse
44
+ # S3 bucket for data loading/unloading
45
+ warehouseBucketUserRoles:
46
+ - name: User
47
+ - name: team2-ex-role
48
+
49
+ # (Optional) External execution roles associated with the Redshift
50
+ # cluster for cross-service operations. If a role also needs
51
+ # warehouse bucket access, add it to warehouseBucketUserRoles.
52
+ executionRoles:
53
+ - arn: arn:{{partition}}:iam::{{account}}:role/team1-ex-role
54
+ - arn: arn:{{partition}}:iam::{{account}}:role/RedshiftExecRole
55
+
56
+ # VPC ID for Redshift cluster deployment
57
+ # Often created by your VPC/networking stack.
58
+ # Example SSM: ssm:/path/to/vpc/id
59
+ vpcId: vpc-12321421412
60
+
61
+ # Subnet IDs for Redshift cluster node placement. For automatic
62
+ # cluster relocation, specify at least one subnet per AZ.
63
+ # Often created by your VPC/networking stack.
64
+ # Example SSM: ssm:/path/to/subnet/id
65
+ subnetIds:
66
+ - subnet-12312312421
67
+ - subnet-12312321412
68
+ - subnet-12312321413
69
+
70
+ # Weekly maintenance window in ddd:hh24:mi-ddd:hh24:mi format
71
+ # (UTC). Example: 'Sun:23:45-Mon:00:15'.
72
+ preferredMaintenanceWindow: Sun:23:45-Mon:00:15
73
+
74
+ # (Optional) TCP port for client connections to the cluster
75
+ # (default: 5440)
76
+ clusterPort: 5440
77
+
78
+ # Security group ingress rules defining allowed inbound
79
+ # connections to the cluster port. Supports IPv4 CIDR blocks and
80
+ # security group references. All other traffic is blocked.
81
+ securityGroupIngress:
82
+ # (Optional) IPv4 CIDR blocks to allow traffic from
83
+ ipv4:
84
+ - 172.31.0.0/16
85
+ # (Optional) Security group IDs to allow traffic from
86
+ sg:
87
+ - ssm:/path/to/ssm
88
+
89
+ # Redshift node type determining compute and storage capacity
90
+ nodeType: RA3_4XLARGE
91
+ # Number of nodes in the Redshift cluster
92
+ numberOfNodes: 2
93
+
94
+ # Enable audit logging to a dedicated S3 bucket. The audit bucket
95
+ # uses SSE-S3 encryption (not KMS) due to Redshift requirements.
96
+ enableAuditLoggingToS3: true
97
+
98
+ # (Optional) Control whether a dedicated S3 bucket is created for
99
+ # warehouse data operations (default: true)
100
+ createWarehouseBucket: true
101
+ # (Optional) Initial database name created in the cluster
102
+ # (default: default_db)
103
+ dbName: 'test_db'
104
+ # (Optional) Multi-node cluster flag. When true, creates a
105
+ # multi-node cluster for distributed processing.
106
+ multiNode: true
107
+ # (Optional) Let Redshift manage the master password
108
+ redshiftManageMasterPassword: false
109
+
110
+ # (Optional) Additional cluster parameter group parameters for
111
+ # performance tuning. Security-sensitive values are automatically
112
+ # overridden for compliance (e.g., SSL enforcement).
113
+ parameterGroupParams:
114
+ max_concurrency_scaling_clusters: "1"
115
+ auto_analyze: "true"
116
+
117
+ # (Optional) Snapshot identifier for cluster restoration. Only
118
+ # provide when restoring from an existing snapshot.
119
+ snapshotIdentifier: test-snapshot-id
120
+
121
+ # (Optional) Snapshot owner account. Applicable if restoring the
122
+ # cluster from a snapshot that belongs to another account.
123
+ # By default, snapshots are searched within the current account.
124
+ snapshotOwnerAccount: '{{context:account-2}}'
125
+
126
+ # (Optional) Database users created in Redshift with credentials
127
+ # stored in Secrets Manager. Supports automated secret rotation.
128
+ databaseUsers:
129
+ # Name of the database user
130
+ - userName: 'serviceuserGlue'
131
+ # The DB to which the user will be added
132
+ dbName: 'default_db'
133
+ # Number of days between secret rotation
134
+ secretRotationDays: 90
135
+ # (Optional) Characters to exclude in the password
136
+ excludeCharacters: '"@/\\'
137
+ # (Optional) List of roles that need Redshift secret access
138
+ secretAccessRoles:
139
+ - name: 'test-arn'
140
+ - userName: 'serviceuserQuicksight'
141
+ dbName: 'default_db'
142
+ secretRotationDays: 90
143
+
144
+ # (Optional) Scheduled actions for automated cluster pause/resume.
145
+ # Each action specifies a target action, cron schedule, and active
146
+ # time window.
147
+ scheduledActions:
148
+ # Pause cluster every Friday at 6pm ET
149
+ - name: pause-cluster
150
+ # Scheduled action is enabled if true
151
+ enable: true
152
+ # Target operation: 'pauseCluster' or 'resumeCluster'
153
+ targetAction: pauseCluster
154
+ # Cron expression: cron(Minutes Hours Day-of-month Month
155
+ # Day-of-week Year)
156
+ schedule: cron(0 22 ? * FRI *)
157
+ # (Optional) UTC start date/time when the schedule becomes
158
+ # active (ISO 8601 format)
159
+ startTime: '2023-12-31T00:00:00Z'
160
+ # (Optional) UTC end date/time after which the schedule is no
161
+ # longer active
162
+ endTime: '2099-12-31T00:00:00Z'
163
+
164
+ # Resume cluster every Monday at 7am ET
165
+ - name: resume-cluster
166
+ enable: true
167
+ targetAction: resumeCluster
168
+ schedule: cron(0 12 ? * MON *)
169
+ startTime: '2023-12-31T00:00:00Z'
170
+ endTime: '2099-12-31T00:00:00Z'
171
+
172
+ # (Optional) Event notification configuration for cluster and
173
+ # scheduled action monitoring. Configures SNS notifications with
174
+ # email delivery, severity filtering, and event category selection.
175
+ eventNotifications:
176
+ # (Optional) Email addresses for SNS notification delivery
177
+ email:
178
+ - example@example.com
179
+ # (Optional) Minimum event severity level (enum: ERROR, INFO)
180
+ severity: INFO
181
+ # (Optional) Event categories to monitor
182
+ # (enum: configuration, management, monitoring, security,
183
+ # pending)
184
+ eventCategories:
185
+ - configuration
186
+ - management
187
+ - monitoring
188
+ - security
189
+ - pending
190
+
191
+ # (Optional) Workload management (WLM) configuration for query
192
+ # queue management and resource allocation.
193
+ workloadManagement:
194
+ - query_group: 'test-group'
195
+ memory_percent_to_use: 50
196
+ query_concurrency: 5
197
+
198
+ # (Optional) Enable multi-AZ deployment for high availability.
199
+ # Requires: numberOfNodes >= 2, subnetIds in >= 3 AZs,
200
+ # clusterPort in range 5431-5455 or 8191-8215.
201
+ multiAz: true
202
+
203
+ # (Optional) Target region for cross-region snapshot copies.
204
+ # When set, enables automatic cross-region snapshot copy to this region.
205
+ # Must differ from the cluster's deployment region.
206
+ backupRegion: us-west-2
207
+
208
+ # (Optional) When true, omits the explicit blockPublicAccess setting on S3
209
+ # buckets so CDK does not emit a PutBucketPublicAccessBlock API call. Use in
210
+ # SCP-restricted environments where public access block is managed externally
211
+ # via AWS account-level settings.
212
+ publicAccessBlockManagedExternally: false
@@ -0,0 +1,45 @@
1
+ # Minimal Redshift Data Warehouse module configuration.
2
+ # Contains only the required properties for a basic Redshift cluster
3
+ # deployment with VPC networking, security group, and audit logging.
4
+
5
+ # Admin username for the Redshift cluster. A secret is
6
+ # automatically generated for the password.
7
+ adminUsername: admin
8
+
9
+ # Number of days between admin password rotation
10
+ adminPasswordRotationDays: 30
11
+
12
+ # See CONFIGURATION.md for role reference options (name, arn, id).
13
+ # Admin roles granted full access to cluster resources including
14
+ # KMS keys and S3 buckets
15
+ dataAdminRoles:
16
+ - arn: arn:{{partition}}:iam::{{account}}:role/Admin
17
+
18
+ # Enable audit logging to a dedicated S3 bucket
19
+ enableAuditLoggingToS3: true
20
+
21
+ # Redshift node type determining compute and storage capacity
22
+ nodeType: RA3_4XLARGE
23
+ # Number of nodes in the Redshift cluster
24
+ numberOfNodes: 2
25
+
26
+ # Weekly maintenance window in ddd:hh24:mi-ddd:hh24:mi format (UTC)
27
+ preferredMaintenanceWindow: Sun:23:45-Mon:00:15
28
+
29
+ # Security group ingress rules defining allowed inbound
30
+ # connections to the cluster port
31
+ securityGroupIngress:
32
+ ipv4:
33
+ - 172.31.0.0/16
34
+
35
+ # Subnet IDs for Redshift cluster node placement
36
+ # Often created by your VPC/networking stack.
37
+ # Example SSM: ssm:/path/to/subnet/id
38
+ subnetIds:
39
+ - subnet-12312312421
40
+ - subnet-12312321412
41
+
42
+ # VPC ID for Redshift cluster deployment
43
+ # Often created by your VPC/networking stack.
44
+ # Example SSM: ssm:/path/to/vpc/id
45
+ vpcId: vpc-12321421412