@prism-d1/cli 1.0.42 → 1.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/infra/lib/metrics-pipeline-stack.ts +23 -16
- package/dist/src/commands/bootstrapper/setup-gitlab-oidc.d.ts +6 -0
- package/dist/src/commands/bootstrapper/setup-gitlab-oidc.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/setup-gitlab-oidc.js +158 -0
- package/dist/src/commands/bootstrapper/setup-gitlab-oidc.js.map +1 -0
- package/package.json +1 -1
|
@@ -9,6 +9,7 @@ import * as path from 'path';
|
|
|
9
9
|
import { Construct } from 'constructs';
|
|
10
10
|
import { BedrockGuardrailConstruct, createDefaultPrismGuardrailProps } from './constructs/bedrock-guardrail-construct';
|
|
11
11
|
import * as kms from 'aws-cdk-lib/aws-kms';
|
|
12
|
+
import * as ec2 from 'aws-cdk-lib/aws-ec2';
|
|
12
13
|
import { PrismVpcConstruct } from './constructs/prism-vpc-construct';
|
|
13
14
|
import { GuardrailEnforcerConstruct } from './constructs/guardrail-enforcer-construct';
|
|
14
15
|
import { SecurityAgentConstruct } from './constructs/security-agent-construct';
|
|
@@ -128,8 +129,21 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
128
129
|
|
|
129
130
|
// -------------------------------------------------------
|
|
130
131
|
// VPC for Lambda isolation (Pillar 6)
|
|
131
|
-
//
|
|
132
|
-
|
|
132
|
+
// Opt out with: cdk deploy -c skipVpc=true
|
|
133
|
+
// Use existing VPC: cdk deploy -c vpcId=vpc-0123456789abcdef0
|
|
134
|
+
// -------------------------------------------------------
|
|
135
|
+
const skipVpc = this.node.tryGetContext('skipVpc') === 'true';
|
|
136
|
+
const existingVpcId = this.node.tryGetContext('vpcId') as string | undefined;
|
|
137
|
+
const vpcConstruct = skipVpc
|
|
138
|
+
? undefined
|
|
139
|
+
: existingVpcId
|
|
140
|
+
? undefined
|
|
141
|
+
: new PrismVpcConstruct(this, 'VPC');
|
|
142
|
+
const lambdaVpcProps = skipVpc
|
|
143
|
+
? {}
|
|
144
|
+
: existingVpcId
|
|
145
|
+
? { vpc: ec2.Vpc.fromLookup(this, 'ExistingVpc', { vpcId: existingVpcId }) }
|
|
146
|
+
: { vpc: vpcConstruct!.vpc, securityGroups: [vpcConstruct!.lambdaSecurityGroup] };
|
|
133
147
|
|
|
134
148
|
// -------------------------------------------------------
|
|
135
149
|
// Metrics processor Lambda
|
|
@@ -138,8 +152,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
138
152
|
functionName: 'prism-d1-metrics-processor',
|
|
139
153
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
140
154
|
handler: 'metrics-processor.handler',
|
|
141
|
-
|
|
142
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
155
|
+
...lambdaVpcProps,
|
|
143
156
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
144
157
|
bundling: {
|
|
145
158
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -275,8 +288,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
275
288
|
functionName: 'prism-d1-exfiltration-detector',
|
|
276
289
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
277
290
|
handler: 'exfiltration-detector.handler',
|
|
278
|
-
|
|
279
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
291
|
+
...lambdaVpcProps,
|
|
280
292
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
281
293
|
bundling: {
|
|
282
294
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -338,8 +350,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
338
350
|
functionName: 'prism-d1-defect-correlator',
|
|
339
351
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
340
352
|
handler: 'defect-correlator.handler',
|
|
341
|
-
|
|
342
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
353
|
+
...lambdaVpcProps,
|
|
343
354
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
344
355
|
bundling: {
|
|
345
356
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -400,8 +411,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
400
411
|
functionName: 'prism-d1-spec-to-code-calculator',
|
|
401
412
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
402
413
|
handler: 'spec-to-code-calculator.handler',
|
|
403
|
-
|
|
404
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
414
|
+
...lambdaVpcProps,
|
|
405
415
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
406
416
|
bundling: {
|
|
407
417
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -461,8 +471,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
461
471
|
functionName: 'prism-d1-security-agent-processor',
|
|
462
472
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
463
473
|
handler: 'security-agent-processor.handler',
|
|
464
|
-
|
|
465
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
474
|
+
...lambdaVpcProps,
|
|
466
475
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
467
476
|
bundling: {
|
|
468
477
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -510,8 +519,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
510
519
|
functionName: 'prism-d1-security-remediation-tracker',
|
|
511
520
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
512
521
|
handler: 'security-remediation-tracker.handler',
|
|
513
|
-
|
|
514
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
522
|
+
...lambdaVpcProps,
|
|
515
523
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
516
524
|
bundling: {
|
|
517
525
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -569,8 +577,7 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
569
577
|
functionName: 'prism-d1-security-response-automator',
|
|
570
578
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
571
579
|
handler: 'security-response-automator.handler',
|
|
572
|
-
|
|
573
|
-
securityGroups: [vpcConstruct.lambdaSecurityGroup],
|
|
580
|
+
...lambdaVpcProps,
|
|
574
581
|
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda'), {
|
|
575
582
|
bundling: {
|
|
576
583
|
image: lambda.Runtime.NODEJS_22_X.bundlingImage,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-gitlab-oidc.d.ts","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-gitlab-oidc.ts"],"names":[],"mappings":";;;;AAuBA,wBAyIE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
function prompt(question, defaultValue) {
|
|
4
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
5
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : '';
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
rl.question(`${question}${suffix}: `, (answer) => {
|
|
8
|
+
rl.close();
|
|
9
|
+
resolve(answer.trim() || defaultValue || '');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function run(cmd) {
|
|
14
|
+
try {
|
|
15
|
+
const stdout = execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
16
|
+
return { ok: true, stdout, stderr: '' };
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return { ok: false, stdout: '', stderr: (err.stderr || err.message || '').trim() };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export default {
|
|
23
|
+
description: 'Set up GitLab OIDC identity provider and IAM role for GitLab CI/CD',
|
|
24
|
+
async action() {
|
|
25
|
+
console.log('\n🔐 GitLab OIDC Setup for AWS\n');
|
|
26
|
+
console.log('This will create an IAM OIDC identity provider and a role');
|
|
27
|
+
console.log('that GitLab CI/CD can assume to deploy to your AWS account.\n');
|
|
28
|
+
const gitlabUrl = await prompt('GitLab instance URL', 'https://gitlab.aws.dev');
|
|
29
|
+
const projectPath = await prompt('GitLab project path (e.g. group/repo)');
|
|
30
|
+
if (!projectPath) {
|
|
31
|
+
console.error('Error: Project path is required.');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
console.log(`\nConfiguring OIDC for: ${projectPath} on ${gitlabUrl}`);
|
|
35
|
+
// Check AWS credentials
|
|
36
|
+
const sts = run('aws sts get-caller-identity --query Account --output text');
|
|
37
|
+
if (!sts.ok) {
|
|
38
|
+
console.error('Error: AWS credentials not configured. Run "aws configure" first.');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const accountId = sts.stdout;
|
|
42
|
+
console.log(`AWS Account: ${accountId}\n`);
|
|
43
|
+
// Derive provider hostname from URL
|
|
44
|
+
const providerHost = gitlabUrl.replace(/^https?:\/\//, '');
|
|
45
|
+
const providerArn = `arn:aws:iam::${accountId}:oidc-provider/${providerHost}`;
|
|
46
|
+
// Step 1: Create the OIDC provider
|
|
47
|
+
console.log('Step 1: Creating GitLab OIDC identity provider...');
|
|
48
|
+
const existingProvider = run(`aws iam get-open-id-connect-provider --open-id-connect-provider-arn ${providerArn}`);
|
|
49
|
+
if (existingProvider.ok) {
|
|
50
|
+
console.log(' ✓ OIDC provider already exists.');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const createProvider = run(`aws iam create-open-id-connect-provider ` +
|
|
54
|
+
`--url ${gitlabUrl} ` +
|
|
55
|
+
`--client-id-list ${gitlabUrl} ` +
|
|
56
|
+
`--thumbprint-list 0000000000000000000000000000000000000000`);
|
|
57
|
+
if (createProvider.ok) {
|
|
58
|
+
console.log(' ✓ OIDC provider created.');
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.error(` ✗ Failed to create OIDC provider: ${createProvider.stderr}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Step 2: Create the IAM role
|
|
66
|
+
const repoName = projectPath.split('/').pop() || 'prism';
|
|
67
|
+
const roleName = `GitLabCI-${repoName}`;
|
|
68
|
+
console.log(`\nStep 2: Creating IAM role "${roleName}"...`);
|
|
69
|
+
const trustPolicy = JSON.stringify({
|
|
70
|
+
Version: '2012-10-17',
|
|
71
|
+
Statement: [
|
|
72
|
+
{
|
|
73
|
+
Effect: 'Allow',
|
|
74
|
+
Principal: { Federated: providerArn },
|
|
75
|
+
Action: 'sts:AssumeRoleWithWebIdentity',
|
|
76
|
+
Condition: {
|
|
77
|
+
StringEquals: {
|
|
78
|
+
[`${providerHost}:aud`]: gitlabUrl,
|
|
79
|
+
},
|
|
80
|
+
StringLike: {
|
|
81
|
+
[`${providerHost}:sub`]: `project_path:${projectPath}:*`,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
const existingRole = run(`aws iam get-role --role-name ${roleName}`);
|
|
88
|
+
if (existingRole.ok) {
|
|
89
|
+
console.log(` ✓ Role "${roleName}" already exists. Updating trust policy...`);
|
|
90
|
+
const update = run(`aws iam update-assume-role-policy --role-name ${roleName} --policy-document '${trustPolicy}'`);
|
|
91
|
+
if (update.ok)
|
|
92
|
+
console.log(' ✓ Trust policy updated.');
|
|
93
|
+
else {
|
|
94
|
+
console.error(` ✗ Failed: ${update.stderr}`);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const createRole = run(`aws iam create-role --role-name ${roleName} ` +
|
|
100
|
+
`--assume-role-policy-document '${trustPolicy}' ` +
|
|
101
|
+
`--description "GitLab CI OIDC role for ${projectPath}"`);
|
|
102
|
+
if (createRole.ok)
|
|
103
|
+
console.log(` ✓ Role "${roleName}" created.`);
|
|
104
|
+
else {
|
|
105
|
+
console.error(` ✗ Failed: ${createRole.stderr}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Step 3: Attach permissions policy
|
|
110
|
+
console.log('\nStep 3: Attaching permissions policy...');
|
|
111
|
+
const policyDocument = JSON.stringify({
|
|
112
|
+
Version: '2012-10-17',
|
|
113
|
+
Statement: [
|
|
114
|
+
{
|
|
115
|
+
Effect: 'Allow',
|
|
116
|
+
Action: 'events:PutEvents',
|
|
117
|
+
Resource: `arn:aws:events:us-west-2:${accountId}:event-bus/prism-d1-metrics`,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
Effect: 'Allow',
|
|
121
|
+
Action: 'bedrock:InvokeModel',
|
|
122
|
+
Resource: '*',
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
});
|
|
126
|
+
const policyName = 'PrismD1WorkshopPolicy';
|
|
127
|
+
const putPolicy = run(`aws iam put-role-policy --role-name ${roleName} --policy-name ${policyName} --policy-document '${policyDocument}'`);
|
|
128
|
+
if (putPolicy.ok)
|
|
129
|
+
console.log(` ✓ Inline policy "${policyName}" attached.`);
|
|
130
|
+
else {
|
|
131
|
+
console.error(` ✗ Failed: ${putPolicy.stderr}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
// Summary
|
|
135
|
+
const roleArn = `arn:aws:iam::${accountId}:role/${roleName}`;
|
|
136
|
+
console.log('\n════════════════════════════════════════════════');
|
|
137
|
+
console.log(' ✅ GitLab OIDC setup complete!');
|
|
138
|
+
console.log('════════════════════════════════════════════════');
|
|
139
|
+
console.log(`\n Role ARN: ${roleArn}`);
|
|
140
|
+
console.log(` Project: ${projectPath}`);
|
|
141
|
+
console.log(` Provider: ${gitlabUrl}`);
|
|
142
|
+
console.log('\n Next step: Add a CI/CD variable in GitLab');
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log(' In your GitLab project, go to:');
|
|
145
|
+
console.log(' Settings > CI/CD > Variables > Add variable');
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log(` Key: PRISM_METRICS_ROLE_ARN`);
|
|
148
|
+
console.log(` Value: ${roleArn}`);
|
|
149
|
+
console.log(' Type: Variable');
|
|
150
|
+
console.log(' Protect: Yes (only available on protected branches)');
|
|
151
|
+
console.log('');
|
|
152
|
+
console.log(' The PRISM GitLab workflows use id_tokens (GitLab 15.7+) for OIDC.');
|
|
153
|
+
console.log(' The token is configured automatically — no additional setup needed.');
|
|
154
|
+
console.log(` Audience is set to: ${gitlabUrl}`);
|
|
155
|
+
console.log('');
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=setup-gitlab-oidc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-gitlab-oidc.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-gitlab-oidc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,SAAS,MAAM,CAAC,QAAgB,EAAE,YAAqB;IACrD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,GAAG,CAAC,GAAW;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACrF,CAAC;AACH,CAAC;AAED,eAAe;IACb,WAAW,EAAE,oEAAoE;IACjF,KAAK,CAAC,MAAM;QACV,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAE7E,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;QAChF,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,OAAO,SAAS,EAAE,CAAC,CAAC;QAEtE,wBAAwB;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,IAAI,CAAC,CAAC;QAE3C,oCAAoC;QACpC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,gBAAgB,SAAS,kBAAkB,YAAY,EAAE,CAAC;QAE9E,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,GAAG,CAAC,uEAAuE,WAAW,EAAE,CAAC,CAAC;QACnH,IAAI,gBAAgB,CAAC,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,GAAG,GAAG,CACxB,0CAA0C;gBAC1C,SAAS,SAAS,GAAG;gBACrB,oBAAoB,SAAS,GAAG;gBAChC,4DAA4D,CAC7D,CAAC;YACF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,uCAAuC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;QACzD,MAAM,QAAQ,GAAG,YAAY,QAAQ,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,MAAM,CAAC,CAAC;QAE5D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE;gBACT;oBACE,MAAM,EAAE,OAAO;oBACf,SAAS,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;oBACrC,MAAM,EAAE,+BAA+B;oBACvC,SAAS,EAAE;wBACT,YAAY,EAAE;4BACZ,CAAC,GAAG,YAAY,MAAM,CAAC,EAAE,SAAS;yBACnC;wBACD,UAAU,EAAE;4BACV,CAAC,GAAG,YAAY,MAAM,CAAC,EAAE,gBAAgB,WAAW,IAAI;yBACzD;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,GAAG,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QACrE,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,4CAA4C,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,iDAAiD,QAAQ,uBAAuB,WAAW,GAAG,CAAC,CAAC;YACnH,IAAI,MAAM,CAAC,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;iBACnD,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,GAAG,CACpB,mCAAmC,QAAQ,GAAG;gBAC9C,kCAAkC,WAAW,IAAI;gBACjD,0CAA0C,WAAW,GAAG,CACzD,CAAC;YACF,IAAI,UAAU,CAAC,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,YAAY,CAAC,CAAC;iBAC7D,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;QAC9E,CAAC;QAED,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;YACpC,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE;gBACT;oBACE,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,kBAAkB;oBAC1B,QAAQ,EAAE,4BAA4B,SAAS,6BAA6B;iBAC7E;gBACD;oBACE,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,GAAG;iBACd;aACF;SACF,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,uBAAuB,CAAC;QAC3C,MAAM,SAAS,GAAG,GAAG,CACnB,uCAAuC,QAAQ,kBAAkB,UAAU,uBAAuB,cAAc,GAAG,CACpH,CAAC;QACF,IAAI,SAAS,CAAC,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,aAAa,CAAC,CAAC;aACxE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,eAAe,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAE3E,UAAU;QACV,MAAM,OAAO,GAAG,gBAAgB,SAAS,SAAS,QAAQ,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF,CAAC"}
|