@perfai/mcp 1.0.24

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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +352 -0
  3. package/dist/auth/authManager.d.ts +83 -0
  4. package/dist/auth/authManager.d.ts.map +1 -0
  5. package/dist/auth/authManager.js +555 -0
  6. package/dist/auth/sessionCache.d.ts +5 -0
  7. package/dist/auth/sessionCache.d.ts.map +1 -0
  8. package/dist/auth/sessionCache.js +29 -0
  9. package/dist/auth/sessionStorage.d.ts +53 -0
  10. package/dist/auth/sessionStorage.d.ts.map +1 -0
  11. package/dist/auth/sessionStorage.js +234 -0
  12. package/dist/auth/types.d.ts +28 -0
  13. package/dist/auth/types.d.ts.map +1 -0
  14. package/dist/auth/types.js +1 -0
  15. package/dist/config.d.ts +65 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +74 -0
  18. package/dist/server.d.ts +3 -0
  19. package/dist/server.d.ts.map +1 -0
  20. package/dist/server.js +144 -0
  21. package/dist/setup-config.d.ts +4 -0
  22. package/dist/setup-config.d.ts.map +1 -0
  23. package/dist/setup-config.js +69 -0
  24. package/dist/tools/index.d.ts +361 -0
  25. package/dist/tools/index.d.ts.map +1 -0
  26. package/dist/tools/index.js +275 -0
  27. package/dist/tools/protected/aiFixDesignIssue.d.ts +17 -0
  28. package/dist/tools/protected/aiFixDesignIssue.d.ts.map +1 -0
  29. package/dist/tools/protected/aiFixDesignIssue.js +205 -0
  30. package/dist/tools/protected/aiFixQualityIssue.d.ts +17 -0
  31. package/dist/tools/protected/aiFixQualityIssue.d.ts.map +1 -0
  32. package/dist/tools/protected/aiFixQualityIssue.js +188 -0
  33. package/dist/tools/protected/aiFixSecurityIssue.d.ts +17 -0
  34. package/dist/tools/protected/aiFixSecurityIssue.d.ts.map +1 -0
  35. package/dist/tools/protected/aiFixSecurityIssue.js +205 -0
  36. package/dist/tools/protected/checkDesignFixes.d.ts +17 -0
  37. package/dist/tools/protected/checkDesignFixes.d.ts.map +1 -0
  38. package/dist/tools/protected/checkDesignFixes.js +199 -0
  39. package/dist/tools/protected/checkQualityFixes.d.ts +17 -0
  40. package/dist/tools/protected/checkQualityFixes.d.ts.map +1 -0
  41. package/dist/tools/protected/checkQualityFixes.js +199 -0
  42. package/dist/tools/protected/checkSecurityFixes.d.ts +17 -0
  43. package/dist/tools/protected/checkSecurityFixes.d.ts.map +1 -0
  44. package/dist/tools/protected/checkSecurityFixes.js +177 -0
  45. package/dist/tools/protected/listApis.d.ts +28 -0
  46. package/dist/tools/protected/listApis.d.ts.map +1 -0
  47. package/dist/tools/protected/listApis.js +102 -0
  48. package/dist/tools/protected/logout.d.ts +11 -0
  49. package/dist/tools/protected/logout.d.ts.map +1 -0
  50. package/dist/tools/protected/logout.js +22 -0
  51. package/dist/tools/protected/manageOrganizations.d.ts +26 -0
  52. package/dist/tools/protected/manageOrganizations.d.ts.map +1 -0
  53. package/dist/tools/protected/manageOrganizations.js +147 -0
  54. package/dist/tools/protected/runDesignTest.d.ts +21 -0
  55. package/dist/tools/protected/runDesignTest.d.ts.map +1 -0
  56. package/dist/tools/protected/runDesignTest.js +132 -0
  57. package/dist/tools/protected/runQualityTest.d.ts +21 -0
  58. package/dist/tools/protected/runQualityTest.d.ts.map +1 -0
  59. package/dist/tools/protected/runQualityTest.js +150 -0
  60. package/dist/tools/protected/runSecurityTest.d.ts +21 -0
  61. package/dist/tools/protected/runSecurityTest.d.ts.map +1 -0
  62. package/dist/tools/protected/runSecurityTest.js +107 -0
  63. package/dist/tools/protected/selectApi.d.ts +24 -0
  64. package/dist/tools/protected/selectApi.d.ts.map +1 -0
  65. package/dist/tools/protected/selectApi.js +172 -0
  66. package/dist/tools/protected/setup.d.ts +11 -0
  67. package/dist/tools/protected/setup.d.ts.map +1 -0
  68. package/dist/tools/protected/setup.js +151 -0
  69. package/dist/tools/protected/showDesignIssues.d.ts +38 -0
  70. package/dist/tools/protected/showDesignIssues.d.ts.map +1 -0
  71. package/dist/tools/protected/showDesignIssues.js +201 -0
  72. package/dist/tools/protected/showFixedIssues.d.ts +11 -0
  73. package/dist/tools/protected/showFixedIssues.d.ts.map +1 -0
  74. package/dist/tools/protected/showFixedIssues.js +36 -0
  75. package/dist/tools/protected/showQualityIssues.d.ts +33 -0
  76. package/dist/tools/protected/showQualityIssues.d.ts.map +1 -0
  77. package/dist/tools/protected/showQualityIssues.js +225 -0
  78. package/dist/tools/protected/showSecurityIssues.d.ts +47 -0
  79. package/dist/tools/protected/showSecurityIssues.d.ts.map +1 -0
  80. package/dist/tools/protected/showSecurityIssues.js +212 -0
  81. package/dist/tools/protected/summarizeIssues.d.ts +11 -0
  82. package/dist/tools/protected/summarizeIssues.d.ts.map +1 -0
  83. package/dist/tools/protected/summarizeIssues.js +161 -0
  84. package/dist/tools/protected/userInfo.d.ts +11 -0
  85. package/dist/tools/protected/userInfo.d.ts.map +1 -0
  86. package/dist/tools/protected/userInfo.js +21 -0
  87. package/dist/tools/protected/visionAiAppLearning.d.ts +37 -0
  88. package/dist/tools/protected/visionAiAppLearning.d.ts.map +1 -0
  89. package/dist/tools/protected/visionAiAppLearning.js +122 -0
  90. package/dist/tools/public/authStatus.d.ts +11 -0
  91. package/dist/tools/public/authStatus.d.ts.map +1 -0
  92. package/dist/tools/public/authStatus.js +78 -0
  93. package/dist/tools/public/login.d.ts +12 -0
  94. package/dist/tools/public/login.d.ts.map +1 -0
  95. package/dist/tools/public/login.js +230 -0
  96. package/dist/types/api.d.ts +12 -0
  97. package/dist/types/api.d.ts.map +1 -0
  98. package/dist/types/api.js +1 -0
  99. package/dist/utils/dockerRunner.d.ts +44 -0
  100. package/dist/utils/dockerRunner.d.ts.map +1 -0
  101. package/dist/utils/dockerRunner.js +300 -0
  102. package/dist/utils/formatters.d.ts +14 -0
  103. package/dist/utils/formatters.d.ts.map +1 -0
  104. package/dist/utils/formatters.js +510 -0
  105. package/dist/utils/promptBuilder.d.ts +4 -0
  106. package/dist/utils/promptBuilder.d.ts.map +1 -0
  107. package/dist/utils/promptBuilder.js +132 -0
  108. package/package.json +67 -0
