@cxbuilder/flow-config 1.0.2 → 2.0.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.
Files changed (35) hide show
  1. package/.jsii +145 -68
  2. package/CHANGELOG.md +38 -0
  3. package/README.md +8 -5
  4. package/dist/backend/FlowConfig/index.js +111 -16
  5. package/dist/backend/FlowConfig/index.js.map +3 -3
  6. package/dist/backend/GetConfig/index.js +1 -1
  7. package/dist/backend/GetConfig/index.js.map +2 -2
  8. package/dist/backend/Init/index.js +2 -1
  9. package/dist/backend/Init/index.js.map +2 -2
  10. package/dist/backend/Settings/index.js +255 -0
  11. package/dist/backend/Settings/index.js.map +7 -0
  12. package/dist/backend/Static/static/assets/index-Cejunttu.js +61 -0
  13. package/dist/backend/Static/static/assets/{index-NRh8x3FI.css → index-SZuscj14.css} +1 -1
  14. package/dist/backend/Static/static/index.html +3 -3
  15. package/dist/infrastructure/FlowConfigStack.d.ts +36 -14
  16. package/dist/infrastructure/FlowConfigStack.js +54 -18
  17. package/dist/infrastructure/GetConfig/index.js +2 -2
  18. package/dist/infrastructure/api/Api.d.ts +5 -2
  19. package/dist/infrastructure/api/Api.js +21 -15
  20. package/dist/infrastructure/api/Init/Init.interface.d.ts +4 -0
  21. package/dist/infrastructure/api/Init/Init.interface.js +1 -1
  22. package/dist/infrastructure/api/Init/index.js +2 -1
  23. package/dist/infrastructure/api/Settings/Settings.interface.d.ts +3 -0
  24. package/dist/infrastructure/api/Settings/Settings.interface.js +3 -0
  25. package/dist/infrastructure/api/Settings/index.d.ts +7 -0
  26. package/dist/infrastructure/api/Settings/index.js +21 -0
  27. package/dist/infrastructure/api/spec.yaml +122 -0
  28. package/dist/infrastructure/createLambda.js +1 -1
  29. package/dist/infrastructure/index.d.ts +1 -1
  30. package/dist/infrastructure/index.js +1 -1
  31. package/dist/infrastructure/tsconfig.tsbuildinfo +1 -1
  32. package/docs/Permissions-v1.md +132 -0
  33. package/docs/{Permissions.md → Permissions-v2.md} +15 -15
  34. package/package.json +1 -1
  35. package/dist/backend/Static/static/assets/index-Bx9Z3cF9.js +0 -61
@@ -3,9 +3,9 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>CXBuilder Flow Config</title>
7
- <script type="module" crossorigin src="/prod/assets/index-Bx9Z3cF9.js"></script>
8
- <link rel="stylesheet" crossorigin href="/prod/assets/index-NRh8x3FI.css">
6
+ <title>Flow Config</title>
7
+ <script type="module" crossorigin src="/prod/assets/index-Cejunttu.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/prod/assets/index-SZuscj14.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root" style="width: 100%;"></div>
@@ -18,9 +18,23 @@ export interface CognitoConfig {
18
18
  readonly ssoProviderName?: string;
19
19
  }
20
20
  /**
21
- * VPC configuration for private deployment using string IDs
21
+ * VPC configuration for API Gateway
22
+ * If provided, the API will be deployed in a private VPC.
22
23
  */
