@keelcodes/manifest 0.1.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.
@@ -0,0 +1,578 @@
1
+ // ============================================================================
2
+ // ERC-8313 PIM validator.
3
+ //
4
+ // A structural + semantic check of an untrusted JSON document against the
5
+ // draft of 2026-06-19. It is deliberately a *pure function of the input*: no
6
+ // network, no clock unless the caller passes `options.now`, so a wallet can run
7
+ // it on a manifest fetched from anywhere before touching an account.
8
+ //
9
+ // The result separates `errors` (the manifest MUST be rejected) from
10
+ // `warnings` (the manifest is usable but suspicious). `valid` is true only when
11
+ // there are no errors. Where the draft is silent we do NOT invent a rule: those
12
+ // fields get existence/type checks at most, so the validator never false-
13
+ // positives on a spec-compliant manifest.
14
+ // ============================================================================
15
+ import { CALCULATION_PRECISIONS, CONTRACT_ROLES, FILTER_OPERATORS, PIM_CATEGORIES, PIM_SECTIONS, SELECT_MODES, STEP_ACTIONS, TYPE_KINDS, VALIDATE_OPERATORS, } from './types.js';
16
+ /** The spec revision this validator was written against. */
17
+ export const PIM_DRAFT = '2026-06-19';
18
+ class Issues {
19
+ errors = [];
20
+ warnings = [];
21
+ error(path, message) {
22
+ this.errors.push({ path, message, severity: 'error' });
23
+ }
24
+ warn(path, message) {
25
+ this.warnings.push({ path, message, severity: 'warning' });
26
+ }
27
+ }
28
+ /**
29
+ * Validate an untrusted value as an ERC-8313 PIM.
30
+ *
31
+ * @param input - parsed JSON (or any value) to check.
32
+ * @param options - optional execution context (clock, chain).
33
+ */
34
+ export function validatePim(input, options = {}) {
35
+ const issues = new Issues();
36
+ if (!isObject(input)) {
37
+ issues.error('', 'PIM must be a JSON object');
38
+ return finish(issues);
39
+ }
40
+ const root = input;
41
+ checkTopLevelSections(root, issues);
42
+ if (!isObject(root.metadata)) {
43
+ // Without metadata almost nothing else can be resolved; report and stop.
44
+ return finish(issues);
45
+ }
46
+ const contractNames = namesOf(root.contracts);
47
+ const lookupNames = namesOf(root.lookups);
48
+ const typeNames = namesOf(root.types);
49
+ const intentNames = namesOf(root.intents);
50
+ const metadata = checkMetadata(root.metadata, issues);
51
+ checkContracts(root.contracts, lookupNames, issues);
52
+ checkTypes(root.types, typeNames, issues);
53
+ checkLookups(root.lookups, contractNames, issues);
54
+ checkCalculations(root.calculations, issues);
55
+ checkIntents(root.intents, contractNames, lookupNames, issues);
56
+ checkUi(root.ui, intentNames, issues);
57
+ checkSignatures(root.signatures, issues);
58
+ checkSemantics(metadata, options, issues);
59
+ return finish(issues);
60
+ }
61
+ function finish(issues) {
62
+ return { valid: issues.errors.length === 0, errors: issues.errors, warnings: issues.warnings };
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // top-level sections
66
+ // ---------------------------------------------------------------------------
67
+ function checkTopLevelSections(root, issues) {
68
+ const expectedKind = {
69
+ schemaVersion: 'string',
70
+ metadata: 'object',
71
+ contracts: 'object',
72
+ types: 'object',
73
+ lookups: 'object',
74
+ calculations: 'object',
75
+ intents: 'object',
76
+ ui: 'object',
77
+ signatures: 'array',
78
+ };
79
+ for (const section of PIM_SECTIONS) {
80
+ const value = root[section];
81
+ if (value === undefined) {
82
+ issues.error(section, `missing required top-level section "${section}"`);
83
+ continue;
84
+ }
85
+ const kind = expectedKind[section];
86
+ if (kind === 'string' && typeof value !== 'string') {
87
+ issues.error(section, `"${section}" must be a string`);
88
+ }
89
+ else if (kind === 'array' && !Array.isArray(value)) {
90
+ issues.error(section, `"${section}" must be an array`);
91
+ }
92
+ else if (kind === 'object' && !isObject(value)) {
93
+ issues.error(section, `"${section}" must be an object`);
94
+ }
95
+ }
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // metadata
99
+ // ---------------------------------------------------------------------------
100
+ function checkMetadata(value, issues) {
101
+ const path = 'metadata';
102
+ requireString(value, 'protocol', path, issues);
103
+ requireString(value, 'description', path, issues);
104
+ requireString(value, 'website', path, issues);
105
+ requireString(value, 'author', path, issues);
106
+ if (typeof value.category !== 'string') {
107
+ issues.error(`${path}.category`, 'category is required and must be a string');
108
+ }
109
+ else if (!PIM_CATEGORIES.includes(value.category)) {
110
+ issues.error(`${path}.category`, `category must be one of ${PIM_CATEGORIES.join(', ')}`);
111
+ }
112
+ if (typeof value.pimVersion !== 'string') {
113
+ issues.error(`${path}.pimVersion`, 'pimVersion is required and must be a string');
114
+ }
115
+ else if (!isSemver(value.pimVersion)) {
116
+ issues.error(`${path}.pimVersion`, `pimVersion must be semver (major.minor.patch), got "${value.pimVersion}"`);
117
+ }
118
+ if (!Array.isArray(value.chainId)) {
119
+ issues.error(`${path}.chainId`, 'chainId is required and must be an array of numbers');
120
+ }
121
+ else if (value.chainId.length === 0) {
122
+ issues.error(`${path}.chainId`, 'chainId must not be empty');
123
+ }
124
+ else {
125
+ value.chainId.forEach((id, i) => {
126
+ if (!isInteger(id) || id <= 0)
127
+ issues.error(`${path}.chainId[${i}]`, 'chainId entries must be positive integers');
128
+ });
129
+ }
130
+ for (const ts of ['validFrom', 'validUntil']) {
131
+ const v = value[ts];
132
+ if (v !== undefined && typeof v !== 'number')
133
+ issues.error(`${path}.${ts}`, `${ts} must be a number`);
134
+ }
135
+ if (value.notes !== undefined && typeof value.notes !== 'string') {
136
+ issues.error(`${path}.notes`, 'notes must be a string');
137
+ }
138
+ if (typeof value.validFrom === 'number' &&
139
+ typeof value.validUntil === 'number' &&
140
+ value.validFrom > value.validUntil) {
141
+ issues.error(`${path}.validUntil`, 'validUntil must not precede validFrom');
142
+ }
143
+ return value;
144
+ }
145
+ // ---------------------------------------------------------------------------
146
+ // contracts
147
+ // ---------------------------------------------------------------------------
148
+ function checkContracts(value, lookupNames, issues) {
149
+ if (!isObject(value))
150
+ return;
151
+ for (const [name, entry] of Object.entries(value)) {
152
+ const path = `contracts.${name}`;
153
+ if (!isObject(entry)) {
154
+ issues.error(path, 'contract entry must be an object');
155
+ continue;
156
+ }
157
+ const hasAddress = entry.address !== undefined;
158
+ const hasLookup = entry.lookup !== undefined;
159
+ if (hasAddress && hasLookup) {
160
+ issues.error(path, 'a contract MUST NOT declare both "address" and "lookup"');
161
+ }
162
+ else if (!hasAddress && !hasLookup) {
163
+ issues.error(path, 'a contract MUST declare either "address" or "lookup"');
164
+ }
165
+ if (hasAddress && !isHexAddress(entry.address)) {
166
+ issues.error(`${path}.address`, 'address must be a 20-byte 0x-prefixed hex string');
167
+ }
168
+ if (hasLookup) {
169
+ if (typeof entry.lookup !== 'string') {
170
+ issues.error(`${path}.lookup`, 'lookup must be a string');
171
+ }
172
+ else if (!lookupNames.has(entry.lookup)) {
173
+ issues.error(`${path}.lookup`, `lookup "${entry.lookup}" does not match any entry in the lookups section`);
174
+ }
175
+ }
176
+ if (typeof entry.role !== 'string') {
177
+ issues.error(`${path}.role`, 'role is required and must be a string');
178
+ }
179
+ else if (!CONTRACT_ROLES.includes(entry.role)) {
180
+ issues.error(`${path}.role`, `role must be one of ${CONTRACT_ROLES.join(', ')}`);
181
+ }
182
+ requireString(entry, 'description', path, issues);
183
+ }
184
+ }
185
+ // ---------------------------------------------------------------------------
186
+ // types
187
+ // ---------------------------------------------------------------------------
188
+ function checkTypes(value, typeNames, issues) {
189
+ if (!isObject(value))
190
+ return;
191
+ void typeNames;
192
+ for (const [name, entry] of Object.entries(value)) {
193
+ const path = `types.${name}`;
194
+ if (!isObject(entry)) {
195
+ issues.error(path, 'type entry must be an object');
196
+ continue;
197
+ }
198
+ if (typeof entry.kind !== 'string') {
199
+ issues.error(`${path}.kind`, 'kind is required and must be a string');
200
+ }
201
+ else if (!TYPE_KINDS.includes(entry.kind)) {
202
+ issues.error(`${path}.kind`, `kind must be one of ${TYPE_KINDS.join(', ')}`);
203
+ }
204
+ if (entry.description !== undefined && typeof entry.description !== 'string') {
205
+ issues.error(`${path}.description`, 'description must be a string');
206
+ }
207
+ if (!isObject(entry.fields)) {
208
+ issues.error(`${path}.fields`, 'fields is required and must be an object');
209
+ continue;
210
+ }
211
+ for (const [fieldName, field] of Object.entries(entry.fields)) {
212
+ const fieldPath = `${path}.fields.${fieldName}`;
213
+ if (!isObject(field)) {
214
+ issues.error(fieldPath, 'field definition must be an object');
215
+ continue;
216
+ }
217
+ if (typeof field.type !== 'string')
218
+ issues.error(`${fieldPath}.type`, 'field "type" is required');
219
+ if (field.description !== undefined && typeof field.description !== 'string') {
220
+ issues.error(`${fieldPath}.description`, 'description must be a string');
221
+ }
222
+ if (field.unit !== undefined && typeof field.unit !== 'string') {
223
+ issues.error(`${fieldPath}.unit`, 'unit must be a string');
224
+ }
225
+ }
226
+ }
227
+ }
228
+ // ---------------------------------------------------------------------------
229
+ // lookups
230
+ // ---------------------------------------------------------------------------
231
+ function checkLookups(value, contractNames, issues) {
232
+ if (!isObject(value))
233
+ return;
234
+ for (const [name, entry] of Object.entries(value)) {
235
+ const path = `lookups.${name}`;
236
+ if (!isObject(entry)) {
237
+ issues.error(path, 'lookup entry must be an object');
238
+ continue;
239
+ }
240
+ requireString(entry, 'description', path, issues);
241
+ if (typeof entry.contract !== 'string') {
242
+ issues.error(`${path}.contract`, 'contract is required and must be a string');
243
+ }
244
+ else if (!contractNames.has(entry.contract)) {
245
+ issues.error(`${path}.contract`, `contract "${entry.contract}" does not match any entry in the contracts section`);
246
+ }
247
+ requireString(entry, 'function', path, issues);
248
+ if (!('args' in entry)) {
249
+ issues.error(`${path}.args`, 'args is required (array or object)');
250
+ }
251
+ else if (!Array.isArray(entry.args) && !isObject(entry.args)) {
252
+ issues.error(`${path}.args`, 'args must be an array or an object');
253
+ }
254
+ requireString(entry, 'returns', path, issues);
255
+ if (entry.iterate !== undefined && !isObject(entry.iterate)) {
256
+ issues.error(`${path}.iterate`, 'iterate must be an object');
257
+ }
258
+ if (entry.filter !== undefined) {
259
+ if (!isObject(entry.filter)) {
260
+ issues.error(`${path}.filter`, 'filter must be an object');
261
+ }
262
+ else {
263
+ for (const [op, operand] of Object.entries(entry.filter)) {
264
+ if (!FILTER_OPERATORS.includes(op)) {
265
+ issues.error(`${path}.filter.${op}`, `filter operator must be one of ${FILTER_OPERATORS.join(', ')}`);
266
+ }
267
+ if (typeof operand !== 'string')
268
+ issues.error(`${path}.filter.${op}`, 'filter operands must be strings');
269
+ }
270
+ }
271
+ }
272
+ if (entry.select !== undefined) {
273
+ if (typeof entry.select !== 'string' || !SELECT_MODES.includes(entry.select)) {
274
+ issues.error(`${path}.select`, `select must be one of ${SELECT_MODES.join(', ')}`);
275
+ }
276
+ }
277
+ if (entry.selectCriterion !== undefined) {
278
+ if (typeof entry.selectCriterion !== 'string') {
279
+ issues.error(`${path}.selectCriterion`, 'selectCriterion must be a string');
280
+ }
281
+ if (entry.select === undefined) {
282
+ issues.error(`${path}.selectCriterion`, 'selectCriterion MUST NOT be used when select is absent');
283
+ }
284
+ }
285
+ if (entry.validate !== undefined)
286
+ checkLookupValidate(entry.validate, `${path}.validate`, issues);
287
+ }
288
+ }
289
+ function checkLookupValidate(value, path, issues) {
290
+ if (!Array.isArray(value)) {
291
+ issues.error(path, 'validate must be an array');
292
+ return;
293
+ }
294
+ value.forEach((assertion, i) => {
295
+ const p = `${path}[${i}]`;
296
+ if (!isObject(assertion)) {
297
+ issues.error(p, 'validate assertion must be an object');
298
+ return;
299
+ }
300
+ if (typeof assertion.field !== 'string')
301
+ issues.error(`${p}.field`, 'field is required and must be a string');
302
+ const present = VALIDATE_OPERATORS.filter((op) => assertion[op] !== undefined);
303
+ if (present.length === 0) {
304
+ issues.error(p, `validate assertion MUST include at least one of ${VALIDATE_OPERATORS.join(', ')}`);
305
+ }
306
+ for (const op of present) {
307
+ if (typeof assertion[op] !== 'string')
308
+ issues.error(`${p}.${op}`, `validate operand "${op}" must be a string`);
309
+ }
310
+ });
311
+ }
312
+ // ---------------------------------------------------------------------------
313
+ // calculations
314
+ // ---------------------------------------------------------------------------
315
+ function checkCalculations(value, issues) {
316
+ if (!isObject(value))
317
+ return;
318
+ for (const [name, entry] of Object.entries(value)) {
319
+ const path = `calculations.${name}`;
320
+ if (!isObject(entry)) {
321
+ issues.error(path, 'calculation entry must be an object');
322
+ continue;
323
+ }
324
+ requireString(entry, 'description', path, issues);
325
+ if (!isObject(entry.formula)) {
326
+ issues.error(`${path}.formula`, 'formula is required and must be an instruction object');
327
+ }
328
+ else if (!('set' in entry.formula)) {
329
+ issues.error(`${path}.formula`, 'formula MUST include a "set" instruction');
330
+ }
331
+ if (entry.inputs !== undefined) {
332
+ if (!Array.isArray(entry.inputs) || entry.inputs.some((v) => typeof v !== 'string')) {
333
+ issues.error(`${path}.inputs`, 'inputs must be an array of strings');
334
+ }
335
+ }
336
+ if (entry.outputUnit !== undefined && typeof entry.outputUnit !== 'string') {
337
+ issues.error(`${path}.outputUnit`, 'outputUnit must be a string');
338
+ }
339
+ if (entry.precision !== undefined) {
340
+ if (typeof entry.precision !== 'string' ||
341
+ !CALCULATION_PRECISIONS.includes(entry.precision)) {
342
+ issues.error(`${path}.precision`, `precision must be one of ${CALCULATION_PRECISIONS.join(', ')}`);
343
+ }
344
+ }
345
+ }
346
+ }
347
+ // ---------------------------------------------------------------------------
348
+ // intents
349
+ // ---------------------------------------------------------------------------
350
+ function checkIntents(value, contractNames, lookupNames, issues) {
351
+ if (!isObject(value))
352
+ return;
353
+ const names = Object.keys(value);
354
+ if (names.length === 0) {
355
+ issues.error('intents', 'a PIM MUST contain at least one intent');
356
+ return;
357
+ }
358
+ for (const [name, entry] of Object.entries(value)) {
359
+ const path = `intents.${name}`;
360
+ if (!isObject(entry)) {
361
+ issues.error(path, 'intent entry must be an object');
362
+ continue;
363
+ }
364
+ requireString(entry, 'description', path, issues);
365
+ if (!Array.isArray(entry.requiredInputs) || entry.requiredInputs.some((v) => typeof v !== 'string')) {
366
+ issues.error(`${path}.requiredInputs`, 'requiredInputs is required and must be an array of strings');
367
+ }
368
+ if (entry.optionalInputs !== undefined) {
369
+ if (!Array.isArray(entry.optionalInputs) || entry.optionalInputs.some((v) => typeof v !== 'string')) {
370
+ issues.error(`${path}.optionalInputs`, 'optionalInputs must be an array of strings');
371
+ }
372
+ }
373
+ if (entry.notes !== undefined && typeof entry.notes !== 'string') {
374
+ issues.error(`${path}.notes`, 'notes must be a string');
375
+ }
376
+ checkSteps(entry.steps, `${path}.steps`, contractNames, lookupNames, issues);
377
+ }
378
+ }
379
+ function checkSteps(value, path, contractNames, lookupNames, issues) {
380
+ const entries = stepEntries(value);
381
+ if (entries === undefined) {
382
+ issues.error(path, 'steps is required and must be an array or an object keyed by step id');
383
+ return;
384
+ }
385
+ if (entries.length === 0) {
386
+ issues.error(path, 'an intent MUST declare at least one step');
387
+ return;
388
+ }
389
+ const ids = [];
390
+ entries.forEach((step, i) => {
391
+ const p = `${path}[${i}]`;
392
+ if (!isObject(step)) {
393
+ issues.error(p, 'step must be an object');
394
+ return;
395
+ }
396
+ if (!isInteger(step.id) || step.id < 1) {
397
+ issues.error(`${p}.id`, 'step id is required and must be an integer starting at 1');
398
+ }
399
+ else {
400
+ ids.push(step.id);
401
+ }
402
+ const action = step.action;
403
+ if (typeof action !== 'string' || !STEP_ACTIONS.includes(action)) {
404
+ issues.error(`${p}.action`, `action must be one of ${STEP_ACTIONS.join(', ')}`);
405
+ return;
406
+ }
407
+ for (const field of ['description', 'condition', 'skipIf', 'storeAs']) {
408
+ if (step[field] !== undefined && typeof step[field] !== 'string') {
409
+ issues.error(`${p}.${field}`, `${field} must be a string`);
410
+ }
411
+ }
412
+ if (action === 'buildTransaction') {
413
+ if (typeof step.contract !== 'string') {
414
+ issues.error(`${p}.contract`, 'buildTransaction requires "contract"');
415
+ }
416
+ else if (!contractNames.has(step.contract)) {
417
+ issues.error(`${p}.contract`, `contract "${step.contract}" does not match any entry in the contracts section`);
418
+ }
419
+ if (typeof step.function !== 'string')
420
+ issues.error(`${p}.function`, 'buildTransaction requires "function"');
421
+ if (typeof step.description !== 'string') {
422
+ issues.error(`${p}.description`, 'buildTransaction steps MUST include a description');
423
+ }
424
+ if (step.args !== undefined && !isObject(step.args)) {
425
+ issues.error(`${p}.args`, 'buildTransaction args must be an object');
426
+ }
427
+ if (step.value !== undefined && typeof step.value !== 'string') {
428
+ issues.error(`${p}.value`, 'value must be a string');
429
+ }
430
+ }
431
+ // The draft says lookup steps reference a lookup "by name" but does not fix
432
+ // the field. We accept a `lookup` string and only warn when it dangles, so a
433
+ // differently-named (but spec-compliant) field is never a false error.
434
+ if (action === 'lookup' && step.lookup !== undefined) {
435
+ if (typeof step.lookup !== 'string') {
436
+ issues.error(`${p}.lookup`, 'lookup reference must be a string');
437
+ }
438
+ else if (!lookupNames.has(step.lookup)) {
439
+ issues.warn(`${p}.lookup`, `lookup "${step.lookup}" does not match any entry in the lookups section`);
440
+ }
441
+ }
442
+ });
443
+ const unique = new Set(ids);
444
+ if (unique.size !== ids.length) {
445
+ issues.error(path, 'step ids MUST be unique within an intent');
446
+ }
447
+ const sorted = [...unique].sort((a, b) => a - b);
448
+ const contiguous = sorted.every((id, i) => id === i + 1);
449
+ if (sorted.length > 0 && !contiguous) {
450
+ issues.error(path, `step ids MUST begin at 1 and MUST NOT skip numbers (got ${sorted.join(', ')})`);
451
+ }
452
+ }
453
+ function stepEntries(value) {
454
+ if (Array.isArray(value))
455
+ return [...value];
456
+ if (isObject(value))
457
+ return Object.values(value);
458
+ return undefined;
459
+ }
460
+ // ---------------------------------------------------------------------------
461
+ // ui
462
+ // ---------------------------------------------------------------------------
463
+ function checkUi(value, intentNames, issues) {
464
+ if (!isObject(value))
465
+ return;
466
+ const path = 'ui';
467
+ if (!isObject(value.intentDescriptions)) {
468
+ issues.error(`${path}.intentDescriptions`, 'intentDescriptions is required and must be an object');
469
+ }
470
+ else {
471
+ for (const [name, text] of Object.entries(value.intentDescriptions)) {
472
+ if (typeof text !== 'string')
473
+ issues.error(`${path}.intentDescriptions.${name}`, 'description must be a string');
474
+ }
475
+ for (const intent of intentNames) {
476
+ if (!(intent in value.intentDescriptions)) {
477
+ issues.error(`${path}.intentDescriptions`, `missing a description for intent "${intent}"`);
478
+ }
479
+ }
480
+ }
481
+ if (value.labels !== undefined) {
482
+ if (!isObject(value.labels) || Object.values(value.labels).some((v) => typeof v !== 'string')) {
483
+ issues.error(`${path}.labels`, 'labels must be an object of strings');
484
+ }
485
+ }
486
+ if (value.iterateLabels !== undefined && !isObject(value.iterateLabels)) {
487
+ issues.error(`${path}.iterateLabels`, 'iterateLabels must be an object');
488
+ }
489
+ }
490
+ // ---------------------------------------------------------------------------
491
+ // signatures
492
+ // ---------------------------------------------------------------------------
493
+ function checkSignatures(value, issues) {
494
+ if (!Array.isArray(value))
495
+ return;
496
+ value.forEach((entry, i) => {
497
+ const path = `signatures[${i}]`;
498
+ if (!isObject(entry)) {
499
+ issues.error(path, 'signature entry must be an object');
500
+ return;
501
+ }
502
+ if (typeof entry.type !== 'string') {
503
+ issues.error(`${path}.type`, 'type is required and must be a string');
504
+ }
505
+ else if (entry.type !== 'ecdsa') {
506
+ issues.warn(`${path}.type`, `unrecognised signature scheme "${entry.type}"; the trust resolver will treat it as unverified`);
507
+ }
508
+ if (!isHexBytes(entry.signature)) {
509
+ issues.error(`${path}.signature`, 'signature is required and must be 0x-prefixed hex bytes');
510
+ }
511
+ if (entry.signer === undefined && entry.signerHashed === undefined) {
512
+ issues.error(path, 'a signature entry MUST include either "signer" or "signerHashed"');
513
+ }
514
+ if (entry.signer !== undefined) {
515
+ if (!isHexAddress(entry.signer)) {
516
+ issues.error(`${path}.signer`, 'signer must be a 20-byte 0x-prefixed hex address');
517
+ }
518
+ }
519
+ else if (entry.type === 'ecdsa') {
520
+ issues.error(`${path}.signer`, 'an ecdsa signature MUST include "signer"');
521
+ }
522
+ if (entry.signerHashed !== undefined && !isBytes32(entry.signerHashed)) {
523
+ issues.error(`${path}.signerHashed`, 'signerHashed must be a 32-byte 0x-prefixed hex string');
524
+ }
525
+ if (entry.signerLabel !== undefined && typeof entry.signerLabel !== 'string') {
526
+ issues.error(`${path}.signerLabel`, 'signerLabel must be a string');
527
+ }
528
+ });
529
+ }
530
+ // ---------------------------------------------------------------------------
531
+ // semantic gates (clock / chain)
532
+ // ---------------------------------------------------------------------------
533
+ function checkSemantics(metadata, options, issues) {
534
+ if (options.now !== undefined) {
535
+ if (typeof metadata.validUntil === 'number' && metadata.validUntil < options.now) {
536
+ issues.error('metadata.validUntil', `PIM expired at ${metadata.validUntil} (now ${options.now})`);
537
+ }
538
+ if (typeof metadata.validFrom === 'number' && metadata.validFrom > options.now) {
539
+ issues.error('metadata.validFrom', `PIM is not valid until ${metadata.validFrom} (now ${options.now})`);
540
+ }
541
+ }
542
+ if (options.chainId !== undefined) {
543
+ const chains = Array.isArray(metadata.chainId) ? metadata.chainId : [];
544
+ if (!chains.includes(options.chainId)) {
545
+ issues.error('metadata.chainId', `chainId ${options.chainId} is not in the PIM's chain scope [${chains.join(', ')}]`);
546
+ }
547
+ }
548
+ }
549
+ // ---------------------------------------------------------------------------
550
+ // shared helpers
551
+ // ---------------------------------------------------------------------------
552
+ function requireString(holder, field, path, issues) {
553
+ if (typeof holder[field] !== 'string' || holder[field] === '') {
554
+ issues.error(`${path}.${field}`, `${field} is required and must be a non-empty string`);
555
+ }
556
+ }
557
+ function namesOf(value) {
558
+ return isObject(value) ? new Set(Object.keys(value)) : new Set();
559
+ }
560
+ function isObject(value) {
561
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
562
+ }
563
+ function isInteger(value) {
564
+ return typeof value === 'number' && Number.isInteger(value);
565
+ }
566
+ function isHexAddress(value) {
567
+ return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value);
568
+ }
569
+ function isHexBytes(value) {
570
+ return typeof value === 'string' && /^0x(?:[0-9a-fA-F]{2})*$/.test(value) && value.length > 2;
571
+ }
572
+ function isBytes32(value) {
573
+ return typeof value === 'string' && /^0x[0-9a-fA-F]{64}$/.test(value);
574
+ }
575
+ function isSemver(value) {
576
+ return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(value);
577
+ }
578
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0BAA0B;AAC1B,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,gFAAgF;AAChF,qEAAqE;AACrE,EAAE;AACF,qEAAqE;AACrE,gFAAgF;AAChF,gFAAgF;AAChF,0EAA0E;AAC1E,0CAA0C;AAC1C,+EAA+E;AAE/E,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,kBAAkB,GAEnB,MAAM,YAAY,CAAC;AAIpB,4DAA4D;AAC5D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAwBtC,MAAM,MAAM;IACD,MAAM,GAAe,EAAE,CAAC;IACxB,QAAQ,GAAe,EAAE,CAAC;IAEnC,KAAK,CAAC,IAAY,EAAE,OAAe;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,OAAe;QAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,UAAgC,EAAE;IAC5E,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAE5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,KAAgC,CAAC;IAE9C,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,yEAAyE;QACzE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACpD,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1C,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAClD,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,MAAM,CAAC,MAAc;IAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AACjG,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,SAAS,qBAAqB,CAAC,IAA6B,EAAE,MAAc;IAC1E,MAAM,YAAY,GAAkD;QAClE,aAAa,EAAE,QAAQ;QACvB,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,QAAQ;QACjB,EAAE,EAAE,QAAQ;QACZ,UAAU,EAAE,OAAO;KACpB,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,uCAAuC,OAAO,GAAG,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,OAAO,oBAAoB,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,OAAO,oBAAoB,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,OAAO,qBAAqB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAS,aAAa,CAAC,KAA8B,EAAE,MAAc;IACnE,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE7C,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,2CAA2C,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,CAAE,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,2BAA2B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,aAAa,EAAE,6CAA6C,CAAC,CAAC;IACpF,CAAC;SAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,aAAa,EAAE,uDAAuD,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;IACjH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,qDAAqD,CAAC,CAAC;IACzF,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,2BAA2B,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAU,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAC1D,CAAC;IACD,IACE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,EAClC,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,aAAa,EAAE,uCAAuC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,SAAS,cAAc,CAAC,KAAc,EAAE,WAAwB,EAAE,MAAc;IAC9E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,aAAa,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;QAC7C,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,yDAAyD,CAAC,CAAC;QAChF,CAAC;aAAM,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,sDAAsD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,kDAAkD,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,yBAAyB,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,WAAW,KAAK,CAAC,MAAM,mDAAmD,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,uCAAuC,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,CAAE,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,uBAAuB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,SAAS,UAAU,CAAC,KAAc,EAAE,SAAsB,EAAE,MAAc;IACxE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,KAAK,SAAS,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,uCAAuC,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,CAAE,UAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,uBAAuB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,cAAc,EAAE,8BAA8B,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,0CAA0C,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,MAAM,SAAS,GAAG,GAAG,IAAI,WAAW,SAAS,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAC;gBAC9D,SAAS;YACX,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,OAAO,EAAE,0BAA0B,CAAC,CAAC;YAClG,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7E,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,cAAc,EAAE,8BAA8B,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/D,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,OAAO,EAAE,uBAAuB,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,YAAY,CAAC,KAAc,EAAE,aAA0B,EAAE,MAAc;IAC9E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,WAAW,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,2CAA2C,CAAC,CAAC;QAChF,CAAC;aAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,aAAa,KAAK,CAAC,QAAQ,qDAAqD,CAAC,CAAC;QACrH,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,oCAAoC,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,oCAAoC,CAAC,CAAC;QACrE,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,2BAA2B,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,IAAI,CAAE,gBAAsC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC1D,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,EAAE,EAAE,kCAAkC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxG,CAAC;oBACD,IAAI,OAAO,OAAO,KAAK,QAAQ;wBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,EAAE,EAAE,iCAAiC,CAAC,CAAC;gBAC3G,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAE,YAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,yBAAyB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,kBAAkB,EAAE,wDAAwD,CAAC,CAAC;YACpG,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,IAAY,EAAE,MAAc;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;QAE9G,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mDAAmD,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,OAAO,SAAS,CAAC,EAAE,CAAC,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;QACjH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,KAAc,EAAE,MAAc;IACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,gBAAgB,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,qCAAqC,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,uDAAuD,CAAC,CAAC;QAC3F,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,0CAA0C,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACpF,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,oCAAoC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,aAAa,EAAE,6BAA6B,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,IACE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;gBACnC,CAAE,sBAA4C,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EACxE,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,YAAY,EAAE,4BAA4B,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,YAAY,CACnB,KAAc,EACd,aAA0B,EAC1B,WAAwB,EACxB,MAAc;IAEd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,WAAW,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACpG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,iBAAiB,EAAE,4DAA4D,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACpG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,iBAAiB,EAAE,4CAA4C,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE,wBAAwB,CAAC,CAAC;QAC1D,CAAC;QAED,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,KAAc,EACd,IAAY,EACZ,aAA0B,EAC1B,WAAwB,EACxB,MAAc;IAEd,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,sEAAsE,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,0DAA0D,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAE,YAAkC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACxF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,yBAAyB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;YAC/E,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,GAAG,KAAK,mBAAmB,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;YAClC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,sCAAsC,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,IAAI,CAAC,QAAQ,qDAAqD,CAAC,CAAC;YACjH,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,sCAAsC,CAAC,CAAC;YAC7G,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACzC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,mDAAmD,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,yCAAyC,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,6EAA6E;QAC7E,uEAAuE;QACvE,IAAI,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,IAAI,CAAC,MAAM,mDAAmD,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,2DAA2D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,KAAK;AACL,8EAA8E;AAE9E,SAAS,OAAO,CAAC,KAAc,EAAE,WAAwB,EAAE,MAAc;IACvE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC;IAElB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,qBAAqB,EAAE,sDAAsD,CAAC,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpE,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,uBAAuB,IAAI,EAAE,EAAE,8BAA8B,CAAC,CAAC;QACnH,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,qBAAqB,EAAE,qCAAqC,MAAM,GAAG,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC9F,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,qCAAqC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,gBAAgB,EAAE,iCAAiC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,SAAS,eAAe,CAAC,KAAc,EAAE,MAAc;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;IAClC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,uCAAuC,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,kCAAkC,KAAK,CAAC,IAAI,mDAAmD,CAAC,CAAC;QAC/H,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,YAAY,EAAE,yDAAyD,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kEAAkE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,kDAAkD,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,0CAA0C,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,eAAe,EAAE,uDAAuD,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,cAAc,EAAE,8BAA8B,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,SAAS,cAAc,CACrB,QAAiC,EACjC,OAA6B,EAC7B,MAAc;IAEd,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACjF,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,kBAAkB,QAAQ,CAAC,UAAU,SAAS,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,0BAA0B,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CACV,kBAAkB,EAClB,WAAW,OAAO,CAAC,OAAO,qCAAqC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,aAAa,CACpB,MAA+B,EAC/B,KAAa,EACb,IAAY,EACZ,MAAc;IAEd,IAAI,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,GAAG,KAAK,6CAA6C,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,0DAA0D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC"}