@surfinguard/core-engine 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 (64) hide show
  1. package/README.md +65 -0
  2. package/dist/analyzers/base.d.ts +38 -0
  3. package/dist/analyzers/base.d.ts.map +1 -0
  4. package/dist/analyzers/base.js +2 -0
  5. package/dist/analyzers/base.js.map +1 -0
  6. package/dist/analyzers/command.d.ts +44 -0
  7. package/dist/analyzers/command.d.ts.map +1 -0
  8. package/dist/analyzers/command.js +544 -0
  9. package/dist/analyzers/command.js.map +1 -0
  10. package/dist/analyzers/file-read.d.ts +31 -0
  11. package/dist/analyzers/file-read.d.ts.map +1 -0
  12. package/dist/analyzers/file-read.js +159 -0
  13. package/dist/analyzers/file-read.js.map +1 -0
  14. package/dist/analyzers/file-write.d.ts +32 -0
  15. package/dist/analyzers/file-write.d.ts.map +1 -0
  16. package/dist/analyzers/file-write.js +177 -0
  17. package/dist/analyzers/file-write.js.map +1 -0
  18. package/dist/analyzers/index.d.ts +7 -0
  19. package/dist/analyzers/index.d.ts.map +1 -0
  20. package/dist/analyzers/index.js +6 -0
  21. package/dist/analyzers/index.js.map +1 -0
  22. package/dist/analyzers/text.d.ts +30 -0
  23. package/dist/analyzers/text.d.ts.map +1 -0
  24. package/dist/analyzers/text.js +139 -0
  25. package/dist/analyzers/text.js.map +1 -0
  26. package/dist/analyzers/url.d.ts +33 -0
  27. package/dist/analyzers/url.d.ts.map +1 -0
  28. package/dist/analyzers/url.js +325 -0
  29. package/dist/analyzers/url.js.map +1 -0
  30. package/dist/classifier.d.ts +7 -0
  31. package/dist/classifier.d.ts.map +1 -0
  32. package/dist/classifier.js +12 -0
  33. package/dist/classifier.js.map +1 -0
  34. package/dist/context.d.ts +10 -0
  35. package/dist/context.d.ts.map +1 -0
  36. package/dist/context.js +9 -0
  37. package/dist/context.js.map +1 -0
  38. package/dist/engine.d.ts +49 -0
  39. package/dist/engine.d.ts.map +1 -0
  40. package/dist/engine.js +122 -0
  41. package/dist/engine.js.map +1 -0
  42. package/dist/index.d.ts +12 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +10 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/patterns.d.ts +8 -0
  47. package/dist/patterns.d.ts.map +1 -0
  48. package/dist/patterns.js +66 -0
  49. package/dist/patterns.js.map +1 -0
  50. package/dist/scorer.d.ts +23 -0
  51. package/dist/scorer.d.ts.map +1 -0
  52. package/dist/scorer.js +52 -0
  53. package/dist/scorer.js.map +1 -0
  54. package/dist/verdict.d.ts +7 -0
  55. package/dist/verdict.d.ts.map +1 -0
  56. package/dist/verdict.js +41 -0
  57. package/dist/verdict.js.map +1 -0
  58. package/package.json +44 -0
  59. package/patterns/brands.json +205 -0
  60. package/patterns/commands.json +44 -0
  61. package/patterns/file-read.json +85 -0
  62. package/patterns/file-write.json +100 -0
  63. package/patterns/text.json +190 -0
  64. package/patterns/urls.json +412 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/analyzers/url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAc,MAAM,oBAAoB,CAAC;AAC/F,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAK3E;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,QAAQ;IAC1C,QAAQ,CAAC,UAAU,EAAG,KAAK,CAAU;IAErC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,oBAAoB;IAchF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;IAgNtC,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,uBAAuB;IA8B/B,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,eAAe;CAgBxB"}
