@albertomarturelo/sii-core 0.13.0 → 0.14.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 (41) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/auth/auth.d.ts.map +1 -1
  3. package/dist/auth/auth.js +7 -5
  4. package/dist/auth/auth.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/portal/f22/index.d.ts +1 -0
  10. package/dist/portal/f22/index.d.ts.map +1 -1
  11. package/dist/portal/f22/index.js +1 -0
  12. package/dist/portal/f22/index.js.map +1 -1
  13. package/dist/portal/f22/shared.d.ts +10 -1
  14. package/dist/portal/f22/shared.d.ts.map +1 -1
  15. package/dist/portal/f22/shared.js +13 -11
  16. package/dist/portal/f22/shared.js.map +1 -1
  17. package/dist/portal/f22/terceros.d.ts +58 -0
  18. package/dist/portal/f22/terceros.d.ts.map +1 -0
  19. package/dist/portal/f22/terceros.js +323 -0
  20. package/dist/portal/f22/terceros.js.map +1 -0
  21. package/dist/portal/f29-rfi-form.d.ts +40 -0
  22. package/dist/portal/f29-rfi-form.d.ts.map +1 -0
  23. package/dist/portal/f29-rfi-form.js +627 -0
  24. package/dist/portal/f29-rfi-form.js.map +1 -0
  25. package/dist/portal/f29-rfi.d.ts +13 -0
  26. package/dist/portal/f29-rfi.d.ts.map +1 -0
  27. package/dist/portal/f29-rfi.js +37 -0
  28. package/dist/portal/f29-rfi.js.map +1 -0
  29. package/dist/portal/gwt.d.ts +99 -0
  30. package/dist/portal/gwt.d.ts.map +1 -1
  31. package/dist/portal/gwt.js +618 -2
  32. package/dist/portal/gwt.js.map +1 -1
  33. package/dist/portal/rfi-schema.d.ts +7 -0
  34. package/dist/portal/rfi-schema.d.ts.map +1 -0
  35. package/dist/portal/rfi-schema.js +429 -0
  36. package/dist/portal/rfi-schema.js.map +1 -0
  37. package/dist/tasks/f22.d.ts +38 -2
  38. package/dist/tasks/f22.d.ts.map +1 -1
  39. package/dist/tasks/f22.js +126 -6
  40. package/dist/tasks/f22.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,323 @@
