@debriefer/sources 1.0.1
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 +59 -0
- package/dist/__tests__/archives/chronicling-america.test.d.ts +8 -0
- package/dist/__tests__/archives/chronicling-america.test.d.ts.map +1 -0
- package/dist/__tests__/archives/chronicling-america.test.js +151 -0
- package/dist/__tests__/archives/chronicling-america.test.js.map +1 -0
- package/dist/__tests__/archives/europeana.test.d.ts +8 -0
- package/dist/__tests__/archives/europeana.test.d.ts.map +1 -0
- package/dist/__tests__/archives/europeana.test.js +200 -0
- package/dist/__tests__/archives/europeana.test.js.map +1 -0
- package/dist/__tests__/archives/internet-archive.test.d.ts +8 -0
- package/dist/__tests__/archives/internet-archive.test.d.ts.map +1 -0
- package/dist/__tests__/archives/internet-archive.test.js +189 -0
- package/dist/__tests__/archives/internet-archive.test.js.map +1 -0
- package/dist/__tests__/archives/trove.test.d.ts +8 -0
- package/dist/__tests__/archives/trove.test.d.ts.map +1 -0
- package/dist/__tests__/archives/trove.test.js +202 -0
- package/dist/__tests__/archives/trove.test.js.map +1 -0
- package/dist/__tests__/books/google-books.test.d.ts +8 -0
- package/dist/__tests__/books/google-books.test.d.ts.map +1 -0
- package/dist/__tests__/books/google-books.test.js +221 -0
- package/dist/__tests__/books/google-books.test.js.map +1 -0
- package/dist/__tests__/books/open-library.test.d.ts +8 -0
- package/dist/__tests__/books/open-library.test.d.ts.map +1 -0
- package/dist/__tests__/books/open-library.test.js +159 -0
- package/dist/__tests__/books/open-library.test.js.map +1 -0
- package/dist/__tests__/news/guardian.test.d.ts +9 -0
- package/dist/__tests__/news/guardian.test.d.ts.map +1 -0
- package/dist/__tests__/news/guardian.test.js +224 -0
- package/dist/__tests__/news/guardian.test.js.map +1 -0
- package/dist/__tests__/news/nytimes.test.d.ts +9 -0
- package/dist/__tests__/news/nytimes.test.d.ts.map +1 -0
- package/dist/__tests__/news/nytimes.test.js +271 -0
- package/dist/__tests__/news/nytimes.test.js.map +1 -0
- package/dist/__tests__/news/site-search-source.test.d.ts +9 -0
- package/dist/__tests__/news/site-search-source.test.d.ts.map +1 -0
- package/dist/__tests__/news/site-search-source.test.js +342 -0
- package/dist/__tests__/news/site-search-source.test.js.map +1 -0
- package/dist/__tests__/obituary/find-a-grave.test.d.ts +8 -0
- package/dist/__tests__/obituary/find-a-grave.test.d.ts.map +1 -0
- package/dist/__tests__/obituary/find-a-grave.test.js +238 -0
- package/dist/__tests__/obituary/find-a-grave.test.js.map +1 -0
- package/dist/__tests__/shared/duckduckgo-search.test.d.ts +9 -0
- package/dist/__tests__/shared/duckduckgo-search.test.d.ts.map +1 -0
- package/dist/__tests__/shared/duckduckgo-search.test.js +218 -0
- package/dist/__tests__/shared/duckduckgo-search.test.js.map +1 -0
- package/dist/__tests__/shared/fetch-page.test.d.ts +9 -0
- package/dist/__tests__/shared/fetch-page.test.d.ts.map +1 -0
- package/dist/__tests__/shared/fetch-page.test.js +281 -0
- package/dist/__tests__/shared/fetch-page.test.js.map +1 -0
- package/dist/__tests__/shared/html-utils.test.d.ts +2 -0
- package/dist/__tests__/shared/html-utils.test.d.ts.map +1 -0
- package/dist/__tests__/shared/html-utils.test.js +169 -0
- package/dist/__tests__/shared/html-utils.test.js.map +1 -0
- package/dist/__tests__/shared/readability-extract.test.d.ts +2 -0
- package/dist/__tests__/shared/readability-extract.test.d.ts.map +1 -0
- package/dist/__tests__/shared/readability-extract.test.js +107 -0
- package/dist/__tests__/shared/readability-extract.test.js.map +1 -0
- package/dist/__tests__/shared/sanitize-text.test.d.ts +2 -0
- package/dist/__tests__/shared/sanitize-text.test.d.ts.map +1 -0
- package/dist/__tests__/shared/sanitize-text.test.js +77 -0
- package/dist/__tests__/shared/sanitize-text.test.js.map +1 -0
- package/dist/__tests__/shared/search-utils.test.d.ts +2 -0
- package/dist/__tests__/shared/search-utils.test.d.ts.map +1 -0
- package/dist/__tests__/shared/search-utils.test.js +26 -0
- package/dist/__tests__/shared/search-utils.test.js.map +1 -0
- package/dist/__tests__/structured/wikidata.test.d.ts +9 -0
- package/dist/__tests__/structured/wikidata.test.d.ts.map +1 -0
- package/dist/__tests__/structured/wikidata.test.js +509 -0
- package/dist/__tests__/structured/wikidata.test.js.map +1 -0
- package/dist/__tests__/structured/wikipedia.test.d.ts +9 -0
- package/dist/__tests__/structured/wikipedia.test.d.ts.map +1 -0
- package/dist/__tests__/structured/wikipedia.test.js +643 -0
- package/dist/__tests__/structured/wikipedia.test.js.map +1 -0
- package/dist/__tests__/web-search/base.test.d.ts +9 -0
- package/dist/__tests__/web-search/base.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/base.test.js +622 -0
- package/dist/__tests__/web-search/base.test.js.map +1 -0
- package/dist/__tests__/web-search/bing.test.d.ts +10 -0
- package/dist/__tests__/web-search/bing.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/bing.test.js +277 -0
- package/dist/__tests__/web-search/bing.test.js.map +1 -0
- package/dist/__tests__/web-search/brave.test.d.ts +10 -0
- package/dist/__tests__/web-search/brave.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/brave.test.js +264 -0
- package/dist/__tests__/web-search/brave.test.js.map +1 -0
- package/dist/__tests__/web-search/duckduckgo.test.d.ts +10 -0
- package/dist/__tests__/web-search/duckduckgo.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/duckduckgo.test.js +107 -0
- package/dist/__tests__/web-search/duckduckgo.test.js.map +1 -0
- package/dist/__tests__/web-search/google.test.d.ts +9 -0
- package/dist/__tests__/web-search/google.test.d.ts.map +1 -0
- package/dist/__tests__/web-search/google.test.js +189 -0
- package/dist/__tests__/web-search/google.test.js.map +1 -0
- package/dist/archives/chronicling-america.d.ts +33 -0
- package/dist/archives/chronicling-america.d.ts.map +1 -0
- package/dist/archives/chronicling-america.js +85 -0
- package/dist/archives/chronicling-america.js.map +1 -0
- package/dist/archives/europeana.d.ts +37 -0
- package/dist/archives/europeana.d.ts.map +1 -0
- package/dist/archives/europeana.js +92 -0
- package/dist/archives/europeana.js.map +1 -0
- package/dist/archives/internet-archive.d.ts +32 -0
- package/dist/archives/internet-archive.d.ts.map +1 -0
- package/dist/archives/internet-archive.js +90 -0
- package/dist/archives/internet-archive.js.map +1 -0
- package/dist/archives/trove.d.ts +37 -0
- package/dist/archives/trove.d.ts.map +1 -0
- package/dist/archives/trove.js +97 -0
- package/dist/archives/trove.js.map +1 -0
- package/dist/books/google-books.d.ts +48 -0
- package/dist/books/google-books.d.ts.map +1 -0
- package/dist/books/google-books.js +111 -0
- package/dist/books/google-books.js.map +1 -0
- package/dist/books/open-library.d.ts +44 -0
- package/dist/books/open-library.d.ts.map +1 -0
- package/dist/books/open-library.js +103 -0
- package/dist/books/open-library.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/news/guardian.d.ts +51 -0
- package/dist/news/guardian.d.ts.map +1 -0
- package/dist/news/guardian.js +131 -0
- package/dist/news/guardian.js.map +1 -0
- package/dist/news/nytimes.d.ts +27 -0
- package/dist/news/nytimes.d.ts.map +1 -0
- package/dist/news/nytimes.js +104 -0
- package/dist/news/nytimes.js.map +1 -0
- package/dist/news/site-search-source.d.ts +89 -0
- package/dist/news/site-search-source.d.ts.map +1 -0
- package/dist/news/site-search-source.js +182 -0
- package/dist/news/site-search-source.js.map +1 -0
- package/dist/news/sources.d.ts +52 -0
- package/dist/news/sources.d.ts.map +1 -0
- package/dist/news/sources.js +276 -0
- package/dist/news/sources.js.map +1 -0
- package/dist/obituary/find-a-grave.d.ts +43 -0
- package/dist/obituary/find-a-grave.d.ts.map +1 -0
- package/dist/obituary/find-a-grave.js +173 -0
- package/dist/obituary/find-a-grave.js.map +1 -0
- package/dist/shared/duckduckgo-search.d.ts +86 -0
- package/dist/shared/duckduckgo-search.d.ts.map +1 -0
- package/dist/shared/duckduckgo-search.js +218 -0
- package/dist/shared/duckduckgo-search.js.map +1 -0
- package/dist/shared/fetch-page.d.ts +50 -0
- package/dist/shared/fetch-page.d.ts.map +1 -0
- package/dist/shared/fetch-page.js +212 -0
- package/dist/shared/fetch-page.js.map +1 -0
- package/dist/shared/html-utils.d.ts +99 -0
- package/dist/shared/html-utils.d.ts.map +1 -0
- package/dist/shared/html-utils.js +246 -0
- package/dist/shared/html-utils.js.map +1 -0
- package/dist/shared/readability-extract.d.ts +33 -0
- package/dist/shared/readability-extract.d.ts.map +1 -0
- package/dist/shared/readability-extract.js +45 -0
- package/dist/shared/readability-extract.js.map +1 -0
- package/dist/shared/sanitize-text.d.ts +24 -0
- package/dist/shared/sanitize-text.d.ts.map +1 -0
- package/dist/shared/sanitize-text.js +49 -0
- package/dist/shared/sanitize-text.js.map +1 -0
- package/dist/shared/search-utils.d.ts +18 -0
- package/dist/shared/search-utils.d.ts.map +1 -0
- package/dist/shared/search-utils.js +20 -0
- package/dist/shared/search-utils.js.map +1 -0
- package/dist/structured/wikidata.d.ts +128 -0
- package/dist/structured/wikidata.d.ts.map +1 -0
- package/dist/structured/wikidata.js +361 -0
- package/dist/structured/wikidata.js.map +1 -0
- package/dist/structured/wikipedia.d.ts +184 -0
- package/dist/structured/wikipedia.d.ts.map +1 -0
- package/dist/structured/wikipedia.js +275 -0
- package/dist/structured/wikipedia.js.map +1 -0
- package/dist/web-search/base.d.ts +128 -0
- package/dist/web-search/base.d.ts.map +1 -0
- package/dist/web-search/base.js +251 -0
- package/dist/web-search/base.js.map +1 -0
- package/dist/web-search/bing.d.ts +21 -0
- package/dist/web-search/bing.d.ts.map +1 -0
- package/dist/web-search/bing.js +53 -0
- package/dist/web-search/bing.js.map +1 -0
- package/dist/web-search/brave.d.ts +21 -0
- package/dist/web-search/brave.d.ts.map +1 -0
- package/dist/web-search/brave.js +56 -0
- package/dist/web-search/brave.js.map +1 -0
- package/dist/web-search/duckduckgo.d.ts +15 -0
- package/dist/web-search/duckduckgo.d.ts.map +1 -0
- package/dist/web-search/duckduckgo.js +21 -0
- package/dist/web-search/duckduckgo.js.map +1 -0
- package/dist/web-search/google.d.ts +24 -0
- package/dist/web-search/google.d.ts.map +1 -0
- package/dist/web-search/google.js +48 -0
- package/dist/web-search/google.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the Wikidata SPARQL source.
|
|
3
|
+
*
|
|
4
|
+
* Mocks the global `fetch` function to avoid real API calls.
|
|
5
|
+
* Tests SPARQL query construction, response parsing, SPARQL escaping,
|
|
6
|
+
* retry logic, error handling, and the factory function.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
9
|
+
import { ReliabilityTier } from "@debriefer/core";
|
|
10
|
+
import { WikidataSource, wikidata, escapeSparql, isValidLabel, getValidLabel, filterValidLabels, } from "../../structured/wikidata.js";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Mocks
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const mockFetch = vi.fn();
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
mockFetch.mockReset();
|
|
17
|
+
vi.stubGlobal("fetch", mockFetch);
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
vi.restoreAllMocks();
|
|
21
|
+
});
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Test Helpers
|
|
24
|
+
// ============================================================================
|
|
25
|
+
function makeSubject(overrides) {
|
|
26
|
+
return {
|
|
27
|
+
id: 1,
|
|
28
|
+
name: "John Wayne",
|
|
29
|
+
context: { birthYear: 1907 },
|
|
30
|
+
...overrides,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function makeSparqlResponse(bindings) {
|
|
34
|
+
return { results: { bindings } };
|
|
35
|
+
}
|
|
36
|
+
function makeBinding(overrides) {
|
|
37
|
+
return {
|
|
38
|
+
person: { value: "http://www.wikidata.org/entity/Q40531" },
|
|
39
|
+
personLabel: { value: "John Wayne" },
|
|
40
|
+
personDescription: { value: "American actor (1907-1979)" },
|
|
41
|
+
article: { value: "https://en.wikipedia.org/wiki/John_Wayne" },
|
|
42
|
+
...overrides,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function makeOkResponse(data) {
|
|
46
|
+
return {
|
|
47
|
+
ok: true,
|
|
48
|
+
status: 200,
|
|
49
|
+
statusText: "OK",
|
|
50
|
+
json: async () => data,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function makeErrorResponse(status) {
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
status,
|
|
57
|
+
statusText: status === 429 ? "Too Many Requests" : "Server Error",
|
|
58
|
+
json: async () => ({}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// SPARQL Escaping
|
|
63
|
+
// ============================================================================
|
|
64
|
+
describe("escapeSparql", () => {
|
|
65
|
+
it("escapes double quotes", () => {
|
|
66
|
+
expect(escapeSparql('John "The Duke" Wayne')).toBe('John \\"The Duke\\" Wayne');
|
|
67
|
+
});
|
|
68
|
+
it("escapes backslashes before quotes", () => {
|
|
69
|
+
expect(escapeSparql('test\\path "quoted"')).toBe('test\\\\path \\"quoted\\"');
|
|
70
|
+
});
|
|
71
|
+
it("handles strings with no special characters", () => {
|
|
72
|
+
expect(escapeSparql("John Wayne")).toBe("John Wayne");
|
|
73
|
+
});
|
|
74
|
+
it("handles empty string", () => {
|
|
75
|
+
expect(escapeSparql("")).toBe("");
|
|
76
|
+
});
|
|
77
|
+
it("escapes multiple backslashes and quotes", () => {
|
|
78
|
+
expect(escapeSparql('a\\b\\c"d"e')).toBe('a\\\\b\\\\c\\"d\\"e');
|
|
79
|
+
});
|
|
80
|
+
it("escapes newlines, carriage returns, and tabs", () => {
|
|
81
|
+
expect(escapeSparql("line1\nline2")).toBe("line1\\nline2");
|
|
82
|
+
expect(escapeSparql("col1\tcol2")).toBe("col1\\tcol2");
|
|
83
|
+
expect(escapeSparql("a\r\nb")).toBe("a\\r\\nb");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// Label Validation
|
|
88
|
+
// ============================================================================
|
|
89
|
+
describe("isValidLabel", () => {
|
|
90
|
+
it("returns true for normal text labels", () => {
|
|
91
|
+
expect(isValidLabel("John Wayne")).toBe(true);
|
|
92
|
+
expect(isValidLabel("natural causes")).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it("returns false for undefined/empty", () => {
|
|
95
|
+
expect(isValidLabel(undefined)).toBe(false);
|
|
96
|
+
expect(isValidLabel("")).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it("returns false for URLs", () => {
|
|
99
|
+
expect(isValidLabel("http://example.com")).toBe(false);
|
|
100
|
+
expect(isValidLabel("https://example.com")).toBe(false);
|
|
101
|
+
});
|
|
102
|
+
it("returns false for genid references", () => {
|
|
103
|
+
expect(isValidLabel("genid-abc123")).toBe(false);
|
|
104
|
+
expect(isValidLabel("something-genid-xyz")).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
it("returns false for raw entity IDs", () => {
|
|
107
|
+
expect(isValidLabel("Q12345")).toBe(false);
|
|
108
|
+
expect(isValidLabel("Q1")).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
it("returns true for strings that look like entity IDs but aren't", () => {
|
|
111
|
+
expect(isValidLabel("Q12345X")).toBe(true);
|
|
112
|
+
expect(isValidLabel("Queen")).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe("getValidLabel", () => {
|
|
116
|
+
it("returns the string for valid labels", () => {
|
|
117
|
+
expect(getValidLabel("lung cancer")).toBe("lung cancer");
|
|
118
|
+
});
|
|
119
|
+
it("returns null for invalid labels", () => {
|
|
120
|
+
expect(getValidLabel("Q12345")).toBeNull();
|
|
121
|
+
expect(getValidLabel(undefined)).toBeNull();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("filterValidLabels", () => {
|
|
125
|
+
it("filters out invalid labels from comma-separated string", () => {
|
|
126
|
+
expect(filterValidLabels("Harvard, Q12345, MIT")).toBe("Harvard, MIT");
|
|
127
|
+
});
|
|
128
|
+
it("returns null when all labels are invalid", () => {
|
|
129
|
+
expect(filterValidLabels("Q12345, http://example.com")).toBeNull();
|
|
130
|
+
});
|
|
131
|
+
it("returns null for undefined input", () => {
|
|
132
|
+
expect(filterValidLabels(undefined)).toBeNull();
|
|
133
|
+
});
|
|
134
|
+
it("returns the string when all labels are valid", () => {
|
|
135
|
+
expect(filterValidLabels("Harvard, MIT, Stanford")).toBe("Harvard, MIT, Stanford");
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
// ============================================================================
|
|
139
|
+
// WikidataSource
|
|
140
|
+
// ============================================================================
|
|
141
|
+
describe("WikidataSource", () => {
|
|
142
|
+
describe("properties", () => {
|
|
143
|
+
it("has correct name, type, reliability, domain, and cost", () => {
|
|
144
|
+
const source = new WikidataSource();
|
|
145
|
+
expect(source.name).toBe("Wikidata");
|
|
146
|
+
expect(source.type).toBe("wikidata");
|
|
147
|
+
expect(source.reliabilityTier).toBe(ReliabilityTier.STRUCTURED_DATA);
|
|
148
|
+
expect(source.domain).toBe("query.wikidata.org");
|
|
149
|
+
expect(source.isFree).toBe(true);
|
|
150
|
+
expect(source.estimatedCostPerQuery).toBe(0);
|
|
151
|
+
});
|
|
152
|
+
it("always reports as available (no API key needed)", () => {
|
|
153
|
+
const source = new WikidataSource();
|
|
154
|
+
expect(source.isAvailable()).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe("SPARQL query construction", () => {
|
|
158
|
+
it("includes the subject name in the query", async () => {
|
|
159
|
+
const source = new WikidataSource();
|
|
160
|
+
const subject = makeSubject();
|
|
161
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
162
|
+
const signal = AbortSignal.timeout(5000);
|
|
163
|
+
await source.lookup(subject, signal);
|
|
164
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
165
|
+
const url = mockFetch.mock.calls[0][0];
|
|
166
|
+
const query = decodeURIComponent(url.split("query=")[1]);
|
|
167
|
+
expect(query).toContain('"John Wayne"@en');
|
|
168
|
+
});
|
|
169
|
+
it("includes birth year filter when provided in context", async () => {
|
|
170
|
+
const source = new WikidataSource();
|
|
171
|
+
const subject = makeSubject({ context: { birthYear: 1907 } });
|
|
172
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
173
|
+
const signal = AbortSignal.timeout(5000);
|
|
174
|
+
await source.lookup(subject, signal);
|
|
175
|
+
const url = mockFetch.mock.calls[0][0];
|
|
176
|
+
const query = decodeURIComponent(url.split("query=")[1]);
|
|
177
|
+
expect(query).toContain("YEAR(?birthDate) = 1907");
|
|
178
|
+
});
|
|
179
|
+
it("omits birth year filter when not in context", async () => {
|
|
180
|
+
const source = new WikidataSource();
|
|
181
|
+
const subject = makeSubject({ context: undefined });
|
|
182
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
183
|
+
const signal = AbortSignal.timeout(5000);
|
|
184
|
+
await source.lookup(subject, signal);
|
|
185
|
+
const url = mockFetch.mock.calls[0][0];
|
|
186
|
+
const query = decodeURIComponent(url.split("query=")[1]);
|
|
187
|
+
expect(query).not.toContain("YEAR(?birthDate)");
|
|
188
|
+
});
|
|
189
|
+
it("escapes special characters in the subject name", async () => {
|
|
190
|
+
const source = new WikidataSource();
|
|
191
|
+
const subject = makeSubject({ name: 'O\'Brien "The Kid"' });
|
|
192
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([])));
|
|
193
|
+
const signal = AbortSignal.timeout(5000);
|
|
194
|
+
await source.lookup(subject, signal);
|
|
195
|
+
const url = mockFetch.mock.calls[0][0];
|
|
196
|
+
const query = decodeURIComponent(url.split("query=")[1]);
|
|
197
|
+
// Quotes should be escaped
|
|
198
|
+
expect(query).toContain('\\"The Kid\\"');
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe("response parsing", () => {
|
|
202
|
+
it("returns a RawFinding with text and confidence on match", async () => {
|
|
203
|
+
const source = new WikidataSource();
|
|
204
|
+
const subject = makeSubject();
|
|
205
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
206
|
+
const signal = AbortSignal.timeout(5000);
|
|
207
|
+
const result = await source.lookup(subject, signal);
|
|
208
|
+
expect(result).not.toBeNull();
|
|
209
|
+
expect(result.text).toContain("John Wayne");
|
|
210
|
+
expect(result.text).toContain("American actor");
|
|
211
|
+
expect(result.confidence).toBeGreaterThan(0);
|
|
212
|
+
expect(result.costUsd).toBe(0);
|
|
213
|
+
expect(result.publication).toBe("Wikidata");
|
|
214
|
+
expect(result.url).toBe("https://en.wikipedia.org/wiki/John_Wayne");
|
|
215
|
+
});
|
|
216
|
+
it("returns null when no bindings match the subject name", async () => {
|
|
217
|
+
const source = new WikidataSource();
|
|
218
|
+
const subject = makeSubject();
|
|
219
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([
|
|
220
|
+
makeBinding({ personLabel: { value: "Completely Different Person" } }),
|
|
221
|
+
])));
|
|
222
|
+
const signal = AbortSignal.timeout(5000);
|
|
223
|
+
const result = await source.lookup(subject, signal);
|
|
224
|
+
expect(result).toBeNull();
|
|
225
|
+
});
|
|
226
|
+
it("returns null when response has no bindings", async () => {
|
|
227
|
+
const source = new WikidataSource();
|
|
228
|
+
const subject = makeSubject();
|
|
229
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([])));
|
|
230
|
+
const signal = AbortSignal.timeout(5000);
|
|
231
|
+
const result = await source.lookup(subject, signal);
|
|
232
|
+
expect(result).toBeNull();
|
|
233
|
+
});
|
|
234
|
+
it("uses Wikipedia article URL when available", async () => {
|
|
235
|
+
const source = new WikidataSource();
|
|
236
|
+
const subject = makeSubject();
|
|
237
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([
|
|
238
|
+
makeBinding({
|
|
239
|
+
article: { value: "https://en.wikipedia.org/wiki/John_Wayne" },
|
|
240
|
+
}),
|
|
241
|
+
])));
|
|
242
|
+
const signal = AbortSignal.timeout(5000);
|
|
243
|
+
const result = await source.lookup(subject, signal);
|
|
244
|
+
expect(result.url).toBe("https://en.wikipedia.org/wiki/John_Wayne");
|
|
245
|
+
});
|
|
246
|
+
it("falls back to entity URL when no Wikipedia article", async () => {
|
|
247
|
+
const source = new WikidataSource();
|
|
248
|
+
const subject = makeSubject();
|
|
249
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([
|
|
250
|
+
makeBinding({
|
|
251
|
+
article: undefined,
|
|
252
|
+
}),
|
|
253
|
+
])));
|
|
254
|
+
const signal = AbortSignal.timeout(5000);
|
|
255
|
+
const result = await source.lookup(subject, signal);
|
|
256
|
+
expect(result.url).toBe("http://www.wikidata.org/entity/Q40531");
|
|
257
|
+
});
|
|
258
|
+
it("includes extra fields in output text", async () => {
|
|
259
|
+
const source = new WikidataSource();
|
|
260
|
+
const subject = makeSubject();
|
|
261
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([
|
|
262
|
+
makeBinding({
|
|
263
|
+
causeOfDeathLabel: { value: "lung cancer" },
|
|
264
|
+
}),
|
|
265
|
+
])));
|
|
266
|
+
const signal = AbortSignal.timeout(5000);
|
|
267
|
+
const result = await source.lookup(subject, signal);
|
|
268
|
+
expect(result.text).toContain("lung cancer");
|
|
269
|
+
});
|
|
270
|
+
it("filters out invalid labels from extra fields", async () => {
|
|
271
|
+
const source = new WikidataSource();
|
|
272
|
+
const subject = makeSubject();
|
|
273
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([
|
|
274
|
+
makeBinding({
|
|
275
|
+
causeOfDeathLabel: { value: "Q12345" },
|
|
276
|
+
}),
|
|
277
|
+
])));
|
|
278
|
+
const signal = AbortSignal.timeout(5000);
|
|
279
|
+
const result = await source.lookup(subject, signal);
|
|
280
|
+
expect(result.text).not.toContain("Q12345");
|
|
281
|
+
});
|
|
282
|
+
it("includes metadata with SPARQL query and binding count", async () => {
|
|
283
|
+
const source = new WikidataSource();
|
|
284
|
+
const subject = makeSubject();
|
|
285
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
286
|
+
const signal = AbortSignal.timeout(5000);
|
|
287
|
+
const result = await source.lookup(subject, signal);
|
|
288
|
+
expect(result.metadata).toBeDefined();
|
|
289
|
+
expect(result.metadata.sparqlQuery).toBeDefined();
|
|
290
|
+
expect(result.metadata.bindingCount).toBe(1);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
describe("name matching", () => {
|
|
294
|
+
it("matches exact names", async () => {
|
|
295
|
+
const source = new WikidataSource();
|
|
296
|
+
const subject = makeSubject({ name: "John Wayne" });
|
|
297
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding({ personLabel: { value: "John Wayne" } })])));
|
|
298
|
+
const signal = AbortSignal.timeout(5000);
|
|
299
|
+
const result = await source.lookup(subject, signal);
|
|
300
|
+
expect(result).not.toBeNull();
|
|
301
|
+
});
|
|
302
|
+
it("matches names with different casing", async () => {
|
|
303
|
+
const source = new WikidataSource();
|
|
304
|
+
const subject = makeSubject({ name: "john wayne" });
|
|
305
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding({ personLabel: { value: "John Wayne" } })])));
|
|
306
|
+
const signal = AbortSignal.timeout(5000);
|
|
307
|
+
const result = await source.lookup(subject, signal);
|
|
308
|
+
expect(result).not.toBeNull();
|
|
309
|
+
});
|
|
310
|
+
it("matches by last name + first initial when full name differs", async () => {
|
|
311
|
+
const source = new WikidataSource();
|
|
312
|
+
// "John Wayne" vs "James Wayne" — same last name + same first initial
|
|
313
|
+
const subject = makeSubject({ name: "James Wayne" });
|
|
314
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding({ personLabel: { value: "John Wayne" } })])));
|
|
315
|
+
const signal = AbortSignal.timeout(5000);
|
|
316
|
+
const result = await source.lookup(subject, signal);
|
|
317
|
+
expect(result).not.toBeNull();
|
|
318
|
+
});
|
|
319
|
+
it("rejects last-name-only match with different first initial", async () => {
|
|
320
|
+
const source = new WikidataSource();
|
|
321
|
+
// "John Wayne" vs "Mary Wayne" — same last name but different first initial
|
|
322
|
+
const subject = makeSubject({ name: "Mary Wayne" });
|
|
323
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding({ personLabel: { value: "John Wayne" } })])));
|
|
324
|
+
const signal = AbortSignal.timeout(5000);
|
|
325
|
+
const result = await source.lookup(subject, signal);
|
|
326
|
+
expect(result).toBeNull();
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
describe("custom query builder", () => {
|
|
330
|
+
it("uses a custom query builder when provided", async () => {
|
|
331
|
+
const customQuery = vi.fn().mockReturnValue("SELECT ?x WHERE { ?x ?y ?z } LIMIT 1");
|
|
332
|
+
const source = new WikidataSource({
|
|
333
|
+
queryBuilder: customQuery,
|
|
334
|
+
resultParser: () => ({ text: "custom result", confidence: 0.9 }),
|
|
335
|
+
});
|
|
336
|
+
const subject = makeSubject();
|
|
337
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
338
|
+
const signal = AbortSignal.timeout(5000);
|
|
339
|
+
await source.lookup(subject, signal);
|
|
340
|
+
expect(customQuery).toHaveBeenCalledWith(subject);
|
|
341
|
+
const url = mockFetch.mock.calls[0][0];
|
|
342
|
+
const query = decodeURIComponent(url.split("query=")[1]);
|
|
343
|
+
expect(query).toBe("SELECT ?x WHERE { ?x ?y ?z } LIMIT 1");
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
describe("custom result parser", () => {
|
|
347
|
+
it("uses a custom result parser when provided", async () => {
|
|
348
|
+
const customParser = vi.fn().mockReturnValue({
|
|
349
|
+
text: "Custom parsed data",
|
|
350
|
+
confidence: 0.95,
|
|
351
|
+
metadata: { custom: true },
|
|
352
|
+
});
|
|
353
|
+
const source = new WikidataSource({ resultParser: customParser });
|
|
354
|
+
const subject = makeSubject();
|
|
355
|
+
const bindings = [makeBinding()];
|
|
356
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse(bindings)));
|
|
357
|
+
const signal = AbortSignal.timeout(5000);
|
|
358
|
+
const result = await source.lookup(subject, signal);
|
|
359
|
+
expect(customParser).toHaveBeenCalledWith(bindings, subject);
|
|
360
|
+
expect(result.text).toBe("Custom parsed data");
|
|
361
|
+
expect(result.confidence).toBe(0.95);
|
|
362
|
+
});
|
|
363
|
+
it("returns null when custom parser returns null", async () => {
|
|
364
|
+
const source = new WikidataSource({
|
|
365
|
+
resultParser: () => null,
|
|
366
|
+
});
|
|
367
|
+
const subject = makeSubject();
|
|
368
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
369
|
+
const signal = AbortSignal.timeout(5000);
|
|
370
|
+
const result = await source.lookup(subject, signal);
|
|
371
|
+
expect(result).toBeNull();
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
describe("error handling", () => {
|
|
375
|
+
it("returns null on 404 (subject not found)", async () => {
|
|
376
|
+
const source = new WikidataSource();
|
|
377
|
+
const subject = makeSubject();
|
|
378
|
+
mockFetch.mockResolvedValueOnce(makeErrorResponse(404));
|
|
379
|
+
const signal = AbortSignal.timeout(5000);
|
|
380
|
+
const result = await source.lookup(subject, signal);
|
|
381
|
+
expect(result).toBeNull();
|
|
382
|
+
});
|
|
383
|
+
it("returns null on non-404 HTTP error (error propagates to base class)", async () => {
|
|
384
|
+
// Use a short timeout source to avoid waiting for the default 30s
|
|
385
|
+
const source = new WikidataSource({ timeoutMs: 2000 });
|
|
386
|
+
const subject = makeSubject();
|
|
387
|
+
mockFetch.mockResolvedValueOnce(makeErrorResponse(403));
|
|
388
|
+
const signal = AbortSignal.timeout(10000);
|
|
389
|
+
// 403 throws inside fetchWithRetry, caught by BaseResearchSource.lookup()
|
|
390
|
+
// which records the error via telemetry and returns null
|
|
391
|
+
const result = await source.lookup(subject, signal);
|
|
392
|
+
expect(result).toBeNull();
|
|
393
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
394
|
+
}, 15000);
|
|
395
|
+
it("returns null on network error after retries", async () => {
|
|
396
|
+
const source = new WikidataSource({ maxRetries: 1 });
|
|
397
|
+
const subject = makeSubject();
|
|
398
|
+
mockFetch
|
|
399
|
+
.mockRejectedValueOnce(new Error("Network error"))
|
|
400
|
+
.mockRejectedValueOnce(new Error("Network error"));
|
|
401
|
+
const signal = AbortSignal.timeout(30000);
|
|
402
|
+
const result = await source.lookup(subject, signal);
|
|
403
|
+
// Should have retried once, then the error is caught by BaseResearchSource
|
|
404
|
+
expect(result).toBeNull();
|
|
405
|
+
});
|
|
406
|
+
it("retries on 429 status", async () => {
|
|
407
|
+
const source = new WikidataSource({ maxRetries: 1 });
|
|
408
|
+
const subject = makeSubject();
|
|
409
|
+
mockFetch
|
|
410
|
+
.mockResolvedValueOnce(makeErrorResponse(429))
|
|
411
|
+
.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
412
|
+
const signal = AbortSignal.timeout(30000);
|
|
413
|
+
const result = await source.lookup(subject, signal);
|
|
414
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
415
|
+
expect(result).not.toBeNull();
|
|
416
|
+
});
|
|
417
|
+
it("retries on 500 status", async () => {
|
|
418
|
+
const source = new WikidataSource({ maxRetries: 1 });
|
|
419
|
+
const subject = makeSubject();
|
|
420
|
+
mockFetch
|
|
421
|
+
.mockResolvedValueOnce(makeErrorResponse(500))
|
|
422
|
+
.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
423
|
+
const signal = AbortSignal.timeout(30000);
|
|
424
|
+
const result = await source.lookup(subject, signal);
|
|
425
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
426
|
+
expect(result).not.toBeNull();
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
describe("buildQuery (for cache key)", () => {
|
|
430
|
+
it("returns name:birthYear when context has birthYear", () => {
|
|
431
|
+
const source = new WikidataSource();
|
|
432
|
+
const subject = makeSubject({ context: { birthYear: 1907 } });
|
|
433
|
+
expect(source.buildQuery(subject)).toBe("John Wayne:1907");
|
|
434
|
+
});
|
|
435
|
+
it("returns just the name when no birthYear context", () => {
|
|
436
|
+
const source = new WikidataSource();
|
|
437
|
+
const subject = makeSubject({ context: undefined });
|
|
438
|
+
expect(source.buildQuery(subject)).toBe("John Wayne");
|
|
439
|
+
});
|
|
440
|
+
it("uses hashed SPARQL query as cache key when custom queryBuilder is provided", () => {
|
|
441
|
+
const customQuery = "SELECT ?x WHERE { ?x ?y ?z } LIMIT 1";
|
|
442
|
+
const source = new WikidataSource({
|
|
443
|
+
queryBuilder: () => customQuery,
|
|
444
|
+
});
|
|
445
|
+
const subject = makeSubject();
|
|
446
|
+
const key = source.buildQuery(subject);
|
|
447
|
+
// Should be a 16-char hex hash, not the raw query
|
|
448
|
+
expect(key).toMatch(/^[a-f0-9]{16}$/);
|
|
449
|
+
// Same input should produce same hash
|
|
450
|
+
expect(source.buildQuery(subject)).toBe(key);
|
|
451
|
+
});
|
|
452
|
+
it("ignores non-finite birthYear values", () => {
|
|
453
|
+
const source = new WikidataSource();
|
|
454
|
+
const subject = makeSubject({ context: { birthYear: NaN } });
|
|
455
|
+
expect(source.buildQuery(subject)).toBe("John Wayne");
|
|
456
|
+
});
|
|
457
|
+
it("includes string birthYear in cache key (matching defaultQueryBuilder parsing)", () => {
|
|
458
|
+
const source = new WikidataSource();
|
|
459
|
+
const subject = makeSubject({ context: { birthYear: "1907" } });
|
|
460
|
+
expect(source.buildQuery(subject)).toBe("John Wayne:1907");
|
|
461
|
+
});
|
|
462
|
+
it("ignores non-numeric string birthYear in cache key", () => {
|
|
463
|
+
const source = new WikidataSource();
|
|
464
|
+
const subject = makeSubject({ context: { birthYear: "unknown" } });
|
|
465
|
+
expect(source.buildQuery(subject)).toBe("John Wayne");
|
|
466
|
+
});
|
|
467
|
+
});
|
|
468
|
+
describe("request headers", () => {
|
|
469
|
+
it("sends correct Accept and User-Agent headers", async () => {
|
|
470
|
+
const source = new WikidataSource({ userAgent: "test-agent/1.0" });
|
|
471
|
+
const subject = makeSubject();
|
|
472
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
473
|
+
const signal = AbortSignal.timeout(5000);
|
|
474
|
+
await source.lookup(subject, signal);
|
|
475
|
+
const fetchCall = mockFetch.mock.calls[0];
|
|
476
|
+
const options = fetchCall[1];
|
|
477
|
+
const headers = options.headers;
|
|
478
|
+
expect(headers.Accept).toBe("application/sparql-results+json");
|
|
479
|
+
expect(headers["User-Agent"]).toBe("test-agent/1.0");
|
|
480
|
+
});
|
|
481
|
+
it("passes the abort signal to fetch", async () => {
|
|
482
|
+
const source = new WikidataSource();
|
|
483
|
+
const subject = makeSubject();
|
|
484
|
+
mockFetch.mockResolvedValueOnce(makeOkResponse(makeSparqlResponse([makeBinding()])));
|
|
485
|
+
const signal = AbortSignal.timeout(5000);
|
|
486
|
+
await source.lookup(subject, signal);
|
|
487
|
+
const fetchCall = mockFetch.mock.calls[0];
|
|
488
|
+
const options = fetchCall[1];
|
|
489
|
+
// The signal passed to fetch is a combined signal (caller + timeout)
|
|
490
|
+
expect(options.signal).toBeDefined();
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
// ============================================================================
|
|
495
|
+
// Factory Function
|
|
496
|
+
// ============================================================================
|
|
497
|
+
describe("wikidata factory", () => {
|
|
498
|
+
it("creates a WikidataSource instance", () => {
|
|
499
|
+
const source = wikidata();
|
|
500
|
+
expect(source).toBeInstanceOf(WikidataSource);
|
|
501
|
+
expect(source.name).toBe("Wikidata");
|
|
502
|
+
});
|
|
503
|
+
it("passes options through to the source", () => {
|
|
504
|
+
const customBuilder = vi.fn().mockReturnValue("SELECT 1");
|
|
505
|
+
const source = wikidata({ queryBuilder: customBuilder });
|
|
506
|
+
expect(source).toBeInstanceOf(WikidataSource);
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
//# sourceMappingURL=wikidata.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikidata.test.js","sourceRoot":"","sources":["../../../src/__tests__/structured/wikidata.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,eAAe,EAAwB,MAAM,iBAAiB,CAAA;AACvE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,8BAA8B,CAAA;AAGrC,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AAEzB,UAAU,CAAC,GAAG,EAAE;IACd,SAAS,CAAC,SAAS,EAAE,CAAA;IACrB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AACnC,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,SAAS,WAAW,CAAC,SAAoC;IACvD,OAAO;QACL,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;QAC5B,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAyB;IACnD,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,SAAkC;IACrD,OAAO;QACL,MAAM,EAAE,EAAE,KAAK,EAAE,uCAAuC,EAAE;QAC1D,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;QACpC,iBAAiB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE;QAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE;QAC9D,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB;IAC1C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;KACA,CAAA;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM;QACN,UAAU,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc;QACjE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACA,CAAA;AAC1B,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC1D,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACtD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtD,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChD,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC1C,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;YACpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YAChD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;YAE7D,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YAChD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;YAEnD,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YAChD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAA;YAE3D,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEvE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YAChD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxD,2BAA2B;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;YAC7B,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YAC5C,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;YAChD,MAAM,CAAC,MAAO,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,MAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC5C,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CACZ,kBAAkB,CAAC;gBACjB,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,CAAC;aACvE,CAAC,CACH,CACF,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEvE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CACZ,kBAAkB,CAAC;gBACjB,WAAW,CAAC;oBACV,OAAO,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE;iBAC/D,CAAC;aACH,CAAC,CACH,CACF,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CACZ,kBAAkB,CAAC;gBACjB,WAAW,CAAC;oBACV,OAAO,EAAE,SAAS;iBACnB,CAAC;aACH,CAAC,CACH,CACF,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CACZ,kBAAkB,CAAC;gBACjB,WAAW,CAAC;oBACV,iBAAiB,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;iBAC5C,CAAC;aACH,CAAC,CACH,CACF,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CACZ,kBAAkB,CAAC;gBACjB,WAAW,CAAC;oBACV,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACvC,CAAC;aACH,CAAC,CACH,CACF,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;YACtC,MAAM,CAAC,MAAO,CAAC,QAAS,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACnD,MAAM,CAAC,MAAO,CAAC,QAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAEnD,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAC5F,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAEnD,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAC5F,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,sEAAsE;YACtE,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;YAEpD,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAC5F,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,4EAA4E;YAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAEnD,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAC5F,CAAA;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,sCAAsC,CAAC,CAAA;YAEnF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;gBAChC,YAAY,EAAE,WAAW;gBACzB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;aACjE,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;YACjD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YAChD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBAC3C,IAAI,EAAE,oBAAoB;gBAC1B,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;aAC3B,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAA;YACjE,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAC7B,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;YAEhC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAE7E,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAC/C,MAAM,CAAC,MAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;gBAChC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;aACzB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAA;YAEvD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,kEAAkE;YAClE,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACtD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAA;YAEvD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzC,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;YACzB,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC,EAAE,KAAK,CAAC,CAAA;QAET,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;YACpD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS;iBACN,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;iBACjD,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;YAEpD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,2EAA2E;YAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;YACpD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS;iBACN,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;iBAC7C,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAE7E,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;YACpD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS;iBACN,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;iBAC7C,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAE7E,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;YAC7D,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,MAAM,WAAW,GAAG,sCAAsC,CAAA;YAC1D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;gBAChC,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW;aAChC,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YACtC,kDAAkD;YAClD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;YACrC,sCAAsC;YACtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;YACvF,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;YAC/D,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;YAClE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;YAClE,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACzC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAgB,CAAA;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiC,CAAA;YACzD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;YAC9D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;YACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;YAE7B,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEpC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACzC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAgB,CAAA;YAC3C,qEAAqE;YACrE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAA;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the Wikipedia source.
|
|
3
|
+
*
|
|
4
|
+
* Mocks `wtf_wikipedia` to avoid real API calls.
|
|
5
|
+
* Tests article fetching, section filtering, disambiguation handling,
|
|
6
|
+
* confidence calculation, and the factory function.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=wikipedia.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikipedia.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/structured/wikipedia.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|