avana-cli 2.11.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 (100) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +21 -0
  3. package/README.md +584 -0
  4. package/dist/cli.d.ts +7 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +153 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/install.d.ts +6 -0
  9. package/dist/commands/install.d.ts.map +1 -0
  10. package/dist/commands/install.js +101 -0
  11. package/dist/commands/install.js.map +1 -0
  12. package/dist/commands/scan.d.ts +19 -0
  13. package/dist/commands/scan.d.ts.map +1 -0
  14. package/dist/commands/scan.js +383 -0
  15. package/dist/commands/scan.js.map +1 -0
  16. package/dist/commands/uninstall.d.ts +6 -0
  17. package/dist/commands/uninstall.d.ts.map +1 -0
  18. package/dist/commands/uninstall.js +80 -0
  19. package/dist/commands/uninstall.js.map +1 -0
  20. package/dist/index.d.ts +97 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +475 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/rules/additional-patterns.d.ts +12 -0
  25. package/dist/rules/additional-patterns.d.ts.map +1 -0
  26. package/dist/rules/additional-patterns.js +170 -0
  27. package/dist/rules/additional-patterns.js.map +1 -0
  28. package/dist/rules/code-patterns.d.ts +26 -0
  29. package/dist/rules/code-patterns.d.ts.map +1 -0
  30. package/dist/rules/code-patterns.js +220 -0
  31. package/dist/rules/code-patterns.js.map +1 -0
  32. package/dist/rules/secret-patterns.d.ts +28 -0
  33. package/dist/rules/secret-patterns.d.ts.map +1 -0
  34. package/dist/rules/secret-patterns.js +1729 -0
  35. package/dist/rules/secret-patterns.js.map +1 -0
  36. package/dist/scanners/secret-scanner.d.ts +34 -0
  37. package/dist/scanners/secret-scanner.d.ts.map +1 -0
  38. package/dist/scanners/secret-scanner.js +281 -0
  39. package/dist/scanners/secret-scanner.js.map +1 -0
  40. package/dist/types/index.d.ts +116 -0
  41. package/dist/types/index.d.ts.map +1 -0
  42. package/dist/types/index.js +7 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/dist/utils/error-handler.d.ts +126 -0
  45. package/dist/utils/error-handler.d.ts.map +1 -0
  46. package/dist/utils/error-handler.js +222 -0
  47. package/dist/utils/error-handler.js.map +1 -0
  48. package/dist/utils/exit-codes.d.ts +52 -0
  49. package/dist/utils/exit-codes.d.ts.map +1 -0
  50. package/dist/utils/exit-codes.js +89 -0
  51. package/dist/utils/exit-codes.js.map +1 -0
  52. package/dist/utils/file-stream-scanner.d.ts +31 -0
  53. package/dist/utils/file-stream-scanner.d.ts.map +1 -0
  54. package/dist/utils/file-stream-scanner.js +159 -0
  55. package/dist/utils/file-stream-scanner.js.map +1 -0
  56. package/dist/utils/file-type-detector.d.ts +45 -0
  57. package/dist/utils/file-type-detector.d.ts.map +1 -0
  58. package/dist/utils/file-type-detector.js +237 -0
  59. package/dist/utils/file-type-detector.js.map +1 -0
  60. package/dist/utils/ignore-pattern-manager.d.ts +61 -0
  61. package/dist/utils/ignore-pattern-manager.d.ts.map +1 -0
  62. package/dist/utils/ignore-pattern-manager.js +204 -0
  63. package/dist/utils/ignore-pattern-manager.js.map +1 -0
  64. package/dist/utils/json-output-formatter.d.ts +232 -0
  65. package/dist/utils/json-output-formatter.d.ts.map +1 -0
  66. package/dist/utils/json-output-formatter.js +367 -0
  67. package/dist/utils/json-output-formatter.js.map +1 -0
  68. package/dist/utils/logger.d.ts +181 -0
  69. package/dist/utils/logger.d.ts.map +1 -0
  70. package/dist/utils/logger.js +414 -0
  71. package/dist/utils/logger.js.map +1 -0
  72. package/dist/utils/markdown-output-formatter.d.ts +65 -0
  73. package/dist/utils/markdown-output-formatter.d.ts.map +1 -0
  74. package/dist/utils/markdown-output-formatter.js +316 -0
  75. package/dist/utils/markdown-output-formatter.js.map +1 -0
  76. package/dist/utils/memory-manager.d.ts +77 -0
  77. package/dist/utils/memory-manager.d.ts.map +1 -0
  78. package/dist/utils/memory-manager.js +157 -0
  79. package/dist/utils/memory-manager.js.map +1 -0
  80. package/dist/utils/parallel-scanner-worker.d.ts +19 -0
  81. package/dist/utils/parallel-scanner-worker.d.ts.map +1 -0
  82. package/dist/utils/parallel-scanner-worker.js +51 -0
  83. package/dist/utils/parallel-scanner-worker.js.map +1 -0
  84. package/dist/utils/parallel-scanner.d.ts +82 -0
  85. package/dist/utils/parallel-scanner.d.ts.map +1 -0
  86. package/dist/utils/parallel-scanner.js +229 -0
  87. package/dist/utils/parallel-scanner.js.map +1 -0
  88. package/dist/utils/pattern-validator.d.ts +108 -0
  89. package/dist/utils/pattern-validator.d.ts.map +1 -0
  90. package/dist/utils/pattern-validator.js +315 -0
  91. package/dist/utils/pattern-validator.js.map +1 -0
  92. package/dist/utils/progress-reporter.d.ts +68 -0
  93. package/dist/utils/progress-reporter.d.ts.map +1 -0
  94. package/dist/utils/progress-reporter.js +194 -0
  95. package/dist/utils/progress-reporter.js.map +1 -0
  96. package/dist/utils/result-cache.d.ts +99 -0
  97. package/dist/utils/result-cache.d.ts.map +1 -0
  98. package/dist/utils/result-cache.js +335 -0
  99. package/dist/utils/result-cache.js.map +1 -0
  100. package/package.json +80 -0