23
- export interface VpcConfig {
24
+ export interface ApiVpcConfig {
25
+ /**
26
+ * The VPC ID to use for the API
27
+ */
28
+ readonly vpcId: string;
29
+ /**
30
+ * The VPC endpoint ID to use for the API
31
+ */
32
+ readonly vpcEndpointId: string;
33
+ }
34
+ /**
35
+ * Lambda VPC configuration
36
+ */
37
+ export interface LambdaVpcConfig {
24
38
  /**
25
39
  * The VPC ID to deploy resources into
26
40
  */
@@ -28,15 +42,11 @@ export interface VpcConfig {
28
42
  /**
29
43
  * Security group IDs for Lambda functions
30
44
  */
31
- readonly lambdaSecurityGroupIds: string[];
45
+ readonly securityGroupIds: string[];
32
46
  /**
33
47
  * Private subnet IDs for Lambda functions
34
48
  */
35
- readonly privateSubnetIds: string[];
36
- /**
37
- * Security group IDs for VPC endpoints
38
- */
39
- readonly vpcEndpointSecurityGroupIds: string[];
49
+ readonly subnetIds: string[];
40
50
  }
41
51
  /**
42
52
  * Global table configuration for multi-region deployments
@@ -59,11 +69,11 @@ export interface ResolvedVpcConfig {
59
69
  readonly vpc: IVpc;
60
70
  readonly lambdaSecurityGroups: ISecurityGroup[];
61
71
  readonly privateSubnets: ISubnet[];
62
- readonly vpcEndpointSecurityGroups: ISecurityGroup[];
63
72
  }
64
73
  export interface FlowConfigStackProps extends cdk.StackProps {
65
74
  /**
66
- * Used for resource naming
75
+ * Used for resource naming. Will also be the name of the Connect Lambda
76
+ * @example `cxbuilder-flow-config`
67
77
  */
68
78
  readonly prefix: string;
69
79
  readonly cognito: CognitoConfig;
@@ -74,17 +84,25 @@ export interface FlowConfigStackProps extends cdk.StackProps {
74
84
  readonly alertEmails: string[];
75
85
  readonly prod?: boolean;
76
86
  /**
77
- * VPC configuration for private deployment.
78
- * If provided, the application will be configured for VPC-only access.
79
- * If undefined, uses the current public configuration.
87
+ * If provided, the API will be deployed in a VPC.
88
+ */
89
+ readonly apiVpcConfig?: ApiVpcConfig;
90
+ /**
91
+ * If provided, the Lambda functions will be deployed in a VPC.
92
+ * Note: VPC should contain endpoints to: CloudFormation, Lambda, DynamoDB, SNS, and Polly.
80
93
  */
81
- readonly vpc?: VpcConfig;
94
+ readonly lambdaVpcConfig?: LambdaVpcConfig;
82
95
  /**
83
96
  * Global table configuration for multi-region deployments.
84
97
  * If provided, enables global table support.
85
98
  * If undefined, creates a single-region table.
86
99
  */
87
100
  readonly globalTable?: GlobalTableConfig;
101
+ /**
102
+ * Set to false to remove CXBuilder branding from the web app.
103
+ * @default true
104
+ */
105
+ readonly branding?: boolean;
88
106
  }
89
107
  export declare class FlowConfigStack extends cdk.Stack {
90
108
  props: FlowConfigStackProps;
@@ -105,6 +123,10 @@ export declare class FlowConfigStack extends cdk.Stack {
105
123
  get appUrl(): string;
106
124
  constructor(scope: Construct, id: string, props: FlowConfigStackProps);
107
125
  createUserPoolClient(): UserPoolClient;
126
+ /**
127
+ * Create Cognito User Groups for role-based access control
128
+ */
129
+ createUserPoolGroups(): void;
108
130
  /**
109
131
  * Associated Voicemail as Agent Workspace app
110
132
  */
@@ -23,11 +23,10 @@ class FlowConfigStack extends cdk.Stack {
23
23
  return this._resolvedVpcConfig;
24
24
  }
25
25
  get appUrl() {
26
- const { region } = cdk.Stack.of(this);
27
- return `https://${this.api.restApi.restApiId}.execute-api.${region}.amazonaws.com/prod`;
26
+ return this.api.url;
28
27
  }
29
28
  constructor(scope, id, props) {
30
- const { prefix, cognito, alertEmails, prod = false, vpc, globalTable, } = props;
29
+ const { prefix, cognito, alertEmails, prod = false, lambdaVpcConfig, globalTable, } = props;
31
30
  super(scope, id, {
32
31
  ...props,
33
32
  stackName: props.stackName ?? prefix,
@@ -37,7 +36,9 @@ class FlowConfigStack extends cdk.Stack {
37
36
  });
38
37
  this.props = props;
39
38
  // Resolve VPC configuration if provided
40
- this._resolvedVpcConfig = vpc ? this.resolveVpcConfig(vpc) : undefined;
39
+ this._resolvedVpcConfig = lambdaVpcConfig
40
+ ? this.resolveVpcConfig(lambdaVpcConfig)
41
+ : undefined;
41
42
  // DynamoDB table for storing flow configs
42
43
  this.table = this.createTable(prefix, prod, globalTable);
43
44
  this.alertTopic = new aws_sns_1.Topic(this, 'AlertTopic', {
@@ -48,6 +49,7 @@ class FlowConfigStack extends cdk.Stack {
48
49
  const getConfig = new GetConfig_1.GetConfig(this);
49
50
  this.api = new Api_1.Api(this);
50
51
  this.userPoolClient = this.createUserPoolClient();
52
+ this.createUserPoolGroups();
51
53
  this.associate3pApp();
52
54
  new cdk.CfnOutput(this, 'AppUrl', {
53
55
  value: this.appUrl,
@@ -83,6 +85,32 @@ class FlowConfigStack extends cdk.Stack {
83
85
  });
84
86
  return client;
85
87
  }
88
+ /**
89
+ * Create Cognito User Groups for role-based access control
90
+ */
91
+ createUserPoolGroups() {
92
+ // FlowConfigAdmin - Full CRUD access
93
+ new aws_cognito_1.CfnUserPoolGroup(this, 'FlowConfigAdminGroup', {
94
+ userPoolId: this.userPool.userPoolId,
95
+ groupName: 'FlowConfigAdmin',
96
+ description: 'Full administrative access to all flow configs - can create, read, update, and delete flow configs and all their properties',
97
+ precedence: 1,
98
+ });
99
+ // FlowConfigEdit - Edit variable/prompt values only
100
+ new aws_cognito_1.CfnUserPoolGroup(this, 'FlowConfigEditGroup', {
101
+ userPoolId: this.userPool.userPoolId,
102
+ groupName: 'FlowConfigEdit',
103
+ description: 'Edit access to flow configs - can read and modify variable values and prompt content but cannot add/remove fields or delete configs',
104
+ precedence: 2,
105
+ });
106
+ // FlowConfigRead - Read-only access
107
+ new aws_cognito_1.CfnUserPoolGroup(this, 'FlowConfigReadGroup', {
108
+ userPoolId: this.userPool.userPoolId,
109
+ groupName: 'FlowConfigRead',
110
+ description: 'Read-only access to all flow configs for reporting and reference purposes',
111
+ precedence: 3,
112
+ });
113
+ }
86
114
  /**
87
115
  * Associated Voicemail as Agent Workspace app
88
116
  */
@@ -133,13 +161,13 @@ class FlowConfigStack extends cdk.Stack {
133
161
  const tableName = prefix;
134
162
  if (!globalTable) {
135
163
  // Single-region table
136
- return new dynamodb.Table(this, 'FlowConfigsTable', {
164
+ return new dynamodb.TableV2(this, 'Table', {
137
165
  tableName,
138
166
  partitionKey: {
139
167
  name: 'id',
140
168
  type: dynamodb.AttributeType.STRING,
141
169
  },
142
- billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
170
+ billing: dynamodb.Billing.onDemand(),
143
171
  pointInTimeRecoverySpecification: {
144
172
  pointInTimeRecoveryEnabled: true,
145
173
  },
@@ -151,50 +179,58 @@ class FlowConfigStack extends cdk.Stack {
151
179
  }
152
180
  if (globalTable.isPrimaryRegion) {
153
181
  // Primary region creates global table with replicas
154
- return new dynamodb.Table(this, 'FlowConfigsTable', {
182
+ const table = new dynamodb.TableV2(this, 'Table', {
155
183
  tableName,
156
184
  partitionKey: {
157
185
  name: 'id',
158
186
  type: dynamodb.AttributeType.STRING,
159
187
  },
160
- billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
188
+ billing: dynamodb.Billing.onDemand(),
161
189
  pointInTimeRecoverySpecification: {
162
190
  pointInTimeRecoveryEnabled: true,
163
191
  },
164
- replicationRegions: globalTable.replicaRegions || [],
165
192
  deletionProtection: prod,
166
193
  removalPolicy: prod
167
194
  ? cdk.RemovalPolicy.RETAIN
168
195
  : cdk.RemovalPolicy.DESTROY,
169
196
  });
197
+ if (globalTable.replicaRegions) {
198
+ for (const region of globalTable.replicaRegions) {
199
+ table.addReplica({
200
+ region,
201
+ deletionProtection: prod,
202
+ pointInTimeRecoverySpecification: {
203
+ pointInTimeRecoveryEnabled: true,
204
+ },
205
+ });
206
+ }
207
+ }
208
+ return table;
170
209
  }
171
210
  else {
172
211
  // Secondary region references existing global table
173
- return dynamodb.Table.fromTableArn(this, 'FlowConfigsTable', `arn:aws:dynamodb:${this.region}:${this.account}:table/${tableName}`);
212
+ return dynamodb.Table.fromTableArn(this, 'Table', `arn:aws:dynamodb:${this.region}:${this.account}:table/${tableName}`);
174
213
  }
175
214
  }
176
215
  /**
177
216
  * Resolve VPC configuration string IDs to CDK objects
178
217
  */
179
218
  resolveVpcConfig(vpcConfig) {
180
- const { vpcId, lambdaSecurityGroupIds, privateSubnetIds, vpcEndpointSecurityGroupIds, } = vpcConfig;
219
+ const { vpcId, securityGroupIds, subnetIds } = vpcConfig;
181
220
  // Resolve VPC
182
221
  const vpc = ec2.Vpc.fromLookup(this, 'ResolvedVpc', { vpcId });
183
222
  // Resolve Lambda security groups
184
- const lambdaSecurityGroups = lambdaSecurityGroupIds.map((sgId, index) => ec2.SecurityGroup.fromSecurityGroupId(this, `LambdaSecurityGroup${index}`, sgId));
223
+ const lambdaSecurityGroups = securityGroupIds.map((sgId, index) => ec2.SecurityGroup.fromSecurityGroupId(this, `LambdaSecurityGroup${index}`, sgId));
185
224
  // Resolve private subnets
186
- const privateSubnets = privateSubnetIds.map((subnetId, index) => ec2.Subnet.fromSubnetId(this, `PrivateSubnet${index}`, subnetId));
187
- // Resolve VPC endpoint security groups
188
- const vpcEndpointSecurityGroups = vpcEndpointSecurityGroupIds.map((sgId, index) => ec2.SecurityGroup.fromSecurityGroupId(this, `VpcEndpointSecurityGroup${index}`, sgId));
225
+ const privateSubnets = subnetIds.map((subnetId, index) => ec2.Subnet.fromSubnetId(this, `PrivateSubnet${index}`, subnetId));
189
226
  return {
190
227
  vpc,
191
228
  lambdaSecurityGroups,
192
229
  privateSubnets,
193
- vpcEndpointSecurityGroups,
194
230
  };
195
231
  }
196
232
  }
197
233
  exports.FlowConfigStack = FlowConfigStack;
198
234
  _a = JSII_RTTI_SYMBOL_1;
199
- FlowConfigStack[_a] = { fqn: "@cxbuilder/flow-config.FlowConfigStack", version: "1.0.2" };
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NvbmZpZ1N0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vaW5mcmFzdHJ1Y3R1cmUvRmxvd0NvbmZpZ1N0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLHlEQUtpQztBQUNqQyxxREFBcUQ7QUFFckQsMkNBQTJDO0FBRTNDLG1DQUFnQztBQUNoQyxpREFBNEM7QUFDNUMsNkVBQXNFO0FBQ3RFLHVFQUFvRTtBQUNwRSx5REFBb0U7QUFDcEUseUVBQWlFO0FBQ2pFLDJDQUF3QztBQW1HeEMsTUFBYSxlQUFnQixTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBWTVDOzs7T0FHRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sV0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLGdCQUFnQixNQUFNLHFCQUFxQixDQUFDO0lBQzFGLENBQUM7SUFFRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDSCxLQUEyQjtRQUVsQyxNQUFNLEVBQ0osTUFBTSxFQUNOLE9BQU8sRUFDUCxXQUFXLEVBQ1gsSUFBSSxHQUFHLEtBQUssRUFDWixHQUFHLEVBQ0gsV0FBVyxHQUNaLEdBQUcsS0FBSyxDQUFDO1FBQ1YsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxNQUFNO1lBQ3BDLFdBQVcsRUFDVCxLQUFLLENBQUMsV0FBVztnQkFDakIsMklBQTJJO1lBQzdJLHFCQUFxQixFQUFFLElBQUk7U0FDNUIsQ0FBQyxDQUFDO1FBakJJLFVBQUssR0FBTCxLQUFLLENB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LG1CQUFtQixDQUNuQyxJQUFJLEVBQ0osc0JBQXNCLEtBQUssRUFBRSxFQUM3QixJQUFJLENBQ0wsQ0FDRixDQUFDO1FBRUYsMEJBQTBCO1FBQzFCLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUM5RCxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUNqRSxDQUFDO1FBRUYsdUNBQXVDO1FBQ3ZDLE1BQU0seUJBQXlCLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxDQUMvRCxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNkLEdBQUcsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQ25DLElBQUksRUFDSiwyQkFBMkIsS0FBSyxFQUFFLEVBQ2xDLElBQUksQ0FDTCxDQUNKLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRztZQUNILG9CQUFvQjtZQUNwQixjQUFjO1lBQ2QseUJBQXlCO1NBQzFCLENBQUM7SUFDSixDQUFDOztBQWxSSCwwQ0FtUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgSVVzZXJQb29sLFxuICBVc2VyUG9vbCxcbiAgVXNlclBvb2xDbGllbnQsXG4gIFVzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlcixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZ25pdG8nO1xuaW1wb3J0ICogYXMgZHluYW1vZGIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiJztcbmltcG9ydCB7IElWcGMsIElTZWN1cml0eUdyb3VwLCBJU3VibmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEFwaSB9IGZyb20gJy4vYXBpL0FwaSc7XG5pbXBvcnQgeyBUb3BpYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgRW1haWxTdWJzY3JpcHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zLXN1YnNjcmlwdGlvbnMnO1xuaW1wb3J0IHsgU2VjdXJpdHlQcm9maWxlUHJvdmlkZXIgfSBmcm9tICcuL1NlY3VyaXR5UHJvZmlsZVByb3ZpZGVyJztcbmltcG9ydCB7IENmbkludGVncmF0aW9uQXNzb2NpYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29ubmVjdCc7XG5pbXBvcnQgeyBDZm5BcHBsaWNhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcHBpbnRlZ3JhdGlvbnMnO1xuaW1wb3J0IHsgR2V0Q29uZmlnIH0gZnJvbSAnLi9HZXRDb25maWcnO1xuXG4vKipcbiAqIENvZ25pdG8gY29uZmlndXJhdGlvbiBmb3IgRmxvd0NvbmZpZyBzdGFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ25pdG9Db25maWcge1xuICByZWFkb25seSB1c2VyUG9vbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZ1bGwgZG9tYWluIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgY2xpZW50IHdpbGwgYXV0aCB0byBTU08uIE90aGVyd2lzZSB3aWxsIGF1dGggdG8gdXNlciBwb29sXG4gICAqL1xuICByZWFkb25seSBzc29Qcm92aWRlck5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVlBDIGNvbmZpZ3VyYXRpb24gZm9yIHByaXZhdGUgZGVwbG95bWVudCB1c2luZyBzdHJpbmcgSURzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBWUEMgSUQgdG8gZGVwbG95IHJlc291cmNlcyBpbnRvXG4gICAqL1xuICByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBJRHMgZm9yIExhbWJkYSBmdW5jdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYVNlY3VyaXR5R3JvdXBJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHN1Ym5ldCBJRHMgZm9yIExhbWJkYSBmdW5jdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBJRHMgZm9yIFZQQyBlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY0VuZHBvaW50U2VjdXJpdHlHcm91cElkczogc3RyaW5nW107XG59XG5cbi8qKlxuICogR2xvYmFsIHRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpLXJlZ2lvbiBkZXBsb3ltZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbFRhYmxlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSByZWdpb24gdGhhdCBjcmVhdGVzIHRoZSBnbG9iYWwgdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGlzUHJpbWFyeVJlZ2lvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBhbGwgcmVnaW9ucyB0aGF0IHNob3VsZCBoYXZlIHJlcGxpY2FzXG4gICAqIE9ubHkgdXNlZCBieSB0aGUgcHJpbWFyeSByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FSZWdpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaW50ZXJmYWNlIGZvciByZXNvbHZlZCBWUEMgcmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRWcGNDb25maWcge1xuICByZWFkb25seSB2cGM6IElWcGM7XG4gIHJlYWRvbmx5IGxhbWJkYVNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuICByZWFkb25seSBwcml2YXRlU3VibmV0czogSVN1Ym5ldFtdO1xuICByZWFkb25seSB2cGNFbmRwb2ludFNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDb25maWdTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xuICAvKipcbiAgICogVXNlZCBmb3IgcmVzb3VyY2UgbmFtaW5nXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcmVhZG9ubHkgY29nbml0bzogQ29nbml0b0NvbmZpZztcbiAgcmVhZG9ubHkgY29ubmVjdEluc3RhbmNlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdobyB0byBub3RpZnkgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zXG4gICAqL1xuICByZWFkb25seSBhbGVydEVtYWlsczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByb2Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWUEMgY29uZmlndXJhdGlvbiBmb3IgcHJpdmF0ZSBkZXBsb3ltZW50LlxuICAgKiBJZiBwcm92aWRlZCwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgY29uZmlndXJlZCBmb3IgVlBDLW9ubHkgYWNjZXNzLlxuICAgKiBJZiB1bmRlZmluZWQsIHVzZXMgdGhlIGN1cnJlbnQgcHVibGljIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBWcGNDb25maWc7XG5cbiAgLyoqXG4gICAqIEdsb2JhbCB0YWJsZSBjb25maWd1cmF0aW9uIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHMuXG4gICAqIElmIHByb3ZpZGVkLCBlbmFibGVzIGdsb2JhbCB0YWJsZSBzdXBwb3J0LlxuICAgKiBJZiB1bmRlZmluZWQsIGNyZWF0ZXMgYSBzaW5nbGUtcmVnaW9uIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2xvYmFsVGFibGU/OiBHbG9iYWxUYWJsZUNvbmZpZztcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3dDb25maWdTdGFjayBleHRlbmRzIGNkay5TdGFjayB7XG4gIHVzZXJQb29sOiBJVXNlclBvb2w7XG4gIHByaXZhdGUgYXBpOiBBcGk7XG4gIHVzZXJQb29sQ2xpZW50OiBVc2VyUG9vbENsaWVudDtcbiAgYWxlcnRUb3BpYzogVG9waWM7XG4gIHRhYmxlOiBjZGsuYXdzX2R5bmFtb2RiLklUYWJsZTtcblxuICAvKipcbiAgICogUmVzb2x2ZWQgVlBDIGNvbmZpZ3VyYXRpb24gaWYgcHJpdmF0ZSBkZXBsb3ltZW50IGlzIGVuYWJsZWRcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc29sdmVkVnBjQ29uZmlnPzogUmVzb2x2ZWRWcGNDb25maWc7XG5cbiAgLyoqXG4gICAqIEdldCByZXNvbHZlZCBWUEMgY29uZmlndXJhdGlvbiBmb3IgY2hpbGQgY29uc3RydWN0c1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZ2V0UmVzb2x2ZWRWcGNDb25maWcoKTogUmVzb2x2ZWRWcGNDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZFZwY0NvbmZpZztcbiAgfVxuXG4gIGdldCBhcHBVcmwoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHJlZ2lvbiB9ID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMuYXBpLnJlc3RBcGkucmVzdEFwaUlkfS5leGVjdXRlLWFwaS4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbS9wcm9kYDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcHJvcHM6IEZsb3dDb25maWdTdGFja1Byb3BzXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeCxcbiAgICAgIGNvZ25pdG8sXG4gICAgICBhbGVydEVtYWlscyxcbiAgICAgIHByb2QgPSBmYWxzZSxcbiAgICAgIHZwYyxcbiAgICAgIGdsb2JhbFRhYmxlLFxuICAgIH0gPSBwcm9wcztcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3RhY2tOYW1lOiBwcm9wcy5zdGFja05hbWUgPz8gcHJlZml4LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIHByb3BzLmRlc2NyaXB0aW9uID8/XG4gICAgICAgICdXZWItYmFzZWQgaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBmbG93IHZhcmlhYmxlcyBhbmQgcHJvbXB0cyB0aGF0IGFyZSBkeW5hbWljYWxseSByZXRyaWV2ZWQgYnkgQW1hem9uIENvbm5lY3QgZHVyaW5nIGN1c3RvbWVyIGludGVyYWN0aW9ucycsXG4gICAgICB0ZXJtaW5hdGlvblByb3RlY3Rpb246IHByb2QsXG4gICAgfSk7XG5cbiAgICAvLyBSZXNvbHZlIFZQQyBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkXG4gICAgdGhpcy5fcmVzb2x2ZWRWcGNDb25maWcgPSB2cGMgPyB0aGlzLnJlc29sdmVWcGNDb25maWcodnBjKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIER5bmFtb0RCIHRhYmxlIGZvciBzdG9yaW5nIGZsb3cgY29uZmlnc1xuICAgIHRoaXMudGFibGUgPSB0aGlzLmNyZWF0ZVRhYmxlKHByZWZpeCwgcHJvZCwgZ2xvYmFsVGFibGUpO1xuXG4gICAgdGhpcy5hbGVydFRvcGljID0gbmV3IFRvcGljKHRoaXMsICdBbGVydFRvcGljJywge1xuICAgICAgdG9waWNOYW1lOiBgJHtwcmVmaXh9LWVycm9yLWFsZXJ0c2AsXG4gICAgfSk7XG4gICAgYWxlcnRFbWFpbHMuZm9yRWFjaCgoZSkgPT5cbiAgICAgIHRoaXMuYWxlcnRUb3BpYy5hZGRTdWJzY3JpcHRpb24obmV3IEVtYWlsU3Vic2NyaXB0aW9uKGUpKVxuICAgICk7XG5cbiAgICB0aGlzLnVzZXJQb29sID0gVXNlclBvb2wuZnJvbVVzZXJQb29sSWQoXG4gICAgICB0aGlzLFxuICAgICAgJ1VzZXJQb29sJyxcbiAgICAgIGNvZ25pdG8udXNlclBvb2xJZFxuICAgICk7XG5cbiAgICBjb25zdCBnZXRDb25maWcgPSBuZXcgR2V0Q29uZmlnKHRoaXMpO1xuICAgIHRoaXMuYXBpID0gbmV3IEFwaSh0aGlzKTtcblxuICAgIHRoaXMudXNlclBvb2xDbGllbnQgPSB0aGlzLmNyZWF0ZVVzZXJQb29sQ2xpZW50KCk7XG5cbiAgICB0aGlzLmFzc29jaWF0ZTNwQXBwKCk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnQXBwVXJsJywge1xuICAgICAgdmFsdWU6IHRoaXMuYXBwVXJsLFxuICAgICAgZGVzY3JpcHRpb246ICdCYXNlIFVSTCBmb3IgdGhlIEZsb3cgQ29uZmlnIGFwcGxpY2F0aW9uJyxcbiAgICB9KTtcbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnQXBpVXJsJywge1xuICAgICAgdmFsdWU6IGAke3RoaXMuYXBwVXJsfS9hcGlgLFxuICAgICAgZGVzY3JpcHRpb246ICdCYXNlIFVSTCBmb3IgdGhlIEZsb3cgQ29uZmlnIEFQSScsXG4gICAgfSk7XG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0dldENvbmZpZ0xhbWJkYU5hbWUnLCB7XG4gICAgICB2YWx1ZTogZ2V0Q29uZmlnLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnTGFtYmRhIGZ1bmN0aW9uIG5hbWUgZm9yIGFjY2Vzc2luZyBmbG93IGNvbmZpZ3MgZnJvbSBDb25uZWN0JyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVVzZXJQb29sQ2xpZW50KCk6IFVzZXJQb29sQ2xpZW50IHtcbiAgICBjb25zdCB7IHByZWZpeCwgY29nbml0byB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGRvbWFpbnMgPSBbJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsIHRoaXMuYXBwVXJsXTtcblxuICAgIGNvbnN0IG9BdXRoID0ge1xuICAgICAgY2FsbGJhY2tVcmxzOiBkb21haW5zLm1hcCgoeCkgPT4gYCR7eH0vcG9wdXAuaHRtbGApLFxuICAgICAgbG9nb3V0VXJsczogZG9tYWlucyxcbiAgICB9O1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBVc2VyUG9vbENsaWVudCh0aGlzLCAnVXNlclBvb2xDbGllbnQnLCB7XG4gICAgICB1c2VyUG9vbENsaWVudE5hbWU6IHByZWZpeCxcbiAgICAgIHVzZXJQb29sOiB0aGlzLnVzZXJQb29sLFxuICAgICAgc3VwcG9ydGVkSWRlbnRpdHlQcm92aWRlcnM6IGNvZ25pdG8uc3NvUHJvdmlkZXJOYW1lXG4gICAgICAgID8gW1VzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlci5jdXN0b20oY29nbml0by5zc29Qcm92aWRlck5hbWUpXVxuICAgICAgICA6IFtVc2VyUG9vbENsaWVudElkZW50aXR5UHJvdmlkZXIuQ09HTklUT10sXG4gICAgICBnZW5lcmF0ZVNlY3JldDogZmFsc2UsXG4gICAgICBvQXV0aCxcbiAgICB9KTtcblxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdVc2VyUG9vbENsaWVudElkJywge1xuICAgICAgdmFsdWU6IGNsaWVudC51c2VyUG9vbENsaWVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQXNzb2NpYXRlZCBWb2ljZW1haWwgYXMgQWdlbnQgV29ya3NwYWNlIGFwcFxuICAgKi9cbiAgYXNzb2NpYXRlM3BBcHAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvcHM6IHsgcHJlZml4LCBjb25uZWN0SW5zdGFuY2VBcm4gfSxcbiAgICAgIGFwcFVybDogdXJsLFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCBuYW1lc3BhY2UgPSBgY3hidWlsZGVyLiR7cHJlZml4fWA7XG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggPiAzMiAmJiAhY2RrLlRva2VuLmlzVW5yZXNvbHZlZChuYW1lc3BhY2UpKSB7XG4gICAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2Uuc3Vic3RyaW5nKDAsIDMyKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHAgPSBuZXcgQ2ZuQXBwbGljYXRpb24odGhpcywgJzNwQXBwJywge1xuICAgICAgbmFtZTogdGhpcy5wcm9wcy5wcmVmaXgsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0FnZW50IFdvcmtzcGFjZSBhcHAgZm9yIGNvbmZpZ3VyaW5nIGNvbnRhY3QgZmxvdyB2YXJpYWJsZXMgYW5kIHByb21wdHMnLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgYXBwbGljYXRpb25Tb3VyY2VDb25maWc6IHtcbiAgICAgICAgZXh0ZXJuYWxVcmxDb25maWc6IHtcbiAgICAgICAgICBhY2Nlc3NVcmw6IHVybCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyBkb2NzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS8zcC1hcHBzLWV2ZW50cy1yZXF1ZXN0cy5odG1sXG4gICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAnVXNlci5EZXRhaWxzLlZpZXcnLFxuICAgICAgICAnVXNlci5Db25maWd1cmF0aW9uLlZpZXcnLFxuICAgICAgICAnVXNlci5TdGF0dXMuVmlldycsXG4gICAgICAgICdDb250YWN0LkRldGFpbHMuVmlldycsXG4gICAgICAgICdDb250YWN0LkN1c3RvbWVyRGV0YWlscy5WaWV3JyxcbiAgICAgICAgJ0NvbnRhY3QuVmFyaWFibGVzLlZpZXcnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFzc29jaWF0aW9uID0gbmV3IENmbkludGVncmF0aW9uQXNzb2NpYXRpb24oXG4gICAgICB0aGlzLFxuICAgICAgJzNwQXBwQXNzb2NpYXRpb24nLFxuICAgICAge1xuICAgICAgICBpbnN0YW5jZUlkOiBjb25uZWN0SW5zdGFuY2VBcm4sXG4gICAgICAgIGludGVncmF0aW9uVHlwZTogJ0FQUExJQ0FUSU9OJyxcbiAgICAgICAgaW50ZWdyYXRpb25Bcm46IGFwcC5hdHRyQXBwbGljYXRpb25Bcm4sXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IFNlY3VyaXR5UHJvZmlsZVByb3ZpZGVyKFxuICAgICAgdGhpcyxcbiAgICAgICdTZWN1cml0eVByb2ZpbGVQcm92aWRlcicsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RJbnN0YW5jZUFybixcbiAgICAgIH1cbiAgICApO1xuICAgIHByb3ZpZGVyLm5vZGUuYWRkRGVwZW5kZW5jeShhc3NvY2lhdGlvbik7XG5cbiAgICAvLyBBdXRvbWF0aWNhbGx5IGFzc29jaWF0ZSB3aXRoIHNlY3VyaXR5IHByb2ZpbGVzXG4gICAgY29uc3Qgc2VjdXJpdHlQcm9maWxlcyA9IFsnQWRtaW4nXTtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2Ygc2VjdXJpdHlQcm9maWxlcykge1xuICAgICAgcHJvdmlkZXIuYWxsb3dBcHBsaWNhdGlvbihgQWxsb3cke3Byb2ZpbGV9YCwgcHJvZmlsZSwgbmFtZXNwYWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIER5bmFtb0RCIHRhYmxlIHdpdGggb3B0aW9uYWwgZ2xvYmFsIHRhYmxlIHN1cHBvcnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVGFibGUoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgcHJvZDogYm9vbGVhbixcbiAgICBnbG9iYWxUYWJsZT86IEdsb2JhbFRhYmxlQ29uZmlnXG4gICk6IGR5bmFtb2RiLklUYWJsZSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gcHJlZml4O1xuXG4gICAgaWYgKCFnbG9iYWxUYWJsZSkge1xuICAgICAgLy8gU2luZ2xlLXJlZ2lvbiB0YWJsZVxuICAgICAgcmV0dXJuIG5ldyBkeW5hbW9kYi5UYWJsZSh0aGlzLCAnRmxvd0NvbmZpZ3NUYWJsZScsIHtcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgIHR5cGU6IGR5bmFtb2RiLkF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxuICAgICAgICB9LFxuICAgICAgICBiaWxsaW5nTW9kZTogZHluYW1vZGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlFbmFibGVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb2QsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb2RcbiAgICAgICAgICA/IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgICAgICAgIDogY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnbG9iYWxUYWJsZS5pc1ByaW1hcnlSZWdpb24pIHtcbiAgICAgIC8vIFByaW1hcnkgcmVnaW9uIGNyZWF0ZXMgZ2xvYmFsIHRhYmxlIHdpdGggcmVwbGljYXNcbiAgICAgIHJldHVybiBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ0Zsb3dDb25maWdzVGFibGUnLCB7XG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgbmFtZTogJ2lkJyxcbiAgICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgICAgfSxcbiAgICAgICAgYmlsbGluZ01vZGU6IGR5bmFtb2RiLkJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVwbGljYXRpb25SZWdpb25zOiBnbG9iYWxUYWJsZS5yZXBsaWNhUmVnaW9ucyB8fCBbXSxcbiAgICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiBwcm9kLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBwcm9kXG4gICAgICAgICAgPyBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAgICAgICAgICA6IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2Vjb25kYXJ5IHJlZ2lvbiByZWZlcmVuY2VzIGV4aXN0aW5nIGdsb2JhbCB0YWJsZVxuICAgICAgcmV0dXJuIGR5bmFtb2RiLlRhYmxlLmZyb21UYWJsZUFybihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ0Zsb3dDb25maWdzVGFibGUnLFxuICAgICAgICBgYXJuOmF3czpkeW5hbW9kYjoke3RoaXMucmVnaW9ufToke3RoaXMuYWNjb3VudH06dGFibGUvJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBWUEMgY29uZmlndXJhdGlvbiBzdHJpbmcgSURzIHRvIENESyBvYmplY3RzXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWcGNDb25maWcodnBjQ29uZmlnOiBWcGNDb25maWcpOiBSZXNvbHZlZFZwY0NvbmZpZyB7XG4gICAgY29uc3Qge1xuICAgICAgdnBjSWQsXG4gICAgICBsYW1iZGFTZWN1cml0eUdyb3VwSWRzLFxuICAgICAgcHJpdmF0ZVN1Ym5ldElkcyxcbiAgICAgIHZwY0VuZHBvaW50U2VjdXJpdHlHcm91cElkcyxcbiAgICB9ID0gdnBjQ29uZmlnO1xuXG4gICAgLy8gUmVzb2x2ZSBWUENcbiAgICBjb25zdCB2cGMgPSBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgJ1Jlc29sdmVkVnBjJywgeyB2cGNJZCB9KTtcblxuICAgIC8vIFJlc29sdmUgTGFtYmRhIHNlY3VyaXR5IGdyb3Vwc1xuICAgIGNvbnN0IGxhbWJkYVNlY3VyaXR5R3JvdXBzID0gbGFtYmRhU2VjdXJpdHlHcm91cElkcy5tYXAoKHNnSWQsIGluZGV4KSA9PlxuICAgICAgZWMyLlNlY3VyaXR5R3JvdXAuZnJvbVNlY3VyaXR5R3JvdXBJZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExhbWJkYVNlY3VyaXR5R3JvdXAke2luZGV4fWAsXG4gICAgICAgIHNnSWRcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gUmVzb2x2ZSBwcml2YXRlIHN1Ym5ldHNcbiAgICBjb25zdCBwcml2YXRlU3VibmV0cyA9IHByaXZhdGVTdWJuZXRJZHMubWFwKChzdWJuZXRJZCwgaW5kZXgpID0+XG4gICAgICBlYzIuU3VibmV0LmZyb21TdWJuZXRJZCh0aGlzLCBgUHJpdmF0ZVN1Ym5ldCR7aW5kZXh9YCwgc3VibmV0SWQpXG4gICAgKTtcblxuICAgIC8vIFJlc29sdmUgVlBDIGVuZHBvaW50IHNlY3VyaXR5IGdyb3Vwc1xuICAgIGNvbnN0IHZwY0VuZHBvaW50U2VjdXJpdHlHcm91cHMgPSB2cGNFbmRwb2ludFNlY3VyaXR5R3JvdXBJZHMubWFwKFxuICAgICAgKHNnSWQsIGluZGV4KSA9PlxuICAgICAgICBlYzIuU2VjdXJpdHlHcm91cC5mcm9tU2VjdXJpdHlHcm91cElkKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYFZwY0VuZHBvaW50U2VjdXJpdHlHcm91cCR7aW5kZXh9YCxcbiAgICAgICAgICBzZ0lkXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZwYyxcbiAgICAgIGxhbWJkYVNlY3VyaXR5R3JvdXBzLFxuICAgICAgcHJpdmF0ZVN1Ym5ldHMsXG4gICAgICB2cGNFbmRwb2ludFNlY3VyaXR5R3JvdXBzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
235
+ FlowConfigStack[_a] = { fqn: "@cxbuilder/flow-config.FlowConfigStack", version: "2.0.0" };
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NvbmZpZ1N0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vaW5mcmFzdHJ1Y3R1cmUvRmxvd0NvbmZpZ1N0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLHlEQU1pQztBQUNqQyxxREFBcUQ7QUFFckQsMkNBQTJDO0FBRTNDLG1DQUFnQztBQUNoQyxpREFBNEM7QUFDNUMsNkVBQXNFO0FBQ3RFLHVFQUFvRTtBQUNwRSx5REFBb0U7QUFDcEUseUVBQWlFO0FBQ2pFLDJDQUF3QztBQXVIeEMsTUFBYSxlQUFnQixTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBWTVDOzs7T0FHRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ0gsS0FBMkI7UUFFbEMsTUFBTSxFQUNKLE1BQU0sRUFDTixPQUFPLEVBQ1AsV0FBVyxFQUNYLElBQUksR0FBRyxLQUFLLEVBQ1osZUFBZSxFQUNmLFdBQVcsR0FDWixHQUFHLEtBQUssQ0FBQztRQUNWLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksTUFBTTtZQUNwQyxXQUFXLEVBQ1QsS0FBSyxDQUFDLFdBQVc7Z0JBQ2pCLDJJQUEySTtZQUM3SSxxQkFBcUIsRUFBRSxJQUFJO1NBQzVCLENBQUMsQ0FBQztRQWpCSSxVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQW1CbEMsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxlQUFlO1lBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDO1lBQ3hDLENBQUMs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RSxnQkFBZ0IsS0FBSyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQ2pFLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRztZQUNILG9CQUFvQjtZQUNwQixjQUFjO1NBQ2YsQ0FBQztJQUNKLENBQUM7O0FBL1NILDBDQWdUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBJVXNlclBvb2wsXG4gIFVzZXJQb29sLFxuICBVc2VyUG9vbENsaWVudCxcbiAgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyLFxuICBDZm5Vc2VyUG9vbEdyb3VwLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29nbml0byc7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgSVZwYywgSVNlY3VyaXR5R3JvdXAsIElTdWJuZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQXBpIH0gZnJvbSAnLi9hcGkvQXBpJztcbmltcG9ydCB7IFRvcGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBFbWFpbFN1YnNjcmlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgeyBTZWN1cml0eVByb2ZpbGVQcm92aWRlciB9IGZyb20gJy4vU2VjdXJpdHlQcm9maWxlUHJvdmlkZXInO1xuaW1wb3J0IHsgQ2ZuSW50ZWdyYXRpb25Bc3NvY2lhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb25uZWN0JztcbmltcG9ydCB7IENmbkFwcGxpY2F0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwcGludGVncmF0aW9ucyc7XG5pbXBvcnQgeyBHZXRDb25maWcgfSBmcm9tICcuL0dldENvbmZpZyc7XG5cbi8qKlxuICogQ29nbml0byBjb25maWd1cmF0aW9uIGZvciBGbG93Q29uZmlnIHN0YWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nbml0b0NvbmZpZyB7XG4gIHJlYWRvbmx5IHVzZXJQb29sSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogRnVsbCBkb21haW4gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBjbGllbnQgd2lsbCBhdXRoIHRvIFNTTy4gT3RoZXJ3aXNlIHdpbGwgYXV0aCB0byB1c2VyIHBvb2xcbiAgICovXG4gIHJlYWRvbmx5IHNzb1Byb3ZpZGVyTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBWUEMgY29uZmlndXJhdGlvbiBmb3IgQVBJIEdhdGV3YXlcbiAqIElmIHByb3ZpZGVkLCB0aGUgQVBJIHdpbGwgYmUgZGVwbG95ZWQgaW4gYSBwcml2YXRlIFZQQy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlWcGNDb25maWcge1xuICAvKipcbiAgICogVGhlIFZQQyBJRCB0byB1c2UgZm9yIHRoZSBBUElcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgVlBDIGVuZHBvaW50IElEIHRvIHVzZSBmb3IgdGhlIEFQSVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjRW5kcG9pbnRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIExhbWJkYSBWUEMgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYVZwY0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgVlBDIElEIHRvIGRlcGxveSByZXNvdXJjZXMgaW50b1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXAgSURzIGZvciBMYW1iZGEgZnVuY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwSWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBzdWJuZXQgSURzIGZvciBMYW1iZGEgZnVuY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEdsb2JhbCB0YWJsZSBjb25maWd1cmF0aW9uIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxUYWJsZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIHByaW1hcnkgcmVnaW9uIHRoYXQgY3JlYXRlcyB0aGUgZ2xvYmFsIHRhYmxlXG4gICAqL1xuICByZWFkb25seSBpc1ByaW1hcnlSZWdpb246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWxsIHJlZ2lvbnMgdGhhdCBzaG91bGQgaGF2ZSByZXBsaWNhc1xuICAgKiBPbmx5IHVzZWQgYnkgdGhlIHByaW1hcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhUmVnaW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEludGVybmFsIGludGVyZmFjZSBmb3IgcmVzb2x2ZWQgVlBDIHJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkVnBjQ29uZmlnIHtcbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xuICByZWFkb25seSBsYW1iZGFTZWN1cml0eUdyb3VwczogSVNlY3VyaXR5R3JvdXBbXTtcbiAgcmVhZG9ubHkgcHJpdmF0ZVN1Ym5ldHM6IElTdWJuZXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbG93Q29uZmlnU3RhY2tQcm9wcyBleHRlbmRzIGNkay5TdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFVzZWQgZm9yIHJlc291cmNlIG5hbWluZy4gV2lsbCBhbHNvIGJlIHRoZSBuYW1lIG9mIHRoZSBDb25uZWN0IExhbWJkYVxuICAgKiBAZXhhbXBsZSBgY3hidWlsZGVyLWZsb3ctY29uZmlnYFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZ25pdG86IENvZ25pdG9Db25maWc7XG4gIHJlYWRvbmx5IGNvbm5lY3RJbnN0YW5jZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaG8gdG8gbm90aWZ5IGZvciB1bmhhbmRsZWQgZXhjZXB0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxlcnRFbWFpbHM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcm9kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoZSBBUEkgd2lsbCBiZSBkZXBsb3llZCBpbiBhIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZwY0NvbmZpZz86IEFwaVZwY0NvbmZpZztcblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoZSBMYW1iZGEgZnVuY3Rpb25zIHdpbGwgYmUgZGVwbG95ZWQgaW4gYSBWUEMuXG4gICAqIE5vdGU6IFZQQyBzaG91bGQgY29udGFpbiBlbmRwb2ludHMgdG86IENsb3VkRm9ybWF0aW9uLCBMYW1iZGEsIER5bmFtb0RCLCBTTlMsIGFuZCBQb2xseS5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYVZwY0NvbmZpZz86IExhbWJkYVZwY0NvbmZpZztcblxuICAvKipcbiAgICogR2xvYmFsIHRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpLXJlZ2lvbiBkZXBsb3ltZW50cy5cbiAgICogSWYgcHJvdmlkZWQsIGVuYWJsZXMgZ2xvYmFsIHRhYmxlIHN1cHBvcnQuXG4gICAqIElmIHVuZGVmaW5lZCwgY3JlYXRlcyBhIHNpbmdsZS1yZWdpb24gdGFibGUuXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxUYWJsZT86IEdsb2JhbFRhYmxlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gcmVtb3ZlIENYQnVpbGRlciBicmFuZGluZyBmcm9tIHRoZSB3ZWIgYXBwLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBicmFuZGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q29uZmlnU3RhY2sgZXh0ZW5kcyBjZGsuU3RhY2sge1xuICB1c2VyUG9vbDogSVVzZXJQb29sO1xuICBwcml2YXRlIGFwaTogQXBpO1xuICB1c2VyUG9vbENsaWVudDogVXNlclBvb2xDbGllbnQ7XG4gIGFsZXJ0VG9waWM6IFRvcGljO1xuICB0YWJsZTogY2RrLmF3c19keW5hbW9kYi5JVGFibGU7XG5cbiAgLyoqXG4gICAqIFJlc29sdmVkIFZQQyBjb25maWd1cmF0aW9uIGlmIHByaXZhdGUgZGVwbG95bWVudCBpcyBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNvbHZlZFZwY0NvbmZpZz86IFJlc29sdmVkVnBjQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBHZXQgcmVzb2x2ZWQgVlBDIGNvbmZpZ3VyYXRpb24gZm9yIGNoaWxkIGNvbnN0cnVjdHNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2dldFJlc29sdmVkVnBjQ29uZmlnKCk6IFJlc29sdmVkVnBjQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWRWcGNDb25maWc7XG4gIH1cblxuICBnZXQgYXBwVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpLnVybDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcHJvcHM6IEZsb3dDb25maWdTdGFja1Byb3BzXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeCxcbiAgICAgIGNvZ25pdG8sXG4gICAgICBhbGVydEVtYWlscyxcbiAgICAgIHByb2QgPSBmYWxzZSxcbiAgICAgIGxhbWJkYVZwY0NvbmZpZyxcbiAgICAgIGdsb2JhbFRhYmxlLFxuICAgIH0gPSBwcm9wcztcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3RhY2tOYW1lOiBwcm9wcy5zdGFja05hbWUgPz8gcHJlZml4LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIHByb3BzLmRlc2NyaXB0aW9uID8/XG4gICAgICAgICdXZWItYmFzZWQgaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBmbG93IHZhcmlhYmxlcyBhbmQgcHJvbXB0cyB0aGF0IGFyZSBkeW5hbWljYWxseSByZXRyaWV2ZWQgYnkgQW1hem9uIENvbm5lY3QgZHVyaW5nIGN1c3RvbWVyIGludGVyYWN0aW9ucycsXG4gICAgICB0ZXJtaW5hdGlvblByb3RlY3Rpb246IHByb2QsXG4gICAgfSk7XG5cbiAgICAvLyBSZXNvbHZlIFZQQyBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkXG4gICAgdGhpcy5fcmVzb2x2ZWRWcGNDb25maWcgPSBsYW1iZGFWcGNDb25maWdcbiAgICAgID8gdGhpcy5yZXNvbHZlVnBjQ29uZmlnKGxhbWJkYVZwY0NvbmZpZylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gRHluYW1vREIgdGFibGUgZm9yIHN0b3JpbmcgZmxvdyBjb25maWdzXG4gICAgdGhpcy50YWJsZSA9IHRoaXMuY3JlYXRlVGFibGUocHJlZml4LCBwcm9kLCBnbG9iYWxUYWJsZSk7XG5cbiAgICB0aGlzLmFsZXJ0VG9waWMgPSBuZXcgVG9waWModGhpcywgJ0FsZXJ0VG9waWMnLCB7XG4gICAgICB0b3BpY05hbWU6IGAke3ByZWZpeH0tZXJyb3ItYWxlcnRzYCxcbiAgICB9KTtcbiAgICBhbGVydEVtYWlscy5mb3JFYWNoKChlKSA9PlxuICAgICAgdGhpcy5hbGVydFRvcGljLmFkZFN1YnNjcmlwdGlvbihuZXcgRW1haWxTdWJzY3JpcHRpb24oZSkpXG4gICAgKTtcblxuICAgIHRoaXMudXNlclBvb2wgPSBVc2VyUG9vbC5mcm9tVXNlclBvb2xJZChcbiAgICAgIHRoaXMsXG4gICAgICAnVXNlclBvb2wnLFxuICAgICAgY29nbml0by51c2VyUG9vbElkXG4gICAgKTtcblxuICAgIGNvbnN0IGdldENvbmZpZyA9IG5ldyBHZXRDb25maWcodGhpcyk7XG4gICAgdGhpcy5hcGkgPSBuZXcgQXBpKHRoaXMpO1xuXG4gICAgdGhpcy51c2VyUG9vbENsaWVudCA9IHRoaXMuY3JlYXRlVXNlclBvb2xDbGllbnQoKTtcbiAgICB0aGlzLmNyZWF0ZVVzZXJQb29sR3JvdXBzKCk7XG5cbiAgICB0aGlzLmFzc29jaWF0ZTNwQXBwKCk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnQXBwVXJsJywge1xuICAgICAgdmFsdWU6IHRoaXMuYXBwVXJsLFxuICAgICAgZGVzY3JpcHRpb246ICdCYXNlIFVSTCBmb3IgdGhlIEZsb3cgQ29uZmlnIGFwcGxpY2F0aW9uJyxcbiAgICB9KTtcbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnQXBpVXJsJywge1xuICAgICAgdmFsdWU6IGAke3RoaXMuYXBwVXJsfS9hcGlgLFxuICAgICAgZGVzY3JpcHRpb246ICdCYXNlIFVSTCBmb3IgdGhlIEZsb3cgQ29uZmlnIEFQSScsXG4gICAgfSk7XG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0dldENvbmZpZ0xhbWJkYU5hbWUnLCB7XG4gICAgICB2YWx1ZTogZ2V0Q29uZmlnLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnTGFtYmRhIGZ1bmN0aW9uIG5hbWUgZm9yIGFjY2Vzc2luZyBmbG93IGNvbmZpZ3MgZnJvbSBDb25uZWN0JyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVVzZXJQb29sQ2xpZW50KCk6IFVzZXJQb29sQ2xpZW50IHtcbiAgICBjb25zdCB7IHByZWZpeCwgY29nbml0byB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGRvbWFpbnMgPSBbJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsIHRoaXMuYXBwVXJsXTtcblxuICAgIGNvbnN0IG9BdXRoID0ge1xuICAgICAgY2FsbGJhY2tVcmxzOiBkb21haW5zLm1hcCgoeCkgPT4gYCR7eH0vcG9wdXAuaHRtbGApLFxuICAgICAgbG9nb3V0VXJsczogZG9tYWlucyxcbiAgICB9O1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBVc2VyUG9vbENsaWVudCh0aGlzLCAnVXNlclBvb2xDbGllbnQnLCB7XG4gICAgICB1c2VyUG9vbENsaWVudE5hbWU6IHByZWZpeCxcbiAgICAgIHVzZXJQb29sOiB0aGlzLnVzZXJQb29sLFxuICAgICAgc3VwcG9ydGVkSWRlbnRpdHlQcm92aWRlcnM6IGNvZ25pdG8uc3NvUHJvdmlkZXJOYW1lXG4gICAgICAgID8gW1VzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlci5jdXN0b20oY29nbml0by5zc29Qcm92aWRlck5hbWUpXVxuICAgICAgICA6IFtVc2VyUG9vbENsaWVudElkZW50aXR5UHJvdmlkZXIuQ09HTklUT10sXG4gICAgICBnZW5lcmF0ZVNlY3JldDogZmFsc2UsXG4gICAgICBvQXV0aCxcbiAgICB9KTtcblxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdVc2VyUG9vbENsaWVudElkJywge1xuICAgICAgdmFsdWU6IGNsaWVudC51c2VyUG9vbENsaWVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIENvZ25pdG8gVXNlciBHcm91cHMgZm9yIHJvbGUtYmFzZWQgYWNjZXNzIGNvbnRyb2xcbiAgICovXG4gIGNyZWF0ZVVzZXJQb29sR3JvdXBzKCk6IHZvaWQge1xuICAgIC8vIEZsb3dDb25maWdBZG1pbiAtIEZ1bGwgQ1JVRCBhY2Nlc3NcbiAgICBuZXcgQ2ZuVXNlclBvb2xHcm91cCh0aGlzLCAnRmxvd0NvbmZpZ0FkbWluR3JvdXAnLCB7XG4gICAgICB1c2VyUG9vbElkOiB0aGlzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICBncm91cE5hbWU6ICdGbG93Q29uZmlnQWRtaW4nLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdGdWxsIGFkbWluaXN0cmF0aXZlIGFjY2VzcyB0byBhbGwgZmxvdyBjb25maWdzIC0gY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIGZsb3cgY29uZmlncyBhbmQgYWxsIHRoZWlyIHByb3BlcnRpZXMnLFxuICAgICAgcHJlY2VkZW5jZTogMSxcbiAgICB9KTtcblxuICAgIC8vIEZsb3dDb25maWdFZGl0IC0gRWRpdCB2YXJpYWJsZS9wcm9tcHQgdmFsdWVzIG9ubHlcbiAgICBuZXcgQ2ZuVXNlclBvb2xHcm91cCh0aGlzLCAnRmxvd0NvbmZpZ0VkaXRHcm91cCcsIHtcbiAgICAgIHVzZXJQb29sSWQ6IHRoaXMudXNlclBvb2wudXNlclBvb2xJZCxcbiAgICAgIGdyb3VwTmFtZTogJ0Zsb3dDb25maWdFZGl0JyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRWRpdCBhY2Nlc3MgdG8gZmxvdyBjb25maWdzIC0gY2FuIHJlYWQgYW5kIG1vZGlmeSB2YXJpYWJsZSB2YWx1ZXMgYW5kIHByb21wdCBjb250ZW50IGJ1dCBjYW5ub3QgYWRkL3JlbW92ZSBmaWVsZHMgb3IgZGVsZXRlIGNvbmZpZ3MnLFxuICAgICAgcHJlY2VkZW5jZTogMixcbiAgICB9KTtcblxuICAgIC8vIEZsb3dDb25maWdSZWFkIC0gUmVhZC1vbmx5IGFjY2Vzc1xuICAgIG5ldyBDZm5Vc2VyUG9vbEdyb3VwKHRoaXMsICdGbG93Q29uZmlnUmVhZEdyb3VwJywge1xuICAgICAgdXNlclBvb2xJZDogdGhpcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgZ3JvdXBOYW1lOiAnRmxvd0NvbmZpZ1JlYWQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdSZWFkLW9ubHkgYWNjZXNzIHRvIGFsbCBmbG93IGNvbmZpZ3MgZm9yIHJlcG9ydGluZyBhbmQgcmVmZXJlbmNlIHB1cnBvc2VzJyxcbiAgICAgIHByZWNlZGVuY2U6IDMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzb2NpYXRlZCBWb2ljZW1haWwgYXMgQWdlbnQgV29ya3NwYWNlIGFwcFxuICAgKi9cbiAgYXNzb2NpYXRlM3BBcHAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvcHM6IHsgcHJlZml4LCBjb25uZWN0SW5zdGFuY2VBcm4gfSxcbiAgICAgIGFwcFVybDogdXJsLFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCBuYW1lc3BhY2UgPSBgY3hidWlsZGVyLiR7cHJlZml4fWA7XG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggPiAzMiAmJiAhY2RrLlRva2VuLmlzVW5yZXNvbHZlZChuYW1lc3BhY2UpKSB7XG4gICAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2Uuc3Vic3RyaW5nKDAsIDMyKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHAgPSBuZXcgQ2ZuQXBwbGljYXRpb24odGhpcywgJzNwQXBwJywge1xuICAgICAgbmFtZTogdGhpcy5wcm9wcy5wcmVmaXgsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0FnZW50IFdvcmtzcGFjZSBhcHAgZm9yIGNvbmZpZ3VyaW5nIGNvbnRhY3QgZmxvdyB2YXJpYWJsZXMgYW5kIHByb21wdHMnLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgYXBwbGljYXRpb25Tb3VyY2VDb25maWc6IHtcbiAgICAgICAgZXh0ZXJuYWxVcmxDb25maWc6IHtcbiAgICAgICAgICBhY2Nlc3NVcmw6IHVybCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyBkb2NzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS8zcC1hcHBzLWV2ZW50cy1yZXF1ZXN0cy5odG1sXG4gICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAnVXNlci5EZXRhaWxzLlZpZXcnLFxuICAgICAgICAnVXNlci5Db25maWd1cmF0aW9uLlZpZXcnLFxuICAgICAgICAnVXNlci5TdGF0dXMuVmlldycsXG4gICAgICAgICdDb250YWN0LkRldGFpbHMuVmlldycsXG4gICAgICAgICdDb250YWN0LkN1c3RvbWVyRGV0YWlscy5WaWV3JyxcbiAgICAgICAgJ0NvbnRhY3QuVmFyaWFibGVzLlZpZXcnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFzc29jaWF0aW9uID0gbmV3IENmbkludGVncmF0aW9uQXNzb2NpYXRpb24oXG4gICAgICB0aGlzLFxuICAgICAgJzNwQXBwQXNzb2NpYXRpb24nLFxuICAgICAge1xuICAgICAgICBpbnN0YW5jZUlkOiBjb25uZWN0SW5zdGFuY2VBcm4sXG4gICAgICAgIGludGVncmF0aW9uVHlwZTogJ0FQUExJQ0FUSU9OJyxcbiAgICAgICAgaW50ZWdyYXRpb25Bcm46IGFwcC5hdHRyQXBwbGljYXRpb25Bcm4sXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IFNlY3VyaXR5UHJvZmlsZVByb3ZpZGVyKFxuICAgICAgdGhpcyxcbiAgICAgICdTZWN1cml0eVByb2ZpbGVQcm92aWRlcicsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RJbnN0YW5jZUFybixcbiAgICAgIH1cbiAgICApO1xuICAgIHByb3ZpZGVyLm5vZGUuYWRkRGVwZW5kZW5jeShhc3NvY2lhdGlvbik7XG5cbiAgICAvLyBBdXRvbWF0aWNhbGx5IGFzc29jaWF0ZSB3aXRoIHNlY3VyaXR5IHByb2ZpbGVzXG4gICAgY29uc3Qgc2VjdXJpdHlQcm9maWxlcyA9IFsnQWRtaW4nXTtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2Ygc2VjdXJpdHlQcm9maWxlcykge1xuICAgICAgcHJvdmlkZXIuYWxsb3dBcHBsaWNhdGlvbihgQWxsb3cke3Byb2ZpbGV9YCwgcHJvZmlsZSwgbmFtZXNwYWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIER5bmFtb0RCIHRhYmxlIHdpdGggb3B0aW9uYWwgZ2xvYmFsIHRhYmxlIHN1cHBvcnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVGFibGUoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgcHJvZDogYm9vbGVhbixcbiAgICBnbG9iYWxUYWJsZT86IEdsb2JhbFRhYmxlQ29uZmlnXG4gICk6IGR5bmFtb2RiLklUYWJsZSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gcHJlZml4O1xuXG4gICAgaWYgKCFnbG9iYWxUYWJsZSkge1xuICAgICAgLy8gU2luZ2xlLXJlZ2lvbiB0YWJsZVxuICAgICAgcmV0dXJuIG5ldyBkeW5hbW9kYi5UYWJsZVYyKHRoaXMsICdUYWJsZScsIHtcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgIHR5cGU6IGR5bmFtb2RiLkF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxuICAgICAgICB9LFxuICAgICAgICBiaWxsaW5nOiBkeW5hbW9kYi5CaWxsaW5nLm9uRGVtYW5kKCksXG4gICAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uOiB7XG4gICAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeUVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogcHJvZCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvZFxuICAgICAgICAgID8gY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAgICAgICAgOiBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdsb2JhbFRhYmxlLmlzUHJpbWFyeVJlZ2lvbikge1xuICAgICAgLy8gUHJpbWFyeSByZWdpb24gY3JlYXRlcyBnbG9iYWwgdGFibGUgd2l0aCByZXBsaWNhc1xuICAgICAgY29uc3QgdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGVWMih0aGlzLCAnVGFibGUnLCB7XG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgbmFtZTogJ2lkJyxcbiAgICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgICAgfSxcbiAgICAgICAgYmlsbGluZzogZHluYW1vZGIuQmlsbGluZy5vbkRlbWFuZCgpLFxuICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlFbmFibGVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb2QsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb2RcbiAgICAgICAgICA/IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgICAgICAgIDogY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGdsb2JhbFRhYmxlLnJlcGxpY2FSZWdpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIGdsb2JhbFRhYmxlLnJlcGxpY2FSZWdpb25zKSB7XG4gICAgICAgICAgdGFibGUuYWRkUmVwbGljYSh7XG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb2QsXG4gICAgICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2Vjb25kYXJ5IHJlZ2lvbiByZWZlcmVuY2VzIGV4aXN0aW5nIGdsb2JhbCB0YWJsZVxuICAgICAgcmV0dXJuIGR5bmFtb2RiLlRhYmxlLmZyb21UYWJsZUFybihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgYGFybjphd3M6ZHluYW1vZGI6JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OnRhYmxlLyR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgVlBDIGNvbmZpZ3VyYXRpb24gc3RyaW5nIElEcyB0byBDREsgb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVnBjQ29uZmlnKHZwY0NvbmZpZzogTGFtYmRhVnBjQ29uZmlnKTogUmVzb2x2ZWRWcGNDb25maWcge1xuICAgIGNvbnN0IHsgdnBjSWQsIHNlY3VyaXR5R3JvdXBJZHMsIHN1Ym5ldElkcyB9ID0gdnBjQ29uZmlnO1xuXG4gICAgLy8gUmVzb2x2ZSBWUENcbiAgICBjb25zdCB2cGMgPSBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgJ1Jlc29sdmVkVnBjJywgeyB2cGNJZCB9KTtcblxuICAgIC8vIFJlc29sdmUgTGFtYmRhIHNlY3VyaXR5IGdyb3Vwc1xuICAgIGNvbnN0IGxhbWJkYVNlY3VyaXR5R3JvdXBzID0gc2VjdXJpdHlHcm91cElkcy5tYXAoKHNnSWQsIGluZGV4KSA9PlxuICAgICAgZWMyLlNlY3VyaXR5R3JvdXAuZnJvbVNlY3VyaXR5R3JvdXBJZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExhbWJkYVNlY3VyaXR5R3JvdXAke2luZGV4fWAsXG4gICAgICAgIHNnSWRcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gUmVzb2x2ZSBwcml2YXRlIHN1Ym5ldHNcbiAgICBjb25zdCBwcml2YXRlU3VibmV0cyA9IHN1Ym5ldElkcy5tYXAoKHN1Ym5ldElkLCBpbmRleCkgPT5cbiAgICAgIGVjMi5TdWJuZXQuZnJvbVN1Ym5ldElkKHRoaXMsIGBQcml2YXRlU3VibmV0JHtpbmRleH1gLCBzdWJuZXRJZClcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZwYyxcbiAgICAgIGxhbWJkYVNlY3VyaXR5R3JvdXBzLFxuICAgICAgcHJpdmF0ZVN1Ym5ldHMsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -10,7 +10,7 @@ class GetConfig extends constructs_1.Construct {
10
10
  super(stack, 'GetConfig');
11
11
  const { connectInstanceArn, prefix } = stack.props;
12
12
  this.function = (0, createLambda_1.createLambda)(this, 'Handler', {
13
- functionName: `${prefix}-get-config`,
13
+ functionName: prefix,
14
14
  environment: {
15
15
  FLOW_CONFIGS_TABLE_NAME: stack.table.tableName,
16
16
  },
@@ -31,4 +31,4 @@ class GetConfig extends constructs_1.Construct {
31
31
  }
32
32
  }
33
33
  exports.GetConfig = GetConfig;
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9pbmZyYXN0cnVjdHVyZS9HZXRDb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLGtEQUErQztBQUkvQyx5REFBb0U7QUFDcEUsbUNBQW1DO0FBRW5DLE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBRXRDLFlBQVksS0FBc0I7UUFDaEMsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUUxQixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUVuRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsMkJBQVksRUFBZSxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzFELFlBQVksRUFBRSxHQUFHLE1BQU0sYUFBYTtZQUNwQyxXQUFXLEVBQUU7Z0JBQ1gsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTO2FBQy9DO1lBQ0QsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1NBQzdCLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTlDLDRFQUE0RTtRQUM1RSxJQUFJLHVDQUF5QixDQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBRTtZQUM5RCxVQUFVLEVBQUUsa0JBQWtCO1lBQzlCLGVBQWUsRUFBRSxpQkFBaUI7WUFDbEMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztTQUMxQyxDQUFDLENBQUM7UUFFSCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLEVBQUU7WUFDckQsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQztZQUNwRSxTQUFTLEVBQUUsa0JBQWtCO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTlCRCw4QkE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGNyZWF0ZUxhbWJkYSB9IGZyb20gJy4uL2NyZWF0ZUxhbWJkYSc7XG5pbXBvcnQgeyBGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgRmxvd0NvbmZpZ1N0YWNrIH0gZnJvbSAnLi4vRmxvd0NvbmZpZ1N0YWNrJztcbmltcG9ydCB7IEdldENvbmZpZ0VudiB9IGZyb20gJy4vR2V0Q29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZm5JbnRlZ3JhdGlvbkFzc29jaWF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvbm5lY3QnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcblxuZXhwb3J0IGNsYXNzIEdldENvbmZpZyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uOiBGdW5jdGlvbjtcbiAgY29uc3RydWN0b3Ioc3RhY2s6IEZsb3dDb25maWdTdGFjaykge1xuICAgIHN1cGVyKHN0YWNrLCAnR2V0Q29uZmlnJyk7XG5cbiAgICBjb25zdCB7IGNvbm5lY3RJbnN0YW5jZUFybiwgcHJlZml4IH0gPSBzdGFjay5wcm9wcztcblxuICAgIHRoaXMuZnVuY3Rpb24gPSBjcmVhdGVMYW1iZGE8R2V0Q29uZmlnRW52Pih0aGlzLCAnSGFuZGxlcicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYCR7cHJlZml4fS1nZXQtY29uZmlnYCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIEZMT1dfQ09ORklHU19UQUJMRV9OQU1FOiBzdGFjay50YWJsZS50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgICAgYWxlcnRUb3BpYzogc3RhY2suYWxlcnRUb3BpYyxcbiAgICB9KTtcblxuICAgIHN0YWNrLnRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YSh0aGlzLmZ1bmN0aW9uKTtcblxuICAgIC8vIEFzc29jaWF0ZSBMYW1iZGEgd2l0aCBDb25uZWN0IGluc3RhbmNlIHNvIGl0IGNhbiBiZSB1c2VkIGluIGNvbnRhY3QgZmxvd3NcbiAgICBuZXcgQ2ZuSW50ZWdyYXRpb25Bc3NvY2lhdGlvbih0aGlzLCAnQ29ubmVjdExhbWJkYUFzc29jaWF0aW9uJywge1xuICAgICAgaW5zdGFuY2VJZDogY29ubmVjdEluc3RhbmNlQXJuLFxuICAgICAgaW50ZWdyYXRpb25UeXBlOiAnTEFNQkRBX0ZVTkNUSU9OJyxcbiAgICAgIGludGVncmF0aW9uQXJuOiB0aGlzLmZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgQ29ubmVjdCBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgTGFtYmRhXG4gICAgdGhpcy5mdW5jdGlvbi5hZGRQZXJtaXNzaW9uKCdDb25uZWN0SW52b2tlUGVybWlzc2lvbicsIHtcbiAgICAgIHByaW5jaXBhbDogbmV3IGNkay5hd3NfaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2Nvbm5lY3QuYW1hem9uYXdzLmNvbScpLFxuICAgICAgc291cmNlQXJuOiBjb25uZWN0SW5zdGFuY2VBcm4sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9pbmZyYXN0cnVjdHVyZS9HZXRDb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLGtEQUErQztBQUkvQyx5REFBb0U7QUFDcEUsbUNBQW1DO0FBRW5DLE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBRXRDLFlBQVksS0FBc0I7UUFDaEMsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUUxQixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUVuRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsMkJBQVksRUFBZSxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzFELFlBQVksRUFBRSxNQUFNO1lBQ3BCLFdBQVcsRUFBRTtnQkFDWCx1QkFBdUIsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVM7YUFDL0M7WUFDRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUMsNEVBQTRFO1FBQzVFLElBQUksdUNBQXlCLENBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFO1lBQzlELFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsZUFBZSxFQUFFLGlCQUFpQjtZQUNsQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXO1NBQzFDLENBQUMsQ0FBQztRQUVILGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRTtZQUNyRCxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDO1lBQ3BFLFNBQVMsRUFBRSxrQkFBa0I7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBOUJELDhCQThCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgY3JlYXRlTGFtYmRhIH0gZnJvbSAnLi4vY3JlYXRlTGFtYmRhJztcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBGbG93Q29uZmlnU3RhY2sgfSBmcm9tICcuLi9GbG93Q29uZmlnU3RhY2snO1xuaW1wb3J0IHsgR2V0Q29uZmlnRW52IH0gZnJvbSAnLi9HZXRDb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENmbkludGVncmF0aW9uQXNzb2NpYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29ubmVjdCc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuXG5leHBvcnQgY2xhc3MgR2V0Q29uZmlnIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcmVhZG9ubHkgZnVuY3Rpb246IEZ1bmN0aW9uO1xuICBjb25zdHJ1Y3RvcihzdGFjazogRmxvd0NvbmZpZ1N0YWNrKSB7XG4gICAgc3VwZXIoc3RhY2ssICdHZXRDb25maWcnKTtcblxuICAgIGNvbnN0IHsgY29ubmVjdEluc3RhbmNlQXJuLCBwcmVmaXggfSA9IHN0YWNrLnByb3BzO1xuXG4gICAgdGhpcy5mdW5jdGlvbiA9IGNyZWF0ZUxhbWJkYTxHZXRDb25maWdFbnY+KHRoaXMsICdIYW5kbGVyJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcmVmaXgsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBGTE9XX0NPTkZJR1NfVEFCTEVfTkFNRTogc3RhY2sudGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICAgIGFsZXJ0VG9waWM6IHN0YWNrLmFsZXJ0VG9waWMsXG4gICAgfSk7XG5cbiAgICBzdGFjay50YWJsZS5ncmFudFJlYWRXcml0ZURhdGEodGhpcy5mdW5jdGlvbik7XG5cbiAgICAvLyBBc3NvY2lhdGUgTGFtYmRhIHdpdGggQ29ubmVjdCBpbnN0YW5jZSBzbyBpdCBjYW4gYmUgdXNlZCBpbiBjb250YWN0IGZsb3dzXG4gICAgbmV3IENmbkludGVncmF0aW9uQXNzb2NpYXRpb24odGhpcywgJ0Nvbm5lY3RMYW1iZGFBc3NvY2lhdGlvbicsIHtcbiAgICAgIGluc3RhbmNlSWQ6IGNvbm5lY3RJbnN0YW5jZUFybixcbiAgICAgIGludGVncmF0aW9uVHlwZTogJ0xBTUJEQV9GVU5DVElPTicsXG4gICAgICBpbnRlZ3JhdGlvbkFybjogdGhpcy5mdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICB9KTtcblxuICAgIC8vIEdyYW50IENvbm5lY3QgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIExhbWJkYVxuICAgIHRoaXMuZnVuY3Rpb24uYWRkUGVybWlzc2lvbignQ29ubmVjdEludm9rZVBlcm1pc3Npb24nLCB7XG4gICAgICBwcmluY2lwYWw6IG5ldyBjZGsuYXdzX2lhbS5TZXJ2aWNlUHJpbmNpcGFsKCdjb25uZWN0LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIHNvdXJjZUFybjogY29ubmVjdEluc3RhbmNlQXJuLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,11 +1,14 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { SpecRestApi } from 'aws-cdk-lib/aws-apigateway';
3
+ import { IInterfaceVpcEndpoint } from 'aws-cdk-lib/aws-ec2';
3
4
  import { FlowConfigStack } from '../FlowConfigStack';
4
5
  import { Static } from './Static';
5
6
  export declare class Api extends Construct {
6
7
  stack: FlowConfigStack;
7
- staticHosting: Static;
8
- restApi: SpecRestApi;
8
+ readonly staticHosting: Static;
9
+ readonly restApi: SpecRestApi;
10
+ readonly vpcEndpoint?: IInterfaceVpcEndpoint;
11
+ readonly url: string;
9
12
  constructor(stack: FlowConfigStack);
10
13
  /**
11
14
  * Create a resource policy for the VPC endpoint to restrict access to the specific VPC
@@ -9,6 +9,7 @@ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
9
9
  const Init_1 = require("./Init");
10
10
  const FlowConfig_1 = require("./FlowConfig");
11
11
  const PreviewSpeech_1 = require("./PreviewSpeech");
12
+ const Settings_1 = require("./Settings");
12
13
  const yaml_1 = require("yaml");
13
14
  const fs_1 = require("fs");
14
15
  const Users_1 = require("./Users");
@@ -19,32 +20,31 @@ class Api extends constructs_1.Construct {
19
20
  this.stack = stack;
20
21
  // Create static hosting construct first
21
22
  this.staticHosting = new Static_1.Static(this);
22
- // Configure API Gateway based on VPC settings
23
- const vpcConfig = stack._getResolvedVpcConfig();
24
- const apiGatewayProps = vpcConfig
23
+ const { prefix, apiVpcConfig: apiVpcEndpoint } = stack.props;
24
+ this.vpcEndpoint = apiVpcEndpoint
25
+ ? aws_ec2_1.InterfaceVpcEndpoint.fromInterfaceVpcEndpointAttributes(this, 'ExistingVpcEndpoint', {
26
+ vpcEndpointId: apiVpcEndpoint.vpcEndpointId,
27
+ port: 443,
28
+ })
29
+ : undefined;
30
+ const apiGatewayProps = this.vpcEndpoint && apiVpcEndpoint?.vpcId
25
31
  ? {
26
- restApiName: stack.props.prefix,
32
+ restApiName: prefix,
27
33
  endpointConfiguration: {
28
34
  types: [aws_apigateway_1.EndpointType.PRIVATE],
29
- vpcEndpoints: [
30
- new aws_ec2_1.InterfaceVpcEndpoint(this, 'ApiVpcEndpoint', {
31
- vpc: vpcConfig.vpc,
32
- service: aws_ec2_1.InterfaceVpcEndpointAwsService.APIGATEWAY,
33
- subnets: { subnets: vpcConfig.privateSubnets },
34
- securityGroups: vpcConfig.vpcEndpointSecurityGroups,
35
- }),
36
- ],
35
+ vpcEndpoints: [this.vpcEndpoint],
37
36
  },
38
- policy: this.createVpcEndpointPolicy(vpcConfig.vpc.vpcId),
37
+ policy: this.createVpcEndpointPolicy(apiVpcEndpoint.vpcId),
39
38
  }
40
39
  : {
41
- restApiName: stack.props.prefix,
40
+ restApiName: prefix,
42
41
  };
43
42
  // Create Lambda functions
44
43
  const initLambda = new Init_1.Init(this).lambda;
45
44
  const usersLambda = new Users_1.Users(this).lambda;
46
45
  const flowConfigLambda = new FlowConfig_1.FlowConfig(this).lambda;
47
46
  const previewSpeechLambda = new PreviewSpeech_1.PreviewSpeech(this).lambda;
47
+ const settingsLambda = new Settings_1.Settings(this).lambda;
48
48
  const staticLambda = this.staticHosting.handler;
49
49
  // Update Authorizer Provider ARN
50
50
  const sourceFileName = (0, path_1.join)(__dirname, 'spec.yaml');
@@ -67,6 +67,8 @@ class Api extends constructs_1.Construct {
67
67
  setLambdaIntegration('/api/flow-config/{id}', 'delete', flowConfigLambda);
68
68
  setLambdaIntegration('/api/flow-config/preview', 'post', flowConfigLambda);
69
69
  setLambdaIntegration('/api/preview-speech', 'post', previewSpeechLambda);
70
+ setLambdaIntegration('/api/settings', 'get', settingsLambda);
71
+ setLambdaIntegration('/api/settings', 'post', settingsLambda);
70
72
  setLambdaIntegration('/{proxy+}', 'get', staticLambda);
71
73
  setLambdaIntegration('/', 'get', staticLambda);
72
74
  // Create API Gateway from updated OpenAPI spec
@@ -80,7 +82,11 @@ class Api extends constructs_1.Construct {
80
82
  usersLambda.grantInvoke(apiGatewayPrincipal);
81
83
  flowConfigLambda.grantInvoke(apiGatewayPrincipal);
82
84
  previewSpeechLambda.grantInvoke(apiGatewayPrincipal);
85
+ settingsLambda.grantInvoke(apiGatewayPrincipal);
83
86
  staticLambda.grantInvoke(apiGatewayPrincipal);
87
+ this.url = this.vpcEndpoint
88
+ ? `https://${this.restApi.restApiId}-${this.vpcEndpoint.vpcEndpointId}.execute-api.${stack.region}.amazonaws.com/prod`
89
+ : `https://${this.restApi.restApiId}.execute-api.${stack.region}.amazonaws.com/prod`;
84
90
  }
85
91
  /**
86
92
  * Create a resource policy for the VPC endpoint to restrict access to the specific VPC
@@ -104,4 +110,4 @@ class Api extends constructs_1.Construct {
104
110
  }
105
111
  }
106
112
  exports.Api = Api;
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vaW5mcmFzdHJ1Y3R1cmUvYXBpL0FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsK0JBQTRCO0FBQzVCLCtEQUtvQztBQUNwQyxpREFNNkI7QUFDN0IsaURBRzZCO0FBQzdCLGlDQUE4QjtBQUM5Qiw2Q0FBMEM7QUFDMUMsbURBQWdEO0FBQ2hELCtCQUE2QjtBQUM3QiwyQkFBa0M7QUFFbEMsbUNBQWdDO0FBQ2hDLHFDQUFrQztBQUVsQyxNQUFhLEdBQUksU0FBUSxzQkFBUztJQUloQyxZQUFtQixLQUFzQjtRQUN2QyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBREgsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFHdkMsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxlQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsOENBQThDO1FBQzlDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2hELE1BQU0sZUFBZSxHQUFxQixTQUFTO1lBQ2pELENBQUMsQ0FBQztnQkFDRSxXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUMvQixxQkFBcUIsRUFBRTtvQkFDckIsS0FBSyxFQUFFLENBQUMsNkJBQVksQ0FBQyxPQUFPLENBQUM7b0JBQzdCLFlBQVksRUFBRTt3QkFDWixJQUFJLDhCQUFvQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTs0QkFDL0MsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHOzRCQUNsQixPQUFPLEVBQUUsd0NBQThCLENBQUMsVUFBVTs0QkFDbEQsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxjQUFjLEVBQUU7NEJBQzlDLGNBQWMsRUFBRSxTQUFTLENBQUMseUJBQXlCO3lCQUNwRCxDQUFDO3FCQUNIO2lCQUNG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MEJBQTBCLENBQzNCLENBQUM7UUFDRixVQUFVLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDNUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JELFlBQVksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUIsQ0FBQyxLQUFhO1FBQzNDLE9BQU8sSUFBSSx3QkFBYyxDQUFDO1lBQ3hCLFVBQVUsRUFBRTtnQkFDVixJQUFJLHlCQUFlLENBQUM7b0JBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7b0JBQ3BCLFVBQVUsRUFBRSxDQUFDLElBQUksc0JBQVksRUFBRSxDQUFDO29CQUNoQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7b0JBQzFCLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDaEIsVUFBVSxFQUFFO3dCQUNWLFlBQVksRUFBRTs0QkFDWixlQUFlLEVBQUUsS0FBSzt5QkFDdkI7cUJBQ0Y7aUJBQ0YsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBN0dELGtCQTZHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgRW5kcG9pbnRUeXBlLFxuICBSZXN0QXBpQmFzZVByb3BzLFxuICBTcGVjUmVzdEFwaSxcbiAgQXBpRGVmaW5pdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHtcbiAgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgRWZmZWN0LFxuICBBbnlQcmluY2lwYWwsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHtcbiAgSW50ZXJmYWNlVnBjRW5kcG9pbnQsXG4gIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZSxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBJbml0IH0gZnJvbSAnLi9Jbml0JztcbmltcG9ydCB7IEZsb3dDb25maWcgfSBmcm9tICcuL0Zsb3dDb25maWcnO1xuaW1wb3J0IHsgUHJldmlld1NwZWVjaCB9IGZyb20gJy4vUHJldmlld1NwZWVjaCc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgRmxvd0NvbmZpZ1N0YWNrIH0gZnJvbSAnLi4vRmxvd0NvbmZpZ1N0YWNrJztcbmltcG9ydCB7IFVzZXJzIH0gZnJvbSAnLi9Vc2Vycyc7XG5pbXBvcnQgeyBTdGF0aWMgfSBmcm9tICcuL1N0YXRpYyc7XG5cbmV4cG9ydCBjbGFzcyBBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBzdGF0aWNIb3N0aW5nOiBTdGF0aWM7XG4gIHJlc3RBcGk6IFNwZWNSZXN0QXBpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdGFjazogRmxvd0NvbmZpZ1N0YWNrKSB7XG4gICAgc3VwZXIoc3RhY2ssICdBcGknKTtcblxuICAgIC8vIENyZWF0ZSBzdGF0aWMgaG9zdGluZyBjb25zdHJ1Y3QgZmlyc3RcbiAgICB0aGlzLnN0YXRpY0hvc3RpbmcgPSBuZXcgU3RhdGljKHRoaXMpO1xuXG4gICAgLy8gQ29uZmlndXJlIEFQSSBHYXRld2F5IGJhc2VkIG9uIFZQQyBzZXR0aW5nc1xuICAgIGNvbnN0IHZwY0NvbmZpZyA9IHN0YWNrLl9nZXRSZXNvbHZlZFZwY0NvbmZpZygpO1xuICAgIGNvbnN0IGFwaUdhdGV3YXlQcm9wczogUmVzdEFwaUJhc2VQcm9wcyA9IHZwY0NvbmZpZ1xuICAgICAgPyB7XG4gICAgICAgICAgcmVzdEFwaU5hbWU6IHN0YWNrLnByb3BzLnByZWZpeCxcbiAgICAgICAgICBlbmRwb2ludENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGVzOiBbRW5kcG9pbnRUeXBlLlBSSVZBVEVdLFxuICAgICAgICAgICAgdnBjRW5kcG9pbnRzOiBbXG4gICAgICAgICAgICAgIG5ldyBJbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCAnQXBpVnBjRW5kcG9pbnQnLCB7XG4gICAgICAgICAgICAgICAgdnBjOiB2cGNDb25maWcudnBjLFxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5BUElHQVRFV0FZLFxuICAgICAgICAgICAgICAgIHN1Ym5ldHM6IHsgc3VibmV0czogdnBjQ29uZmlnLnByaXZhdGVTdWJuZXRzIH0sXG4gICAgICAgICAgICAgICAgc2VjdXJpdHlHcm91cHM6IHZwY0NvbmZpZy52cGNFbmRwb2ludFNlY3VyaXR5R3JvdXBzLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb2xpY3k6IHRoaXMuY3JlYXRlVnBjRW5kcG9pbnRQb2xpY3kodnBjQ29uZmlnLnZwYy52cGNJZCksXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIHJlc3RBcGlOYW1lOiBzdGFjay5wcm9wcy5wcmVmaXgsXG4gICAgICAgIH07XG5cbiAgICAvLyBDcmVhdGUgTGFtYmRhIGZ1bmN0aW9uc1xuICAgIGNvbnN0IGluaXRMYW1iZGEgPSBuZXcgSW5pdCh0aGlzKS5sYW1iZGE7XG4gICAgY29uc3QgdXNlcnNMYW1iZGEgPSBuZXcgVXNlcnModGhpcykubGFtYmRhO1xuICAgIGNvbnN0IGZsb3dDb25maWdMYW1iZGEgPSBuZXcgRmxvd0NvbmZpZyh0aGlzKS5sYW1iZGE7XG4gICAgY29uc3QgcHJldmlld1NwZWVjaExhbWJkYSA9IG5ldyBQcmV2aWV3U3BlZWNoKHRoaXMpLmxhbWJkYTtcbiAgICBjb25zdCBzdGF0aWNMYW1iZGEgPSB0aGlzLnN0YXRpY0hvc3RpbmcuaGFuZGxlcjtcblxuICAgIC8vIFVwZGF0ZSBBdXRob3JpemVyIFByb3ZpZGVyIEFSTlxuICAgIGNvbnN0IHNvdXJjZUZpbGVOYW1lID0gam9pbihfX2Rpcm5hbWUsICdzcGVjLnlhbWwnKTtcbiAgICBjb25zdCB5bWwgPSByZWFkRmlsZVN5bmMoc291cmNlRmlsZU5hbWUpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgc3BlYyA9IHBhcnNlKHltbCk7XG5cbiAgICBjb25zdCBhdXRob3JpemVyID0gc3BlYy5jb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lcy5Db2duaXRvQXV0aG9yaXplcjtcbiAgICBhdXRob3JpemVyWyd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGhvcml6ZXInXS5wcm92aWRlckFSTnMgPSBbXG4gICAgICBzdGFjay51c2VyUG9vbC51c2VyUG9vbEFybixcbiAgICBdO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBMYW1iZGEgaW50ZWdyYXRpb24gVVJJXG4gICAgY29uc3Qgc2V0TGFtYmRhSW50ZWdyYXRpb24gPSAoXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBtZXRob2Q6IHN0cmluZyxcbiAgICAgIGxhbWJkYTogYW55XG4gICAgKSA9PiB7XG4gICAgICBzcGVjLnBhdGhzW3BhdGhdW21ldGhvZF1bXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWludGVncmF0aW9uJ1xuICAgICAgXS51cmkgPSBgYXJuOmF3czphcGlnYXRld2F5OiR7c3RhY2sucmVnaW9ufTpsYW1iZGE6cGF0aC8yMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke2xhbWJkYS5mdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNwZWMgdG8gcmVwbGFjZSBoYW5kbGVyIFVSSXMgd2l0aCBhY3R1YWwgTGFtYmRhIEFSTnNcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9pbml0JywgJ2dldCcsIGluaXRMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL3VzZXJzL3t1c2VySWR9JywgJ2dldCcsIHVzZXJzTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9mbG93LWNvbmZpZycsICdnZXQnLCBmbG93Q29uZmlnTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9mbG93LWNvbmZpZy97aWR9JywgJ2dldCcsIGZsb3dDb25maWdMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL2Zsb3ctY29uZmlnL3tpZH0nLCAncG9zdCcsIGZsb3dDb25maWdMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL2Zsb3ctY29uZmlnL3tpZH0nLCAnZGVsZXRlJywgZmxvd0NvbmZpZ0xhbWJkYSk7XG4gICAgc2V0TGFtYmRhSW50ZWdyYXRpb24oJy9hcGkvZmxvdy1jb25maWcvcHJldmlldycsICdwb3N0JywgZmxvd0NvbmZpZ0xhbWJkYSk7XG4gICAgc2V0TGFtYmRhSW50ZWdyYXRpb24oJy9hcGkvcHJldmlldy1zcGVlY2gnLCAncG9zdCcsIHByZXZpZXdTcGVlY2hMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcve3Byb3h5K30nLCAnZ2V0Jywgc3RhdGljTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignLycsICdnZXQnLCBzdGF0aWNMYW1iZGEpO1xuXG4gICAgLy8gQ3JlYXRlIEFQSSBHYXRld2F5IGZyb20gdXBkYXRlZCBPcGVuQVBJIHNwZWNcbiAgICB0aGlzLnJlc3RBcGkgPSBuZXcgU3BlY1Jlc3RBcGkodGhpcywgJ1Jlc3RBcGknLCB7XG4gICAgICAuLi5hcGlHYXRld2F5UHJvcHMsXG4gICAgICBhcGlEZWZpbml0aW9uOiBBcGlEZWZpbml0aW9uLmZyb21JbmxpbmUoc3BlYyksXG4gICAgfSk7XG5cbiAgICAvLyBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9uIHRvIGludm9rZSBMYW1iZGEgZnVuY3Rpb25zXG4gICAgY29uc3QgYXBpR2F0ZXdheVByaW5jaXBhbCA9IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFxuICAgICAgJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbSdcbiAgICApO1xuICAgIGluaXRMYW1iZGEuZ3JhbnRJbnZva2UoYXBpR2F0ZXdheVByaW5jaXBhbCk7XG4gICAgdXNlcnNMYW1iZGEuZ3JhbnRJbnZva2UoYXBpR2F0ZXdheVByaW5jaXBhbCk7XG4gICAgZmxvd0NvbmZpZ0xhbWJkYS5ncmFudEludm9rZShhcGlHYXRld2F5UHJpbmNpcGFsKTtcbiAgICBwcmV2aWV3U3BlZWNoTGFtYmRhLmdyYW50SW52b2tlKGFwaUdhdGV3YXlQcmluY2lwYWwpO1xuICAgIHN0YXRpY0xhbWJkYS5ncmFudEludm9rZShhcGlHYXRld2F5UHJpbmNpcGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZXNvdXJjZSBwb2xpY3kgZm9yIHRoZSBWUEMgZW5kcG9pbnQgdG8gcmVzdHJpY3QgYWNjZXNzIHRvIHRoZSBzcGVjaWZpYyBWUENcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVnBjRW5kcG9pbnRQb2xpY3kodnBjSWQ6IHN0cmluZyk6IFBvbGljeURvY3VtZW50IHtcbiAgICByZXR1cm4gbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgcHJpbmNpcGFsczogW25ldyBBbnlQcmluY2lwYWwoKV0sXG4gICAgICAgICAgYWN0aW9uczogWydleGVjdXRlLWFwaToqJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgJ2F3czpTb3VyY2VWcGMnOiB2cGNJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vaW5mcmFzdHJ1Y3R1cmUvYXBpL0FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsK0JBQTRCO0FBQzVCLCtEQUtvQztBQUNwQyxpREFNNkI7QUFDN0IsaURBRzZCO0FBQzdCLGlDQUE4QjtBQUM5Qiw2Q0FBMEM7QUFDMUMsbURBQWdEO0FBQ2hELHlDQUFzQztBQUN0QywrQkFBNkI7QUFDN0IsMkJBQWtDO0FBRWxDLG1DQUFnQztBQUNoQyxxQ0FBa0M7QUFFbEMsTUFBYSxHQUFJLFNBQVEsc0JBQVM7SUFNaEMsWUFBbUIsS0FBc0I7UUFDdkMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQURILFVBQUssR0FBTCxLQUFLLENBQWlCO1FBR3ZDLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksZUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFN0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjO1lBQy9CLENBQUMsQ0FBQyw4QkFBb0IsQ0FBQyxrQ0FBa0MsQ0FDckQsSUFBSSxFQUNKLHFCQUFxQixFQUNyQjtnQkFDRSxhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQzNDLElBQUksRUFBRSxHQUFHO2FBQ1YsQ0FDRjtZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxNQUFNLGVBQWUsR0FDbkIsSUFBSSxDQUFDLFdBQVcsSUFBSSxjQUFjLEVBQUUsS0FBSztZQUN2QyxDQUFDLENBQUM7Z0JBQ0UsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLHFCQUFxQixFQUFFO29CQUNyQixLQUFLLEVBQUUsQ0FBQyw2QkFBWSxDQUFDLE9BQU8sQ0FBQztvQkFDN0IsWUFBWSxFQUFFLENBQUMs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QUUsQ0FBQyxHQUFHLENBQUM7b0JBQ2hCLFVBQVUsRUFBRTt3QkFDVixZQUFZLEVBQUU7NEJBQ1osZUFBZSxFQUFFLEtBQUs7eUJBQ3ZCO3FCQUNGO2lCQUNGLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVIRCxrQkE0SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEVuZHBvaW50VHlwZSxcbiAgUmVzdEFwaUJhc2VQcm9wcyxcbiAgU3BlY1Jlc3RBcGksXG4gIEFwaURlZmluaXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCB7XG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIEVmZmVjdCxcbiAgQW55UHJpbmNpcGFsLFxuICBTZXJ2aWNlUHJpbmNpcGFsLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7XG4gIElJbnRlcmZhY2VWcGNFbmRwb2ludCxcbiAgSW50ZXJmYWNlVnBjRW5kcG9pbnQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgSW5pdCB9IGZyb20gJy4vSW5pdCc7XG5pbXBvcnQgeyBGbG93Q29uZmlnIH0gZnJvbSAnLi9GbG93Q29uZmlnJztcbmltcG9ydCB7IFByZXZpZXdTcGVlY2ggfSBmcm9tICcuL1ByZXZpZXdTcGVlY2gnO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL1NldHRpbmdzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAneWFtbCc7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBGbG93Q29uZmlnU3RhY2sgfSBmcm9tICcuLi9GbG93Q29uZmlnU3RhY2snO1xuaW1wb3J0IHsgVXNlcnMgfSBmcm9tICcuL1VzZXJzJztcbmltcG9ydCB7IFN0YXRpYyB9IGZyb20gJy4vU3RhdGljJztcblxuZXhwb3J0IGNsYXNzIEFwaSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IHN0YXRpY0hvc3Rpbmc6IFN0YXRpYztcbiAgcmVhZG9ubHkgcmVzdEFwaTogU3BlY1Jlc3RBcGk7XG4gIHJlYWRvbmx5IHZwY0VuZHBvaW50PzogSUludGVyZmFjZVZwY0VuZHBvaW50O1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3RhY2s6IEZsb3dDb25maWdTdGFjaykge1xuICAgIHN1cGVyKHN0YWNrLCAnQXBpJyk7XG5cbiAgICAvLyBDcmVhdGUgc3RhdGljIGhvc3RpbmcgY29uc3RydWN0IGZpcnN0XG4gICAgdGhpcy5zdGF0aWNIb3N0aW5nID0gbmV3IFN0YXRpYyh0aGlzKTtcblxuICAgIGNvbnN0IHsgcHJlZml4LCBhcGlWcGNDb25maWc6IGFwaVZwY0VuZHBvaW50IH0gPSBzdGFjay5wcm9wcztcblxuICAgIHRoaXMudnBjRW5kcG9pbnQgPSBhcGlWcGNFbmRwb2ludFxuICAgICAgPyBJbnRlcmZhY2VWcGNFbmRwb2ludC5mcm9tSW50ZXJmYWNlVnBjRW5kcG9pbnRBdHRyaWJ1dGVzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ0V4aXN0aW5nVnBjRW5kcG9pbnQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZwY0VuZHBvaW50SWQ6IGFwaVZwY0VuZHBvaW50LnZwY0VuZHBvaW50SWQsXG4gICAgICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFwaUdhdGV3YXlQcm9wczogUmVzdEFwaUJhc2VQcm9wcyA9XG4gICAgICB0aGlzLnZwY0VuZHBvaW50ICYmIGFwaVZwY0VuZHBvaW50Py52cGNJZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJlc3RBcGlOYW1lOiBwcmVmaXgsXG4gICAgICAgICAgICBlbmRwb2ludENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgdHlwZXM6IFtFbmRwb2ludFR5cGUuUFJJVkFURV0sXG4gICAgICAgICAgICAgIHZwY0VuZHBvaW50czogW3RoaXMudnBjRW5kcG9pbnRdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeTogdGhpcy5jcmVhdGVWcGNFbmRwb2ludFBvbGljeShhcGlWcGNFbmRwb2ludC52cGNJZCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHJlc3RBcGlOYW1lOiBwcmVmaXgsXG4gICAgICAgICAgfTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb25zXG4gICAgY29uc3QgaW5pdExhbWJkYSA9IG5ldyBJbml0KHRoaXMpLmxhbWJkYTtcbiAgICBjb25zdCB1c2Vyc0xhbWJkYSA9IG5ldyBVc2Vycyh0aGlzKS5sYW1iZGE7XG4gICAgY29uc3QgZmxvd0NvbmZpZ0xhbWJkYSA9IG5ldyBGbG93Q29uZmlnKHRoaXMpLmxhbWJkYTtcbiAgICBjb25zdCBwcmV2aWV3U3BlZWNoTGFtYmRhID0gbmV3IFByZXZpZXdTcGVlY2godGhpcykubGFtYmRhO1xuICAgIGNvbnN0IHNldHRpbmdzTGFtYmRhID0gbmV3IFNldHRpbmdzKHRoaXMpLmxhbWJkYTtcbiAgICBjb25zdCBzdGF0aWNMYW1iZGEgPSB0aGlzLnN0YXRpY0hvc3RpbmcuaGFuZGxlcjtcblxuICAgIC8vIFVwZGF0ZSBBdXRob3JpemVyIFByb3ZpZGVyIEFSTlxuICAgIGNvbnN0IHNvdXJjZUZpbGVOYW1lID0gam9pbihfX2Rpcm5hbWUsICdzcGVjLnlhbWwnKTtcbiAgICBjb25zdCB5bWwgPSByZWFkRmlsZVN5bmMoc291cmNlRmlsZU5hbWUpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgc3BlYyA9IHBhcnNlKHltbCk7XG5cbiAgICBjb25zdCBhdXRob3JpemVyID0gc3BlYy5jb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lcy5Db2duaXRvQXV0aG9yaXplcjtcbiAgICBhdXRob3JpemVyWyd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGhvcml6ZXInXS5wcm92aWRlckFSTnMgPSBbXG4gICAgICBzdGFjay51c2VyUG9vbC51c2VyUG9vbEFybixcbiAgICBdO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBMYW1iZGEgaW50ZWdyYXRpb24gVVJJXG4gICAgY29uc3Qgc2V0TGFtYmRhSW50ZWdyYXRpb24gPSAoXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBtZXRob2Q6IHN0cmluZyxcbiAgICAgIGxhbWJkYTogYW55XG4gICAgKSA9PiB7XG4gICAgICBzcGVjLnBhdGhzW3BhdGhdW21ldGhvZF1bXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWludGVncmF0aW9uJ1xuICAgICAgXS51cmkgPSBgYXJuOmF3czphcGlnYXRld2F5OiR7c3RhY2sucmVnaW9ufTpsYW1iZGE6cGF0aC8yMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke2xhbWJkYS5mdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgO1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNwZWMgdG8gcmVwbGFjZSBoYW5kbGVyIFVSSXMgd2l0aCBhY3R1YWwgTGFtYmRhIEFSTnNcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9pbml0JywgJ2dldCcsIGluaXRMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL3VzZXJzL3t1c2VySWR9JywgJ2dldCcsIHVzZXJzTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9mbG93LWNvbmZpZycsICdnZXQnLCBmbG93Q29uZmlnTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9mbG93LWNvbmZpZy97aWR9JywgJ2dldCcsIGZsb3dDb25maWdMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL2Zsb3ctY29uZmlnL3tpZH0nLCAncG9zdCcsIGZsb3dDb25maWdMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL2Zsb3ctY29uZmlnL3tpZH0nLCAnZGVsZXRlJywgZmxvd0NvbmZpZ0xhbWJkYSk7XG4gICAgc2V0TGFtYmRhSW50ZWdyYXRpb24oJy9hcGkvZmxvdy1jb25maWcvcHJldmlldycsICdwb3N0JywgZmxvd0NvbmZpZ0xhbWJkYSk7XG4gICAgc2V0TGFtYmRhSW50ZWdyYXRpb24oJy9hcGkvcHJldmlldy1zcGVlY2gnLCAncG9zdCcsIHByZXZpZXdTcGVlY2hMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcvYXBpL3NldHRpbmdzJywgJ2dldCcsIHNldHRpbmdzTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignL2FwaS9zZXR0aW5ncycsICdwb3N0Jywgc2V0dGluZ3NMYW1iZGEpO1xuICAgIHNldExhbWJkYUludGVncmF0aW9uKCcve3Byb3h5K30nLCAnZ2V0Jywgc3RhdGljTGFtYmRhKTtcbiAgICBzZXRMYW1iZGFJbnRlZ3JhdGlvbignLycsICdnZXQnLCBzdGF0aWNMYW1iZGEpO1xuXG4gICAgLy8gQ3JlYXRlIEFQSSBHYXRld2F5IGZyb20gdXBkYXRlZCBPcGVuQVBJIHNwZWNcbiAgICB0aGlzLnJlc3RBcGkgPSBuZXcgU3BlY1Jlc3RBcGkodGhpcywgJ1Jlc3RBcGknLCB7XG4gICAgICAuLi5hcGlHYXRld2F5UHJvcHMsXG4gICAgICBhcGlEZWZpbml0aW9uOiBBcGlEZWZpbml0aW9uLmZyb21JbmxpbmUoc3BlYyksXG4gICAgfSk7XG5cbiAgICAvLyBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9uIHRvIGludm9rZSBMYW1iZGEgZnVuY3Rpb25zXG4gICAgY29uc3QgYXBpR2F0ZXdheVByaW5jaXBhbCA9IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFxuICAgICAgJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbSdcbiAgICApO1xuICAgIGluaXRMYW1iZGEuZ3JhbnRJbnZva2UoYXBpR2F0ZXdheVByaW5jaXBhbCk7XG4gICAgdXNlcnNMYW1iZGEuZ3JhbnRJbnZva2UoYXBpR2F0ZXdheVByaW5jaXBhbCk7XG4gICAgZmxvd0NvbmZpZ0xhbWJkYS5ncmFudEludm9rZShhcGlHYXRld2F5UHJpbmNpcGFsKTtcbiAgICBwcmV2aWV3U3BlZWNoTGFtYmRhLmdyYW50SW52b2tlKGFwaUdhdGV3YXlQcmluY2lwYWwpO1xuICAgIHNldHRpbmdzTGFtYmRhLmdyYW50SW52b2tlKGFwaUdhdGV3YXlQcmluY2lwYWwpO1xuICAgIHN0YXRpY0xhbWJkYS5ncmFudEludm9rZShhcGlHYXRld2F5UHJpbmNpcGFsKTtcblxuICAgIHRoaXMudXJsID0gdGhpcy52cGNFbmRwb2ludFxuICAgICAgPyBgaHR0cHM6Ly8ke3RoaXMucmVzdEFwaS5yZXN0QXBpSWR9LSR7dGhpcy52cGNFbmRwb2ludC52cGNFbmRwb2ludElkfS5leGVjdXRlLWFwaS4ke3N0YWNrLnJlZ2lvbn0uYW1hem9uYXdzLmNvbS9wcm9kYFxuICAgICAgOiBgaHR0cHM6Ly8ke3RoaXMucmVzdEFwaS5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7c3RhY2sucmVnaW9ufS5hbWF6b25hd3MuY29tL3Byb2RgO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlc291cmNlIHBvbGljeSBmb3IgdGhlIFZQQyBlbmRwb2ludCB0byByZXN0cmljdCBhY2Nlc3MgdG8gdGhlIHNwZWNpZmljIFZQQ1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVWcGNFbmRwb2ludFBvbGljeSh2cGNJZDogc3RyaW5nKTogUG9saWN5RG9jdW1lbnQge1xuICAgIHJldHVybiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbbmV3IEFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2V4ZWN1dGUtYXBpOionXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgICAnYXdzOlNvdXJjZVZwYyc6IHZwY0lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -2,4 +2,8 @@ export interface InitEnv {
2
2
  stackName: string;
3
3
  userPoolId: string;
4
4
  AWS_REGION?: string;
5
+ /**
6
+ * true/false flag to enable/disable CXBuilder branding in the web app.
7
+ */
8
+ branding: string;
5
9
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5pdC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9pbmZyYXN0cnVjdHVyZS9hcGkvSW5pdC9Jbml0LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJbml0RW52IHtcbiAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHVzZXJQb29sSWQ6IHN0cmluZztcbiAgQVdTX1JFR0lPTj86IHN0cmluZztcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5pdC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9pbmZyYXN0cnVjdHVyZS9hcGkvSW5pdC9Jbml0LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJbml0RW52IHtcbiAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHVzZXJQb29sSWQ6IHN0cmluZztcbiAgQVdTX1JFR0lPTj86IHN0cmluZztcbiAgLyoqXG4gICAqIHRydWUvZmFsc2UgZmxhZyB0byBlbmFibGUvZGlzYWJsZSBDWEJ1aWxkZXIgYnJhbmRpbmcgaW4gdGhlIHdlYiBhcHAuXG4gICAqL1xuICBicmFuZGluZzogc3RyaW5nO1xufVxuIl19
@@ -16,6 +16,7 @@ class Init extends constructs_1.Construct {
16
16
  environment: {
17
17
  stackName: stackName,
18
18
  userPoolId: api.stack.props.cognito.userPoolId,
19
+ branding: (api.stack.props.branding ?? true).toString(),
19
20
  },
20
21
  timeout: aws_cdk_lib_1.Duration.seconds(15),
21
22
  initialPolicy: [
@@ -32,4 +33,4 @@ class Init extends constructs_1.Construct {
32
33
  }
33
34
  }
34
35
  exports.Init = Init;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9pbmZyYXN0cnVjdHVyZS9hcGkvSW5pdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFJdkMsNkNBQThDO0FBQzlDLGlEQUE4RDtBQUM5RCxxREFBa0Q7QUFFbEQ7O0dBRUc7QUFDSCxNQUFhLElBQUssU0FBUSxzQkFBUztJQUVqQyxZQUFZLEdBQVE7UUFDbEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVuQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUEsMkJBQVksRUFBVSxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ25ELFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVO2FBQy9DO1lBQ0QsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixhQUFhLEVBQUU7Z0JBQ2IsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO29CQUNwQixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztvQkFDMUMsU0FBUyxFQUFFO3dCQUNULDBCQUEwQixNQUFNLElBQUksT0FBTyxVQUFVLFNBQVMsSUFBSTtxQkFDbkU7aUJBQ0YsQ0FBQzthQUNIO1lBQ0QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVTtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6QkQsb0JBeUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgSW5pdEVudiB9IGZyb20gJy4vSW5pdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQXBpIH0gZnJvbSAnLi4vQXBpJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBjcmVhdGVMYW1iZGEgfSBmcm9tICcuLi8uLi9jcmVhdGVMYW1iZGEnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBUEkgc3VjaCBhcyBBdXRoLlxuICovXG5leHBvcnQgY2xhc3MgSW5pdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IGxhbWJkYTogRnVuY3Rpb247XG4gIGNvbnN0cnVjdG9yKGFwaTogQXBpKSB7XG4gICAgc3VwZXIoYXBpLCAnSW5pdCcpO1xuXG4gICAgY29uc3QgeyBzdGFja05hbWUsIHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICB0aGlzLmxhbWJkYSA9IGNyZWF0ZUxhbWJkYTxJbml0RW52Pih0aGlzLCAnSGFuZGxlcicsIHtcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIHN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgICB1c2VyUG9vbElkOiBhcGkuc3RhY2sucHJvcHMuY29nbml0by51c2VyUG9vbElkLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTUpLFxuICAgICAgaW5pdGlhbFBvbGljeTogW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICBgYXJuOmF3czpjbG91ZGZvcm1hdGlvbjoke3JlZ2lvbn06JHthY2NvdW50fTpzdGFjay8ke3N0YWNrTmFtZX0vKmAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgYWxlcnRUb3BpYzogYXBpLnN0YWNrLmFsZXJ0VG9waWMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9pbmZyYXN0cnVjdHVyZS9hcGkvSW5pdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFJdkMsNkNBQThDO0FBQzlDLGlEQUE4RDtBQUM5RCxxREFBa0Q7QUFFbEQ7O0dBRUc7QUFDSCxNQUFhLElBQUssU0FBUSxzQkFBUztJQUVqQyxZQUFZLEdBQVE7UUFDbEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVuQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUEsMkJBQVksRUFBVSxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ25ELFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVO2dCQUM5QyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2FBQ3hEO1lBQ0QsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixhQUFhLEVBQUU7Z0JBQ2IsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO29CQUNwQixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztvQkFDMUMsU0FBUyxFQUFFO3dCQUNULDBCQUEwQixNQUFNLElBQUksT0FBTyxVQUFVLFNBQVMsSUFBSTtxQkFDbkU7aUJBQ0YsQ0FBQzthQUNIO1lBQ0QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVTtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExQkQsb0JBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgSW5pdEVudiB9IGZyb20gJy4vSW5pdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQXBpIH0gZnJvbSAnLi4vQXBpJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBjcmVhdGVMYW1iZGEgfSBmcm9tICcuLi8uLi9jcmVhdGVMYW1iZGEnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBUEkgc3VjaCBhcyBBdXRoLlxuICovXG5leHBvcnQgY2xhc3MgSW5pdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IGxhbWJkYTogRnVuY3Rpb247XG4gIGNvbnN0cnVjdG9yKGFwaTogQXBpKSB7XG4gICAgc3VwZXIoYXBpLCAnSW5pdCcpO1xuXG4gICAgY29uc3QgeyBzdGFja05hbWUsIHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICB0aGlzLmxhbWJkYSA9IGNyZWF0ZUxhbWJkYTxJbml0RW52Pih0aGlzLCAnSGFuZGxlcicsIHtcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIHN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgICB1c2VyUG9vbElkOiBhcGkuc3RhY2sucHJvcHMuY29nbml0by51c2VyUG9vbElkLFxuICAgICAgICBicmFuZGluZzogKGFwaS5zdGFjay5wcm9wcy5icmFuZGluZyA/PyB0cnVlKS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTUpLFxuICAgICAgaW5pdGlhbFBvbGljeTogW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICBgYXJuOmF3czpjbG91ZGZvcm1hdGlvbjoke3JlZ2lvbn06JHthY2NvdW50fTpzdGFjay8ke3N0YWNrTmFtZX0vKmAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgYWxlcnRUb3BpYzogYXBpLnN0YWNrLmFsZXJ0VG9waWMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export interface SettingsEnv {
2
+ TABLE_NAME: string;
3
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2V0dGluZ3MuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vaW5mcmFzdHJ1Y3R1cmUvYXBpL1NldHRpbmdzL1NldHRpbmdzLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc0VudiB7XG4gIFRBQkxFX05BTUU6IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { Construct } from 'constructs';
2
+ import { Function } from 'aws-cdk-lib/aws-lambda';
3
+ import { Api } from '../Api';
4
+ export declare class Settings extends Construct {
5
+ readonly lambda: Function;
6
+ constructor(api: Api);
7
+ }