@youdie006/prodex 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +418 -0
- package/dist/banner.d.ts +5 -0
- package/dist/banner.js +47 -0
- package/dist/banner.js.map +1 -0
- package/dist/bundle.d.ts +15 -0
- package/dist/bundle.js +30 -0
- package/dist/bundle.js.map +1 -0
- package/dist/chatgpt-browser.d.ts +119 -0
- package/dist/chatgpt-browser.js +857 -0
- package/dist/chatgpt-browser.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +3502 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.js +277 -0
- package/dist/config.js.map +1 -0
- package/dist/http-mcp.d.ts +20 -0
- package/dist/http-mcp.js +236 -0
- package/dist/http-mcp.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +395 -0
- package/dist/mcp-tools.js +167 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/mcp.d.ts +37 -0
- package/dist/mcp.js +229 -0
- package/dist/mcp.js.map +1 -0
- package/dist/repo-write.d.ts +47 -0
- package/dist/repo-write.js +427 -0
- package/dist/repo-write.js.map +1 -0
- package/dist/repo.d.ts +27 -0
- package/dist/repo.js +386 -0
- package/dist/repo.js.map +1 -0
- package/dist/safe-file.d.ts +25 -0
- package/dist/safe-file.js +295 -0
- package/dist/safe-file.js.map +1 -0
- package/dist/schema.d.ts +402 -0
- package/dist/schema.js +109 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +157 -0
- package/dist/store.js +1402 -0
- package/dist/store.js.map +1 -0
- package/docs/claude.md +130 -0
- package/docs/clients.md +75 -0
- package/docs/http-mcp.md +223 -0
- package/package.json +67 -0
- package/scripts/release-check.mjs +436 -0
- package/scripts/release-pack.mjs +481 -0
package/dist/repo.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { lstat, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { readVerifiedUtf8File } from "./safe-file.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
const MAX_REPO_READ_BYTES = 1_000_000;
|
|
8
|
+
const MAX_REPO_SEARCH_MATCHES = 100;
|
|
9
|
+
const MAX_GLOB_BRACE_EXPANSIONS = 64;
|
|
10
|
+
const MAX_GLOB_BRACE_DEPTH = 8;
|
|
11
|
+
const ENV_LIKE_GLOB_PROBES = [".env", ".envrc", ".env.local", ".envoy"];
|
|
12
|
+
export function assertRepoRelativePath(repoPath) {
|
|
13
|
+
if (!repoPath || repoPath.trim() === "") {
|
|
14
|
+
throw new Error("Path must be a non-empty repo-relative path");
|
|
15
|
+
}
|
|
16
|
+
if (path.isAbsolute(repoPath)) {
|
|
17
|
+
throw new Error("Path must be repo-relative, not absolute");
|
|
18
|
+
}
|
|
19
|
+
const normalized = path.posix.normalize(repoPath.replaceAll("\\", "/"));
|
|
20
|
+
if (normalized === "." || normalized.startsWith("../") || normalized === "..") {
|
|
21
|
+
throw new Error("Path must stay inside the repo-relative root");
|
|
22
|
+
}
|
|
23
|
+
assertNotSensitiveRepoPath(normalized);
|
|
24
|
+
}
|
|
25
|
+
export function resolveRepoPath(root, repoPath) {
|
|
26
|
+
assertRepoRelativePath(repoPath);
|
|
27
|
+
const resolved = path.resolve(root, repoPath);
|
|
28
|
+
const relative = path.relative(root, resolved);
|
|
29
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
30
|
+
throw new Error(`Path ${repoPath} escapes the repository root`);
|
|
31
|
+
}
|
|
32
|
+
return resolved;
|
|
33
|
+
}
|
|
34
|
+
export async function readRepoFile(root, repoPath, options = {}) {
|
|
35
|
+
const resolved = resolveRepoPath(root, repoPath);
|
|
36
|
+
await assertResolvedRepoPathAllowed(root, resolved, repoPath);
|
|
37
|
+
const text = await readVerifiedUtf8File(resolved, () => assertResolvedRepoPathAllowed(root, resolved, repoPath), {
|
|
38
|
+
maxBytes: MAX_REPO_READ_BYTES
|
|
39
|
+
}).catch((error) => {
|
|
40
|
+
if (error instanceof Error && /too large/.test(error.message)) {
|
|
41
|
+
throw new Error(`Path ${repoPath} is too large to read through repo tools`);
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
});
|
|
45
|
+
const lines = text.replace(/\r\n/g, "\n").split("\n");
|
|
46
|
+
if (lines.at(-1) === "")
|
|
47
|
+
lines.pop();
|
|
48
|
+
const startLine = Math.max(1, options.startLine ?? 1);
|
|
49
|
+
const maxLines = Math.max(1, Math.min(options.maxLines ?? 200, 500));
|
|
50
|
+
if (startLine > Math.max(1, lines.length)) {
|
|
51
|
+
throw new Error(`start_line ${startLine} is beyond the end of ${repoPath} (${lines.length} ${lines.length === 1 ? "line" : "lines"})`);
|
|
52
|
+
}
|
|
53
|
+
const selected = lines.slice(startLine - 1, startLine - 1 + maxLines);
|
|
54
|
+
const endLine = selected.length > 0 ? startLine + selected.length - 1 : startLine;
|
|
55
|
+
return {
|
|
56
|
+
path: repoPath,
|
|
57
|
+
start_line: startLine,
|
|
58
|
+
end_line: endLine,
|
|
59
|
+
total_lines: lines.length,
|
|
60
|
+
content: selected.join("\n")
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function searchRepo(root, query, glob) {
|
|
64
|
+
return (await searchRepoWithMetadata(root, query, glob)).matches;
|
|
65
|
+
}
|
|
66
|
+
export async function searchRepoWithMetadata(root, query, glob) {
|
|
67
|
+
if (!query.trim()) {
|
|
68
|
+
throw new Error("Search query must not be empty");
|
|
69
|
+
}
|
|
70
|
+
if (glob) {
|
|
71
|
+
assertRepoRelativeGlob(glob);
|
|
72
|
+
}
|
|
73
|
+
const args = [
|
|
74
|
+
"--no-config",
|
|
75
|
+
"--no-follow",
|
|
76
|
+
"--json",
|
|
77
|
+
...(glob ? ["--glob", glob] : []),
|
|
78
|
+
"--glob",
|
|
79
|
+
"!.bridge/**",
|
|
80
|
+
"--glob",
|
|
81
|
+
"!**/.bridge/**",
|
|
82
|
+
"--glob",
|
|
83
|
+
"!.git/**",
|
|
84
|
+
"--glob",
|
|
85
|
+
"!**/.git/**",
|
|
86
|
+
"--glob",
|
|
87
|
+
"!.env*",
|
|
88
|
+
"--glob",
|
|
89
|
+
"!**/.env*",
|
|
90
|
+
"--glob",
|
|
91
|
+
"!node_modules/**",
|
|
92
|
+
"--glob",
|
|
93
|
+
"!**/node_modules/**",
|
|
94
|
+
"--glob",
|
|
95
|
+
"!dist/**",
|
|
96
|
+
"--glob",
|
|
97
|
+
"!**/dist/**",
|
|
98
|
+
"-e",
|
|
99
|
+
query
|
|
100
|
+
];
|
|
101
|
+
args.push(".");
|
|
102
|
+
try {
|
|
103
|
+
const { stdout } = await execFileAsync("rg", args, {
|
|
104
|
+
cwd: root,
|
|
105
|
+
timeout: 10_000,
|
|
106
|
+
maxBuffer: 1024 * 1024
|
|
107
|
+
});
|
|
108
|
+
const parsedMatches = stdout
|
|
109
|
+
.split("\n")
|
|
110
|
+
.filter(Boolean)
|
|
111
|
+
.map(parseRipgrepJsonMatch)
|
|
112
|
+
.filter((match) => match !== undefined);
|
|
113
|
+
const allowedMatches = [];
|
|
114
|
+
let truncated = false;
|
|
115
|
+
for (const match of parsedMatches) {
|
|
116
|
+
if (await isAllowedRepoSearchResult(root, match.path)) {
|
|
117
|
+
if (allowedMatches.length >= MAX_REPO_SEARCH_MATCHES) {
|
|
118
|
+
truncated = true;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
allowedMatches.push(match);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { matches: allowedMatches, truncated, limit: MAX_REPO_SEARCH_MATCHES };
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const maybe = error;
|
|
128
|
+
if (maybe.code === "ENOENT") {
|
|
129
|
+
throw new Error("ripgrep (rg) is required on PATH for repo_search");
|
|
130
|
+
}
|
|
131
|
+
if (isSearchOutputTooLarge(error)) {
|
|
132
|
+
throw new Error("repo_search returned too many matches; narrow the query or glob and try again");
|
|
133
|
+
}
|
|
134
|
+
if (maybe.code === 1)
|
|
135
|
+
return { matches: [], truncated: false, limit: MAX_REPO_SEARCH_MATCHES };
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function parseRipgrepJsonMatch(line) {
|
|
140
|
+
let event;
|
|
141
|
+
try {
|
|
142
|
+
event = JSON.parse(line);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
if (!isRipgrepJsonMatch(event))
|
|
148
|
+
return undefined;
|
|
149
|
+
return {
|
|
150
|
+
path: event.data.path.text.replace(/^\.\//, ""),
|
|
151
|
+
line: event.data.line_number,
|
|
152
|
+
text: stripOneTrailingLineEnding(event.data.lines.text)
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function isRipgrepJsonMatch(value) {
|
|
156
|
+
if (!isRecord(value) || value.type !== "match" || !isRecord(value.data))
|
|
157
|
+
return false;
|
|
158
|
+
const { path: matchPath, line_number: lineNumber, lines } = value.data;
|
|
159
|
+
return (isRecord(matchPath) &&
|
|
160
|
+
typeof matchPath.text === "string" &&
|
|
161
|
+
typeof lineNumber === "number" &&
|
|
162
|
+
Number.isFinite(lineNumber) &&
|
|
163
|
+
isRecord(lines) &&
|
|
164
|
+
typeof lines.text === "string");
|
|
165
|
+
}
|
|
166
|
+
function isRecord(value) {
|
|
167
|
+
return typeof value === "object" && value !== null;
|
|
168
|
+
}
|
|
169
|
+
function isSearchOutputTooLarge(error) {
|
|
170
|
+
if (typeof error !== "object" || error === null)
|
|
171
|
+
return false;
|
|
172
|
+
const code = error.code;
|
|
173
|
+
const message = error.message;
|
|
174
|
+
return code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER" || (typeof message === "string" && /maxBuffer/i.test(message));
|
|
175
|
+
}
|
|
176
|
+
function stripOneTrailingLineEnding(value) {
|
|
177
|
+
return value.replace(/\r?\n$/, "");
|
|
178
|
+
}
|
|
179
|
+
function assertNotSensitiveRepoPath(normalizedPath) {
|
|
180
|
+
const segments = normalizedPath.split("/");
|
|
181
|
+
if (segments.some(isEnvLikeSegment)) {
|
|
182
|
+
throw new Error(`Path ${normalizedPath} is sensitive and cannot be read through repo tools`);
|
|
183
|
+
}
|
|
184
|
+
if (segments.some(isSensitiveRepoSegment)) {
|
|
185
|
+
throw new Error(`Path ${normalizedPath} is sensitive and cannot be read through repo tools`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function assertRepoRelativeGlob(glob) {
|
|
189
|
+
const normalized = path.posix.normalize(glob.replaceAll("\\", "/").replace(/^!/, ""));
|
|
190
|
+
if (normalized.startsWith("../") || normalized === ".." || path.isAbsolute(normalized)) {
|
|
191
|
+
throw new Error("Glob must stay inside the repo-relative root");
|
|
192
|
+
}
|
|
193
|
+
assertNoSensitiveGlobSegment(normalized);
|
|
194
|
+
const concretePrefix = normalized.replace(/[*?[{].*$/, "").replace(/\/+$/, "");
|
|
195
|
+
if (concretePrefix) {
|
|
196
|
+
assertNotSensitiveRepoPath(concretePrefix);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function assertNoSensitiveGlobSegment(normalizedGlob) {
|
|
200
|
+
const segments = normalizedGlob.split("/").filter(Boolean);
|
|
201
|
+
if (segments.some((segment) => isSensitiveRepoSegment(segment) ||
|
|
202
|
+
isEnvLikeGlobSegment(segment))) {
|
|
203
|
+
throw new Error(`Glob ${normalizedGlob} is sensitive and cannot be used through repo tools`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function isAllowedRepoSearchResult(root, repoPath) {
|
|
207
|
+
try {
|
|
208
|
+
const normalized = path.posix.normalize(repoPath.replaceAll("\\", "/"));
|
|
209
|
+
const resolved = resolveRepoPath(root, normalized);
|
|
210
|
+
await assertResolvedRepoPathAllowed(root, resolved, normalized);
|
|
211
|
+
const stat = await lstat(resolved);
|
|
212
|
+
return stat.isFile() && !stat.isSymbolicLink() && stat.nlink <= 1;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function isSensitiveRepoSegment(segment) {
|
|
219
|
+
const folded = foldSensitiveSegment(segment);
|
|
220
|
+
return folded === ".bridge" || folded === ".git" || folded === "node_modules" || folded === "dist";
|
|
221
|
+
}
|
|
222
|
+
function isEnvLikeSegment(segment) {
|
|
223
|
+
return foldSensitiveSegment(segment).startsWith(".env");
|
|
224
|
+
}
|
|
225
|
+
function isEnvLikeGlobSegment(segment) {
|
|
226
|
+
const variants = expandBraceGlobSegment(segment);
|
|
227
|
+
if (variants === null)
|
|
228
|
+
return true;
|
|
229
|
+
return variants.some(isEnvLikeGlobVariant);
|
|
230
|
+
}
|
|
231
|
+
function isEnvLikeGlobVariant(segment) {
|
|
232
|
+
if (isBroadWildcardOnlyGlobVariant(segment))
|
|
233
|
+
return false;
|
|
234
|
+
const folded = foldSensitiveSegment(segment);
|
|
235
|
+
return ENV_LIKE_GLOB_PROBES.some((probe) => globSegmentMatches(folded, probe));
|
|
236
|
+
}
|
|
237
|
+
function isBroadWildcardOnlyGlobVariant(segment) {
|
|
238
|
+
return /^[*?]+$/.test(segment);
|
|
239
|
+
}
|
|
240
|
+
function globSegmentMatches(pattern, value) {
|
|
241
|
+
const regexSource = globSegmentToRegexSource(pattern);
|
|
242
|
+
if (regexSource === null)
|
|
243
|
+
return true;
|
|
244
|
+
try {
|
|
245
|
+
return new RegExp(`^${regexSource}$`, "u").test(value);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function globSegmentToRegexSource(pattern) {
|
|
252
|
+
let source = "";
|
|
253
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
254
|
+
const char = pattern[index];
|
|
255
|
+
if (char === "*") {
|
|
256
|
+
source += ".*";
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (char === "?") {
|
|
260
|
+
source += ".";
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (char === "[") {
|
|
264
|
+
const charClass = readGlobCharClass(pattern, index);
|
|
265
|
+
if (charClass === null)
|
|
266
|
+
return null;
|
|
267
|
+
source += charClass.source;
|
|
268
|
+
index = charClass.end;
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
source += escapeRegexLiteral(char);
|
|
272
|
+
}
|
|
273
|
+
return source;
|
|
274
|
+
}
|
|
275
|
+
function readGlobCharClass(pattern, start) {
|
|
276
|
+
let end = start + 1;
|
|
277
|
+
if (pattern[end] === "]")
|
|
278
|
+
end += 1;
|
|
279
|
+
while (end < pattern.length && pattern[end] !== "]") {
|
|
280
|
+
end += 1;
|
|
281
|
+
}
|
|
282
|
+
if (end >= pattern.length)
|
|
283
|
+
return null;
|
|
284
|
+
let content = pattern.slice(start + 1, end);
|
|
285
|
+
let negated = "";
|
|
286
|
+
if (content.startsWith("!") || content.startsWith("^")) {
|
|
287
|
+
negated = "^";
|
|
288
|
+
content = content.slice(1);
|
|
289
|
+
}
|
|
290
|
+
if (!content)
|
|
291
|
+
return null;
|
|
292
|
+
const escaped = content.replaceAll("\\", "\\\\").replaceAll("]", "\\]");
|
|
293
|
+
return { source: `[${negated}${escaped}]`, end };
|
|
294
|
+
}
|
|
295
|
+
function escapeRegexLiteral(char) {
|
|
296
|
+
return char.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
|
|
297
|
+
}
|
|
298
|
+
function foldSensitiveSegment(segment) {
|
|
299
|
+
return segment.toLowerCase();
|
|
300
|
+
}
|
|
301
|
+
function expandBraceGlobSegment(segment, depth = 0) {
|
|
302
|
+
if (depth > MAX_GLOB_BRACE_DEPTH)
|
|
303
|
+
return null;
|
|
304
|
+
const open = segment.indexOf("{");
|
|
305
|
+
if (open === -1)
|
|
306
|
+
return [segment];
|
|
307
|
+
const close = findMatchingBrace(segment, open);
|
|
308
|
+
if (close === -1)
|
|
309
|
+
return [segment];
|
|
310
|
+
const before = segment.slice(0, open);
|
|
311
|
+
const after = segment.slice(close + 1);
|
|
312
|
+
const alternatives = splitBraceAlternatives(segment.slice(open + 1, close));
|
|
313
|
+
const variants = [];
|
|
314
|
+
for (const alternative of alternatives) {
|
|
315
|
+
const expanded = expandBraceGlobSegment(`${before}${alternative}${after}`, depth + 1);
|
|
316
|
+
if (expanded === null)
|
|
317
|
+
return null;
|
|
318
|
+
variants.push(...expanded);
|
|
319
|
+
if (variants.length > MAX_GLOB_BRACE_EXPANSIONS)
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
return variants;
|
|
323
|
+
}
|
|
324
|
+
function findMatchingBrace(input, open) {
|
|
325
|
+
let depth = 0;
|
|
326
|
+
for (let index = open; index < input.length; index += 1) {
|
|
327
|
+
const char = input[index];
|
|
328
|
+
if (char === "{")
|
|
329
|
+
depth += 1;
|
|
330
|
+
if (char === "}") {
|
|
331
|
+
depth -= 1;
|
|
332
|
+
if (depth === 0)
|
|
333
|
+
return index;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return -1;
|
|
337
|
+
}
|
|
338
|
+
function splitBraceAlternatives(input) {
|
|
339
|
+
const alternatives = [];
|
|
340
|
+
let depth = 0;
|
|
341
|
+
let current = "";
|
|
342
|
+
for (const char of input) {
|
|
343
|
+
if (char === "{") {
|
|
344
|
+
depth += 1;
|
|
345
|
+
current += char;
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (char === "}") {
|
|
349
|
+
depth = Math.max(0, depth - 1);
|
|
350
|
+
current += char;
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
if (char === "," && depth === 0) {
|
|
354
|
+
alternatives.push(current);
|
|
355
|
+
current = "";
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
current += char;
|
|
359
|
+
}
|
|
360
|
+
alternatives.push(current);
|
|
361
|
+
return alternatives;
|
|
362
|
+
}
|
|
363
|
+
export async function assertResolvedRepoPathAllowed(root, resolved, repoPath) {
|
|
364
|
+
const realRoot = await realpath(root);
|
|
365
|
+
let realTarget;
|
|
366
|
+
try {
|
|
367
|
+
realTarget = await realpath(resolved);
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
if (isErrorCode(error, "ENOENT")) {
|
|
371
|
+
throw new Error(`Path ${repoPath} was not found in the repo`);
|
|
372
|
+
}
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
const relative = path.relative(realRoot, realTarget);
|
|
376
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
377
|
+
throw new Error(`Path ${repoPath} escapes the repository root after resolving symlinks`);
|
|
378
|
+
}
|
|
379
|
+
if (relative) {
|
|
380
|
+
assertNotSensitiveRepoPath(path.posix.normalize(relative.split(path.sep).join("/")));
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function isErrorCode(error, code) {
|
|
384
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === code;
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=repo.js.map
|
package/dist/repo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../src/repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,mBAAmB,GAAG,SAAS,CAAC;AACtC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AACrC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAmCxE,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACxE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,0BAA0B,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,8BAA8B,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,QAAgB,EAAE,UAA+B,EAAE;IAClG,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;QAC/G,QAAQ,EAAE,mBAAmB;KAC9B,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,IAAI,KAAK,YAAY,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,0CAA0C,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,yBAAyB,QAAQ,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,IAAa;IACzE,OAAO,CAAC,MAAM,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,KAAa,EAAE,IAAa;IACrF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,GAAG;QACX,aAAa;QACb,aAAa;QACb,QAAQ;QACR,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,gBAAgB;QAChB,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,aAAa;QACb,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,kBAAkB;QAClB,QAAQ;QACR,qBAAqB;QACrB,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,aAAa;QACb,IAAI;QACJ,KAAK;KACN,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;YACjD,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,IAAI,GAAG,IAAI;SACvB,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM;aACzB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,qBAAqB,CAAC;aAC1B,MAAM,CAAC,CAAC,KAAK,EAAyB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACjE,MAAM,cAAc,GAAmB,EAAE,CAAC;QAC1C,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,MAAM,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,IAAI,cAAc,CAAC,MAAM,IAAI,uBAAuB,EAAE,CAAC;oBACrD,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACR,CAAC;gBACD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,KAAoD,CAAC;QACnE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC/F,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;QAC5B,IAAI,EAAE,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IACvE,OAAO,CACL,QAAQ,CAAC,SAAS,CAAC;QACnB,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,OAAO,UAAU,KAAK,QAAQ;QAC9B,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC3B,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;IACzD,OAAO,IAAI,KAAK,mCAAmC,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAa;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,0BAA0B,CAAC,cAAsB;IACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,QAAQ,cAAc,qDAAqD,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,QAAQ,cAAc,qDAAqD,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACtF,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/E,IAAI,cAAc,EAAE,CAAC;QACnB,0BAA0B,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,cAAsB;IAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,IACE,QAAQ,CAAC,IAAI,CACX,CAAC,OAAO,EAAE,EAAE,CACV,sBAAsB,CAAC,OAAO,CAAC;QAC/B,oBAAoB,CAAC,OAAO,CAAC,CAChC,EACD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,QAAQ,cAAc,qDAAqD,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,IAAY,EAAE,QAAgB;IACrE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACnD,MAAM,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,MAAM,CAAC;AACrG,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,IAAI,8BAA8B,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,8BAA8B,CAAC,OAAe;IACrD,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,KAAa;IACxD,MAAM,WAAW,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,IAAI,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,SAAS,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACpC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;YAC3B,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAa;IACvD,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;QAAE,GAAG,IAAI,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACpD,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,GAAG,GAAG,CAAC;QACd,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxE,OAAO,EAAE,MAAM,EAAE,IAAI,OAAO,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe,EAAE,KAAK,GAAG,CAAC;IACxD,IAAI,KAAK,GAAG,oBAAoB;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACtF,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,yBAAyB;YAAE,OAAO,IAAI,CAAC;IAC/D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,IAAY;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,IAAI,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/B,OAAO,IAAI,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAgB;IAClG,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,4BAA4B,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,uDAAuD,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAY;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAK,KAA4B,CAAC,IAAI,KAAK,IAAI,CAAC;AACvH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type SafeFileOperation = "read" | "write";
|
|
2
|
+
export type SafeFileTestHooks = {
|
|
3
|
+
afterWrite?: (filePath: string, operation: SafeFileOperation) => Promise<void> | void;
|
|
4
|
+
beforeChmod?: (filePath: string, operation: SafeFileOperation) => Promise<void> | void;
|
|
5
|
+
beforeOpen?: (filePath: string, operation: SafeFileOperation) => Promise<void> | void;
|
|
6
|
+
beforeRename?: (filePath: string, tmpPath: string) => Promise<void> | void;
|
|
7
|
+
beforeReplace?: (filePath: string) => Promise<void> | void;
|
|
8
|
+
beforeWrite?: (filePath: string, operation: SafeFileOperation) => Promise<void> | void;
|
|
9
|
+
};
|
|
10
|
+
export declare function setSafeFileTestHooks(hooks: SafeFileTestHooks): void;
|
|
11
|
+
export declare function readVerifiedUtf8File(filePath: string, validate: () => Promise<void>, options?: {
|
|
12
|
+
maxBytes?: number;
|
|
13
|
+
mode?: number;
|
|
14
|
+
}): Promise<string>;
|
|
15
|
+
export declare function writeVerifiedUtf8File(filePath: string, content: string, validate: () => Promise<void>, options?: {
|
|
16
|
+
create?: boolean;
|
|
17
|
+
exclusive?: boolean;
|
|
18
|
+
maxBytes?: number;
|
|
19
|
+
mode?: number;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
export declare function replaceVerifiedUtf8File(filePath: string, content: string, validate: () => Promise<void>, verifyCurrentContent: (currentContent: string) => Promise<void> | void, options?: {
|
|
22
|
+
maxBytes?: number;
|
|
23
|
+
mode?: number;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
export {};
|