@emilia-protocol/gate 0.18.2 → 0.20.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 (70) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +64 -0
  3. package/action-refusal-statement.js +1 -0
  4. package/coverage-reconciliation-attestation.js +1 -0
  5. package/dist/action-refusal-statement.d.ts +109 -0
  6. package/dist/action-refusal-statement.d.ts.map +1 -0
  7. package/dist/action-refusal-statement.js +333 -0
  8. package/dist/action-refusal-statement.js.map +1 -0
  9. package/dist/coverage-reconciliation-attestation.d.ts +29 -0
  10. package/dist/coverage-reconciliation-attestation.d.ts.map +1 -0
  11. package/dist/coverage-reconciliation-attestation.js +111 -0
  12. package/dist/coverage-reconciliation-attestation.js.map +1 -0
  13. package/dist/gate-qualification-v2.d.ts +4 -0
  14. package/dist/gate-qualification-v2.d.ts.map +1 -1
  15. package/dist/gate-qualification-v2.js +39 -47
  16. package/dist/gate-qualification-v2.js.map +1 -1
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +7 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/loss-allocation-schedule.d.ts +53 -0
  22. package/dist/loss-allocation-schedule.d.ts.map +1 -0
  23. package/dist/loss-allocation-schedule.js +351 -0
  24. package/dist/loss-allocation-schedule.js.map +1 -0
  25. package/dist/loss-experience-feed.d.ts +82 -0
  26. package/dist/loss-experience-feed.d.ts.map +1 -0
  27. package/dist/loss-experience-feed.js +314 -0
  28. package/dist/loss-experience-feed.js.map +1 -0
  29. package/dist/open-exposure-ledger-postgres.d.ts +40 -0
  30. package/dist/open-exposure-ledger-postgres.d.ts.map +1 -0
  31. package/dist/open-exposure-ledger-postgres.js +577 -0
  32. package/dist/open-exposure-ledger-postgres.js.map +1 -0
  33. package/dist/open-exposure-ledger.d.ts +243 -0
  34. package/dist/open-exposure-ledger.d.ts.map +1 -0
  35. package/dist/open-exposure-ledger.js +794 -0
  36. package/dist/open-exposure-ledger.js.map +1 -0
  37. package/dist/receipt-census.d.ts +21 -0
  38. package/dist/receipt-census.d.ts.map +1 -0
  39. package/dist/receipt-census.js +162 -0
  40. package/dist/receipt-census.js.map +1 -0
  41. package/dist/reliance-program.d.ts +88 -0
  42. package/dist/reliance-program.d.ts.map +1 -0
  43. package/dist/reliance-program.js +437 -0
  44. package/dist/reliance-program.js.map +1 -0
  45. package/dist/reliance-risk-crypto.d.ts +28 -0
  46. package/dist/reliance-risk-crypto.d.ts.map +1 -0
  47. package/dist/reliance-risk-crypto.js +110 -0
  48. package/dist/reliance-risk-crypto.js.map +1 -0
  49. package/dist/remedy-program.d.ts.map +1 -1
  50. package/dist/remedy-program.js +28 -18
  51. package/dist/remedy-program.js.map +1 -1
  52. package/loss-allocation-schedule.js +1 -0
  53. package/loss-experience-feed.js +1 -0
  54. package/open-exposure-ledger-postgres.js +1 -0
  55. package/open-exposure-ledger.js +1 -0
  56. package/package.json +42 -2
  57. package/receipt-census.js +1 -0
  58. package/reliance-program.js +3 -0
  59. package/src/action-refusal-statement.ts +396 -0
  60. package/src/coverage-reconciliation-attestation.ts +107 -0
  61. package/src/gate-qualification-v2.ts +56 -46
  62. package/src/index.ts +7 -0
  63. package/src/loss-allocation-schedule.ts +427 -0
  64. package/src/loss-experience-feed.ts +398 -0
  65. package/src/open-exposure-ledger-postgres.ts +701 -0
  66. package/src/open-exposure-ledger.ts +1213 -0
  67. package/src/receipt-census.ts +163 -0
  68. package/src/reliance-program.ts +499 -0
  69. package/src/reliance-risk-crypto.ts +114 -0
  70. package/src/remedy-program.ts +28 -17