@@ -0,0 +1,325 @@
1
+ const IPV4_REGEX = /^\d{1,3}(\.\d{1,3}){3}$/;
2
+ const DOUBLE_EXT_REGEX = /\.[a-z]{2,4}\.[a-z]{2,4}$/i;
3
+ /**
4
+ * URL Analyzer — heuristic URL threat detection.
5
+ *
6
+ * Ported from Surfinguard Android RiskEngine.kt with additions
7
+ * for RFC 1918 / cloud metadata detection (ESCALATION primitive).
8
+ */
9
+ export class UrlAnalyzer {
10
+ actionType = 'url';
11
+ trackerDomains;
12
+ adClickParams;
13
+ shorteners;
14
+ freeHostingPlatforms;
15
+ riskyTlds;
16
+ redirectParamKeys;
17
+ highRiskKeywords;
18
+ suspiciousExtensions;
19
+ internalIpRanges;
20
+ cloudMetadataEndpoints;
21
+ brands;
22
+ constructor(urlPatterns, brandPatterns) {
23
+ this.trackerDomains = new Set(urlPatterns.trackerDomains);
24
+ this.adClickParams = new Set(urlPatterns.adClickParams);
25
+ this.shorteners = new Set(urlPatterns.shorteners);
26
+ this.freeHostingPlatforms = new Set(urlPatterns.freeHostingPlatforms);
27
+ this.riskyTlds = new Set(urlPatterns.riskyTlds);
28
+ this.redirectParamKeys = new Set(urlPatterns.redirectParamKeys);
29
+ this.highRiskKeywords = urlPatterns.highRiskKeywords;
30
+ this.suspiciousExtensions = urlPatterns.suspiciousExtensions;
31
+ this.internalIpRanges = urlPatterns.internalIpRanges;
32
+ this.cloudMetadataEndpoints = new Set(urlPatterns.cloudMetadataEndpoints);
33
+ this.brands = brandPatterns.brands;
34
+ }
35
+ analyze(value) {
36
+ const trimmedUrl = value.trim();
37
+ const findings = [];
38
+ const add = (primitive, score, reason, threatId) => {
39
+ findings.push({ primitive, score, reason, threatId });
40
+ };
41
+ // ── Special URIs ──────────────────────────────────────────────────
42
+ const lower = trimmedUrl.toLowerCase();
43
+ if (lower.startsWith('data:')) {
44
+ add('MANIPULATION', 10, 'Data URI can hide malicious content', 'U01');
45
+ return { actionType: 'url', findings };
46
+ }
47
+ if (lower.startsWith('javascript:')) {
48
+ add('MANIPULATION', 10, 'JavaScript URI detected', 'U02');
49
+ return { actionType: 'url', findings };
50
+ }
51
+ // ── URL Parsing ───────────────────────────────────────────────────
52
+ let parsed;
53
+ try {
54
+ parsed = new URL(trimmedUrl);
55
+ }
56
+ catch {
57
+ add('MANIPULATION', 10, 'Malformed or invalid URL', 'U03');
58
+ return { actionType: 'url', findings };
59
+ }
60
+ const host = parsed.hostname.toLowerCase().replace(/^www\./, '');
61
+ if (!host) {
62
+ add('MANIPULATION', 10, 'Malformed or invalid URL', 'U03');
63
+ return { actionType: 'url', findings };
64
+ }
65
+ // ── Known tracker bypass ──────────────────────────────────────────
66
+ if (this.isKnownTracker(host)) {
67
+ return {
68
+ actionType: 'url',
69
+ findings: [],
70
+ shortCircuit: { safe: true, reason: 'Known ad/analytics service' },
71
+ };
72
+ }
73
+ // ── HIGH SEVERITY (5-8 pts) ───────────────────────────────────────
74
+ // @ symbol in URL (credential theft / URL obfuscation)
75
+ if (trimmedUrl.includes('@') && trimmedUrl.substring(0, trimmedUrl.indexOf('@')).includes('://')) {
76
+ add('MANIPULATION', 6, "URL uses '@' to disguise real destination", 'U05');
77
+ }
78
+ // IP address instead of domain
79
+ if (IPV4_REGEX.test(host)) {
80
+ // Check cloud metadata endpoints first
81
+ if (this.cloudMetadataEndpoints.has(host)) {
82
+ add('ESCALATION', 9, `Targets cloud metadata endpoint (${host})`, 'U14');
83
+ }
84
+ // Check internal/RFC1918 ranges
85
+ else if (this.isInternalIp(host)) {
86
+ add('ESCALATION', 7, 'Targets internal network address', 'U13');
87
+ }
88
+ // Public IP
89
+ else {
90
+ add('MANIPULATION', 7, 'Uses IP address instead of domain name', 'U04');
91
+ }
92
+ }
93
+ // IPv6 address
94
+ if (host.startsWith('[') && host.endsWith(']')) {
95
+ add('MANIPULATION', 7, 'Uses IPv6 address instead of domain name', 'U04');
96
+ }
97
+ // Punycode (internationalized domain - potential homograph)
98
+ if (host.startsWith('xn--') || host.includes('.xn--')) {
99
+ add('MANIPULATION', 5, 'Internationalized domain (punycode) may hide lookalike characters', 'U06');
100
+ }
101
+ // Brand impersonation check
102
+ const brandCheck = this.checkBrandImpersonation(host);
103
+ if (brandCheck) {
104
+ add('MANIPULATION', brandCheck.score, brandCheck.reason, 'U07');
105
+ }
106
+ // ── MEDIUM SEVERITY (2-4 pts) ─────────────────────────────────────
107
+ // URL shortener
108
+ if (this.isShortener(host)) {
109
+ add('MANIPULATION', 3, 'Link shortener hides actual destination', 'U08');
110
+ }
111
+ // Free hosting platform check
112
+ const hostingMatch = this.findHostingPlatform(host);
113
+ if (hostingMatch) {
114
+ const subdomain = host.slice(0, -(hostingMatch.length + 1)); // remove ".platform"
115
+ const looksLikeBrand = this.subdomainLooksLikeBrand(subdomain);
116
+ if (looksLikeBrand) {
117
+ add('MANIPULATION', 7, `Suspicious site on free hosting (${hostingMatch}) impersonating a brand`, 'U09');
118
+ }
119
+ else {
120
+ add('MANIPULATION', 4, `Site hosted on free platform (${hostingMatch}) commonly used for scams`, 'U09');
121
+ }
122
+ }
123
+ // Deep subdomain structure
124
+ const subdomainCount = host.split('.').length;
125
+ if (subdomainCount >= 5) {
126
+ add('MANIPULATION', 3, `Unusually deep subdomain structure (${subdomainCount} levels)`);
127
+ }
128
+ else if (subdomainCount === 4) {
129
+ add('MANIPULATION', 1, 'Multiple subdomains detected');
130
+ }
131
+ // High-risk TLD
132
+ const tld = host.split('.').pop();
133
+ if (this.riskyTlds.has(tld)) {
134
+ add('MANIPULATION', 3, `Uses high-risk TLD (.${tld}) commonly associated with scams`, 'U10');
135
+ }
136
+ // Heavy URL encoding
137
+ const percentCount = countChar(trimmedUrl, '%');
138
+ if (percentCount >= 12) {
139
+ add('MANIPULATION', 3, 'Heavily obfuscated URL encoding');
140
+ }
141
+ else if (percentCount >= 8) {
142
+ add('MANIPULATION', 2, 'Suspicious URL encoding');
143
+ }
144
+ // Very long URL
145
+ if (trimmedUrl.length >= 300) {
146
+ add('MANIPULATION', 3, `Extremely long URL (${trimmedUrl.length} chars)`);
147
+ }
148
+ else if (trimmedUrl.length >= 200) {
149
+ add('MANIPULATION', 2, 'Very long URL');
150
+ }
151
+ else if (trimmedUrl.length >= 150) {
152
+ add('MANIPULATION', 1, 'Long URL');
153
+ }
154
+ // Nested redirects
155
+ const { count: nestedCount, finalHost: finalDest } = this.analyzeRedirects(parsed, host);
156
+ if (nestedCount >= 3) {
157
+ add('MANIPULATION', 4, `Multiple nested redirects detected (${nestedCount} levels)`, 'U11');
158
+ }
159
+ else if (nestedCount >= 1) {
160
+ add('MANIPULATION', 2, 'Contains redirect to another URL', 'U11');
161
+ if (finalDest && finalDest !== host) {
162
+ add('MANIPULATION', 1, `Redirects to different domain: ${finalDest}`);
163
+ }
164
+ }
165
+ // ── LOW SEVERITY (1-2 pts) ────────────────────────────────────────
166
+ // Sensitive keywords in path/query/host
167
+ const haystack = `${parsed.pathname} ${parsed.search} ${host}`.toLowerCase();
168
+ const keywordHits = this.highRiskKeywords.filter((kw) => haystack.includes(kw)).length;
169
+ if (keywordHits >= 4) {
170
+ add('MANIPULATION', 4, 'Multiple sensitive keywords found (login, password, verify, etc.)');
171
+ }
172
+ else if (keywordHits >= 2) {
173
+ add('MANIPULATION', 2, 'Contains sensitive keywords (potential phishing)');
174
+ }
175
+ else if (keywordHits === 1) {
176
+ add('MANIPULATION', 1, 'Contains a sensitive keyword');
177
+ }
178
+ // Domain with many hyphens
179
+ const hyphenCount = countChar(host, '-');
180
+ if (hyphenCount >= 5) {
181
+ add('MANIPULATION', 2, 'Domain contains excessive hyphens');
182
+ }
183
+ else if (hyphenCount >= 3) {
184
+ add('MANIPULATION', 1, 'Domain contains multiple hyphens');
185
+ }
186
+ // Domain with many digits
187
+ const digitCount = host.split('').filter((c) => c >= '0' && c <= '9').length;
188
+ if (digitCount >= 8) {
189
+ add('MANIPULATION', 2, 'Domain contains many digits');
190
+ }
191
+ else if (digitCount >= 5) {
192
+ add('MANIPULATION', 1, 'Domain contains several digits');
193
+ }
194
+ // Mixed protocols in URL
195
+ if ((lower.startsWith('http://') && lower.includes('https://')) ||
196
+ (lower.startsWith('https://') && lower.substring(8).includes('http://'))) {
197
+ add('MANIPULATION', 1, 'URL contains mixed HTTP/HTTPS protocols');
198
+ }
199
+ // Suspicious file extensions
200
+ if (this.suspiciousExtensions.some((ext) => lower.includes(ext))) {
201
+ add('DESTRUCTION', 3, 'URL references potentially dangerous file type', 'U12');
202
+ }
203
+ // Double file extensions
204
+ if (DOUBLE_EXT_REGEX.test(trimmedUrl)) {
205
+ add('DESTRUCTION', 2, 'Double file extension detected (common malware trick)', 'U12');
206
+ }
207
+ // ── AD CLICK PARAMETER ADJUSTMENT ─────────────────────────────────
208
+ const hasAdClickParams = [...parsed.searchParams.keys()].some((key) => this.adClickParams.has(key.toLowerCase()));
209
+ if (hasAdClickParams && findings.length > 0) {
210
+ // Apply a -3 adjustment as a negative-score finding
211
+ add('MANIPULATION', -3, 'Ad click detected — reduced risk (paid ad destination)');
212
+ }
213
+ return { actionType: 'url', findings };
214
+ }
215
+ // ── Helpers ───────────────────────────────────────────────────────────
216
+ isKnownTracker(host) {
217
+ if (this.trackerDomains.has(host))
218
+ return true;
219
+ const parts = host.split('.');
220
+ for (let i = 1; i < parts.length - 1; i++) {
221
+ if (this.trackerDomains.has(parts.slice(i).join('.')))
222
+ return true;
223
+ }
224
+ return false;
225
+ }
226
+ isInternalIp(ip) {
227
+ return this.internalIpRanges.some((prefix) => ip.startsWith(prefix));
228
+ }
229
+ isShortener(host) {
230
+ if (this.shorteners.has(host))
231
+ return true;
232
+ for (const shortener of this.shorteners) {
233
+ if (host.endsWith(`.${shortener}`))
234
+ return true;
235
+ }
236
+ return false;
237
+ }
238
+ findHostingPlatform(host) {
239
+ for (const platform of this.freeHostingPlatforms) {
240
+ if (host.endsWith(`.${platform}`) || host === platform) {
241
+ return platform;
242
+ }
243
+ }
244
+ return null;
245
+ }
246
+ subdomainLooksLikeBrand(subdomain) {
247
+ if (!subdomain)
248
+ return false;
249
+ const lower = subdomain.toLowerCase();
250
+ // Check against brand names
251
+ if (this.brands.some((b) => lower.includes(b.brand)))
252
+ return true;
253
+ // Check suspicious keywords in subdomain
254
+ const suspiciousWords = ['bank', 'pay', 'gov', 'secure', 'login', 'verify'];
255
+ return suspiciousWords.some((w) => lower.includes(w));
256
+ }
257
+ checkBrandImpersonation(host) {
258
+ const normalizedHost = host.toLowerCase();
259
+ for (const brand of this.brands) {
260
+ // First check if this is a legitimate domain for this brand
261
+ const isLegit = brand.legitimateDomains.some((legit) => normalizedHost === legit || normalizedHost.endsWith(`.${legit}`));
262
+ if (isLegit)
263
+ continue;
264
+ // Check for obvious typosquatting variants
265
+ if (brand.variants.some((v) => normalizedHost.includes(v))) {
266
+ return { score: 7, reason: `Possible impersonation of ${brand.brand} (suspicious spelling)` };
267
+ }
268
+ // Check if brand name appears on non-official domain
269
+ if (normalizedHost.includes(brand.brand)) {
270
+ if (!normalizedHost.endsWith(`.${brand.brand}.com`) &&
271
+ !normalizedHost.endsWith(`.${brand.brand}.net`) &&
272
+ !normalizedHost.endsWith(`.${brand.brand}.org`)) {
273
+ return { score: 5, reason: `Brand name '${brand.brand}' used on non-official domain` };
274
+ }
275
+ }
276
+ }
277
+ return null;
278
+ }
279
+ analyzeRedirects(url, _originalHost) {
280
+ let count = 0;
281
+ let currentParams = url.searchParams;
282
+ let lastHost = null;
283
+ for (let i = 0; i < 5; i++) {
284
+ const nestedUrl = this.findRedirectUrl(currentParams);
285
+ if (!nestedUrl)
286
+ break;
287
+ count++;
288
+ try {
289
+ const nestedParsed = new URL(nestedUrl);
290
+ lastHost = nestedParsed.hostname.toLowerCase().replace(/^www\./, '');
291
+ currentParams = nestedParsed.searchParams;
292
+ }
293
+ catch {
294
+ break;
295
+ }
296
+ }
297
+ return { count, finalHost: lastHost };
298
+ }
299
+ findRedirectUrl(params) {
300
+ for (const [key, value] of params) {
301
+ if (this.redirectParamKeys.has(key.toLowerCase())) {
302
+ let decoded;
303
+ try {
304
+ decoded = decodeURIComponent(value);
305
+ }
306
+ catch {
307
+ decoded = value;
308
+ }
309
+ if (decoded.startsWith('http://') || decoded.startsWith('https://')) {
310
+ return decoded;
311
+ }
312
+ }
313
+ }
314
+ return null;
315
+ }
316
+ }
317
+ function countChar(str, char) {
318
+ let count = 0;
319
+ for (let i = 0; i < str.length; i++) {
320
+ if (str[i] === char)
321
+ count++;
322
+ }
323
+ return count;
324
+ }
325
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/analyzers/url.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACb,UAAU,GAAG,KAAc,CAAC;IAEpB,cAAc,CAAc;IAC5B,aAAa,CAAc;IAC3B,UAAU,CAAc;IACxB,oBAAoB,CAAc;IAClC,SAAS,CAAc;IACvB,iBAAiB,CAAc;IAC/B,gBAAgB,CAAW;IAC3B,oBAAoB,CAAW;IAC/B,gBAAgB,CAAW;IAC3B,sBAAsB,CAAc;IACpC,MAAM,CAAe;IAEtC,YAAY,WAA+B,EAAE,aAAmC;QAC9E,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,CAAC;QACrD,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC,oBAAoB,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,CAAC;QACrD,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,MAAM,GAAG,GAAG,CAAC,SAAuC,EAAE,KAAa,EAAE,MAAc,EAAE,QAAiB,EAAE,EAAE;YACxG,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC;QAEF,qEAAqE;QACrE,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,cAAc,EAAE,EAAE,EAAE,qCAAqC,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,cAAc,EAAE,EAAE,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,qEAAqE;QACrE,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,cAAc,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,cAAc,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,qEAAqE;QACrE,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE;aACnE,CAAC;QACJ,CAAC;QAED,qEAAqE;QAErE,uDAAuD;QACvD,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjG,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,2CAA2C,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;QAED,+BAA+B;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,uCAAuC;YACvC,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,oCAAoC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC;YACD,gCAAgC;iBAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,kCAAkC,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YACD,YAAY;iBACP,CAAC;gBACJ,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;QAED,4DAA4D;QAC5D,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,mEAAmE,EAAE,KAAK,CAAC,CAAC;QACrG,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;QAED,qEAAqE;QAErE,gBAAgB;QAChB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,yCAAyC,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;YAClF,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAE/D,IAAI,cAAc,EAAE,CAAC;gBACnB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,oCAAoC,YAAY,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC3G,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,iCAAiC,YAAY,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAC1G,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAC9C,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,uCAAuC,cAAc,UAAU,CAAC,CAAC;QAC1F,CAAC;aAAM,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;QACzD,CAAC;QAED,gBAAgB;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;QACnC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,wBAAwB,GAAG,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC/F,CAAC;QAED,qBAAqB;QACrB,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACpD,CAAC;QAED,gBAAgB;QAChB,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC7B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,uBAAuB,UAAU,CAAC,MAAM,SAAS,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC;QAED,mBAAmB;QACnB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzF,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,uCAAuC,WAAW,UAAU,EAAE,KAAK,CAAC,CAAC;QAC9F,CAAC;aAAM,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,kCAAkC,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACpC,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,kCAAkC,SAAS,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,qEAAqE;QAErE,wCAAwC;QACxC,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACvF,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,mEAAmE,CAAC,CAAC;QAC9F,CAAC;aAAM,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;QACzD,CAAC;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;QAC7D,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7E,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,6BAA6B,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAC3D,CAAC;QAED,yBAAyB;QACzB,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC3D,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EACxE,CAAC;YACD,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;QACpE,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,gDAAgD,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;QAED,yBAAyB;QACzB,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,uDAAuD,EAAE,KAAK,CAAC,CAAC;QACxF,CAAC;QAED,qEAAqE;QACrE,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACpE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAC1C,CAAC;QACF,IAAI,gBAAgB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,oDAAoD;YACpD,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,wDAAwD,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,yEAAyE;IAEjE,cAAc,CAAC,IAAY;QACjC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,YAAY,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,mBAAmB,CAAC,IAAY;QACtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,uBAAuB,CAAC,SAAiB;QAC/C,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAEtC,4BAA4B;QAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElE,yCAAyC;QACzC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5E,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,4DAA4D;YAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,KAAK,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,CAC5E,CAAC;YACF,IAAI,OAAO;gBAAE,SAAS;YAEtB,2CAA2C;YAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,6BAA6B,KAAK,CAAC,KAAK,wBAAwB,EAAE,CAAC;YAChG,CAAC;YAED,qDAAqD;YACrD,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzC,IACE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,MAAM,CAAC;oBAC/C,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,MAAM,CAAC;oBAC/C,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,MAAM,CAAC,EAC/C,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,KAAK,CAAC,KAAK,+BAA+B,EAAE,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CACtB,GAAQ,EACR,aAAqB;QAErB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC;QACrC,IAAI,QAAQ,GAAkB,IAAI,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS;gBAAE,MAAM;YAEtB,KAAK,EAAE,CAAC;YACR,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrE,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACxC,CAAC;IAEO,eAAe,CAAC,MAAuB;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAClD,IAAI,OAAe,CAAC;gBACpB,IAAI,CAAC;oBACH,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;gBACD,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpE,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,IAAY;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ActionType } from '@surfinguard/types';
2
+ /**
3
+ * Classifies an action input to determine which analyzer to use.
4
+ * Returns the action type if an analyzer exists, otherwise null.
5
+ */
6
+ export declare function classifyAction(type: ActionType): ActionType | null;
7
+ //# sourceMappingURL=classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAGlE"}
@@ -0,0 +1,12 @@
1
+ /** Action types with implemented analyzers. */
2
+ const SUPPORTED_TYPES = new Set(['url', 'command', 'text', 'file_read', 'file_write']);
3
+ /**
4
+ * Classifies an action input to determine which analyzer to use.
5
+ * Returns the action type if an analyzer exists, otherwise null.
6
+ */
7
+ export function classifyAction(type) {
8
+ if (SUPPORTED_TYPES.has(type))
9
+ return type;
10
+ return null;
11
+ }
12
+ //# sourceMappingURL=classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,MAAM,eAAe,GAAoB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;AAExG;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ActionContext } from '@surfinguard/types';
2
+ /**
3
+ * Context engine stub for M0.
4
+ * Future milestones will use session history, agent trust, and behavioral patterns
5
+ * to adjust risk scores contextually.
6
+ */
7
+ export declare function applyContext(_context?: ActionContext): {
8
+ multiplier: number;
9
+ };
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAE7E"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Context engine stub for M0.
3
+ * Future milestones will use session history, agent trust, and behavioral patterns
4
+ * to adjust risk scores contextually.
5
+ */
6
+ export function applyContext(_context) {
7
+ return { multiplier: 1.0 };
8
+ }
9
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { ActionInput, ActionContext, CheckResult } from '@surfinguard/types';
2
+ export interface CoreEngineOptions {
3
+ /** Custom URL patterns (overrides default) */
4
+ urlPatternsPath?: string;
5
+ }
6
+ /**
7
+ * Main entry point for the Surfinguard AI Security SDK.
8
+ *
9
+ * Usage:
10
+ * ```ts
11
+ * const engine = new CoreEngine();
12
+ * const result = engine.check({ type: 'url', value: 'https://example.com' });
13
+ * if (!result.allow) { // block the action }
14
+ * ```
15
+ */
16
+ export declare class CoreEngine {
17
+ static readonly VERSION = "0.3.0";
18
+ private readonly urlAnalyzer;
19
+ private readonly commandAnalyzer;
20
+ private readonly textAnalyzer;
21
+ private readonly fileReadAnalyzer;
22
+ private readonly fileWriteAnalyzer;
23
+ constructor();
24
+ /**
25
+ * Analyze a single action and return a verdict.
26
+ */
27
+ check(input: ActionInput, _context?: ActionContext): CheckResult;
28
+ /**
29
+ * Convenience method: analyze a URL string directly.
30
+ */
31
+ checkUrl(url: string): CheckResult;
32
+ /**
33
+ * Convenience method: analyze a shell command string directly.
34
+ */
35
+ checkCommand(command: string): CheckResult;
36
+ /**
37
+ * Convenience method: analyze text for prompt injection.
38
+ */
39
+ checkText(text: string): CheckResult;
40
+ /**
41
+ * Convenience method: analyze a file read operation.
42
+ */
43
+ checkFileRead(path: string): CheckResult;
44
+ /**
45
+ * Convenience method: analyze a file write operation with optional content.
46
+ */
47
+ checkFileWrite(path: string, content?: string): CheckResult;
48
+ }
49
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUlF,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAElC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;;IAoBtD;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW;IAoDhE;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAIlC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAI1C;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIpC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIxC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;CAG5D"}
package/dist/engine.js ADDED
@@ -0,0 +1,122 @@
1
+ import { UrlAnalyzer } from './analyzers/url.js';
2
+ import { CommandAnalyzer } from './analyzers/command.js';
3
+ import { TextAnalyzer } from './analyzers/text.js';
4
+ import { FileReadAnalyzer } from './analyzers/file-read.js';
5
+ import { FileWriteAnalyzer } from './analyzers/file-write.js';
6
+ import { classifyAction } from './classifier.js';
7
+ import { buildVerdict } from './verdict.js';
8
+ import { loadUrlPatterns, loadBrandPatterns, loadCommandPatterns, loadTextPatterns, loadFileReadPatterns, loadFileWritePatterns } from './patterns.js';
9
+ /**
10
+ * Main entry point for the Surfinguard AI Security SDK.
11
+ *
12
+ * Usage:
13
+ * ```ts
14
+ * const engine = new CoreEngine();
15
+ * const result = engine.check({ type: 'url', value: 'https://example.com' });
16
+ * if (!result.allow) { // block the action }
17
+ * ```
18
+ */
19
+ export class CoreEngine {
20
+ static VERSION = '0.3.0';
21
+ urlAnalyzer;
22
+ commandAnalyzer;
23
+ textAnalyzer;
24
+ fileReadAnalyzer;
25
+ fileWriteAnalyzer;
26
+ constructor() {
27
+ const urlPatterns = loadUrlPatterns();
28
+ const brandPatterns = loadBrandPatterns();
29
+ this.urlAnalyzer = new UrlAnalyzer(urlPatterns, brandPatterns);
30
+ const commandPatterns = loadCommandPatterns();
31
+ this.commandAnalyzer = new CommandAnalyzer(commandPatterns);
32
+ const textPatterns = loadTextPatterns();
33
+ this.textAnalyzer = new TextAnalyzer(textPatterns);
34
+ const fileReadPatterns = loadFileReadPatterns();
35
+ this.fileReadAnalyzer = new FileReadAnalyzer(fileReadPatterns);
36
+ const fileWritePatterns = loadFileWritePatterns();
37
+ this.fileWriteAnalyzer = new FileWriteAnalyzer(fileWritePatterns);
38
+ }
39
+ /**
40
+ * Analyze a single action and return a verdict.
41
+ */
42
+ check(input, _context) {
43
+ const startTime = performance.now();
44
+ const classified = classifyAction(input.type);
45
+ if (!classified) {
46
+ return {
47
+ allow: true,
48
+ score: 0,
49
+ level: 'SAFE',
50
+ primitive: null,
51
+ primitiveScores: [],
52
+ reasons: [`Action type '${input.type}' not yet supported`],
53
+ latencyMs: Math.round((performance.now() - startTime) * 100) / 100,
54
+ };
55
+ }
56
+ switch (classified) {
57
+ case 'url': {
58
+ const result = this.urlAnalyzer.analyze(input.value);
59
+ return buildVerdict(result, startTime);
60
+ }
61
+ case 'command': {
62
+ const result = this.commandAnalyzer.analyze(input.value);
63
+ return buildVerdict(result, startTime);
64
+ }
65
+ case 'text': {
66
+ const result = this.textAnalyzer.analyze(input.value);
67
+ return buildVerdict(result, startTime);
68
+ }
69
+ case 'file_read': {
70
+ const result = this.fileReadAnalyzer.analyze(input.value);
71
+ return buildVerdict(result, startTime);
72
+ }
73
+ case 'file_write': {
74
+ const content = input.metadata?.content;
75
+ const result = this.fileWriteAnalyzer.analyzeWithContent(input.value, content);
76
+ return buildVerdict(result, startTime);
77
+ }
78
+ default: {
79
+ return {
80
+ allow: true,
81
+ score: 0,
82
+ level: 'SAFE',
83
+ primitive: null,
84
+ primitiveScores: [],
85
+ reasons: [`Action type '${classified}' not yet implemented`],
86
+ latencyMs: Math.round((performance.now() - startTime) * 100) / 100,
87
+ };
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Convenience method: analyze a URL string directly.
93
+ */
94
+ checkUrl(url) {
95
+ return this.check({ type: 'url', value: url });
96
+ }
97
+ /**
98
+ * Convenience method: analyze a shell command string directly.
99
+ */
100
+ checkCommand(command) {
101
+ return this.check({ type: 'command', value: command });
102
+ }
103
+ /**
104
+ * Convenience method: analyze text for prompt injection.
105
+ */
106
+ checkText(text) {
107
+ return this.check({ type: 'text', value: text });
108
+ }
109
+ /**
110
+ * Convenience method: analyze a file read operation.
111
+ */
112
+ checkFileRead(path) {
113
+ return this.check({ type: 'file_read', value: path });
114
+ }
115
+ /**
116
+ * Convenience method: analyze a file write operation with optional content.
117
+ */
118
+ checkFileWrite(path, content) {
119
+ return this.check({ type: 'file_write', value: path, metadata: content ? { content } : undefined });
120
+ }
121
+ }
122
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { CoreEngine } from './engine.js';
2
+ export { UrlAnalyzer } from './analyzers/url.js';
3
+ export { CommandAnalyzer } from './analyzers/command.js';
4
+ export { TextAnalyzer } from './analyzers/text.js';
5
+ export { FileReadAnalyzer } from './analyzers/file-read.js';
6
+ export { FileWriteAnalyzer } from './analyzers/file-write.js';
7
+ export { scorePrimitives, scoreComposite } from './scorer.js';
8
+ export { buildVerdict } from './verdict.js';
9
+ export { loadUrlPatterns, loadBrandPatterns, loadCommandPatterns, loadTextPatterns, loadFileReadPatterns, loadFileWritePatterns } from './patterns.js';
10
+ export type { Analyzer, AnalyzerFinding, AnalyzerResult } from './analyzers/base.js';
11
+ export type { CompositeResult } from './scorer.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACvJ,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { CoreEngine } from './engine.js';
2
+ export { UrlAnalyzer } from './analyzers/url.js';
3
+ export { CommandAnalyzer } from './analyzers/command.js';
4
+ export { TextAnalyzer } from './analyzers/text.js';
5
+ export { FileReadAnalyzer } from './analyzers/file-read.js';
6
+ export { FileWriteAnalyzer } from './analyzers/file-write.js';
7
+ export { scorePrimitives, scoreComposite } from './scorer.js';
8
+ export { buildVerdict } from './verdict.js';
9
+ export { loadUrlPatterns, loadBrandPatterns, loadCommandPatterns, loadTextPatterns, loadFileReadPatterns, loadFileWritePatterns } from './patterns.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { UrlPatternDatabase, BrandPatternDatabase, CommandPatternDatabase, TextPatternDatabase, FileReadPatternDatabase, FileWritePatternDatabase } from '@surfinguard/types';
2
+ export declare function loadUrlPatterns(): UrlPatternDatabase;
3
+ export declare function loadBrandPatterns(): BrandPatternDatabase;
4
+ export declare function loadCommandPatterns(): CommandPatternDatabase;
5
+ export declare function loadTextPatterns(): TextPatternDatabase;
6
+ export declare function loadFileReadPatterns(): FileReadPatternDatabase;
7
+ export declare function loadFileWritePatterns(): FileWritePatternDatabase;
8
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAmBnL,wBAAgB,eAAe,IAAI,kBAAkB,CAMpD;AAED,wBAAgB,iBAAiB,IAAI,oBAAoB,CAMxD;AAED,wBAAgB,mBAAmB,IAAI,sBAAsB,CAM5D;AAED,wBAAgB,gBAAgB,IAAI,mBAAmB,CAMtD;AAED,wBAAgB,oBAAoB,IAAI,uBAAuB,CAM9D;AAED,wBAAgB,qBAAqB,IAAI,wBAAwB,CAMhE"}