fivosense 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 (110) hide show
  1. package/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
  2. package/.github/PULL_REQUEST_TEMPLATE.md +22 -0
  3. package/.github/workflows/ci.yml +52 -0
  4. package/BLUEPRINT.md +215 -0
  5. package/BUILD_PLAN.md +175 -0
  6. package/CONTRIBUTING.md +80 -0
  7. package/DOCS_VERIFICATION.md +232 -0
  8. package/FINAL_CHECKLIST.md +263 -0
  9. package/FINAL_SUMMARY.md +238 -0
  10. package/GITHUB_PUSH.md +64 -0
  11. package/LICENSE +21 -0
  12. package/PROGRESS.md +153 -0
  13. package/README.md +443 -0
  14. package/RELEASE_READY.md +201 -0
  15. package/SECURITY.md +211 -0
  16. package/SECURITY_DEEP_AUDIT.md +331 -0
  17. package/TODO.md +52 -0
  18. package/dist/ai/judge.d.ts +36 -0
  19. package/dist/ai/judge.d.ts.map +1 -0
  20. package/dist/ai/judge.js +75 -0
  21. package/dist/ai/judge.js.map +1 -0
  22. package/dist/cli/index.d.ts +6 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +39 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/editors/vscode.d.ts +30 -0
  27. package/dist/editors/vscode.d.ts.map +1 -0
  28. package/dist/editors/vscode.js +103 -0
  29. package/dist/editors/vscode.js.map +1 -0
  30. package/dist/engine/adversary.d.ts +24 -0
  31. package/dist/engine/adversary.d.ts.map +1 -0
  32. package/dist/engine/adversary.js +83 -0
  33. package/dist/engine/adversary.js.map +1 -0
  34. package/dist/engine/graph.d.ts +38 -0
  35. package/dist/engine/graph.d.ts.map +1 -0
  36. package/dist/engine/graph.js +131 -0
  37. package/dist/engine/graph.js.map +1 -0
  38. package/dist/engine/reach.d.ts +22 -0
  39. package/dist/engine/reach.d.ts.map +1 -0
  40. package/dist/engine/reach.js +107 -0
  41. package/dist/engine/reach.js.map +1 -0
  42. package/dist/engine/sinks.d.ts +52 -0
  43. package/dist/engine/sinks.d.ts.map +1 -0
  44. package/dist/engine/sinks.js +96 -0
  45. package/dist/engine/sinks.js.map +1 -0
  46. package/dist/engine/sources.d.ts +35 -0
  47. package/dist/engine/sources.d.ts.map +1 -0
  48. package/dist/engine/sources.js +59 -0
  49. package/dist/engine/sources.js.map +1 -0
  50. package/dist/engine/taint.d.ts +37 -0
  51. package/dist/engine/taint.d.ts.map +1 -0
  52. package/dist/engine/taint.js +83 -0
  53. package/dist/engine/taint.js.map +1 -0
  54. package/dist/engine/verify.d.ts +20 -0
  55. package/dist/engine/verify.d.ts.map +1 -0
  56. package/dist/engine/verify.js +65 -0
  57. package/dist/engine/verify.js.map +1 -0
  58. package/dist/features/badge.d.ts +20 -0
  59. package/dist/features/badge.d.ts.map +1 -0
  60. package/dist/features/badge.js +86 -0
  61. package/dist/features/badge.js.map +1 -0
  62. package/dist/features/fix.d.ts +20 -0
  63. package/dist/features/fix.d.ts.map +1 -0
  64. package/dist/features/fix.js +115 -0
  65. package/dist/features/fix.js.map +1 -0
  66. package/dist/features/roast.d.ts +23 -0
  67. package/dist/features/roast.d.ts.map +1 -0
  68. package/dist/features/roast.js +96 -0
  69. package/dist/features/roast.js.map +1 -0
  70. package/dist/hooks/agent.d.ts +19 -0
  71. package/dist/hooks/agent.d.ts.map +1 -0
  72. package/dist/hooks/agent.js +69 -0
  73. package/dist/hooks/agent.js.map +1 -0
  74. package/dist/index.d.ts +34 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +116 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/rules/destructive.d.ts +35 -0
  79. package/dist/rules/destructive.d.ts.map +1 -0
  80. package/dist/rules/destructive.js +117 -0
  81. package/dist/rules/destructive.js.map +1 -0
  82. package/dist/rules/secrets.d.ts +29 -0
  83. package/dist/rules/secrets.d.ts.map +1 -0
  84. package/dist/rules/secrets.js +100 -0
  85. package/dist/rules/secrets.js.map +1 -0
  86. package/package.json +56 -0
  87. package/skill/SKILL.md +86 -0
  88. package/skill/prompts/path-judge.md +22 -0
  89. package/src/ai/judge.ts +100 -0
  90. package/src/cli/index.ts +46 -0
  91. package/src/editors/vscode.ts +125 -0
  92. package/src/engine/adversary.ts +100 -0
  93. package/src/engine/graph.ts +167 -0
  94. package/src/engine/reach.ts +141 -0
  95. package/src/engine/sinks.ts +113 -0
  96. package/src/engine/sources.ts +71 -0
  97. package/src/engine/taint.ts +117 -0
  98. package/src/engine/verify.ts +94 -0
  99. package/src/features/badge.ts +102 -0
  100. package/src/features/fix.ts +138 -0
  101. package/src/features/roast.ts +110 -0
  102. package/src/hooks/agent.ts +84 -0
  103. package/src/index.ts +147 -0
  104. package/src/rules/destructive.ts +131 -0
  105. package/src/rules/secrets.ts +120 -0
  106. package/test/engine.test.ts +110 -0
  107. package/test/features.test.ts +131 -0
  108. package/test/phase3.test.ts +129 -0
  109. package/tsconfig.json +20 -0
  110. package/vitest.config.ts +9 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Catalog of dangerous sinks (vulnerability endpoints)
