@ts-runtypes/devtools 0.9.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 +104 -0
- package/README.md +76 -0
- package/dist/apply-edits.d.ts +8 -0
- package/dist/apply-edits.d.ts.map +1 -0
- package/dist/apply-edits.js +24 -0
- package/dist/apply-edits.js.map +1 -0
- package/dist/diagnosticCatalog.d.ts +7 -0
- package/dist/diagnosticCatalog.d.ts.map +1 -0
- package/dist/diagnosticCatalog.generated.d.ts +6 -0
- package/dist/diagnosticCatalog.generated.d.ts.map +1 -0
- package/dist/diagnosticCatalog.generated.js +552 -0
- package/dist/diagnosticCatalog.generated.js.map +1 -0
- package/dist/diagnosticCatalog.js +34 -0
- package/dist/diagnosticCatalog.js.map +1 -0
- package/dist/edit-buffer.d.ts +26 -0
- package/dist/edit-buffer.d.ts.map +1 -0
- package/dist/edit-buffer.js +209 -0
- package/dist/edit-buffer.js.map +1 -0
- package/dist/esbuild.d.ts +4 -0
- package/dist/esbuild.d.ts.map +1 -0
- package/dist/esbuild.js +4 -0
- package/dist/esbuild.js.map +1 -0
- package/dist/eslint/diagnosticRouting.d.ts +21 -0
- package/dist/eslint/diagnosticRouting.d.ts.map +1 -0
- package/dist/eslint/diagnosticRouting.js +68 -0
- package/dist/eslint/diagnosticRouting.js.map +1 -0
- package/dist/eslint/index.d.ts +47 -0
- package/dist/eslint/index.d.ts.map +1 -0
- package/dist/eslint/index.js +83 -0
- package/dist/eslint/index.js.map +1 -0
- package/dist/eslint/lint-worker.d.ts +2 -0
- package/dist/eslint/lint-worker.d.ts.map +1 -0
- package/dist/eslint/lint-worker.js +97 -0
- package/dist/eslint/lint-worker.js.map +1 -0
- package/dist/eslint/prefilter.d.ts +4 -0
- package/dist/eslint/prefilter.d.ts.map +1 -0
- package/dist/eslint/prefilter.js +13 -0
- package/dist/eslint/prefilter.js.map +1 -0
- package/dist/eslint/session-protocol.d.ts +26 -0
- package/dist/eslint/session-protocol.d.ts.map +1 -0
- package/dist/eslint/session-protocol.js +2 -0
- package/dist/eslint/session-protocol.js.map +1 -0
- package/dist/eslint/session.d.ts +26 -0
- package/dist/eslint/session.d.ts.map +1 -0
- package/dist/eslint/session.js +142 -0
- package/dist/eslint/session.js.map +1 -0
- package/dist/eslint/spawn-shim.d.ts +2 -0
- package/dist/eslint/spawn-shim.d.ts.map +1 -0
- package/dist/eslint/spawn-shim.js +23 -0
- package/dist/eslint/spawn-shim.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/packages/ts-runtypes-devtools/tsconfig.test.tsbuildinfo +1 -0
- package/dist/protocol.d.ts +236 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +53 -0
- package/dist/protocol.js.map +1 -0
- package/dist/resolver-client.d.ts +128 -0
- package/dist/resolver-client.d.ts.map +1 -0
- package/dist/resolver-client.js +245 -0
- package/dist/resolver-client.js.map +1 -0
- package/dist/rolldown.d.ts +4 -0
- package/dist/rolldown.d.ts.map +1 -0
- package/dist/rolldown.js +4 -0
- package/dist/rolldown.js.map +1 -0
- package/dist/rollup.d.ts +4 -0
- package/dist/rollup.d.ts.map +1 -0
- package/dist/rollup.js +4 -0
- package/dist/rollup.js.map +1 -0
- package/dist/rspack.d.ts +4 -0
- package/dist/rspack.d.ts.map +1 -0
- package/dist/rspack.js +4 -0
- package/dist/rspack.js.map +1 -0
- package/dist/runtypes-constants.generated.d.ts +184 -0
- package/dist/runtypes-constants.generated.d.ts.map +1 -0
- package/dist/runtypes-constants.generated.js +136 -0
- package/dist/runtypes-constants.generated.js.map +1 -0
- package/dist/scan-batcher.d.ts +6 -0
- package/dist/scan-batcher.d.ts.map +1 -0
- package/dist/scan-batcher.js +36 -0
- package/dist/scan-batcher.js.map +1 -0
- package/dist/unplugin.d.ts +25 -0
- package/dist/unplugin.d.ts.map +1 -0
- package/dist/unplugin.js +215 -0
- package/dist/unplugin.js.map +1 -0
- package/dist/vite.d.ts +4 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +4 -0
- package/dist/vite.js.map +1 -0
- package/dist/webpack.d.ts +4 -0
- package/dist/webpack.d.ts.map +1 -0
- package/dist/webpack.js +4 -0
- package/dist/webpack.js.map +1 -0
- package/package.json +91 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
RunTypes Small Organization License 1.0.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ma Jerez. All rights reserved except as expressly granted below.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
This license lets individuals and smaller organizations use the software for
|
|
8
|
+
free, subject to the rules below. Larger organizations must obtain a paid
|
|
9
|
+
commercial license. This is a proprietary, source-available style license; it is
|
|
10
|
+
NOT an open source license.
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
To exercise any rights under this license you must agree to its rules. Those
|
|
15
|
+
rules are both obligations under your agreement with the licensor and conditions
|
|
16
|
+
of your license. Do not do anything with the software that this license does not
|
|
17
|
+
expressly permit.
|
|
18
|
+
|
|
19
|
+
## Free License
|
|
20
|
+
|
|
21
|
+
The licensor grants you a non-exclusive, non-transferable, royalty-free,
|
|
22
|
+
worldwide license to install, run, and use the software, and to include it as a
|
|
23
|
+
dependency in your own applications and deploy those applications, provided that:
|
|
24
|
+
|
|
25
|
+
- you qualify as a Small Organization (see below), and
|
|
26
|
+
- you comply with the Limitations below.
|
|
27
|
+
|
|
28
|
+
## Small Organization
|
|
29
|
+
|
|
30
|
+
You qualify for the Free License only if you are:
|
|
31
|
+
|
|
32
|
+
- an individual using the software; or
|
|
33
|
+
- an organization whose total gross revenue, aggregated across the organization
|
|
34
|
+
and all of its affiliates, was less than 10,000,000 US dollars (USD) during its
|
|
35
|
+
most recently completed fiscal year.
|
|
36
|
+
|
|
37
|
+
"Affiliates" means all entities that control, are controlled by, or are under
|
|
38
|
+
common control with an organization.
|
|
39
|
+
|
|
40
|
+
If you do not qualify, you must obtain a Commercial License before using the
|
|
41
|
+
software.
|
|
42
|
+
|
|
43
|
+
## Limitations
|
|
44
|
+
|
|
45
|
+
The Free License does NOT permit you to:
|
|
46
|
+
|
|
47
|
+
- copy or reproduce the software, except as strictly necessary to install and run
|
|
48
|
+
it for your permitted use;
|
|
49
|
+
- modify the software or create derivative works from it;
|
|
50
|
+
- distribute, publish, sublicense, sell, rent, lease, or otherwise make the
|
|
51
|
+
software available to any third party, except as embedded in your own
|
|
52
|
+
applications for their normal operation;
|
|
53
|
+
- reverse engineer, decompile, or disassemble any part of the software provided
|
|
54
|
+
in compiled or binary form, except to the extent this restriction is prohibited
|
|
55
|
+
by applicable law;
|
|
56
|
+
- remove or alter any copyright, license, or other proprietary notices.
|
|
57
|
+
|
|
58
|
+
All rights not expressly granted here are reserved by the licensor.
|
|
59
|
+
|
|
60
|
+
## Commercial License
|
|
61
|
+
|
|
62
|
+
If you do not qualify as a Small Organization, or if you need rights beyond those
|
|
63
|
+
granted by the Free License, you must obtain a separate commercial license from
|
|
64
|
+
the licensor. To request one, contact: jerez.m82@gmail.com.
|
|
65
|
+
|
|
66
|
+
## Notices
|
|
67
|
+
|
|
68
|
+
You must keep this license file, and all copyright and other notices, with every
|
|
69
|
+
copy of the software.
|
|
70
|
+
|
|
71
|
+
## No Other Rights
|
|
72
|
+
|
|
73
|
+
This license does not grant you any rights in the licensor's trademarks, patents,
|
|
74
|
+
or other intellectual property, except the copyright rights expressly stated
|
|
75
|
+
above.
|
|
76
|
+
|
|
77
|
+
## Termination
|
|
78
|
+
|
|
79
|
+
If you violate this license, it terminates automatically. On termination you must
|
|
80
|
+
stop using the software and delete all copies in your possession or control. If
|
|
81
|
+
your violation is capable of cure, your license is reinstated if you cure the
|
|
82
|
+
violation within 30 days of first becoming aware of it, unless the licensor has
|
|
83
|
+
already notified you that your license has terminated.
|
|
84
|
+
|
|
85
|
+
## No Warranty
|
|
86
|
+
|
|
87
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
88
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
89
|
+
FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. YOU BEAR THE ENTIRE RISK OF USING
|
|
90
|
+
THE SOFTWARE.
|
|
91
|
+
|
|
92
|
+
## Limitation of Liability
|
|
93
|
+
|
|
94
|
+
TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
|
95
|
+
FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
96
|
+
TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR
|
|
97
|
+
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
98
|
+
|
|
99
|
+
## Definitions
|
|
100
|
+
|
|
101
|
+
- "Licensor" means Ma Jerez, the copyright holder.
|
|
102
|
+
- "Software" means the RunTypes packages published under the @ts-runtypes npm
|
|
103
|
+
scope, together with any files distributed with them under this license.
|
|
104
|
+
- "You" means the individual or entity exercising rights under this license.
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# ts-runtypes-devtools
|
|
2
|
+
|
|
3
|
+
Cross-bundler build tooling for **RunTypes**. One package, one plugin built on
|
|
4
|
+
[unplugin](https://github.com/unjs/unplugin), exposed as ready-made entry
|
|
5
|
+
points for each bundler. The plugin rewrites RunTypes marker calls
|
|
6
|
+
(`getRunTypeId`, `createValidate`, `createJsonEncoder`, …) into specialized,
|
|
7
|
+
type-derived code generated by the [RunTypes](../../README.md) Go resolver.
|
|
8
|
+
|
|
9
|
+
## Entry points
|
|
10
|
+
|
|
11
|
+
| Import | What it is |
|
|
12
|
+
| ------------------------------- | -------------------------------------------------------------------- |
|
|
13
|
+
| `ts-runtypes-devtools/vite` | Vite plugin (default export is the plugin factory) |
|
|
14
|
+
| `ts-runtypes-devtools/rollup` | Rollup plugin |
|
|
15
|
+
| `ts-runtypes-devtools/webpack` | webpack plugin |
|
|
16
|
+
| `ts-runtypes-devtools/rspack` | Rspack plugin |
|
|
17
|
+
| `ts-runtypes-devtools/esbuild` | esbuild plugin |
|
|
18
|
+
| `ts-runtypes-devtools/unplugin` | the framework-agnostic unplugin instance (`.vite`, `.rollup`, …) |
|
|
19
|
+
| `ts-runtypes-devtools` | the unplugin instance (default export) plus shared types + helpers |
|
|
20
|
+
| `ts-runtypes-devtools/eslint` | reserved for the future lint integration (placeholder, no rules yet) |
|
|
21
|
+
|
|
22
|
+
> The transform is identical across bundlers; the Vite entry additionally wires
|
|
23
|
+
> HMR. Vite and Rollup are covered by tests today; webpack, Rspack and esbuild
|
|
24
|
+
> ride the same unplugin core. esbuild has no native transform phase, so
|
|
25
|
+
> unplugin emulates it via `onLoad`.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm add -D ts-runtypes-devtools
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The plugin runs a small prebuilt Go binary. It resolves the right binary for
|
|
34
|
+
your platform automatically through `ts-runtypes-bin`; pass `binary` only to
|
|
35
|
+
point at a custom or in-repo build.
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// vite.config.ts
|
|
41
|
+
import {defineConfig} from 'vite';
|
|
42
|
+
import runtypes from 'ts-runtypes-devtools/vite';
|
|
43
|
+
|
|
44
|
+
export default defineConfig({
|
|
45
|
+
plugins: [runtypes()],
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Every other bundler is the same shape, e.g. Rollup:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
// rollup.config.js
|
|
53
|
+
import runtypes from 'ts-runtypes-devtools/rollup';
|
|
54
|
+
|
|
55
|
+
export default {
|
|
56
|
+
plugins: [runtypes()],
|
|
57
|
+
};
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Options
|
|
61
|
+
|
|
62
|
+
| Option | Default | Description |
|
|
63
|
+
| --------------------------------- | ---------------------------- | ----------------------------------------------------------------- |
|
|
64
|
+
| `binary` | auto (via `ts-runtypes-bin`) | Path to a custom `ts-runtypes` binary. |
|
|
65
|
+
| `cwd` | bundler root | Project root (where `tsconfig.json` lives). |
|
|
66
|
+
| `tsconfig` | `"tsconfig.json"` | tsconfig path, relative to `cwd`. |
|
|
67
|
+
| `emitMode` | `"code"` | What each cache entry ships: `code`, `functions`, or `both`. |
|
|
68
|
+
| `moduleMode` | `"default"` | Virtual-module grouping: `default`, `allSingle`, `allModules`. |
|
|
69
|
+
| `inlineMode` | `"default"` | Child-inlining policy: `default` or `allInternal`. |
|
|
70
|
+
| `parallelScan` / `parallelRender` | `true` | Opt out of the resolver's parallel phases (benchmarking / debug). |
|
|
71
|
+
|
|
72
|
+
The on-disk artifact cache (`node_modules/.cache/ts-runtypes`) has no option here: it follows TypeScript's `incremental` / `composite` tsconfig setting (on when your project is incremental, off otherwise).
|
|
73
|
+
|
|
74
|
+
## Status
|
|
75
|
+
|
|
76
|
+
Experimental.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type SourceMap } from './edit-buffer.ts';
|
|
2
|
+
import type { Edit } from './protocol.ts';
|
|
3
|
+
export declare function applyEdits(file: string, code: string, importBlock: string, edits: Edit[]): {
|
|
4
|
+
code: string;
|
|
5
|
+
map: SourceMap;
|
|
6
|
+
};
|
|
7
|
+
export declare function sourceHash(code: string): string;
|
|
8
|
+
//# sourceMappingURL=apply-edits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-edits.d.ts","sourceRoot":"","sources":["../src/apply-edits.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AAMxC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAC,CASzH;AAQD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ/C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EditBuffer } from "./edit-buffer.js";
|
|
2
|
+
export function applyEdits(file, code, importBlock, edits) {
|
|
3
|
+
const buffer = new EditBuffer(code);
|
|
4
|
+
for (const edit of edits) {
|
|
5
|
+
if (edit.start === edit.end)
|
|
6
|
+
buffer.appendLeft(edit.start, edit.text);
|
|
7
|
+
else
|
|
8
|
+
buffer.update(edit.start, edit.end, edit.text);
|
|
9
|
+
}
|
|
10
|
+
if (importBlock)
|
|
11
|
+
buffer.prepend(importBlock);
|
|
12
|
+
const map = buffer.generateMap({ source: file, includeContent: true });
|
|
13
|
+
return { code: buffer.toString(), map };
|
|
14
|
+
}
|
|
15
|
+
export function sourceHash(code) {
|
|
16
|
+
const bytes = Buffer.from(code, 'utf8');
|
|
17
|
+
let hash = 0x811c9dc5;
|
|
18
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
19
|
+
hash ^= bytes[i];
|
|
20
|
+
hash = Math.imul(hash, 0x01000193);
|
|
21
|
+
}
|
|
22
|
+
return (hash >>> 0).toString(16).padStart(8, '0');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=apply-edits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-edits.js","sourceRoot":"","sources":["../src/apply-edits.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAC,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AAO5D,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,WAAmB,EAAE,KAAa;IACvF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG;YAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;YACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,WAAW;QAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAC,CAAC,CAAC;IACrE,OAAO,EAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAC,CAAC;AACxC,CAAC;AAQD,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DIAGNOSTIC_CATALOG } from './diagnosticCatalog.generated.ts';
|
|
2
|
+
export type { DiagnosticEntry } from './diagnosticCatalog.generated.ts';
|
|
3
|
+
export declare function renderHeadline(code: string, args?: readonly string[]): string;
|
|
4
|
+
export declare function renderDetail(code: string, args?: readonly string[]): string | undefined;
|
|
5
|
+
export declare function alwaysThrowFactory(code: string, siteHint?: string, ...args: string[]): () => never;
|
|
6
|
+
export declare function messageForCode(code: string, args?: readonly string[]): string;
|
|
7
|
+
//# sourceMappingURL=diagnosticCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnosticCatalog.d.ts","sourceRoot":"","sources":["../src/diagnosticCatalog.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAC,kBAAkB,EAAC,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAC,eAAe,EAAC,MAAM,kCAAkC,CAAC;AAkBtE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAI7E;AAQD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAIvF;AAeD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAOlG;AAQD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnosticCatalog.generated.d.ts","sourceRoot":"","sources":["../src/diagnosticCatalog.generated.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAE9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAwtB9D,CAAC"}
|