package/dist/cli.js ADDED
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Avana CLI
5
+ * Command-line interface for security scanning
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const scan_1 = require("./commands/scan");
9
+ const install_1 = require("./commands/install");
10
+ const uninstall_1 = require("./commands/uninstall");
11
+ const exit_codes_1 = require("./utils/exit-codes");
12
+ const args = process.argv.slice(2);
13
+ const command = args[0];
14
+ async function main() {
15
+ try {
16
+ if (!command || command === 'scan') {
17
+ // Parse CLI arguments
18
+ const verbose = args.includes('--verbose') || args.includes('-v');
19
+ const debug = args.includes('--debug');
20
+ const quiet = args.includes('--quiet');
21
+ const staged = args.includes('--staged');
22
+ const outputJson = args.includes('--output-json') || args.includes('--json');
23
+ const outputMd = args.includes('--output-md');
24
+ const noProgress = args.includes('--no-progress');
25
+ const failOnHigh = args.includes('--fail-on-high');
26
+ // Parse path argument
27
+ const pathIndex = args.indexOf('--path');
28
+ const path = pathIndex >= 0 ? args[pathIndex + 1] : undefined;
29
+ // Validate path argument
30
+ if (pathIndex >= 0 && !path) {
31
+ (0, exit_codes_1.handleInvalidArguments)('--path flag requires a value');
32
+ }
33
+ // Parse max-memory argument
34
+ const maxMemoryIndex = args.indexOf('--max-memory');
35
+ let maxMemory;
36
+ if (maxMemoryIndex >= 0) {
37
+ const maxMemoryStr = args[maxMemoryIndex + 1];
38
+ if (!maxMemoryStr) {
39
+ (0, exit_codes_1.handleInvalidArguments)('--max-memory flag requires a value');
40
+ }
41
+ maxMemory = parseInt(maxMemoryStr, 10);
42
+ if (isNaN(maxMemory) || maxMemory <= 0) {
43
+ (0, exit_codes_1.handleInvalidArguments)('--max-memory must be a positive number');
44
+ }
45
+ }
46
+ // Parse workers argument
47
+ const workersIndex = args.indexOf('--workers');
48
+ let workers;
49
+ if (workersIndex >= 0) {
50
+ const workersStr = args[workersIndex + 1];
51
+ if (!workersStr) {
52
+ (0, exit_codes_1.handleInvalidArguments)('--workers flag requires a value');
53
+ }
54
+ workers = parseInt(workersStr, 10);
55
+ if (isNaN(workers) || workers <= 0) {
56
+ (0, exit_codes_1.handleInvalidArguments)('--workers must be a positive number');
57
+ }
58
+ }
59
+ // Parse ignore patterns
60
+ const ignorePatterns = [];
61
+ let i = 0;
62
+ while (i < args.length) {
63
+ if (args[i] === '--ignore' && i + 1 < args.length) {
64
+ ignorePatterns.push(args[i + 1]);
65
+ i += 2;
66
+ }
67
+ else {
68
+ i++;
69
+ }
70
+ }
71
+ await (0, scan_1.scanCommand)({
72
+ path,
73
+ verbose,
74
+ debug,
75
+ quiet,
76
+ staged,
77
+ outputJson,
78
+ outputMd,
79
+ ignorePatterns,
80
+ noProgress,
81
+ failOnHigh,
82
+ maxMemory,
83
+ workers
84
+ });
85
+ }
86
+ else if (command === 'install') {
87
+ await (0, install_1.installCommand)();
88
+ }
89
+ else if (command === 'uninstall') {
90
+ await (0, uninstall_1.uninstallCommand)();
91
+ }
92
+ else if (command === '--help' || command === '-h') {
93
+ console.log(`
94
+ šŸ”’ Avana CLI
95
+
96
+ Usage:
97
+ avana scan [options] Scan project for security issues
98
+ avana install Install Git pre-commit hooks
99
+ avana uninstall Remove Git pre-commit hooks
100
+ avana --help Show this help message
101
+
102
+ Scan Options:
103
+ --path <path> Path to scan (default: current directory)
104
+ --staged Scan only Git staged files (for pre-commit hooks)
105
+ --verbose, -v Show detailed output
106
+ --debug Show debug information
107
+ --quiet Show minimal output
108
+ --json Save results to JSON file
109
+ --output-json Save results to JSON file (alias for --json)
110
+ --output-md Save results to Markdown file
111
+ --no-progress Disable progress bar
112
+ --fail-on-high Exit with code 1 on high severity issues
113
+ --max-memory <mb> Set memory limit in MB (default: 500)
114
+ --workers <count> Set number of worker threads (default: CPU count - 1)
115
+ --ignore <pattern> Ignore files matching pattern (can be used multiple times)
116
+
117
+ Exit Codes:
118
+ 0 No critical or high severity issues found
119
+ 1 Critical or high severity issues found
120
+ 2 Invalid arguments or configuration
121
+ 3 Unexpected error occurred
122
+
123
+ Examples:
124
+ avana scan
125
+ avana scan --path ./my-project
126
+ avana scan --staged
127
+ avana scan --verbose --debug
128
+ avana scan --json --output-md
129
+ avana scan --fail-on-high
130
+ avana scan --max-memory 1000 --workers 4
131
+ avana scan --ignore "**/*.md" --ignore "tests/**"
132
+ avana install
133
+ avana uninstall
134
+ `);
135
+ process.exit(exit_codes_1.ExitCode.SUCCESS);
136
+ }
137
+ else {
138
+ (0, exit_codes_1.handleInvalidArguments)(`Unknown command: ${command}`);
139
+ }
140
+ }
141
+ catch (error) {
142
+ if (error instanceof Error) {
143
+ (0, exit_codes_1.handleUnexpectedError)(error);
144
+ }
145
+ else {
146
+ (0, exit_codes_1.handleUnexpectedError)(new Error(String(error)));
147
+ }
148
+ }
149
+ }
150
+ main().catch(error => {
151
+ (0, exit_codes_1.handleUnexpectedError)(error instanceof Error ? error : new Error(String(error)));
152
+ });
153
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Avana CLI - Install Command
3
+ * Installs Git hooks for automatic pre-commit scanning
4
+ */
5
+ export declare function installCommand(): Promise<void>;
6
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DpD"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ /**
3
+ * Avana CLI - Install Command
4
+ * Installs Git hooks for automatic pre-commit scanning
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.installCommand = installCommand;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const child_process_1 = require("child_process");
44
+ const exit_codes_1 = require("../utils/exit-codes");
45
+ async function installCommand() {
46
+ console.log('šŸ”’ Installing Avana Git hooks...\n');
47
+ try {
48
+ // Check if we're in a Git repository
49
+ if (!fs.existsSync('.git')) {
50
+ console.error('āŒ Error: Not a Git repository');
51
+ console.log(' Run this command from the root of your Git repository\n');
52
+ process.exit(exit_codes_1.ExitCode.INVALID_ARGUMENTS);
53
+ }
54
+ // Check if Husky is installed
55
+ try {
56
+ require.resolve('husky');
57
+ }
58
+ catch {
59
+ console.log('šŸ“¦ Installing Husky...');
60
+ (0, child_process_1.execSync)('npm install --save-dev husky', { stdio: 'inherit' });
61
+ }
62
+ // Initialize Husky
63
+ console.log('āš™ļø Initializing Husky...');
64
+ (0, child_process_1.execSync)('npx husky init', { stdio: 'inherit' });
65
+ // Create .husky directory if it doesn't exist
66
+ const huskyDir = path.join(process.cwd(), '.husky');
67
+ if (!fs.existsSync(huskyDir)) {
68
+ fs.mkdirSync(huskyDir, { recursive: true });
69
+ }
70
+ // Create pre-commit hook
71
+ const preCommitPath = path.join(huskyDir, 'pre-commit');
72
+ const preCommitContent = `#!/usr/bin/env sh
73
+ . "$(dirname -- "$0")/_/husky.sh"
74
+
75
+ # Run Avana security scan
76
+ echo "šŸ”’ Running Avana security scan..."
77
+ npx avana scan --staged
78
+
79
+ # Exit code 1 will block the commit
80
+ `;
81
+ fs.writeFileSync(preCommitPath, preCommitContent, { mode: 0o755 });
82
+ // Make the hook executable (Unix-like systems)
83
+ if (process.platform !== 'win32') {
84
+ fs.chmodSync(preCommitPath, 0o755);
85
+ }
86
+ console.log('\nāœ… Avana Git hooks installed successfully!\n');
87
+ console.log('šŸ“‹ What happens now:');
88
+ console.log(' • Before each commit, Avana will scan your staged files');
89
+ console.log(' • Commits with critical/high severity issues will be blocked');
90
+ console.log(' • You\'ll see clear error messages with fix suggestions\n');
91
+ console.log('šŸ’” Tips:');
92
+ console.log(' • To bypass the hook: git commit --no-verify');
93
+ console.log(' • To uninstall: avana uninstall\n');
94
+ process.exit(exit_codes_1.ExitCode.SUCCESS);
95
+ }
96
+ catch (error) {
97
+ console.error('āŒ Error installing Git hooks:', error.message);
98
+ (0, exit_codes_1.handleUnexpectedError)(error instanceof Error ? error : new Error(String(error)));
99
+ }
100
+ }
101
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOH,wCA8DC;AAnED,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AACzC,oDAA8F;AAEvF,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,qCAAqC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,qBAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC3C,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,IAAA,wBAAQ,EAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAA,wBAAQ,EAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAEjD,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,yBAAyB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,gBAAgB,GAAG;;;;;;;;CAQ5B,CAAC;QAEE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,+CAA+C;QAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEpD,OAAO,CAAC,IAAI,CAAC,qBAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAA,kCAAqB,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Avana CLI - Scan Command
3
+ * Scans project for security issues
4
+ */
5
+ export declare function scanCommand(options: {
6
+ path?: string;
7
+ verbose?: boolean;
8
+ debug?: boolean;
9
+ quiet?: boolean;
10
+ staged?: boolean;
11
+ outputJson?: boolean;
12
+ outputMd?: boolean;
13
+ ignorePatterns?: string[];
14
+ noProgress?: boolean;
15
+ failOnHigh?: boolean;
16
+ maxMemory?: number;
17
+ workers?: number;
18
+ }): Promise<void>;
19
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2GH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,iBAoOA"}