3
+ * These are operations that can cause security issues if fed untrusted data
4
+ */
5
+ export interface SinkPattern {
6
+ pattern: string;
7
+ category: 'sql' | 'nosql' | 'command' | 'code' | 'xss' | 'path' | 'xxe';
8
+ description: string;
9
+ severity: 'critical' | 'high' | 'medium';
10
+ cwe?: string;
11
+ }
12
+ /**
13
+ * SQL injection sinks
14
+ */
15
+ export declare const SQL_SINKS: SinkPattern[];
16
+ /**
17
+ * NoSQL injection sinks
18
+ */
19
+ export declare const NOSQL_SINKS: SinkPattern[];
20
+ /**
21
+ * Command injection sinks
22
+ */
23
+ export declare const COMMAND_SINKS: SinkPattern[];
24
+ /**
25
+ * Code injection sinks
26
+ */
27
+ export declare const CODE_SINKS: SinkPattern[];
28
+ /**
29
+ * XSS sinks
30
+ */
31
+ export declare const XSS_SINKS: SinkPattern[];
32
+ /**
33
+ * Path traversal sinks
34
+ */
35
+ export declare const PATH_SINKS: SinkPattern[];
36
+ /**
37
+ * All sinks combined
38
+ */
39
+ export declare const ALL_SINKS: SinkPattern[];
40
+ /**
41
+ * Check if a code string matches any sink pattern
42
+ */
43
+ export declare function isSink(code: string): SinkPattern | null;
44
+ /**
45
+ * Get all sinks matching a category
46
+ */
47
+ export declare function getSinksByCategory(category: SinkPattern['category']): SinkPattern[];
48
+ /**
49
+ * Get sinks by severity
50
+ */
51
+ export declare function getSinksBySeverity(severity: SinkPattern['severity']): SinkPattern[];
52
+ //# sourceMappingURL=sinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sinks.d.ts","sourceRoot":"","sources":["../../src/engine/sinks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,EAMlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,WAAW,EAKpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,EAMtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,EAKnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,EAMlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,EAKnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,eAOrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,EAAE,CAEnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,EAAE,CAEnF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Catalog of dangerous sinks (vulnerability endpoints)
3
+ * These are operations that can cause security issues if fed untrusted data
4
+ */
5
+ /**
6
+ * SQL injection sinks
7
+ */
8
+ export const SQL_SINKS = [
9
+ { pattern: 'db.execute', category: 'sql', description: 'SQL execution', severity: 'critical', cwe: 'CWE-89' },
10
+ { pattern: 'db.query', category: 'sql', description: 'SQL query', severity: 'critical', cwe: 'CWE-89' },
11
+ { pattern: 'connection.query', category: 'sql', description: 'MySQL query', severity: 'critical', cwe: 'CWE-89' },
12
+ { pattern: 'pool.query', category: 'sql', description: 'Connection pool query', severity: 'critical', cwe: 'CWE-89' },
13
+ { pattern: 'executeQuery', category: 'sql', description: 'Generic SQL exec', severity: 'critical', cwe: 'CWE-89' },
14
+ ];
15
+ /**
16
+ * NoSQL injection sinks
17
+ */
18
+ export const NOSQL_SINKS = [
19
+ { pattern: 'find', category: 'nosql', description: 'MongoDB find', severity: 'high', cwe: 'CWE-943' },
20
+ { pattern: 'findOne', category: 'nosql', description: 'MongoDB findOne', severity: 'high', cwe: 'CWE-943' },
21
+ { pattern: 'updateOne', category: 'nosql', description: 'MongoDB update', severity: 'high', cwe: 'CWE-943' },
22
+ { pattern: 'deleteOne', category: 'nosql', description: 'MongoDB delete', severity: 'high', cwe: 'CWE-943' },
23
+ ];
24
+ /**
25
+ * Command injection sinks
26
+ */
27
+ export const COMMAND_SINKS = [
28
+ { pattern: 'exec', category: 'command', description: 'Command execution', severity: 'critical', cwe: 'CWE-78' },
29
+ { pattern: 'execSync', category: 'command', description: 'Sync command exec', severity: 'critical', cwe: 'CWE-78' },
30
+ { pattern: 'spawn', category: 'command', description: 'Process spawn', severity: 'critical', cwe: 'CWE-78' },
31
+ { pattern: 'spawnSync', category: 'command', description: 'Sync process spawn', severity: 'critical', cwe: 'CWE-78' },
32
+ { pattern: 'execFile', category: 'command', description: 'File execution', severity: 'critical', cwe: 'CWE-78' },
33
+ ];
34
+ /**
35
+ * Code injection sinks
36
+ */
37
+ export const CODE_SINKS = [
38
+ { pattern: 'eval', category: 'code', description: 'Code evaluation', severity: 'critical', cwe: 'CWE-94' },
39
+ { pattern: 'Function', category: 'code', description: 'Dynamic function creation', severity: 'critical', cwe: 'CWE-94' },
40
+ { pattern: 'setTimeout', category: 'code', description: 'Delayed code exec', severity: 'high', cwe: 'CWE-94' },
41
+ { pattern: 'setInterval', category: 'code', description: 'Repeated code exec', severity: 'high', cwe: 'CWE-94' },
42
+ ];
43
+ /**
44
+ * XSS sinks
45
+ */
46
+ export const XSS_SINKS = [
47
+ { pattern: 'res.send', category: 'xss', description: 'HTTP response', severity: 'high', cwe: 'CWE-79' },
48
+ { pattern: 'res.write', category: 'xss', description: 'HTTP write', severity: 'high', cwe: 'CWE-79' },
49
+ { pattern: 'innerHTML', category: 'xss', description: 'DOM innerHTML', severity: 'critical', cwe: 'CWE-79' },
50
+ { pattern: 'outerHTML', category: 'xss', description: 'DOM outerHTML', severity: 'critical', cwe: 'CWE-79' },
51
+ { pattern: 'document.write', category: 'xss', description: 'Document write', severity: 'critical', cwe: 'CWE-79' },
52
+ ];
53
+ /**
54
+ * Path traversal sinks
55
+ */
56
+ export const PATH_SINKS = [
57
+ { pattern: 'fs.readFile', category: 'path', description: 'File read', severity: 'high', cwe: 'CWE-22' },
58
+ { pattern: 'fs.writeFile', category: 'path', description: 'File write', severity: 'critical', cwe: 'CWE-22' },
59
+ { pattern: 'fs.unlink', category: 'path', description: 'File delete', severity: 'critical', cwe: 'CWE-22' },
60
+ { pattern: 'fs.readFileSync', category: 'path', description: 'Sync file read', severity: 'high', cwe: 'CWE-22' },
61
+ ];
62
+ /**
63
+ * All sinks combined
64
+ */
65
+ export const ALL_SINKS = [
66
+ ...SQL_SINKS,
67
+ ...NOSQL_SINKS,
68
+ ...COMMAND_SINKS,
69
+ ...CODE_SINKS,
70
+ ...XSS_SINKS,
71
+ ...PATH_SINKS,
72
+ ];
73
+ /**
74
+ * Check if a code string matches any sink pattern
75
+ */
76
+ export function isSink(code) {
77
+ for (const sink of ALL_SINKS) {
78
+ if (code.includes(sink.pattern)) {
79
+ return sink;
80
+ }
81
+ }
82
+ return null;
83
+ }
84
+ /**
85
+ * Get all sinks matching a category
86
+ */
87
+ export function getSinksByCategory(category) {
88
+ return ALL_SINKS.filter(s => s.category === category);
89
+ }
90
+ /**
91
+ * Get sinks by severity
92
+ */
93
+ export function getSinksBySeverity(severity) {
94
+ return ALL_SINKS.filter(s => s.severity === severity);
95
+ }
96
+ //# sourceMappingURL=sinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sinks.js","sourceRoot":"","sources":["../../src/engine/sinks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Catalog of untrusted input sources (taint origins)
3
+ * These represent user-controlled data that could be malicious
4
+ */
5
+ export interface SourcePattern {
6
+ pattern: string;
7
+ category: 'http' | 'file' | 'env' | 'cli' | 'external';
8
+ description: string;
9
+ severity: 'critical' | 'high' | 'medium';
10
+ }
11
+ /**
12
+ * HTTP/API sources - user input from web requests
13
+ */
14
+ export declare const HTTP_SOURCES: SourcePattern[];
15
+ /**
16
+ * File system sources - external file content
17
+ */
18
+ export declare const FILE_SOURCES: SourcePattern[];
19
+ /**
20
+ * Environment/config sources - potentially untrusted config
21
+ */
22
+ export declare const ENV_SOURCES: SourcePattern[];
23
+ /**
24
+ * All sources combined
25
+ */
26
+ export declare const ALL_SOURCES: SourcePattern[];
27
+ /**
28
+ * Check if a code string matches any source pattern
29
+ */
30
+ export declare function isSource(code: string): SourcePattern | null;
31
+ /**
32
+ * Get all sources matching a category
33
+ */
34
+ export declare function getSourcesByCategory(category: SourcePattern['category']): SourcePattern[];
35
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/engine/sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC1C;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,EAUvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,EAIvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,EAGtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,iBAIvB,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAO3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,aAAa,EAAE,CAEzF"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Catalog of untrusted input sources (taint origins)
3
+ * These represent user-controlled data that could be malicious
4
+ */
5
+ /**
6
+ * HTTP/API sources - user input from web requests
7
+ */
8
+ export const HTTP_SOURCES = [
9
+ { pattern: 'req.query', category: 'http', description: 'URL query parameters', severity: 'critical' },
10
+ { pattern: 'req.params', category: 'http', description: 'Route parameters', severity: 'critical' },
11
+ { pattern: 'req.body', category: 'http', description: 'Request body', severity: 'critical' },
12
+ { pattern: 'req.headers', category: 'http', description: 'HTTP headers', severity: 'high' },
13
+ { pattern: 'req.cookies', category: 'http', description: 'Cookies', severity: 'high' },
14
+ { pattern: 'request.query', category: 'http', description: 'Query string', severity: 'critical' },
15
+ { pattern: 'request.body', category: 'http', description: 'Request body', severity: 'critical' },
16
+ { pattern: 'ctx.request.body', category: 'http', description: 'Koa/context body', severity: 'critical' },
17
+ { pattern: 'ctx.query', category: 'http', description: 'Koa query', severity: 'critical' },
18
+ ];
19
+ /**
20
+ * File system sources - external file content
21
+ */
22
+ export const FILE_SOURCES = [
23
+ { pattern: 'fs.readFileSync', category: 'file', description: 'File content', severity: 'high' },
24
+ { pattern: 'fs.readFile', category: 'file', description: 'File content async', severity: 'high' },
25
+ { pattern: 'readFileSync', category: 'file', description: 'File read', severity: 'high' },
26
+ ];
27
+ /**
28
+ * Environment/config sources - potentially untrusted config
29
+ */
30
+ export const ENV_SOURCES = [
31
+ { pattern: 'process.env', category: 'env', description: 'Environment variables', severity: 'medium' },
32
+ { pattern: 'process.argv', category: 'cli', description: 'Command-line arguments', severity: 'high' },
33
+ ];
34
+ /**
35
+ * All sources combined
36
+ */
37
+ export const ALL_SOURCES = [
38
+ ...HTTP_SOURCES,
39
+ ...FILE_SOURCES,
40
+ ...ENV_SOURCES,
41
+ ];
42
+ /**
43
+ * Check if a code string matches any source pattern
44
+ */
45
+ export function isSource(code) {
46
+ for (const source of ALL_SOURCES) {
47
+ if (code.includes(source.pattern)) {
48
+ return source;
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Get all sources matching a category
55
+ */
56
+ export function getSourcesByCategory(category) {
57
+ return ALL_SOURCES.filter(s => s.category === category);
58
+ }
59
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/engine/sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE;IACrG,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE;IAClG,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC5F,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC3F,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;IACtF,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;IACjG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;IAChG,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;CAC3F,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC/F,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE;IACjG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE;CAC1F,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE;CACtG,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,WAAW;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAmC;IACtE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Taint Analysis - tracks data flow from sources to sinks
3
+ * Generates taint-trace proofs for each vulnerability
4
+ */
5
+ import { DataFlowGraph } from './graph.js';
6
+ export interface TaintTrace {
7
+ finding: string;
8
+ severity: 'critical' | 'high' | 'medium';
9
+ category: string;
10
+ cwe?: string;
11
+ path: string;
12
+ evidence: string[];
13
+ location: {
14
+ file: string;
15
+ line: number;
16
+ column: number;
17
+ };
18
+ sanitized: boolean;
19
+ confidence: number;
20
+ }
21
+ /**
22
+ * Generate taint traces from data-flow graph
23
+ */
24
+ export declare function generateTaintTraces(graph: DataFlowGraph, filename: string): TaintTrace[];
25
+ /**
26
+ * Filter traces by severity
27
+ */
28
+ export declare function filterBySeverity(traces: TaintTrace[], severity: 'critical' | 'high' | 'medium'): TaintTrace[];
29
+ /**
30
+ * Get only vulnerable (unsanitized) traces
31
+ */
32
+ export declare function getVulnerableTraces(traces: TaintTrace[]): TaintTrace[];
33
+ /**
34
+ * Format trace for display
35
+ */
36
+ export declare function formatTrace(trace: TaintTrace): string;
37
+ //# sourceMappingURL=taint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taint.d.ts","sourceRoot":"","sources":["../../src/engine/taint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CASxF;AA6CD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GACvC,UAAU,EAAE,CAEd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgBrD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Taint Analysis - tracks data flow from sources to sinks
3
+ * Generates taint-trace proofs for each vulnerability
4
+ */
5
+ import { formatTaintPath } from './graph.js';
6
+ /**
7
+ * Generate taint traces from data-flow graph
8
+ */
9
+ export function generateTaintTraces(graph, filename) {
10
+ const traces = [];
11
+ for (const taintPath of graph.taintPaths) {
12
+ const trace = buildTaintTrace(taintPath, filename);
13
+ traces.push(trace);
14
+ }
15
+ return traces;
16
+ }
17
+ /**
18
+ * Build a single taint trace from a taint path
19
+ */
20
+ function buildTaintTrace(path, filename) {
21
+ const source = path.source;
22
+ const sink = path.sink;
23
+ const evidence = [];
24
+ // Build evidence chain
25
+ evidence.push(`Source: ${source.value} at line ${source.loc?.start.line || '?'}`);
26
+ evidence.push(` Type: ${source.sourcePattern?.description || 'untrusted input'}`);
27
+ if (path.sanitized) {
28
+ evidence.push(' ✅ Sanitized');
29
+ }
30
+ else {
31
+ evidence.push(' ❌ NOT sanitized');
32
+ }
33
+ evidence.push(`Sink: ${sink.name} at line ${sink.loc?.start.line || '?'}`);
34
+ evidence.push(` Type: ${sink.sinkPattern?.description || 'dangerous operation'}`);
35
+ const finding = path.sanitized
36
+ ? `Sanitized ${sink.sinkPattern?.category || 'data flow'}`
37
+ : `Potential ${sink.sinkPattern?.category || 'vulnerability'}`;
38
+ return {
39
+ finding,
40
+ severity: sink.sinkPattern?.severity || 'medium',
41
+ category: sink.sinkPattern?.category || 'unknown',
42
+ cwe: sink.sinkPattern?.cwe,
43
+ path: formatTaintPath(path),
44
+ evidence,
45
+ location: {
46
+ file: filename,
47
+ line: sink.loc?.start.line || 0,
48
+ column: sink.loc?.start.column || 0,
49
+ },
50
+ sanitized: path.sanitized,
51
+ confidence: path.confidence,
52
+ };
53
+ }
54
+ /**
55
+ * Filter traces by severity
56
+ */
57
+ export function filterBySeverity(traces, severity) {
58
+ return traces.filter(t => t.severity === severity);
59
+ }
60
+ /**
61
+ * Get only vulnerable (unsanitized) traces
62
+ */
63
+ export function getVulnerableTraces(traces) {
64
+ return traces.filter(t => !t.sanitized);
65
+ }
66
+ /**
67
+ * Format trace for display
68
+ */
69
+ export function formatTrace(trace) {
70
+ const icon = trace.sanitized ? '✅' : '❌';
71
+ const lines = [
72
+ `${icon} [${trace.severity.toUpperCase()}] ${trace.finding}`,
73
+ ` ${trace.location.file}:${trace.location.line}:${trace.location.column}`,
74
+ ` ${trace.path}`,
75
+ ];
76
+ if (trace.cwe) {
77
+ lines.push(` CWE: ${trace.cwe}`);
78
+ }
79
+ lines.push(' Evidence:');
80
+ trace.evidence.forEach(e => lines.push(` ${e}`));
81
+ return lines.join('\n');
82
+ }
83
+ //# sourceMappingURL=taint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taint.js","sourceRoot":"","sources":["../../src/engine/taint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Fix Verification - Re-analyze code after fix to check for regressions
3
+ */
4
+ export interface VerificationResult {
5
+ success: boolean;
6
+ originalIssues: number;
7
+ remainingIssues: number;
8
+ newIssues: number;
9
+ regression: boolean;
10
+ message: string;
11
+ }
12
+ /**
13
+ * Verify that a fix actually resolved the vulnerability
14
+ */
15
+ export declare function verifyFix(originalCode: string, fixedCode: string, targetLine: number): VerificationResult;
16
+ /**
17
+ * Verify multiple fixes
18
+ */
19
+ export declare function verifyMultipleFixes(originalCode: string, fixedCode: string): VerificationResult;
20
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/engine/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,kBAAkB,CA0CpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAoBpB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Fix Verification - Re-analyze code after fix to check for regressions
3
+ */
4
+ import { buildDataFlowGraph } from './graph.js';
5
+ import { generateTaintTraces } from './taint.js';
6
+ /**
7
+ * Verify that a fix actually resolved the vulnerability
8
+ */
9
+ export function verifyFix(originalCode, fixedCode, targetLine) {
10
+ // Analyze original code
11
+ const originalGraph = buildDataFlowGraph(originalCode);
12
+ const originalTraces = generateTaintTraces(originalGraph, 'original.js');
13
+ const originalVulns = originalTraces.filter(t => !t.sanitized);
14
+ // Analyze fixed code
15
+ const fixedGraph = buildDataFlowGraph(fixedCode);
16
+ const fixedTraces = generateTaintTraces(fixedGraph, 'fixed.js');
17
+ const fixedVulns = fixedTraces.filter(t => !t.sanitized);
18
+ // Check for target vulnerability
19
+ const targetVuln = originalVulns.find(v => v.location.line === targetLine);
20
+ const targetFixed = !fixedVulns.find(v => v.location.line === targetLine);
21
+ // Check for regressions (new vulnerabilities introduced)
22
+ const newIssues = fixedVulns.filter(fv => !originalVulns.some(ov => ov.location.line === fv.location.line &&
23
+ ov.category === fv.category)).length;
24
+ const regression = newIssues > 0;
25
+ let message = '';
26
+ if (targetFixed && !regression) {
27
+ message = '✅ Fix verified: vulnerability resolved, no regressions';
28
+ }
29
+ else if (targetFixed && regression) {
30
+ message = `⚠️ Fix applied but introduced ${newIssues} new issue(s)`;
31
+ }
32
+ else if (!targetFixed) {
33
+ message = '❌ Fix failed: vulnerability still present';
34
+ }
35
+ return {
36
+ success: targetFixed && !regression,
37
+ originalIssues: originalVulns.length,
38
+ remainingIssues: fixedVulns.length,
39
+ newIssues,
40
+ regression,
41
+ message,
42
+ };
43
+ }
44
+ /**
45
+ * Verify multiple fixes
46
+ */
47
+ export function verifyMultipleFixes(originalCode, fixedCode) {
48
+ const originalGraph = buildDataFlowGraph(originalCode);
49
+ const originalTraces = generateTaintTraces(originalGraph, 'original.js');
50
+ const originalVulns = originalTraces.filter(t => !t.sanitized);
51
+ const fixedGraph = buildDataFlowGraph(fixedCode);
52
+ const fixedTraces = generateTaintTraces(fixedGraph, 'fixed.js');
53
+ const fixedVulns = fixedTraces.filter(t => !t.sanitized);
54
+ const resolved = originalVulns.length - fixedVulns.length;
55
+ const newIssues = Math.max(0, fixedVulns.length - originalVulns.length);
56
+ return {
57
+ success: fixedVulns.length < originalVulns.length && newIssues === 0,
58
+ originalIssues: originalVulns.length,
59
+ remainingIssues: fixedVulns.length,
60
+ newIssues,
61
+ regression: newIssues > 0,
62
+ message: `Resolved ${resolved} issue(s), ${newIssues} new issue(s) introduced`,
63
+ };
64
+ }
65
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/engine/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Security Badge Generator - Creates shareable security report cards
3
+ */
4
+ import { AuditResult } from '../index.js';
5
+ export interface SecurityBadge {
6
+ grade: string;
7
+ score: number;
8
+ color: string;
9
+ markdown: string;
10
+ shield: string;
11
+ }
12
+ /**
13
+ * Generate security badge
14
+ */
15
+ export declare function generateBadge(result: AuditResult): SecurityBadge;
16
+ /**
17
+ * Generate badge markdown for README
18
+ */
19
+ export declare function generateBadgeMarkdown(result: AuditResult): string;
20
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/features/badge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA+BhE;AA+CD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAGjE"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Security Badge Generator - Creates shareable security report cards
3
+ */
4
+ /**
5
+ * Generate security badge
6
+ */
7
+ export function generateBadge(result) {
8
+ const grade = calculateGrade(result);
9
+ const score = calculateScore(result);
10
+ const color = getGradeColor(grade);
11
+ const shield = `https://img.shields.io/badge/security-${grade}-${color}`;
12
+ const markdown = `## 🛡️ Security Report Card
13
+
14
+ ![Security Grade](${shield})
15
+
16
+ **Grade:** ${grade}
17
+ **Score:** ${score}/100
18
+
19
+ ### Summary
20
+ - Total Issues: ${result.summary.total}
21
+ - Critical: ${result.summary.critical}
22
+ - High: ${result.summary.high}
23
+ - Medium: ${result.summary.medium}
24
+
25
+ ---
26
+ Scanned by [FivoSense](https://github.com/fivosense) — Neuro-symbolic AI security scanner
27
+ `;
28
+ return {
29
+ grade,
30
+ score,
31
+ color,
32
+ markdown,
33
+ shield,
34
+ };
35
+ }
36
+ /**
37
+ * Calculate security grade (A+ to F)
38
+ */
39
+ function calculateGrade(result) {
40
+ const { summary } = result;
41
+ if (summary.total === 0)
42
+ return 'A+';
43
+ if (summary.critical === 0 && summary.high === 0)
44
+ return 'A';
45
+ if (summary.critical === 0 && summary.high <= 2)
46
+ return 'B';
47
+ if (summary.critical === 0 && summary.high <= 5)
48
+ return 'C';
49
+ if (summary.critical <= 1)
50
+ return 'D';
51
+ return 'F';
52
+ }
53
+ /**
54
+ * Calculate numeric security score (0-100)
55
+ */
56
+ function calculateScore(result) {
57
+ const { summary } = result;
58
+ // Start at 100, deduct for issues
59
+ let score = 100;
60
+ score -= summary.critical * 20; // -20 per critical
61
+ score -= summary.high * 10; // -10 per high
62
+ score -= summary.medium * 5; // -5 per medium
63
+ return Math.max(0, score);
64
+ }
65
+ /**
66
+ * Get color for grade
67
+ */
68
+ function getGradeColor(grade) {
69
+ const colors = {
70
+ 'A+': 'brightgreen',
71
+ 'A': 'green',
72
+ 'B': 'yellowgreen',
73
+ 'C': 'yellow',
74
+ 'D': 'orange',
75
+ 'F': 'red',
76
+ };
77
+ return colors[grade] || 'lightgrey';
78
+ }
79
+ /**
80
+ * Generate badge markdown for README
81
+ */
82
+ export function generateBadgeMarkdown(result) {
83
+ const badge = generateBadge(result);
84
+ return badge.markdown;
85
+ }
86
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/features/badge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,yCAAyC,KAAK,IAAI,KAAK,EAAE,CAAC;IAEzE,MAAM,QAAQ,GAAG;;oBAEC,MAAM;;aAEb,KAAK;aACL,KAAK;;;kBAGA,MAAM,CAAC,OAAO,CAAC,KAAK;cACxB,MAAM,CAAC,OAAO,CAAC,QAAQ;UAC3B,MAAM,CAAC,OAAO,CAAC,IAAI;YACjB,MAAM,CAAC,OAAO,CAAC,MAAM;;;;CAIhC,CAAC;IAEA,OAAO;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7D,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5D,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5D,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,kCAAkC;IAClC,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAE,mBAAmB;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAM,eAAe;IAChD,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAK,gBAAgB;IAEjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,MAAM,GAA2B;QACrC,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,KAAK;KACX,CAAC;IAEF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Auto-fix Generator - Suggests and applies security fixes
3
+ */
4
+ import { TaintTrace } from '../engine/taint.js';
5
+ export interface SecurityFix {
6
+ original: string;
7
+ fixed: string;
8
+ explanation: string;
9
+ confidence: number;
10
+ type: 'sanitize' | 'parameterize' | 'encode' | 'validate';
11
+ }
12
+ /**
13
+ * Generate fix for a vulnerability
14
+ */
15
+ export declare function generateFix(trace: TaintTrace, code: string): SecurityFix | null;
16
+ /**
17
+ * Apply fix to code
18
+ */
19
+ export declare function applyFix(code: string, fix: SecurityFix, lineNumber: number): string;
20
+ //# sourceMappingURL=fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/features/fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAa/E;AAgGD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQnF"}