@@ -0,0 +1,300 @@
1
+ import { spawn, execSync } from "child_process";
2
+ import { DOCKER_CONFIG, DOCKER_CONFIG_VISION_AI_APP_LEARNING, DESIGN_DOCKER_CONFIG, QUALITY_DOCKER_CONFIG, API_ENDPOINTS, DOCKER_HUB } from '../config.js';
3
+ function dockerLogin() {
4
+ if (!DOCKER_HUB.PAT)
5
+ return;
6
+ execSync(`docker login -u ${DOCKER_HUB.USERNAME} --password-stdin`, {
7
+ input: DOCKER_HUB.PAT,
8
+ stdio: ['pipe', 'pipe', 'pipe'],
9
+ });
10
+ }
11
+ export async function runDockerSecurityTest(options) {
12
+ const { apiId, orgId, accessToken, specUrl, localBasePath } = options;
13
+ dockerLogin();
14
+ // Build Docker command arguments (matching extension implementation)
15
+ const dockerLocalBasePath = localBasePath.replace(/localhost/g, "host.docker.internal");
16
+ const dockerSpecUrl = specUrl.replace(/localhost/g, "host.docker.internal");
17
+ const dockerArgs = [
18
+ "run",
19
+ "--rm",
20
+ `--name=perfai-security-agent-container${Date.now()}`,
21
+ "-e", `WEBAPP_API=${API_ENDPOINTS.WEBAPP_API}`,
22
+ "-e", `ACCESS_TOKEN=${accessToken}`,
23
+ "-e", `MODE=${DOCKER_CONFIG.ENV_VARS.MODE}`,
24
+ "-e", `LOCAL_BASE_PATH=${dockerLocalBasePath}`,
25
+ "-e", `TASK_TYPE=${DOCKER_CONFIG.ENV_VARS.TASK_TYPE}`,
26
+ "-e", `APP_ID=${apiId}`,
27
+ "-e", `ORG_ID=${orgId}`,
28
+ "-e", `DASHBOARD_API=${API_ENDPOINTS.DASHBOARD_API}`,
29
+ "-e", `DASHBOARD_API_AUTH=${API_ENDPOINTS.DASHBOARD_API_AUTH}`,
30
+ "-e", `AGENT_ID=${DOCKER_CONFIG.ENV_VARS.AGENT_ID}`,
31
+ "-e", `LLM_API=${API_ENDPOINTS.LLM_API}`,
32
+ "-e", `LLM_GENERATE_API=${API_ENDPOINTS.LLM_GENERATE_API}`,
33
+ "-e", `PERF_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.PERF_CATEGORY_FILE}`,
34
+ "-e", `TEST_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.TEST_CATEGORY_FILE}`,
35
+ "-e", `PRIVACY_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.PRIVACY_CATEGORY_FILE}`,
36
+ "-e", `SPEC_VALIDATION_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.SPEC_VALIDATION_CATEGORY_FILE}`,
37
+ "-e", `SPEC_URL=${dockerSpecUrl}`,
38
+ DOCKER_CONFIG.IMAGE
39
+ ];
40
+ return new Promise((resolve) => {
41
+ const output = [];
42
+ const errors = [];
43
+ const dockerProcess = spawn("docker", dockerArgs);
44
+ dockerProcess.stdout?.on('data', (data) => {
45
+ const text = data.toString();
46
+ output.push(text);
47
+ console.error(`[Docker stdout]: ${text}`); // Log to stderr to avoid stdout corruption
48
+ });
49
+ dockerProcess.stderr?.on('data', (data) => {
50
+ const text = data.toString();
51
+ errors.push(text);
52
+ console.error(`[Docker stderr]: ${text}`);
53
+ });
54
+ dockerProcess.on('close', (code) => {
55
+ const fullOutput = output.join('').trim();
56
+ const fullErrors = errors.join('').trim();
57
+ resolve({
58
+ success: code === 0,
59
+ output: fullOutput,
60
+ errors: fullErrors,
61
+ exitCode: code
62
+ });
63
+ });
64
+ dockerProcess.on('error', (error) => {
65
+ resolve({
66
+ success: false,
67
+ output: '',
68
+ errors: error.message,
69
+ exitCode: null
70
+ });
71
+ });
72
+ // Set timeout for long-running tests
73
+ setTimeout(() => {
74
+ dockerProcess.kill();
75
+ resolve({
76
+ success: false,
77
+ output: '',
78
+ errors: 'Test exceeded timeout and was cancelled',
79
+ exitCode: null
80
+ });
81
+ }, DOCKER_CONFIG.TIMEOUT);
82
+ });
83
+ }
84
+ export async function runDockerVisionAiAppLearning(options) {
85
+ const { appId, orgId, accessToken, appUrl, userId, specUrl, chatId, modelConfig = "Advance", accountEmail, accountPassword, } = options;
86
+ dockerLogin();
87
+ const dockerAppUrl = appUrl
88
+ .replace(/localhost/gi, "host.docker.internal")
89
+ .replace(/127\.0\.0\.1/g, "host.docker.internal")
90
+ .replace(/0\.0\.0\.0/g, "host.docker.internal");
91
+ const dockerSpecUrl = specUrl
92
+ ? specUrl
93
+ .replace(/localhost/gi, "host.docker.internal")
94
+ .replace(/127\.0\.0\.1/g, "host.docker.internal")
95
+ .replace(/0\.0\.0\.0/g, "host.docker.internal")
96
+ : "";
97
+ const dockerArgs = [
98
+ "run",
99
+ "--rm",
100
+ `--name=perfai-vision-ai-app-learning-container${Date.now()}`,
101
+ "-e", `WEBAPP_API=${API_ENDPOINTS.WEBAPP_API}`,
102
+ "-e", `ACCESS_TOKEN=${accessToken}`,
103
+ "-e", `MODE=LOCAL`,
104
+ "-e", `APP_ID=${appId}`,
105
+ "-e", `ORG_ID=${orgId}`,
106
+ "-e", `APP_URL=${dockerAppUrl}`,
107
+ "-e", `CURRENT_APP=${dockerAppUrl}`,
108
+ "-e", `MODEL_CONFIG=${modelConfig}`,
109
+ ...(userId ? ["-e", `USER_ID=${userId}`] : []),
110
+ ...(dockerSpecUrl ? ["-e", `SPEC_URL=${dockerSpecUrl}`] : []),
111
+ ...(chatId ? ["-e", `CHAT_ID=${chatId}`] : []),
112
+ ...(accountEmail ? ["-e", `APP_ACCOUNT_EMAIL=${accountEmail}`] : []),
113
+ ...(accountPassword ? ["-e", `APP_ACCOUNT_PASSWORD=${accountPassword}`] : []),
114
+ DOCKER_CONFIG_VISION_AI_APP_LEARNING.IMAGE,
115
+ ];
116
+ return new Promise((resolve) => {
117
+ const output = [];
118
+ const errors = [];
119
+ const dockerProcess = spawn("docker", dockerArgs);
120
+ dockerProcess.stdout?.on("data", (data) => {
121
+ const text = data.toString();
122
+ output.push(text);
123
+ console.error(`[Docker vision-ai-app-learning stdout]: ${text}`);
124
+ });
125
+ dockerProcess.stderr?.on("data", (data) => {
126
+ const text = data.toString();
127
+ errors.push(text);
128
+ console.error(`[Docker vision-ai-app-learning stderr]: ${text}`);
129
+ });
130
+ dockerProcess.on("close", (code) => {
131
+ const fullOutput = output.join("").trim();
132
+ const fullErrors = errors.join("").trim();
133
+ resolve({
134
+ success: code === 0,
135
+ output: fullOutput,
136
+ errors: fullErrors,
137
+ exitCode: code,
138
+ });
139
+ });
140
+ dockerProcess.on("error", (error) => {
141
+ resolve({
142
+ success: false,
143
+ output: "",
144
+ errors: error.message,
145
+ exitCode: null,
146
+ });
147
+ });
148
+ setTimeout(() => {
149
+ dockerProcess.kill();
150
+ resolve({
151
+ success: false,
152
+ output: "",
153
+ errors: "Vision AI App Learning exceeded timeout and was cancelled",
154
+ exitCode: null,
155
+ });
156
+ }, DOCKER_CONFIG_VISION_AI_APP_LEARNING.TIMEOUT);
157
+ });
158
+ }
159
+ export async function runDockerDesignTest(options) {
160
+ const { apiId, orgId, accessToken, specUrl, localBasePath } = options;
161
+ dockerLogin();
162
+ // Build Docker command arguments for design testing (matching extension implementation)
163
+ const dockerLocalBasePath = localBasePath.replace(/localhost/g, "host.docker.internal");
164
+ const dockerSpecUrl = specUrl.replace(/localhost/g, "host.docker.internal");
165
+ const dockerArgs = [
166
+ "run",
167
+ "--rm",
168
+ `--name=perfai-design-agent-container${Date.now()}`,
169
+ "-e", `WEBAPP_API=https://api.perfai.ai/api/v1`,
170
+ "-e", `ACCESS_TOKEN=${accessToken}`,
171
+ "-e", `MODE=LOCAL`,
172
+ "-e", `LOCAL_BASE_PATH=${dockerLocalBasePath}`,
173
+ "-e", `TASK_TYPE=GOVERNANCE`,
174
+ "-e", `APP_ID=${apiId}`,
175
+ "-e", `ORG_ID=${orgId}`,
176
+ "-e", `SPEC_URL=${dockerSpecUrl}`,
177
+ // Add config volume mount (matching extension)
178
+ "-v", `${process.cwd()}/config.json:/app/config.json`,
179
+ DESIGN_DOCKER_CONFIG.IMAGE
180
+ ];
181
+ return new Promise((resolve) => {
182
+ const output = [];
183
+ const errors = [];
184
+ const dockerProcess = spawn("docker", dockerArgs);
185
+ dockerProcess.stdout?.on('data', (data) => {
186
+ const text = data.toString();
187
+ output.push(text);
188
+ console.error(`[Docker Design stdout]: ${text}`); // Log to stderr to avoid stdout corruption
189
+ });
190
+ dockerProcess.stderr?.on('data', (data) => {
191
+ const text = data.toString();
192
+ errors.push(text);
193
+ console.error(`[Docker Design stderr]: ${text}`);
194
+ });
195
+ dockerProcess.on('close', (code) => {
196
+ const fullOutput = output.join('').trim();
197
+ const fullErrors = errors.join('').trim();
198
+ resolve({
199
+ success: code === 0,
200
+ output: fullOutput,
201
+ errors: fullErrors,
202
+ exitCode: code
203
+ });
204
+ });
205
+ dockerProcess.on('error', (error) => {
206
+ resolve({
207
+ success: false,
208
+ output: '',
209
+ errors: error.message,
210
+ exitCode: null
211
+ });
212
+ });
213
+ // Set timeout for long-running tests
214
+ setTimeout(() => {
215
+ dockerProcess.kill();
216
+ resolve({
217
+ success: false,
218
+ output: '',
219
+ errors: 'Design test exceeded timeout and was cancelled',
220
+ exitCode: null
221
+ });
222
+ }, DESIGN_DOCKER_CONFIG.TIMEOUT);
223
+ });
224
+ }
225
+ export async function runDockerQualityTest(options) {
226
+ const { apiId, orgId, accessToken, specUrl, localBasePath } = options;
227
+ dockerLogin();
228
+ // Build Docker command arguments for quality testing (matching extension implementation)
229
+ const dockerLocalBasePath = localBasePath.replace(/localhost/g, "host.docker.internal");
230
+ const dockerSpecUrl = specUrl.replace(/localhost/g, "host.docker.internal");
231
+ const dockerArgs = [
232
+ "run",
233
+ "--rm",
234
+ `--name=perfai-quality-agent-container${Date.now()}`,
235
+ "-e", `WEBAPP_API=${API_ENDPOINTS.WEBAPP_API}`,
236
+ "-e", `ACCESS_TOKEN=${accessToken}`,
237
+ "-e", `MODE=${QUALITY_DOCKER_CONFIG.ENV_VARS.MODE}`,
238
+ "-e", `LOCAL_BASE_PATH=${dockerLocalBasePath}`,
239
+ "-e", `TASK_TYPE=${QUALITY_DOCKER_CONFIG.ENV_VARS.TASK_TYPE}`,
240
+ "-e", `APP_ID=${apiId}`,
241
+ "-e", `ORG_ID=${orgId}`,
242
+ "-e", `DASHBOARD_API=${API_ENDPOINTS.DASHBOARD_API}`,
243
+ "-e", `DASHBOARD_API_AUTH=${API_ENDPOINTS.DASHBOARD_API_AUTH}`,
244
+ "-e", `AGENT_ID=${QUALITY_DOCKER_CONFIG.ENV_VARS.AGENT_ID}`,
245
+ "-e", `LLM_API=${API_ENDPOINTS.LLM_API}`,
246
+ "-e", `LLM_GENERATE_API=${API_ENDPOINTS.LLM_GENERATE_API}`,
247
+ "-e", `PERF_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.PERF_CATEGORY_FILE}`,
248
+ "-e", `TEST_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.TEST_CATEGORY_FILE}`,
249
+ "-e", `PRIVACY_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.PRIVACY_CATEGORY_FILE}`,
250
+ "-e", `SPEC_VALIDATION_CATEGORY_FILE=${DOCKER_CONFIG.ENV_VARS.SPEC_VALIDATION_CATEGORY_FILE}`,
251
+ "-e", `SPEC_URL=${dockerSpecUrl}`,
252
+ QUALITY_DOCKER_CONFIG.IMAGE
253
+ ];
254
+ return new Promise((resolve) => {
255
+ const output = [];
256
+ const errors = [];
257
+ const dockerProcess = spawn("docker", dockerArgs);
258
+ dockerProcess.stdout?.on('data', (data) => {
259
+ const text = data.toString();
260
+ output.push(text);
261
+ console.error(`[Docker Quality stdout]: ${text}`); // Log to stderr to avoid stdout corruption
262
+ });
263
+ dockerProcess.stderr?.on('data', (data) => {
264
+ const text = data.toString();
265
+ errors.push(text);
266
+ console.error(`[Docker Quality stderr]: ${text}`);
267
+ });
268
+ dockerProcess.on('close', (code) => {
269
+ console.error(`[Docker Quality] Process exited with code ${code}`);
270
+ resolve({
271
+ success: code === 0,
272
+ output: output.join(''),
273
+ errors: errors.join(''),
274
+ exitCode: code
275
+ });
276
+ });
277
+ dockerProcess.on('error', (error) => {
278
+ console.error(`[Docker Quality] Process error:`, error);
279
+ resolve({
280
+ success: false,
281
+ output: output.join(''),
282
+ errors: errors.join('') + `\nProcess error: ${error.message}`,
283
+ exitCode: null
284
+ });
285
+ });
286
+ // Set timeout
287
+ setTimeout(() => {
288
+ if (!dockerProcess.killed) {
289
+ console.error(`[Docker Quality] Process timed out after ${QUALITY_DOCKER_CONFIG.TIMEOUT}ms`);
290
+ dockerProcess.kill('SIGTERM');
291
+ resolve({
292
+ success: false,
293
+ output: output.join(''),
294
+ errors: errors.join('') + '\nProcess timed out',
295
+ exitCode: null
296
+ });
297
+ }
298
+ }, QUALITY_DOCKER_CONFIG.TIMEOUT);
299
+ });
300
+ }
@@ -0,0 +1,14 @@
1
+ export declare function formatSecurityIssues(issues: any[], userInfo: any, search?: string, hasMore?: boolean, nextCursor?: string): string;
2
+ export declare function formatAppList(apps: any[], orgId: string, userInfo: any, selectedAppId?: string, selectedAppData?: any, authManager?: any, filters?: {
3
+ search?: string;
4
+ environment?: string;
5
+ page?: number;
6
+ limit?: number;
7
+ totalCount?: number;
8
+ hasMore?: boolean;
9
+ }): string;
10
+ export declare function formatOrganizations(organizations: any[], selectedOrgId?: string): string;
11
+ export declare function formatFixedIssues(fixedIssues: any[], userInfo: any): string;
12
+ export declare function formatDesignIssues(issues: any[], userInfo: any, search?: string, hasMore?: boolean, nextCursor?: string): string;
13
+ export declare function formatQualityIssues(issues: any[], userInfo: any, search?: string, hasMore?: boolean, nextCursor?: string): string;
14
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA2HlI;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAoG7Q;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAuCxF;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,CAyC3E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAyHhI;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA2HjI"}