open-local-audit 0.67.0 → 0.68.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.
@@ -0,0 +1,400 @@
1
+ import { lookup as dnsLookup } from "node:dns/promises";
2
+ import http from "node:http";
3
+ import https from "node:https";
4
+ import { createRequire } from "node:module";
5
+ import { isIP } from "node:net";
6
+ import { load } from "cheerio";
7
+ import { extractPublicContact } from "./contact.js";
8
+ const USER_AGENT = "open-local-audit/0.1 (+https://github.com/Esquetta/open-local-audit)";
9
+ const DEFAULT_TIMEOUT_MS = 10_000;
10
+ const MAX_HTML_BYTES = 1_048_576;
11
+ const MAX_REDIRECTS = 3;
12
+ const require = createRequire(import.meta.url);
13
+ const robotsParser = require("robots-parser");
14
+ class BlockedError extends Error {
15
+ }
16
+ class TimeoutError extends Error {
17
+ }
18
+ function normalizeHeaders(headers) {
19
+ const output = {};
20
+ headers.forEach((value, key) => {
21
+ output[key] = value;
22
+ });
23
+ return output;
24
+ }
25
+ function sameBusinessHost(first, second) {
26
+ return first.replace(/^www\./i, "").toLowerCase() === second.replace(/^www\./i, "").toLowerCase();
27
+ }
28
+ function isPublicAddress(address) {
29
+ const normalized = address.toLowerCase().split("%")[0] ?? "";
30
+ if (isIP(normalized) === 4) {
31
+ const octets = normalized.split(".").map(Number);
32
+ const [first, second] = octets;
33
+ return !(first === 0 ||
34
+ first === 10 ||
35
+ first === 127 ||
36
+ first >= 224 ||
37
+ (first === 192 && second === 0) ||
38
+ (first === 198 && (second === 18 || second === 19)) ||
39
+ (first === 100 && second >= 64 && second <= 127) ||
40
+ (first === 169 && second === 254) ||
41
+ (first === 172 && second >= 16 && second <= 31) ||
42
+ (first === 192 && second === 168));
43
+ }
44
+ if (isIP(normalized) !== 6) {
45
+ return false;
46
+ }
47
+ // Only native global unicast; exclude mapped/translation/tunnel and documentation ranges.
48
+ return /^[23]/.test(normalized) && !/^2001:(?:0:|db8:)/.test(normalized) && !normalized.startsWith("2002:");
49
+ }
50
+ async function resolvePublicAddresses(hostname, resolve) {
51
+ hostname = hostname.replace(/^\[|\]$/g, "");
52
+ if (hostname.toLowerCase() === "localhost") {
53
+ throw new BlockedError("localhost is not a public website target");
54
+ }
55
+ const addresses = isIP(hostname) ? [hostname] : await resolve(hostname);
56
+ if (addresses.length === 0 || addresses.some((address) => !isPublicAddress(address))) {
57
+ throw new BlockedError("target resolved to a non-public address");
58
+ }
59
+ return addresses;
60
+ }
61
+ async function defaultResolver(hostname) {
62
+ const entries = await dnsLookup(hostname, { all: true, verbatim: true });
63
+ return entries.map((entry) => entry.address);
64
+ }
65
+ function requestWithPinnedLookup(url, addresses, signal) {
66
+ return new Promise((resolve, reject) => {
67
+ const transport = url.protocol === "https:" ? https : http;
68
+ const request = transport.request(url, {
69
+ method: "GET",
70
+ family: isIP(addresses[0]) || 4,
71
+ headers: { "user-agent": USER_AGENT, accept: "text/html,application/xhtml+xml,text/plain;q=0.8,*/*;q=0.1" },
72
+ lookup: (_hostname, _options, callback) => callback(null, addresses[0], isIP(addresses[0]) || 4)
73
+ }, (incoming) => {
74
+ const chunks = [];
75
+ let total = 0;
76
+ incoming.on("data", (chunk) => {
77
+ total += chunk.length;
78
+ if (total > MAX_HTML_BYTES) {
79
+ request.destroy(new Error("response exceeded the maximum allowed size"));
80
+ return;
81
+ }
82
+ chunks.push(chunk);
83
+ });
84
+ incoming.on("error", reject);
85
+ incoming.on("end", () => {
86
+ const headers = new Headers();
87
+ for (const [name, value] of Object.entries(incoming.headers)) {
88
+ if (value !== undefined) {
89
+ headers.set(name, Array.isArray(value) ? value.join(", ") : value);
90
+ }
91
+ }
92
+ const status = incoming.statusCode ?? 500;
93
+ resolve(new Response([204, 205, 304].includes(status) ? null : Buffer.concat(chunks), { status, headers }));
94
+ });
95
+ });
96
+ const abort = () => request.destroy(new TimeoutError("request timed out"));
97
+ signal.addEventListener("abort", abort, { once: true });
98
+ request.on("close", () => signal.removeEventListener("abort", abort));
99
+ request.on("error", reject);
100
+ request.end();
101
+ });
102
+ }
103
+ async function readLimitedText(response) {
104
+ if (!response.body)
105
+ return "";
106
+ const reader = response.body.getReader();
107
+ const chunks = [];
108
+ let length = 0;
109
+ try {
110
+ for (;;) {
111
+ const { value, done } = await reader.read();
112
+ if (done)
113
+ break;
114
+ length += value.length;
115
+ if (length > MAX_HTML_BYTES)
116
+ throw new Error("response exceeded the maximum allowed size");
117
+ chunks.push(value);
118
+ }
119
+ return new TextDecoder().decode(Buffer.concat(chunks));
120
+ }
121
+ finally {
122
+ await reader.cancel();
123
+ }
124
+ }
125
+ function isRedirect(response) {
126
+ return response.status >= 300 && response.status < 400;
127
+ }
128
+ function contactLinks(html, baseUrl, origin, maxCount) {
129
+ const $ = load(html);
130
+ const candidates = [];
131
+ const signal = /contact|contact-us|iletisim|iletişim|kontakt|impressum|about|about-us|über|uber/i;
132
+ for (const anchor of $("a[href]").toArray()) {
133
+ const href = $(anchor).attr("href")?.trim();
134
+ if (!href || /^(mailto:|tel:|javascript:)/i.test(href)) {
135
+ continue;
136
+ }
137
+ const label = `${$(anchor).text()} ${$(anchor).attr("rel") ?? ""} ${href}`;
138
+ if (!signal.test(label)) {
139
+ continue;
140
+ }
141
+ try {
142
+ const candidate = new URL(href, baseUrl);
143
+ candidate.hash = "";
144
+ if (candidate.origin === origin && /^https?:$/.test(candidate.protocol) && !candidate.username && !candidate.password) {
145
+ candidates.push(candidate.toString());
146
+ }
147
+ }
148
+ catch {
149
+ continue;
150
+ }
151
+ }
152
+ return Array.from(new Set(candidates)).slice(0, maxCount);
153
+ }
154
+ function normalizeEmail(value) {
155
+ if (typeof value !== "string") {
156
+ return undefined;
157
+ }
158
+ const email = value.trim().replace(/^mailto:/i, "").split("?")[0]?.toLowerCase();
159
+ return email && /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i.test(email) ? email : undefined;
160
+ }
161
+ function normalizePhone(value) {
162
+ if (typeof value !== "string") {
163
+ return undefined;
164
+ }
165
+ const phone = value.trim().replace(/^tel:/i, "").replace(/[^\d+]/g, "");
166
+ return phone.replace(/\D/g, "").length >= 7 ? phone : undefined;
167
+ }
168
+ function socialProfile(value) {
169
+ if (typeof value !== "string") {
170
+ return undefined;
171
+ }
172
+ try {
173
+ const url = new URL(value);
174
+ const host = url.hostname.replace(/^www\./i, "").toLowerCase();
175
+ return ["facebook.com", "instagram.com", "linkedin.com", "x.com", "twitter.com", "tiktok.com", "youtube.com"].some((name) => host === name || host.endsWith(`.${name}`)) ? url.toString() : undefined;
176
+ }
177
+ catch {
178
+ return undefined;
179
+ }
180
+ }
181
+ function extractSchemaContact(html) {
182
+ const $ = load(html);
183
+ const emails = [];
184
+ const phones = [];
185
+ const socials = [];
186
+ const visit = (value) => {
187
+ if (Array.isArray(value)) {
188
+ value.forEach(visit);
189
+ return;
190
+ }
191
+ if (!value || typeof value !== "object") {
192
+ return;
193
+ }
194
+ const record = value;
195
+ const email = normalizeEmail(record.email);
196
+ const phone = normalizePhone(record.telephone);
197
+ if (email)
198
+ emails.push(email);
199
+ if (phone)
200
+ phones.push(phone);
201
+ const sameAs = Array.isArray(record.sameAs) ? record.sameAs : [record.sameAs];
202
+ sameAs.map(socialProfile).filter((url) => Boolean(url)).forEach((url) => socials.push(url));
203
+ visit(record.contactPoint);
204
+ visit(record["@graph"]);
205
+ };
206
+ for (const script of $("script[type='application/ld+json']").toArray()) {
207
+ try {
208
+ visit(JSON.parse($(script).text()));
209
+ }
210
+ catch {
211
+ continue;
212
+ }
213
+ }
214
+ return { publicEmail: emails[0], publicPhone: phones[0], socialProfiles: Array.from(new Set(socials)) };
215
+ }
216
+ function mergeContacts(entries) {
217
+ const populated = entries.filter(({ contact }) => contact.publicEmail || contact.publicPhone || contact.whatsappUrl || contact.contactPageUrl || contact.socialProfiles.length > 0);
218
+ if (populated.length === 0) {
219
+ return undefined;
220
+ }
221
+ const first = (key) => populated.map(({ contact }) => contact[key]).find(Boolean);
222
+ const socialProfiles = Array.from(new Set(populated.flatMap(({ contact }) => contact.socialProfiles)));
223
+ const channelCount = [first("publicEmail"), first("publicPhone"), first("whatsappUrl"), first("contactPageUrl"), ...socialProfiles].filter(Boolean).length;
224
+ const publicEmail = first("publicEmail");
225
+ const publicPhone = first("publicPhone");
226
+ return {
227
+ publicEmail,
228
+ publicPhone,
229
+ whatsappUrl: first("whatsappUrl"),
230
+ contactPageUrl: first("contactPageUrl"),
231
+ socialProfiles,
232
+ contactConfidence: publicEmail && publicPhone || channelCount >= 3 ? "High" : "Medium",
233
+ contactSource: populated.map(({ pageUrl }) => pageUrl).join(", ")
234
+ };
235
+ }
236
+ function combinePageContact(html, pageUrl) {
237
+ const contact = extractPublicContact(html, pageUrl);
238
+ const schema = extractSchemaContact(html);
239
+ return {
240
+ ...contact,
241
+ publicEmail: contact.publicEmail ?? schema.publicEmail,
242
+ publicPhone: contact.publicPhone ?? schema.publicPhone,
243
+ socialProfiles: Array.from(new Set([...contact.socialProfiles, ...schema.socialProfiles]))
244
+ };
245
+ }
246
+ export async function enrichWebsite(url, options = {}) {
247
+ const startedAt = Date.now();
248
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
249
+ const maxPages = Math.max(1, Math.min(options.maxPages ?? 3, 3));
250
+ const resolve = options.resolve ?? defaultResolver;
251
+ const robotsRules = new Map();
252
+ const warnings = [];
253
+ const sourceUrls = [];
254
+ let pagesFetched = 0;
255
+ const finish = (status, values = {}) => ({
256
+ status,
257
+ ...values,
258
+ sourceUrls,
259
+ pagesFetched,
260
+ ...(warnings.length ? { warnings } : {}),
261
+ durationMs: Date.now() - startedAt
262
+ });
263
+ const remainingMs = () => {
264
+ const remaining = timeoutMs - (Date.now() - startedAt);
265
+ if (remaining <= 0)
266
+ throw new TimeoutError("operation timed out");
267
+ return remaining;
268
+ };
269
+ const request = async (target) => {
270
+ const controller = new AbortController();
271
+ const requestTimeout = remainingMs();
272
+ const timer = setTimeout(() => controller.abort(), requestTimeout);
273
+ let raceTimer;
274
+ try {
275
+ const operation = (async () => {
276
+ const addresses = await resolvePublicAddresses(target.hostname, resolve);
277
+ if (controller.signal.aborted)
278
+ throw new TimeoutError("request timed out");
279
+ const response = options.fetch
280
+ ? await options.fetch(target.toString(), { redirect: "manual", signal: controller.signal, headers: { "user-agent": USER_AGENT } })
281
+ : await requestWithPinnedLookup(target, addresses, controller.signal);
282
+ const body = await readLimitedText(response);
283
+ return new Response([204, 205, 304].includes(response.status) ? null : body, { status: response.status, headers: response.headers });
284
+ })();
285
+ return await Promise.race([
286
+ operation,
287
+ new Promise((_resolve, reject) => {
288
+ raceTimer = setTimeout(() => reject(new TimeoutError("request timed out")), requestTimeout);
289
+ })
290
+ ]);
291
+ }
292
+ finally {
293
+ clearTimeout(timer);
294
+ if (raceTimer)
295
+ clearTimeout(raceTimer);
296
+ }
297
+ };
298
+ const allowedByRobots = async (target) => {
299
+ const cacheKey = target.origin;
300
+ const cached = robotsRules.get(cacheKey);
301
+ if (cached) {
302
+ if (cached.isAllowed(target.toString(), USER_AGENT) === false)
303
+ throw new BlockedError("robots.txt disallows this URL");
304
+ return;
305
+ }
306
+ let robotsUrl = new URL("/robots.txt", target.origin);
307
+ let response;
308
+ try {
309
+ response = await request(robotsUrl);
310
+ for (let count = 0; isRedirect(response) && count < MAX_REDIRECTS; count++) {
311
+ const location = response.headers.get("location");
312
+ if (!location)
313
+ break;
314
+ const next = new URL(location, robotsUrl);
315
+ if (!/^https?:$/.test(next.protocol) || next.username || next.password || !sameBusinessHost(target.hostname, next.hostname))
316
+ throw new BlockedError("robots redirect left the business website");
317
+ robotsUrl = next;
318
+ response = await request(robotsUrl);
319
+ }
320
+ }
321
+ catch (error) {
322
+ if (error instanceof BlockedError)
323
+ throw error;
324
+ if (error instanceof TimeoutError)
325
+ throw error;
326
+ throw new BlockedError("robots.txt could not be reached");
327
+ }
328
+ if (response.status === 404) {
329
+ robotsRules.set(cacheKey, robotsParser(new URL("/robots.txt", target.origin).toString(), ""));
330
+ return;
331
+ }
332
+ if (response.status === 403 || response.status < 200 || response.status >= 300) {
333
+ throw new BlockedError("robots.txt did not permit crawling");
334
+ }
335
+ const policy = robotsParser(new URL("/robots.txt", target.origin).toString(), await readLimitedText(response));
336
+ robotsRules.set(cacheKey, policy);
337
+ if (policy.isAllowed(target.toString(), USER_AGENT) === false) {
338
+ throw new BlockedError("robots.txt disallows this URL");
339
+ }
340
+ };
341
+ const fetchPage = async (requestedUrl, homepageHost) => {
342
+ let current = new URL(requestedUrl);
343
+ for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects += 1) {
344
+ if (!/^https?:$/.test(current.protocol) || current.username || current.password || !sameBusinessHost(homepageHost, current.hostname)) {
345
+ throw new BlockedError("redirect left the business website");
346
+ }
347
+ await allowedByRobots(current);
348
+ const response = await request(current);
349
+ if (isRedirect(response)) {
350
+ const location = response.headers.get("location");
351
+ if (!location)
352
+ throw new Error("redirect response had no location");
353
+ current = new URL(location, current);
354
+ continue;
355
+ }
356
+ if (response.status === 403)
357
+ throw new BlockedError("website denied the request");
358
+ if (response.status === 429)
359
+ throw new Error("website rate limited the request");
360
+ if (!response.ok)
361
+ throw new Error(`website returned HTTP ${response.status}`);
362
+ const contentType = response.headers.get("content-type")?.toLowerCase();
363
+ if (contentType && !contentType.includes("text/html") && !contentType.includes("application/xhtml+xml")) {
364
+ throw new Error("website response was not HTML");
365
+ }
366
+ const html = await readLimitedText(response);
367
+ pagesFetched += 1;
368
+ if (!sourceUrls.includes(current.toString()))
369
+ sourceUrls.push(current.toString());
370
+ return { url: requestedUrl, finalUrl: current.toString(), statusCode: response.status, headers: normalizeHeaders(response.headers), html };
371
+ }
372
+ throw new Error(`exceeded redirect limit of ${MAX_REDIRECTS}`);
373
+ };
374
+ try {
375
+ const initial = new URL(url);
376
+ if (!/^https?:$/.test(initial.protocol) || initial.username || initial.password) {
377
+ throw new BlockedError("only public HTTP(S) URLs are allowed");
378
+ }
379
+ const homepage = await fetchPage(initial.toString(), initial.hostname);
380
+ const contactEntries = [{ contact: combinePageContact(homepage.html, homepage.finalUrl), pageUrl: homepage.finalUrl }];
381
+ const followUps = contactLinks(homepage.html, homepage.finalUrl, new URL(homepage.finalUrl).origin, maxPages - 1);
382
+ for (const followUp of followUps) {
383
+ try {
384
+ const page = await fetchPage(followUp, initial.hostname);
385
+ contactEntries.push({ contact: combinePageContact(page.html, page.finalUrl), pageUrl: page.finalUrl });
386
+ }
387
+ catch (error) {
388
+ warnings.push(`${followUp}: ${error instanceof Error ? error.message : "could not read page"}`);
389
+ break;
390
+ }
391
+ }
392
+ return finish("success", { snapshot: homepage, contact: mergeContacts(contactEntries) });
393
+ }
394
+ catch (error) {
395
+ if (error instanceof BlockedError)
396
+ return finish("blocked", { error: error.message });
397
+ return finish("failed", { error: error instanceof Error ? error.message : "website enrichment failed" });
398
+ }
399
+ }
400
+ //# sourceMappingURL=website-enrichment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-enrichment.js","sourceRoot":"","sources":["../src/website-enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,UAAU,GAAG,sEAAsE,CAAC;AAC1F,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAA2G,CAAC;AAuBxJ,MAAM,YAAa,SAAQ,KAAK;CAAG;AAEnC,MAAM,YAAa,SAAQ,KAAK;CAAG;AAEnC,SAAS,gBAAgB,CAAC,OAAgB;IACxC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAAc;IACrD,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;QAC/B,OAAO,CAAC,CACN,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,EAAE;YACZ,KAAK,KAAK,GAAG;YACb,KAAK,IAAI,GAAG;YACZ,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC,CAAC;YAC/B,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,GAAG,CAAC;YAChD,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;YACjC,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,CAAC;YAC/C,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAClC,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0FAA0F;IAC1F,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC9G,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,QAAgB,EAAE,OAAiB;IACvE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,YAAY,CAAC,0CAA0C,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,YAAY,CAAC,yCAAyC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAQ,EAAE,SAAmB,EAAE,MAAmB;IACjF,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAC/B,GAAG,EACH;YACE,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAChC,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,4DAA4D,EAAE;YAC3G,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;SACnG,EACD,CAAC,QAAQ,EAAE,EAAE;YACX,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACpC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBACtB,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;oBAC3B,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;oBACzE,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACtB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC;gBACD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC;gBAC1C,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9G,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAkB;IAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACvB,IAAI,MAAM,GAAG,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC3F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB;IACpC,OAAO,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,QAAgB;IACnF,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,kFAAkF,CAAC;IAElG,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACtH,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACjF,OAAO,KAAK,IAAI,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/D,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxM,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,KAAc,EAAQ,EAAE;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3G,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,oCAAoC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AAC1G,CAAC;AAED,SAAS,aAAa,CAAC,OAA2D;IAChF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpL,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,CAAgC,GAAM,EAAgC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClJ,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACvG,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3J,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAuB,CAAC;IAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAuB,CAAC;IAC/D,OAAO;QACL,WAAW;QACX,WAAW;QACX,WAAW,EAAE,KAAK,CAAC,aAAa,CAAuB;QACvD,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAuB;QAC7D,cAAc;QACd,iBAAiB,EAAE,WAAW,IAAI,WAAW,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QACtF,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAe;IACvD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO;QACL,GAAG,OAAO;QACV,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW;QACtD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW;QACtD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,UAAoC,EAAE;IACrF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2C,CAAC;IACvE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,MAAyC,EAAE,SAAiG,EAAE,EAA2B,EAAE,CAAC,CAAC;QAC3L,MAAM;QACN,GAAG,MAAM;QACT,UAAU;QACV,YAAY;QACZ,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACnC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,GAAW,EAAE;QAC/B,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACvD,IAAI,SAAS,IAAI,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,EAAE,MAAW,EAAqB,EAAE;QACvD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,cAAc,CAAC,CAAC;QACnE,IAAI,SAAoD,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC5B,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACzE,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK;oBAC5B,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC;oBAClI,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBACxE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC7C,OAAO,IAAI,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACvI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;gBACxB,SAAS;gBACT,IAAI,OAAO,CAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;oBACzC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC9F,CAAC,CAAC;aACH,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,KAAK,EAAE,MAAW,EAAiB,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,KAAK,KAAK;gBAAE,MAAM,IAAI,YAAY,CAAC,+BAA+B,CAAC,CAAC;YACvH,OAAO;QACT,CAAC;QACD,IAAI,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;YACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,aAAa,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ;oBAAE,MAAM;gBACrB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;oBAAE,MAAM,IAAI,YAAY,CAAC,2CAA2C,CAAC,CAAC;gBACjM,SAAS,GAAG,IAAI,CAAC;gBACjB,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY;gBAAE,MAAM,KAAK,CAAC;YAC/C,IAAI,KAAK,YAAY,YAAY;gBAAE,MAAM,KAAK,CAAC;YAC/C,MAAM,IAAI,YAAY,CAAC,iCAAiC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC/E,MAAM,IAAI,YAAY,CAAC,oCAAoC,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/G,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;YAC9D,MAAM,IAAI,YAAY,CAAC,+BAA+B,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,KAAK,EAAE,YAAoB,EAAE,YAAoB,EAAyB,EAAE;QAC5F,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACpC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,aAAa,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrI,MAAM,IAAI,YAAY,CAAC,oCAAoC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACpE,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrC,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,YAAY,CAAC,4BAA4B,CAAC,CAAC;YAClF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACjF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;YACxE,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACxG,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC7C,YAAY,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7I,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,aAAa,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAChF,MAAM,IAAI,YAAY,CAAC,sCAAsC,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvH,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClH,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzD,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;gBAChG,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,YAAY;YAAE,OAAO,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,OAAO,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC"}
@@ -41,6 +41,33 @@ declare const workflowConfigSchema: z.ZodObject<{
41
41
  concurrency?: number | undefined;
42
42
  limit?: number | undefined;
43
43
  maxAudits?: number | undefined;
44
+ }>, z.ZodObject<{
45
+ concurrency: z.ZodDefault<z.ZodNumber>;
46
+ limit: z.ZodDefault<z.ZodNumber>;
47
+ profile: z.ZodDefault<z.ZodEnum<["generic", "dental", "beauty", "restaurant", "contractor", "lawyer", "clinic", "gym", "hotel", "auto-service"]>>;
48
+ maxAudits: z.ZodOptional<z.ZodNumber>;
49
+ provider: z.ZodLiteral<"overture">;
50
+ query: z.ZodString;
51
+ bbox: z.ZodEffects<z.ZodString, string, string>;
52
+ release: z.ZodOptional<z.ZodString>;
53
+ }, "strict", z.ZodTypeAny, {
54
+ profile: "generic" | "dental" | "beauty" | "restaurant" | "contractor" | "lawyer" | "clinic" | "gym" | "hotel" | "auto-service";
55
+ concurrency: number;
56
+ provider: "overture";
57
+ bbox: string;
58
+ limit: number;
59
+ query: string;
60
+ release?: string | undefined;
61
+ maxAudits?: number | undefined;
62
+ }, {
63
+ provider: "overture";
64
+ bbox: string;
65
+ query: string;
66
+ profile?: "generic" | "dental" | "beauty" | "restaurant" | "contractor" | "lawyer" | "clinic" | "gym" | "hotel" | "auto-service" | undefined;
67
+ concurrency?: number | undefined;
68
+ release?: string | undefined;
69
+ limit?: number | undefined;
70
+ maxAudits?: number | undefined;
44
71
  }>]>;
