@fnndsc/brasa 0.23.2 → 0.25.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 (92) hide show
  1. package/dist/buildinfo.json +1 -1
  2. package/dist/builtins/fs/pull.args.d.ts +1 -1
  3. package/dist/builtins/fs/pull.args.js +5 -3
  4. package/dist/builtins/fs/pull.args.js.map +1 -1
  5. package/dist/builtins/fs/pull.js +2 -2
  6. package/dist/builtins/fs/touch.js +1 -1
  7. package/dist/builtins/fs/touch.js.map +1 -1
  8. package/dist/builtins/help.js +134 -10
  9. package/dist/builtins/help.js.map +1 -1
  10. package/dist/builtins/index.d.ts +6 -0
  11. package/dist/builtins/index.js +6 -0
  12. package/dist/builtins/index.js.map +1 -1
  13. package/dist/builtins/net/query.csv.js +14 -0
  14. package/dist/builtins/net/query.csv.js.map +1 -1
  15. package/dist/builtins/net/query.js +3 -0
  16. package/dist/builtins/net/query.js.map +1 -1
  17. package/dist/builtins/pluginExecute.js +28 -3
  18. package/dist/builtins/pluginExecute.js.map +1 -1
  19. package/dist/builtins/proc.js +32 -2
  20. package/dist/builtins/proc.js.map +1 -1
  21. package/dist/builtins/res/dicom.d.ts +35 -1
  22. package/dist/builtins/res/dicom.js +15 -2
  23. package/dist/builtins/res/dicom.js.map +1 -1
  24. package/dist/builtins/res/expect.d.ts +40 -0
  25. package/dist/builtins/res/expect.js +447 -0
  26. package/dist/builtins/res/expect.js.map +1 -0
  27. package/dist/builtins/res/gather.d.ts +10 -0
  28. package/dist/builtins/res/gather.js +224 -0
  29. package/dist/builtins/res/gather.js.map +1 -0
  30. package/dist/builtins/res/gather.store.d.ts +131 -0
  31. package/dist/builtins/res/gather.store.js +225 -0
  32. package/dist/builtins/res/gather.store.js.map +1 -0
  33. package/dist/builtins/res/pipeline.args.d.ts +5 -2
  34. package/dist/builtins/res/pipeline.args.js +8 -3
  35. package/dist/builtins/res/pipeline.args.js.map +1 -1
  36. package/dist/builtins/res/pipeline.js +23 -0
  37. package/dist/builtins/res/pipeline.js.map +1 -1
  38. package/dist/builtins/res/play.d.ts +70 -0
  39. package/dist/builtins/res/play.js +334 -0
  40. package/dist/builtins/res/play.js.map +1 -0
  41. package/dist/builtins/res/plugin.js +21 -6
  42. package/dist/builtins/res/plugin.js.map +1 -1
  43. package/dist/builtins/res/record.d.ts +49 -0
  44. package/dist/builtins/res/record.js +150 -0
  45. package/dist/builtins/res/record.js.map +1 -0
  46. package/dist/builtins/res/runWait.d.ts +49 -0
  47. package/dist/builtins/res/runWait.js +193 -0
  48. package/dist/builtins/res/runWait.js.map +1 -0
  49. package/dist/builtins/sys/motd.d.ts +41 -0
  50. package/dist/builtins/sys/motd.js +139 -0
  51. package/dist/builtins/sys/motd.js.map +1 -0
  52. package/dist/builtins/sys/weather.d.ts +132 -0
  53. package/dist/builtins/sys/weather.js +297 -0
  54. package/dist/builtins/sys/weather.js.map +1 -0
  55. package/dist/command-keys.js +4 -0
  56. package/dist/command-keys.js.map +1 -1
  57. package/dist/core/connect.d.ts +31 -1
  58. package/dist/core/connect.js +32 -1
  59. package/dist/core/connect.js.map +1 -1
  60. package/dist/core/dispatch.d.ts +0 -14
  61. package/dist/core/dispatch.js +85 -27
  62. package/dist/core/dispatch.js.map +1 -1
  63. package/dist/core/engine.d.ts +10 -0
  64. package/dist/core/engine.js +9 -0
  65. package/dist/core/engine.js.map +1 -1
  66. package/dist/core/expansion.d.ts +70 -0
  67. package/dist/core/expansion.js +289 -0
  68. package/dist/core/expansion.js.map +1 -0
  69. package/dist/core/promptContext.js +5 -1
  70. package/dist/core/promptContext.js.map +1 -1
  71. package/dist/lib/duration.d.ts +17 -0
  72. package/dist/lib/duration.js +25 -0
  73. package/dist/lib/duration.js.map +1 -0
  74. package/dist/lib/parser.d.ts +50 -0
  75. package/dist/lib/parser.js +119 -0
  76. package/dist/lib/parser.js.map +1 -1
  77. package/dist/logo/brain.d.ts +6 -27
  78. package/dist/logo/brain.js +5 -250
  79. package/dist/logo/brain.js.map +1 -1
  80. package/dist/session/answer.d.ts +141 -0
  81. package/dist/session/answer.js +163 -0
  82. package/dist/session/answer.js.map +1 -0
  83. package/dist/session/answerAdapters.d.ts +4 -0
  84. package/dist/session/answerAdapters.js +106 -0
  85. package/dist/session/answerAdapters.js.map +1 -0
  86. package/dist/session/recent.d.ts +68 -0
  87. package/dist/session/recent.js +99 -0
  88. package/dist/session/recent.js.map +1 -0
  89. package/dist/session/recorder.d.ts +61 -0
  90. package/dist/session/recorder.js +95 -0
  91. package/dist/session/recorder.js.map +1 -0
  92. package/package.json +5 -5
