@hyperttp/core 1.1.12 → 1.2.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/Core/HyperCore.d.ts +173 -8
- package/Core/HyperCore.d.ts.map +1 -1
- package/Core/HyperCore.js +329 -100
- package/Core/HyperCore.js.map +1 -1
- package/Core/index.d.ts +0 -1
- package/Core/index.d.ts.map +1 -1
- package/Core/index.js +0 -1
- package/Core/index.js.map +1 -1
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/defaultConfig.d.ts +1 -1
- package/defaultConfig.d.ts.map +1 -1
- package/defaultConfig.js +0 -1
- package/defaultConfig.js.map +1 -1
- package/index.d.ts +1 -4
- package/index.d.ts.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +20 -6
- package/transports/node.d.ts +18 -7
- package/transports/node.d.ts.map +1 -1
- package/transports/node.js +255 -142
- package/transports/node.js.map +1 -1
- package/utils/errors.d.ts +49 -0
- package/utils/errors.d.ts.map +1 -0
- package/utils/errors.js +63 -0
- package/utils/errors.js.map +1 -0
- package/utils/merge.d.ts +8 -1
- package/utils/merge.d.ts.map +1 -1
- package/utils/merge.js +27 -13
- package/utils/merge.js.map +1 -1
- package/utils/response.d.ts +40 -0
- package/utils/response.d.ts.map +1 -0
- package/utils/response.js +79 -0
- package/utils/response.js.map +1 -0
- package/utils/retryUtils.d.ts +5 -0
- package/utils/retryUtils.d.ts.map +1 -0
- package/utils/retryUtils.js +35 -0
- package/utils/retryUtils.js.map +1 -0
- package/Core/RequestExecutor.d.ts +0 -64
- package/Core/RequestExecutor.d.ts.map +0 -1
- package/Core/RequestExecutor.js +0 -213
- package/Core/RequestExecutor.js.map +0 -1
- package/transports/bun.d.ts +0 -16
- package/transports/bun.d.ts.map +0 -1
- package/transports/bun.js +0 -181
- package/transports/bun.js.map +0 -1
- package/types/errors.d.ts +0 -20
- package/types/errors.d.ts.map +0 -1
- package/types/errors.js +0 -28
- package/types/errors.js.map +0 -1
- package/types/http.d.ts +0 -5
- package/types/http.d.ts.map +0 -1
- package/types/http.js +0 -2
- package/types/http.js.map +0 -1
- package/types/hyper.d.ts +0 -34
- package/types/hyper.d.ts.map +0 -1
- package/types/hyper.js +0 -2
- package/types/hyper.js.map +0 -1
- package/types/index.d.ts +0 -12
- package/types/index.d.ts.map +0 -1
- package/types/index.js +0 -12
- package/types/index.js.map +0 -1
- package/types/metrics.d.ts +0 -65
- package/types/metrics.d.ts.map +0 -1
- package/types/metrics.js +0 -2
- package/types/metrics.js.map +0 -1
- package/types/network.d.ts +0 -65
- package/types/network.d.ts.map +0 -1
- package/types/network.js +0 -2
- package/types/network.js.map +0 -1
- package/types/options.d.ts +0 -51
- package/types/options.d.ts.map +0 -1
- package/types/options.js +0 -2
- package/types/options.js.map +0 -1
- package/types/plugins.d.ts +0 -47
- package/types/plugins.d.ts.map +0 -1
- package/types/plugins.js +0 -2
- package/types/plugins.js.map +0 -1
- package/types/request.d.ts +0 -114
- package/types/request.d.ts.map +0 -1
- package/types/request.js +0 -2
- package/types/request.js.map +0 -1
- package/types/retry.d.ts +0 -28
- package/types/retry.d.ts.map +0 -1
- package/types/retry.js +0 -2
- package/types/retry.js.map +0 -1
- package/types/stream.d.ts +0 -39
- package/types/stream.d.ts.map +0 -1
- package/types/stream.js +0 -2
- package/types/stream.js.map +0 -1
- package/types/transport.d.ts +0 -25
- package/types/transport.d.ts.map +0 -1
- package/types/transport.js +0 -2
- package/types/transport.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# @hyperttp/core ⚡
|
|
2
|
+
|
|
3
|
+
> English | [Русский](https://github.com/IT-IF-OR/hyperttp-core/tree/main/lang/ru)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🌐 Language
|
|
8
|
+
|
|
9
|
+
- 🇺🇸 English
|
|
10
|
+
- 🇷🇺 [Русский](https://github.com/IT-IF-OR/hyperttp-core/tree/main/lang/ru)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
**Hyperttp** is a high-performance, isomorphic HTTP client designed for modern Node.js and Bun environments.
|
|
15
|
+
It is built as a thin core with an intelligent transport selection strategy and a powerful plugin system.
|
|
16
|
+
|
|
17
|
+
## Why Hyperttp?
|
|
18
|
+
|
|
19
|
+
- **⚡ Performance:** optimized hot-path HTTP request execution for Node.js and Bun
|
|
20
|
+
- **🧩 Isomorphism:** unified API for Node.js and Bun. The system automatically selects the best transport
|
|
21
|
+
(native Bun, Undici, or standard Node.js `http`)
|
|
22
|
+
- **🔌 Plugin system:** easily extend functionality via hooks
|
|
23
|
+
(`onRequest`, `onResponse`, `onError`)
|
|
24
|
+
- **🛠️ Transport strategy:** easily add support for new runtimes
|
|
25
|
+
(Deno, Browser) via the `HyperTransport` interface
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Benchmarks
|
|
30
|
+
|
|
31
|
+
### Test configuration
|
|
32
|
+
|
|
33
|
+
```txt
|
|
34
|
+
Requests 100000
|
|
35
|
+
Concurrency 500
|
|
36
|
+
Warmup 500
|
|
37
|
+
Timeout 60000 ms
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Run benchmark:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
bun run bench.ts && npx tsx bench.ts
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## [Benchmark results](https://github.com/IT-IF-OR/bench)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
# 🟦 Node.js v24.14.1 — Undici transport
|
|
53
|
+
|
|
54
|
+
### 🏆 Leaderboard (by RPS)
|
|
55
|
+
|
|
56
|
+
| Rank | Client | RPS | p99 | AVG | Heap |
|
|
57
|
+
| ---- | -------------- | ------ | -------- | ------- | ------- |
|
|
58
|
+
| 🥇 1 | @hyperttp/core | 27.72K | 43.45ms | 17.95ms | 18.7 MB |
|
|
59
|
+
| 🥈 2 | undici | 19.80K | 59.51ms | 25.17ms | 20.6 MB |
|
|
60
|
+
| 🥉 3 | ky | 7.82K | 119.80ms | 63.86ms | 34.1 MB |
|
|
61
|
+
| 4 | node-fetch | 6.39K | 125.38ms | 77.95ms | 15.2 MB |
|
|
62
|
+
| 5 | superagent | 6.28K | 127.06ms | 79.50ms | 15.1 MB |
|
|
63
|
+
| 6 | axios | 6.19K | 110.82ms | 80.53ms | 21.4 MB |
|
|
64
|
+
| 7 | got | 5.84K | 130.92ms | 85.49ms | 15.7 MB |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
# 🟨 Bun v1.3.14 — Bun transport
|
|
69
|
+
|
|
70
|
+
### 🏆 Leaderboard (by RPS)
|
|
71
|
+
|
|
72
|
+
| Rank | Client | RPS | p99 | AVG | Heap |
|
|
73
|
+
| ---- | -------------- | ------ | ------- | ------- | ------- |
|
|
74
|
+
| 🥇 1 | undici | 36.42K | 15.67ms | 13.68ms | 31.8 MB |
|
|
75
|
+
| 🥈 2 | node-fetch | 36.29K | 16.70ms | 13.74ms | 4.07 MB |
|
|
76
|
+
| 🥉 3 | @hyperttp/core | 34.26K | 21.61ms | 14.54ms | 34.9 MB |
|
|
77
|
+
| 4 | ky | 31.10K | 22.78ms | 16.05ms | 9.88 MB |
|
|
78
|
+
| 5 | superagent | 13.86K | 69.78ms | 36.00ms | 18.1 MB |
|
|
79
|
+
| 6 | axios | 8.98K | 66.58ms | 55.52ms | 18.8 MB |
|
|
80
|
+
| 7 | got | 7.15K | 86.70ms | 69.83ms | 25.2 MB |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
# 🟩 Node.js v24.14.1 — Node transport
|
|
85
|
+
|
|
86
|
+
### 🏆 Leaderboard (by RPS)
|
|
87
|
+
|
|
88
|
+
| Rank | Client | RPS | p99 | AVG | Heap |
|
|
89
|
+
| ---- | -------------- | ------ | -------- | ------- | ------- |
|
|
90
|
+
| 🥇 1 | undici | 20.08K | 66.21ms | 24.76ms | 20.6 MB |
|
|
91
|
+
| 🥈 2 | @hyperttp/core | 12.52K | 66.42ms | 39.80ms | 14.1 MB |
|
|
92
|
+
| 🥉 3 | ky | 7.98K | 113.21ms | 62.55ms | 23.1 MB |
|
|
93
|
+
| 4 | node-fetch | 6.71K | 114.06ms | 74.23ms | 15.9 MB |
|
|
94
|
+
| 5 | axios | 6.29K | 116.21ms | 79.22ms | 22.2 MB |
|
|
95
|
+
| 6 | superagent | 6.19K | 125.31ms | 80.73ms | 15.2 MB |
|
|
96
|
+
| 7 | got | 5.86K | 135.85ms | 85.18ms | 19.3 MB |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
# 🟪 Bun v1.3.14 — Node transport
|
|
101
|
+
|
|
102
|
+
### 🏆 Leaderboard (by RPS)
|
|
103
|
+
|
|
104
|
+
| Rank | Client | RPS | p99 | AVG | Heap |
|
|
105
|
+
| ---- | -------------- | ------ | -------- | ------- | ------- |
|
|
106
|
+
| 🥇 1 | node-fetch | 35.87K | 17.00ms | 13.90ms | 6.21 MB |
|
|
107
|
+
| 🥈 2 | undici | 35.79K | 16.59ms | 13.92ms | 25.4 MB |
|
|
108
|
+
| 🥉 3 | ky | 29.68K | 37.27ms | 16.80ms | 17.3 MB |
|
|
109
|
+
| 4 | @hyperttp/core | 17.32K | 50.71ms | 28.79ms | 17.5 MB |
|
|
110
|
+
| 5 | superagent | 13.73K | 122.70ms | 36.37ms | 34.4 MB |
|
|
111
|
+
| 6 | axios | 8.77K | 86.39ms | 56.84ms | 18.9 MB |
|
|
112
|
+
| 7 | got | 6.97K | 98.33ms | 71.64ms | 25.3 MB |
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Quick start
|
|
117
|
+
|
|
118
|
+
### Installation
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
npm install @hyperttp/core
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Usage
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { HyperCore } from "@hyperttp/core";
|
|
130
|
+
|
|
131
|
+
const http = new HyperCore({
|
|
132
|
+
network: { userAgent: "MyApp/1.0" },
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// GET request
|
|
136
|
+
const response = await http.get("https://api.example.com/data");
|
|
137
|
+
|
|
138
|
+
// POST request
|
|
139
|
+
const result = await http.post("/users", { name: "John" });
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### Extending and plugins
|
|
145
|
+
|
|
146
|
+
`HyperCore` supports creating isolated instances with custom configuration and plugins.
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
const apiClient = http.extend({
|
|
150
|
+
network: { headers: { "X-Auth": "secret" } },
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
apiClient.use({
|
|
154
|
+
name: "logger-plugin",
|
|
155
|
+
enabled: () => true,
|
|
156
|
+
onRequest: async (req) => {
|
|
157
|
+
console.log(`Sending ${req.method} to ${req.url}`);
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Architecture
|
|
165
|
+
|
|
166
|
+
Hyperttp is built on the **Strategy pattern**.
|
|
167
|
+
|
|
168
|
+
1. **Core (`HyperCore`)**: orchestrates the request lifecycle
|
|
169
|
+
2. **Transports (`HyperTransport`)**: low-level implementations for different runtimes
|
|
170
|
+
dynamically selected to minimize bundle size
|
|
171
|
+
3. **Hooks**: executed during request lifecycle (before request, after response, on error)
|
|
172
|
+
allowing interception and modification without changing core logic
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## License
|
|
177
|
+
|
|
178
|
+
MIT
|
package/defaultConfig.d.ts
CHANGED
package/defaultConfig.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,eAAO,MAAM,aAAa,EAAE,iBAkB3B,CAAC"}
|
package/defaultConfig.js
CHANGED
package/defaultConfig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,CAAC;QACf,kBAAkB,EAAE,IAAI;QACxB,SAAS,EAAE,cAAc;KAC1B;IACD,KAAK,EAAE;QACL,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;KACb;IACD,OAAO,EAAE,KAAK;CACf,CAAC"}
|
package/index.d.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
export { HyperCore
|
|
1
|
+
export { HyperCore } from "./Core/index.js";
|
|
2
2
|
export { deepMerge } from "./utils/merge.js";
|
|
3
|
-
export type * from "./types/index.js";
|
|
4
|
-
export type * from "./transports/bun.js";
|
|
5
|
-
export type * from "./transports/node.js";
|
|
6
3
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
package/index.js
CHANGED
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperttp/core",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "High-performance, extensible HTTP client for Node.js and Bun",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "High-performance, extensible HTTP client for Node.js and Bun and other",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
7
7
|
"types": "./index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./index.d.ts",
|
|
11
|
+
"import": "./index.js",
|
|
12
|
+
"require": "./index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
8
16
|
"keywords": [
|
|
9
17
|
"http",
|
|
10
18
|
"client",
|
|
@@ -20,11 +28,17 @@
|
|
|
20
28
|
"url": "git+https://github.com/IT-IF-OR/hyperttp-core.git"
|
|
21
29
|
},
|
|
22
30
|
"peerDependencies": {
|
|
23
|
-
"typescript": "^6"
|
|
31
|
+
"typescript": "^6",
|
|
32
|
+
"@hyperttp/transport-bun": "^0.1.1",
|
|
33
|
+
"@hyperttp/transport-undici": "^0.1.0"
|
|
24
34
|
},
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"@hyperttp/transport-bun": {
|
|
37
|
+
"optional": true
|
|
38
|
+
},
|
|
39
|
+
"@hyperttp/transport-undici": {
|
|
40
|
+
"optional": true
|
|
41
|
+
}
|
|
28
42
|
},
|
|
29
43
|
"private": false
|
|
30
44
|
}
|
package/transports/node.d.ts
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
|
-
import type { HyperTransport, TransportRequest, TransportResponse } from "
|
|
2
|
-
|
|
1
|
+
import type { HttpClientOptions, HyperTransport, RetryOptions, TransportRequest, TransportResponse } from "@hyperttp/types";
|
|
2
|
+
export declare function isRedirect(status: number): boolean;
|
|
3
|
+
export declare function combineSignal(signal: AbortSignal | undefined, timeoutMs: number): {
|
|
4
|
+
signal?: AbortSignal;
|
|
5
|
+
cancelTimer: () => void;
|
|
6
|
+
isTimeoutAbort: () => boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function shouldRetry(status: number, retryOptions: RetryOptions): boolean;
|
|
9
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
10
|
+
export declare function calcDelay(attempt: number, retryOptions: RetryOptions): number;
|
|
11
|
+
/**
|
|
12
|
+
* @ru Высокопроизводительный транспорт на базе классических модулей http/https Node.js.
|
|
13
|
+
*/
|
|
3
14
|
export declare class NodeTransport implements HyperTransport {
|
|
4
|
-
|
|
5
|
-
private
|
|
6
|
-
private
|
|
15
|
+
config: HttpClientOptions;
|
|
16
|
+
private readonly httpAgent;
|
|
17
|
+
private readonly httpsAgent;
|
|
7
18
|
constructor(config: HttpClientOptions);
|
|
19
|
+
private get timeout();
|
|
8
20
|
execute(req: TransportRequest): Promise<TransportResponse>;
|
|
9
|
-
private
|
|
21
|
+
private dispatchOnce;
|
|
10
22
|
close(): Promise<void>;
|
|
11
23
|
destroy(): Promise<void>;
|
|
12
|
-
private logWarning;
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=node.d.ts.map
|
package/transports/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,GAChB;IACD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC;CAC/B,CA8BA;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,GACzB,OAAO,CAMT;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAI7E;AAkED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAC3C,MAAM,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;gBAE7B,MAAM,EAAE,iBAAiB;IAkBrC,OAAO,KAAK,OAAO,GAElB;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuHvE,OAAO,CAAC,YAAY;IAwEP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
|