@ttsc/graph 0.16.5 → 0.16.6

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 (61) hide show
  1. package/lib/TtscGraphApplication.js +36 -23
  2. package/lib/TtscGraphApplication.js.map +1 -1
  3. package/lib/model/loadGraph.js +17 -17
  4. package/lib/server/accessAliases.js +53 -0
  5. package/lib/server/accessAliases.js.map +1 -0
  6. package/lib/server/createServer.js +1133 -634
  7. package/lib/server/createServer.js.map +1 -1
  8. package/lib/server/instructions.js +69 -21
  9. package/lib/server/instructions.js.map +1 -1
  10. package/lib/server/runDetails.js +413 -0
  11. package/lib/server/runDetails.js.map +1 -0
  12. package/lib/server/{runIndex.js → runEntrypoints.js} +91 -26
  13. package/lib/server/runEntrypoints.js.map +1 -0
  14. package/lib/server/{runQuery.js → runLookup.js} +102 -15
  15. package/lib/server/runLookup.js.map +1 -0
  16. package/lib/server/runOverview.js +31 -21
  17. package/lib/server/runOverview.js.map +1 -1
  18. package/lib/server/runTrace.js +133 -38
  19. package/lib/server/runTrace.js.map +1 -1
  20. package/lib/structures/{ITtscGraphQuery.js → ITtscGraphDetails.js} +1 -1
  21. package/lib/structures/ITtscGraphDetails.js.map +1 -0
  22. package/lib/structures/ITtscGraphEntrypoints.js +3 -0
  23. package/lib/structures/ITtscGraphEntrypoints.js.map +1 -0
  24. package/lib/structures/{ITtscGraphExpand.js → ITtscGraphEscape.js} +1 -1
  25. package/lib/structures/ITtscGraphEscape.js.map +1 -0
  26. package/lib/structures/{ITtscGraphIndex.js → ITtscGraphLookup.js} +1 -1
  27. package/lib/structures/ITtscGraphLookup.js.map +1 -0
  28. package/lib/structures/index.js +4 -3
  29. package/lib/structures/index.js.map +1 -1
  30. package/package.json +2 -2
  31. package/src/TtscGraphApplication.ts +39 -32
  32. package/src/server/accessAliases.ts +55 -0
  33. package/src/server/createServer.ts +4 -7
  34. package/src/server/instructions.ts +69 -21
  35. package/src/server/runDetails.ts +469 -0
  36. package/src/server/{runIndex.ts → runEntrypoints.ts} +109 -34
  37. package/src/server/{runQuery.ts → runLookup.ts} +123 -16
  38. package/src/server/runOverview.ts +35 -23
  39. package/src/server/runTrace.ts +164 -38
  40. package/src/structures/ITtscGraphApplication.ts +100 -52
  41. package/src/structures/ITtscGraphDecorator.ts +12 -14
  42. package/src/structures/ITtscGraphDetails.ts +134 -0
  43. package/src/structures/{ITtscGraphIndex.ts → ITtscGraphEntrypoints.ts} +34 -16
  44. package/src/structures/ITtscGraphEscape.ts +39 -0
  45. package/src/structures/ITtscGraphEvidence.ts +5 -8
  46. package/src/structures/ITtscGraphLookup.ts +61 -0
  47. package/src/structures/ITtscGraphNode.ts +10 -4
  48. package/src/structures/ITtscGraphOverview.ts +24 -16
  49. package/src/structures/ITtscGraphTrace.ts +54 -11
  50. package/src/structures/TtscGraphNodeKind.ts +2 -2
  51. package/src/structures/index.ts +4 -3
  52. package/lib/server/runExpand.js +0 -177
  53. package/lib/server/runExpand.js.map +0 -1
  54. package/lib/server/runIndex.js.map +0 -1
  55. package/lib/server/runQuery.js.map +0 -1
  56. package/lib/structures/ITtscGraphExpand.js.map +0 -1
  57. package/lib/structures/ITtscGraphIndex.js.map +0 -1
  58. package/lib/structures/ITtscGraphQuery.js.map +0 -1
  59. package/src/server/runExpand.ts +0 -186
  60. package/src/structures/ITtscGraphExpand.ts +0 -85
  61. package/src/structures/ITtscGraphQuery.ts +0 -49