1
+ // Información de terceros: the declaraciones juradas third parties filed about the taxpayer
2
+ // for an año tributario (employers, banks, AGFs, corredoras…). The F22 propuesta is built from
3
+ // them. Observed first-hand 2026-10-21 (spike #184, own persona session, AT 2026): SII's
4
+ // "Información de sus ingresos, agentes retenedores y otros" is its own Angular SPA,
5
+ // `djconsultarentaui`, over the same SDI envelope as the F22-status app (shared.ts).
6
+ // Full contract: docs/sii-contract/f22.md « Terceros ».
7
+ //
8
+ // The answers are RENDER GRIDS, not named fields: multi-level headers (colspan/rowspan), a RUT
9
+ // across three positions, and a column set that differs per DJ. `parseGrid` turns one into rows
10
+ // of `{ columna, valor }`, `columna` being the path of header labels above the cell.
11
+ //
12
+ // SESSION-KEYED (ADR-005) although `getDjDetalle` carries a RUT: under a persona session the
13
+ // represented empresa's RUT answered "Acceso no autorizado!" (observed 2026-10-21).
14
+ // PII (ADR-006): the column set is per DJ and not provably enumerable, so there is no `raw` and
15
+ // the taxpayer's own RUT and name are dropped by VALUE, not by column label.
16
+ import { z } from 'zod';
17
+ import { HOSTS } from '../../config/index.js';
18
+ import { F22Error } from '../../errors/index.js';
19
+ import { asNumber, postSdi, rutDigits } from './shared.js';
20
+ const BASE = `${HOSTS.portalApi}/djconsultarentaui/services/data/facadeService`;
21
+ const NAMESPACE = 'cl.sii.sdi.lob.renta.djconsultarenta.data.api.interfaces.FacadeService';
22
+ /** The SPA sends `metaData.page: null` (observed), unlike `consultaestadof22ui`. */
23
+ const TERCEROS_APP = {
24
+ referer: `${HOSTS.portalApi}/djconsultarentaui/internet/`,
25
+ metaPage: true,
26
+ };
27
+ /** Rows per `getDjDetalle` answer (observed: 10 per page, the last page holds the rest). */
28
+ export const TERCEROS_PAGE_SIZE = 10;
29
+ /** AT 2026 ⇒ `"202600"`: the año tributario plus `"00"`, sent as a string (observed). */
30
+ const periodoOf = (anio) => `${anio.canonical}00`;
31
+ // --- Wire shape (zod at the boundary, ADR-011) ------------------------------------
32
+ const Cell = z
33
+ .object({
34
+ colspan: z.number().nullish(),
35
+ rowspan: z.number().nullish(),
36
+ value: z.union([z.string(), z.number()]).nullish(),
37
+ esParteDeSpan: z.boolean().nullish(),
38
+ })
39
+ .loose();
40
+ const Row = z.object({ fila: z.record(z.string(), Cell), tipoCelda: z.string() }).loose();
41
+ const Grid = z
42
+ .object({ tabla: z.record(z.string(), Row), cantRegistros: z.number().nullish() })
43
+ .loose();
44
+ const Secciones = z.record(z.string(), z.record(z.string(), Grid));
45
+ const Resumen = z
46
+ .array(z.object({ listAgenteRetenedor: Secciones, title: z.string().nullish() }).loose())
47
+ .nullish();
48
+ const Detalle = z.object({ listDetalle: Secciones }).loose().nullish();
49
+ const roto = (what) => new F22Error(`Scraper roto: ${what} (información de terceros, F22).`);
50
+ // --- Values ------------------------------------------------------------------------
51
+ /** One title arrived double-encoded (UTF-8 bytes read as Latin-1: `Enajenación`, `N°`)
52
+ * while the others were clean (observed 2026-10-21). Re-decode only that pattern, and only
53
+ * when the bytes are valid UTF-8; anything else stays as SII sent it. */
54
+ function fixMojibake(s) {
55
+ if (!/[ÃÂ]/.test(s))
56
+ return s;
57
+ const codes = [...s].map((ch) => ch.charCodeAt(0));
58
+ if (codes.some((c) => c > 0xff))
59
+ return s;
60
+ try {
61
+ return new TextDecoder('utf-8', { fatal: true }).decode(Uint8Array.from(codes));
62
+ }
63
+ catch {
64
+ return s;
65
+ }
66
+ }
67
+ /** A label or text value: re-decoded, ` `/U+00A0 as a space, whitespace collapsed;
68
+ * blank ⇒ null (a blank cell is a legitimately absent value, CONVENTIONS). */
69
+ function text(v) {
70
+ if (v === null || v === undefined)
71
+ return null;
72
+ const s = fixMojibake(String(v))
73
+ .replace(/ | /g, ' ')
74
+ .replace(/\s+/g, ' ')
75
+ .trim();
76
+ return s === '' ? null : s;
77
+ }
78
+ // es-CL integers/decimals as SII prints montos (`"1.234.567"`, `"0"`, `"12,5"`). A digit
79
+ // string with a leading zero is a code, not an amount, so it stays a string.
80
+ const ES_CL_NUMBER = /^-?(?:[1-9]\d{0,2}(?:\.\d{3})+|[1-9]\d*|0)(?:,\d+)?$/;
81
+ const DD_MM_YYYY = /^(\d{2})-(\d{2})-(\d{4})$/;
82
+ function typed(v) {
83
+ if (typeof v === 'number')
84
+ return Number.isFinite(v) ? v : null;
85
+ const s = text(v);
86
+ if (s === null)
87
+ return null;
88
+ const d = DD_MM_YYYY.exec(s);
89
+ if (d)
90
+ return `${d[3]}-${d[2]}-${d[1]}`;
91
+ return ES_CL_NUMBER.test(s) ? asNumber(s) : s;
92
+ }
93
+ const norm = (s) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().replace(/\s+/g, ' ').trim();
94
+ // Connector words a name and a razón social share without naming the same party: "Juan DE LA
95
+ // Fuente" and "Banco DE LA Nación" must not match. Words under three letters are dropped too.
96
+ const NAME_CONNECTORS = new Set(['del', 'las', 'los', 'san', 'spa', 'ltda', 'limitada']);
97
+ /** A name's significant tokens, order-free: SII prints the same person as "NOMBRE APELLIDO" in
98
+ * one place and "APELLIDO NOMBRE" in another. */
99
+ const nameTokens = (s) => new Set(norm(s)
100
+ .split(/[^a-z]+/)
101
+ .filter((t) => t.length >= 3 && !NAME_CONNECTORS.has(t)));
102
+ /** The informado (the taxpayer) is the "partícipe o aportante" of the fund DJs: observed
103
+ * 2026-10-21 as `Rut Partícipe`, `Nombre o Razón Social del Partícipe o Aportante`,
104
+ * `RUT del Partícipe o Aportante` and `Código País de Residencia del Partícipe o Aportante`.
105
+ * Those columns are the taxpayer's own identity, so they are dropped by label. The informante
106
+ * spells the name its own way (2 of 3 words matched the Mi SII name), so a value match alone
107
+ * would let it through. */
108
+ const OWN_IDENTITY_COLUMN = /\bparticipe\b|\baportante\b/;
109
+ const RUT_LABEL = /\b(rut|run)\b/i;
110
+ // --- The grid ------------------------------------------------------------------------
111
+ const byNumber = (a, b) => Number(a) - Number(b);
112
+ function cellsOf(row) {
113
+ const keys = Object.keys(row.fila).sort(byNumber);
114
+ return keys.map((k, i) => {
115
+ const cell = row.fila[k];
116
+ if (Number(k) !== i || cell === undefined)
117
+ throw roto('una fila con posiciones no contiguas');
118
+ return cell;
119
+ });
120
+ }
121
+ /** Header paths per position. The width comes from the `dato` rows: the first header row can
122
+ * be a title ("Seccion B: DATOS DE LOS INFORMADOS") whose colspan is `cantidadColumnas`, and
123
+ * that was observed WIDER than the grid (78 vs 65), so it is skipped, never used for width. */
124
+ function columnas(headers, width) {
125
+ const rows = headers.map(cellsOf);
126
+ const first = rows[0];
127
+ const isTitle = first !== undefined &&
128
+ first.filter((c) => !c.esParteDeSpan && text(c.value) !== null).length === 1 &&
129
+ (first.find((c) => !c.esParteDeSpan)?.colspan ?? 1) > 1;
130
+ const body = isTitle ? rows.slice(1) : rows;
131
+ // Paint each label over its colspan × rowspan rectangle. A null-valued cell (SII emits one
132
+ // under a rowspan, e.g. `null{c3}`) paints nothing.
133
+ const painted = body.map(() => new Array(width).fill(null));
134
+ body.forEach((cells, r) => {
135
+ if (cells.length !== width) {
136
+ throw roto(`un encabezado de ${cells.length} posiciones en una grilla de ${width}`);
137
+ }
138
+ cells.forEach((cell, p) => {
139
+ const label = cell.esParteDeSpan ? null : text(cell.value);
140
+ if (label === null)
141
+ return;
142
+ for (let dr = 0; dr < (cell.rowspan ?? 1) && r + dr < body.length; dr++) {
143
+ for (let dc = 0; dc < (cell.colspan ?? 1) && p + dc < width; dc++) {
144
+ const line = painted[r + dr];
145
+ if (line && line[p + dc] === null)
146
+ line[p + dc] = label;
147
+ }
148
+ }
149
+ });
150
+ });
151
+ const paths = Array.from({ length: width }, (_, p) => {
152
+ const labels = [];
153
+ for (const line of painted) {
154
+ const l = line[p];
155
+ if (l !== null && l !== undefined && labels.at(-1) !== l)
156
+ labels.push(l);
157
+ }
158
+ // The SII-internal ítems carry unlabeled data columns: `303` (Comparativo F29 y Registro de
159
+ // compra y venta) labels only its first one (observed). Name them by position.
160
+ return labels.length === 0 ? `columna ${p + 1}` : labels.join(' › ');
161
+ });
162
+ const out = [];
163
+ for (let p = 0; p < width;) {
164
+ let end = p + 1;
165
+ while (end < width && paths[end] === paths[p])
166
+ end++;
167
+ const path = paths[p] ?? '';
168
+ const run = end - p;
169
+ if (run === 3 && RUT_LABEL.test(path)) {
170
+ out.push({ path, start: p, width: 3, rut: true });
171
+ }
172
+ else {
173
+ // A run that is not a RUT keeps each position as its own column, under the same label.
174
+ for (let i = p; i < end; i++)
175
+ out.push({ path, start: i, width: 1, rut: false });
176
+ }
177
+ p = end;
178
+ }
179
+ return out;
180
+ }
181
+ /** body | "-" | dv ⇒ `<body>-<DV>`. `0 - 0` is how SII prints an absent RUT (observed). */
182
+ function joinRut(cells) {
183
+ const body = text(cells[0]?.value)?.replace(/\./g, '') ?? null;
184
+ const dv = text(cells[2]?.value);
185
+ if (body === null || dv === null || /^0+$/.test(body))
186
+ return null;
187
+ return `${body}-${dv.toUpperCase()}`;
188
+ }
189
+ /** The grid's `dato` rows as `{ columna, valor }` lists, with the taxpayer's own RUT and name
190
+ * removed by value. A row whose width differs from the others ⇒ "scraper roto"
191
+ * (CONVENTIONS: an HTML table parser fails loud on an unexpected cell count). */
192
+ function parseGrid(grid, propio) {
193
+ const rows = Object.keys(grid.tabla)
194
+ .sort(byNumber)
195
+ .map((k) => grid.tabla[k])
196
+ .filter((r) => r !== undefined);
197
+ for (const r of rows) {
198
+ if (r.tipoCelda !== 'cabecera' && r.tipoCelda !== 'dato') {
199
+ throw roto(`una fila de tipo "${r.tipoCelda}"`);
200
+ }
201
+ }
202
+ const datos = rows.filter((r) => r.tipoCelda === 'dato').map(cellsOf);
203
+ const width = datos[0]?.length ?? 0;
204
+ if (width === 0)
205
+ return [];
206
+ if (datos.some((d) => d.length !== width))
207
+ throw roto('filas de distinto ancho');
208
+ const cols = columnas(rows.filter((r) => r.tipoCelda === 'cabecera'), width);
209
+ const ownRut = propio.rut.canonical;
210
+ const ownBody = String(propio.rut.body);
211
+ const ownName = propio.nombre !== null ? nameTokens(propio.nombre) : null;
212
+ // By value, besides the label rule: the joined RUT exactly, a bare RUT body only under a
213
+ // RUT/RUN label (a monto may happen to equal those digits), and the name when two of its
214
+ // significant words match (an informante may drop or misspell one).
215
+ const isOwn = (campo) => {
216
+ const v = campo.valor;
217
+ if (v === null)
218
+ return false;
219
+ const s = String(v);
220
+ if (s === ownRut)
221
+ return true;
222
+ if (RUT_LABEL.test(campo.columna) && s.replace(/\./g, '') === ownBody)
223
+ return true;
224
+ if (ownName === null || ownName.size < 2 || typeof v !== 'string')
225
+ return false;
226
+ let shared = 0;
227
+ for (const t of nameTokens(v))
228
+ if (ownName.has(t))
229
+ shared++;
230
+ return shared >= 2;
231
+ };
232
+ return datos.map((cells) => cols
233
+ .filter((c) => !OWN_IDENTITY_COLUMN.test(norm(c.path)))
234
+ .map((c) => ({
235
+ columna: c.path,
236
+ valor: c.rut ? joinRut(cells.slice(c.start, c.start + 3)) : typed(cells[c.start]?.value),
237
+ }))
238
+ .filter((campo) => !isOwn(campo)));
239
+ }
240
+ // The columns every detalle carries (observed on all of them), matched on the normalized
241
+ // header path. `Tipo de Formulario` is the DJ itself, so it is dropped.
242
+ const FIJAS = {
243
+ folio: 'folio',
244
+ declaranteRut: 'rut declarante',
245
+ declaranteNombre: 'nombre o razon social declarante',
246
+ fechaPresentacion: 'fecha presentacion',
247
+ estado: 'estado',
248
+ origen: 'origen de la informacion',
249
+ };
250
+ const OMITIDA = 'tipo de formulario';
251
+ function toFila(campos) {
252
+ const fijas = {};
253
+ const resto = [];
254
+ const keyOf = new Map(Object.entries(FIJAS).map(([k, label]) => [label, k]));
255
+ for (const c of campos) {
256
+ const n = norm(c.columna);
257
+ const key = keyOf.get(n);
258
+ if (key !== undefined && !(key in fijas))
259
+ fijas[key] = c.valor === null ? null : String(c.valor);
260
+ else if (n !== OMITIDA)
261
+ resto.push(c);
262
+ }
263
+ const get = (k) => fijas[k] ?? null;
264
+ return {
265
+ folio: get('folio'),
266
+ declaranteRut: get('declaranteRut'),
267
+ declaranteNombre: get('declaranteNombre'),
268
+ fechaPresentacion: get('fechaPresentacion'),
269
+ estado: get('estado'),
270
+ origen: get('origen'),
271
+ campos: resto,
272
+ };
273
+ }
274
+ // --- Facades -------------------------------------------------------------------------
275
+ /** `getAgenteRetenedor`: one ítem per DJ the taxpayer has information under, with the resumen
276
+ * grid's aggregates (informantes, montos informados). ONE call. No RUT in the body (observed):
277
+ * SII reads the session principal. `data: null` / `[]` ⇒ no ítems, not an error. */
278
+ export async function fetchF22TercerosResumen(session, params) {
279
+ const env = await postSdi(session, `${BASE}/getAgenteRetenedor`, `${NAMESPACE}/getAgenteRetenedor`, { periodo: periodoOf(params.anio) }, TERCEROS_APP);
280
+ const parsed = Resumen.safeParse(env.data);
281
+ if (!parsed.success)
282
+ throw roto('el resumen no es una lista de declaraciones');
283
+ const out = [];
284
+ for (const item of parsed.data ?? []) {
285
+ for (const [dj, secciones] of Object.entries(item.listAgenteRetenedor)) {
286
+ out.push({
287
+ dj,
288
+ titulo: text(item.title),
289
+ filas: Object.values(secciones).flatMap((g) => parseGrid(g, params.propio)),
290
+ });
291
+ }
292
+ }
293
+ return out;
294
+ }
295
+ /** `getDjDetalle`: one page (10 rows) of a DJ. `seccion: "detalle"` is what makes `page`
296
+ * count: with `""` SII returns page 1 whatever `page` says (observed). `key: 0` and
297
+ * `tipoConsulta: 2` are the SPA's constants. The body RUT must be the session principal. */
298
+ export async function fetchF22TercerosDetalle(session, params) {
299
+ const env = await postSdi(session, `${BASE}/getDjDetalle`, `${NAMESPACE}/getDjDetalle`, {
300
+ periodo: periodoOf(params.anio),
301
+ ...rutDigits(params.rut),
302
+ dj: Number(params.dj),
303
+ page: params.pagina,
304
+ key: 0,
305
+ seccion: 'detalle',
306
+ tipoConsulta: 2,
307
+ }, TERCEROS_APP);
308
+ const parsed = Detalle.safeParse(env.data);
309
+ if (!parsed.success)
310
+ throw roto('el detalle no trae `listDetalle`');
311
+ // One ítem answered under an EMPTY section key (`listDetalle[""]`), so iterate the keys.
312
+ const grids = Object.values(parsed.data?.listDetalle ?? {}).flatMap((s) => Object.values(s));
313
+ const grid = grids[0];
314
+ if (grid === undefined)
315
+ return { registros: 0, filas: [] };
316
+ if (grids.length > 1)
317
+ throw roto(`el detalle trae ${grids.length} grillas`);
318
+ return {
319
+ registros: grid.cantRegistros ?? 0,
320
+ filas: parseGrid(grid, params.propio).map(toFila),
321
+ };
322
+ }
323
+ //# sourceMappingURL=terceros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terceros.js","sourceRoot":"","sources":["../../../src/portal/f22/terceros.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Gwt7Node } from './gwt.js';
2
+ /** A number as SII's client holds it: a sign (kept even on zero, as SII does), the magnitude's
3
+ * digits as an integer, and the count of decimal digits. */
4
+ interface SiiNumber {
5
+ readonly neg: boolean;
6
+ readonly units: bigint;
7
+ readonly scale: number;
8
+ }
9
+ /** Parse like SII's `jK`: an optional sign, digits, at most one '.'. A bare integer gets one
10
+ * decimal ("5" → 5.0). Anything else is a value the formula cannot compute with. */
11
+ export declare function parseSiiNumber(text: string): SiiNumber;
12
+ /** `pK`: SII's string form. The trailing zeros of the decimals go, but one decimal always
13
+ * stays ("5.0", "12.5"); the sign stays even on zero. */
14
+ export declare function formatSiiNumber(x: SiiNumber): string;
15
+ /** A rule whose expression did not evaluate to TRUE (SII's own client-side validation). */
16
+ export interface F29ReglaFallida {
17
+ readonly nombre: string;
18
+ /** SII's message, verbatim (ADR-004). */
19
+ readonly mensaje: string;
20
+ readonly tipo: number;
21
+ }
22
+ export interface F29FormFill {
23
+ /** Every campo whose value the fill changed, by código. */
24
+ readonly cambios: readonly {
25
+ readonly codigo: string;
26
+ readonly antes: string;
27
+ readonly despues: string;
28
+ }[];
29
+ readonly reglasFallidas: readonly F29ReglaFallida[];
30
+ }
31
+ /** Fill the layout `findVersionBorradorById` returned, IN PLACE, as SII's client does before
32
+ * `getBorradorRfiValidado` in mode PPTA-F29-COMPLETA: the 773/778 checkboxes the screen shows
33
+ * go to FALSE, then every campo with a formula takes its formula's value. Returns what changed
34
+ * and the rules that fail. `hoy` is the moment of the fill (a few rules read the current
35
+ * month); pass the `Clock`'s now. The values are taxpayer data: never log them. */
36
+ export declare function fillF29Form(layout: Gwt7Node, hoy: Date): F29FormFill;
37
+ /** Evaluate one expression against a filled layout (tests, and the submit's safety checks). */
38
+ export declare function evaluateF29Expresion(layout: Gwt7Node, expr: Gwt7Node, hoy: Date): string;
39
+ export {};
40
+ //# sourceMappingURL=f29-rfi-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"f29-rfi-form.d.ts","sourceRoot":"","sources":["../../src/portal/f29-rfi-form.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,UAAU,CAAC;AAMpD;6DAC6D;AAC7D,UAAU,SAAS;IACjB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;qFACqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAatD;AA0ED;0DAC0D;AAC1D,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAIpD;AAmZD,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IACJ,QAAQ,CAAC,cAAc,EAAE,SAAS,eAAe,EAAE,CAAC;CACrD;AAED;;;;oFAIoF;AACpF,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,GAAG,WAAW,CA4EpE;AAED,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAExF"}