@untangle-code/file-graph 0.0.0-stage → 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.
- package/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +284 -2
- package/THIRD_PARTY_LICENSES.md +29 -0
- package/dist/assignment.d.ts +15 -0
- package/dist/assignment.d.ts.map +1 -0
- package/dist/assignment.js +75 -0
- package/dist/assignment.js.map +1 -0
- package/dist/boundaries/endpoints.d.ts +11 -0
- package/dist/boundaries/endpoints.d.ts.map +1 -0
- package/dist/boundaries/endpoints.js +195 -0
- package/dist/boundaries/endpoints.js.map +1 -0
- package/dist/boundaries/index.d.ts +9 -0
- package/dist/boundaries/index.d.ts.map +1 -0
- package/dist/boundaries/index.js +93 -0
- package/dist/boundaries/index.js.map +1 -0
- package/dist/boundaries/requests.d.ts +12 -0
- package/dist/boundaries/requests.d.ts.map +1 -0
- package/dist/boundaries/requests.js +311 -0
- package/dist/boundaries/requests.js.map +1 -0
- package/dist/edges.d.ts +49 -0
- package/dist/edges.d.ts.map +1 -0
- package/dist/edges.js +223 -0
- package/dist/edges.js.map +1 -0
- package/dist/file-index.d.ts +37 -0
- package/dist/file-index.d.ts.map +1 -0
- package/dist/file-index.js +103 -0
- package/dist/file-index.js.map +1 -0
- package/dist/graph.d.ts +160 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +448 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +67 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +272 -0
- package/dist/metrics.js.map +1 -0
- package/dist/package-catalog.d.ts +43 -0
- package/dist/package-catalog.d.ts.map +1 -0
- package/dist/package-catalog.js +136 -0
- package/dist/package-catalog.js.map +1 -0
- package/dist/paths.d.ts +56 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +129 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence.d.ts +83 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +538 -0
- package/dist/persistence.js.map +1 -0
- package/dist/resolve/candidates.d.ts +52 -0
- package/dist/resolve/candidates.d.ts.map +1 -0
- package/dist/resolve/candidates.js +202 -0
- package/dist/resolve/candidates.js.map +1 -0
- package/dist/resolve/package-exports.d.ts +31 -0
- package/dist/resolve/package-exports.d.ts.map +1 -0
- package/dist/resolve/package-exports.js +229 -0
- package/dist/resolve/package-exports.js.map +1 -0
- package/dist/resolve/pipeline.d.ts +11 -0
- package/dist/resolve/pipeline.d.ts.map +1 -0
- package/dist/resolve/pipeline.js +109 -0
- package/dist/resolve/pipeline.js.map +1 -0
- package/dist/resolve/resolvers.d.ts +25 -0
- package/dist/resolve/resolvers.d.ts.map +1 -0
- package/dist/resolve/resolvers.js +367 -0
- package/dist/resolve/resolvers.js.map +1 -0
- package/dist/restore.d.ts +75 -0
- package/dist/restore.d.ts.map +1 -0
- package/dist/restore.js +136 -0
- package/dist/restore.js.map +1 -0
- package/dist/topology/compose.d.ts +27 -0
- package/dist/topology/compose.d.ts.map +1 -0
- package/dist/topology/compose.js +208 -0
- package/dist/topology/compose.js.map +1 -0
- package/dist/topology/jsonc.d.ts +38 -0
- package/dist/topology/jsonc.d.ts.map +1 -0
- package/dist/topology/jsonc.js +137 -0
- package/dist/topology/jsonc.js.map +1 -0
- package/dist/topology/load.d.ts +61 -0
- package/dist/topology/load.d.ts.map +1 -0
- package/dist/topology/load.js +436 -0
- package/dist/topology/load.js.map +1 -0
- package/dist/topology/manifest.d.ts +48 -0
- package/dist/topology/manifest.d.ts.map +1 -0
- package/dist/topology/manifest.js +109 -0
- package/dist/topology/manifest.js.map +1 -0
- package/dist/topology/project-config.d.ts +39 -0
- package/dist/topology/project-config.d.ts.map +1 -0
- package/dist/topology/project-config.js +150 -0
- package/dist/topology/project-config.js.map +1 -0
- package/dist/topology/workspace-definition.d.ts +26 -0
- package/dist/topology/workspace-definition.d.ts.map +1 -0
- package/dist/topology/workspace-definition.js +104 -0
- package/dist/topology/workspace-definition.js.map +1 -0
- package/dist/traverse.d.ts +49 -0
- package/dist/traverse.d.ts.map +1 -0
- package/dist/traverse.js +167 -0
- package/dist/traverse.js.map +1 -0
- package/dist/types.d.ts +332 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +63 -3
- package/src/assignment.ts +83 -0
- package/src/boundaries/endpoints.ts +273 -0
- package/src/boundaries/index.ts +118 -0
- package/src/boundaries/requests.ts +411 -0
- package/src/edges.ts +334 -0
- package/src/file-index.ts +127 -0
- package/src/graph.ts +591 -0
- package/src/index.ts +58 -0
- package/src/metrics.ts +350 -0
- package/src/package-catalog.ts +145 -0
- package/src/paths.ts +138 -0
- package/src/persistence.ts +746 -0
- package/src/resolve/candidates.ts +230 -0
- package/src/resolve/package-exports.ts +268 -0
- package/src/resolve/pipeline.ts +140 -0
- package/src/resolve/resolvers.ts +468 -0
- package/src/restore.ts +201 -0
- package/src/topology/compose.ts +268 -0
- package/src/topology/jsonc.ts +147 -0
- package/src/topology/load.ts +644 -0
- package/src/topology/manifest.ts +132 -0
- package/src/topology/project-config.ts +183 -0
- package/src/topology/workspace-definition.ts +115 -0
- package/src/traverse.ts +232 -0
- package/src/types.ts +372 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
import { compareCodepoints } from "@untangle-code/domain";
|
|
2
|
+
import { compareEdges } from "./edges.js";
|
|
3
|
+
import { normalizePath } from "./paths.js";
|
|
4
|
+
/** Vor Wave 8 verwendete globale Metadaten-ID; nur fuer expliziten Legacy-Fallback. */
|
|
5
|
+
export const META_SHARD_ID = "meta";
|
|
6
|
+
/** Vor Wave 8 verwendete globale Pfadindex-ID; nur fuer expliziten Legacy-Fallback. */
|
|
7
|
+
export const PATH_INDEX_SHARD_ID = "by-path";
|
|
8
|
+
/** Versionierter Praefix der workspace-sicheren Dateigraph-Shards. */
|
|
9
|
+
export const FILE_GRAPH_SHARD_NAMESPACE = "untangle:file-graph:v1";
|
|
10
|
+
/** Praefix aller Dateigraph-Shards eines Workspace. */
|
|
11
|
+
export function fileGraphWorkspaceShardPrefix(workspaceId) {
|
|
12
|
+
assertIdentifier("workspaceId", workspaceId);
|
|
13
|
+
return `${FILE_GRAPH_SHARD_NAMESPACE}:${String(workspaceId.length)}:${workspaceId}:`;
|
|
14
|
+
}
|
|
15
|
+
/** Namespacete ID des Metadaten-Shards. */
|
|
16
|
+
export function fileGraphMetaShardId(workspaceId) {
|
|
17
|
+
return `${fileGraphWorkspaceShardPrefix(workspaceId)}meta`;
|
|
18
|
+
}
|
|
19
|
+
/** Namespacete ID des Pfadindex-Shards. */
|
|
20
|
+
export function fileGraphPathIndexShardId(workspaceId) {
|
|
21
|
+
return `${fileGraphWorkspaceShardPrefix(workspaceId)}by-path`;
|
|
22
|
+
}
|
|
23
|
+
/** Namespacete ID eines Datei-Shards. */
|
|
24
|
+
export function fileGraphFileShardId(workspaceId, fileId) {
|
|
25
|
+
assertIdentifier("fileId", fileId);
|
|
26
|
+
return `${fileGraphWorkspaceShardPrefix(workspaceId)}file:${fileId}`;
|
|
27
|
+
}
|
|
28
|
+
/** Erzeugt alle Shards eines Abbilds, in stabiler Reihenfolge. */
|
|
29
|
+
export function toGraphShards(snapshot, writeId) {
|
|
30
|
+
assertFileGraphSnapshotScope(snapshot);
|
|
31
|
+
assertIdentifier("writeId", writeId);
|
|
32
|
+
const edgesByFrom = new Map();
|
|
33
|
+
for (const edge of snapshot.edges) {
|
|
34
|
+
const bucket = edgesByFrom.get(edge.fromFileId) ?? [];
|
|
35
|
+
bucket.push(edge);
|
|
36
|
+
edgesByFrom.set(edge.fromFileId, bucket);
|
|
37
|
+
}
|
|
38
|
+
const shards = [
|
|
39
|
+
{
|
|
40
|
+
logicalShardId: fileGraphMetaShardId(snapshot.workspaceId),
|
|
41
|
+
collection: "graph_meta",
|
|
42
|
+
generationId: snapshot.graphGeneration,
|
|
43
|
+
writeId,
|
|
44
|
+
payload: {
|
|
45
|
+
persistenceSchemaVersion: 1,
|
|
46
|
+
schemaVersion: snapshot.schemaVersion,
|
|
47
|
+
workspaceId: snapshot.workspaceId,
|
|
48
|
+
graphGeneration: snapshot.graphGeneration,
|
|
49
|
+
nodeCount: snapshot.nodes.length,
|
|
50
|
+
edgeCount: snapshot.edges.length,
|
|
51
|
+
metrics: snapshot.metrics,
|
|
52
|
+
topology: snapshot.topology,
|
|
53
|
+
skipped: snapshot.skipped,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
const pathIndex = {};
|
|
58
|
+
/**
|
|
59
|
+
* WP-197: Zwei Knoten mit DEMSELBEN Repository-Pfad ueberschrieben einander
|
|
60
|
+
* im Pfadindex — ohne Befund, ohne Ledger. Der Pfadindex ist aber genau der
|
|
61
|
+
* Zeuge, aus dem `readGraphSnapshot` seine Erwartungsmenge bildet: die
|
|
62
|
+
* verlorene `file_id` wurde damit auch beim Zurueckladen nie vermisst, und
|
|
63
|
+
* `missing_file_shard` konnte sie nicht nennen. Der Verlust war doppelt
|
|
64
|
+
* verdeckt. Jetzt behaelt der Index den ERSTEN (nach `file_id` kleinsten)
|
|
65
|
+
* Eintrag — bestimmt und damit reproduzierbar — und die Kollision steht als
|
|
66
|
+
* eigener Eintrag im Skip-Ledger des Abbilds.
|
|
67
|
+
*/
|
|
68
|
+
const pathCollisions = [];
|
|
69
|
+
for (const node of [...snapshot.nodes].sort((left, right) => compareCodepoints(left.fileId, right.fileId))) {
|
|
70
|
+
const key = pathKey(node.repoId, node.filePath);
|
|
71
|
+
const existing = pathIndex[key];
|
|
72
|
+
if (existing !== undefined) {
|
|
73
|
+
pathCollisions.push({ key, kept: existing, dropped: node.fileId });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
pathIndex[key] = node.fileId;
|
|
77
|
+
}
|
|
78
|
+
shards.push({
|
|
79
|
+
logicalShardId: fileGraphFileShardId(snapshot.workspaceId, node.fileId),
|
|
80
|
+
collection: "graph_files",
|
|
81
|
+
generationId: snapshot.graphGeneration,
|
|
82
|
+
writeId,
|
|
83
|
+
payload: {
|
|
84
|
+
persistenceSchemaVersion: 1,
|
|
85
|
+
workspaceId: snapshot.workspaceId,
|
|
86
|
+
graphGeneration: snapshot.graphGeneration,
|
|
87
|
+
node,
|
|
88
|
+
edges: (edgesByFrom.get(node.fileId) ?? []).sort(compareEdges),
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
shards.push({
|
|
93
|
+
logicalShardId: fileGraphPathIndexShardId(snapshot.workspaceId),
|
|
94
|
+
collection: "graph_indices",
|
|
95
|
+
generationId: snapshot.graphGeneration,
|
|
96
|
+
writeId,
|
|
97
|
+
payload: {
|
|
98
|
+
persistenceSchemaVersion: 1,
|
|
99
|
+
workspaceId: snapshot.workspaceId,
|
|
100
|
+
graphGeneration: snapshot.graphGeneration,
|
|
101
|
+
pathIndex,
|
|
102
|
+
// Die verdraengten `file_id`s stehen NEBEN dem Index, nicht in ihm: der
|
|
103
|
+
// Index bleibt damit formgleich zu bisherigen Generationen, und der
|
|
104
|
+
// Verlust ist trotzdem benannt und nachlesbar.
|
|
105
|
+
...(pathCollisions.length === 0 ? {} : { pathIndexCollisions: pathCollisions }),
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
return shards;
|
|
109
|
+
}
|
|
110
|
+
/** Schreibt ein vollstaendiges Abbild in den Speicher. */
|
|
111
|
+
export async function writeGraphSnapshot(store, snapshot, writeId, options) {
|
|
112
|
+
await store.writeShards(toGraphShards(snapshot, writeId), options);
|
|
113
|
+
}
|
|
114
|
+
/** Bound store pressure while avoiding one network roundtrip per file in series. */
|
|
115
|
+
const FILE_SHARD_READ_CONCURRENCY = 8;
|
|
116
|
+
async function readFileShards(store, candidates, generationId, options) {
|
|
117
|
+
const loaded = [];
|
|
118
|
+
for (let offset = 0; offset < candidates.length; offset += FILE_SHARD_READ_CONCURRENCY) {
|
|
119
|
+
options.signal?.throwIfAborted();
|
|
120
|
+
const batch = candidates.slice(offset, offset + FILE_SHARD_READ_CONCURRENCY);
|
|
121
|
+
const results = await Promise.allSettled(batch.map(async (candidate) => ({
|
|
122
|
+
...candidate,
|
|
123
|
+
shard: await store.readShard("graph_files", candidate.shardId, {
|
|
124
|
+
...options,
|
|
125
|
+
generationId,
|
|
126
|
+
}),
|
|
127
|
+
})));
|
|
128
|
+
// Wait for this bounded batch to settle before propagating the first error
|
|
129
|
+
// in candidate order. No later batch starts after a failure, and no read
|
|
130
|
+
// outlives the call. Completion timing never changes issue/error ordering.
|
|
131
|
+
for (const result of results) {
|
|
132
|
+
if (result.status === "rejected")
|
|
133
|
+
throw result.reason;
|
|
134
|
+
loaded.push(result.value);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return loaded;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Laedt ein Abbild fuer GENAU einen Workspace und GENAU eine Generation.
|
|
141
|
+
*
|
|
142
|
+
* Die alte Signatur `(store, generationId)` bleibt absichtlich typkompatibel,
|
|
143
|
+
* liest aber nichts mehr: ohne Workspace kann kein gespeicherter Graph sicher
|
|
144
|
+
* zugeordnet werden. Alte, globale Shards werden nur ueber
|
|
145
|
+
* `allowLegacyFallback: true` gelesen, nachdem ein vollstaendiger Scope
|
|
146
|
+
* angegeben wurde; jeder Payload wird dabei gegen diesen Scope geprueft.
|
|
147
|
+
*/
|
|
148
|
+
export async function readGraphSnapshot(store, scope, options = {}) {
|
|
149
|
+
if (typeof scope === "string") {
|
|
150
|
+
return {
|
|
151
|
+
snapshot: null,
|
|
152
|
+
issues: [
|
|
153
|
+
{
|
|
154
|
+
kind: "workspace_scope_required",
|
|
155
|
+
message: `generation "${scope}" was supplied without a workspaceId; use { workspaceId, generationId } so graph reads cannot cross workspace boundaries`,
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
assertGraphSnapshotScope(scope);
|
|
161
|
+
const { allowLegacyFallback, ...callOptions } = options;
|
|
162
|
+
const scopedLayout = {
|
|
163
|
+
metaShardId: fileGraphMetaShardId(scope.workspaceId),
|
|
164
|
+
pathIndexShardId: fileGraphPathIndexShardId(scope.workspaceId),
|
|
165
|
+
fileShardId: (fileId) => fileGraphFileShardId(scope.workspaceId, fileId),
|
|
166
|
+
ownsFileShard: (shardId) => shardId.startsWith(`${fileGraphWorkspaceShardPrefix(scope.workspaceId)}file:`),
|
|
167
|
+
legacy: false,
|
|
168
|
+
};
|
|
169
|
+
const scoped = await readGraphSnapshotFromLayout(store, scope, scopedLayout, callOptions);
|
|
170
|
+
if (allowLegacyFallback !== true ||
|
|
171
|
+
scoped.snapshot !== null ||
|
|
172
|
+
scoped.issues.some((issue) => issue.kind !== "missing_meta")) {
|
|
173
|
+
return scoped;
|
|
174
|
+
}
|
|
175
|
+
return readGraphSnapshotFromLayout(store, scope, {
|
|
176
|
+
metaShardId: META_SHARD_ID,
|
|
177
|
+
pathIndexShardId: PATH_INDEX_SHARD_ID,
|
|
178
|
+
fileShardId: (fileId) => fileId,
|
|
179
|
+
ownsFileShard: () => true,
|
|
180
|
+
legacy: true,
|
|
181
|
+
}, callOptions);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Eigentliche Rueckladung fuer eine namespacete oder explizit angeforderte
|
|
185
|
+
* Legacy-Ablage. Kein Store-Aufruf verzichtet auf `generationId`.
|
|
186
|
+
*/
|
|
187
|
+
async function readGraphSnapshotFromLayout(store, scope, layout, options) {
|
|
188
|
+
const issues = [];
|
|
189
|
+
const { generationId, workspaceId } = scope;
|
|
190
|
+
const metaShard = await store.readShard("graph_meta", layout.metaShardId, {
|
|
191
|
+
...options,
|
|
192
|
+
generationId,
|
|
193
|
+
});
|
|
194
|
+
if (metaShard === null) {
|
|
195
|
+
issues.push({
|
|
196
|
+
kind: "missing_meta",
|
|
197
|
+
message: `graph_meta/${layout.metaShardId} is absent for workspace "${workspaceId}" and generation "${generationId}"`,
|
|
198
|
+
});
|
|
199
|
+
return { snapshot: null, issues };
|
|
200
|
+
}
|
|
201
|
+
const meta = metaShard.payload;
|
|
202
|
+
// Der Metadaten-Shard traegt die Pflichtteile des Abbilds. Fehlt einer, kann
|
|
203
|
+
// `FileGraphSnapshotV1` nicht erfuellt werden — dann ist `null` mit
|
|
204
|
+
// benanntem Befund die einzige ehrliche Antwort. Ein Objekt mit
|
|
205
|
+
// `metrics: undefined` an einen Aufrufer zu geben, der laut Vertrag
|
|
206
|
+
// `snapshot.skipped.entries` lesen darf, ist ein verstecktes Loch (E4).
|
|
207
|
+
const metaIssues = validateMetaPayload(meta, scope, layout.metaShardId, metaShard.generationId);
|
|
208
|
+
if (metaIssues.length > 0) {
|
|
209
|
+
issues.push(...metaIssues);
|
|
210
|
+
return { snapshot: null, issues };
|
|
211
|
+
}
|
|
212
|
+
const nodes = [];
|
|
213
|
+
const edges = [];
|
|
214
|
+
// Erwartungsmenge NICHT aus `listShardIds` ableiten: ein Shard, den es nicht
|
|
215
|
+
// mehr gibt, wird schlicht nicht aufgezaehlt, und ein Vergleich der Liste mit
|
|
216
|
+
// sich selbst kann nie etwas finden. Der Pfadindex ist der unabhaengige
|
|
217
|
+
// Zeuge, welche `file_id`s zu dieser Generation gehoeren.
|
|
218
|
+
const pathIndexShard = await store.readShard("graph_indices", layout.pathIndexShardId, {
|
|
219
|
+
...options,
|
|
220
|
+
generationId,
|
|
221
|
+
});
|
|
222
|
+
if (pathIndexShard !== null) {
|
|
223
|
+
issues.push(...validatePayloadScope(pathIndexShard.payload, scope, `graph_indices/${layout.pathIndexShardId}`, pathIndexShard.generationId, layout.legacy));
|
|
224
|
+
if (issues.some((issue) => issue.kind === "scope_mismatch")) {
|
|
225
|
+
return { snapshot: null, issues };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// WP-197: Die beim Schreiben verdraengten `file_id`s stehen im Payload des
|
|
229
|
+
// Pfadindex. Sie hier zu ueberlesen hiesse, den Verlust genau an der Stelle
|
|
230
|
+
// zu verschweigen, an der er wirkt: `expectedFileIds` kennt sie nicht, also
|
|
231
|
+
// koennte `missing_file_shard` sie auch nie vermissen.
|
|
232
|
+
const collisions = pathIndexShard?.payload["pathIndexCollisions"];
|
|
233
|
+
if (Array.isArray(collisions)) {
|
|
234
|
+
for (const collision of collisions) {
|
|
235
|
+
if (!isRecord(collision))
|
|
236
|
+
continue;
|
|
237
|
+
issues.push({
|
|
238
|
+
kind: "malformed_payload",
|
|
239
|
+
message: `graph_indices/${layout.pathIndexShardId} of generation "${generationId}" records a path collision: "${String(collision["key"])}" maps to file id "${String(collision["kept"])}", so "${String(collision["dropped"])}" is NOT named by the path index and a missing shard for it could not be detected`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const expectedFileIds = expectedFileIdsOf(pathIndexShard?.payload);
|
|
244
|
+
if (expectedFileIds === null) {
|
|
245
|
+
issues.push({
|
|
246
|
+
kind: "missing_path_index",
|
|
247
|
+
message: pathIndexShard === null
|
|
248
|
+
? `graph_indices/${layout.pathIndexShardId} is absent for generation "${generationId}"; missing file shards cannot be named, only counted`
|
|
249
|
+
: `graph_indices/${layout.pathIndexShardId} has no usable "pathIndex" payload for generation "${generationId}"; missing file shards cannot be named, only counted`,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
const shardCandidates = expectedFileIds === null
|
|
253
|
+
? (await store.listShardIds("graph_files", { ...options, generationId }))
|
|
254
|
+
.filter(layout.ownsFileShard)
|
|
255
|
+
.sort(compareCodepoints)
|
|
256
|
+
.map((shardId) => ({ shardId, expectedFileId: null }))
|
|
257
|
+
: expectedFileIds.map((fileId) => ({
|
|
258
|
+
shardId: layout.fileShardId(fileId),
|
|
259
|
+
expectedFileId: fileId,
|
|
260
|
+
}));
|
|
261
|
+
const fileShards = await readFileShards(store, shardCandidates, generationId, options);
|
|
262
|
+
for (const { shardId, expectedFileId, shard } of fileShards) {
|
|
263
|
+
if (shard === null) {
|
|
264
|
+
issues.push({
|
|
265
|
+
kind: "missing_file_shard",
|
|
266
|
+
message: expectedFileId === null
|
|
267
|
+
? `graph_files/${shardId} was listed but could not be read`
|
|
268
|
+
: `graph_files/${shardId} is named by the path index of generation "${generationId}" but is absent from the store`,
|
|
269
|
+
});
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
const payloadScopeIssues = validatePayloadScope(shard.payload, scope, `graph_files/${shardId}`, shard.generationId, layout.legacy);
|
|
273
|
+
issues.push(...payloadScopeIssues);
|
|
274
|
+
if (payloadScopeIssues.length > 0)
|
|
275
|
+
continue;
|
|
276
|
+
const node = shard.payload["node"];
|
|
277
|
+
const shardEdges = shard.payload["edges"];
|
|
278
|
+
if (!isRecord(node) || !Array.isArray(shardEdges)) {
|
|
279
|
+
issues.push({
|
|
280
|
+
kind: "malformed_payload",
|
|
281
|
+
message: `graph_files/${shardId} has no usable "node"/"edges" payload`,
|
|
282
|
+
});
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
// Der Shard und der Knoten darin muessen DIESELBE Datei sein.
|
|
286
|
+
//
|
|
287
|
+
// Ohne diesen Vergleich ist die haeufigste zahlenerhaltende Verfaelschung
|
|
288
|
+
// unsichtbar: traegt `graph_files/F_c` den Knoten von `F_a`, dann ist der
|
|
289
|
+
// Shard gelistet, der Pfadindex nennt ihn, und drei Shards liefern drei
|
|
290
|
+
// Knoten — beide bisherigen Zeugen (`missing_file_shard`,
|
|
291
|
+
// `count_mismatch`) bescheinigen dem Abbild ausdruecklich
|
|
292
|
+
// Vollstaendigkeit, waehrend `F_c` verschwunden und `F_a` doppelt ist.
|
|
293
|
+
// Ein Abbild, das die Eindeutigkeit der `file_id` verletzt, ist fuer
|
|
294
|
+
// jeden Ableiter falsch, und es unbenannt zu liefern ist genau das
|
|
295
|
+
// stille Ueberspringen, das E4 verbietet.
|
|
296
|
+
const nodeFileId = node["fileId"];
|
|
297
|
+
const expectedPhysicalShardId = typeof nodeFileId === "string" && nodeFileId !== "" ? layout.fileShardId(nodeFileId) : null;
|
|
298
|
+
if (expectedPhysicalShardId === null ||
|
|
299
|
+
expectedPhysicalShardId !== shardId ||
|
|
300
|
+
(expectedFileId !== null && nodeFileId !== expectedFileId)) {
|
|
301
|
+
issues.push({
|
|
302
|
+
kind: "malformed_payload",
|
|
303
|
+
message: `graph_files/${shardId} carries a node with fileId ${typeof nodeFileId === "string" ? `"${nodeFileId}"` : "of a non-string type"}; the shard and the node it carries must be the same file`,
|
|
304
|
+
});
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
if (node["workspaceId"] !== workspaceId || node["graphGeneration"] !== generationId) {
|
|
308
|
+
issues.push({
|
|
309
|
+
kind: "scope_mismatch",
|
|
310
|
+
message: `graph_files/${shardId} carries a node outside requested workspace "${workspaceId}" or generation "${generationId}"`,
|
|
311
|
+
});
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const edgeScopeMismatch = shardEdges.some((edge) => !isRecord(edge) ||
|
|
315
|
+
edge["workspaceId"] !== workspaceId ||
|
|
316
|
+
edge["graphGeneration"] !== generationId ||
|
|
317
|
+
edge["fromFileId"] !== nodeFileId);
|
|
318
|
+
if (edgeScopeMismatch) {
|
|
319
|
+
issues.push({
|
|
320
|
+
kind: "scope_mismatch",
|
|
321
|
+
message: `graph_files/${shardId} carries an edge outside the requested scope or source file`,
|
|
322
|
+
});
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
nodes.push(node);
|
|
326
|
+
edges.push(...shardEdges);
|
|
327
|
+
}
|
|
328
|
+
if (issues.some((issue) => issue.kind === "scope_mismatch")) {
|
|
329
|
+
return { snapshot: null, issues };
|
|
330
|
+
}
|
|
331
|
+
// Sollzahlen gegen das tatsaechlich Geladene. Zweiter, vom Pfadindex
|
|
332
|
+
// unabhaengiger Zeuge: er greift auch dann, wenn der Pfadindex selbst fehlt.
|
|
333
|
+
const expectedNodeCount = countOf(meta["nodeCount"]);
|
|
334
|
+
if (expectedNodeCount !== null && expectedNodeCount !== nodes.length) {
|
|
335
|
+
issues.push({
|
|
336
|
+
kind: "count_mismatch",
|
|
337
|
+
message: `graph_meta/${layout.metaShardId} of generation "${generationId}" declares ${String(expectedNodeCount)} nodes, but ${String(nodes.length)} were loaded`,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
const expectedEdgeCount = countOf(meta["edgeCount"]);
|
|
341
|
+
if (expectedEdgeCount !== null && expectedEdgeCount !== edges.length) {
|
|
342
|
+
issues.push({
|
|
343
|
+
kind: "count_mismatch",
|
|
344
|
+
message: `graph_meta/${layout.metaShardId} of generation "${generationId}" declares ${String(expectedEdgeCount)} edges, but ${String(edges.length)} were loaded`,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// WP-181: DER DRITTE ZEUGE, der bisher nie befragt wurde.
|
|
348
|
+
//
|
|
349
|
+
// `metrics.nodeCount`/`metrics.edgeCount` liegen im selben Payload und
|
|
350
|
+
// wurden mit demselben Abbild geschrieben — sie sind aber eine EIGENE
|
|
351
|
+
// Aussage, gerechnet vom Metrikpfad, nicht abgeschrieben von
|
|
352
|
+
// `meta.nodeCount`. Wurden nur die aeusseren Zahlen fortgeschrieben und die
|
|
353
|
+
// Metriken nicht (oder umgekehrt), lieferte `readGraphSnapshot` bisher ein
|
|
354
|
+
// Abbild, das sich SELBST widerspricht: `snapshot.metrics.nodeCount` sagt
|
|
355
|
+
// 12, `snapshot.nodes.length` sagt 11 — und beide stehen ohne Vermerk
|
|
356
|
+
// nebeneinander in einem Objekt, das jeder Ableiter fuer in sich stimmig
|
|
357
|
+
// haelt. Ein Widerspruch, den man vorliegen hat und nicht ausspricht, ist
|
|
358
|
+
// dieselbe Klasse wie ein verschwiegener Verlust (E4).
|
|
359
|
+
const metricsPayload = meta["metrics"];
|
|
360
|
+
if (isRecord(metricsPayload)) {
|
|
361
|
+
const metricsNodeCount = countOf(metricsPayload["nodeCount"]);
|
|
362
|
+
if (metricsNodeCount !== null && metricsNodeCount !== nodes.length) {
|
|
363
|
+
issues.push({
|
|
364
|
+
kind: "count_mismatch",
|
|
365
|
+
message: `graph_meta/${layout.metaShardId} of generation "${generationId}" carries metrics.nodeCount ${String(metricsNodeCount)}, but ${String(nodes.length)} nodes were loaded; the returned snapshot would contradict itself`,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
const metricsEdgeCount = countOf(metricsPayload["edgeCount"]);
|
|
369
|
+
if (metricsEdgeCount !== null && metricsEdgeCount !== edges.length) {
|
|
370
|
+
issues.push({
|
|
371
|
+
kind: "count_mismatch",
|
|
372
|
+
message: `graph_meta/${layout.metaShardId} of generation "${generationId}" carries metrics.edgeCount ${String(metricsEdgeCount)}, but ${String(edges.length)} edges were loaded; the returned snapshot would contradict itself`,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const snapshot = {
|
|
377
|
+
schemaVersion: 1,
|
|
378
|
+
workspaceId,
|
|
379
|
+
graphGeneration: generationId,
|
|
380
|
+
nodes: nodes.sort((left, right) => compareCodepoints(left.fileId, right.fileId)),
|
|
381
|
+
edges: edges.sort(compareEdges),
|
|
382
|
+
metrics: meta["metrics"],
|
|
383
|
+
topology: meta["topology"],
|
|
384
|
+
skipped: meta["skipped"],
|
|
385
|
+
};
|
|
386
|
+
return { snapshot, issues };
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Prueft die Pflichtteile des Metadaten-Shards.
|
|
390
|
+
*
|
|
391
|
+
* Geprueft wird nur die TRAGENDE Form — genau die Zusagen, auf die ein
|
|
392
|
+
* Aufrufer sich ohne weitere Pruefung verlassen darf. Eine vollstaendige
|
|
393
|
+
* Schemapruefung waere hier eine zweite Wahrheit neben `domain`; ein
|
|
394
|
+
* ungeprueftes `as` waere gar keine.
|
|
395
|
+
*/
|
|
396
|
+
function validateMetaPayload(meta, scope, shardId, storedGenerationId) {
|
|
397
|
+
const issues = validatePayloadScope(meta, scope, `graph_meta/${shardId}`, storedGenerationId, false);
|
|
398
|
+
// WP-193: `String(meta["workspaceId"] ?? "")` machte aus einem FEHLENDEN
|
|
399
|
+
// Workspace den Leerstring — und der Leerstring ist im ganzen Produkt die
|
|
400
|
+
// Grenze, innerhalb derer eine Anfrage ueberhaupt gilt. Ein Abbild ohne
|
|
401
|
+
// Workspace wurde damit zu einem Abbild MIT einem (leeren) Workspace, das
|
|
402
|
+
// sich anschliessend gegen jede echte Workspace-Pruefung falsch verhaelt.
|
|
403
|
+
// Ein Pflichtteil, der fehlt, ist ein Befund, kein Vorgabewert.
|
|
404
|
+
const workspaceId = meta["workspaceId"];
|
|
405
|
+
if (typeof workspaceId !== "string" || workspaceId.trim() === "") {
|
|
406
|
+
issues.push({
|
|
407
|
+
kind: "malformed_payload",
|
|
408
|
+
message: `graph_meta/${shardId} has no usable "workspaceId"; a snapshot without a workspace has no scope it could belong to`,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
const metrics = meta["metrics"];
|
|
412
|
+
if (!isRecord(metrics) ||
|
|
413
|
+
typeof metrics["nodeCount"] !== "number" ||
|
|
414
|
+
metrics["workspaceId"] !== scope.workspaceId ||
|
|
415
|
+
metrics["graphGeneration"] !== scope.generationId) {
|
|
416
|
+
issues.push({
|
|
417
|
+
kind: "malformed_payload",
|
|
418
|
+
message: `graph_meta/${shardId} has no usable, scope-matching "metrics" payload`,
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
const topology = meta["topology"];
|
|
422
|
+
if (!isRecord(topology) ||
|
|
423
|
+
topology["workspaceId"] !== scope.workspaceId ||
|
|
424
|
+
!Array.isArray(topology["packages"]) ||
|
|
425
|
+
!Array.isArray(topology["services"]) ||
|
|
426
|
+
!isRecord(topology["skipped"]) ||
|
|
427
|
+
topology["skipped"]["generationId"] !== scope.generationId) {
|
|
428
|
+
issues.push({
|
|
429
|
+
kind: "malformed_payload",
|
|
430
|
+
message: `graph_meta/${shardId} has no usable, scope-matching "topology" payload`,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
const skipped = meta["skipped"];
|
|
434
|
+
if (!isRecord(skipped) ||
|
|
435
|
+
skipped["generationId"] !== scope.generationId ||
|
|
436
|
+
!Array.isArray(skipped["entries"]) ||
|
|
437
|
+
!isRecord(skipped["countsByReason"])) {
|
|
438
|
+
issues.push({
|
|
439
|
+
kind: "malformed_payload",
|
|
440
|
+
message: `graph_meta/${shardId} has no usable, scope-matching "skipped" payload`,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
return issues;
|
|
444
|
+
}
|
|
445
|
+
function validatePayloadScope(payload, scope, subject, storedGenerationId, legacy) {
|
|
446
|
+
const issues = [];
|
|
447
|
+
if (storedGenerationId !== scope.generationId) {
|
|
448
|
+
issues.push({
|
|
449
|
+
kind: "scope_mismatch",
|
|
450
|
+
message: `${subject} was returned from generation "${storedGenerationId}" while "${scope.generationId}" was requested`,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
const payloadWorkspaceId = payload["workspaceId"];
|
|
454
|
+
if (payloadWorkspaceId !== undefined && payloadWorkspaceId !== scope.workspaceId) {
|
|
455
|
+
issues.push({
|
|
456
|
+
kind: "scope_mismatch",
|
|
457
|
+
message: `${subject} belongs to workspace "${String(payloadWorkspaceId)}", not requested workspace "${scope.workspaceId}"`,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
else if (!legacy && payloadWorkspaceId === undefined) {
|
|
461
|
+
issues.push({
|
|
462
|
+
kind: "scope_mismatch",
|
|
463
|
+
message: `${subject} has no workspaceId persistence marker`,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
const payloadGeneration = payload["graphGeneration"];
|
|
467
|
+
if (payloadGeneration !== undefined && payloadGeneration !== scope.generationId) {
|
|
468
|
+
issues.push({
|
|
469
|
+
kind: "scope_mismatch",
|
|
470
|
+
message: `${subject} belongs to generation "${String(payloadGeneration)}", not requested generation "${scope.generationId}"`,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
else if (!legacy && payloadGeneration === undefined) {
|
|
474
|
+
issues.push({
|
|
475
|
+
kind: "scope_mismatch",
|
|
476
|
+
message: `${subject} has no graphGeneration persistence marker`,
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return issues;
|
|
480
|
+
}
|
|
481
|
+
/** `file_id`s laut Pfadindex; `null`, wenn der Index unbrauchbar ist. */
|
|
482
|
+
function expectedFileIdsOf(payload) {
|
|
483
|
+
if (payload === undefined)
|
|
484
|
+
return null;
|
|
485
|
+
const pathIndex = payload["pathIndex"];
|
|
486
|
+
if (!isRecord(pathIndex))
|
|
487
|
+
return null;
|
|
488
|
+
const fileIds = new Set();
|
|
489
|
+
for (const value of Object.values(pathIndex)) {
|
|
490
|
+
if (typeof value === "string" && value !== "")
|
|
491
|
+
fileIds.add(value);
|
|
492
|
+
}
|
|
493
|
+
return [...fileIds].sort(compareCodepoints);
|
|
494
|
+
}
|
|
495
|
+
function countOf(value) {
|
|
496
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : null;
|
|
497
|
+
}
|
|
498
|
+
function isRecord(value) {
|
|
499
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
500
|
+
}
|
|
501
|
+
function pathKey(repoId, path) {
|
|
502
|
+
return `${repoId}\u001f${normalizePath(path)}`;
|
|
503
|
+
}
|
|
504
|
+
function assertGraphSnapshotScope(scope) {
|
|
505
|
+
assertIdentifier("workspaceId", scope.workspaceId);
|
|
506
|
+
assertIdentifier("generationId", scope.generationId);
|
|
507
|
+
}
|
|
508
|
+
function assertFileGraphSnapshotScope(snapshot) {
|
|
509
|
+
assertGraphSnapshotScope({
|
|
510
|
+
workspaceId: snapshot.workspaceId,
|
|
511
|
+
generationId: snapshot.graphGeneration,
|
|
512
|
+
});
|
|
513
|
+
if (snapshot.metrics.workspaceId !== snapshot.workspaceId ||
|
|
514
|
+
snapshot.metrics.graphGeneration !== snapshot.graphGeneration ||
|
|
515
|
+
snapshot.topology.workspaceId !== snapshot.workspaceId ||
|
|
516
|
+
snapshot.topology.skipped.generationId !== snapshot.graphGeneration ||
|
|
517
|
+
snapshot.skipped.generationId !== snapshot.graphGeneration) {
|
|
518
|
+
throw new TypeError("file graph metrics, topology and skip ledger must match the snapshot workspace and generation");
|
|
519
|
+
}
|
|
520
|
+
for (const node of snapshot.nodes) {
|
|
521
|
+
if (node.workspaceId !== snapshot.workspaceId ||
|
|
522
|
+
node.graphGeneration !== snapshot.graphGeneration) {
|
|
523
|
+
throw new TypeError(`file graph node "${node.fileId}" does not match snapshot workspace/generation`);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
for (const edge of snapshot.edges) {
|
|
527
|
+
if (edge.workspaceId !== snapshot.workspaceId ||
|
|
528
|
+
edge.graphGeneration !== snapshot.graphGeneration) {
|
|
529
|
+
throw new TypeError(`file graph edge "${edge.edgeId}" does not match snapshot workspace/generation`);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
function assertIdentifier(name, value) {
|
|
534
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
535
|
+
throw new TypeError(`${name} must be a non-empty string`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ResolveContextV1, WorkspacePackageV1 } from "../types.js";
|
|
2
|
+
/** Erweiterungen in Probierreihenfolge. Quelltext vor Build-Ausgabe. */
|
|
3
|
+
export declare const DEFAULT_EXTENSION_ORDER: readonly [".ts", ".tsx", ".mts", ".cts", ".d.ts", ".js", ".jsx", ".mjs", ".cjs", ".json", ".py", ".vue"];
|
|
4
|
+
/**
|
|
5
|
+
* Endung, wie sie im Spezifizierer steht → Endungen, die tatsaechlich gemeint
|
|
6
|
+
* sein koennen. Die geschriebene Endung steht bewusst mit in der Liste, denn
|
|
7
|
+
* es gibt Projekte, in denen `./bundle.js` wirklich `bundle.js` meint.
|
|
8
|
+
*
|
|
9
|
+
* WELCHE ZUERST PROBIERT WIRD, haengt an der Sprache der QUELLDATEI
|
|
10
|
+
* (`preferSourceExtension`): in einer TypeScript-Datei meint `./util.js`
|
|
11
|
+
* unter `NodeNext` die Datei `util.ts`, also gewinnt dort die Quellendung.
|
|
12
|
+
* In einer JavaScript-Datei ist `./util.js` woertlich gemeint, also gewinnt
|
|
13
|
+
* dort die geschriebene Endung. Liegen `util.ts` und `util.js` nebeneinander,
|
|
14
|
+
* ist das der einzige Fall, in dem die Reihenfolge ueberhaupt zaehlt — und
|
|
15
|
+
* dann ist sie so, wie der jeweilige Uebersetzer sie auch waehlt.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ESM_EXTENSION_REMAP: Readonly<Record<string, readonly string[]>>;
|
|
18
|
+
/** Erweiterungen, die als „nicht ausfuehrbarer Inhalt" gelten (spec.md §19/§20). */
|
|
19
|
+
export declare const ASSET_EXTENSIONS: Set<string>;
|
|
20
|
+
/** Ergebnis einer Kandidatenprobe. */
|
|
21
|
+
export interface CandidateProbeV1 {
|
|
22
|
+
/** Gefundener repo-relativer Pfad; `null`, wenn keine Probe traf. */
|
|
23
|
+
path: string | null;
|
|
24
|
+
/** Alle geprueften Pfade in Probierreihenfolge — auch der Treffer. */
|
|
25
|
+
tried: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Bildet alle Kandidatenpfade zu einem Basispfad, ohne den Index zu befragen.
|
|
29
|
+
* Reihenfolge ist Teil des Vertrags: sie entscheidet, welche Datei gewinnt,
|
|
30
|
+
* wenn mehrere existieren.
|
|
31
|
+
*/
|
|
32
|
+
export declare function candidatePaths(basePath: string, extensionOrder?: readonly string[], options?: {
|
|
33
|
+
preferSourceExtension?: boolean;
|
|
34
|
+
}): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Bildet einen Pfad in der Build-Ausgabe eines Pakets auf den entsprechenden
|
|
37
|
+
* Quellpfad ab. `null`, wenn der Pfad nicht in einer bekannten Build-Ausgabe
|
|
38
|
+
* liegt oder das Paket keine Abbildung deklariert.
|
|
39
|
+
*/
|
|
40
|
+
export declare function reverseBuildOutput(packages: Iterable<WorkspacePackageV1>, repoId: string, path: string): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Sucht die erste existierende Datei zu einem Basispfad.
|
|
43
|
+
*
|
|
44
|
+
* Zuerst die direkten Kandidaten, danach — und nur, wenn keiner traf — die
|
|
45
|
+
* ueber `rootDir`/`outDir` zurueckgebildeten. Diese Reihenfolge ist wichtig:
|
|
46
|
+
* existiert die Build-Ausgabe wirklich im Index (weil jemand `dist/` mit
|
|
47
|
+
* indiziert hat), gewinnt sie, und wir erfinden keine Quelldatei.
|
|
48
|
+
*/
|
|
49
|
+
export declare function probeCandidates(context: ResolveContextV1, repoId: string, basePath: string): CandidateProbeV1;
|
|
50
|
+
/** True, wenn der Spezifizierer auf eine Nicht-Code-Ressource zeigt. */
|
|
51
|
+
export declare function isAssetSpecifier(specifier: string): boolean;
|
|
52
|
+
//# sourceMappingURL=candidates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/resolve/candidates.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExE,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,0GAa1B,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAK3E,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,aAmB3B,CAAC;AAEH,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,SAAS,MAAM,EAA4B,EAC3D,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,MAAM,EAAE,CAkDV;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAaf;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAwBlB;AAUD,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D"}
|