@@ -1,21 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TtscGraphApplication = void 0;
4
- const runExpand_1 = require("./server/runExpand");
5
- const runIndex_1 = require("./server/runIndex");
4
+ const runDetails_1 = require("./server/runDetails");
5
+ const runEntrypoints_1 = require("./server/runEntrypoints");
6
+ const runLookup_1 = require("./server/runLookup");
6
7
  const runOverview_1 = require("./server/runOverview");
7
- const runQuery_1 = require("./server/runQuery");
8
8
  const runTrace_1 = require("./server/runTrace");
9
9
  /**
10
10
  * The MCP tool surface as a plain class over the resident
11
11
  * {@link TtscGraphMemory}.
12
12
  *
13
- * Each public method is one MCP tool `typia.llm.controller` reflects
14
- * {@link ITtscGraphApplication} to generate every tool's JSON schema and
15
- * argument validator from these signatures and their JSDoc, with no
16
- * hand-written schema. The methods delegate to the pure tool functions in
17
- * `./server`, which are unit-testable without a transport; this class only
18
- * binds them to the graph.
13
+ * Its public method is the MCP tool: `typia.llm.controller` reflects
14
+ * {@link ITtscGraphApplication} to generate the tool's JSON schema and argument
15
+ * validator from the signature and JSDoc, with no hand-written schema. The
16
+ * method delegates to the pure graph functions in `./server`, which are
17
+ * unit-testable without a transport; this class only binds them to the graph.
19
18
  *
20
19
  * Every method answers from the resident graph; none recompiles. Output is kept
21
20
  * compact and bounded so a model can read structure without a file read, which
@@ -26,20 +25,34 @@ class TtscGraphApplication {
26
25
  constructor(source) {
27
26
  this.graph = typeof source === "function" ? source : () => source;
28
27
  }
29
- graph_index(props) {
30
- return (0, runIndex_1.runIndex)(this.graph(), props);
31
- }
32
- graph_overview(props) {
33
- return (0, runOverview_1.runOverview)(this.graph(), props);
34
- }
35
- graph_expand(props) {
36
- return (0, runExpand_1.runExpand)(this.graph(), props);
37
- }
38
- graph_query(props) {
39
- return (0, runQuery_1.runQuery)(this.graph(), props);
40
- }
41
- graph_trace(props) {
42
- return (0, runTrace_1.runTrace)(this.graph(), props);
28
+ query(props) {
29
+ switch (props.request.type) {
30
+ case "entrypoints":
31
+ return { result: (0, runEntrypoints_1.runEntrypoints)(this.graph(), props.request) };
32
+ case "lookup":
33
+ return { result: (0, runLookup_1.runLookup)(this.graph(), props.request) };
34
+ case "trace":
35
+ return { result: (0, runTrace_1.runTrace)(this.graph(), props.request) };
36
+ case "details":
37
+ return { result: (0, runDetails_1.runDetails)(this.graph(), props.request) };
38
+ case "overview":
39
+ return { result: (0, runOverview_1.runOverview)(this.graph(), props.request) };
40
+ case "escape": {
41
+ const result = {
42
+ type: "escape",
43
+ skipped: true,
44
+ reason: props.request.reason,
45
+ };
46
+ if (props.request.nextStep !== undefined) {
47
+ result.nextStep = props.request.nextStep;
48
+ }
49
+ return {
50
+ result,
51
+ };
52
+ }
53
+ default:
54
+ throw new Error("Unknown graph request type");
55
+ }
43
56
  }
44
57
  }
45
58
  exports.TtscGraphApplication = TtscGraphApplication;
@@ -1 +1 @@
1
- {"version":3,"file":"TtscGraphApplication.js","sourceRoot":"","sources":["../src/TtscGraphApplication.ts"],"names":[],"mappings":";;;AACA,kDAA+C;AAC/C,gDAA6C;AAC7C,sDAAmD;AACnD,gDAA6C;AAC7C,gDAA6C;AAU7C;;;;;;;;;;;;;;GAcG;AACH;IACmB,KAAK,CAAwB;IAE9C,YAAmB,MAAuB;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IACpE,CAAC;IAEM,WAAW,CAAC,KAA6B;QAC9C,OAAO,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,cAAc,CAAC,KAAgC;QACpD,OAAO,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAEM,YAAY,CAAC,KAA8B;QAChD,OAAO,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,WAAW,CAAC,KAA6B;QAC9C,OAAO,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,WAAW,CAAC,KAA6B;QAC9C,OAAO,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"TtscGraphApplication.js","sourceRoot":"","sources":["../src/TtscGraphApplication.ts"],"names":[],"mappings":";;;AACA,oDAAiD;AACjD,4DAAyD;AACzD,kDAA+C;AAC/C,sDAAmD;AACnD,gDAA6C;AAM7C;;;;;;;;;;;;;GAaG;AACH;IACmB,KAAK,CAAwB;IAE9C,YAAmB,MAAuB;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IACpE,CAAC;IAEM,KAAK,CACV,KAAmC;QAEnC,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,aAAa;gBAChB,OAAO,EAAE,MAAM,EAAE,IAAA,+BAAc,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,KAAK,QAAQ;gBACX,OAAO,EAAE,MAAM,EAAE,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,KAAK,OAAO;gBACV,OAAO,EAAE,MAAM,EAAE,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,KAAK,SAAS;gBACZ,OAAO,EAAE,MAAM,EAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,KAAK,UAAU;gBACb,OAAO,EAAE,MAAM,EAAE,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,MAAM,GAAqB;oBAC/B,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;iBAC7B,CAAC;gBACF,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACzC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC3C,CAAC;gBACD,OAAO;oBACL,MAAM;iBACP,CAAC;YACJ,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF"}
@@ -251,6 +251,16 @@ function parseDump(json) {
251
251
  path: _path + ".evidence",
252
252
  expected: "(ITtscGraphEvidence | undefined)",
253
253
  value: input.evidence
254
+ }, _errorFactory)) && (undefined === input.implementation || ("object" === typeof input.implementation && null !== input.implementation || _a._assertGuard(_exceptionable, {
255
+ method: "typia.assert",
256
+ path: _path + ".implementation",
257
+ expected: "(ITtscGraphEvidence | undefined)",
258
+ value: input.implementation
259
+ }, _errorFactory)) && _ao4(input.implementation, _path + ".implementation", true && _exceptionable) || _a._assertGuard(_exceptionable, {
260
+ method: "typia.assert",
261
+ path: _path + ".implementation",
262
+ expected: "(ITtscGraphEvidence | undefined)",
263
+ value: input.implementation
254
264
  }, _errorFactory));
255
265
  const _ao2 = (input, _path, _exceptionable = true) => ("string" === typeof input.name || _a._assertGuard(_exceptionable, {
256
266
  method: "typia.assert",
@@ -262,7 +272,7 @@ function parseDump(json) {
262
272
  path: _path + ".arguments",
263
273
  expected: "Array<ITtscGraphDecorator.IArgument>",
264
274
  value: input.arguments
265
- }, _errorFactory)) && input.arguments.every((elem, _index17) => ("object" === typeof elem && null !== elem || _a._assertGuard(_exceptionable, {
275
+ }, _errorFactory)) && input.arguments.every((elem, _index17) => ("object" === typeof elem && null !== elem && false === Array.isArray(elem) || _a._assertGuard(_exceptionable, {
266
276
  method: "typia.assert",
267
277
  path: _path + ".arguments[" + _index17 + "]",
268
278
  expected: "ITtscGraphDecorator.IArgument",
@@ -278,17 +288,12 @@ function parseDump(json) {
278
288
  expected: "Array<ITtscGraphDecorator.IArgument>",
279
289
  value: input.arguments
280
290
  }, _errorFactory));
281
- const _ao3 = (input, _path, _exceptionable = true) => ("string" === typeof input.text || _a._assertGuard(_exceptionable, {
282
- method: "typia.assert",
283
- path: _path + ".text",
284
- expected: "string",
285
- value: input.text
286
- }, _errorFactory)) && (undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal || _a._assertGuard(_exceptionable, {
291
+ const _ao3 = (input, _path, _exceptionable = true) => undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal || _a._assertGuard(_exceptionable, {
287
292
  method: "typia.assert",
288
293
  path: _path + ".literal",
289
294
  expected: "(boolean | number | string | undefined)",
290
295
  value: input.literal
291
- }, _errorFactory));
296
+ }, _errorFactory);
292
297
  const _ao4 = (input, _path, _exceptionable = true) => ("string" === typeof input.file || _a._assertGuard(_exceptionable, {
293
298
  method: "typia.assert",
294
299
  path: _path + ".file",
@@ -314,11 +319,6 @@ function parseDump(json) {
314
319
  path: _path + ".endCol",
315
320
  expected: "(number | undefined)",
316
321
  value: input.endCol
317
- }, _errorFactory)) && (undefined === input.text || "string" === typeof input.text || _a._assertGuard(_exceptionable, {
318
- method: "typia.assert",
319
- path: _path + ".text",
320
- expected: "(string | undefined)",
321
- value: input.text
322
322
  }, _errorFactory));
323
323
  const _ao5 = (input, _path, _exceptionable = true) => ("string" === typeof input.from || _a._assertGuard(_exceptionable, {
324
324
  method: "typia.assert",
@@ -388,10 +388,10 @@ function parseDump(json) {
388
388
  value: input.node
389
389
  }, _errorFactory));
390
390
  const _io0 = input => "string" === typeof input.project && "string" === typeof input.tsconfig && (Array.isArray(input.nodes) && input.nodes.every(elem => "object" === typeof elem && null !== elem && _io1(elem))) && (Array.isArray(input.edges) && input.edges.every(elem => "object" === typeof elem && null !== elem && _io5(elem))) && (undefined === input.diagnostics || Array.isArray(input.diagnostics) && input.diagnostics.every(elem => "object" === typeof elem && null !== elem && _io6(elem)));
391
- const _io1 = input => "string" === typeof input.id && true === _iv4.has(input.kind) && "string" === typeof input.name && (undefined === input.qualifiedName || "string" === typeof input.qualifiedName) && "string" === typeof input.file && "boolean" === typeof input.external && (undefined === input.ignored || "boolean" === typeof input.ignored) && (undefined === input.exported || "boolean" === typeof input.exported) && (undefined === input.modifiers || Array.isArray(input.modifiers) && input.modifiers.every(elem => true === _iv6.has(elem))) && (undefined === input.decorators || Array.isArray(input.decorators) && input.decorators.every(elem => "object" === typeof elem && null !== elem && _io2(elem))) && (undefined === input.evidence || "object" === typeof input.evidence && null !== input.evidence && _io4(input.evidence));
392
- const _io2 = input => "string" === typeof input.name && (Array.isArray(input.arguments) && input.arguments.every(elem => "object" === typeof elem && null !== elem && _io3(elem)));
393
- const _io3 = input => "string" === typeof input.text && (undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal);
394
- const _io4 = input => "string" === typeof input.file && "number" === typeof input.startLine && (undefined === input.startCol || "number" === typeof input.startCol) && (undefined === input.endLine || "number" === typeof input.endLine) && (undefined === input.endCol || "number" === typeof input.endCol) && (undefined === input.text || "string" === typeof input.text);
391
+ const _io1 = input => "string" === typeof input.id && true === _iv4.has(input.kind) && "string" === typeof input.name && (undefined === input.qualifiedName || "string" === typeof input.qualifiedName) && "string" === typeof input.file && "boolean" === typeof input.external && (undefined === input.ignored || "boolean" === typeof input.ignored) && (undefined === input.exported || "boolean" === typeof input.exported) && (undefined === input.modifiers || Array.isArray(input.modifiers) && input.modifiers.every(elem => true === _iv6.has(elem))) && (undefined === input.decorators || Array.isArray(input.decorators) && input.decorators.every(elem => "object" === typeof elem && null !== elem && _io2(elem))) && (undefined === input.evidence || "object" === typeof input.evidence && null !== input.evidence && _io4(input.evidence)) && (undefined === input.implementation || "object" === typeof input.implementation && null !== input.implementation && _io4(input.implementation));
392
+ const _io2 = input => "string" === typeof input.name && (Array.isArray(input.arguments) && input.arguments.every(elem => "object" === typeof elem && null !== elem && false === Array.isArray(elem) && _io3(elem)));
393
+ const _io3 = input => undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal;
394
+ const _io4 = input => "string" === typeof input.file && "number" === typeof input.startLine && (undefined === input.startCol || "number" === typeof input.startCol) && (undefined === input.endLine || "number" === typeof input.endLine) && (undefined === input.endCol || "number" === typeof input.endCol);
395
395
  const _io5 = input => "string" === typeof input.from && "string" === typeof input.to && true === _iv9.has(input.kind) && (undefined === input.evidence || "object" === typeof input.evidence && null !== input.evidence && _io4(input.evidence));
396
396
  const _io6 = input => "string" === typeof input.file && "number" === typeof input.line && (undefined === input.column || "number" === typeof input.column) && ("string" === typeof input.code || "number" === typeof input.code) && "string" === typeof input.message && (undefined === input.severity || "error" === input.severity || "hint" === input.severity || "info" === input.severity || "warning" === input.severity) && (undefined === input.origin || "lint" === input.origin || "plugin" === input.origin || "tsc" === input.origin) && (undefined === input.node || "string" === typeof input.node);
397
397
  const __is = input => "object" === typeof input && null !== input && _io0(input);
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.accessAliasesFor = accessAliasesFor;
4
+ /**
5
+ * Derive stable access-path aliases for a member edge from its source
6
+ * expression. If a hop reaches `Owner.member` through `obj.path.member`, the
7
+ * alias `Owner.path.member` keeps both the resolved owner and the concrete
8
+ * access path visible without reopening source.
9
+ */
10
+ function accessAliasesFor(node, evidenceText) {
11
+ if (node === undefined ||
12
+ node.qualifiedName === undefined ||
13
+ evidenceText === undefined) {
14
+ return undefined;
15
+ }
16
+ const segments = dottedSegments(evidenceText);
17
+ if (segments.length < 2 || segments[segments.length - 1] !== node.name) {
18
+ return undefined;
19
+ }
20
+ const dot = node.qualifiedName.lastIndexOf(".");
21
+ if (dot < 0)
22
+ return undefined;
23
+ const owner = node.qualifiedName.slice(0, dot);
24
+ const suffix = segments.slice(1).join(".");
25
+ const aliases = new Set();
26
+ for (const candidate of [...ownerDisplayAliases(owner), owner]) {
27
+ const alias = `${candidate}.${suffix}`;
28
+ if (alias !== node.qualifiedName)
29
+ aliases.add(alias);
30
+ }
31
+ return aliases.size > 0 ? [...aliases] : undefined;
32
+ }
33
+ function dottedSegments(text) {
34
+ const normalized = text.trim().replace(/\?\./g, ".");
35
+ const parts = normalized.split(".");
36
+ if (parts.length < 2)
37
+ return [];
38
+ return parts.every((part) => /^[A-Za-z_$][\w$]*$/.test(part)) ? parts : [];
39
+ }
40
+ function ownerDisplayAliases(owner) {
41
+ const display = owner.replace(/^_+/, "");
42
+ const out = new Set();
43
+ for (const suffix of ["Internals", "Internal"]) {
44
+ if (display.length > suffix.length && display.endsWith(suffix)) {
45
+ out.add(display.slice(0, -suffix.length));
46
+ }
47
+ }
48
+ if (out.size === 0 && display !== owner)
49
+ out.add(display);
50
+ out.delete(owner);
51
+ return [...out];
52
+ }
53
+ //# sourceMappingURL=accessAliases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessAliases.js","sourceRoot":"","sources":["../../src/server/accessAliases.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,0BACE,IAAgC,EAChC,YAAgC;IAEhC,IACE,IAAI,KAAK,SAAS;QAClB,IAAI,CAAC,aAAa,KAAK,SAAS;QAChC,YAAY,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK;QAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC"}