@framers/agentos-ext-web-search 1.1.0 → 1.2.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.
- package/README.md +31 -188
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -50
- package/dist/index.js.map +1 -1
- package/dist/services/searchProvider.d.ts +89 -3
- package/dist/services/searchProvider.d.ts.map +1 -1
- package/dist/services/searchProvider.js +342 -26
- package/dist/services/searchProvider.js.map +1 -1
- package/dist/tools/factCheck.d.ts +46 -88
- package/dist/tools/factCheck.d.ts.map +1 -1
- package/dist/tools/factCheck.js +141 -170
- package/dist/tools/factCheck.js.map +1 -1
- package/dist/tools/researchAggregator.d.ts +37 -91
- package/dist/tools/researchAggregator.d.ts.map +1 -1
- package/dist/tools/researchAggregator.js +141 -175
- package/dist/tools/researchAggregator.js.map +1 -1
- package/dist/tools/webSearch.d.ts +31 -59
- package/dist/tools/webSearch.d.ts.map +1 -1
- package/dist/tools/webSearch.js +76 -87
- package/dist/tools/webSearch.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/manifest.json +14 -9
- package/package.json +26 -16
- package/.eslintrc.json +0 -21
- package/CHANGELOG.md +0 -16
- package/src/index.ts +0 -123
- package/src/services/searchProvider.ts +0 -416
- package/src/tools/factCheck.ts +0 -318
- package/src/tools/researchAggregator.ts +0 -297
- package/src/tools/webSearch.ts +0 -128
- package/src/types.ts +0 -41
- package/test/integration.spec.ts +0 -173
- package/test/searchProvider.spec.ts +0 -153
- package/test/webSearch.spec.ts +0 -128
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -32
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SearchProviderService = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Service for managing multiple search providers with fallback support
|
|
6
3
|
*
|
|
@@ -16,7 +13,7 @@ exports.SearchProviderService = void 0;
|
|
|
16
13
|
* const results = await service.search('query');
|
|
17
14
|
* ```
|
|
18
15
|
*/
|
|
19
|
-
class SearchProviderService {
|
|
16
|
+
export class SearchProviderService {
|
|
20
17
|
config;
|
|
21
18
|
rateLimitState;
|
|
22
19
|
/**
|
|
@@ -26,12 +23,17 @@ class SearchProviderService {
|
|
|
26
23
|
*/
|
|
27
24
|
constructor(config) {
|
|
28
25
|
this.config = {
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
serperApiKey: config.serperApiKey,
|
|
27
|
+
serpApiKey: config.serpApiKey,
|
|
28
|
+
braveApiKey: config.braveApiKey,
|
|
29
|
+
searxngUrl: config.searxngUrl,
|
|
30
|
+
tavilyApiKey: config.tavilyApiKey,
|
|
31
|
+
firecrawlApiKey: config.firecrawlApiKey,
|
|
32
|
+
maxRetries: config.maxRetries ?? 3,
|
|
33
|
+
rateLimit: config.rateLimit ?? {
|
|
31
34
|
maxRequests: 10,
|
|
32
|
-
windowMs: 60000
|
|
35
|
+
windowMs: 60000,
|
|
33
36
|
},
|
|
34
|
-
...config
|
|
35
37
|
};
|
|
36
38
|
this.rateLimitState = new Map();
|
|
37
39
|
}
|
|
@@ -51,14 +53,14 @@ class SearchProviderService {
|
|
|
51
53
|
const maxResults = options.maxResults || 10;
|
|
52
54
|
// If specific provider requested, try only that one
|
|
53
55
|
if (options.provider) {
|
|
54
|
-
return this.searchWithProvider(query, options.provider, maxResults, startTime);
|
|
56
|
+
return this.searchWithProvider(query, options.provider, maxResults, startTime, options.category);
|
|
55
57
|
}
|
|
56
58
|
// Try providers in order of preference
|
|
57
59
|
const providers = this.getAvailableProviders();
|
|
58
60
|
for (const provider of providers) {
|
|
59
61
|
try {
|
|
60
62
|
if (await this.checkRateLimit(provider)) {
|
|
61
|
-
return await this.searchWithProvider(query, provider, maxResults, startTime);
|
|
63
|
+
return await this.searchWithProvider(query, provider, maxResults, startTime, options.category);
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
66
|
catch (error) {
|
|
@@ -79,7 +81,7 @@ class SearchProviderService {
|
|
|
79
81
|
* @param {number} startTime - Request start timestamp
|
|
80
82
|
* @returns {Promise<ProviderResponse>} Search results
|
|
81
83
|
*/
|
|
82
|
-
async searchWithProvider(query, provider, maxResults, startTime) {
|
|
84
|
+
async searchWithProvider(query, provider, maxResults, startTime, category) {
|
|
83
85
|
let results;
|
|
84
86
|
switch (provider) {
|
|
85
87
|
case 'serper':
|
|
@@ -91,6 +93,15 @@ class SearchProviderService {
|
|
|
91
93
|
case 'brave':
|
|
92
94
|
results = await this.searchBrave(query, maxResults);
|
|
93
95
|
break;
|
|
96
|
+
case 'tavily':
|
|
97
|
+
results = await this.searchTavily(query, maxResults);
|
|
98
|
+
break;
|
|
99
|
+
case 'firecrawl':
|
|
100
|
+
results = await this.searchFirecrawl(query, maxResults);
|
|
101
|
+
break;
|
|
102
|
+
case 'searxng':
|
|
103
|
+
results = await this.searchSearXNG(query, maxResults, { categories: category });
|
|
104
|
+
break;
|
|
94
105
|
case 'duckduckgo':
|
|
95
106
|
default:
|
|
96
107
|
results = await this.searchDuckDuckGoAPI(query, maxResults);
|
|
@@ -109,17 +120,22 @@ class SearchProviderService {
|
|
|
109
120
|
/**
|
|
110
121
|
* Gets list of available providers based on configured API keys
|
|
111
122
|
*
|
|
112
|
-
* @private
|
|
113
123
|
* @returns {string[]} Array of available provider names
|
|
114
124
|
*/
|
|
115
125
|
getAvailableProviders() {
|
|
116
126
|
const providers = [];
|
|
117
127
|
if (this.config.serperApiKey)
|
|
118
128
|
providers.push('serper');
|
|
119
|
-
if (this.config.
|
|
120
|
-
providers.push('
|
|
129
|
+
if (this.config.tavilyApiKey)
|
|
130
|
+
providers.push('tavily');
|
|
121
131
|
if (this.config.braveApiKey)
|
|
122
132
|
providers.push('brave');
|
|
133
|
+
if (this.config.serpApiKey)
|
|
134
|
+
providers.push('serpapi');
|
|
135
|
+
if (this.config.firecrawlApiKey)
|
|
136
|
+
providers.push('firecrawl');
|
|
137
|
+
if (this.config.searxngUrl)
|
|
138
|
+
providers.push('searxng');
|
|
123
139
|
return providers;
|
|
124
140
|
}
|
|
125
141
|
/**
|
|
@@ -164,7 +180,7 @@ class SearchProviderService {
|
|
|
164
180
|
});
|
|
165
181
|
if (!response.ok)
|
|
166
182
|
throw new Error(`Serper API error: ${response.statusText}`);
|
|
167
|
-
const data = await response.json();
|
|
183
|
+
const data = (await response.json());
|
|
168
184
|
return (data.organic || []).map((item) => ({
|
|
169
185
|
title: item.title,
|
|
170
186
|
url: item.link,
|
|
@@ -189,7 +205,7 @@ class SearchProviderService {
|
|
|
189
205
|
const response = await fetch(`https://serpapi.com/search?${params}`);
|
|
190
206
|
if (!response.ok)
|
|
191
207
|
throw new Error(`SerpAPI error: ${response.statusText}`);
|
|
192
|
-
const data = await response.json();
|
|
208
|
+
const data = (await response.json());
|
|
193
209
|
return (data.organic_results || []).map((item) => ({
|
|
194
210
|
title: item.title,
|
|
195
211
|
url: item.link,
|
|
@@ -217,7 +233,7 @@ class SearchProviderService {
|
|
|
217
233
|
});
|
|
218
234
|
if (!response.ok)
|
|
219
235
|
throw new Error(`Brave API error: ${response.statusText}`);
|
|
220
|
-
const data = await response.json();
|
|
236
|
+
const data = (await response.json());
|
|
221
237
|
return (data.web?.results || []).map((item, index) => ({
|
|
222
238
|
title: item.title,
|
|
223
239
|
url: item.url,
|
|
@@ -263,7 +279,16 @@ class SearchProviderService {
|
|
|
263
279
|
}
|
|
264
280
|
}
|
|
265
281
|
/**
|
|
266
|
-
* Search using DuckDuckGo
|
|
282
|
+
* Search using DuckDuckGo HTML search page.
|
|
283
|
+
*
|
|
284
|
+
* The Instant Answer API (`api.duckduckgo.com/?format=json`) only returns
|
|
285
|
+
* Wikipedia-style abstracts and related topics — it does NOT return actual
|
|
286
|
+
* web search results. For most factual queries (follower counts, prices,
|
|
287
|
+
* current stats) it returns nothing useful.
|
|
288
|
+
*
|
|
289
|
+
* This method POSTs to the HTML search endpoint instead, which returns real
|
|
290
|
+
* organic search results. If the HTML scrape fails, it falls back to the
|
|
291
|
+
* Instant Answer API as a last resort.
|
|
267
292
|
*
|
|
268
293
|
* @private
|
|
269
294
|
* @param {string} query - Search query
|
|
@@ -271,38 +296,324 @@ class SearchProviderService {
|
|
|
271
296
|
* @returns {Promise<SearchResult[]>} Search results
|
|
272
297
|
*/
|
|
273
298
|
async searchDuckDuckGoAPI(query, maxResults) {
|
|
274
|
-
|
|
299
|
+
try {
|
|
300
|
+
const htmlResults = await this.scrapeDuckDuckGoHTML(query, maxResults);
|
|
301
|
+
if (htmlResults.length > 0)
|
|
302
|
+
return htmlResults;
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Fall through to instant answer API
|
|
306
|
+
}
|
|
307
|
+
// Fallback: DuckDuckGo instant answer API (limited but free)
|
|
308
|
+
return this.searchDuckDuckGoInstantAnswer(query, maxResults);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Scrapes real search results from DuckDuckGo's HTML search page.
|
|
312
|
+
*
|
|
313
|
+
* @private
|
|
314
|
+
*/
|
|
315
|
+
async scrapeDuckDuckGoHTML(query, maxResults) {
|
|
316
|
+
const body = new URLSearchParams({ q: query, b: '' });
|
|
317
|
+
const response = await fetch('https://html.duckduckgo.com/html/', {
|
|
318
|
+
method: 'POST',
|
|
319
|
+
headers: {
|
|
320
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
321
|
+
'User-Agent': 'Mozilla/5.0 (compatible; WunderlandBot/1.0; +https://wunderland.sh)',
|
|
322
|
+
},
|
|
323
|
+
body: body.toString(),
|
|
324
|
+
});
|
|
325
|
+
if (!response.ok)
|
|
326
|
+
return [];
|
|
327
|
+
const html = await response.text();
|
|
328
|
+
const results = [];
|
|
329
|
+
// Each organic result lives inside a <div class="result ..."> block.
|
|
330
|
+
// We extract title+URL from the <a class="result__a"> and snippet from
|
|
331
|
+
// <a class="result__snippet">.
|
|
332
|
+
const resultBlockRe = /<div[^>]*class="[^"]*result[^"]*"[^>]*>[\s\S]*?<\/div>\s*<\/div>/gi;
|
|
333
|
+
const blocks = html.match(resultBlockRe) ?? [];
|
|
334
|
+
for (const block of blocks) {
|
|
335
|
+
if (results.length >= maxResults)
|
|
336
|
+
break;
|
|
337
|
+
// Title + URL
|
|
338
|
+
const linkMatch = block.match(/<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/i);
|
|
339
|
+
if (!linkMatch)
|
|
340
|
+
continue;
|
|
341
|
+
let url = linkMatch[1];
|
|
342
|
+
const title = linkMatch[2].replace(/<[^>]+>/g, '').trim();
|
|
343
|
+
// DDG wraps URLs via a redirect — extract the actual destination
|
|
344
|
+
const uddgMatch = url.match(/[?&]uddg=([^&]+)/);
|
|
345
|
+
if (uddgMatch) {
|
|
346
|
+
url = decodeURIComponent(uddgMatch[1]);
|
|
347
|
+
}
|
|
348
|
+
if (!url || !title)
|
|
349
|
+
continue;
|
|
350
|
+
// Snippet
|
|
351
|
+
const snippetMatch = block.match(/<a[^>]*class="result__snippet"[^>]*>([\s\S]*?)<\/a>/i)
|
|
352
|
+
?? block.match(/<span[^>]*class="result__snippet"[^>]*>([\s\S]*?)<\/span>/i);
|
|
353
|
+
const snippet = snippetMatch
|
|
354
|
+
? snippetMatch[1].replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim()
|
|
355
|
+
: '';
|
|
356
|
+
results.push({ title, url, snippet });
|
|
357
|
+
}
|
|
358
|
+
return results;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* DuckDuckGo Instant Answer API (limited — only returns Wikipedia-style
|
|
362
|
+
* abstracts and related topics, NOT real search results).
|
|
363
|
+
*
|
|
364
|
+
* @private
|
|
365
|
+
*/
|
|
366
|
+
async searchDuckDuckGoInstantAnswer(query, maxResults) {
|
|
275
367
|
const params = new URLSearchParams({
|
|
276
368
|
q: query,
|
|
277
369
|
format: 'json',
|
|
278
370
|
no_html: '1',
|
|
279
|
-
skip_disambig: '1'
|
|
371
|
+
skip_disambig: '1',
|
|
280
372
|
});
|
|
281
373
|
const response = await fetch(`https://api.duckduckgo.com/?${params}`);
|
|
282
|
-
const data = await response.json();
|
|
374
|
+
const data = (await response.json());
|
|
283
375
|
const results = [];
|
|
284
|
-
// Add instant answer if available
|
|
285
376
|
if (data.AbstractText && data.AbstractURL) {
|
|
286
377
|
results.push({
|
|
287
378
|
title: data.Heading || query,
|
|
288
379
|
url: data.AbstractURL,
|
|
289
|
-
snippet: data.AbstractText
|
|
380
|
+
snippet: data.AbstractText,
|
|
290
381
|
});
|
|
291
382
|
}
|
|
292
|
-
// Add related topics
|
|
293
383
|
if (data.RelatedTopics) {
|
|
294
384
|
for (const topic of data.RelatedTopics.slice(0, maxResults - 1)) {
|
|
295
385
|
if (topic.FirstURL && topic.Text) {
|
|
296
386
|
results.push({
|
|
297
387
|
title: topic.Text.split(' - ')[0] || topic.Text,
|
|
298
388
|
url: topic.FirstURL,
|
|
299
|
-
snippet: topic.Text
|
|
389
|
+
snippet: topic.Text,
|
|
300
390
|
});
|
|
301
391
|
}
|
|
302
392
|
}
|
|
303
393
|
}
|
|
304
394
|
return results.slice(0, maxResults);
|
|
305
395
|
}
|
|
396
|
+
/**
|
|
397
|
+
* Search using a self-hosted SearXNG metasearch instance.
|
|
398
|
+
*
|
|
399
|
+
* @private
|
|
400
|
+
* @param {string} query - Search query
|
|
401
|
+
* @param {number} maxResults - Maximum results
|
|
402
|
+
* @param {Object} [options] - SearXNG-specific options
|
|
403
|
+
* @param {string} [options.categories] - SearXNG categories (e.g. 'general', 'news', 'images')
|
|
404
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
405
|
+
*/
|
|
406
|
+
async searchSearXNG(query, maxResults, options) {
|
|
407
|
+
const params = new URLSearchParams({
|
|
408
|
+
q: query,
|
|
409
|
+
format: 'json',
|
|
410
|
+
categories: options?.categories || 'general',
|
|
411
|
+
});
|
|
412
|
+
const baseUrl = this.config.searxngUrl.replace(/\/+$/, '');
|
|
413
|
+
const response = await fetch(`${baseUrl}/search?${params}`);
|
|
414
|
+
if (!response.ok)
|
|
415
|
+
throw new Error(`SearXNG API error: ${response.statusText}`);
|
|
416
|
+
const data = (await response.json());
|
|
417
|
+
return (data.results || []).slice(0, maxResults).map((item, index) => ({
|
|
418
|
+
title: item.title || '',
|
|
419
|
+
url: item.url || '',
|
|
420
|
+
snippet: item.content || '',
|
|
421
|
+
position: index + 1,
|
|
422
|
+
}));
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Normalizes a URL for deduplication — strips www, tracking params, trailing slash.
|
|
426
|
+
*/
|
|
427
|
+
static normalizeUrl(rawUrl) {
|
|
428
|
+
try {
|
|
429
|
+
const url = new URL(rawUrl);
|
|
430
|
+
url.hostname = url.hostname.replace(/^www\./, '');
|
|
431
|
+
const trackingParams = [
|
|
432
|
+
'utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term',
|
|
433
|
+
'fbclid', 'gclid', 'ref', 'source', 'sxsrf', 'ei', 'ved',
|
|
434
|
+
];
|
|
435
|
+
for (const param of trackingParams)
|
|
436
|
+
url.searchParams.delete(param);
|
|
437
|
+
url.searchParams.sort();
|
|
438
|
+
url.pathname = url.pathname.replace(/\/+$/, '') || '/';
|
|
439
|
+
return url.toString();
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
return rawUrl.toLowerCase().trim();
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Search using the Tavily API (AI-optimized search).
|
|
447
|
+
* @see https://docs.tavily.com/docs/tavily-api/rest-api
|
|
448
|
+
*/
|
|
449
|
+
async searchTavily(query, maxResults) {
|
|
450
|
+
const controller = new AbortController();
|
|
451
|
+
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
452
|
+
try {
|
|
453
|
+
const res = await fetch('https://api.tavily.com/search', {
|
|
454
|
+
method: 'POST',
|
|
455
|
+
headers: { 'Content-Type': 'application/json' },
|
|
456
|
+
body: JSON.stringify({
|
|
457
|
+
api_key: this.config.tavilyApiKey,
|
|
458
|
+
query,
|
|
459
|
+
search_depth: 'advanced',
|
|
460
|
+
include_answer: false,
|
|
461
|
+
include_raw_content: false,
|
|
462
|
+
max_results: Math.min(maxResults, 20),
|
|
463
|
+
}),
|
|
464
|
+
signal: controller.signal,
|
|
465
|
+
});
|
|
466
|
+
if (!res.ok)
|
|
467
|
+
throw new Error(`Tavily API error: ${res.status} ${res.statusText}`);
|
|
468
|
+
const data = (await res.json());
|
|
469
|
+
return (data.results ?? []).map((r, i) => ({
|
|
470
|
+
title: r.title ?? '',
|
|
471
|
+
url: r.url ?? '',
|
|
472
|
+
snippet: r.content ?? '',
|
|
473
|
+
position: i + 1,
|
|
474
|
+
}));
|
|
475
|
+
}
|
|
476
|
+
catch (err) {
|
|
477
|
+
if (err.name === 'AbortError')
|
|
478
|
+
return [];
|
|
479
|
+
throw err;
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
clearTimeout(timeout);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Search using the Firecrawl /search endpoint.
|
|
487
|
+
* @see https://docs.firecrawl.dev/api-reference/endpoint/search
|
|
488
|
+
*/
|
|
489
|
+
async searchFirecrawl(query, maxResults) {
|
|
490
|
+
const controller = new AbortController();
|
|
491
|
+
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
492
|
+
try {
|
|
493
|
+
const res = await fetch('https://api.firecrawl.dev/v1/search', {
|
|
494
|
+
method: 'POST',
|
|
495
|
+
headers: {
|
|
496
|
+
'Content-Type': 'application/json',
|
|
497
|
+
'Authorization': `Bearer ${this.config.firecrawlApiKey}`,
|
|
498
|
+
},
|
|
499
|
+
body: JSON.stringify({
|
|
500
|
+
query,
|
|
501
|
+
limit: Math.min(maxResults, 20),
|
|
502
|
+
}),
|
|
503
|
+
signal: controller.signal,
|
|
504
|
+
});
|
|
505
|
+
if (!res.ok)
|
|
506
|
+
throw new Error(`Firecrawl API error: ${res.status} ${res.statusText}`);
|
|
507
|
+
const data = (await res.json());
|
|
508
|
+
return (data.data ?? []).map((r, i) => ({
|
|
509
|
+
title: r.title ?? r.url,
|
|
510
|
+
url: r.url,
|
|
511
|
+
snippet: r.description ?? (r.markdown ?? '').slice(0, 300),
|
|
512
|
+
position: i + 1,
|
|
513
|
+
}));
|
|
514
|
+
}
|
|
515
|
+
catch (err) {
|
|
516
|
+
if (err.name === 'AbortError')
|
|
517
|
+
return [];
|
|
518
|
+
throw err;
|
|
519
|
+
}
|
|
520
|
+
finally {
|
|
521
|
+
clearTimeout(timeout);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Searches ALL available providers in parallel, then merges, deduplicates,
|
|
526
|
+
* and reranks results by cross-provider agreement.
|
|
527
|
+
*/
|
|
528
|
+
async multiSearch(query, options = {}) {
|
|
529
|
+
const startTime = Date.now();
|
|
530
|
+
const maxResults = options.maxResults || 10;
|
|
531
|
+
const providers = [...new Set([...this.getAvailableProviders(), 'duckduckgo'])];
|
|
532
|
+
const providerResults = await Promise.allSettled(providers.map(async (provider) => {
|
|
533
|
+
try {
|
|
534
|
+
if (provider !== 'duckduckgo' && !(await this.checkRateLimit(provider))) {
|
|
535
|
+
throw new Error(`Rate limit exceeded for ${provider}`);
|
|
536
|
+
}
|
|
537
|
+
const response = await this.searchWithProvider(query, provider, maxResults, startTime);
|
|
538
|
+
return { provider, results: response.results, success: true };
|
|
539
|
+
}
|
|
540
|
+
catch {
|
|
541
|
+
return { provider, results: [], success: false };
|
|
542
|
+
}
|
|
543
|
+
}));
|
|
544
|
+
const succeeded = [];
|
|
545
|
+
const failed = [];
|
|
546
|
+
const allResults = [];
|
|
547
|
+
for (const outcome of providerResults) {
|
|
548
|
+
if (outcome.status === 'fulfilled') {
|
|
549
|
+
const { provider, results, success } = outcome.value;
|
|
550
|
+
if (success && results.length > 0) {
|
|
551
|
+
succeeded.push(provider);
|
|
552
|
+
results.forEach((result, index) => {
|
|
553
|
+
allResults.push({ provider, result, position: index + 1 });
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
failed.push(provider);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
failed.push('unknown');
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
// Deduplicate and merge by normalized URL
|
|
565
|
+
const merged = new Map();
|
|
566
|
+
for (const { provider, result, position } of allResults) {
|
|
567
|
+
const key = SearchProviderService.normalizeUrl(result.url);
|
|
568
|
+
if (merged.has(key)) {
|
|
569
|
+
const existing = merged.get(key);
|
|
570
|
+
if (!existing.providers.includes(provider)) {
|
|
571
|
+
existing.providers.push(provider);
|
|
572
|
+
existing.agreementCount = existing.providers.length;
|
|
573
|
+
}
|
|
574
|
+
existing.providerPositions[provider] = position;
|
|
575
|
+
if ((result.snippet?.length || 0) > (existing.snippet?.length || 0)) {
|
|
576
|
+
existing.snippet = result.snippet;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
merged.set(key, {
|
|
581
|
+
title: result.title,
|
|
582
|
+
url: result.url,
|
|
583
|
+
snippet: result.snippet,
|
|
584
|
+
position,
|
|
585
|
+
providers: [provider],
|
|
586
|
+
agreementCount: 1,
|
|
587
|
+
confidenceScore: 0,
|
|
588
|
+
providerPositions: { [provider]: position },
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
// Score and rank
|
|
593
|
+
const totalProviders = succeeded.length || 1;
|
|
594
|
+
const scoredResults = Array.from(merged.values()).map((r) => {
|
|
595
|
+
const agreementBonus = (r.agreementCount / totalProviders) * 50;
|
|
596
|
+
const positions = Object.values(r.providerPositions);
|
|
597
|
+
const avgNorm = positions.reduce((s, p) => s + (1 - (p - 1) / maxResults), 0) / positions.length;
|
|
598
|
+
const positionScore = avgNorm * 30;
|
|
599
|
+
r.confidenceScore = Math.round(Math.min(100, agreementBonus + positionScore + 20));
|
|
600
|
+
return r;
|
|
601
|
+
});
|
|
602
|
+
scoredResults.sort((a, b) => b.confidenceScore - a.confidenceScore);
|
|
603
|
+
return {
|
|
604
|
+
results: scoredResults.slice(0, maxResults),
|
|
605
|
+
metadata: {
|
|
606
|
+
query,
|
|
607
|
+
timestamp: new Date().toISOString(),
|
|
608
|
+
totalResponseTime: Date.now() - startTime,
|
|
609
|
+
providersQueried: providers,
|
|
610
|
+
providersSucceeded: succeeded,
|
|
611
|
+
providersFailed: failed,
|
|
612
|
+
totalRawResults: allResults.length,
|
|
613
|
+
deduplicatedCount: merged.size,
|
|
614
|
+
},
|
|
615
|
+
};
|
|
616
|
+
}
|
|
306
617
|
/**
|
|
307
618
|
* Gets recommended search providers with signup information
|
|
308
619
|
*
|
|
@@ -329,6 +640,12 @@ class SearchProviderService {
|
|
|
329
640
|
freeQuota: '2,000 queries/month',
|
|
330
641
|
description: 'Privacy-focused search API'
|
|
331
642
|
},
|
|
643
|
+
{
|
|
644
|
+
name: 'SearXNG',
|
|
645
|
+
signupUrl: 'https://docs.searxng.org (self-hosted)',
|
|
646
|
+
freeQuota: 'Unlimited (self-hosted)',
|
|
647
|
+
description: 'Self-hosted metasearch engine aggregating 244+ search services'
|
|
648
|
+
},
|
|
332
649
|
{
|
|
333
650
|
name: 'DuckDuckGo',
|
|
334
651
|
signupUrl: 'No signup required',
|
|
@@ -338,5 +655,4 @@ class SearchProviderService {
|
|
|
338
655
|
];
|
|
339
656
|
}
|
|
340
657
|
}
|
|
341
|
-
exports.SearchProviderService = SearchProviderService;
|
|
342
658
|
//# sourceMappingURL=searchProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchProvider.js","sourceRoot":"","sources":["../../src/services/searchProvider.ts"],"names":[],"mappings":";;;AAsCA;;;;;;;;;;;;;;GAcG;AACH,MAAa,qBAAqB;IACxB,MAAM,CAAuB;IAC7B,cAAc,CAAoD;IAE1E;;;;OAIG;IACH,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,CAAC;YACb,SAAS,EAAE;gBACT,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,KAAK;aAChB;YACD,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,UAGI,EAAE;QAEN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,oDAAoD;QACpD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACjF,CAAC;QAED,uCAAuC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,kBAAkB,CAC9B,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,SAAiB;QAEjB,IAAI,OAAuB,CAAC;QAE5B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,YAAY,CAAC;YAClB;gBACE,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC5D,MAAM;QACV,CAAC;QAED,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;YACrC,QAAQ,EAAE;gBACR,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACrC;SACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,qBAAqB;QAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAChC,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,QAAQ;aACjD,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,UAAkB;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,UAAkB;QAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAW;YAChC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE3E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAkB;QACzD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kDAAkD,MAAM,EAAE,EAAE;YACvF,OAAO,EAAE;gBACP,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAY;aACjD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YAClE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,QAAQ,EAAE,KAAK,GAAG,CAAC;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,gBAAgB,CAC5B,KAAa,EACb,UAAkB,EAClB,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAClE,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO;gBACP,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,mBAAmB,CAAC,KAAa,EAAE,UAAkB;QACjE,mDAAmD;QACnD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG;YACZ,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;gBAC5B,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,OAAO,EAAE,IAAI,CAAC,YAAY;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;gBAChE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;wBAC/C,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,OAAO,EAAE,KAAK,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB;QAC5B,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,2BAA2B;aACzC;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,qBAAqB;gBAChC,SAAS,EAAE,oBAAoB;gBAC/B,WAAW,EAAE,6BAA6B;aAC3C;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,8BAA8B;gBACzC,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,4BAA4B;aAC1C;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,0BAA0B;gBACrC,WAAW,EAAE,oCAAoC;aAClD;SACF,CAAC;IACJ,CAAC;CACF;AA1WD,sDA0WC"}
|
|
1
|
+
{"version":3,"file":"searchProvider.js","sourceRoot":"","sources":["../../src/services/searchProvider.ts"],"names":[],"mappings":"AAyEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAuB;IAC7B,cAAc,CAAoD;IAE1E;;;;OAIG;IACH,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI;gBAC7B,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,KAAK;aAChB;SACF,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,UAII,EAAE;QAEN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,oDAAoD;QACpD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnG,CAAC;QAED,uCAAuC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,kBAAkB,CAC9B,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,SAAiB,EACjB,QAAiB;QAEjB,IAAI,OAAuB,CAAC;QAE5B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChF,MAAM;YACR,KAAK,YAAY,CAAC;YAClB;gBACE,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC5D,MAAM;QACV,CAAC;QAED,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;YACrC,QAAQ,EAAE;gBACR,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACrC;SACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,qBAAqB;QAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe;YAAE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAChC,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,QAAQ;aACjD,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,UAAkB;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,UAAkB;QAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAW;YAChC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE3E,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAkB;QACzD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kDAAkD,MAAM,EAAE,EAAE;YACvF,OAAO,EAAE;gBACP,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAY;aACjD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YAClE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,QAAQ,EAAE,KAAK,GAAG,CAAC;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,gBAAgB,CAC5B,KAAa,EACb,UAAkB,EAClB,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAClE,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO;gBACP,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,KAAK,CAAC,mBAAmB,CAAC,KAAa,EAAE,UAAkB;QACjE,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACvE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,WAAW,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QAED,6DAA6D;QAC7D,OAAO,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,oBAAoB,CAAC,KAAa,EAAE,UAAkB;QAClE,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mCAAmC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;gBACnD,YAAY,EAAE,qEAAqE;aACpF;YACD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAE5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,qEAAqE;QACrE,uEAAuE;QACvE,+BAA+B;QAC/B,MAAM,aAAa,GAAG,oEAAoE,CAAC;QAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAE/C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;gBAAE,MAAM;YAExC,cAAc;YACd,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACnG,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAE1D,iEAAiE;YACjE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAChD,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;gBAAE,SAAS;YAE7B,UAAU;YACV,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,sDAAsD,CAAC;mBACnF,KAAK,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,YAAY;gBAC1B,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;gBACrE,CAAC,CAAC,EAAE,CAAC;YAEP,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,6BAA6B,CAAC,KAAa,EAAE,UAAkB;QAC3E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG;YACZ,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAE5C,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;gBAC5B,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,OAAO,EAAE,IAAI,CAAC,YAAY;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;gBAChE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;wBAC/C,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,OAAO,EAAE,KAAK,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,aAAa,CACzB,KAAa,EACb,UAAkB,EAClB,OAAiC;QAEjC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,SAAS;SAC7C,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,MAAM,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE/E,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YAClF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,QAAQ,EAAE,KAAK,GAAG,CAAC;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,MAAc;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,cAAc,GAAG;gBACrB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU;gBACrE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK;aACzD,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,cAAc;gBAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACxB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;YACvD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,UAAkB;QAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;oBACjC,KAAK;oBACL,YAAY,EAAE,UAAU;oBACxB,cAAc,EAAE,KAAK;oBACrB,mBAAmB,EAAE,KAAK;oBAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;iBACtC,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAElF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;gBACxB,QAAQ,EAAE,CAAC,GAAG,CAAC;aAChB,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAAa,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO,EAAE,CAAC;YACpD,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,UAAkB;QAC7D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;iBACzD;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;iBAChC,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAErF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG;gBACvB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,OAAO,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC1D,QAAQ,EAAE,CAAC,GAAG,CAAC;aAChB,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAAa,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO,EAAE,CAAC;YACpD,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,KAAa,EACb,UAAmC,EAAE;QAErC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAEhF,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,UAAU,CAC9C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC/B,IAAI,CAAC;gBACH,IAAI,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBACxE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACvF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAoB,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAwE,EAAE,CAAC;QAE3F,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;gBACrD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;wBAChC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC7D,CAAC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;QAEpD,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE3D,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3C,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAClC,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtD,CAAC;gBACD,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;oBACpE,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACpC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;oBACd,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,QAAQ;oBACR,SAAS,EAAE,CAAC,QAAQ,CAAC;oBACrB,cAAc,EAAE,CAAC;oBACjB,eAAe,EAAE,CAAC;oBAClB,iBAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE;iBAC5C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1D,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;YAChE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;YACjG,MAAM,aAAa,GAAG,OAAO,GAAG,EAAE,CAAC;YACnC,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;QAEpE,OAAO;YACL,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;YAC3C,QAAQ,EAAE;gBACR,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACzC,gBAAgB,EAAE,SAAS;gBAC3B,kBAAkB,EAAE,SAAS;gBAC7B,eAAe,EAAE,MAAM;gBACvB,eAAe,EAAE,UAAU,CAAC,MAAM;gBAClC,iBAAiB,EAAE,MAAM,CAAC,IAAI;aAC/B;SACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB;QAC5B,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,2BAA2B;aACzC;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,qBAAqB;gBAChC,SAAS,EAAE,oBAAoB;gBAC/B,WAAW,EAAE,6BAA6B;aAC3C;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,8BAA8B;gBACzC,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,4BAA4B;aAC1C;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,wCAAwC;gBACnD,SAAS,EAAE,yBAAyB;gBACpC,WAAW,EAAE,gEAAgE;aAC9E;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,0BAA0B;gBACrC,WAAW,EAAE,oCAAoC;aAClD;SACF,CAAC;IACJ,CAAC;CACF"}
|