@@ -0,0 +1,289 @@
1
+ /**
2
+ * @file What a `${reference}` refers to, for every line the session runs.
3
+ *
4
+ * There was more than one answer to this. The dispatcher substituted the
5
+ * environment after tokenizing (so a single-quoted `$HOME` expanded anyway),
6
+ * and `play` substituted parameters and session pronouns before tokenizing
7
+ * (so a gathered path with a space had to be quoted by hand). Two expanders
8
+ * over one syntax is two sources of truth, and they composed by accident
9
+ * rather than by design.
10
+ *
11
+ * One resolver now answers for all of them, in a fixed order:
12
+ *
13
+ * . *Session pronouns*, a closed RESERVED set — the cohort, the feed, the
14
+ * run, the query, the place the session stands.
15
+ * . *Parameters* of the manifest being played, if one is.
16
+ * . *The environment*.
17
+ *
18
+ * A name nothing answers refuses the LINE rather than expanding to nothing
19
+ * or standing as text: `rm -rf ${DIR}/scratch` with `DIR` unset is how a
20
+ * script deletes the wrong thing, and this stack does not do silent
21
+ * workarounds.
22
+ *
23
+ * @module
24
+ */
25
+ import { AsyncLocalStorage } from 'node:async_hooks';
26
+ import { session } from '../session/index.js';
27
+ import { recentFeed_get, recentQuery_get, recentRunPlace_get, recentRuns_get } from '../session/recent.js';
28
+ import { ANSWER_KINDS, answer_get, answerKind_count, answerRow_get } from '../session/answer.js';
29
+ /** The names the session answers for; a manifest may not take them. */
30
+ export const RESERVED_REFERENCES = new Set([
31
+ 'gather', 'feed', 'run', 'query', 'cwd',
32
+ ]);
33
+ /** Whether an unanswerable reference may stand as written: what a dry run does. */
34
+ const standsScope = new AsyncLocalStorage();
35
+ /** Parameters of the manifest being played, if one is. */
36
+ const paramScope = new AsyncLocalStorage();
37
+ /**
38
+ * Runs work with a manifest's parameters in scope.
39
+ *
40
+ * @param params - The parameters, already checked for completeness.
41
+ * @param operation - The work to run.
42
+ * @returns The operation's result.
43
+ */
44
+ export async function paramScope_run(params, operation) {
45
+ return await paramScope.run(params, operation);
46
+ }
47
+ /**
48
+ * Runs work in which an unanswerable reference stands as written.
49
+ *
50
+ * A dry run has run nothing, so a reference to what an earlier line WOULD
51
+ * have produced cannot be answered — and refusing there would make a dry run
52
+ * useless for exactly the manifests that chain, which is most of them.
53
+ *
54
+ * @param operation - The work to run.
55
+ * @returns The operation's result.
56
+ */
57
+ export async function unresolvedStands_run(operation) {
58
+ return await standsScope.run(true, operation);
59
+ }
60
+ /**
61
+ * Whether the work on this async path lets a reference stand unanswered.
62
+ *
63
+ * @returns True inside a dry run.
64
+ */
65
+ export function unresolvedStands_get() {
66
+ return standsScope.getStore() === true;
67
+ }
68
+ /**
69
+ * Whether a name is one the session answers for.
70
+ *
71
+ * @param name - The reference's name, dots and all.
72
+ * @returns True when the session owns it.
73
+ */
74
+ export function reference_isReserved(name) {
75
+ return RESERVED_REFERENCES.has(name.split('.')[0]);
76
+ }
77
+ /**
78
+ * What the cohort answers, for the pronoun that names part of it.
79
+ *
80
+ * @param name - The reference, such as `gather`, `gather.first.place`.
81
+ * @returns The values, or null when the cohort cannot answer.
82
+ */
83
+ async function cohort_reference(name) {
84
+ // Loaded on demand: the resolver sits under dispatch, and the cohort sits
85
+ // above it in a builtin.
86
+ const { cohort_read } = await import('../builtins/res/gather.store.js');
87
+ const state = await cohort_read();
88
+ const members = state.series;
89
+ // A member has two addresses and the difference is load-bearing: where it
90
+ // was gathered FROM, which `pull` takes, and where it LANDED, which a
91
+ // viewer and a run take.
92
+ const wantsPlace = name.endsWith('.place');
93
+ const stem = wantsPlace ? name.slice(0, -'.place'.length) : name;
94
+ const addressOf = (member) => {
95
+ if (!wantsPlace)
96
+ return member.vfsPath;
97
+ const landed = member.folderPath;
98
+ if (typeof landed === 'string' && landed.length > 0)
99
+ return landed;
100
+ return member.kind === 'series' ? null : member.vfsPath;
101
+ };
102
+ if (stem === 'gather') {
103
+ const addresses = members.map(addressOf);
104
+ if (addresses.some((address) => address === null))
105
+ return null;
106
+ return { values: addresses };
107
+ }
108
+ const which = stem.slice('gather.'.length);
109
+ if (which === 'size')
110
+ return { values: [`${members.length}`] };
111
+ if (which === 'name')
112
+ return { values: [state.name ?? ''] };
113
+ const pick = (member) => {
114
+ if (member === undefined)
115
+ return null;
116
+ const address = addressOf(member);
117
+ return address === null ? null : { values: [address] };
118
+ };
119
+ if (which === 'first')
120
+ return pick(members[0]);
121
+ if (which === 'last')
122
+ return pick(members[members.length - 1]);
123
+ const nth = Number(which);
124
+ if (Number.isInteger(nth) && nth >= 1 && nth <= members.length)
125
+ return pick(members[nth - 1]);
126
+ return null;
127
+ }
128
+ /**
129
+ * Reads what an index names: `@SER3`, `@STD001`, `@FIL2,3,7`, `@DIR2-4`.
130
+ *
131
+ * The kind is written once and the ordinals follow; zero padding is how
132
+ * the pill draws it, not something the operator must type. A range written
133
+ * backwards is still a range: the operator meant those rows.
134
+ *
135
+ * @param spec - The index without its sigil.
136
+ * @returns The handles, in the order written, or null when the spec is not
137
+ * an index.
138
+ */
139
+ export function indices_parse(spec) {
140
+ const match = spec.match(/^([A-Z]{3})(\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*)$/);
141
+ if (match === null)
142
+ return null;
143
+ const kind = match[1];
144
+ if (!ANSWER_KINDS.includes(kind))
145
+ return null;
146
+ const handles = [];
147
+ for (const part of match[2].split(',')) {
148
+ const range = part.match(/^(\d+)-(\d+)$/);
149
+ if (range === null) {
150
+ handles.push({ kind: kind, ordinal: Number(part) });
151
+ continue;
152
+ }
153
+ const from = Number(range[1]);
154
+ const to = Number(range[2]);
155
+ const step = from <= to ? 1 : -1;
156
+ for (let at = from; step > 0 ? at <= to : at >= to; at += step) {
157
+ handles.push({ kind: kind, ordinal: at });
158
+ }
159
+ }
160
+ return handles;
161
+ }
162
+ /**
163
+ * What each verb can be handed, by kind.
164
+ *
165
+ * A verb that is given the wrong kind refuses BY NAME at expansion —
166
+ * "IMAGE takes a series or a folder; STD001 is a study" — rather than
167
+ * resolving to a path and failing three steps later for a reason that
168
+ * names nothing the operator typed. A verb not listed takes any kind.
169
+ */
170
+ const VERB_TAKES = new Map([
171
+ ['image', ['SER', 'DIR', 'FIL']],
172
+ ['dcm', ['SER', 'DIR', 'FIL']],
173
+ ['pull', ['SER', 'STD', 'PAT']],
174
+ ['cat', ['FIL']],
175
+ ['cd', ['DIR', 'SER', 'STD']],
176
+ ['download', ['FIL']],
177
+ ]);
178
+ /** The kind a refusal names, in words. */
179
+ const KIND_WORDS = {
180
+ PAT: 'a patient', STD: 'a study', SER: 'a series', FIL: 'a file', DIR: 'a folder',
181
+ };
182
+ /** The verb the line began with, set by the dispatcher before expansion. */
183
+ let verbInHand = null;
184
+ /**
185
+ * Tells the resolver which verb the line is for, so an index can be
186
+ * refused by kind.
187
+ *
188
+ * @param verb - The command word, or null between lines.
189
+ */
190
+ export function verbInHand_set(verb) {
191
+ verbInHand = verb;
192
+ }
193
+ /** Why the last index was refused, when it was refused by kind. */
194
+ let kindRefusal = null;
195
+ /**
196
+ * What the rows an index names are worth, as operands.
197
+ *
198
+ * @param name - The index, sigil included.
199
+ * @returns The rows' values, or null when nothing is numbered, a number is
200
+ * past the end of its kind, or the verb in hand does not take the kind.
201
+ */
202
+ function index_resolve(name) {
203
+ kindRefusal = null;
204
+ const handles = indices_parse(name.slice(1));
205
+ if (handles === null || handles.length === 0)
206
+ return null;
207
+ const takes = verbInHand === null ? undefined : VERB_TAKES.get(verbInHand);
208
+ const values = [];
209
+ for (const handle of handles) {
210
+ if (takes !== undefined && !takes.includes(handle.kind)) {
211
+ kindRefusal = `${verbInHand} takes ${takes.map((kind) => KIND_WORDS[kind]).join(' or ')}; `
212
+ + `${handle.kind}${`${handle.ordinal}`.padStart(3, '0')} is ${KIND_WORDS[handle.kind]}.`;
213
+ return null;
214
+ }
215
+ const row = answerRow_get(handle);
216
+ if (row === null)
217
+ return null;
218
+ values.push(...row.values);
219
+ }
220
+ return { values };
221
+ }
222
+ /**
223
+ * Answers a reference: an index, then the session, then the manifest, then
224
+ * the environment.
225
+ *
226
+ * @param name - The reference's name.
227
+ * @returns What it refers to, or null when nothing does.
228
+ */
229
+ export async function reference_resolve(name) {
230
+ if (name.startsWith('@'))
231
+ return index_resolve(name);
232
+ if (name === 'cwd')
233
+ return { values: [await session.getCWD()] };
234
+ if (name === 'feed') {
235
+ const feed = recentFeed_get();
236
+ return feed === null ? null : { values: [`${feed}`] };
237
+ }
238
+ if (name === 'run') {
239
+ const runs = recentRuns_get();
240
+ return runs.length === 0 ? null : { values: [`${runs[runs.length - 1]}`] };
241
+ }
242
+ if (name === 'run.place') {
243
+ const place = recentRunPlace_get();
244
+ return place === null ? null : { values: [place] };
245
+ }
246
+ if (name === 'query') {
247
+ const query = recentQuery_get();
248
+ return query === null ? null : { values: [query] };
249
+ }
250
+ if (name === 'gather' || name.startsWith('gather.'))
251
+ return await cohort_reference(name);
252
+ const params = paramScope.getStore();
253
+ const given = params?.get(name);
254
+ if (given !== undefined)
255
+ return { values: [given] };
256
+ const environment = process.env[name];
257
+ return environment === undefined ? null : { values: [environment] };
258
+ }
259
+ /**
260
+ * Says where a reference was looked for, for a refusal an operator can act on.
261
+ *
262
+ * @param name - The reference nothing answered.
263
+ * @returns The refusal's text.
264
+ */
265
+ export function reference_refusal(name) {
266
+ const scoped = paramScope.getStore() !== undefined;
267
+ const places = scoped ? "the session, this manifest's parameters, the environment" : 'the session, the environment';
268
+ if (name.startsWith('@')) {
269
+ if (kindRefusal !== null)
270
+ return `${name}: ${kindRefusal}`;
271
+ const numbered = answer_get();
272
+ if (numbered === null)
273
+ return `${name}: nothing is numbered yet — list something first.`;
274
+ const handles = indices_parse(name.slice(1));
275
+ if (handles === null) {
276
+ return `${name}: an index says what it counts — @SER3, @STD1, @FIL2, @DIR4 — and may list or range them (@SER2,3 or @SER2-5).`;
277
+ }
278
+ const kind = handles[0].kind;
279
+ const count = answerKind_count(kind);
280
+ return count === 0
281
+ ? `${name}: the last answer (${numbered.source}) holds no ${KIND_WORDS[kind]} rows.`
282
+ : `${name}: the last answer (${numbered.source}) holds ${count} ${kind} row${count === 1 ? '' : 's'}.`;
283
+ }
284
+ const hint = reference_isReserved(name)
285
+ ? ` — nothing in this session has one yet`
286
+ : '';
287
+ return `\${${name}}: nothing to put there${hint}. Looked in ${places}.`;
288
+ }
289
+ //# sourceMappingURL=expansion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expansion.js","sourceRoot":"","sources":["../../src/core/expansion.ts"],"names":[],"mappings":"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"}
@@ -56,10 +56,13 @@ export async function sessionPromptContext_build(options = {}) {
56
56
  id: load.feedID, loaded: load.loaded, total: load.total, ...(load.failed !== undefined ? { failed: load.failed } : {}),
57
57
  }));
