@kadi.build/deploy-ability 0.0.3 → 0.0.5
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/dist/targets/akash/bids.d.ts +183 -0
- package/dist/targets/akash/bids.d.ts.map +1 -0
- package/dist/targets/akash/bids.js +247 -0
- package/dist/targets/akash/bids.js.map +1 -0
- package/dist/targets/akash/certificate-manager.d.ts +89 -167
- package/dist/targets/akash/certificate-manager.d.ts.map +1 -1
- package/dist/targets/akash/certificate-manager.js +193 -301
- package/dist/targets/akash/certificate-manager.js.map +1 -1
- package/dist/targets/akash/client.d.ts +644 -0
- package/dist/targets/akash/client.d.ts.map +1 -0
- package/dist/targets/akash/client.js +972 -0
- package/dist/targets/akash/client.js.map +1 -0
- package/dist/targets/akash/constants.d.ts +12 -149
- package/dist/targets/akash/constants.d.ts.map +1 -1
- package/dist/targets/akash/constants.js +14 -136
- package/dist/targets/akash/constants.js.map +1 -1
- package/dist/targets/akash/deployer.d.ts +3 -82
- package/dist/targets/akash/deployer.d.ts.map +1 -1
- package/dist/targets/akash/deployer.js +122 -160
- package/dist/targets/akash/deployer.js.map +1 -1
- package/dist/targets/akash/environment.d.ts +16 -214
- package/dist/targets/akash/environment.d.ts.map +1 -1
- package/dist/targets/akash/environment.js +20 -210
- package/dist/targets/akash/environment.js.map +1 -1
- package/dist/targets/akash/index.d.ts +95 -189
- package/dist/targets/akash/index.d.ts.map +1 -1
- package/dist/targets/akash/index.js +69 -197
- package/dist/targets/akash/index.js.map +1 -1
- package/dist/targets/akash/lease-monitor.d.ts +3 -21
- package/dist/targets/akash/lease-monitor.d.ts.map +1 -1
- package/dist/targets/akash/lease-monitor.js +39 -56
- package/dist/targets/akash/lease-monitor.js.map +1 -1
- package/dist/targets/akash/logs.d.ts +103 -4
- package/dist/targets/akash/logs.d.ts.map +1 -1
- package/dist/targets/akash/logs.js +12 -3
- package/dist/targets/akash/logs.js.map +1 -1
- package/dist/targets/akash/pricing.d.ts +12 -191
- package/dist/targets/akash/pricing.d.ts.map +1 -1
- package/dist/targets/akash/pricing.js +12 -188
- package/dist/targets/akash/pricing.js.map +1 -1
- package/dist/targets/akash/provider-manager.d.ts +120 -0
- package/dist/targets/akash/provider-manager.d.ts.map +1 -0
- package/dist/targets/akash/provider-manager.js +574 -0
- package/dist/targets/akash/provider-manager.js.map +1 -0
- package/dist/targets/akash/sdl-generator.d.ts +2 -2
- package/dist/targets/akash/sdl-generator.d.ts.map +1 -1
- package/dist/targets/akash/sdl-generator.js +6 -39
- package/dist/targets/akash/sdl-generator.js.map +1 -1
- package/dist/targets/akash/types.d.ts +66 -243
- package/dist/targets/akash/types.d.ts.map +1 -1
- package/dist/targets/akash/types.js +4 -41
- package/dist/targets/akash/types.js.map +1 -1
- package/dist/targets/akash/wallet-manager.d.ts +35 -352
- package/dist/targets/akash/wallet-manager.d.ts.map +1 -1
- package/dist/targets/akash/wallet-manager.js +37 -439
- package/dist/targets/akash/wallet-manager.js.map +1 -1
- package/dist/targets/local/compose-generator.d.ts.map +1 -1
- package/dist/targets/local/compose-generator.js +1 -0
- package/dist/targets/local/compose-generator.js.map +1 -1
- package/dist/targets/local/deployer.js +4 -4
- package/dist/targets/local/deployer.js.map +1 -1
- package/dist/targets/local/types.d.ts +4 -0
- package/dist/targets/local/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/options.d.ts +45 -4
- package/dist/types/options.d.ts.map +1 -1
- package/dist/utils/registry/manager.js +6 -6
- package/dist/utils/registry/manager.js.map +1 -1
- package/dist/utils/registry/setup.js +4 -4
- package/dist/utils/registry/setup.js.map +1 -1
- package/docs/KADI_ABILITY_CONVERSION.md +1365 -0
- package/docs/PIPELINE_BUILDER_DESIGN.md +1149 -0
- package/package.json +8 -11
- package/dist/targets/akash/bid-selectors.d.ts +0 -251
- package/dist/targets/akash/bid-selectors.d.ts.map +0 -1
- package/dist/targets/akash/bid-selectors.js +0 -322
- package/dist/targets/akash/bid-selectors.js.map +0 -1
- package/dist/targets/akash/bid-types.d.ts +0 -297
- package/dist/targets/akash/bid-types.d.ts.map +0 -1
- package/dist/targets/akash/bid-types.js +0 -89
- package/dist/targets/akash/bid-types.js.map +0 -1
- package/dist/targets/akash/blockchain-client.d.ts +0 -577
- package/dist/targets/akash/blockchain-client.d.ts.map +0 -1
- package/dist/targets/akash/blockchain-client.js +0 -803
- package/dist/targets/akash/blockchain-client.js.map +0 -1
- package/dist/targets/akash/logs.types.d.ts +0 -102
- package/dist/targets/akash/logs.types.d.ts.map +0 -1
- package/dist/targets/akash/logs.types.js +0 -9
- package/dist/targets/akash/logs.types.js.map +0 -1
- package/dist/targets/akash/provider-client.d.ts +0 -114
- package/dist/targets/akash/provider-client.d.ts.map +0 -1
- package/dist/targets/akash/provider-client.js +0 -318
- package/dist/targets/akash/provider-client.js.map +0 -1
- package/dist/targets/akash/provider-metadata.d.ts +0 -228
- package/dist/targets/akash/provider-metadata.d.ts.map +0 -1
- package/dist/targets/akash/provider-metadata.js +0 -14
- package/dist/targets/akash/provider-metadata.js.map +0 -1
- package/dist/targets/akash/provider-service.d.ts +0 -133
- package/dist/targets/akash/provider-service.d.ts.map +0 -1
- package/dist/targets/akash/provider-service.js +0 -391
- package/dist/targets/akash/provider-service.js.map +0 -1
- package/dist/targets/akash/query-client.d.ts +0 -125
- package/dist/targets/akash/query-client.d.ts.map +0 -1
- package/dist/targets/akash/query-client.js +0 -332
- package/dist/targets/akash/query-client.js.map +0 -1
- package/docs/EXAMPLES.md +0 -293
- package/docs/PLACEMENT.md +0 -433
- package/docs/STORAGE.md +0 -318
|
@@ -4,75 +4,34 @@
|
|
|
4
4
|
* Provides certificate operations for Akash Network deployments. Certificates are
|
|
5
5
|
* required for mTLS authentication with Akash providers and are tied to wallet addresses.
|
|
6
6
|
*
|
|
7
|
-
* Key Improvements from kadi-deploy:
|
|
8
|
-
* - ✅ ZERO file I/O (caller handles persistence)
|
|
9
|
-
* - ✅ ZERO CLI dependencies (no chalk, enquirer, prompts)
|
|
10
|
-
* - ✅ ZERO `any` types (proper TypeScript throughout)
|
|
11
|
-
* - ✅ Result types for all operations
|
|
12
|
-
* - ✅ Composable API (small, focused functions)
|
|
13
|
-
* - ✅ Step-by-step comments explaining logic
|
|
14
|
-
*
|
|
15
|
-
* Design Philosophy:
|
|
16
|
-
* This is a LIBRARY, not a CLI. Certificates are passed as data structures.
|
|
17
|
-
* The caller (kadi-deploy CLI) handles file I/O, prompts, and display.
|
|
18
|
-
*
|
|
19
7
|
* @module targets/akash/certificate-manager
|
|
20
8
|
*/
|
|
21
|
-
import type { SigningStargateClient } from '@cosmjs/stargate';
|
|
22
9
|
import type { Result } from '../../types/index.js';
|
|
23
|
-
import type {
|
|
10
|
+
import type { AkashProviderTlsCertificate } from './types.js';
|
|
11
|
+
import type { AkashClient } from './client.js';
|
|
24
12
|
import { CertificateError } from '../../errors/index.js';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Certificate JSON structure (for parsing)
|
|
28
|
-
*
|
|
29
|
-
* This is the format expected when loading certificates from external sources.
|
|
30
|
-
*/
|
|
13
|
+
/** Certificate JSON structure (for parsing) */
|
|
31
14
|
export interface CertificateJson {
|
|
32
|
-
/** PEM-encoded X.509 certificate */
|
|
33
15
|
cert: string;
|
|
34
|
-
/** PEM-encoded private key */
|
|
35
16
|
privateKey: string;
|
|
36
|
-
/** PEM-encoded public key */
|
|
37
17
|
publicKey: string;
|
|
38
|
-
/** Optional certificate chain */
|
|
39
18
|
chain?: string;
|
|
40
19
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Certificate broadcast result
|
|
43
|
-
*
|
|
44
|
-
* Contains the transaction hash and confirmation details.
|
|
45
|
-
*/
|
|
20
|
+
/** Certificate broadcast result */
|
|
46
21
|
export interface CertificateBroadcastResult {
|
|
47
|
-
/** Transaction hash */
|
|
48
22
|
transactionHash: string;
|
|
49
|
-
/** Block height */
|
|
50
23
|
height: number;
|
|
51
|
-
/** Whether broadcast was successful */
|
|
52
24
|
success: boolean;
|
|
53
25
|
}
|
|
54
|
-
/**
|
|
55
|
-
* On-chain certificate information
|
|
56
|
-
*
|
|
57
|
-
* Represents whether a certificate exists on the Akash blockchain.
|
|
58
|
-
*/
|
|
26
|
+
/** On-chain certificate information */
|
|
59
27
|
export interface OnChainCertificateInfo {
|
|
60
|
-
/** Whether certificate exists on blockchain */
|
|
61
28
|
exists: boolean;
|
|
62
|
-
/** Number of certificates found */
|
|
63
29
|
count: number;
|
|
64
30
|
}
|
|
65
31
|
/**
|
|
66
32
|
* Generate a new Akash certificate
|
|
67
33
|
*
|
|
68
34
|
* Creates a fresh X.509 certificate with PEM encoding for mTLS authentication.
|
|
69
|
-
* This certificate is tied to the wallet address and can be reused across deployments.
|
|
70
|
-
*
|
|
71
|
-
* **What this does:**
|
|
72
|
-
* 1. Generates RSA key pair (2048-bit)
|
|
73
|
-
* 2. Creates X.509 certificate
|
|
74
|
-
* 3. Encodes in PEM format
|
|
75
|
-
* 4. Returns certificate ready for blockchain broadcast
|
|
76
35
|
*
|
|
77
36
|
* @param walletAddress - Akash wallet address to tie certificate to
|
|
78
37
|
* @returns Result with generated certificate or error
|
|
@@ -82,147 +41,110 @@ export interface OnChainCertificateInfo {
|
|
|
82
41
|
* const result = generateCertificate('akash1abc...');
|
|
83
42
|
* if (result.success) {
|
|
84
43
|
* console.log('Certificate generated:', result.data);
|
|
85
|
-
* // Now broadcast to blockchain with broadcastCertificate()
|
|
86
44
|
* }
|
|
87
45
|
* ```
|
|
88
46
|
*/
|
|
89
|
-
export declare function generateCertificate(walletAddress: string): Result<AkashProviderTlsCertificate, CertificateError
|
|
47
|
+
export declare function generateCertificate(walletAddress: string): Promise<Result<AkashProviderTlsCertificate, CertificateError>>;
|
|
90
48
|
/**
|
|
91
49
|
* Parse and validate certificate from JSON
|
|
92
50
|
*
|
|
93
|
-
* Converts certificate JSON data into a validated Certificate object.
|
|
94
|
-
* Performs comprehensive structure and format validation.
|
|
95
|
-
*
|
|
96
|
-
* **Validation checks:**
|
|
97
|
-
* 1. Object structure (not null/undefined)
|
|
98
|
-
* 2. Required fields present (cert, privateKey, publicKey)
|
|
99
|
-
* 3. PEM format validation (BEGIN/END markers)
|
|
100
|
-
* 4. String type validation
|
|
51
|
+
* Converts certificate JSON data into a validated Certificate object with structure and format validation.
|
|
101
52
|
*
|
|
102
53
|
* @param json - Certificate data to parse (from file, API, etc.)
|
|
103
54
|
* @returns Result with validated certificate or error
|
|
104
55
|
*
|
|
105
56
|
* @example
|
|
106
57
|
* ```typescript
|
|
107
|
-
* const certJson = JSON.parse(fileContents);
|
|
108
58
|
* const result = parseCertificate(certJson);
|
|
109
|
-
*
|
|
110
59
|
* if (result.success) {
|
|
111
|
-
* // Certificate is valid and ready to use
|
|
112
60
|
* await broadcastCertificate(wallet, result.data, client);
|
|
113
|
-
* } else {
|
|
114
|
-
* console.error('Invalid certificate:', result.error.message);
|
|
115
61
|
* }
|
|
116
62
|
* ```
|
|
117
63
|
*/
|
|
118
64
|
export declare function parseCertificate(json: unknown): Result<AkashProviderTlsCertificate, CertificateError>;
|
|
119
65
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* Checks if a valid certificate exists on-chain for the wallet address.
|
|
123
|
-
* Returns the first valid certificate found, or null if none exist.
|
|
124
|
-
*
|
|
125
|
-
* **What this does:**
|
|
126
|
-
* 1. Connects to Akash RPC endpoint
|
|
127
|
-
* 2. Queries certificate module
|
|
128
|
-
* 3. Filters for valid certificates only
|
|
129
|
-
* 4. Returns first match or null
|
|
130
|
-
*
|
|
131
|
-
* @param wallet - Wallet context with address
|
|
132
|
-
* @param network - Akash network to query
|
|
133
|
-
* @returns Result with certificate info or null if not found
|
|
134
|
-
*
|
|
135
|
-
* @example
|
|
136
|
-
* ```typescript
|
|
137
|
-
* const result = await queryCertificate(wallet, 'mainnet');
|
|
66
|
+
* Certificate Manager for Akash Network
|
|
138
67
|
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* } else if (result.success && !result.data) {
|
|
142
|
-
* console.log('No certificate found - need to create one');
|
|
143
|
-
* }
|
|
144
|
-
* ```
|
|
68
|
+
* Handles certificate operations using AkashClient's SDK instance.
|
|
69
|
+
* Provides methods for querying, broadcasting, and ensuring certificates exist.
|
|
145
70
|
*/
|
|
146
|
-
export declare
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
export declare function ensureCertificate(wallet: WalletContext, network: AkashNetwork, client: SigningStargateClient, options?: {
|
|
226
|
-
existingCertificate?: AkashProviderTlsCertificate;
|
|
227
|
-
}): Promise<Result<AkashProviderTlsCertificate, CertificateError>>;
|
|
71
|
+
export declare class CertificateManager {
|
|
72
|
+
private readonly client;
|
|
73
|
+
/**
|
|
74
|
+
* Create a new CertificateManager
|
|
75
|
+
*
|
|
76
|
+
* @param client - AkashClient instance to use for blockchain operations
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const client = new AkashClient({ network: 'mainnet', signer });
|
|
81
|
+
* const certManager = new CertificateManager(client);
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
constructor(client: AkashClient);
|
|
85
|
+
/**
|
|
86
|
+
* Query certificate from Akash blockchain
|
|
87
|
+
*
|
|
88
|
+
* Checks if a valid certificate exists on-chain for the wallet address.
|
|
89
|
+
*
|
|
90
|
+
* @param walletAddress - Akash wallet address to query
|
|
91
|
+
* @returns Result with certificate info or null if not found
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const result = await certManager.query('akash1abc...');
|
|
96
|
+
* if (result.success && result.data) {
|
|
97
|
+
* console.log(`Found ${result.data.count} certificate(s) on-chain`);
|
|
98
|
+
* }
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
query(walletAddress: string): Promise<Result<OnChainCertificateInfo | null, CertificateError>>;
|
|
102
|
+
/**
|
|
103
|
+
* Broadcast certificate to Akash blockchain
|
|
104
|
+
*
|
|
105
|
+
* Submits a certificate transaction to the blockchain, making it available
|
|
106
|
+
* for mTLS authentication with providers.
|
|
107
|
+
*
|
|
108
|
+
* Requires: Client must have signing capability (signer configured)
|
|
109
|
+
*
|
|
110
|
+
* @param walletAddress - Wallet address that owns the certificate
|
|
111
|
+
* @param certificate - Certificate to broadcast
|
|
112
|
+
* @returns Result with broadcast result or error
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const cert = await generateCertificate('akash1abc...');
|
|
117
|
+
* const result = await certManager.broadcast('akash1abc...', cert.data);
|
|
118
|
+
* if (result.success) {
|
|
119
|
+
* console.log('Certificate on-chain:', result.data.transactionHash);
|
|
120
|
+
* }
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
broadcast(walletAddress: string, certificate: AkashProviderTlsCertificate): Promise<Result<CertificateBroadcastResult, CertificateError>>;
|
|
124
|
+
/**
|
|
125
|
+
* Get or create certificate (convenience method)
|
|
126
|
+
*
|
|
127
|
+
* Handles the complete certificate workflow:
|
|
128
|
+
* 1. Use existing certificate if provided and valid
|
|
129
|
+
* 2. Check blockchain for existing certificate
|
|
130
|
+
* 3. Generate and broadcast new certificate if none exists
|
|
131
|
+
*
|
|
132
|
+
* Requires: Client must have signing capability for certificate creation
|
|
133
|
+
*
|
|
134
|
+
* @param walletAddress - Wallet address to ensure certificate for
|
|
135
|
+
* @param options - Optional existing certificate
|
|
136
|
+
* @returns Result with valid certificate or error
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const result = await certManager.getOrCreate('akash1abc...');
|
|
141
|
+
* if (result.success) {
|
|
142
|
+
* await sendManifest(lease, manifest, result.data);
|
|
143
|
+
* }
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
getOrCreate(walletAddress: string, options?: {
|
|
147
|
+
existingCertificate?: AkashProviderTlsCertificate;
|
|
148
|
+
}): Promise<Result<AkashProviderTlsCertificate, CertificateError>>;
|
|
149
|
+
}
|
|
228
150
|
//# sourceMappingURL=certificate-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"certificate-manager.d.ts","sourceRoot":"","sources":["../../../src/targets/akash/certificate-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"certificate-manager.d.ts","sourceRoot":"","sources":["../../../src/targets/akash/certificate-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAyB,MAAM,uBAAuB,CAAC;AAEhF,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mCAAmC;AACnC,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC,CAqChE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAoDvD;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC;;;;;;;;;;OAUG;gBACS,MAAM,EAAE,WAAW;IAI/B;;;;;;;;;;;;;;;OAeG;IACG,KAAK,CACT,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,sBAAsB,GAAG,IAAI,EAAE,gBAAgB,CAAC,CAAC;IA+BnE;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,SAAS,CACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,2BAA2B,GACvC,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC;IAoDhE;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,WAAW,CACf,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,2BAA2B,CAAC;KACnD,GACA,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;CAmDlE"}
|