@probelabs/visor 0.1.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 (116) hide show
  1. package/README.md +1240 -0
  2. package/action.yml +142 -0
  3. package/defaults/.visor.yaml +184 -0
  4. package/dist/action-cli-bridge.d.ts +104 -0
  5. package/dist/action-cli-bridge.d.ts.map +1 -0
  6. package/dist/action-cli-bridge.js +372 -0
  7. package/dist/action-cli-bridge.js.map +1 -0
  8. package/dist/ai-review-service.d.ts +84 -0
  9. package/dist/ai-review-service.d.ts.map +1 -0
  10. package/dist/ai-review-service.js +674 -0
  11. package/dist/ai-review-service.js.map +1 -0
  12. package/dist/check-execution-engine.d.ts +165 -0
  13. package/dist/check-execution-engine.d.ts.map +1 -0
  14. package/dist/check-execution-engine.js +1172 -0
  15. package/dist/check-execution-engine.js.map +1 -0
  16. package/dist/cli-main.d.ts +6 -0
  17. package/dist/cli-main.d.ts.map +1 -0
  18. package/dist/cli-main.js +247 -0
  19. package/dist/cli-main.js.map +1 -0
  20. package/dist/cli.d.ts +47 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +224 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands.d.ts +10 -0
  25. package/dist/commands.d.ts.map +1 -0
  26. package/dist/commands.js +53 -0
  27. package/dist/commands.js.map +1 -0
  28. package/dist/config.d.ts +63 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +369 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/dependency-resolver.d.ts +54 -0
  33. package/dist/dependency-resolver.d.ts.map +1 -0
  34. package/dist/dependency-resolver.js +163 -0
  35. package/dist/dependency-resolver.js.map +1 -0
  36. package/dist/event-mapper.d.ts +125 -0
  37. package/dist/event-mapper.d.ts.map +1 -0
  38. package/dist/event-mapper.js +311 -0
  39. package/dist/event-mapper.js.map +1 -0
  40. package/dist/failure-condition-evaluator.d.ts +81 -0
  41. package/dist/failure-condition-evaluator.d.ts.map +1 -0
  42. package/dist/failure-condition-evaluator.js +445 -0
  43. package/dist/failure-condition-evaluator.js.map +1 -0
  44. package/dist/git-repository-analyzer.d.ts +45 -0
  45. package/dist/git-repository-analyzer.d.ts.map +1 -0
  46. package/dist/git-repository-analyzer.js +285 -0
  47. package/dist/git-repository-analyzer.js.map +1 -0
  48. package/dist/github-check-service.d.ts +104 -0
  49. package/dist/github-check-service.d.ts.map +1 -0
  50. package/dist/github-check-service.js +382 -0
  51. package/dist/github-check-service.js.map +1 -0
  52. package/dist/github-comments.d.ts +109 -0
  53. package/dist/github-comments.d.ts.map +1 -0
  54. package/dist/github-comments.js +289 -0
  55. package/dist/github-comments.js.map +1 -0
  56. package/dist/index.d.ts +2 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +1265 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/output-formatters.d.ts +66 -0
  61. package/dist/output-formatters.d.ts.map +1 -0
  62. package/dist/output-formatters.js +624 -0
  63. package/dist/output-formatters.js.map +1 -0
  64. package/dist/pr-analyzer.d.ts +47 -0
  65. package/dist/pr-analyzer.d.ts.map +1 -0
  66. package/dist/pr-analyzer.js +194 -0
  67. package/dist/pr-analyzer.js.map +1 -0
  68. package/dist/pr-detector.d.ts +78 -0
  69. package/dist/pr-detector.d.ts.map +1 -0
  70. package/dist/pr-detector.js +357 -0
  71. package/dist/pr-detector.js.map +1 -0
  72. package/dist/providers/ai-check-provider.d.ts +40 -0
  73. package/dist/providers/ai-check-provider.d.ts.map +1 -0
  74. package/dist/providers/ai-check-provider.js +416 -0
  75. package/dist/providers/ai-check-provider.js.map +1 -0
  76. package/dist/providers/check-provider-registry.d.ts +67 -0
  77. package/dist/providers/check-provider-registry.d.ts.map +1 -0
  78. package/dist/providers/check-provider-registry.js +138 -0
  79. package/dist/providers/check-provider-registry.js.map +1 -0
  80. package/dist/providers/check-provider.interface.d.ts +78 -0
  81. package/dist/providers/check-provider.interface.d.ts.map +1 -0
  82. package/dist/providers/check-provider.interface.js +11 -0
  83. package/dist/providers/check-provider.interface.js.map +1 -0
  84. package/dist/providers/index.d.ts +10 -0
  85. package/dist/providers/index.d.ts.map +1 -0
  86. package/dist/providers/index.js +19 -0
  87. package/dist/providers/index.js.map +1 -0
  88. package/dist/providers/script-check-provider.d.ts +20 -0
  89. package/dist/providers/script-check-provider.d.ts.map +1 -0
  90. package/dist/providers/script-check-provider.js +163 -0
  91. package/dist/providers/script-check-provider.js.map +1 -0
  92. package/dist/providers/tool-check-provider.d.ts +19 -0
  93. package/dist/providers/tool-check-provider.d.ts.map +1 -0
  94. package/dist/providers/tool-check-provider.js +125 -0
  95. package/dist/providers/tool-check-provider.js.map +1 -0
  96. package/dist/providers/webhook-check-provider.d.ts +21 -0
  97. package/dist/providers/webhook-check-provider.d.ts.map +1 -0
  98. package/dist/providers/webhook-check-provider.js +173 -0
  99. package/dist/providers/webhook-check-provider.js.map +1 -0
  100. package/dist/reviewer.d.ts +88 -0
  101. package/dist/reviewer.d.ts.map +1 -0
  102. package/dist/reviewer.js +760 -0
  103. package/dist/reviewer.js.map +1 -0
  104. package/dist/types/cli.d.ts +41 -0
  105. package/dist/types/cli.d.ts.map +1 -0
  106. package/dist/types/cli.js +3 -0
  107. package/dist/types/cli.js.map +1 -0
  108. package/dist/types/config.d.ts +315 -0
  109. package/dist/types/config.d.ts.map +1 -0
  110. package/dist/types/config.js +6 -0
  111. package/dist/types/config.js.map +1 -0
  112. package/dist/utils/env-resolver.d.ts +38 -0
  113. package/dist/utils/env-resolver.d.ts.map +1 -0
  114. package/dist/utils/env-resolver.js +130 -0
  115. package/dist/utils/env-resolver.js.map +1 -0
  116. package/package.json +116 -0
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ActionCliBridge = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const fs_1 = require("fs");
39
+ const path = __importStar(require("path"));
40
+ /**
41
+ * Bridge between GitHub Action and Visor CLI
42
+ */
43
+ class ActionCliBridge {
44
+ githubToken;
45
+ context;
46
+ constructor(githubToken, context) {
47
+ this.githubToken = githubToken;
48
+ this.context = context;
49
+ }
50
+ /**
51
+ * Determine if Visor CLI should be used based on inputs
52
+ */
53
+ shouldUseVisor(inputs) {
54
+ return !!(inputs['config-path'] ||
55
+ inputs['visor-config-path'] ||
56
+ inputs.checks ||
57
+ inputs['visor-checks']);
58
+ }
59
+ /**
60
+ * Parse GitHub Action inputs to CLI arguments
61
+ */
62
+ parseGitHubInputsToCliArgs(inputs) {
63
+ const args = [];
64
+ // Add config path if specified (prefer new input name over legacy)
65
+ const configPath = inputs['config-path'] || inputs['visor-config-path'];
66
+ if (configPath && configPath.trim() !== '') {
67
+ args.push('--config', configPath);
68
+ }
69
+ // Add checks if specified (prefer new input name over legacy)
70
+ const checksInput = inputs.checks || inputs['visor-checks'];
71
+ if (checksInput) {
72
+ const checks = checksInput
73
+ .split(',')
74
+ .map(check => check.trim())
75
+ .filter(check => this.isValidCheck(check));
76
+ // CRITICAL FIX: When "all" is specified, don't add any --check arguments
77
+ // This allows CLI to extract all checks from the config file
78
+ if (checks.length > 0 && !checks.includes('all')) {
79
+ // Only add specific checks if "all" is not in the list
80
+ for (const check of checks) {
81
+ args.push('--check', check);
82
+ }
83
+ }
84
+ // When checks includes 'all', we intentionally don't add any --check arguments
85
+ // The CLI will then use all checks defined in .visor.yaml
86
+ }
87
+ // Add output format if specified
88
+ if (inputs['output-format']) {
89
+ args.push('--output', inputs['output-format']);
90
+ }
91
+ else {
92
+ // Always use JSON output for programmatic processing
93
+ args.push('--output', 'json');
94
+ }
95
+ // Add debug flag if enabled
96
+ if (inputs.debug === 'true') {
97
+ args.push('--debug');
98
+ }
99
+ return args;
100
+ }
101
+ /**
102
+ * Execute CLI with GitHub context
103
+ */
104
+ async executeCliWithContext(inputs, options = {}) {
105
+ const { workingDir = process.cwd(), timeout = 300000 } = options; // 5 min timeout
106
+ try {
107
+ const cliArgs = this.parseGitHubInputsToCliArgs(inputs);
108
+ // Set up environment variables for CLI
109
+ const env = {
110
+ ...process.env,
111
+ GITHUB_EVENT_NAME: this.context.event_name,
112
+ GITHUB_CONTEXT: JSON.stringify(this.context),
113
+ GITHUB_REPOSITORY_OWNER: this.context.repository?.owner.login || inputs.owner || '',
114
+ GITHUB_REPOSITORY: this.context.repository
115
+ ? `${this.context.repository.owner.login}/${this.context.repository.name}`
116
+ : `${inputs.owner || ''}/${inputs.repo || ''}`,
117
+ };
118
+ // Pass GitHub App credentials if they exist in inputs
119
+ if (inputs['app-id']) {
120
+ env.INPUT_APP_ID = inputs['app-id'];
121
+ }
122
+ if (inputs['private-key']) {
123
+ env.INPUT_PRIVATE_KEY = inputs['private-key'];
124
+ }
125
+ if (inputs['installation-id']) {
126
+ env.INPUT_INSTALLATION_ID = inputs['installation-id'];
127
+ }
128
+ // Only set GITHUB_TOKEN if we're not using GitHub App authentication
129
+ const isUsingGitHubApp = inputs['app-id'] && inputs['private-key'];
130
+ if (this.githubToken && !isUsingGitHubApp) {
131
+ env.GITHUB_TOKEN = this.githubToken;
132
+ }
133
+ console.log(`🚀 Executing Visor CLI with args: ${cliArgs.join(' ')}`);
134
+ const result = await this.executeCommand('node', ['dist/cli-main.js', ...cliArgs], {
135
+ cwd: workingDir,
136
+ env,
137
+ timeout,
138
+ });
139
+ if (result.exitCode === 0) {
140
+ // Try to parse CLI output for additional data
141
+ const cliOutput = this.parseCliOutput(result.output);
142
+ return {
143
+ success: true,
144
+ output: result.output,
145
+ exitCode: result.exitCode,
146
+ cliOutput,
147
+ };
148
+ }
149
+ else {
150
+ return {
151
+ success: false,
152
+ output: result.output,
153
+ error: result.error,
154
+ exitCode: result.exitCode,
155
+ };
156
+ }
157
+ }
158
+ catch (error) {
159
+ return {
160
+ success: false,
161
+ error: error instanceof Error ? error.message : 'Unknown error',
162
+ exitCode: -1,
163
+ };
164
+ }
165
+ }
166
+ /**
167
+ * Merge CLI and Action outputs for backward compatibility
168
+ */
169
+ mergeActionAndCliOutputs(actionInputs, cliResult, legacyOutputs) {
170
+ const outputs = {
171
+ // Preserve legacy outputs if present
172
+ ...(legacyOutputs || {}),
173
+ };
174
+ if (cliResult.success && cliResult.cliOutput) {
175
+ const cli = cliResult.cliOutput;
176
+ if (cli.reviewScore !== undefined) {
177
+ outputs['review-score'] = cli.reviewScore.toString();
178
+ }
179
+ if (cli.issuesFound !== undefined) {
180
+ outputs['issues-found'] = cli.issuesFound.toString();
181
+ }
182
+ if (cli.autoReviewCompleted !== undefined) {
183
+ outputs['auto-review-completed'] = cli.autoReviewCompleted.toString();
184
+ }
185
+ }
186
+ return outputs;
187
+ }
188
+ /**
189
+ * Execute command with timeout and proper error handling
190
+ */
191
+ executeCommand(command, args, options = {}) {
192
+ return new Promise((resolve, reject) => {
193
+ const { cwd, env, timeout = 30000 } = options;
194
+ const child = (0, child_process_1.spawn)(command, args, {
195
+ cwd,
196
+ env,
197
+ stdio: ['ignore', 'pipe', 'pipe'],
198
+ });
199
+ let output = '';
200
+ let error = '';
201
+ let timeoutHandle = null;
202
+ if (child.stdout) {
203
+ child.stdout.on('data', data => {
204
+ output += data.toString();
205
+ });
206
+ }
207
+ if (child.stderr) {
208
+ child.stderr.on('data', data => {
209
+ error += data.toString();
210
+ });
211
+ }
212
+ child.on('close', code => {
213
+ if (timeoutHandle) {
214
+ clearTimeout(timeoutHandle);
215
+ }
216
+ resolve({
217
+ output: output.trim(),
218
+ error: error.trim(),
219
+ exitCode: code || 0,
220
+ });
221
+ });
222
+ child.on('error', err => {
223
+ if (timeoutHandle) {
224
+ clearTimeout(timeoutHandle);
225
+ }
226
+ reject(new Error(`Command execution failed: ${err.message}`));
227
+ });
228
+ // Set timeout if specified
229
+ if (timeout > 0) {
230
+ timeoutHandle = setTimeout(() => {
231
+ child.kill('SIGTERM');
232
+ reject(new Error(`Command execution timed out after ${timeout}ms`));
233
+ }, timeout);
234
+ }
235
+ });
236
+ }
237
+ /**
238
+ * Parse CLI JSON output to extract relevant data
239
+ */
240
+ parseCliOutput(output) {
241
+ try {
242
+ // Look for JSON output in the CLI result
243
+ const lines = output.split('\n');
244
+ for (const line of lines) {
245
+ const trimmed = line.trim();
246
+ if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
247
+ const parsed = JSON.parse(trimmed);
248
+ // Extract relevant data that can be used for Action outputs
249
+ return {
250
+ reviewScore: parsed.reviewScore || parsed.overallScore,
251
+ issuesFound: parsed.issuesFound || parsed.totalIssues,
252
+ autoReviewCompleted: parsed.autoReviewCompleted || false,
253
+ };
254
+ }
255
+ }
256
+ return {};
257
+ }
258
+ catch {
259
+ console.log('Could not parse CLI output as JSON, using default values');
260
+ return {};
261
+ }
262
+ }
263
+ /**
264
+ * Check if a check type is valid
265
+ */
266
+ isValidCheck(check) {
267
+ const validChecks = ['performance', 'architecture', 'security', 'style', 'all'];
268
+ return validChecks.includes(check);
269
+ }
270
+ /**
271
+ * Create temporary config file from action inputs
272
+ */
273
+ async createTempConfigFromInputs(inputs, options = {}) {
274
+ const { workingDir = process.cwd() } = options;
275
+ if (!inputs['visor-checks']) {
276
+ return null;
277
+ }
278
+ const checks = inputs['visor-checks']
279
+ .split(',')
280
+ .map(check => check.trim())
281
+ .filter(check => this.isValidCheck(check));
282
+ if (checks.length === 0) {
283
+ return null;
284
+ }
285
+ // Create a basic Visor config from the checks
286
+ const config = {
287
+ version: '1.0',
288
+ checks: {},
289
+ output: {
290
+ pr_comment: {
291
+ format: 'markdown',
292
+ group_by: 'check',
293
+ collapse: true,
294
+ },
295
+ },
296
+ };
297
+ // Map GitHub Action checks to Visor config format
298
+ for (const check of checks) {
299
+ const checkName = `${check}-check`;
300
+ config.checks[checkName] = {
301
+ type: 'ai',
302
+ prompt: this.getPromptForCheck(check),
303
+ on: ['pr_opened', 'pr_updated'],
304
+ };
305
+ }
306
+ // Write temporary config file
307
+ const tempConfigPath = path.join(workingDir, '.visor-temp.yaml');
308
+ try {
309
+ const yaml = require('js-yaml');
310
+ const yamlContent = yaml.dump(config);
311
+ await fs_1.promises.writeFile(tempConfigPath, yamlContent, 'utf8');
312
+ return tempConfigPath;
313
+ }
314
+ catch (error) {
315
+ console.error('Failed to create temporary config file:', error);
316
+ return null;
317
+ }
318
+ }
319
+ /**
320
+ * Get AI prompt for a specific check type
321
+ */
322
+ getPromptForCheck(check) {
323
+ const prompts = {
324
+ security: `Review this code for security vulnerabilities, focusing on:
325
+ - SQL injection, XSS, CSRF vulnerabilities
326
+ - Authentication and authorization flaws
327
+ - Sensitive data exposure
328
+ - Input validation issues
329
+ - Cryptographic weaknesses`,
330
+ performance: `Analyze this code for performance issues, focusing on:
331
+ - Database query efficiency (N+1 problems, missing indexes)
332
+ - Memory usage and potential leaks
333
+ - Algorithmic complexity issues
334
+ - Caching opportunities
335
+ - Resource utilization`,
336
+ architecture: `Review the architectural aspects of this code, focusing on:
337
+ - Design patterns and code organization
338
+ - Separation of concerns
339
+ - SOLID principles adherence
340
+ - Code maintainability and extensibility
341
+ - Technical debt`,
342
+ style: `Review code style and maintainability, focusing on:
343
+ - Consistent naming conventions
344
+ - Code formatting and readability
345
+ - Documentation quality
346
+ - Error handling patterns
347
+ - Code complexity`,
348
+ all: `Perform a comprehensive code review covering:
349
+ - Security vulnerabilities and best practices
350
+ - Performance optimization opportunities
351
+ - Architectural improvements
352
+ - Code style and maintainability
353
+ - Documentation and testing coverage`,
354
+ };
355
+ return prompts[check];
356
+ }
357
+ /**
358
+ * Cleanup temporary files
359
+ */
360
+ async cleanup(options = {}) {
361
+ const { workingDir = process.cwd() } = options;
362
+ const tempConfigPath = path.join(workingDir, '.visor-temp.yaml');
363
+ try {
364
+ await fs_1.promises.unlink(tempConfigPath);
365
+ }
366
+ catch {
367
+ // Ignore cleanup errors
368
+ }
369
+ }
370
+ }
371
+ exports.ActionCliBridge = ActionCliBridge;
372
+ //# sourceMappingURL=action-cli-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-cli-bridge.js","sourceRoot":"","sources":["../src/action-cli-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { PRInfo } from './pr-analyzer';
2
+ import { ReviewSummary } from './reviewer';
3
+ export interface AIReviewConfig {
4
+ apiKey?: string;
5
+ model?: string;
6
+ timeout?: number;
7
+ provider?: 'google' | 'anthropic' | 'openai' | 'mock';
8
+ debug?: boolean;
9
+ }
10
+ export interface AIDebugInfo {
11
+ /** The prompt sent to the AI */
12
+ prompt: string;
13
+ /** Raw response from the AI service */
14
+ rawResponse: string;
15
+ /** Provider used (google, anthropic, openai) */
16
+ provider: string;
17
+ /** Model used */
18
+ model: string;
19
+ /** API key source (for privacy, just show which env var) */
20
+ apiKeySource: string;
21
+ /** Processing time in milliseconds */
22
+ processingTime: number;
23
+ /** Prompt length in characters */
24
+ promptLength: number;
25
+ /** Response length in characters */
26
+ responseLength: number;
27
+ /** Any errors encountered */
28
+ errors?: string[];
29
+ /** Whether JSON parsing succeeded */
30
+ jsonParseSuccess: boolean;
31
+ /** Timestamp when request was made */
32
+ timestamp: string;
33
+ /** Total API calls made */
34
+ totalApiCalls?: number;
35
+ /** Details about API calls made */
36
+ apiCallDetails?: Array<{
37
+ checkName: string;
38
+ provider: string;
39
+ model: string;
40
+ processingTime: number;
41
+ success: boolean;
42
+ }>;
43
+ }
44
+ export declare class AIReviewService {
45
+ private config;
46
+ constructor(config?: AIReviewConfig);
47
+ /**
48
+ * Execute AI review using probe agent
49
+ */
50
+ executeReview(prInfo: PRInfo, customPrompt: string, schema?: string): Promise<ReviewSummary>;
51
+ /**
52
+ * Build a custom prompt for AI review with XML-formatted data
53
+ */
54
+ private buildCustomPrompt;
55
+ /**
56
+ * Format PR context for the AI using XML structure
57
+ */
58
+ private formatPRContext;
59
+ /**
60
+ * Escape XML special characters
61
+ */
62
+ private escapeXml;
63
+ /**
64
+ * Call ProbeAgent SDK with built-in schema validation
65
+ */
66
+ private callProbeAgent;
67
+ /**
68
+ * Load schema content from schema files
69
+ */
70
+ private loadSchemaContent;
71
+ /**
72
+ * Parse AI response JSON
73
+ */
74
+ private parseAIResponse;
75
+ /**
76
+ * Generate mock response for testing
77
+ */
78
+ private generateMockResponse;
79
+ /**
80
+ * Get the API key source for debugging (without revealing the key)
81
+ */
82
+ private getApiKeySource;
83
+ }
84
+ //# sourceMappingURL=ai-review-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-review-service.d.ts","sourceRoot":"","sources":["../src/ai-review-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAaxD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,qCAAqC;IACrC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AAuBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,cAAmB;IA0BvC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IA8GzB;;OAEG;YACW,iBAAiB;IA8C/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoEvB;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;YACW,cAAc;IA4F5B;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;IACH,OAAO,CAAC,eAAe;IA0RvB;;OAEG;YACW,oBAAoB;IAgDlC;;OAEG;IACH,OAAO,CAAC,eAAe;CAYxB"}