58
58
  const arrived = procCache_get().arrivals_recent();
59
+ // Feeds whose topology just landed, each with its shape: the space of
60
+ // everything run here, materialising on a surface as the index reads it.
61
+ const landed = procCache_get().topologyLanded_recent();
59
62
  const roster = procCache_get().rosterSync_get();
60
63
  const sweeping = warmupRaw.active || lifecycle.state === 'reconciling' || lifecycle.state === 'failed';
61
64
  const warmupFailures = warmupFailures_list();
62
- const procWarmup = sweeping || feedLoad !== null || arrived.length > 0 || roster !== null
65
+ const procWarmup = sweeping || feedLoad !== null || arrived.length > 0 || landed.length > 0 || roster !== null
63
66
  ? {
64
67
  loaded: warmupRaw.loaded,
65
68
  total: warmupRaw.total,
@@ -68,6 +71,7 @@ export async function sessionPromptContext_build(options = {}) {
68
71
  sweeping,
69
72
  ...(feedLoad !== null ? { feed: feeds[0], feeds } : {}),
70
73
  ...(arrived.length > 0 ? { arrived } : {}),
74
+ ...(landed.length > 0 ? { landed } : {}),
71
75
  ...(roster !== null ? { roster } : {}),
72
76
  }
73
77
  : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"promptContext.js","sourceRoot":"","sources":["../../src/core/promptContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"promptContext.js","sourceRoot":"","sources":["../../src/core/promptContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @file How the language reads a duration.
3
+ *
4
+ * `expect --within` and `play --pace` are the same notion of time, so they
5
+ * read it with the same function: a second parser beside this one is a
6
+ * second set of durations that mean something slightly else, and a manifest
7
+ * that says `20m` in two places must mean twenty minutes in both.
8
+ *
9
+ * @module
10
+ */
11
+ /**
12
+ * Reads a duration the way an operator writes one.
13
+ *
14
+ * @param text - A duration such as `30s`, `20m`, `2h`, `250ms`, or bare seconds.
15
+ * @returns Milliseconds, or null when the text is not a duration.
16
+ */
17
+ export declare function duration_parse(text: string): number | null;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @file How the language reads a duration.
3
+ *
4
+ * `expect --within` and `play --pace` are the same notion of time, so they
5
+ * read it with the same function: a second parser beside this one is a
6
+ * second set of durations that mean something slightly else, and a manifest
7
+ * that says `20m` in two places must mean twenty minutes in both.
8
+ *
9
+ * @module
10
+ */
11
+ /** How long each unit lasts, in milliseconds. */
12
+ const UNIT_MS = { ms: 1, s: 1000, m: 60000, h: 3600000 };
13
+ /**
14
+ * Reads a duration the way an operator writes one.
15
+ *
16
+ * @param text - A duration such as `30s`, `20m`, `2h`, `250ms`, or bare seconds.
17
+ * @returns Milliseconds, or null when the text is not a duration.
18
+ */
19
+ export function duration_parse(text) {
20
+ const match = text.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m|h)?$/);
21
+ if (match === null)
22
+ return null;
23
+ return Number(match[1]) * UNIT_MS[match[2] ?? 's'];
24
+ }
25
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../../src/lib/duration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iDAAiD;AACjD,MAAM,OAAO,GAA2B,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACzF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AACrD,CAAC"}
@@ -5,12 +5,32 @@
5
5
  * backslash escapes. Quotes are stripped from rendered values, but their
