@melra/cli 0.3.0-alpha.11 → 0.3.0-alpha.13
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 +14 -7
- package/dist/activity.d.ts +26 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +404 -0
- package/dist/activity.js.map +1 -0
- package/dist/approval-screen.d.ts +35 -0
- package/dist/approval-screen.d.ts.map +1 -0
- package/dist/approval-screen.js +130 -0
- package/dist/approval-screen.js.map +1 -0
- package/dist/client-status.d.ts +24 -0
- package/dist/client-status.d.ts.map +1 -0
- package/dist/client-status.js +273 -0
- package/dist/client-status.js.map +1 -0
- package/dist/clients.d.ts +32 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +588 -0
- package/dist/clients.js.map +1 -0
- package/dist/conformance.d.ts +7 -0
- package/dist/conformance.d.ts.map +1 -1
- package/dist/conformance.js +134 -30
- package/dist/conformance.js.map +1 -1
- package/dist/demo-workflow.d.ts +46 -0
- package/dist/demo-workflow.d.ts.map +1 -0
- package/dist/demo-workflow.js +58 -0
- package/dist/demo-workflow.js.map +1 -0
- package/dist/environment.d.ts +15 -1
- package/dist/environment.d.ts.map +1 -1
- package/dist/environment.js +30 -4
- package/dist/environment.js.map +1 -1
- package/dist/human.d.ts +67 -0
- package/dist/human.d.ts.map +1 -0
- package/dist/human.js +266 -0
- package/dist/human.js.map +1 -0
- package/dist/index.js +432 -77
- package/dist/index.js.map +1 -1
- package/dist/isolation.d.ts +35 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +66 -0
- package/dist/isolation.js.map +1 -0
- package/dist/jsonc.d.ts +24 -0
- package/dist/jsonc.d.ts.map +1 -0
- package/dist/jsonc.js +238 -0
- package/dist/jsonc.js.map +1 -0
- package/dist/output.d.ts +28 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +84 -0
- package/dist/output.js.map +1 -0
- package/package.json +11 -10
package/dist/human.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ClientChoice, ClientStatus } from "./client-status.js";
|
|
2
|
+
import { type Status } from "./output.js";
|
|
3
|
+
export interface DoctorCheck {
|
|
4
|
+
name: string;
|
|
5
|
+
status: Status;
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DoctorReport {
|
|
9
|
+
product: string;
|
|
10
|
+
version: string;
|
|
11
|
+
ready: boolean;
|
|
12
|
+
unhinged: boolean;
|
|
13
|
+
mode: string;
|
|
14
|
+
checks: DoctorCheck[];
|
|
15
|
+
clients: ClientStatus[];
|
|
16
|
+
}
|
|
17
|
+
export interface InitResult {
|
|
18
|
+
initialized: true;
|
|
19
|
+
client: string;
|
|
20
|
+
policyPath: string;
|
|
21
|
+
configPath?: string;
|
|
22
|
+
written?: true;
|
|
23
|
+
backup?: string;
|
|
24
|
+
unchanged?: true;
|
|
25
|
+
config: Record<string, unknown> | string;
|
|
26
|
+
note: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function nextStep(report: DoctorReport): string | undefined;
|
|
29
|
+
export declare function renderDoctor(report: DoctorReport): string;
|
|
30
|
+
export declare function renderInit(result: InitResult): string;
|
|
31
|
+
export declare function renderSetup(result: InitResult, report: DoctorReport): string;
|
|
32
|
+
export interface WizardIo {
|
|
33
|
+
input: NodeJS.ReadableStream;
|
|
34
|
+
output: NodeJS.WritableStream;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ask which client to set up and whether to write its config. Resolves to the
|
|
38
|
+
* answer, or undefined if the person pressed Ctrl-C or closed input — in which
|
|
39
|
+
* case the caller writes nothing.
|
|
40
|
+
*
|
|
41
|
+
* Lines are read through the interface's async iterator rather than
|
|
42
|
+
* `question()`, because the iterator buffers: input that arrives all at once
|
|
43
|
+
* (a paste, or a test) is not lost between prompts.
|
|
44
|
+
*/
|
|
45
|
+
export declare function setupWizard(io: WizardIo, clients: ClientChoice[]): Promise<{
|
|
46
|
+
client: string;
|
|
47
|
+
write: boolean;
|
|
48
|
+
} | undefined>;
|
|
49
|
+
export interface ConformanceReport {
|
|
50
|
+
suite: string;
|
|
51
|
+
level: number;
|
|
52
|
+
claimed: number;
|
|
53
|
+
claim: string;
|
|
54
|
+
passed: number;
|
|
55
|
+
of: number;
|
|
56
|
+
checks: Array<{
|
|
57
|
+
level: number;
|
|
58
|
+
name: string;
|
|
59
|
+
passed: boolean;
|
|
60
|
+
detail: string;
|
|
61
|
+
}>;
|
|
62
|
+
mode: string;
|
|
63
|
+
notProven: string[];
|
|
64
|
+
uncleanedProbeFile?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function renderConformance(report: ConformanceReport): string;
|
|
67
|
+
//# sourceMappingURL=human.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../src/human.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAuDjE;AAoCD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAQzD;AAUD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAuBrD;AAID,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQ5E;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CA4DzD;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAyBnE"}
|
package/dist/human.js
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// What `doctor`, `setup`, and `init` show a person at a terminal, and the
|
|
4
|
+
// question `setup` asks when nobody named a client. Kept out of `index.ts`
|
|
5
|
+
// because importing that runs the CLI, and every piece here needs a test.
|
|
6
|
+
import { createInterface } from "node:readline/promises";
|
|
7
|
+
import { printable } from "./approval-screen.js";
|
|
8
|
+
import { CLIENTS } from "./clients.js";
|
|
9
|
+
import { mark, paint, table } from "./output.js";
|
|
10
|
+
const plural = (count, word) => `${count} ${word}${count === 1 ? "" : "s"}`;
|
|
11
|
+
function clientLine(status) {
|
|
12
|
+
const symbol = status.problems.length > 0
|
|
13
|
+
? mark("warn")
|
|
14
|
+
: status.state === "configured"
|
|
15
|
+
? mark("pass")
|
|
16
|
+
: paint.dim("·");
|
|
17
|
+
// A workspace config file the agent can write names the command these
|
|
18
|
+
// describe, so they are spelled out before they reach the terminal.
|
|
19
|
+
const extra = [...(status.note === undefined ? [] : [status.note]), ...status.problems];
|
|
20
|
+
return [symbol, status.client, status.state, paint.dim(printable(extra.join("; ")))];
|
|
21
|
+
}
|
|
22
|
+
// The one thing to do next, or undefined when there is nothing to fix or the
|
|
23
|
+
// fix is outside MELRA's reach (a platform without a computer adapter). Fails
|
|
24
|
+
// before warnings; among warnings a client problem first, because repointing a
|
|
25
|
+
// client is the step people run doctor to find.
|
|
26
|
+
export function nextStep(report) {
|
|
27
|
+
const broken = report.clients.find((client) => client.problems.length > 0);
|
|
28
|
+
const hint = (check) => {
|
|
29
|
+
switch (check.name) {
|
|
30
|
+
case "node":
|
|
31
|
+
return "install Node.js 22 or newer";
|
|
32
|
+
case "sqlite":
|
|
33
|
+
return "use Node.js 22.13 or newer, which ships node:sqlite";
|
|
34
|
+
case "workspace":
|
|
35
|
+
return "point MELRA_WORKSPACE at a directory you can read and write";
|
|
36
|
+
case "data-directory":
|
|
37
|
+
return "point MELRA_HOME at a directory you can write";
|
|
38
|
+
case "data-location":
|
|
39
|
+
return check.detail.startsWith("could not resolve the workspace")
|
|
40
|
+
? "point MELRA_WORKSPACE at a directory you can read and write"
|
|
41
|
+
: "move MELRA_HOME outside MELRA_WORKSPACE";
|
|
42
|
+
case "policy":
|
|
43
|
+
return "fix the policy file's JSON, or unset MELRA_POLICY to use the defaults";
|
|
44
|
+
case "socket":
|
|
45
|
+
return "fix or unset MELRA_SOCKET (see the socket line above)";
|
|
46
|
+
case "isolation":
|
|
47
|
+
return "run MELRA in the hardened container (https://github.com/XAGI-Lab/melra/blob/main/docs/INSTALLATION.md#docker), or another OS sandbox";
|
|
48
|
+
case "mode":
|
|
49
|
+
return 'drop --unsafe-local, MELRA_UNHINGED and "unhinged" in the policy file, or run in developer mode';
|
|
50
|
+
case "guardrails":
|
|
51
|
+
return "unset MELRA_UNHINGED and drop --unsafe-local to turn the guardrails back on";
|
|
52
|
+
case "browser":
|
|
53
|
+
return "install Chrome, or set MELRA_BROWSER to a Chrome, Chromium, or Edge executable";
|
|
54
|
+
case "clients": {
|
|
55
|
+
if (broken === undefined)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (broken.state === "unreadable")
|
|
58
|
+
return `check the permissions on ${broken.path}`;
|
|
59
|
+
// A stale pin names its own fix. A command missing from PATH is not
|
|
60
|
+
// fixed by rewriting the config, so do not send anyone round that loop.
|
|
61
|
+
const fix = broken.problems.map((problem) => /; fix: (.+)$/.exec(problem)?.[1]).find(Boolean);
|
|
62
|
+
if (fix !== undefined)
|
|
63
|
+
return fix;
|
|
64
|
+
return broken.command === "melra"
|
|
65
|
+
? "put 'melra' on PATH: npm install -g @melra/cli@alpha"
|
|
66
|
+
: `make '${broken.command ?? "the configured command"}' runnable from PATH`;
|
|
67
|
+
}
|
|
68
|
+
default:
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const fails = report.checks.filter((check) => check.status === "fail");
|
|
73
|
+
const warns = report.checks.filter((check) => check.status === "warn");
|
|
74
|
+
const ordered = [
|
|
75
|
+
...fails,
|
|
76
|
+
...warns.filter((check) => check.name === "clients"),
|
|
77
|
+
...warns.filter((check) => check.name !== "clients"),
|
|
78
|
+
];
|
|
79
|
+
for (const check of ordered) {
|
|
80
|
+
const next = hint(check);
|
|
81
|
+
if (next !== undefined)
|
|
82
|
+
return next;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
// The verdict and, when something is wrong, what to run about it.
|
|
87
|
+
function summary(report) {
|
|
88
|
+
const fails = report.checks.filter((check) => check.status === "fail").length;
|
|
89
|
+
const warns = report.checks.filter((check) => check.status === "warn").length;
|
|
90
|
+
const verdict = fails > 0
|
|
91
|
+
? `${mark("fail")} ${paint.bold(`Not ready: ${plural(fails + warns, "problem")}`)}`
|
|
92
|
+
: warns > 0
|
|
93
|
+
? `${mark("warn")} ${paint.bold(`Ready, with ${plural(warns, "warning")}`)}`
|
|
94
|
+
: `${mark("pass")} ${paint.bold("Ready")}`;
|
|
95
|
+
const next = nextStep(report);
|
|
96
|
+
return [verdict, ...(next === undefined ? [] : [`Next: ${paint.bold(printable(next))}`])];
|
|
97
|
+
}
|
|
98
|
+
function checkRows(checks, report) {
|
|
99
|
+
const lines = [];
|
|
100
|
+
const rows = checks.map((check) => {
|
|
101
|
+
if (check.name !== "clients" || report.clients.length === 0) {
|
|
102
|
+
return [mark(check.status), check.name, check.detail];
|
|
103
|
+
}
|
|
104
|
+
const none = !report.clients.some((client) => client.state === "configured");
|
|
105
|
+
return [
|
|
106
|
+
mark(check.status),
|
|
107
|
+
check.name,
|
|
108
|
+
none ? paint.dim("none configured yet; run 'melra setup'") : "",
|
|
109
|
+
];
|
|
110
|
+
});
|
|
111
|
+
lines.push(table(rows, { indent: 2 }));
|
|
112
|
+
if (checks.some((check) => check.name === "clients") && report.clients.length > 0) {
|
|
113
|
+
lines.push(table(report.clients.map(clientLine), { indent: 6 }));
|
|
114
|
+
}
|
|
115
|
+
return lines.join("\n");
|
|
116
|
+
}
|
|
117
|
+
export function renderDoctor(report) {
|
|
118
|
+
return [
|
|
119
|
+
paint.bold(`${report.product} ${report.version}`) + paint.dim(` · ${report.mode} mode`),
|
|
120
|
+
"",
|
|
121
|
+
checkRows(report.checks, report),
|
|
122
|
+
"",
|
|
123
|
+
...summary(report),
|
|
124
|
+
].join("\n");
|
|
125
|
+
}
|
|
126
|
+
function snippet(config) {
|
|
127
|
+
const text = typeof config === "string" ? config.trimEnd() : JSON.stringify(config, null, 2);
|
|
128
|
+
return text
|
|
129
|
+
.split("\n")
|
|
130
|
+
.map((line) => ` ${line}`)
|
|
131
|
+
.join("\n");
|
|
132
|
+
}
|
|
133
|
+
export function renderInit(result) {
|
|
134
|
+
const label = CLIENTS[result.client]?.label ?? result.client;
|
|
135
|
+
const rows = [[mark("pass"), "Policy", result.policyPath]];
|
|
136
|
+
if (result.written === true && result.configPath !== undefined) {
|
|
137
|
+
rows.push([mark("pass"), label, result.configPath]);
|
|
138
|
+
if (result.unchanged === true) {
|
|
139
|
+
rows.push(["", "", paint.dim("already set up; nothing changed")]);
|
|
140
|
+
}
|
|
141
|
+
else if (result.backup !== undefined) {
|
|
142
|
+
rows.push(["", "", paint.dim(`previous file saved as ${result.backup}`)]);
|
|
143
|
+
}
|
|
144
|
+
const next = CLIENTS[result.client]?.next ?? `Restart ${label}, then ask it to use the melra tools.`;
|
|
145
|
+
return [table(rows, { indent: 2 }), "", `Next: ${paint.bold(printable(next))}`].join("\n");
|
|
146
|
+
}
|
|
147
|
+
const where = result.configPath === undefined
|
|
148
|
+
? "Add this to your MCP client's configuration:"
|
|
149
|
+
: `Add this to ${paint.bold(result.configPath)}:`;
|
|
150
|
+
const instead = result.configPath === undefined
|
|
151
|
+
? `Or name your client to get its own format: ${paint.bold("melra setup --client <name>")}` +
|
|
152
|
+
`, or run ${paint.bold("melra setup")} in a terminal to pick one.`
|
|
153
|
+
: `Or let MELRA merge it in for you: ${paint.bold(`melra setup --client ${result.client} --write`)}`;
|
|
154
|
+
return [table(rows, { indent: 2 }), "", where, "", snippet(result.config), "", instead].join("\n");
|
|
155
|
+
}
|
|
156
|
+
// After a setup, only what needs attention: a full doctor report is one
|
|
157
|
+
// command away and would bury the "restart your client" line above it.
|
|
158
|
+
export function renderSetup(result, report) {
|
|
159
|
+
const attention = report.checks.filter((check) => check.status !== "pass");
|
|
160
|
+
return [
|
|
161
|
+
renderInit(result),
|
|
162
|
+
"",
|
|
163
|
+
...(attention.length === 0 ? [] : [checkRows(attention, report), ""]),
|
|
164
|
+
...summary(report),
|
|
165
|
+
].join("\n");
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Ask which client to set up and whether to write its config. Resolves to the
|
|
169
|
+
* answer, or undefined if the person pressed Ctrl-C or closed input — in which
|
|
170
|
+
* case the caller writes nothing.
|
|
171
|
+
*
|
|
172
|
+
* Lines are read through the interface's async iterator rather than
|
|
173
|
+
* `question()`, because the iterator buffers: input that arrives all at once
|
|
174
|
+
* (a paste, or a test) is not lost between prompts.
|
|
175
|
+
*/
|
|
176
|
+
export async function setupWizard(io, clients) {
|
|
177
|
+
const choices = [
|
|
178
|
+
...clients.filter((client) => client.detected !== undefined),
|
|
179
|
+
...clients.filter((client) => client.detected === undefined),
|
|
180
|
+
{ client: "generic", label: "generic (just print the config)" },
|
|
181
|
+
];
|
|
182
|
+
const rl = createInterface({ input: io.input, output: io.output });
|
|
183
|
+
// Input can end with answers still buffered (a paste ending in EOF). Those
|
|
184
|
+
// are still read, but a closed interface refuses to prompt, so the prompt is
|
|
185
|
+
// then written directly.
|
|
186
|
+
let closed = false;
|
|
187
|
+
rl.on("close", () => (closed = true));
|
|
188
|
+
rl.on("SIGINT", () => rl.close());
|
|
189
|
+
const lines = rl[Symbol.asyncIterator]();
|
|
190
|
+
const ask = async (prompt) => {
|
|
191
|
+
if (closed) {
|
|
192
|
+
io.output.write(prompt);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Through readline while it is live, so line editing redraws the prompt.
|
|
196
|
+
rl.setPrompt(prompt);
|
|
197
|
+
rl.prompt();
|
|
198
|
+
}
|
|
199
|
+
const line = await lines.next();
|
|
200
|
+
return line.done === true ? undefined : String(line.value).trim().toLowerCase();
|
|
201
|
+
};
|
|
202
|
+
try {
|
|
203
|
+
io.output.write(`Which MCP client should use MELRA?\n\n${table(choices.map(({ label, detected }, index) => [
|
|
204
|
+
`${index + 1})`,
|
|
205
|
+
label,
|
|
206
|
+
detected === undefined ? "" : paint.ok(`detected: ${detected}`),
|
|
207
|
+
]), { indent: 2 })}\n\n`);
|
|
208
|
+
const fallback = choices[0]?.detected === undefined ? undefined : choices[0];
|
|
209
|
+
let chosen;
|
|
210
|
+
while (chosen === undefined) {
|
|
211
|
+
const answer = await ask(`Choose 1-${choices.length}${fallback === undefined ? "" : " [1]"}: `);
|
|
212
|
+
if (answer === undefined)
|
|
213
|
+
return undefined;
|
|
214
|
+
chosen =
|
|
215
|
+
answer === ""
|
|
216
|
+
? fallback
|
|
217
|
+
: (choices[Number(answer) - 1] ?? choices.find(({ client }) => client === answer));
|
|
218
|
+
if (chosen === undefined) {
|
|
219
|
+
io.output.write(`Enter a number from 1 to ${choices.length}.\n`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (chosen.path === undefined)
|
|
223
|
+
return { client: chosen.client, write: false };
|
|
224
|
+
for (;;) {
|
|
225
|
+
const answer = await ask(`Write it into ${chosen.path}? [Y/n] `);
|
|
226
|
+
if (answer === undefined)
|
|
227
|
+
return undefined;
|
|
228
|
+
if (["", "y", "yes"].includes(answer))
|
|
229
|
+
return { client: chosen.client, write: true };
|
|
230
|
+
if (["n", "no"].includes(answer))
|
|
231
|
+
return { client: chosen.client, write: false };
|
|
232
|
+
io.output.write("Answer y or n.\n");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
rl.close();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// The checks by level, the level reached, and what it does not prove: the
|
|
240
|
+
// last part is what an operator has to read before quoting the level.
|
|
241
|
+
export function renderConformance(report) {
|
|
242
|
+
const rows = report.checks.map((check) => [
|
|
243
|
+
mark(check.passed ? "pass" : "fail"),
|
|
244
|
+
`L${check.level}`,
|
|
245
|
+
check.name,
|
|
246
|
+
paint.dim(check.detail),
|
|
247
|
+
]);
|
|
248
|
+
const reached = report.level === 0 ? "no level reached" : report.claim;
|
|
249
|
+
const verdict = report.level >= report.claimed
|
|
250
|
+
? `${mark("pass")} ${reached}`
|
|
251
|
+
: `${mark("fail")} ${reached}, short of the L${report.claimed} claimed`;
|
|
252
|
+
return [
|
|
253
|
+
paint.bold(`MELRA conformance ${report.suite}`) + paint.dim(` · ${report.mode} mode`),
|
|
254
|
+
"",
|
|
255
|
+
table(rows, { indent: 2 }),
|
|
256
|
+
"",
|
|
257
|
+
`${verdict} ${paint.dim(`(${report.passed} of ${report.of} checks)`)}`,
|
|
258
|
+
...(report.uncleanedProbeFile === undefined
|
|
259
|
+
? []
|
|
260
|
+
: ["", `${mark("warn")} probe file left behind: ${report.uncleanedProbeFile}`]),
|
|
261
|
+
"",
|
|
262
|
+
paint.dim("Not proven by this suite:"),
|
|
263
|
+
...report.notProven.map((item) => paint.dim(` - ${item}`)),
|
|
264
|
+
].join("\n");
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=human.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human.js","sourceRoot":"","sources":["../src/human.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sCAAsC;AAEtC,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAe,MAAM,aAAa,CAAC;AA+B9D,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAE5F,SAAS,UAAU,CAAC,MAAoB;IACtC,MAAM,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACd,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY;YAC7B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACd,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxF,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,gDAAgD;AAChD,MAAM,UAAU,QAAQ,CAAC,MAAoB;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,CAAC,KAAkB,EAAsB,EAAE;QACtD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,OAAO,6BAA6B,CAAC;YACvC,KAAK,QAAQ;gBACX,OAAO,qDAAqD,CAAC;YAC/D,KAAK,WAAW;gBACd,OAAO,6DAA6D,CAAC;YACvE,KAAK,gBAAgB;gBACnB,OAAO,+CAA+C,CAAC;YACzD,KAAK,eAAe;gBAClB,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC;oBAC/D,CAAC,CAAC,6DAA6D;oBAC/D,CAAC,CAAC,yCAAyC,CAAC;YAChD,KAAK,QAAQ;gBACX,OAAO,uEAAuE,CAAC;YACjF,KAAK,QAAQ;gBACX,OAAO,uDAAuD,CAAC;YACjE,KAAK,WAAW;gBACd,OAAO,sIAAsI,CAAC;YAChJ,KAAK,MAAM;gBACT,OAAO,iGAAiG,CAAC;YAC3G,KAAK,YAAY;gBACf,OAAO,6EAA6E,CAAC;YACvF,KAAK,SAAS;gBACZ,OAAO,gFAAgF,CAAC;YAC1F,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAC3C,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY;oBAAE,OAAO,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpF,oEAAoE;gBACpE,wEAAwE;gBACxE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC9F,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO,GAAG,CAAC;gBAClC,OAAO,MAAM,CAAC,OAAO,KAAK,OAAO;oBAC/B,CAAC,CAAC,sDAAsD;oBACxD,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,IAAI,wBAAwB,sBAAsB,CAAC;YAChF,CAAC;YACD;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG;QACd,GAAG,KAAK;QACR,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;QACpD,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;KACrD,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kEAAkE;AAClE,SAAS,OAAO,CAAC,MAAoB;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,OAAO,GACX,KAAK,GAAG,CAAC;QACP,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,KAAK,GAAG,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE;QACnF,CAAC,CAAC,KAAK,GAAG,CAAC;YACT,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE;YAC5E,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,SAAS,CAAC,MAAqB,EAAE,MAAoB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;QAC7E,OAAO;YACL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAClB,KAAK,CAAC,IAAI;YACV,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC,EAAE;SAChE,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,OAAO,CAAC;QACvF,EAAE;QACF,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;QAChC,EAAE;QACF,GAAG,OAAO,CAAC,MAAM,CAAC;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,MAAwC;IACvD,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7F,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;SAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,WAAW,KAAK,uCAAuC,CAAC;QACrG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,UAAU,KAAK,SAAS;QAC7B,CAAC,CAAC,8CAA8C;QAChD,CAAC,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;IACtD,MAAM,OAAO,GACX,MAAM,CAAC,UAAU,KAAK,SAAS;QAC7B,CAAC,CAAC,8CAA8C,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,EAAE;YACzF,YAAY,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,6BAA6B;QACpE,CAAC,CAAC,qCAAqC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,MAAM,UAAU,CAAC,EAAE,CAAC;IACzG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrG,CAAC;AAED,wEAAwE;AACxE,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,MAAkB,EAAE,MAAoB;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3E,OAAO;QACL,UAAU,CAAC,MAAM,CAAC;QAClB,EAAE;QACF,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,GAAG,OAAO,CAAC,MAAM,CAAC;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAOD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAY,EACZ,OAAuB;IAEvB,MAAM,OAAO,GAAmB;QAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC5D,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC5D,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,iCAAiC,EAAE;KAChE,CAAC;IACF,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,2EAA2E;IAC3E,6EAA6E;IAC7E,yBAAyB;IACzB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACtC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,EAAE,MAAc,EAA+B,EAAE;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrB,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClF,CAAC,CAAC;IACF,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,yCAAyC,KAAK,CAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1C,GAAG,KAAK,GAAG,CAAC,GAAG;YACf,KAAK;YACL,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,QAAQ,EAAE,CAAC;SAChE,CAAC,EACF,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,MAAM,CACR,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,MAAgC,CAAC;QACrC,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YAChG,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3C,MAAM;gBACJ,MAAM,KAAK,EAAE;oBACX,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;YACvF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC9E,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;YACjE,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3C,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACrF,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACjF,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAeD,0EAA0E;AAC1E,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACpC,IAAI,KAAK,CAAC,KAAK,EAAE;QACjB,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACvE,MAAM,OAAO,GACX,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO;QAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE;QAC9B,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,mBAAmB,MAAM,CAAC,OAAO,UAAU,CAAC;IAC5E,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,OAAO,CAAC;QACrF,EAAE;QACF,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC1B,EAAE;QACF,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE;QACtE,GAAG,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACjF,EAAE;QACF,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC;QACtC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;KAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|