@workos/oagen 0.30.2 → 0.31.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/README.md +4 -12
- package/dist/cli/index.d.mts +1 -1
- package/dist/cli/index.mjs +2885 -651
- package/dist/cli/index.mjs.map +1 -1
- package/dist/compat/index.d.mts +85 -36
- package/dist/compat/index.d.mts.map +1 -1
- package/dist/compat/index.mjs +33 -23
- package/dist/compat/index.mjs.map +1 -1
- package/dist/{diff-BO5FieX5.mjs → diff-CAsypxXV.mjs} +107 -89
- package/dist/{diff-BO5FieX5.mjs.map → diff-CAsypxXV.mjs.map} +1 -1
- package/dist/differ-B0DSuKUZ.d.mts +72 -0
- package/dist/differ-B0DSuKUZ.d.mts.map +1 -0
- package/dist/index.d.mts +129 -61
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2877 -546
- package/dist/index.mjs.map +1 -1
- package/dist/{overlay-DWAHPofk.mjs → overlay-Dj3WWlNP.mjs} +44 -38
- package/dist/overlay-Dj3WWlNP.mjs.map +1 -0
- package/dist/scripts/smoke/baseline.d.mts +1 -1
- package/dist/scripts/smoke/baseline.mjs +2740 -527
- package/dist/scripts/smoke/baseline.mjs.map +1 -1
- package/dist/scripts/smoke/sdk-test.d.mts +1 -1
- package/dist/scripts/smoke/sdk-test.mjs +4 -2
- package/dist/scripts/smoke/sdk-test.mjs.map +1 -1
- package/dist/smoke.d.mts +251 -36
- package/dist/smoke.d.mts.map +1 -1
- package/dist/smoke.mjs +2740 -527
- package/dist/smoke.mjs.map +1 -1
- package/dist/{tree-sitter-CDKm3n64.mjs → tree-sitter-C7Hk-NDu.mjs} +35 -7
- package/dist/tree-sitter-C7Hk-NDu.mjs.map +1 -0
- package/dist/{types-BcbGLNkh.d.mts → types-I7W7CNl1.d.mts} +219 -9
- package/dist/types-I7W7CNl1.d.mts.map +1 -0
- package/dist/verify/index.d.mts +7 -8
- package/dist/verify/index.d.mts.map +1 -1
- package/dist/verify/index.mjs +24 -14
- package/dist/verify/index.mjs.map +1 -1
- package/docs/architecture/emitter-contract.md +1 -0
- package/docs/architecture/ir-types.md +170 -17
- package/docs/cli.md +13 -13
- package/package.json +3 -3
- package/skills/check-emitter-parity/SKILL.md +15 -1
- package/dist/differ-nZSxhCfC.d.mts +0 -123
- package/dist/differ-nZSxhCfC.d.mts.map +0 -1
- package/dist/overlay-DWAHPofk.mjs.map +0 -1
- package/dist/tree-sitter-CDKm3n64.mjs.map +0 -1
- package/dist/types-BcbGLNkh.d.mts.map +0 -1
package/docs/cli.md
CHANGED
|
@@ -301,16 +301,16 @@ export default config;
|
|
|
301
301
|
|
|
302
302
|
### Options
|
|
303
303
|
|
|
304
|
-
| Key | Type
|
|
305
|
-
| ---------------------- |
|
|
306
|
-
| `emitters` | `Emitter[]`
|
|
307
|
-
| `extractors` | `Extractor[]`
|
|
308
|
-
| `emitterProject` | `string`
|
|
309
|
-
| `smokeRunners` | `Record<string, string>`
|
|
310
|
-
| `operationIdTransform` | `(id: string) => string`
|
|
311
|
-
| `schemaNameTransform` | `(name: string) => string`
|
|
312
|
-
| `transformSpec` | `(spec: OpenApiDocument) => OpenApiDocument`
|
|
313
|
-
| `docUrl` | `string`
|
|
314
|
-
| `operationHints` | `Record<string, OperationHint>`
|
|
315
|
-
| `mountRules` | `Record<string, string>`
|
|
316
|
-
| `modelHints` | `Record<string, string>`
|
|
304
|
+
| Key | Type | Description |
|
|
305
|
+
| ---------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
306
|
+
| `emitters` | `Emitter[]` | Language emitters to register. Each emitter implements the `Emitter` interface and generates SDK files for one target language. |
|
|
307
|
+
| `extractors` | `Extractor[]` | API surface extractors to register. Each extractor parses a live SDK and produces an `ApiSurface` JSON used for compat verification. |
|
|
308
|
+
| `emitterProject` | `string` | Path to the emitter project directory. Used by skills to scaffold new emitters, tests, and smoke runners in the correct location. |
|
|
309
|
+
| `smokeRunners` | `Record<string, string>` | Map from language key to custom smoke runner script path. Overrides the built-in `sdk-test.ts` for `oagen verify`. Can also be set per-invocation with `--smoke-runner`. |
|
|
310
|
+
| `operationIdTransform` | `(id: string) => string` | Custom transform for operation IDs. Receives the raw `operationId` from the spec; return the desired operation name. No additional casing conversion is applied. When omitted, `operationId` values are converted to `camelCase`. |
|
|
311
|
+
| `schemaNameTransform` | `(name: string, originalName?: string) => string` | Custom transform for schema (model/enum) names. Applied after the built-in `cleanSchemaName` normalization. Receives the cleaned PascalCase name (`name`) and, for component schemas, the original name exactly as spelled in the document (`originalName`); return the desired name. Return `originalName` to opt a schema out of normalization, but only when its spelling is already a valid identifier: a bare `originalName ?? name` would also keep keys like `user-profile` or `Foo.Bar` that `cleanSchemaName` would otherwise have fixed. For example `(name, originalName) => (originalName && /^[A-Za-z_$][\w$]*$/.test(originalName) ? originalName : name)` keeps `HTTPConfig`, `URL`, and `Settings` instead of `HttpConfig`, `Url`, and `Setting`. `originalName` is `undefined` for any name oagen synthesises (inline enums, request-body variant models, title-derived names), so fall back to `name` for those. Collisions are detected automatically: if a transform would produce a duplicate name, the cleaned name is kept. |
|
|
312
|
+
| `transformSpec` | `(spec: OpenApiDocument) => OpenApiDocument` | Pre-IR overlay applied to the bundled OpenAPI document before any IR extraction. Use to patch around upstream spec quirks that would otherwise emit a breaking SDK change. See [`transformSpec` — Pre-IR Spec Overlay](advanced/transform-spec.md). |
|
|
313
|
+
| `docUrl` | `string` | Base URL for documentation links. When set, relative markdown paths in descriptions (e.g. `[User](/reference/users/user)`) are expanded to full URLs (e.g. `[User](https://docs.example.com/reference/users/user)`). |
|
|
314
|
+
| `operationHints` | `Record<string, OperationHint>` | Per-operation overrides keyed by `"METHOD /path"`. Override derived method names, remount to a different service, or split union-body operations into typed wrappers. See [Operation Resolution](architecture/ir-types.md#operation-resolution). |
|
|
315
|
+
| `mountRules` | `Record<string, string>` | Service-level remounting. Maps IR service name to target service/namespace (PascalCase). Keys may be exact names or trailing-`*` prefix patterns (e.g. `"UserManagement*"`); an exact key wins over any wildcard, and among wildcards the longest prefix wins. All operations in the source service are mounted on the target unless overridden per-operation in `operationHints`. |
|
|
316
|
+
| `modelHints` | `Record<string, string>` | Pin specific models to a specific IR service for placement. Maps IR model name (post-`cleanSchemaName`/`schemaNameTransform`) → IR service name (PascalCase). Overrides the default "first service to reference the model wins" assignment. Both names must exist in the parsed spec; unknown names throw at generation time. |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workos/oagen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0",
|
|
4
4
|
"description": "Framework for building OpenAPI SDK emitters",
|
|
5
5
|
"author": "WorkOS",
|
|
6
6
|
"license": "MIT",
|
|
@@ -96,10 +96,10 @@
|
|
|
96
96
|
"@types/node": "^25.3.3",
|
|
97
97
|
"@vitest/coverage-v8": "^4.1.2",
|
|
98
98
|
"husky": "^9.1.7",
|
|
99
|
-
"oxfmt": "^0.
|
|
99
|
+
"oxfmt": "^0.72.0",
|
|
100
100
|
"oxlint": "^1.51.0",
|
|
101
101
|
"prettier": "^3.8.1",
|
|
102
|
-
"tsdown": "^0.
|
|
102
|
+
"tsdown": "^0.23.0",
|
|
103
103
|
"vitest": "^4.1.2"
|
|
104
104
|
}
|
|
105
105
|
}
|
|
@@ -80,6 +80,7 @@ A missing kind means an entire category of types won't generate correctly.
|
|
|
80
80
|
#### ErrorResponse
|
|
81
81
|
|
|
82
82
|
- `type` — Structured error type for typed exception/error classes
|
|
83
|
+
- `headers` — Declared response headers (e.g. `Retry-After` on a 429) for typed error accessors
|
|
83
84
|
|
|
84
85
|
### Priority: MEDIUM (documentation — affects developer experience)
|
|
85
86
|
|
|
@@ -98,6 +99,7 @@ A missing kind means an entire category of types won't generate correctly.
|
|
|
98
99
|
- `deprecated` — Deprecation marker on methods
|
|
99
100
|
- `async` — Async operation marker
|
|
100
101
|
- `successResponses` — Multiple 2xx response types
|
|
102
|
+
- `responseHeaders` — Headers declared on the primary response (`Content-Disposition`, `Location`, `ETag`, rate limits)
|
|
101
103
|
- `errors` — Error responses for exception/error documentation
|
|
102
104
|
- `cookieParams` — Cookie parameter handling
|
|
103
105
|
|
|
@@ -107,11 +109,14 @@ A missing kind means an entire category of types won't generate correctly.
|
|
|
107
109
|
- `deprecated` — Deprecated marker on params
|
|
108
110
|
- `default` — Default value annotation
|
|
109
111
|
- `example` — Example value annotation
|
|
112
|
+
- `constraints` — Validation limits (min/max, length, pattern, item counts) for doc comments or argument checks
|
|
113
|
+
- `examples` — Every example value (the list `example` is drawn from)
|
|
110
114
|
|
|
111
115
|
#### Model
|
|
112
116
|
|
|
113
117
|
- `description` — Model-level doc comment
|
|
114
118
|
- `typeParams` — Generic type parameters
|
|
119
|
+
- `constraints` — Object-level limits (`minProperties`, `maxProperties`, `dependentRequired`)
|
|
115
120
|
|
|
116
121
|
#### Field
|
|
117
122
|
|
|
@@ -120,6 +125,9 @@ A missing kind means an entire category of types won't generate correctly.
|
|
|
120
125
|
- `writeOnly` — Write-only annotation
|
|
121
126
|
- `deprecated` — Deprecation marker on fields
|
|
122
127
|
- `default` — Default value annotation
|
|
128
|
+
- `example` — Example value annotation
|
|
129
|
+
- `examples` — Every example value (the list `example` is drawn from)
|
|
130
|
+
- `constraints` — Validation limits (min/max, length, pattern, item counts) for doc comments or value checks
|
|
123
131
|
|
|
124
132
|
#### EnumValue
|
|
125
133
|
|
|
@@ -142,7 +150,7 @@ For each IR field from Step 2, search for references to the field name in the em
|
|
|
142
150
|
- The field is used in conditional logic or output generation
|
|
143
151
|
- The field is iterated over (e.g., `op.cookieParams`, `op.successResponses`)
|
|
144
152
|
|
|
145
|
-
Use `Grep` with patterns like `\.description`, `\.readOnly`, `\.writeOnly`, `\.deprecated`, `\.default`, `\.example`, `\.async`, `\.cookieParams`, `\.successResponses`, `\.servers`, `\.typeParams`, `\.pagination`, `\.auth`, `\.requestBodyEncoding`, `\.injectIdempotencyKey`, `\.discriminator`, `\.compositionKind`, `\.format` scoped to the emitter source directory.
|
|
153
|
+
Use `Grep` with patterns like `\.description`, `\.readOnly`, `\.writeOnly`, `\.deprecated`, `\.default`, `\.example`, `\.examples`, `\.async`, `\.cookieParams`, `\.successResponses`, `\.responseHeaders`, `\.servers`, `\.typeParams`, `\.pagination`, `\.auth`, `\.requestBodyEncoding`, `\.injectIdempotencyKey`, `\.discriminator`, `\.compositionKind`, `\.format`, `\.constraints` scoped to the emitter source directory.
|
|
146
154
|
|
|
147
155
|
### 3c: Intentional Skips
|
|
148
156
|
|
|
@@ -227,14 +235,20 @@ For each gap, provide a specific, actionable suggestion for what the emitter sho
|
|
|
227
235
|
| `ApiSpec.servers` | Server URL constants or configuration |
|
|
228
236
|
| `Operation.async` | Mark method as async or add async behavior hints (e.g., `async` in TS/Rust, coroutine in Kotlin, `async def` in Python) |
|
|
229
237
|
| `Operation.successResponses` | Document additional return types for each 2xx response |
|
|
238
|
+
| `Operation.responseHeaders` | Typed accessors for declared response headers (download filename, `Location`, `ETag`, rate limits) |
|
|
230
239
|
| `Operation.cookieParams` | Document cookie parameters |
|
|
231
240
|
| `Parameter.description` | Document query/header/cookie params in method doc comments |
|
|
232
241
|
| `Parameter.deprecated` | Mark parameter as deprecated in docs |
|
|
233
242
|
| `Parameter.default` | Document default value |
|
|
234
243
|
| `Parameter.example` | Document example value |
|
|
244
|
+
| `Parameter.examples` | Document every example value (e.g. one `@example` tag each) |
|
|
235
245
|
| `Field.readOnly` | Read-only annotation and language-appropriate modifier (`readonly` in TS, `attr_reader` in Ruby, `val` in Kotlin, `pub` without setter in Rust) |
|
|
236
246
|
| `Field.writeOnly` | Write-only annotation in doc comments |
|
|
237
247
|
| `Field.default` | Document default value |
|
|
248
|
+
| `Field.example` | Document example value |
|
|
249
|
+
| `Field.examples` | Document every example value (e.g. one `@example` tag each) |
|
|
250
|
+
| `Field.constraints` | Document limits ("at most 100 characters") or validate before serializing |
|
|
251
|
+
| `Parameter.constraints` | Document limits on method arguments or validate before sending |
|
|
238
252
|
|
|
239
253
|
Include the specific file and approximate location where each fix should be applied.
|
|
240
254
|
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { At as CompatSnapshot, Lt as LanguageId, Nt as CompatSymbol, St as LanguageHints, Vt as CompatPolicyHints, bt as DiffResult, nt as CompatChangeCategory, ot as CompatProvenance, rt as CompatChangeSeverity, t as ApiSpec, vt as ApiSurface } from "./types-BcbGLNkh.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/compat/classify.d.ts
|
|
4
|
-
/** A single classified compatibility change. */
|
|
5
|
-
interface ClassifiedChange {
|
|
6
|
-
/** Specific change category. */
|
|
7
|
-
category: CompatChangeCategory;
|
|
8
|
-
/** Policy-aware severity (may differ from defaultSeverityForCategory). */
|
|
9
|
-
severity: CompatChangeSeverity;
|
|
10
|
-
/** Fully-qualified symbol path. */
|
|
11
|
-
symbol: string;
|
|
12
|
-
/** Deterministic ID for grouping related changes across languages. */
|
|
13
|
-
conceptualChangeId: string;
|
|
14
|
-
/** Where the drift originated. */
|
|
15
|
-
provenance: CompatProvenance;
|
|
16
|
-
/** Description of the old state. */
|
|
17
|
-
old: Record<string, string>;
|
|
18
|
-
/** Description of the new state. */
|
|
19
|
-
new: Record<string, string>;
|
|
20
|
-
/** Human-readable explanation. */
|
|
21
|
-
message: string;
|
|
22
|
-
/**
|
|
23
|
-
* Optional spec-level remediation hint. Set by post-classification rules
|
|
24
|
-
* (see `detectForkedSchemas` in differ.ts) when a change has a recognized
|
|
25
|
-
* upstream root cause that the spec author can fix. Surfaces in both the
|
|
26
|
-
* machine-readable report and the human-readable summary.
|
|
27
|
-
*/
|
|
28
|
-
remediation?: string;
|
|
29
|
-
}
|
|
30
|
-
/** Result of classifying all changes between two snapshots. */
|
|
31
|
-
interface ClassificationResult {
|
|
32
|
-
changes: ClassifiedChange[];
|
|
33
|
-
summary: {
|
|
34
|
-
breaking: number;
|
|
35
|
-
softRisk: number;
|
|
36
|
-
additive: number;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Classify changes between a baseline and candidate symbol.
|
|
41
|
-
* Returns one or more classified changes for the diff.
|
|
42
|
-
*/
|
|
43
|
-
declare function classifySymbolChanges(baseline: CompatSymbol, candidate: CompatSymbol | undefined, policy: CompatPolicyHints, language?: LanguageId): ClassifiedChange[];
|
|
44
|
-
/**
|
|
45
|
-
* Classify a new symbol as additive.
|
|
46
|
-
*/
|
|
47
|
-
declare function classifyAddedSymbol(symbol: CompatSymbol): ClassifiedChange;
|
|
48
|
-
/** Summarize a list of classified changes by severity. */
|
|
49
|
-
declare function summarizeChanges(changes: ClassifiedChange[]): ClassificationResult['summary'];
|
|
50
|
-
//#endregion
|
|
51
|
-
//#region src/compat/spec-filter.d.ts
|
|
52
|
-
/**
|
|
53
|
-
* Compute the set of symbol names that are derivable from the OpenAPI spec.
|
|
54
|
-
* Only these names should be compared during compat verification — everything
|
|
55
|
-
* else in the baseline is hand-written and out of scope for generation.
|
|
56
|
-
*/
|
|
57
|
-
declare function specDerivedNames(spec: ApiSpec, hints: LanguageHints): Set<string>;
|
|
58
|
-
/**
|
|
59
|
-
* Compute a map of enum name → set of wire values that appear in the spec.
|
|
60
|
-
* Used by filterSurface to exclude hand-added enum members that aren't in the spec.
|
|
61
|
-
*/
|
|
62
|
-
declare function specDerivedEnumValues(spec: ApiSpec): Map<string, Set<string | number>>;
|
|
63
|
-
/**
|
|
64
|
-
* Compute the set of field paths (e.g., "Organization.name") that are defined
|
|
65
|
-
* in the OpenAPI spec's model schemas. Used by filterSurface to exclude
|
|
66
|
-
* hand-added SDK fields that reference spec-derived types.
|
|
67
|
-
*/
|
|
68
|
-
declare function specDerivedFieldPaths(spec: ApiSpec, hints: LanguageHints): Set<string>;
|
|
69
|
-
/**
|
|
70
|
-
* Compute the set of method paths (e.g., "Auth.authorize") that are defined
|
|
71
|
-
* as operations in the OpenAPI spec's services. Used by filterSurface to
|
|
72
|
-
* exclude hand-written SDK methods that don't correspond to spec operations.
|
|
73
|
-
*/
|
|
74
|
-
declare function specDerivedMethodPaths(spec: ApiSpec): Set<string>;
|
|
75
|
-
/**
|
|
76
|
-
* Compute the set of HTTP operation keys (e.g., "GET /auth/authorize") that
|
|
77
|
-
* exist in the spec. Used for overlay-based method matching.
|
|
78
|
-
*/
|
|
79
|
-
declare function specDerivedHttpKeys(spec: ApiSpec): Set<string>;
|
|
80
|
-
/**
|
|
81
|
-
* Filter an ApiSurface to only include symbols whose names appear in the
|
|
82
|
-
* allowed set. Symbols not in the set are dropped entirely — they won't
|
|
83
|
-
* count toward the total or produce violations.
|
|
84
|
-
*
|
|
85
|
-
* For interfaces: when fieldPaths is provided, only keeps fields that appear
|
|
86
|
-
* in the spec-derived field paths. This prevents false positives from hand-added
|
|
87
|
-
* SDK fields that reference spec-derived types but aren't defined in the spec.
|
|
88
|
-
*
|
|
89
|
-
* For classes: when methodPaths is provided, only keeps methods whose names
|
|
90
|
-
* appear in the spec-derived method paths. This prevents false positives from
|
|
91
|
-
* hand-written SDK methods (e.g., Auth.authorization_url, Webhooks.construct_event)
|
|
92
|
-
* that don't correspond to spec operations. Properties on service classes are
|
|
93
|
-
* also filtered: only UPPER_CASE constants that are spec-derivable are kept.
|
|
94
|
-
*/
|
|
95
|
-
declare function filterSurface(surface: ApiSurface, allowedNames: Set<string>, opts?: {
|
|
96
|
-
fieldPaths?: Set<string>;
|
|
97
|
-
methodPaths?: Set<string>;
|
|
98
|
-
enumValues?: Map<string, Set<string | number>>;
|
|
99
|
-
}): ApiSurface;
|
|
100
|
-
//#endregion
|
|
101
|
-
//#region src/compat/differ.d.ts
|
|
102
|
-
/** Result of diffing two compat snapshots. */
|
|
103
|
-
interface CompatDiffResult {
|
|
104
|
-
changes: ClassifiedChange[];
|
|
105
|
-
summary: ClassificationResult['summary'];
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Diff two compat snapshots, producing classified changes with
|
|
109
|
-
* policy-aware severity.
|
|
110
|
-
*/
|
|
111
|
-
declare function diffSnapshots(baseline: CompatSnapshot, candidate: CompatSnapshot, policy?: CompatPolicyHints): CompatDiffResult;
|
|
112
|
-
/**
|
|
113
|
-
* Compare two ApiSurface objects and return a DiffResult.
|
|
114
|
-
*
|
|
115
|
-
* This preserves the existing diffing behavior used by the overlay retry loop,
|
|
116
|
-
* compat check, and all existing tests. The internal implementation uses the
|
|
117
|
-
* same algorithms as before to maintain full backward compatibility with
|
|
118
|
-
* overlay patching and verification workflows.
|
|
119
|
-
*/
|
|
120
|
-
declare function diffSurfaces(baseline: ApiSurface, candidate: ApiSurface, hints: LanguageHints): DiffResult;
|
|
121
|
-
//#endregion
|
|
122
|
-
export { specDerivedEnumValues as a, specDerivedMethodPaths as c, ClassifiedChange as d, classifyAddedSymbol as f, filterSurface as i, specDerivedNames as l, summarizeChanges as m, diffSnapshots as n, specDerivedFieldPaths as o, classifySymbolChanges as p, diffSurfaces as r, specDerivedHttpKeys as s, CompatDiffResult as t, ClassificationResult as u };
|
|
123
|
-
//# sourceMappingURL=differ-nZSxhCfC.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"differ-nZSxhCfC.d.mts","names":[],"sources":["../src/compat/classify.ts","../src/compat/spec-filter.ts","../src/compat/differ.ts"],"mappings":";;;;UAaiB,gBAAA;EAcJ;EAZX,QAAA,EAAU,oBAAA;EAAV;EAEA,QAAA,EAAU,oBAAA;EAAV;EAEA,MAAA;EAAA;EAEA,kBAAA;EAEA;EAAA,UAAA,EAAY,gBAAA;EAEZ;EAAA,GAAA,EAAK,MAAA;EAEL;EAAA,GAAA,EAAK,MAAA;EAEL;EAAA,OAAA;EAOW;;AAIb;;;;EAJE,WAAA;AAAA;;UAIe,oBAAA;EACf,OAAA,EAAS,gBAAA;EACT,OAAA;IACE,QAAA;IACA,QAAA;IACA,QAAA;EAAA;AAAA;;;;;iBAmMY,qBAAA,CACd,QAAA,EAAU,YAAA,EACV,SAAA,EAAW,YAAA,cACX,MAAA,EAAQ,iBAAA,EACR,QAAA,GAAW,UAAA,GACV,gBAAA;;;;iBAgYa,mBAAA,CAAoB,MAAA,EAAQ,YAAA,GAAe,gBAAA;;iBAc3C,gBAAA,CAAiB,OAAA,EAAS,gBAAA,KAAqB,oBAAA;;;;AAtnB/D;;;;iBCJgB,gBAAA,CAAiB,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,aAAA,GAAgB,GAAA;;;;;iBAgDvD,qBAAA,CAAsB,IAAA,EAAM,OAAA,GAAU,GAAA,SAAY,GAAA;;;;;;iBAalD,qBAAA,CAAsB,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,aAAA,GAAgB,GAAA;;;;;;iBAqB5D,sBAAA,CAAuB,IAAA,EAAM,OAAA,GAAU,GAAA;;;;;iBAcvC,mBAAA,CAAoB,IAAA,EAAM,OAAA,GAAU,GAAA;;;;;;;;;;;;ADuIpD;;;;iBCnFgB,aAAA,CACd,OAAA,EAAS,UAAA,EACT,YAAA,EAAc,GAAA,UACd,IAAA;EACE,UAAA,GAAa,GAAA;EACb,WAAA,GAAc,GAAA;EACd,UAAA,GAAa,GAAA,SAAY,GAAA;AAAA,IAE1B,UAAA;;;;UCtIc,gBAAA;EACf,OAAA,EAAS,gBAAA;EACT,OAAA,EAAS,oBAAA;AAAA;;;;;iBAOK,aAAA,CACd,QAAA,EAAU,cAAA,EACV,SAAA,EAAW,cAAA,EACX,MAAA,GAAS,iBAAA,GACR,gBAAA;;;;;;AFJH;;;iBEsqBgB,YAAA,CAAa,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,KAAA,EAAO,aAAA,GAAgB,UAAA"}
|