@formspec/build 0.1.0-alpha.4 → 0.1.0-alpha.41

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 (113) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -93
  3. package/dist/analyzer/class-analyzer.d.ts +135 -0
  4. package/dist/analyzer/class-analyzer.d.ts.map +1 -0
  5. package/dist/analyzer/jsdoc-constraints.d.ts +53 -0
  6. package/dist/analyzer/jsdoc-constraints.d.ts.map +1 -0
  7. package/dist/analyzer/program.d.ts +94 -0
  8. package/dist/analyzer/program.d.ts.map +1 -0
  9. package/dist/analyzer/tsdoc-parser.d.ts +126 -0
  10. package/dist/analyzer/tsdoc-parser.d.ts.map +1 -0
  11. package/dist/browser.cjs +2113 -0
  12. package/dist/browser.cjs.map +1 -0
  13. package/dist/browser.d.ts +74 -0
  14. package/dist/browser.d.ts.map +1 -0
  15. package/dist/browser.js +2070 -0
  16. package/dist/browser.js.map +1 -0
  17. package/dist/build-alpha.d.ts +1501 -0
  18. package/dist/build-beta.d.ts +1501 -0
  19. package/dist/build-internal.d.ts +1501 -0
  20. package/dist/build.d.ts +1194 -43
  21. package/dist/canonicalize/chain-dsl-canonicalizer.d.ts +22 -0
  22. package/dist/canonicalize/chain-dsl-canonicalizer.d.ts.map +1 -0
  23. package/dist/canonicalize/index.d.ts +8 -0
  24. package/dist/canonicalize/index.d.ts.map +1 -0
  25. package/dist/canonicalize/tsdoc-canonicalizer.d.ts +38 -0
  26. package/dist/canonicalize/tsdoc-canonicalizer.d.ts.map +1 -0
  27. package/dist/cli.cjs +6715 -0
  28. package/dist/cli.cjs.map +1 -0
  29. package/dist/cli.js +6687 -103
  30. package/dist/cli.js.map +1 -1
  31. package/dist/extensions/index.d.ts +8 -0
  32. package/dist/extensions/index.d.ts.map +1 -0
  33. package/dist/extensions/registry.d.ts +83 -0
  34. package/dist/extensions/registry.d.ts.map +1 -0
  35. package/dist/generators/class-schema.d.ts +347 -0
  36. package/dist/generators/class-schema.d.ts.map +1 -0
  37. package/dist/generators/discovered-schema.d.ts +152 -0
  38. package/dist/generators/discovered-schema.d.ts.map +1 -0
  39. package/dist/generators/method-schema.d.ts +72 -0
  40. package/dist/generators/method-schema.d.ts.map +1 -0
  41. package/dist/generators/mixed-authoring.d.ts +52 -0
  42. package/dist/generators/mixed-authoring.d.ts.map +1 -0
  43. package/dist/index.cjs +6412 -0
  44. package/dist/index.cjs.map +1 -0
  45. package/dist/index.d.ts +50 -8
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +6387 -107
  48. package/dist/index.js.map +1 -1
  49. package/dist/internals.cjs +5573 -0
  50. package/dist/internals.cjs.map +1 -0
  51. package/dist/internals.d.ts +32 -0
  52. package/dist/internals.d.ts.map +1 -0
  53. package/dist/internals.js +5554 -0
  54. package/dist/internals.js.map +1 -0
  55. package/dist/json-schema/generator.d.ts +32 -6
  56. package/dist/json-schema/generator.d.ts.map +1 -1
  57. package/dist/json-schema/ir-generator.d.ts +149 -0
  58. package/dist/json-schema/ir-generator.d.ts.map +1 -0
  59. package/dist/json-schema/schema.d.ts +23 -0
  60. package/dist/json-schema/schema.d.ts.map +1 -0
  61. package/dist/json-schema/types.d.ts +76 -2
  62. package/dist/json-schema/types.d.ts.map +1 -1
  63. package/dist/metadata/collision-guards.d.ts +3 -0
  64. package/dist/metadata/collision-guards.d.ts.map +1 -0
  65. package/dist/metadata/index.d.ts +7 -0
  66. package/dist/metadata/index.d.ts.map +1 -0
  67. package/dist/metadata/policy.d.ts +12 -0
  68. package/dist/metadata/policy.d.ts.map +1 -0
  69. package/dist/metadata/resolve.d.ts +21 -0
  70. package/dist/metadata/resolve.d.ts.map +1 -0
  71. package/dist/static-build.d.ts +61 -0
  72. package/dist/static-build.d.ts.map +1 -0
  73. package/dist/ui-schema/generator.d.ts +18 -2
  74. package/dist/ui-schema/generator.d.ts.map +1 -1
  75. package/dist/ui-schema/ir-generator.d.ts +54 -0
  76. package/dist/ui-schema/ir-generator.d.ts.map +1 -0
  77. package/dist/ui-schema/schema.d.ts +429 -0
  78. package/dist/ui-schema/schema.d.ts.map +1 -0
  79. package/dist/ui-schema/types.d.ts +179 -35
  80. package/dist/ui-schema/types.d.ts.map +1 -1
  81. package/dist/validate/constraint-validator.d.ts +85 -0
  82. package/dist/validate/constraint-validator.d.ts.map +1 -0
  83. package/dist/validate/index.d.ts +9 -0
  84. package/dist/validate/index.d.ts.map +1 -0
  85. package/package.json +31 -11
  86. package/dist/__tests__/cli.test.d.ts +0 -2
  87. package/dist/__tests__/cli.test.d.ts.map +0 -1
  88. package/dist/__tests__/cli.test.js +0 -178
  89. package/dist/__tests__/cli.test.js.map +0 -1
  90. package/dist/__tests__/edge-cases.test.d.ts +0 -7
  91. package/dist/__tests__/edge-cases.test.d.ts.map +0 -1
  92. package/dist/__tests__/edge-cases.test.js +0 -217
  93. package/dist/__tests__/edge-cases.test.js.map +0 -1
  94. package/dist/__tests__/generator.test.d.ts +0 -2
  95. package/dist/__tests__/generator.test.d.ts.map +0 -1
  96. package/dist/__tests__/generator.test.js +0 -225
  97. package/dist/__tests__/generator.test.js.map +0 -1
  98. package/dist/__tests__/integration.test.d.ts +0 -8
  99. package/dist/__tests__/integration.test.d.ts.map +0 -1
  100. package/dist/__tests__/integration.test.js +0 -163
  101. package/dist/__tests__/integration.test.js.map +0 -1
  102. package/dist/__tests__/write-schemas.test.d.ts +0 -2
  103. package/dist/__tests__/write-schemas.test.d.ts.map +0 -1
  104. package/dist/__tests__/write-schemas.test.js +0 -196
  105. package/dist/__tests__/write-schemas.test.js.map +0 -1
  106. package/dist/json-schema/generator.js +0 -161
  107. package/dist/json-schema/generator.js.map +0 -1
  108. package/dist/json-schema/types.js +0 -7
  109. package/dist/json-schema/types.js.map +0 -1
  110. package/dist/ui-schema/generator.js +0 -150
  111. package/dist/ui-schema/generator.js.map +0 -1
  112. package/dist/ui-schema/types.js +0 -8
  113. package/dist/ui-schema/types.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * TypeScript program setup for static analysis.