6
6
  * pathname-expansion meaning is retained.
7
7
  */
8
+ /**
9
+ * One piece of a word: literal text, or a reference the line asked for.
10
+ *
11
+ * The tokenizer records references rather than resolving them, because
12
+ * resolving is asynchronous (a pronoun asks the session) and tokenizing is
13
+ * not. What it must record is the QUOTING, since that is known only here:
14
+ * inside single quotes a `$` is text, inside double quotes a reference is
15
+ * one operand however many values it carries, and bare it may become
16
+ * several — the shell's rule, which the stack claims to wear.
17
+ */
18
+ export interface ShellSegment {
19
+ /** Literal text, when this piece is text. */
20
+ text: string;
21
+ /** The reference's name, when this piece is one. */
22
+ ref: string | null;
23
+ /** Whether the reference stood inside double quotes. */
24
+ quoted: boolean;
25
+ }
8
26
  /** A rendered shell word and the glob pattern it may contribute. */
9
27
  export interface ShellWord {
10
28
  value: string;
11
29
  globPattern: string;
12
30
  pathnameExpansion: boolean;
13
31
  pathnameExpanded: boolean;
32
+ /** The word's pieces, when it holds a reference; absent when it is plain text. */
33
+ segments?: ShellSegment[];
14
34
  }
