@x12i/memorix-format 2.2.2 → 2.3.2

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 (57) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +36 -86
  3. package/dist/base-reexport.d.ts +8 -0
  4. package/dist/base-reexport.d.ts.map +1 -0
  5. package/dist/base-reexport.js +8 -0
  6. package/dist/base-reexport.js.map +1 -0
  7. package/dist/cli.js +179 -15
  8. package/dist/cli.js.map +1 -1
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/v2/index.d.ts +7 -0
  14. package/dist/v2/index.d.ts.map +1 -0
  15. package/dist/v2/index.js +6 -0
  16. package/dist/v2/index.js.map +1 -0
  17. package/dist/v2/migrate-present.d.ts +47 -0
  18. package/dist/v2/migrate-present.d.ts.map +1 -0
  19. package/dist/v2/migrate-present.js +225 -0
  20. package/dist/v2/migrate-present.js.map +1 -0
  21. package/dist/v2/profiles.d.ts +9 -0
  22. package/dist/v2/profiles.d.ts.map +1 -0
  23. package/dist/v2/profiles.js +63 -0
  24. package/dist/v2/profiles.js.map +1 -0
  25. package/dist/v2/revision.d.ts +24 -0
  26. package/dist/v2/revision.d.ts.map +1 -0
  27. package/dist/v2/revision.js +44 -0
  28. package/dist/v2/revision.js.map +1 -0
  29. package/dist/v2/types.d.ts +94 -0
  30. package/dist/v2/types.d.ts.map +1 -0
  31. package/dist/v2/types.js +3 -0
  32. package/dist/v2/types.js.map +1 -0
  33. package/dist/v2/validate.d.ts +8 -0
  34. package/dist/v2/validate.d.ts.map +1 -0
  35. package/dist/v2/validate.js +225 -0
  36. package/dist/v2/validate.js.map +1 -0
  37. package/docs/association-format.md +26 -445
  38. package/docs/memorix-format.md +24 -186
  39. package/docs/memorix-record-v2.md +101 -0
  40. package/docs/memorix-workflow-format.md +13 -1
  41. package/docs/migrate-present-to-v2.md +49 -0
  42. package/examples/v2/activity-events-snapshots.json +31 -0
  43. package/examples/v2/employees-discovery.json +26 -0
  44. package/examples/v2/employees-snapshots.json +27 -0
  45. package/examples/v2/procedures-knowledge.json +27 -0
  46. package/examples/v2/work-items-analysis.json +26 -0
  47. package/examples/v2/work-items-context.json +32 -0
  48. package/examples/v2/work-items-decisions.json +26 -0
  49. package/examples/v2/work-items-raw.json +37 -0
  50. package/examples/v2/work-items-relationships-candidate.json +38 -0
  51. package/examples/v2/work-items-snapshots-lifecycle.json +31 -0
  52. package/examples/v2/work-items-snapshots-lightweight-refs.json +34 -0
  53. package/examples/v2/work-items-snapshots.json +28 -0
  54. package/examples/v2/work-items-workflow.json +28 -0
  55. package/package.json +7 -2
  56. package/docs/memorix-format-additions.md +0 -956
  57. package/docs/memorix-format-for-dummies-association-corrections.md +0 -113