@@ -0,0 +1,314 @@
1
+ // @ts-nocheck
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Signed external loss-experience observations with governed action classes.
5
+ *
6
+ * The feed records what its issuer reports. It deliberately does not establish
7
+ * causation, insurance coverage, legal liability, adjudicated loss, solvency,
8
+ * payment, or authorization.
9
+ */
10
+ import { RISK_DIGEST, riskDigest, riskExact, riskIdentifier, riskInstant, riskRecord, signRiskBody, verifyRiskBody, } from './reliance-risk-crypto.js';
11
+ export const LOSS_EXPERIENCE_FEED_VERSION = 'EP-LOSS-EXPERIENCE-FEED-v1';
12
+ export const LOSS_EXPERIENCE_FEED_CLAIM_BOUNDARY = 'externally_reported_observation_not_verified_causation_not_insurance_coverage_not_legal_liability_not_adjudicated_loss_not_solvency_not_payment_not_authorization';
13
+ const PROGRAM_KEYS = ['program_id', 'version', 'source_digest', 'program_digest'];
14
+ const PERIOD_KEYS = ['start', 'end'];
15
+ const RECORD_KEYS = [
16
+ 'record_id',
17
+ 'lineage_digest',
18
+ 'receipt_digest',
19
+ 'action_class',
20
+ 'classification',
21
+ 'reported_amount_minor',
22
+ 'currency',
23
+ 'occurred_at',
24
+ 'reported_at',
25
+ 'source_record_digest',
26
+ 'event_type',
27
+ 'supersedes_record_digest',
28
+ ];
29
+ const ANCHOR_KEYS = ['method', 'evidence_digest'];
30
+ const BODY_KEYS = [
31
+ '@version',
32
+ 'feed_id',
33
+ 'reporting_party_id',
34
+ 'relying_party_id',
35
+ 'program',
36
+ 'period',
37
+ 'census_digest',
38
+ 'taxonomy_digest',
39
+ 'source_inventory_digest',
40
+ 'records',
41
+ 'issued_at',
42
+ 'expires_at',
43
+ 'timestamp_anchor',
44
+ 'claim_boundary',
45
+ ];
46
+ const CLASSIFICATIONS = new Set([
47
+ 'NO_REPORTED_LOSS',
48
+ 'LOSS_REPORTED',
49
+ 'NEAR_MISS',
50
+ 'DISPUTED',
51
+ 'UNKNOWN',
52
+ ]);
53
+ const EVENT_TYPES = new Set(['OBSERVED', 'CORRECTED', 'WITHDRAWN']);
54
+ function money(value) {
55
+ return typeof value === 'string' && /^(?:0|[1-9][0-9]{0,39})$/.test(value);
56
+ }
57
+ function validateRecord(value, periodStart, periodEnd, issuedAt) {
58
+ if (!riskExact(value, RECORD_KEYS)
59
+ || !riskIdentifier(value.record_id)
60
+ || typeof value.lineage_digest !== 'string'
61
+ || !RISK_DIGEST.test(value.lineage_digest)
62
+ || typeof value.receipt_digest !== 'string'
63
+ || !RISK_DIGEST.test(value.receipt_digest)
64
+ || !riskIdentifier(value.action_class)
65
+ || typeof value.classification !== 'string'
66
+ || !CLASSIFICATIONS.has(value.classification)
67
+ || !money(value.reported_amount_minor)
68
+ || typeof value.currency !== 'string'
69
+ || !/^[A-Z]{3}$/.test(value.currency)
70
+ || typeof value.source_record_digest !== 'string'
71
+ || !RISK_DIGEST.test(value.source_record_digest)
72
+ || typeof value.event_type !== 'string'
73
+ || !EVENT_TYPES.has(value.event_type)) {
74
+ throw new TypeError('loss experience record shape or field is invalid');
75
+ }
76
+ const occurredAt = riskInstant(value.occurred_at);
77
+ const reportedAt = riskInstant(value.reported_at);
78
+ if (!Number.isFinite(occurredAt) || occurredAt < periodStart || occurredAt >= periodEnd
79
+ || !Number.isFinite(reportedAt) || reportedAt < occurredAt || reportedAt > issuedAt) {
80
+ throw new TypeError('loss experience occurred/reported time is invalid for the issued period');
81
+ }
82
+ if (value.event_type === 'OBSERVED') {
83
+ if (value.supersedes_record_digest !== null) {
84
+ throw new TypeError('an observed loss record cannot supersede another record');
85
+ }
86
+ }
87
+ else if (typeof value.supersedes_record_digest !== 'string'
88
+ || !RISK_DIGEST.test(value.supersedes_record_digest)) {
89
+ throw new TypeError('a corrected or withdrawn record requires a supersedes record digest');
90
+ }
91
+ }
92
+ function validateBody(value) {
93
+ if (!riskExact(value, BODY_KEYS)
94
+ || value['@version'] !== LOSS_EXPERIENCE_FEED_VERSION
95
+ || !riskIdentifier(value.feed_id)
96
+ || !riskIdentifier(value.reporting_party_id)
97
+ || !riskIdentifier(value.relying_party_id)
98
+ || !riskExact(value.program, PROGRAM_KEYS)
99
+ || !riskIdentifier(value.program.program_id)
100
+ || !Number.isSafeInteger(value.program.version)
101
+ || value.program.version < 1
102
+ || typeof value.program.source_digest !== 'string'
103
+ || !RISK_DIGEST.test(value.program.source_digest)
104
+ || typeof value.program.program_digest !== 'string'
105
+ || !RISK_DIGEST.test(value.program.program_digest)
106
+ || !riskExact(value.period, PERIOD_KEYS)
107
+ || typeof value.census_digest !== 'string'
108
+ || !RISK_DIGEST.test(value.census_digest)
109
+ || typeof value.taxonomy_digest !== 'string'
110
+ || !RISK_DIGEST.test(value.taxonomy_digest)
111
+ || typeof value.source_inventory_digest !== 'string'
112
+ || !RISK_DIGEST.test(value.source_inventory_digest)
113
+ || !Array.isArray(value.records)
114
+ || value.records.length > 10_000
115
+ || value.claim_boundary !== LOSS_EXPERIENCE_FEED_CLAIM_BOUNDARY) {
116
+ throw new TypeError('loss experience feed shape or field is invalid');
117
+ }
118
+ const periodStart = riskInstant(value.period.start);
119
+ const periodEnd = riskInstant(value.period.end);
120
+ const issuedAt = riskInstant(value.issued_at);
121
+ const expiresAt = riskInstant(value.expires_at);
122
+ if (!Number.isFinite(periodStart) || !Number.isFinite(periodEnd) || periodEnd <= periodStart
123
+ || !Number.isFinite(issuedAt) || issuedAt < periodEnd
124
+ || !Number.isFinite(expiresAt) || expiresAt <= issuedAt) {
125
+ throw new TypeError('loss experience feed period or validity is invalid');
126
+ }
127
+ for (const record of value.records)
128
+ validateRecord(record, periodStart, periodEnd, issuedAt);
129
+ const recordIds = value.records.map((record) => record.record_id);
130
+ if (new Set(recordIds).size !== recordIds.length) {
131
+ throw new TypeError('loss experience feed contains duplicate record identifiers');
132
+ }
133
+ const superseded = value.records
134
+ .filter((record) => record.supersedes_record_digest !== null)
135
+ .map((record) => record.supersedes_record_digest);
136
+ if (new Set(superseded).size !== superseded.length) {
137
+ throw new TypeError('loss experience feed forks one predecessor into multiple current records');
138
+ }
139
+ if (value.timestamp_anchor !== null
140
+ && (!riskExact(value.timestamp_anchor, ANCHOR_KEYS)
141
+ || !riskIdentifier(value.timestamp_anchor.method)
142
+ || typeof value.timestamp_anchor.evidence_digest !== 'string'
143
+ || !RISK_DIGEST.test(value.timestamp_anchor.evidence_digest))) {
144
+ throw new TypeError('loss experience timestamp anchor is invalid');
145
+ }
146
+ }
147
+ function validExpectedProgram(value) {
148
+ return riskExact(value, PROGRAM_KEYS) && riskIdentifier(value.program_id)
149
+ && Number.isSafeInteger(value.version) && value.version >= 1
150
+ && RISK_DIGEST.test(value.source_digest) && RISK_DIGEST.test(value.program_digest);
151
+ }
152
+ function sameProgram(actual, expected) {
153
+ return actual.program_id === expected.program_id && actual.version === expected.version
154
+ && actual.source_digest === expected.source_digest && actual.program_digest === expected.program_digest;
155
+ }
156
+ function validateLineage(payload, artifactDigest, options) {
157
+ if (payload.records.length === 0)
158
+ return null;
159
+ if (options.commit_lineage_batch === undefined)
160
+ return 'lineage_store_required';
161
+ const transitions = payload.records.map((record) => ({
162
+ lineage_digest: record.lineage_digest,
163
+ event_type: record.event_type,
164
+ predecessor_digest: record.supersedes_record_digest,
165
+ successor_digest: riskDigest(record),
166
+ reporting_party_id: payload.reporting_party_id,
167
+ relying_party_id: payload.relying_party_id,
168
+ program_digest: payload.program.program_digest,
169
+ receipt_digest: record.receipt_digest,
170
+ action_class: record.action_class,
171
+ currency: record.currency,
172
+ reported_at: record.reported_at,
173
+ record: Object.freeze(structuredClone(record)),
174
+ }));
175
+ if (new Set(transitions.map((entry) => entry.lineage_digest)).size !== transitions.length) {
176
+ return 'lineage_batch_conflict';
177
+ }
178
+ const validatePredecessors = (predecessors) => {
179
+ if (!riskRecord(predecessors))
180
+ return { accepted: false, reason: 'lineage_predecessors_invalid' };
181
+ for (const record of payload.records.filter((entry) => entry.event_type !== 'OBSERVED')) {
182
+ const resolved = predecessors[record.supersedes_record_digest];
183
+ if (!resolved)
184
+ return { accepted: false, reason: 'lineage_predecessor_missing' };
185
+ if (resolved.current_head !== true)
186
+ return { accepted: false, reason: 'lineage_head_invalid' };
187
+ if (resolved.reporting_party_id !== payload.reporting_party_id
188
+ || resolved.relying_party_id !== payload.relying_party_id
189
+ || resolved.program_digest !== payload.program.program_digest) {
190
+ return { accepted: false, reason: 'lineage_context_mismatch' };
191
+ }
192
+ try {
193
+ validateRecord(resolved.record, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY, riskInstant(payload.issued_at));
194
+ }
195
+ catch {
196
+ return { accepted: false, reason: 'lineage_predecessor_invalid' };
197
+ }
198
+ if (riskDigest(resolved.record) !== record.supersedes_record_digest) {
199
+ return { accepted: false, reason: 'lineage_predecessor_digest_mismatch' };
200
+ }
201
+ if (resolved.record.event_type === 'WITHDRAWN') {
202
+ return { accepted: false, reason: 'lineage_terminal_predecessor' };
203
+ }
204
+ if (resolved.record.lineage_digest !== record.lineage_digest
205
+ || resolved.record.receipt_digest !== record.receipt_digest
206
+ || resolved.record.action_class !== record.action_class
207
+ || resolved.record.currency !== record.currency) {
208
+ return { accepted: false, reason: 'lineage_record_mismatch' };
209
+ }
210
+ if (riskInstant(record.reported_at) <= riskInstant(resolved.record.reported_at)
211
+ || record.source_record_digest === resolved.record.source_record_digest
212
+ || riskDigest(record) === record.supersedes_record_digest) {
213
+ return { accepted: false, reason: 'lineage_order_invalid' };
214
+ }
215
+ }
216
+ return { accepted: true };
217
+ };
218
+ let committed;
219
+ try {
220
+ committed = options.commit_lineage_batch(Object.freeze({
221
+ feed_digest: artifactDigest,
222
+ transitions: Object.freeze(transitions.map((entry) => Object.freeze(entry))),
223
+ validate_predecessors: validatePredecessors,
224
+ }));
225
+ }
226
+ catch {
227
+ return 'lineage_commit_failed';
228
+ }
229
+ if (!riskRecord(committed) || committed.accepted !== true) {
230
+ return riskRecord(committed) && typeof committed.reason === 'string'
231
+ ? committed.reason
232
+ : 'lineage_commit_refused';
233
+ }
234
+ return null;
235
+ }
236
+ export function signLossExperienceFeed(input, signer) {
237
+ const body = { '@version': LOSS_EXPERIENCE_FEED_VERSION, ...input };
238
+ validateBody(body);
239
+ if (signer.issuer_id !== body.reporting_party_id) {
240
+ throw new TypeError('loss experience feed issuer must be the reporting party');
241
+ }
242
+ return signRiskBody(LOSS_EXPERIENCE_FEED_VERSION, body, signer);
243
+ }
244
+ export function verifyLossExperienceFeed(feed, options = {}) {
245
+ const refuse = (reason, verified = false, feedDigest = null) => ({
246
+ accepted: false,
247
+ verified,
248
+ reason,
249
+ feed_digest: feedDigest,
250
+ claim_boundary: LOSS_EXPERIENCE_FEED_CLAIM_BOUNDARY,
251
+ });
252
+ const signed = verifyRiskBody(feed, LOSS_EXPERIENCE_FEED_VERSION, options.trusted_keys);
253
+ if (!signed.valid || !signed.body)
254
+ return refuse(signed.reason ?? 'feed_invalid');
255
+ if (typeof signed.artifact_digest !== 'string')
256
+ return refuse('feed_digest_missing', true);
257
+ const { issuer, ...payload } = signed.body;
258
+ if (issuer.id !== payload.reporting_party_id) {
259
+ return refuse('reporting_party_issuer_mismatch', true, signed.artifact_digest);
260
+ }
261
+ try {
262
+ validateBody(payload);
263
+ }
264
+ catch {
265
+ return refuse('feed_schema_or_period_invalid', true, signed.artifact_digest);
266
+ }
267
+ const now = options.now === undefined
268
+ ? Date.now()
269
+ : (typeof options.now === 'string' ? Date.parse(options.now) : Number(options.now));
270
+ if (!Number.isFinite(now))
271
+ return refuse('verification_time_invalid', true, signed.artifact_digest);
272
+ if (now < riskInstant(payload.issued_at))
273
+ return refuse('feed_not_yet_issued', true, signed.artifact_digest);
274
+ if (now >= riskInstant(payload.expires_at))
275
+ return refuse('feed_expired', true, signed.artifact_digest);
276
+ if (options.expected_program === undefined || options.expected_census_digest === undefined
277
+ || options.expected_taxonomy_digest === undefined
278
+ || options.expected_relying_party_id === undefined
279
+ || options.expected_action_classes === undefined
280
+ || options.expected_action_classes.length < 1
281
+ || !options.expected_action_classes.every(riskIdentifier)) {
282
+ return refuse('context_binding_required', true, signed.artifact_digest);
283
+ }
284
+ if (!validExpectedProgram(options.expected_program)) {
285
+ return refuse('expected_program_invalid', true, signed.artifact_digest);
286
+ }
287
+ if (!sameProgram(payload.program, options.expected_program)) {
288
+ return refuse('program_binding_mismatch', true, signed.artifact_digest);
289
+ }
290
+ if (options.expected_census_digest !== payload.census_digest) {
291
+ return refuse('census_digest_mismatch', true, signed.artifact_digest);
292
+ }
293
+ if (options.expected_taxonomy_digest !== payload.taxonomy_digest) {
294
+ return refuse('taxonomy_digest_mismatch', true, signed.artifact_digest);
295
+ }
296
+ if (options.expected_relying_party_id !== payload.relying_party_id) {
297
+ return refuse('relying_party_mismatch', true, signed.artifact_digest);
298
+ }
299
+ const actionClasses = new Set(options.expected_action_classes);
300
+ if (!payload.records.every((record) => actionClasses.has(record.action_class))) {
301
+ return refuse('action_class_taxonomy_mismatch', true, signed.artifact_digest);
302
+ }
303
+ const lineageFailure = validateLineage(payload, signed.artifact_digest, options);
304
+ if (lineageFailure !== null)
305
+ return refuse(lineageFailure, true, signed.artifact_digest);
306
+ return {
307
+ accepted: true,
308
+ verified: true,
309
+ reason: null,
310
+ feed_digest: signed.artifact_digest,
311
+ claim_boundary: LOSS_EXPERIENCE_FEED_CLAIM_BOUNDARY,
312
+ };
313
+ }
314
+ //# sourceMappingURL=loss-experience-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loss-experience-feed.js","sourceRoot":"","sources":["../src/loss-experience-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Deployment-bound PostgreSQL adapter for the Open Exposure Ledger.
3
+ *
4
+ * Each mutation is one PostgreSQL function call. Authentication is the
5
+ * PostgreSQL session principal plus its private tenant/authority mapping; the
6
+ * application credential field is deliberately never serialized to SQL.
7
+ */
8
+ import { type OpenExposureLedger } from './open-exposure-ledger.js';
9
+ export interface OpenExposurePostgresQueryResult {
10
+ rowCount: number;
11
+ rows?: Array<Record<string, unknown>>;
12
+ }
13
+ export type OpenExposurePostgresQuery = (text: string, params: readonly unknown[]) => Promise<OpenExposurePostgresQueryResult>;
14
+ export interface CreateOpenExposurePostgresLedgerOptions {
15
+ query: OpenExposurePostgresQuery;
16
+ tenantId: string;
17
+ }
18
+ export interface OpenExposurePostgresLedger extends OpenExposureLedger {
19
+ readonly durable: true;
20
+ readonly deploymentBound: true;
21
+ readonly singleTenant: true;
22
+ readonly authentication: 'postgres_session_principal';
23
+ }
24
+ export declare const OPEN_EXPOSURE_POSTGRES_SQL: Readonly<{
25
+ registerCeiling: "SELECT open_exposure_private.register_ceiling($1::jsonb) AS result";
26
+ reserve: "SELECT open_exposure_private.reserve($1::jsonb) AS result";
27
+ beginInvocation: "SELECT open_exposure_private.begin_invocation($1::jsonb) AS result";
28
+ markIndeterminate: "SELECT open_exposure_private.mark_indeterminate($1::jsonb) AS result";
29
+ reconcile: "SELECT open_exposure_private.reconcile($1::jsonb) AS result";
30
+ read: "SELECT open_exposure_private.read_exposure($1::jsonb) AS result";
31
+ history: "SELECT open_exposure_private.read_history($1::jsonb) AS result";
32
+ sumOpen: "SELECT open_exposure_private.sum_open($1::jsonb) AS result";
33
+ listAging: "SELECT open_exposure_private.list_aging($1::jsonb) AS result";
34
+ listDeadlines: "SELECT open_exposure_private.list_deadlines($1::jsonb) AS result";
35
+ }>;
36
+ export declare class OpenExposurePostgresProtocolError extends Error {
37
+ constructor(message: string, options?: ErrorOptions);
38
+ }
39
+ export declare function createOpenExposurePostgresLedger(options: CreateOpenExposurePostgresLedgerOptions): OpenExposurePostgresLedger;
40
+ //# sourceMappingURL=open-exposure-ledger-postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-exposure-ledger-postgres.d.ts","sourceRoot":"","sources":["../src/open-exposure-ledger-postgres.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAIH,OAAO,EAeL,KAAK,kBAAkB,EAcxB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,OAAO,EAAE,KACvB,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAE9C,MAAM,WAAW,uCAAuC;IACtD,KAAK,EAAE,yBAAyB,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,4BAA4B,CAAC;CACvD;AAED,eAAO,MAAM,0BAA0B;;;;;;;;;;;EAWrC,CAAC;AAEH,qBAAa,iCAAkC,SAAQ,KAAK;gBAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AA4WD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,uCAAuC,GAC/C,0BAA0B,CA4P5B"}