@openmixer/plugin-qualify 0.10.1 → 0.12.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.
Files changed (82) hide show
  1. package/README.md +52 -10
  2. package/bin/plugin-qualify.mjs +61 -28
  3. package/dist/clap-loader.d.ts +1 -1
  4. package/dist/clap-loader.js +3 -3
  5. package/dist/clap-loader.js.map +1 -1
  6. package/dist/clap-qualify.d.ts +60 -51
  7. package/dist/clap-qualify.js +143 -91
  8. package/dist/clap-qualify.js.map +1 -1
  9. package/dist/cost-fields.d.ts +26 -0
  10. package/dist/cost-fields.js +30 -0
  11. package/dist/cost-fields.js.map +1 -1
  12. package/dist/hosting-codes.d.ts +1 -0
  13. package/dist/hosting-codes.js +1 -0
  14. package/dist/hosting-codes.js.map +1 -1
  15. package/dist/hosting-suitability.d.ts +22 -3
  16. package/dist/hosting-suitability.js +25 -5
  17. package/dist/hosting-suitability.js.map +1 -1
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.js +5 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/judge-cli.d.ts +41 -0
  22. package/dist/judge-cli.js +114 -0
  23. package/dist/judge-cli.js.map +1 -0
  24. package/dist/measurement/cli.d.ts +7 -0
  25. package/dist/measurement/cli.js +14 -0
  26. package/dist/measurement/cli.js.map +1 -1
  27. package/dist/measurement/format.d.ts +44 -4
  28. package/dist/measurement/format.js +46 -3
  29. package/dist/measurement/format.js.map +1 -1
  30. package/dist/measurement/probe-json.js +4 -0
  31. package/dist/measurement/probe-json.js.map +1 -1
  32. package/dist/measurement/sweep-jsonl.js +2 -1
  33. package/dist/measurement/sweep-jsonl.js.map +1 -1
  34. package/dist/measurement/vocabulary.d.ts +9 -0
  35. package/dist/measurement/vocabulary.js +33 -0
  36. package/dist/measurement/vocabulary.js.map +1 -1
  37. package/dist/probe-judge.d.ts +65 -0
  38. package/dist/probe-judge.js +217 -0
  39. package/dist/probe-judge.js.map +1 -0
  40. package/dist/probe-output-fixtures.d.ts +25 -0
  41. package/dist/probe-output-fixtures.js +134 -0
  42. package/dist/probe-output-fixtures.js.map +1 -0
  43. package/dist/probe-output.d.ts +153 -0
  44. package/dist/probe-output.js +374 -0
  45. package/dist/probe-output.js.map +1 -0
  46. package/dist/probe-runner.d.ts +79 -0
  47. package/dist/probe-runner.js +191 -0
  48. package/dist/probe-runner.js.map +1 -0
  49. package/dist/qualification-record.d.ts +82 -0
  50. package/dist/qualification-record.js +85 -0
  51. package/dist/qualification-record.js.map +1 -0
  52. package/dist/qualify-cli.js +1 -1
  53. package/dist/qualify-cli.js.map +1 -1
  54. package/dist/qualify-declarations.d.ts +11 -2
  55. package/dist/qualify-declarations.js +14 -4
  56. package/dist/qualify-declarations.js.map +1 -1
  57. package/fixtures/clap-scan/fake.json +30 -6
  58. package/fixtures/probe-output/memory-limit-refused.json +190 -0
  59. package/fixtures/probe-output/plugin-crash.json +236 -0
  60. package/fixtures/probe-output/success-msi.json +363 -0
  61. package/package.json +5 -1
  62. package/src/clap-loader.ts +3 -2
  63. package/src/clap-qualify.ts +179 -138
  64. package/src/cost-fields.ts +39 -0
  65. package/src/hosting-codes.ts +1 -0
  66. package/src/hosting-suitability.ts +42 -7
  67. package/src/index.ts +5 -0
  68. package/src/judge-cli.ts +133 -0
  69. package/src/measurement/cli.ts +20 -0
  70. package/src/measurement/format.ts +80 -2
  71. package/src/measurement/probe-json.ts +4 -0
  72. package/src/measurement/sweep-jsonl.ts +2 -1
  73. package/src/measurement/vocabulary.ts +38 -0
  74. package/src/probe-judge.ts +272 -0
  75. package/src/probe-output-fixtures.ts +146 -0
  76. package/src/probe-output.ts +511 -0
  77. package/src/probe-runner.ts +244 -0
  78. package/src/qualification-record.ts +149 -0
  79. package/src/qualify-cli.ts +1 -1
  80. package/src/qualify-declarations.ts +16 -4
  81. package/tools/benchmark.py +116 -13
  82. package/tools/lv2-measure.mjs +2 -0