45
72
  shortlist: z.ZodObject<{
46
73
  top: z.ZodDefault<z.ZodNumber>;
@@ -145,6 +172,15 @@ declare const workflowConfigSchema: z.ZodObject<{
145
172
  limit: number;
146
173
  query: string;
147
174
  maxAudits?: number | undefined;
175
+ } | {
176
+ profile: "generic" | "dental" | "beauty" | "restaurant" | "contractor" | "lawyer" | "clinic" | "gym" | "hotel" | "auto-service";
177
+ concurrency: number;
178
+ provider: "overture";
179
+ bbox: string;
180
+ limit: number;
181
+ query: string;
182
+ release?: string | undefined;
183
+ maxAudits?: number | undefined;
148
184
  };
149
185
  shortlist: {
150
186
  sort: "opportunity-desc" | "score-desc" | "company-asc" | "last-reviewed-asc" | "contact-confidence-desc" | "priority-desc" | "source-asc";
@@ -193,6 +229,15 @@ declare const workflowConfigSchema: z.ZodObject<{
193
229
  concurrency?: number | undefined;
194
230
  limit?: number | undefined;
195
231
  maxAudits?: number | undefined;
232
+ } | {
233
+ provider: "overture";
234
+ bbox: string;
235
+ query: string;
236
+ profile?: "generic" | "dental" | "beauty" | "restaurant" | "contractor" | "lawyer" | "clinic" | "gym" | "hotel" | "auto-service" | undefined;
237
+ concurrency?: number | undefined;
238
+ release?: string | undefined;
239
+ limit?: number | undefined;
240
+ maxAudits?: number | undefined;
196
241
  };
197
242
  shortlist: {
198
243
  profile?: string | undefined;
@@ -245,7 +290,7 @@ export type ResolvedWorkflowConfig = Omit<ParsedWorkflowConfig, "outDir" | "disc
245
290
  }> & {
246
291
  input: string;
247
292
  }) | Extract<ParsedWorkflowConfig["discovery"], {
248
- provider: "google-places";
293
+ provider: "google-places" | "overture";
249
294
  }>;
250
295
  review?: ParsedWorkflowConfig["review"] & {
251
296
  csv: string;
@@ -3,6 +3,7 @@ import { readFile } from "node:fs/promises";
3
3
  import { dirname, join, resolve } from "node:path";
4
4
  import { z } from "zod";
5
5
  import { auditProfileSchema } from "./schema.js";
6
+ import { parseDiscoveryBbox } from "./discovery-location.js";
6
7
  const nonblankStringSchema = z.string().trim().min(1);
7
8
  const discoveryDefaults = {
8
9
  profile: auditProfileSchema.default("generic"),
@@ -24,6 +25,21 @@ const googleDiscoverySchema = z
24
25
  limit: z.number().int().positive().max(50).default(10)
25
26
  })
26
27
  .strict();
28
+ const overtureDiscoverySchema = z.object({
29
+ provider: z.literal("overture"),
30
+ query: nonblankStringSchema.regex(/^[a-z][a-z0-9_]{0,80}$/i, "Expected an Overture category identifier"),
31
+ bbox: nonblankStringSchema.refine((value) => { try {
32
+ parseDiscoveryBbox(value);
33
+ return true;
34
+ }
35
+ catch {
36
+ return false;
37
+ } }, "Expected valid west,south,east,north bounds"),
38
+ release: z.string().regex(/^\d{4}-\d{2}-\d{2}\.\d+$/).optional(),
39
+ ...discoveryDefaults,
40
+ concurrency: z.number().int().min(1).max(8).default(1),
41
+ limit: z.number().int().positive().max(100).default(10)
42
+ }).strict();
27
43
  const calendarDateSchema = z.string().refine((value) => {
28
44
  if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
29
45
  return false;
@@ -80,7 +96,7 @@ const workflowConfigSchema = z
80
96
  .object({
81
97
  version: z.literal(1),
82
98
  outDir: nonblankStringSchema,
83
- discovery: z.discriminatedUnion("provider", [manualDiscoverySchema, googleDiscoverySchema]),
99
+ discovery: z.discriminatedUnion("provider", [manualDiscoverySchema, googleDiscoverySchema, overtureDiscoverySchema]),
84
100
  shortlist: shortlistSchema,
85
101
  review: reviewSchema.optional(),
86
102
  packageReports: z.boolean().default(false)
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../src/workflow-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../src/workflow-config.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import type { ResolvedWorkflowConfig } from "./workflow-config.js";
3
3
  export type WorkflowPlanStatus = WorkflowPreflightStatus;
4
4
  export type WorkflowPlanStepId = "discovery" | "shortlist" | "review" | "packaging" | "summary";
5
5
  export type WorkflowPlanStepState = "will-run" | "conditional" | "disabled";
6
- export type WorkflowPlanNetworkAccess = "google-places" | "website-audits";
6
+ export type WorkflowPlanNetworkAccess = "google-places" | "website-audits" | "overture";
7
7
  export type WorkflowPlanArtifactId = "manual-input-csv" | "review-csv" | "leads-csv" | "discovery-summary-json" | "reports-dir" | "shortlist-csv" | "shortlist-summary-json" | "review-summary-json" | "packages-dir" | "workflow-summary-json";
8
8
  interface WorkflowPlanStepBase<Id extends WorkflowPlanStepId, State extends WorkflowPlanStepState, Settings> {
9
9
  id: Id;
@@ -35,6 +35,7 @@ function buildPlan(evaluation) {
35
35
  const packagingEnabled = config.packageReports;
36
36
  const discoveryNetworkAccess = [
37
37
  ...(config.discovery.provider === "google-places" ? ["google-places"] : []),
38
+ ...(config.discovery.provider === "overture" ? ["overture"] : []),
38
39
  ...(config.discovery.maxAudits === 0 ? [] : ["website-audits"])
39
40
  ];
40
41
  const summaryDependency = packagingEnabled ? "packaging" : reviewEnabled ? "review" : "shortlist";
@@ -58,7 +59,7 @@ function buildPlan(evaluation) {
58
59
  provider: config.discovery.provider,
59
60
  profile: config.discovery.profile,
60
61
  concurrency: config.discovery.concurrency,
61
- maxCandidates: config.discovery.provider === "google-places" ? config.discovery.limit : null,
62
+ maxCandidates: config.discovery.provider !== "manual-csv" ? config.discovery.limit : null,
62
63
  maxAudits: config.discovery.maxAudits ?? null
63
64
  }
64
65
  },
@@ -154,6 +155,8 @@ function renderNetworkCapabilities(step) {
154
155
  if (access === "google-places") {
155
156
  return "Google Places";
156
157
  }
158
+ if (access === "overture")
159
+ return "Overture open data (no API key)";
157
160
  return step.id !== "discovery" || step.settings.maxAudits === null
158
161
  ? "website audits (no configured cap)"
159
162
  : `website audits (up to ${step.settings.maxAudits})`;