3
+ *
4
+ * Creates a TypeScript program with type checker from a source file,
5
+ * using the project's tsconfig.json for compiler options.
6
+ */
7
+ import * as ts from "typescript";
8
+ import type { ConstraintSemanticDiagnostic } from "@formspec/analysis/internal";
9
+ import { type DiscriminatorResolutionOptions, type IRClassAnalysis } from "./class-analyzer.js";
10
+ import type { ExtensionRegistry } from "../extensions/index.js";
11
+ import type { MetadataPolicyInput } from "@formspec/core";
12
+ /**
13
+ * Result of creating a TypeScript program for analysis.
14
+ */
15
+ export interface ProgramContext {
16
+ /** The TypeScript program */
17
+ program: ts.Program;
18
+ /** Type checker for resolving types */
19
+ checker: ts.TypeChecker;
20
+ /** The source file being analyzed */
21
+ sourceFile: ts.SourceFile;
22
+ }
23
+ export type AnalyzeNamedTypeToIRDetailedResult = {
24
+ readonly ok: true;
25
+ readonly analysis: IRClassAnalysis;
26
+ } | {
27
+ readonly ok: false;
28
+ readonly diagnostics: readonly ConstraintSemanticDiagnostic[];
29
+ };
30
+ /**
31
+ * Resolves a source file and checker from an existing TypeScript program.
32
+ *
33
+ * @param program - Existing TypeScript program supplied by the host
34
+ * @param filePath - Absolute or relative path to the TypeScript source file
35
+ * @returns Program context with checker and source file
36
+ */
37
+ export declare function createProgramContextFromProgram(program: ts.Program, filePath: string): ProgramContext;
38
+ /**
39
+ * Creates a TypeScript program for analyzing a source file.
40
+ *
41
+ * Looks for tsconfig.json in the file's directory or parent directories.
42
+ * Falls back to default compiler options if no config is found.
43
+ *
44
+ * @param filePath - Absolute path to the TypeScript source file
45
+ * @returns Program context with checker and source file
46
+ */
47
+ export declare function createProgramContext(filePath: string): ProgramContext;
48
+ /**
49
+ * Finds a class declaration by name in a source file.
50
+ *
51
+ * @param sourceFile - The source file to search
52
+ * @param className - Name of the class to find
53
+ * @returns The class declaration node, or null if not found
54
+ */
55
+ export declare function findClassByName(sourceFile: ts.SourceFile, className: string): ts.ClassDeclaration | null;
56
+ /**
57
+ * Finds an interface declaration by name in a source file.
58
+ *
59
+ * @param sourceFile - The source file to search
60
+ * @param interfaceName - Name of the interface to find
61
+ * @returns The interface declaration node, or null if not found
62
+ */
63
+ export declare function findInterfaceByName(sourceFile: ts.SourceFile, interfaceName: string): ts.InterfaceDeclaration | null;
64
+ /**
65
+ * Finds a type alias declaration by name in a source file.
66
+ *
67
+ * @param sourceFile - The source file to search
68
+ * @param aliasName - Name of the type alias to find
69
+ * @returns The type alias declaration node, or null if not found
70
+ */
71
+ export declare function findTypeAliasByName(sourceFile: ts.SourceFile, aliasName: string): ts.TypeAliasDeclaration | null;
72
+ /**
73
+ * Analyzes a named type (class, interface, or type alias) from a TypeScript
74
+ * source file and returns an `IRClassAnalysis`.
75
+ *
76
+ * Tries each declaration kind in order: class → interface → type alias.
77
+ * Throws if the name is not found or if the type alias analysis fails.
78
+ *
79
+ * @param filePath - Absolute or relative path to the TypeScript source file (resolved internally)
80
+ * @param typeName - Name of the class, interface, or type alias to analyze
81
+ * @param extensionRegistry - Optional extension registry for custom type handling
82
+ * @returns IR analysis result
83
+ */
84
+ export declare function analyzeNamedTypeToIR(filePath: string, typeName: string, extensionRegistry?: ExtensionRegistry, metadataPolicy?: MetadataPolicyInput, discriminatorOptions?: DiscriminatorResolutionOptions): IRClassAnalysis;
85
+ /**
86
+ * Analyzes a named type from an existing program context and returns either an
87
+ * `IRClassAnalysis` or structured diagnostics instead of throwing.
88
+ */
89
+ export declare function analyzeNamedTypeToIRFromProgramContextDetailed(ctx: ProgramContext, filePath: string, typeName: string, extensionRegistry?: ExtensionRegistry, metadataPolicy?: MetadataPolicyInput, discriminatorOptions?: DiscriminatorResolutionOptions): AnalyzeNamedTypeToIRDetailedResult;
90
+ /**
91
+ * Analyzes a named type from an existing program context and returns an `IRClassAnalysis`.
92
+ */
93
+ export declare function analyzeNamedTypeToIRFromProgramContext(ctx: ProgramContext, filePath: string, typeName: string, extensionRegistry?: ExtensionRegistry, metadataPolicy?: MetadataPolicyInput, discriminatorOptions?: DiscriminatorResolutionOptions): IRClassAnalysis;
94
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/analyzer/program.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EASL,KAAK,8BAA8B,EACnC,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxB,qCAAqC;IACrC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;CAC3B;AAED,MAAM,MAAM,kCAAkC,GAC1C;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,GACzD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC/D,CAAC;AAEN;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,QAAQ,EAAE,MAAM,GACf,cAAc,CAahB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA6DrE;AA6BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,GAChB,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAE5B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,aAAa,EAAE,MAAM,GACpB,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAEhC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,GAChB,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAEhC;AAoID;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,eAAe,CAUjB;AAED;;;GAGG;AACH,wBAAgB,8CAA8C,CAC5D,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,kCAAkC,CA0IpC;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,eAAe,CAcjB"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * TSDoc-based structured tag parser.
3
+ *
4
+ * Bridges the TypeScript compiler AST with the official `@microsoft/tsdoc`
5
+ * parser to extract constraint and annotation tags from JSDoc comments
6
+ * on class/interface/type-alias properties.
7
+ *
8
+ * The parser recognises two categories of tags:
9
+ *
10
+ * 1. **Constraint tags** (all alphanumeric, TSDoc-compliant):
11
+ * `@minimum`, `@maximum`, `@exclusiveMinimum`, `@exclusiveMaximum`,
12
+ * `@multipleOf`, `@minLength`, `@maxLength`, `@minItems`, `@maxItems`,
13
+ * `@uniqueItems`, `@pattern`, `@enumOptions`, `@const`
14
+ * — Parsed via TSDocParser as custom block tags.
15
+ * Both camelCase and PascalCase forms are accepted (e.g., `@Minimum`).
16
+ *
17
+ * 2. **Metadata and annotation tags** (`@apiName`, `@displayName`,
18
+ * `@format`, `@placeholder`):
19
+ * These are parsed as structured custom block tags so summary extraction
20
+ * stops at recognized FormSpec tags. `@displayName`, `@format`, and
21
+ * `@placeholder` also map onto annotation IR nodes, while `@apiName`
22
+ * remains metadata-only and is resolved separately by the class analyzer.
23
+ *
24
+ * The `@deprecated` tag is a standard TSDoc block tag, parsed structurally.
25
+ *
26
+ * Description and remarks extraction (spec 002 §2.3):
27
+ * - Summary text (bare text before the first block tag) → `description` annotation
28
+ * - `@remarks` block → `remarks` annotation (separate channel)
29
+ * - `@description` is NOT supported (not a standard TSDoc tag)
30
+ *
31
+ * **Fallback strategy**: TSDoc treats `{` / `}` as inline tag delimiters and
32
+ * `@` as a tag prefix, so content containing these characters (e.g. JSON
33
+ * objects in `@EnumOptions`, regex patterns with `@` in `@Pattern`) gets
34
+ * mangled by the TSDoc parser. The shared comment syntax parser is the
35
+ * primary source for these payloads; the TS compiler's `ts.getJSDocTags()`
36
+ * API remains as a fallback when a raw payload cannot be recovered from the
37
+ * shared parse.
38
+ */
39
+ import * as ts from "typescript";
40
+ import { type ConstraintSemanticDiagnostic } from "@formspec/analysis/internal";
41
+ import { type ConstraintNode, type AnnotationNode, type PathTarget, type TypeNode } from "@formspec/core/internals";
42
+ import type { ExtensionRegistry } from "../extensions/index.js";
43
+ /**
44
+ * Result of parsing a single JSDoc comment attached to a TS AST node.
45
+ */
46
+ export interface TSDocParseResult {
47
+ /** Constraint IR nodes extracted from custom block tags. */
48
+ readonly constraints: readonly ConstraintNode[];
49
+ /** Annotation IR nodes extracted from canonical TSDoc block tags. */
50
+ readonly annotations: readonly AnnotationNode[];
51
+ /** Compiler-backed extraction diagnostics for invalid tag applications. */
52
+ readonly diagnostics: readonly ConstraintSemanticDiagnostic[];
53
+ }
54
+ /**
55
+ * Optional extension-aware parsing inputs for TSDoc extraction.
56
+ */
57
+ export interface ParseTSDocOptions {
58
+ /**
59
+ * Extension registry used to resolve custom tags and custom-type-specific
60
+ * broadening of built-in constraint tags.
61
+ */
62
+ readonly extensionRegistry?: ExtensionRegistry;
63
+ /**
64
+ * Effective field/type node for the declaration being parsed. Required when
65
+ * built-in tags may broaden onto a custom type.
66
+ */
67
+ readonly fieldType?: TypeNode;
68
+ /** Type checker used for compiler-backed placement and type validation. */
69
+ readonly checker?: ts.TypeChecker;
70
+ /** The declaration type that the parsed tag applies to. */
71
+ readonly subjectType?: ts.Type;
72
+ /** Optional enclosing host type for future cross-field signature checks. */
73
+ readonly hostType?: ts.Type;
74
+ }
75
+ /**
76
+ * Display-name metadata extracted from a node's JSDoc tags.
77
+ *
78
+ * The root display name is returned separately from member-target labels so
79
+ * callers can apply the former to the enclosing type/form and the latter to
80
+ * enum members.
81
+ */
82
+ export interface DisplayNameMetadata {
83
+ readonly displayName?: string;
84
+ readonly memberDisplayNames: ReadonlyMap<string, string>;
85
+ }
86
+ /**
87
+ * Parses the JSDoc comment attached to a TypeScript AST node using the
88
+ * official TSDoc parser and returns canonical IR constraint and annotation
89
+ * nodes.
90
+ *
91
+ * For constraint tags (`@minimum`, `@pattern`, `@enumOptions`, etc.),
92
+ * the structured TSDoc parser is used. Canonical annotation tags
93
+ * (`@displayName`) are also parsed structurally. Summary text and `@remarks`
94
+ * are extracted as separate annotation nodes.
95
+ *
96
+ * @param node - The TS AST node to inspect (PropertyDeclaration, PropertySignature, etc.)
97
+ * @param file - Absolute source file path for provenance
98
+ * @returns Parsed constraint and annotation nodes
99
+ */
100
+ export declare function parseTSDocTags(node: ts.Node, file?: string, options?: ParseTSDocOptions): TSDocParseResult;
101
+ /**
102
+ * Checks if a TS AST node has a `@deprecated` tag using the TSDoc parser.
103
+ *
104
+ * Falls back to the TS compiler API for nodes without doc comments.
105
+ */
106
+ export declare function hasDeprecatedTagTSDoc(node: ts.Node): boolean;
107
+ /**
108
+ * Extracts root and member-target display-name metadata from a node's JSDoc tags.
109
+ *
110
+ * Member-target display-name tags use the syntax `@displayName :member Label`.
111
+ * The first non-target `@displayName` is returned as the root display name.
112
+ */
113
+ export declare function extractDisplayNameMetadata(node: ts.Node): DisplayNameMetadata;
114
+ /**
115
+ * Extracts a path-target prefix (`:fieldName`) from constraint tag text.
116
+ * Returns the parsed PathTarget and remaining text, or null if no path target.
117
+ *
118
+ * @example
119
+ * extractPathTarget(":value 0") // → { path: { segments: ["value"] }, remainingText: "0" }
120
+ * extractPathTarget("42") // → null
121
+ */
122
+ export declare function extractPathTarget(text: string): {
123
+ path: PathTarget;
124
+ remainingText: string;
125
+ } | null;
126
+ //# sourceMappingURL=tsdoc-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAcL,KAAK,4BAA4B,EAGlC,MAAM,6BAA6B,CAAC;AAkBrC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA4nBhE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1D;AA4DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,IAAI,SAAK,EACT,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAsSlB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAsB5D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,mBAAmB,CAmC7E;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpD"}