@@ -0,0 +1,374 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ // Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
3
+ /**
4
+ * The reader of plugin-hostd's probe output (`plugin-hostd.probe-output`): the document
5
+ * `plugin-hostd-probe run` writes about one plugin binary and one offer. It holds facts only, so
6
+ * this module reads and checks; it never judges (`probe-judge.ts` does).
7
+ *
8
+ * The reader is structural, as `measurement/probe-json.ts` is: it validates what plugin-qualify
9
+ * needs and ignores the rest, so a newer minor of the format, which only adds fields, still reads.
10
+ * It refuses three things, each with a code that is never reworded:
11
+ *
12
+ * - `probe.format.major-unknown`: a major version this reader does not know. The check comes
13
+ * before the content is looked at, since a new major may change what the content means.
14
+ * - `probe.format.derived-mismatch`: `machine.class.cstatesLimited` or `machine.profile.meetsProtocol`
15
+ * disagrees with the fields they are computed from. Both are kept in the document because the
16
+ * machine class is shared; neither is trusted, both are recomputed here.
17
+ * - `probe.format.invalid`: anything else that is not the document: not JSON, a verdict inside it
18
+ * (the format has no field for one), a missing required block, a malformed figure.
19
+ */
20
+ import { createHash } from "node:crypto";
21
+ import { finiteNumber, isRecord, nonEmptyString, optional } from "./measurement/guards.js";
22
+ import { readVoicesHeld } from "./measurement/format.js";
23
+ export const PROBE_OUTPUT_FORMAT = "plugin-hostd.probe-output";
24
+ /** The one major this reader knows. A minor of it only adds fields. */
25
+ export const PROBE_OUTPUT_MAJOR = 1;
26
+ export const PROBE_FORMAT_CODE = {
27
+ majorUnknown: "probe.format.major-unknown",
28
+ derivedMismatch: "probe.format.derived-mismatch",
29
+ invalid: "probe.format.invalid",
30
+ };
31
+ /** The outcome that means a step ran to its end. */
32
+ export const PROBE_OK = "probe.ok";
33
+ export const PROBE_NOT_ATTEMPTED = "probe.not-attempted";
34
+ /**
35
+ * An exit-latency above this many microseconds makes an idle state deep. The runner writes the
36
+ * document by this rule, so the reader recomputes by it; the protocol document will state it
37
+ * (plugin-hostd#78) and this number follows that document.
38
+ */
39
+ export const DEEP_IDLE_LATENCY_US = 20;
40
+ /** The keys the format has no room for: a document holding one is a judgment, not a fact. */
41
+ const JUDGMENT_KEYS = ["verdict", "verdicts", "rating", "hosting"];
42
+ const SHA256 = /^[0-9a-f]{64}$/;
43
+ const OUTCOME = /^probe\.[a-z][a-z0-9.-]*$/;
44
+ class Refusal extends Error {
45
+ code;
46
+ constructor(code, message) {
47
+ super(message);
48
+ this.code = code;
49
+ }
50
+ }
51
+ function invalid(what) {
52
+ throw new Refusal(PROBE_FORMAT_CODE.invalid, what);
53
+ }
54
+ function record(v, where) {
55
+ return isRecord(v) ? v : invalid(`${where} is not an object`);
56
+ }
57
+ function str(o, key, where) {
58
+ return nonEmptyString(o[key]) ?? invalid(`${where} has no ${key}`);
59
+ }
60
+ function bool(o, key, where) {
61
+ const v = o[key];
62
+ return typeof v === "boolean" ? v : invalid(`${where} has no boolean ${key}`);
63
+ }
64
+ function num(o, key, where) {
65
+ return finiteNumber(o[key]) ?? invalid(`${where} has no number ${key}`);
66
+ }
67
+ function posInt(o, key, where) {
68
+ const v = o[key];
69
+ return typeof v === "number" && Number.isSafeInteger(v) && v > 0 ? v : invalid(`${where} has no positive integer ${key}`);
70
+ }
71
+ function count(o, key, where) {
72
+ const v = o[key];
73
+ return typeof v === "number" && Number.isSafeInteger(v) && v >= 0 ? v : invalid(`${where} has no count ${key}`);
74
+ }
75
+ function optCount(o, key, where) {
76
+ return o[key] === undefined ? undefined : count(o, key, where);
77
+ }
78
+ function optBool(o, key, where) {
79
+ return o[key] === undefined ? undefined : bool(o, key, where);
80
+ }
81
+ function outcome(o, where) {
82
+ const v = str(o, "outcome", where);
83
+ return OUTCOME.test(v) ? v : invalid(`${where} outcome ${v} is not a probe code`);
84
+ }
85
+ function list(o, key, where) {
86
+ const v = o[key];
87
+ return Array.isArray(v) ? v : invalid(`${where} has no list ${key}`);
88
+ }
89
+ function sha(o, key, where) {
90
+ const v = str(o, key, where);
91
+ return SHA256.test(v) ? v : invalid(`${where} ${key} is not 64 lowercase hex digits`);
92
+ }
93
+ /** The strings of a list that holds nothing else, or `undefined`. */
94
+ function stringList(v) {
95
+ if (!Array.isArray(v))
96
+ return undefined;
97
+ const out = [];
98
+ for (const item of v) {
99
+ if (typeof item !== "string")
100
+ return undefined;
101
+ out.push(item);
102
+ }
103
+ return out;
104
+ }
105
+ function readCost(v, where) {
106
+ const o = record(v, where);
107
+ const pct = record(o["percentile"], `${where} percentile`);
108
+ const p = num(pct, "p", `${where} percentile`);
109
+ if (!(p > 50 && p <= 100))
110
+ invalid(`${where} percentile p ${p} is outside (50, 100]`);
111
+ const median = num(o, "median", where);
112
+ const value = num(pct, "value", `${where} percentile`);
113
+ if (median < 0 || value < 0)
114
+ invalid(`${where} holds a negative cost`);
115
+ const voices = o["voices"] === undefined ? undefined : readVoicesHeld(o["voices"]);
116
+ if (o["voices"] !== undefined && voices === undefined)
117
+ invalid(`${where} voices is not a count of held notes with its basis`);
118
+ return {
119
+ median,
120
+ percentile: { p, value },
121
+ blocks: posInt(o, "blocks", where),
122
+ warmupBlocks: count(o, "warmupBlocks", where),
123
+ ...(voices === undefined ? {} : { voices }),
124
+ };
125
+ }
126
+ function readRtSafety(v, where) {
127
+ const o = record(v, where);
128
+ const events = o["events"] === undefined ? undefined : (stringList(o["events"]) ?? invalid(`${where} events is not a list of strings`));
129
+ return {
130
+ interposer: bool(o, "interposer", where),
131
+ ...optional("swept", optBool(o, "swept", where)),
132
+ ...optional("sweepApplicable", optBool(o, "sweepApplicable", where)),
133
+ ...optional("blocks", optCount(o, "blocks", where)),
134
+ ...optional("allocations", optCount(o, "allocations", where)),
135
+ ...optional("locks", optCount(o, "locks", where)),
136
+ ...optional("syscalls", optCount(o, "syscalls", where)),
137
+ ...optional("threadViolations", optCount(o, "threadViolations", where)),
138
+ ...optional("processErrors", optCount(o, "processErrors", where)),
139
+ ...optional("events", events),
140
+ };
141
+ }
142
+ function readNoteSweep(v, where) {
143
+ const o = record(v, where);
144
+ return {
145
+ applicable: bool(o, "applicable", where),
146
+ ...optional("dialect", nonEmptyString(o["dialect"])),
147
+ ...optional("allocations", optCount(o, "allocations", where)),
148
+ ...optional("locks", optCount(o, "locks", where)),
149
+ ...optional("syscalls", optCount(o, "syscalls", where)),
150
+ };
151
+ }
152
+ function readPoint(v, i) {
153
+ const where = `grid[${i}]`;
154
+ const o = record(v, where);
155
+ const latencyIn = o["latency"];
156
+ let latency;
157
+ if (latencyIn !== undefined) {
158
+ const l = record(latencyIn, `${where} latency`);
159
+ latency = { declaredFrames: count(l, "declaredFrames", `${where} latency`), measuredFrames: count(l, "measuredFrames", `${where} latency`) };
160
+ }
161
+ return {
162
+ rate: posInt(o, "rate", where),
163
+ quantum: posInt(o, "quantum", where),
164
+ outcome: outcome(o, where),
165
+ ...optional("latency", latency),
166
+ ...(o["cost"] === undefined ? {} : { cost: readCost(o["cost"], `${where} cost`) }),
167
+ ...(o["rtSafety"] === undefined ? {} : { rtSafety: readRtSafety(o["rtSafety"], `${where} rtSafety`) }),
168
+ ...(o["noteSweep"] === undefined ? {} : { noteSweep: readNoteSweep(o["noteSweep"], `${where} noteSweep`) }),
169
+ };
170
+ }
171
+ function readStep(v, i) {
172
+ const where = `steps[${i}]`;
173
+ const o = record(v, where);
174
+ return {
175
+ step: str(o, "step", where),
176
+ outcome: outcome(o, where),
177
+ ...optional("rate", o["rate"] === undefined ? undefined : posInt(o, "rate", where)),
178
+ ...optional("quantum", o["quantum"] === undefined ? undefined : posInt(o, "quantum", where)),
179
+ ...optional("detail", nonEmptyString(o["detail"])),
180
+ };
181
+ }
182
+ function readIdle(v, i) {
183
+ const where = `machine.profile.cpuidle[${i}]`;
184
+ const o = record(v, where);
185
+ return {
186
+ cpu: count(o, "cpu", where),
187
+ state: str(o, "state", where),
188
+ latencyUs: count(o, "latencyUs", where),
189
+ disabled: bool(o, "disabled", where),
190
+ usageDelta: count(o, "usageDelta", where),
191
+ };
192
+ }
193
+ /** Whether any idle state deeper than {@link DEEP_IDLE_LATENCY_US} is enabled: then the machine does not limit its C-states. */
194
+ export function deepIdleEnabled(cpuidle) {
195
+ return cpuidle.some((s) => s.latencyUs > DEEP_IDLE_LATENCY_US && !s.disabled);
196
+ }
197
+ /** Whether a deep idle state was entered while the run measured. */
198
+ export function deepIdleEntered(cpuidle) {
199
+ return cpuidle.some((s) => s.latencyUs > DEEP_IDLE_LATENCY_US && s.usageDelta > 0);
200
+ }
201
+ const PROFILE_GOVERNOR = "probe.profile.governor";
202
+ const PROFILE_DEEP_IDLE = "probe.profile.deep-idle-entered";
203
+ /**
204
+ * The two derived fields, recomputed. `cstatesLimited` is "idle states are read and none deeper than
205
+ * the limit is enabled", and it cannot hold when a deep state was entered. `meetsProtocol` is the
206
+ * performance governor, no deep state entered and nothing else unmet: the codes the reader can
207
+ * recompute (`probe.profile.governor`, `probe.profile.deep-idle-entered`) must be in `unmet`, and the
208
+ * flag is true exactly when `unmet` is empty. A code the reader cannot recompute (the pinning, the
209
+ * turbo and SMT readings) is taken as the runner wrote it.
210
+ */
211
+ function checkDerived(machine) {
212
+ const idle = machine.profile.cpuidle;
213
+ const limited = idle.length > 0 && !deepIdleEnabled(idle);
214
+ const claimed = machine.class["cstatesLimited"];
215
+ if (claimed !== limited) {
216
+ throw new Refusal(PROBE_FORMAT_CODE.derivedMismatch, `machine.class.cstatesLimited is ${String(claimed)} but cpuidle[] gives ${String(limited)}`);
217
+ }
218
+ const { governor, unmet, meetsProtocol } = machine.profile;
219
+ const required = [...(governor === "performance" ? [] : [PROFILE_GOVERNOR]), ...(deepIdleEntered(idle) ? [PROFILE_DEEP_IDLE] : [])];
220
+ const missing = required.filter((code) => !unmet.includes(code));
221
+ if (missing.length > 0) {
222
+ throw new Refusal(PROBE_FORMAT_CODE.derivedMismatch, `machine.profile.unmet lacks ${missing.join(", ")}, which governor and cpuidle[] give`);
223
+ }
224
+ if (meetsProtocol !== (unmet.length === 0)) {
225
+ throw new Refusal(PROBE_FORMAT_CODE.derivedMismatch, `machine.profile.meetsProtocol is ${String(meetsProtocol)} but unmet[] holds ${unmet.length} code${unmet.length === 1 ? "" : "s"}`);
226
+ }
227
+ }
228
+ function readMachine(v) {
229
+ const o = record(v, "machine");
230
+ const cls = record(o["class"], "machine.class");
231
+ const klass = {};
232
+ for (const [k, value] of Object.entries(cls))
233
+ if (typeof value === "string" || typeof value === "boolean")
234
+ klass[k] = value;
235
+ if (typeof klass["cstatesLimited"] !== "boolean")
236
+ invalid("machine.class has no boolean cstatesLimited");
237
+ const p = record(o["profile"], "machine.profile");
238
+ const governor = p["governor"];
239
+ if (!(governor === null || typeof governor === "string"))
240
+ invalid("machine.profile.governor is not a string or null");
241
+ const unmet = p["unmet"] === undefined ? [] : (stringList(p["unmet"]) ?? invalid("machine.profile.unmet is not a list of strings"));
242
+ return {
243
+ class: klass,
244
+ profile: {
245
+ governor,
246
+ cpuidle: list(p, "cpuidle", "machine.profile").map(readIdle),
247
+ meetsProtocol: bool(p, "meetsProtocol", "machine.profile"),
248
+ unmet,
249
+ },
250
+ pinnedCpus: str(o, "pinnedCpus", "machine"),
251
+ };
252
+ }
253
+ function readBinary(v) {
254
+ const o = record(v, "binary");
255
+ const files = list(o, "files", "binary").map((f, i) => {
256
+ const fo = record(f, `binary.files[${i}]`);
257
+ return { path: str(fo, "path", `binary.files[${i}]`), sha256: sha(fo, "sha256", `binary.files[${i}]`) };
258
+ });
259
+ const layoutIn = o["layout"];
260
+ let layout;
261
+ if (layoutIn !== undefined) {
262
+ const lo = record(layoutIn, "binary.layout");
263
+ layout = { scheme: str(lo, "scheme", "binary.layout"), sha256: sha(lo, "sha256", "binary.layout") };
264
+ }
265
+ return {
266
+ path: str(o, "path", "binary"),
267
+ sha256: sha(o, "sha256", "binary"),
268
+ files,
269
+ ...optional("layout", layout),
270
+ ...optional("unpinnable", nonEmptyString(o["unpinnable"])),
271
+ };
272
+ }
273
+ function readRun(v) {
274
+ const o = record(v, "run");
275
+ const protocol = record(o["protocol"], "run.protocol");
276
+ const toolsIn = record(o["tools"], "run.tools");
277
+ const tools = {};
278
+ for (const [k, value] of Object.entries(toolsIn))
279
+ if (typeof value === "string")
280
+ tools[k] = value;
281
+ return {
282
+ id: str(o, "id", "run"),
283
+ startedAt: str(o, "startedAt", "run"),
284
+ elapsedMs: count(o, "elapsedMs", "run"),
285
+ complete: bool(o, "complete", "run"),
286
+ outcome: outcome(o, "run"),
287
+ ...optional("reason", nonEmptyString(o["reason"])),
288
+ protocol: { name: str(protocol, "name", "run.protocol"), version: posInt(protocol, "version", "run.protocol") },
289
+ tools,
290
+ via: str(o, "via", "run"),
291
+ };
292
+ }
293
+ function readPlugin(v) {
294
+ const o = record(v, "plugin");
295
+ const format = o["format"];
296
+ if (format !== "clap" && format !== "lv2")
297
+ invalid(`plugin.format ${JSON.stringify(format)} is neither clap nor lv2`);
298
+ return {
299
+ format,
300
+ id: str(o, "id", "plugin"),
301
+ ...optional("name", nonEmptyString(o["name"])),
302
+ ...optional("version", nonEmptyString(o["version"])),
303
+ };
304
+ }
305
+ function readOffer(v) {
306
+ const o = record(v, "offer");
307
+ const ext = o["clapExtensions"] === undefined ? undefined : (stringList(o["clapExtensions"]) ?? invalid("offer.clapExtensions is not a list of strings"));
308
+ return { id: str(o, "id", "offer"), ...optional("clapExtensions", ext) };
309
+ }
310
+ /** The version `"<major>.<minor>"`, or `undefined` when it is not one. */
311
+ function parseVersion(v) {
312
+ const m = typeof v === "string" ? /^(\d+)\.(\d+)$/.exec(v) : null;
313
+ return m === null ? undefined : { major: Number(m[1]), minor: Number(m[2]) };
314
+ }
315
+ /**
316
+ * A probe output from its text, or the code that refuses it. The order of the checks is the order of
317
+ * what can be trusted: that it is JSON and the format, then the major (before any content is read),
318
+ * then that it holds no judgment, then the content, then the derived fields against it.
319
+ */
320
+ export function readProbeOutput(text) {
321
+ try {
322
+ let json;
323
+ try {
324
+ json = JSON.parse(text);
325
+ }
326
+ catch {
327
+ return invalid("not JSON");
328
+ }
329
+ const doc = record(json, "the document");
330
+ if (doc["format"] !== PROBE_OUTPUT_FORMAT)
331
+ invalid(`format is ${JSON.stringify(doc["format"])}, not ${PROBE_OUTPUT_FORMAT}`);
332
+ const version = parseVersion(doc["formatVersion"]);
333
+ if (version === undefined)
334
+ invalid(`formatVersion ${JSON.stringify(doc["formatVersion"])} is not "<major>.<minor>"`);
335
+ if (version.major !== PROBE_OUTPUT_MAJOR) {
336
+ throw new Refusal(PROBE_FORMAT_CODE.majorUnknown, `formatVersion ${String(doc["formatVersion"])}: this reader knows major ${PROBE_OUTPUT_MAJOR}`);
337
+ }
338
+ for (const key of JUDGMENT_KEYS)
339
+ if (key in doc)
340
+ invalid(`the document carries ${key}: a probe output holds facts, never a judgment`);
341
+ const grid = doc["grid"] === undefined ? [] : list(doc, "grid", "the document").map(readPoint);
342
+ const seen = new Set();
343
+ for (const p of grid) {
344
+ const key = `${p.rate}/${p.quantum}`;
345
+ if (seen.has(key))
346
+ invalid(`grid holds rate ${p.rate} at quantum ${p.quantum} twice`);
347
+ seen.add(key);
348
+ }
349
+ const behaviour = doc["behaviour"];
350
+ const output = {
351
+ formatVersion: String(doc["formatVersion"]),
352
+ run: readRun(doc["run"]),
353
+ plugin: readPlugin(doc["plugin"]),
354
+ binary: readBinary(doc["binary"]),
355
+ machine: readMachine(doc["machine"]),
356
+ offer: readOffer(doc["offer"]),
357
+ steps: list(doc, "steps", "the document").map(readStep),
358
+ grid,
359
+ ...(isRecord(behaviour) ? { behaviour } : {}),
360
+ };
361
+ checkDerived(output.machine);
362
+ return { ok: true, output };
363
+ }
364
+ catch (e) {
365
+ if (e instanceof Refusal)
366
+ return { ok: false, code: e.code, problem: e.message };
367
+ throw e;
368
+ }
369
+ }
370
+ /** The SHA-256 of some bytes, as the record names a probe output's copy. */
371
+ export function sha256Hex(bytes) {
372
+ return createHash("sha256").update(bytes).digest("hex");
373
+ }
374
+ //# sourceMappingURL=probe-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe-output.js","sourceRoot":"","sources":["../src/probe-output.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAmB,MAAM,yBAAyB,CAAC;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAC/D,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY,EAAE,4BAA4B;IAC1C,eAAe,EAAE,+BAA+B;IAChD,OAAO,EAAE,sBAAsB;CACvB,CAAC;AAGX,oDAAoD;AACpD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,6FAA6F;AAC7F,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAE5E,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAChC,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAiH5C,MAAM,OAAQ,SAAQ,KAAK;IAEd;IADX,YACW,IAAqB,EAC9B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAiB;IAIhC,CAAC;CACF;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,MAAM,CAAC,CAAU,EAAE,KAAa;IACvC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,GAAG,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACjE,OAAO,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,KAAK,WAAW,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,IAAI,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IAClE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,mBAAmB,GAAG,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,GAAG,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACjE,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,KAAK,kBAAkB,GAAG,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,MAAM,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACpE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,4BAA4B,GAAG,EAAE,CAAC,CAAC;AAC5H,CAAC;AAED,SAAS,KAAK,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACnE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,iBAAiB,GAAG,EAAE,CAAC,CAAC;AAClH,CAAC;AAED,SAAS,QAAQ,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACtE,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,OAAO,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACrE,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,OAAO,CAAC,CAA0B,EAAE,KAAa;IACxD,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,YAAY,CAAC,sBAAsB,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,IAAI,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IAClE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,gBAAgB,GAAG,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,GAAG,CAAC,CAA0B,EAAE,GAAW,EAAE,KAAa;IACjE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,GAAG,iCAAiC,CAAC,CAAC;AACxF,CAAC;AAED,qEAAqE;AACrE,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,KAAa;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IACvD,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,KAAK,qDAAqD,CAAC,CAAC;IAC9H,OAAO;QACL,MAAM;QACN,UAAU,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC;QAClC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC;QAC7C,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,CAAU,EAAE,KAAa;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC,CAAC;IACxI,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC;QACxC,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,GAAG,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACpE,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnD,GAAG,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC7D,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,GAAG,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACvE,GAAG,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACjE,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,CAAU,EAAE,KAAa;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC;QACxC,GAAG,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACpD,GAAG,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC7D,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAU,EAAE,CAAS;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,OAAkC,CAAC;IACvC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,KAAK,UAAU,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,KAAK,UAAU,CAAC,EAAE,CAAC;IAC/I,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC;QACpC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1B,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC/B,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,KAAK,WAAW,CAAC,EAAE,CAAC;QACtG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,KAAK,YAAY,CAAC,EAAE,CAAC;KAC5G,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,CAAS;IACrC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1B,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnF,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5F,GAAG,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,CAAS;IACrC,MAAM,KAAK,GAAG,2BAA2B,CAAC,GAAG,CAAC;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;QAC3B,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC;QAC7B,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC;QACvC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC;QACpC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,gIAAgI;AAChI,MAAM,UAAU,eAAe,CAAC,OAAkC;IAChE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,oBAAoB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,OAAkC;IAChE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,oBAAoB,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAClD,MAAM,iBAAiB,GAAG,iCAAiC,CAAC;AAE5D;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,OAA+B;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,OAAO,CACf,iBAAiB,CAAC,eAAe,EACjC,mCAAmC,MAAM,CAAC,OAAO,CAAC,wBAAwB,MAAM,CAAC,OAAO,CAAC,EAAE,CAC5F,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpI,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,eAAe,EAAE,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC/I,CAAC;IACD,IAAI,aAAa,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,OAAO,CACf,iBAAiB,CAAC,eAAe,EACjC,oCAAoC,MAAM,CAAC,aAAa,CAAC,sBAAsB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CACnI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAU;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC5H,IAAI,OAAO,KAAK,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,6CAA6C,CAAC,CAAC;IACzG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC;QAAE,OAAO,CAAC,kDAAkD,CAAC,CAAC;IACtH,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACpI,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE;YACP,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC5D,aAAa,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,iBAAiB,CAAC;YAC1D,KAAK;SACN;QACD,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1G,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,MAAsD,CAAC;IAC3D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC7C,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;IACtG,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAClC,KAAK;QACL,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC7B,GAAG,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,CAAU;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAClG,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;QACvB,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC;QACrC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC;QACvC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC;QACpC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1B,GAAG,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE;QAC/G,KAAK;QACL,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3B,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IACtH,OAAO;QACL,MAAM;QACN,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC;QAC1B,GAAG,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,GAAG,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAU;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,gBAAgB,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,OAAO,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC1J,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,0EAA0E;AAC1E,SAAS,YAAY,CAAC,CAAU;IAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,mBAAmB;YAAE,OAAO,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAC;QAC7H,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QACnD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,2BAA2B,CAAC,CAAC;QACrH,IAAI,OAAO,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;YACzC,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE,iBAAiB,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,6BAA6B,kBAAkB,EAAE,CAAC,CAAC;QACpJ,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,aAAa;YAAE,IAAI,GAAG,IAAI,GAAG;gBAAE,OAAO,CAAC,wBAAwB,GAAG,gDAAgD,CAAC,CAAC;QACtI,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC;YACtF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,MAAM,GAAgB;YAC1B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC3C,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACvD,IAAI;YACJ,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;QACF,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACjF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { type RtSafetyDocument } from "./clap-qualify.js";
2
+ import type { HostProfile } from "./host-profiles.js";
3
+ import type { PluginTarget } from "./loader.js";
4
+ import { type Judgment } from "./probe-judge.js";
5
+ import { type ProbeOutput } from "./probe-output.js";
6
+ import type { QualifyVerdict } from "./qualify-cli.js";
7
+ export declare class ProbeRunnerError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ /** The runner: the declared setting when set, else the declared default (on `PATH`). */
11
+ export declare function probeRunnerTool(env: Readonly<Record<string, string | undefined>>): string;
12
+ /** What one run of the runner gave back; `error` is a spawn failure, `signal` a death. */
13
+ export interface ProbeRunResult {
14
+ readonly status: number | null;
15
+ readonly signal?: string | null;
16
+ readonly stderr?: string;
17
+ readonly error?: Error;
18
+ }
19
+ /** Runs the runner. It is given no time limit of its own, since the runner keeps the deadline. */
20
+ export type ProbeRun = (tool: string, args: readonly string[], env: Readonly<Record<string, string | undefined>>) => ProbeRunResult;
21
+ export interface ProbeTargetOptions {
22
+ /** The rates the plugin is measured at. */
23
+ readonly rates: readonly number[];
24
+ /** Host extensions to offer beyond the prober's own (a CLAP run). */
25
+ readonly offer?: readonly string[];
26
+ readonly run?: ProbeRun;
27
+ readonly env?: Readonly<Record<string, string | undefined>>;
28
+ readonly exists?: (path: string) => boolean;
29
+ }
30
+ /** The runner's arguments for a CLAP file; `child` is the prober the runner starts. */
31
+ export declare function clapRunnerArgs(options: {
32
+ rates: readonly number[];
33
+ offer?: readonly string[];
34
+ out: string;
35
+ log: string;
36
+ child: string;
37
+ }, binaryPath: string, id: string | undefined): string[];
38
+ /**
39
+ * The runner's arguments for an LV2 plugin, named as `lv2:<uri>` and measured by the runner's own LV2
40
+ * child. The runner of plugin-hostd 0.4.0 starts a CLAP prober only (the LV2 child, plugin-hostd#76, is in no release yet), so
41
+ * against it this run ends with the runner's own refusal, which {@link runOne} reports.
42
+ */
43
+ export declare function lv2RunnerArgs(options: {
44
+ rates: readonly number[];
45
+ out: string;
46
+ log: string;
47
+ }, uri: string): string[];
48
+ /** One probe output and the bytes it was read from (the bytes are what gets copied beside the record). */
49
+ export interface ProbedTarget {
50
+ readonly bytes: Buffer;
51
+ readonly output: ProbeOutput;
52
+ }
53
+ /** The probe output of one target, through the runner. Throws {@link ProbeRunnerError} when there is none to judge. */
54
+ export declare function probeTarget(target: PluginTarget, options: ProbeTargetOptions): ProbedTarget;
55
+ /** What the pass over a run's targets produced. */
56
+ export interface ProbePass {
57
+ /** Every probe output that was judged, with its bytes, for the qualification directory. */
58
+ readonly runs: readonly {
59
+ readonly bytes: Buffer;
60
+ readonly judgment: Judgment;
61
+ }[];
62
+ readonly verdicts: readonly QualifyVerdict[];
63
+ /** The CLAP documents of today's judge, which the pins file is taken from. */
64
+ readonly documents: readonly RtSafetyDocument[];
65
+ /** Each target that could not be measured, with why; its verdict rows read `unknown`, unmeasured. */
66
+ readonly failures: readonly {
67
+ readonly uri: string;
68
+ readonly problem: string;
69
+ }[];
70
+ }
71
+ /**
72
+ * Measure every target through the runner, one run per target and set of offered extensions (a crash
73
+ * takes only that plugin), and judge each probe output under the profiles whose offer it was taken
74
+ * with. A CLAP profile the prober cannot stand in for is judged from the run with no offer and reads
75
+ * `unknown` there, as before. An LV2 plugin has one run for every profile.
76
+ */
77
+ export declare function qualifyTargets(targets: readonly PluginTarget[], options: ProbeTargetOptions & {
78
+ readonly profiles?: readonly HostProfile[];
79
+ }): ProbePass;