15
35
  /** String arguments with per-operand pathname-expansion provenance. */
16
36
  export type ShellArguments = string[] & {
@@ -84,3 +104,33 @@ export declare function shellWords_tokenize(line: string): ShellWord[];
84
104
  * @returns Array of tokens with quotes removed.
85
105
  */
86
106
  export declare function args_tokenize(line: string): string[];
107
+ /** What a reference turned out to be. */
108
+ export type ReferenceValue = {
109
+ values: string[];
110
+ } | null;
111
+ /** Answers what a reference refers to, or null when nothing does. */
112
+ export type ReferenceResolver = (name: string) => Promise<ReferenceValue>;
113
+ /** How reference expansion went. */
114
+ export type ReferenceExpansion = {
115
+ ok: true;
116
+ words: ShellWord[];
117
+ } | {
118
+ ok: false;
119
+ missing: string;
120
+ };
121
+ /**
122
+ * Resolves the references in a line's words, respecting how they were quoted.
123
+ *
124
+ * The shell's rule, kept: a bare reference carrying several values becomes
125
+ * several operands, a double-quoted one stays a single operand however many
126
+ * values it holds, and a single-quoted `$` never got here at all. An
127
+ * expanded value never globs afterwards — a filename with a bracket in it is
128
+ * a filename, not a pattern.
129
+ *
130
+ * @param words - The tokenized words.
131
+ * @param resolve - Answers what a reference refers to.
132
+ * @param unresolvedStands - Leave an unanswerable reference as written
133
+ * instead of refusing: what a dry run does, having run nothing.
134
+ * @returns The expanded words, or the reference nothing could answer.
135
+ */
136
+ export declare function shellWords_referencesExpand(words: readonly ShellWord[], resolve: ReferenceResolver, unresolvedStands?: boolean): Promise<ReferenceExpansion>;
@@ -5,6 +5,23 @@
5
5
  * backslash escapes. Quotes are stripped from rendered values, but their
6
6
  * pathname-expansion meaning is retained.
7
7
  */
8
+ /**
9
+ * What a reference looks like: `${name}` or a bare `$NAME`.
10
+ *
11
+ * A braced name may carry dots, which is how a session pronoun names part
12
+ * of what it refers to (`${gather.first.place}`); a bare one may not, so
13
+ * `$HOME.txt` keeps its extension.
14
+ */
15
+ const REFERENCE_PATTERN = /^\$(?:\{([A-Za-z_][A-Za-z0-9_.]*)\}|([A-Za-z_][A-Za-z0-9_]*))/;
16
+ /**
17
+ * What an index looks like: `@SER3`, `@STD001`, `@FIL2,3,7`, `@DIR2-4`.
18
+ *
19
+ * A row of the session's last answer, named by the handle the listing shows
20
+ * beside it — the KIND it counts, then its place in that kind's sequence.
21
+ * The sigil keeps it unambiguous: a directory called `SER3` is a path, and
22
+ * `@SER3` never is.
23
+ */
24
+ const INDEX_PATTERN = /^@([A-Z]{3}\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*)/;
8
25
  /** Escapes wildcard metacharacters for literal minimatch use. */
9
26
  function globLiteral_escape(value) {
10
27
  return value.replace(/[\\*?\[\]]/g, '\\$&');
@@ -132,25 +149,49 @@ export function shellWords_tokenize(line) {
132
149
  let inSingle = false;
133
150
  let inDouble = false;
134
151
  let escapeNext = false;
152
+ let segments = [];
153
+ let pendingText = '';
154
+ const text_flush = () => {
155
+ if (pendingText.length === 0)
156
+ return;
157
+ segments.push({ text: pendingText, ref: null, quoted: false });
158
+ pendingText = '';
159
+ };
135
160
  const character_append = (char, literal) => {
136
161
  currentValue += char;
137
162
  currentPattern += literal ? globLiteral_escape(char) : char;
138
163
  pathnameExpansion ||= !literal && /[*?[\]]/.test(char);
164
+ pendingText += char;
165
+ wordStarted = true;
166
+ };
167
+ const reference_append = (name, raw, quoted) => {
168
+ text_flush();
169
+ segments.push({ text: '', ref: name, quoted });
170
+ // The value keeps the reference as written: every reader that does not
171
+ // resolve references (completion, help, the tests) sees the line as the
172
+ // operator typed it.
173
+ currentValue += raw;
174
+ currentPattern += globLiteral_escape(raw);
139
175
  wordStarted = true;
140
176
  };
141
177
  const word_pushCurrent = () => {
142
178
  if (!wordStarted)
143
179
  return;
180
+ text_flush();
181
+ const held = segments;
144
182
  tokens.push({
145
183
  value: currentValue,
146
184
  globPattern: currentPattern,
147
185
  pathnameExpansion,
148
186
  pathnameExpanded: false,
187
+ ...(held.some((segment) => segment.ref !== null) ? { segments: held } : {}),
149
188
  });
150
189
  currentValue = '';
151
190
  currentPattern = '';
152
191
  pathnameExpansion = false;
153
192
  wordStarted = false;
193
+ segments = [];
194
+ pendingText = '';
154
195
  };
155
196
  for (let i = 0; i < line.length; i++) {
156
197
  const char = line[i];
@@ -178,6 +219,29 @@ export function shellWords_tokenize(line) {
178
219
  word_pushCurrent();
179
220
  continue;
180
221
  }
222
+ // An index into the session's last answer, unless it stands in quotes.
223
+ // Only at the START of a word: `user@host` is not an index, and neither
224
+ // is an email address in a tag value.
225
+ if (char === '@' && !inSingle && !inDouble && !wordStarted) {
226
+ const rest = line.slice(i);
227
+ const match = rest.match(INDEX_PATTERN);
228
+ if (match !== null) {
229
+ reference_append(`@${match[1]}`, match[0], false);
230
+ i += match[0].length - 1;
231
+ continue;
232
+ }
233
+ }
234
+ // A reference, unless it stands in single quotes, where a `$` is text —
235
+ // which is what makes a quoted DICOM value or a literal price safe.
236
+ if (char === '$' && !inSingle) {
237
+ const rest = line.slice(i);
238
+ const match = rest.match(REFERENCE_PATTERN);
239
+ if (match !== null) {
240
+ reference_append(match[1] ?? match[2], match[0], inDouble);
241
+ i += match[0].length - 1;
242
+ continue;
243
+ }
244
+ }
181
245
  character_append(char, inSingle || inDouble);
182
246
  }
183
247
  word_pushCurrent();
@@ -192,4 +256,59 @@ export function shellWords_tokenize(line) {
192
256
  export function args_tokenize(line) {
193
257
  return shellWords_tokenize(line).map((word) => word.value);
194
258
  }
259
+ /**
260
+ * Resolves the references in a line's words, respecting how they were quoted.
261
+ *
262
+ * The shell's rule, kept: a bare reference carrying several values becomes
263
+ * several operands, a double-quoted one stays a single operand however many
264
+ * values it holds, and a single-quoted `$` never got here at all. An
265
+ * expanded value never globs afterwards — a filename with a bracket in it is
266
+ * a filename, not a pattern.
267
+ *
268
+ * @param words - The tokenized words.
269
+ * @param resolve - Answers what a reference refers to.
270
+ * @param unresolvedStands - Leave an unanswerable reference as written
271
+ * instead of refusing: what a dry run does, having run nothing.
272
+ * @returns The expanded words, or the reference nothing could answer.
273
+ */
274
+ export async function shellWords_referencesExpand(words, resolve, unresolvedStands = false) {
275
+ const expanded = [];
276
+ for (const word of words) {
277
+ const segments = word.segments;
278
+ if (segments === undefined) {
279
+ expanded.push(word);
280
+ continue;
281
+ }
282
+ // A word that is nothing but one bare reference is the list case: it may
283
+ // leave as several operands. Anything else joins into one word.
284
+ const lone = segments.length === 1 && segments[0].ref !== null && !segments[0].quoted;
285
+ let rendered = '';
286
+ let split = null;
287
+ for (const segment of segments) {
288
+ if (segment.ref === null) {
289
+ rendered += segment.text;
290
+ continue;
291
+ }
292
+ const held = await resolve(segment.ref);
293
+ if (held === null) {
294
+ if (!unresolvedStands)
295
+ return { ok: false, missing: segment.ref };
296
+ rendered += `\${${segment.ref}}`;
297
+ continue;
298
+ }
299
+ if (lone && held.values.length !== 1) {
300
+ split = held.values;
301
+ continue;
302
+ }
303
+ rendered += held.values.join(' ');
304
+ }
305
+ if (split !== null) {
306
+ for (const value of split)
307
+ expanded.push(shellWord_literal(value));
308
+ continue;
309
+ }
310
+ expanded.push(shellWord_literal(rendered));
311
+ }
312
+ return { ok: true, words: expanded };
313
+ }
195
314
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/lib/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/lib/parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqCH;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAW,+DAA+D,CAAC;AAElG;;;;;;;GAOG;AACH,MAAM,aAAa,GAAW,4CAA4C,CAAC;AAE3E,iEAAiE;AACjE,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO;QACL,KAAK;QACL,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC;QACtC,iBAAiB,EAAE,KAAK;QACxB,gBAAgB,EAAE,KAAK;KACxB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO;QACL,KAAK;QACL,WAAW,EAAE,KAAK;QAClB,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,gBAAgB,EAAE,KAAK;KACxB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA2B;IAC3D,MAAM,MAAM,GAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAe,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAmB,CAAC;IACpG,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;QAChD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAe,EAAW,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACrE,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACjD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAe,EAAW,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACtE,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAAuB,EAAE,KAAa;IACpF,MAAM,QAAQ,GAAoC,IAAuB,CAAC,gBAAgB,CAAC;IAC3F,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACpC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAAuB,EAAE,KAAa;IACrF,MAAM,SAAS,GAAoC,IAAuB,CAAC,iBAAiB,CAAC;IAC7F,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAAuB,EACvB,MAAiC;IAEjC,MAAM,MAAM,GAAmB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAmB,CAAC;IAClE,MAAM,MAAM,GAAmB,IAAsB,CAAC;IACtD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;QAChD,KAAK,EAAE,MAAM,CAAC,gBAAgB;QAC9B,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACjD,KAAK,EAAE,MAAM,CAAC,iBAAiB;QAC/B,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB,EAAE,KAAa;IACzE,MAAM,MAAM,GAAmB,IAAsB,CAAC;IACtD,MAAM,MAAM,GAAmB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAmB,CAAC;IACnE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;QAChD,KAAK,EAAE,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC;QAC5C,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACjD,KAAK,EAAE,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC;QAC7C,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAW,EAAE,CAAC;IAC9B,IAAI,cAAc,GAAW,EAAE,CAAC;IAChC,IAAI,iBAAiB,GAAY,KAAK,CAAC;IACvC,IAAI,WAAW,GAAY,KAAK,CAAC;IACjC,IAAI,QAAQ,GAAY,KAAK,CAAC;IAC9B,IAAI,QAAQ,GAAY,KAAK,CAAC;IAC9B,IAAI,UAAU,GAAY,KAAK,CAAC;IAEhC,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,WAAW,GAAW,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,WAAW,GAAG,EAAE,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,OAAgB,EAAQ,EAAE;QAChE,YAAY,IAAI,IAAI,CAAC;QACrB,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,iBAAiB,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,WAAW,IAAI,IAAI,CAAC;QACpB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,MAAe,EAAQ,EAAE;QAC5E,UAAU,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,uEAAuE;QACvE,wEAAwE;QACxE,qBAAqB;QACrB,YAAY,IAAI,GAAG,CAAC;QACpB,cAAc,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC1C,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,GAAS,EAAE;QAClC,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,UAAU,EAAE,CAAC;QACb,MAAM,IAAI,GAAmB,QAAQ,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,cAAc;YAC3B,iBAAiB;YACjB,gBAAgB,EAAE,KAAK;YACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAqB,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnG,CAAC,CAAC;QACH,YAAY,GAAG,EAAE,CAAC;QAClB,cAAc,GAAG,EAAE,CAAC;QACpB,iBAAiB,GAAG,KAAK,CAAC;QAC1B,WAAW,GAAG,KAAK,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;QACd,WAAW,GAAG,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,UAAU,EAAE,CAAC;YACf,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7B,UAAU,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,UAAU,GAAG,IAAI,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,gBAAgB,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QAED,uEAAuE;QACvE,wEAAwE;QACxE,sCAAsC;QACtC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,GAA4B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACjE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,gBAAgB,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAClD,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,oEAAoE;QACpE,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,GAA4B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC3D,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;QACH,CAAC;QAED,gBAAgB,CAAC,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,gBAAgB,EAAE,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAe,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAaD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAA2B,EAC3B,OAA0B,EAC1B,mBAA4B,KAAK;IAEjC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAA+B,IAAI,CAAC,QAAQ,CAAC;QAC3D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,gEAAgE;QAChE,MAAM,IAAI,GAAY,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/F,IAAI,QAAQ,GAAW,EAAE,CAAC;QAC1B,IAAI,KAAK,GAAoB,IAAI,CAAC;QAElC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YACjE,MAAM,IAAI,GAAmB,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,gBAAgB;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;gBAClE,QAAQ,IAAI,MAAM,OAAO,CAAC,GAAG,GAAG,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YACxE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC"}