@@ -0,0 +1,225 @@
1
+ import { MEMORIX_RECORD_FORMAT_V2, } from "./types.js";
2
+ import { DATA_CATEGORIES, RECORD_STATES, V2_FIXED_ROOTS, V2_SNAPSHOT_BUCKETS, resolveContentProfile, } from "./profiles.js";
3
+ function issue(path, code, message, severity = "error") {
4
+ return { path, code, message, severity };
5
+ }
6
+ function isPlainObject(v) {
7
+ return v !== null && typeof v === "object" && !Array.isArray(v);
8
+ }
9
+ function isNonEmptyObject(v) {
10
+ return isPlainObject(v) && Object.keys(v).length > 0;
11
+ }
12
+ function readPath(obj, path) {
13
+ const parts = path.split(".");
14
+ let cur = obj;
15
+ for (const p of parts) {
16
+ if (!isPlainObject(cur))
17
+ return undefined;
18
+ cur = cur[p];
19
+ }
20
+ return cur;
21
+ }
22
+ /**
23
+ * Validate a memorix-record/2 document.
24
+ * Empty optional snapshot buckets must be omitted (not `{}`).
25
+ */
26
+ export function validateMemorixRecordV2(input, options = {}) {
27
+ const issues = [];
28
+ if (!isPlainObject(input)) {
29
+ return {
30
+ ok: false,
31
+ issues: [issue("", "V2-TYPE", "Record must be a plain object")],
32
+ };
33
+ }
34
+ const rejectUnknown = options.rejectUnknownRoots !== false;
35
+ const profile = resolveContentProfile(options.contentType ?? (typeof input.contentType === "string" ? input.contentType : undefined), options.profile);
36
+ const allowed = new Set([
37
+ ...V2_FIXED_ROOTS,
38
+ ...(profile.allowSnapshotBuckets ? V2_SNAPSHOT_BUCKETS : []),
39
+ ...(profile.allowedExtraRoots ?? []),
40
+ ]);
41
+ /**
42
+ * Option A (Gate G2): root `associated*` may hold lightweight relationship
43
+ * references only. Copied target payloads are rejected.
44
+ * Gate G4 selected authoritative storage = central per-category collections
45
+ * (Candidate C). Option A roots remain format-valid but are not authoritative storage.
46
+ */
47
+ const LIGHTWEIGHT_REF_KEYS = new Set([
48
+ "recordId",
49
+ "relationshipId",
50
+ "relationshipDefinitionId",
51
+ ]);
52
+ for (const key of Object.keys(input)) {
53
+ if (key.startsWith("associated")) {
54
+ const value = input[key];
55
+ if (value === undefined)
56
+ continue;
57
+ if (!Array.isArray(value)) {
58
+ issues.push(issue(key, "V2-ASSOC-TYPE", `${key} must be an array of lightweight relationship refs`));
59
+ continue;
60
+ }
61
+ if (value.length === 0) {
62
+ issues.push(issue(key, "V2-ASSOC-EMPTY", `${key} must be omitted when empty`));
63
+ continue;
64
+ }
65
+ for (let i = 0; i < value.length; i++) {
66
+ const item = value[i];
67
+ const path = `${key}[${i}]`;
68
+ if (!isPlainObject(item)) {
69
+ issues.push(issue(path, "V2-ASSOC-ITEM", `${path} must be a plain object`));
70
+ continue;
71
+ }
72
+ if (typeof item.recordId !== "string" || !item.recordId.trim()) {
73
+ issues.push(issue(`${path}.recordId`, "V2-ASSOC-RECORD-ID", `${path}.recordId is required`));
74
+ }
75
+ if (typeof item.relationshipDefinitionId !== "string" ||
76
+ !item.relationshipDefinitionId.trim()) {
77
+ issues.push(issue(`${path}.relationshipDefinitionId`, "V2-ASSOC-DEF-ID", `${path}.relationshipDefinitionId is required — without it this is a record reference, not a relationship`));
78
+ }
79
+ for (const k of Object.keys(item)) {
80
+ if (!LIGHTWEIGHT_REF_KEYS.has(k)) {
81
+ issues.push(issue(`${path}.${k}`, "V2-ASSOC-COPIED", `${path} may only contain relationshipDefinitionId, recordId, and optional relationshipId — copied related payload rejected (Gate G2). Option A lightweight roots remain format-valid; authoritative storage is G4 Candidate C (central per-category collections).`));
82
+ }
83
+ }
84
+ if (item.relationshipId !== undefined &&
85
+ (typeof item.relationshipId !== "string" || !String(item.relationshipId).trim())) {
86
+ issues.push(issue(`${path}.relationshipId`, "V2-ASSOC-REF", `${path}.relationshipId must be a non-empty string when present (optional only because it is deterministically derivable)`));
87
+ }
88
+ }
89
+ continue;
90
+ }
91
+ if (rejectUnknown && !allowed.has(key) && !key.startsWith("_")) {
92
+ issues.push(issue(key, "V2-ROOT", `Unknown root '${key}' is not allowed for contentType '${profile.contentType}'`));
93
+ }
94
+ if (key.startsWith("_") && key !== "_system" && key !== "_id") {
95
+ issues.push(issue(key, "V2-SYSTEM-ROOT", `Only _system and _id machine roots are allowed; found '${key}'`));
96
+ }
97
+ }
98
+ if (input.format !== MEMORIX_RECORD_FORMAT_V2) {
99
+ issues.push(issue("format", "V2-FORMAT", `format must be "${MEMORIX_RECORD_FORMAT_V2}"`));
100
+ }
101
+ if (typeof input.recordId !== "string" || !input.recordId.trim()) {
102
+ issues.push(issue("recordId", "V2-RECORD-ID", "recordId must be a non-empty string"));
103
+ }
104
+ if (typeof input.revision !== "number" || !Number.isInteger(input.revision) || input.revision < 1) {
105
+ issues.push(issue("revision", "V2-REVISION", "revision must be an integer >= 1"));
106
+ }
107
+ if (typeof input.objectType !== "string" || !input.objectType.trim()) {
108
+ issues.push(issue("objectType", "V2-OBJECT-TYPE", "objectType must be a non-empty string"));
109
+ }
110
+ else if (options.objectType && input.objectType !== options.objectType) {
111
+ issues.push(issue("objectType", "V2-OBJECT-TYPE-MISMATCH", `objectType '${input.objectType}' does not match expected '${options.objectType}'`));
112
+ }
113
+ if (typeof input.contentType !== "string" || !input.contentType.trim()) {
114
+ issues.push(issue("contentType", "V2-CONTENT-TYPE", "contentType must be a non-empty string"));
115
+ }
116
+ else if (options.contentType && input.contentType !== options.contentType) {
117
+ issues.push(issue("contentType", "V2-CONTENT-TYPE-MISMATCH", `contentType '${input.contentType}' does not match expected '${options.contentType}'`));
118
+ }
119
+ if (typeof input.dataCategory !== "string" ||
120
+ !DATA_CATEGORIES.includes(input.dataCategory)) {
121
+ issues.push(issue("dataCategory", "V2-DATA-CATEGORY", `dataCategory must be one of ${DATA_CATEGORIES.join(", ")}`));
122
+ }
123
+ if (!isPlainObject(input.concept)) {
124
+ issues.push(issue("concept", "V2-CONCEPT", "concept must be a plain object"));
125
+ }
126
+ else {
127
+ if (typeof input.concept.title !== "string" || !input.concept.title.trim()) {
128
+ issues.push(issue("concept.title", "V2-CONCEPT-TITLE", "concept.title must be a non-empty string"));
129
+ }
130
+ const identifiers = input.concept.identifiers;
131
+ if (!isPlainObject(identifiers)) {
132
+ issues.push(issue("concept.identifiers", "V2-IDENTIFIERS", "concept.identifiers is required"));
133
+ }
134
+ else {
135
+ const primary = identifiers.primary;
136
+ if (!isPlainObject(primary)) {
137
+ issues.push(issue("concept.identifiers.primary", "V2-PRIMARY", "primary identifier is required"));
138
+ }
139
+ else {
140
+ if (typeof primary.kind !== "string" || !primary.kind.trim()) {
141
+ issues.push(issue("concept.identifiers.primary.kind", "V2-PRIMARY-KIND", "kind is required"));
142
+ }
143
+ if (typeof primary.value !== "string" || !primary.value.trim()) {
144
+ issues.push(issue("concept.identifiers.primary.value", "V2-PRIMARY-VALUE", "value is required"));
145
+ }
146
+ }
147
+ if (identifiers.alternates !== undefined) {
148
+ if (!Array.isArray(identifiers.alternates)) {
149
+ issues.push(issue("concept.identifiers.alternates", "V2-ALTERNATES", "alternates must be an array"));
150
+ }
151
+ else if (identifiers.alternates.length === 0) {
152
+ issues.push(issue("concept.identifiers.alternates", "V2-ALTERNATES-EMPTY", "alternates must be omitted when empty"));
153
+ }
154
+ }
155
+ }
156
+ }
157
+ if (!isPlainObject(input.data)) {
158
+ issues.push(issue("data", "V2-DATA", "data must be a plain object"));
159
+ }
160
+ for (const bucket of V2_SNAPSHOT_BUCKETS) {
161
+ if (input[bucket] === undefined)
162
+ continue;
163
+ if (!profile.allowSnapshotBuckets) {
164
+ issues.push(issue(bucket, "V2-SCOPE-BUCKET", `${bucket} is only allowed on snapshot-like content types (got '${profile.contentType}')`));
165
+ }
166
+ else if (!isNonEmptyObject(input[bucket])) {
167
+ issues.push(issue(bucket, "V2-EMPTY-BUCKET", `${bucket} must be omitted when empty (do not emit {})`));
168
+ }
169
+ }
170
+ if (!isPlainObject(input._system)) {
171
+ issues.push(issue("_system", "V2-SYSTEM", "_system is required"));
172
+ }
173
+ else {
174
+ const sys = input._system;
175
+ if (typeof sys.state !== "string" ||
176
+ !RECORD_STATES.includes(sys.state)) {
177
+ issues.push(issue("_system.state", "V2-STATE", `state must be one of ${RECORD_STATES.join(", ")}`));
178
+ }
179
+ for (const ts of ["createdAt", "modifiedAt"]) {
180
+ if (typeof sys[ts] !== "string" || !sys[ts].trim()) {
181
+ issues.push(issue(`_system.${ts}`, "V2-TIMESTAMP", `${ts} must be a non-empty string`));
182
+ }
183
+ }
184
+ if (sys.lifecycle !== undefined) {
185
+ if (!Array.isArray(sys.lifecycle)) {
186
+ issues.push(issue("_system.lifecycle", "V2-LIFECYCLE", "lifecycle must be an array"));
187
+ }
188
+ else if (sys.lifecycle.length === 0) {
189
+ issues.push(issue("_system.lifecycle", "V2-LIFECYCLE-EMPTY", "lifecycle must be omitted when empty"));
190
+ }
191
+ }
192
+ if (sys.provenance !== undefined && !isNonEmptyObject(sys.provenance)) {
193
+ issues.push(issue("_system.provenance", "V2-PROVENANCE-EMPTY", "provenance must be omitted when empty"));
194
+ }
195
+ }
196
+ if (options.enforceDiscriminator !== false && profile.discriminator && isPlainObject(input)) {
197
+ const disc = profile.discriminator;
198
+ const value = readPath(input, disc.path);
199
+ if (value === undefined || value === null || value === "") {
200
+ if (disc.defaultValue !== undefined) {
201
+ // Metadata-defined default exists: structural validation passes; writers may apply default.
202
+ issues.push(issue(disc.path, "V2-DISCRIMINATOR-DEFAULT", `${disc.path} missing; content-type profile default '${disc.defaultValue}' applies at write time`, "warning"));
203
+ }
204
+ else if (disc.required) {
205
+ issues.push(issue(disc.path, "V2-DISCRIMINATOR", `Required discriminator ${disc.path} is missing and no default is configured`));
206
+ }
207
+ }
208
+ else if (typeof value !== "string") {
209
+ issues.push(issue(disc.path, "V2-DISCRIMINATOR-TYPE", `${disc.path} must be a string`));
210
+ }
211
+ else if (disc.allowedValues && !disc.allowedValues.includes(value)) {
212
+ issues.push(issue(disc.path, "V2-DISCRIMINATOR-VALUE", `${disc.path}='${value}' is not in allowedValues`));
213
+ }
214
+ }
215
+ const ok = !issues.some((i) => i.severity === "error");
216
+ return {
217
+ ok,
218
+ issues,
219
+ record: ok ? input : undefined,
220
+ };
221
+ }
222
+ export function validateMemorixRecordsV2(inputs, options = {}) {
223
+ return inputs.map((input) => validateMemorixRecordV2(input, options));
224
+ }
225
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/v2/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAKzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,SAAS,KAAK,CACZ,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,WAAwC,OAAO;IAE/C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,QAAQ,CAAC,GAA4B,EAAE,IAAY;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAY,GAAG,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,+BAA+B,CAAC,CAAC;SAChE,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,kBAAkB,KAAK,KAAK,CAAC;IAC3D,MAAM,OAAO,GAAG,qBAAqB,CACnC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAC9F,OAAO,CAAC,OAAO,CAChB,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS;QAC9B,GAAG,cAAc;QACjB,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;KACrC,CAAC,CAAC;IAEH;;;;;OAKG;IACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;QACnC,UAAU;QACV,gBAAgB;QAChB,0BAA0B;KAC3B,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,oDAAoD,CAAC,CAAC,CAAC;gBACrG,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,GAAG,6BAA6B,CAAC,CAAC,CAAC;gBAC/E,SAAS;YACX,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;gBAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,IAAI,yBAAyB,CAAC,CAAC,CAAC;oBAC5E,SAAS;gBACX,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE,oBAAoB,EAAE,GAAG,IAAI,uBAAuB,CAAC,CAAC,CAAC;gBAC/F,CAAC;gBACD,IACE,OAAO,IAAI,CAAC,wBAAwB,KAAK,QAAQ;oBACjD,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,EACrC,CAAC;oBACD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,GAAG,IAAI,2BAA2B,EAClC,iBAAiB,EACjB,GAAG,IAAI,mGAAmG,CAC3G,CACF,CAAC;gBACJ,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjC,MAAM,CAAC,IAAI,CACT,KAAK,CACH,GAAG,IAAI,IAAI,CAAC,EAAE,EACd,iBAAiB,EACjB,GAAG,IAAI,4PAA4P,CACpQ,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,IACE,IAAI,CAAC,cAAc,KAAK,SAAS;oBACjC,CAAC,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,EAChF,CAAC;oBACD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,GAAG,IAAI,iBAAiB,EACxB,cAAc,EACd,GAAG,IAAI,mHAAmH,CAC3H,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,iBAAiB,GAAG,qCAAqC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACtH,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,0DAA0D,GAAG,GAAG,CAAC,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,wBAAwB,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,mBAAmB,wBAAwB,GAAG,CAAC,CAC7E,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,qCAAqC,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE,kCAAkC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,EAAE,uCAAuC,CAAC,CAAC,CAAC;IAC9F,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CACT,KAAK,CACH,YAAY,EACZ,yBAAyB,EACzB,eAAe,KAAK,CAAC,UAAU,8BAA8B,OAAO,CAAC,UAAU,GAAG,CACnF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,iBAAiB,EAAE,wCAAwC,CAAC,CAAC,CAAC;IACjG,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5E,MAAM,CAAC,IAAI,CACT,KAAK,CACH,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,KAAK,CAAC,WAAW,8BAA8B,OAAO,CAAC,WAAW,GAAG,CACtF,CACF,CAAC;IACJ,CAAC;IAED,IACE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAgD,CAAC,EACjF,CAAC;QACD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,cAAc,EACd,kBAAkB,EAClB,+BAA+B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5D,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,kBAAkB,EAAE,0CAA0C,CAAC,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,iCAAiC,CAAC,CAAC,CAAC;QACjG,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,EAAE,YAAY,EAAE,gCAAgC,CAAC,CAAC,CAAC;YACpG,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC7D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,kCAAkC,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC;gBAChG,CAAC;gBACD,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mCAAmC,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC;YACD,IAAI,WAAW,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,gCAAgC,EAAE,eAAe,EAAE,6BAA6B,CAAC,CACxF,CAAC;gBACJ,CAAC;qBAAM,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/C,MAAM,CAAC,IAAI,CACT,KAAK,CACH,gCAAgC,EAChC,qBAAqB,EACrB,uCAAuC,CACxC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS;YAAE,SAAS;QAC1C,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CACT,KAAK,CACH,MAAM,EACN,iBAAiB,EACjB,GAAG,MAAM,yDAAyD,OAAO,CAAC,WAAW,IAAI,CAC1F,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CACT,KAAK,CACH,MAAM,EACN,iBAAiB,EACjB,GAAG,MAAM,8CAA8C,CACxD,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,IACE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAC7B,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAuC,CAAC,EACpE,CAAC;YACD,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,eAAe,EAAE,UAAU,EAAE,wBAAwB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACvF,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAU,EAAE,CAAC;YACtD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,cAAc,EAAE,4BAA4B,CAAC,CAAC,CAAC;YACxF,CAAC;iBAAM,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,sCAAsC,CAAC,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,uCAAuC,CAAC,CAC5F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,oBAAoB,KAAK,KAAK,IAAI,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACpC,4FAA4F;gBAC5F,MAAM,CAAC,IAAI,CACT,KAAK,CACH,IAAI,CAAC,IAAI,EACT,0BAA0B,EAC1B,GAAG,IAAI,CAAC,IAAI,2CAA2C,IAAI,CAAC,YAAY,yBAAyB,EACjG,SAAS,CACV,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,0BAA0B,IAAI,CAAC,IAAI,0CAA0C,CAAC,CACpH,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CACT,KAAK,CACH,IAAI,CAAC,IAAI,EACT,wBAAwB,EACxB,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,2BAA2B,CAClD,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACvD,OAAO;QACL,EAAE;QACF,MAAM;QACN,MAAM,EAAE,EAAE,CAAC,CAAC,CAAE,KAAyB,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,UAA6B,EAAE;IAE/B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC"}