@odatano/core 0.3.1
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 +201 -0
- package/README.md +212 -0
- package/cds-plugin.js +5 -0
- package/config/preview/cardano-node/alonzo-genesis.json +196 -0
- package/config/preview/cardano-node/byron-genesis.json +117 -0
- package/config/preview/cardano-node/config.json +118 -0
- package/config/preview/cardano-node/conway-genesis.json +297 -0
- package/config/preview/cardano-node/shelley-genesis.json +68 -0
- package/config/preview/cardano-node/topology.json +19 -0
- package/db/schema.cds +1318 -0
- package/package.json +125 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +96 -0
- package/src/index.js.map +1 -0
- package/src/plugin.d.ts.map +1 -0
- package/src/plugin.js +92 -0
- package/src/plugin.js.map +1 -0
- package/srv/blockchain/backends/blockfrost-backend.d.ts.map +1 -0
- package/srv/blockchain/backends/blockfrost-backend.js +398 -0
- package/srv/blockchain/backends/blockfrost-backend.js.map +1 -0
- package/srv/blockchain/backends/cardano-backend.d.ts.map +1 -0
- package/srv/blockchain/backends/cardano-backend.js +12 -0
- package/srv/blockchain/backends/cardano-backend.js.map +1 -0
- package/srv/blockchain/backends/koios-backend.d.ts.map +1 -0
- package/srv/blockchain/backends/koios-backend.js +537 -0
- package/srv/blockchain/backends/koios-backend.js.map +1 -0
- package/srv/blockchain/backends/ogmios-backend.d.ts.map +1 -0
- package/srv/blockchain/backends/ogmios-backend.js +516 -0
- package/srv/blockchain/backends/ogmios-backend.js.map +1 -0
- package/srv/blockchain/cardano-client.d.ts.map +1 -0
- package/srv/blockchain/cardano-client.js +377 -0
- package/srv/blockchain/cardano-client.js.map +1 -0
- package/srv/blockchain/cardano-indexer.d.ts.map +1 -0
- package/srv/blockchain/cardano-indexer.js +542 -0
- package/srv/blockchain/cardano-indexer.js.map +1 -0
- package/srv/blockchain/cardano-tx-builder.d.ts.map +1 -0
- package/srv/blockchain/cardano-tx-builder.js +232 -0
- package/srv/blockchain/cardano-tx-builder.js.map +1 -0
- package/srv/blockchain/circuit-breaker.d.ts.map +1 -0
- package/srv/blockchain/circuit-breaker.js +110 -0
- package/srv/blockchain/circuit-breaker.js.map +1 -0
- package/srv/blockchain/signing/external-signer.d.ts.map +1 -0
- package/srv/blockchain/signing/external-signer.js +302 -0
- package/srv/blockchain/signing/external-signer.js.map +1 -0
- package/srv/blockchain/signing/signature-verifier.d.ts.map +1 -0
- package/srv/blockchain/signing/signature-verifier.js +249 -0
- package/srv/blockchain/signing/signature-verifier.js.map +1 -0
- package/srv/blockchain/transaction-building/buildooor-tx.d.ts.map +1 -0
- package/srv/blockchain/transaction-building/buildooor-tx.js +636 -0
- package/srv/blockchain/transaction-building/buildooor-tx.js.map +1 -0
- package/srv/blockchain/transaction-building/cardano-tx.d.ts.map +1 -0
- package/srv/blockchain/transaction-building/cardano-tx.js +3 -0
- package/srv/blockchain/transaction-building/cardano-tx.js.map +1 -0
- package/srv/blockchain/transaction-building/csl-tx.d.ts.map +1 -0
- package/srv/blockchain/transaction-building/csl-tx.js +766 -0
- package/srv/blockchain/transaction-building/csl-tx.js.map +1 -0
- package/srv/blockchain/transaction-building/tx-builder-registry.d.ts.map +1 -0
- package/srv/blockchain/transaction-building/tx-builder-registry.js +67 -0
- package/srv/blockchain/transaction-building/tx-builder-registry.js.map +1 -0
- package/srv/cardano-service.cds +179 -0
- package/srv/cardano-service.d.ts.map +1 -0
- package/srv/cardano-service.js +227 -0
- package/srv/cardano-service.js.map +1 -0
- package/srv/cardano-tx-service.cds +298 -0
- package/srv/cardano-tx-service.d.ts.map +1 -0
- package/srv/cardano-tx-service.js +646 -0
- package/srv/cardano-tx-service.js.map +1 -0
- package/srv/cardano-ui.cds +2949 -0
- package/srv/server.d.ts.map +1 -0
- package/srv/server.js +212 -0
- package/srv/server.js.map +1 -0
- package/srv/utils/backend-request-handler.d.ts.map +1 -0
- package/srv/utils/backend-request-handler.js +47 -0
- package/srv/utils/backend-request-handler.js.map +1 -0
- package/srv/utils/const.d.ts.map +1 -0
- package/srv/utils/const.js +86 -0
- package/srv/utils/const.js.map +1 -0
- package/srv/utils/error-codes.d.ts.map +1 -0
- package/srv/utils/error-codes.js +49 -0
- package/srv/utils/error-codes.js.map +1 -0
- package/srv/utils/errors.d.ts.map +1 -0
- package/srv/utils/errors.js +389 -0
- package/srv/utils/errors.js.map +1 -0
- package/srv/utils/mappers.d.ts.map +1 -0
- package/srv/utils/mappers.js +723 -0
- package/srv/utils/mappers.js.map +1 -0
- package/srv/utils/signing-helper.d.ts.map +1 -0
- package/srv/utils/signing-helper.js +128 -0
- package/srv/utils/signing-helper.js.map +1 -0
- package/srv/utils/tx-build-helper.d.ts.map +1 -0
- package/srv/utils/tx-build-helper.js +135 -0
- package/srv/utils/tx-build-helper.js.map +1 -0
- package/srv/utils/types.d.ts.map +1 -0
- package/srv/utils/types.js +36 -0
- package/srv/utils/types.js.map +1 -0
- package/srv/utils/validators.d.ts.map +1 -0
- package/srv/utils/validators.js +382 -0
- package/srv/utils/validators.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-signer.js","sourceRoot":"","sources":["external-signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature-verifier.d.ts","sourceRoot":"","sources":["signature-verifier.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIrF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACI,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,2BAA2B;IA+GnG;;;;;;OAMG;IACI,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,2BAA2B;IAa1G;;;;;;OAMG;IACI,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAehD;;;;;OAKG;IACI,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAYxC;;;;;OAKG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAW/C;AAKD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SignatureVerifier = void 0;
|
|
40
|
+
exports.getSignatureVerifier = getSignatureVerifier;
|
|
41
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
42
|
+
const CSL = __importStar(require("@emurgo/cardano-serialization-lib-nodejs"));
|
|
43
|
+
const cardano_ledger_ts_1 = require("@harmoniclabs/cardano-ledger-ts");
|
|
44
|
+
const uint8array_utils_1 = require("@harmoniclabs/uint8array-utils");
|
|
45
|
+
const errors_1 = require("../../utils/errors");
|
|
46
|
+
const error_codes_1 = require("../../utils/error-codes");
|
|
47
|
+
const logger = cds_1.default.log('SignatureVerifier');
|
|
48
|
+
/**
|
|
49
|
+
* SignatureVerifier - Verifies transaction signatures without accessing private keys
|
|
50
|
+
*
|
|
51
|
+
* This module provides signature verification for externally signed transactions.
|
|
52
|
+
* It ensures:
|
|
53
|
+
* 1. The signed CBOR is valid and parseable
|
|
54
|
+
* 2. The transaction body hash matches the expected hash (integrity check)
|
|
55
|
+
* 3. Required signatures are present (when specified)
|
|
56
|
+
* 4. No tampering occurred between build and sign steps
|
|
57
|
+
*
|
|
58
|
+
* ARCHITECTURE NOTE - Dual-Library Approach:
|
|
59
|
+
* This verifier deliberately uses two Cardano libraries:
|
|
60
|
+
* - Harmoniclabs (@harmoniclabs/cardano-ledger-ts): For CBOR parsing and transaction body
|
|
61
|
+
* hash computation. Harmoniclabs preserves the original CBOR byte encoding, producing
|
|
62
|
+
* correct Blake2b-256 hashes. CSL's parse/re-serialize round-trip normalizes CBOR,
|
|
63
|
+
* which changes the bytes and produces incorrect hashes.
|
|
64
|
+
* - CSL (@emurgo/cardano-serialization-lib-nodejs): For witness set extraction and
|
|
65
|
+
* Ed25519 cryptographic signature verification. CSL provides a well-tested Ed25519
|
|
66
|
+
* verify() API. Witness extraction is independent of body hash computation.
|
|
67
|
+
*
|
|
68
|
+
* This is safe because: the hash is computed from original bytes (Harmoniclabs),
|
|
69
|
+
* witnesses are structural data extracted separately (CSL), and Ed25519 verify is a
|
|
70
|
+
* pure cryptographic operation on raw bytes unaffected by CBOR encoding differences.
|
|
71
|
+
*/
|
|
72
|
+
class SignatureVerifier {
|
|
73
|
+
/**
|
|
74
|
+
* Verify a signed transaction
|
|
75
|
+
*
|
|
76
|
+
* @param signedTxCbor - The signed transaction in CBOR hex format
|
|
77
|
+
* @param options - Verification options
|
|
78
|
+
* @returns Verification result with details
|
|
79
|
+
*/
|
|
80
|
+
verify(signedTxCbor, options = {}) {
|
|
81
|
+
const result = {
|
|
82
|
+
isValid: false,
|
|
83
|
+
txBodyHash: '',
|
|
84
|
+
witnessCount: 0,
|
|
85
|
+
signerKeyHashes: [],
|
|
86
|
+
warnings: [],
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
// Parse the signed transaction CBOR using harmoniclabs
|
|
90
|
+
// IMPORTANT: We use harmoniclabs for hash computation because CSL's
|
|
91
|
+
// parse/re-serialize round-trip changes CBOR encoding, producing wrong hashes.
|
|
92
|
+
const txBytesHarmonic = (0, uint8array_utils_1.fromHex)(signedTxCbor);
|
|
93
|
+
const txHarmonic = cardano_ledger_ts_1.Tx.fromCbor(txBytesHarmonic);
|
|
94
|
+
const computedHash = txHarmonic.hash.toString();
|
|
95
|
+
result.txBodyHash = computedHash;
|
|
96
|
+
logger.debug(`Computed transaction body hash (harmoniclabs): ${computedHash}`);
|
|
97
|
+
// Also parse with CSL for witness extraction and Ed25519 verification
|
|
98
|
+
// (structural extraction independent of body hash computation - see class doc)
|
|
99
|
+
const txBytes = Buffer.from(signedTxCbor, 'hex');
|
|
100
|
+
const tx = CSL.Transaction.from_bytes(txBytes);
|
|
101
|
+
// Verify transaction body hash matches expected (if provided)
|
|
102
|
+
if (options.expectedTxBodyHash) {
|
|
103
|
+
if (computedHash.toLowerCase() !== options.expectedTxBodyHash.toLowerCase()) {
|
|
104
|
+
result.errorMessage = `Transaction body hash mismatch. Expected: ${options.expectedTxBodyHash}, Got: ${computedHash}. The transaction may have been tampered with.`;
|
|
105
|
+
logger.warn(result.errorMessage);
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
logger.debug('Transaction body hash verified successfully');
|
|
109
|
+
}
|
|
110
|
+
// Extract witness set
|
|
111
|
+
const witnessSet = tx.witness_set();
|
|
112
|
+
const vkeyWitnesses = witnessSet.vkeys();
|
|
113
|
+
if (vkeyWitnesses) {
|
|
114
|
+
result.witnessCount = vkeyWitnesses.len();
|
|
115
|
+
// Extract signer public key hashes
|
|
116
|
+
for (let i = 0; i < vkeyWitnesses.len(); i++) {
|
|
117
|
+
const witness = vkeyWitnesses.get(i);
|
|
118
|
+
const vkey = witness.vkey();
|
|
119
|
+
const pubKeyHash = vkey.public_key().hash();
|
|
120
|
+
result.signerKeyHashes.push(Buffer.from(pubKeyHash.to_bytes()).toString('hex'));
|
|
121
|
+
}
|
|
122
|
+
logger.debug(`Found ${result.witnessCount} witness(es): ${result.signerKeyHashes.join(', ')}`);
|
|
123
|
+
}
|
|
124
|
+
// Check if signature is required but missing
|
|
125
|
+
if (options.requireSignature !== false && result.witnessCount === 0) {
|
|
126
|
+
result.errorMessage = 'No signatures found in transaction. The transaction must be signed before submission.';
|
|
127
|
+
logger.warn(result.errorMessage);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
// Verify required signers (if specified)
|
|
131
|
+
if (options.requiredSigners && options.requiredSigners.length > 0) {
|
|
132
|
+
const missingSigners = options.requiredSigners.filter(required => !result.signerKeyHashes.some(signer => signer.toLowerCase() === required.toLowerCase()));
|
|
133
|
+
if (missingSigners.length > 0) {
|
|
134
|
+
result.errorMessage = `Missing required signatures from: ${missingSigners.join(', ')}`;
|
|
135
|
+
result.warnings.push(result.errorMessage);
|
|
136
|
+
logger.warn(result.errorMessage);
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Verify each signature cryptographically
|
|
141
|
+
if (vkeyWitnesses && vkeyWitnesses.len() > 0) {
|
|
142
|
+
const bodyHash = CSL.TransactionHash.from_bytes(Buffer.from(computedHash, 'hex'));
|
|
143
|
+
for (let i = 0; i < vkeyWitnesses.len(); i++) {
|
|
144
|
+
const witness = vkeyWitnesses.get(i);
|
|
145
|
+
const vkey = witness.vkey();
|
|
146
|
+
const signature = witness.signature();
|
|
147
|
+
const publicKey = vkey.public_key();
|
|
148
|
+
// Verify the signature against the transaction body hash
|
|
149
|
+
const isValidSig = publicKey.verify(bodyHash.to_bytes(), signature);
|
|
150
|
+
if (!isValidSig) {
|
|
151
|
+
result.errorMessage = `Invalid signature at witness index ${i}. The signature does not match the transaction body.`;
|
|
152
|
+
logger.warn(result.errorMessage);
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
logger.debug('All signatures verified cryptographically');
|
|
157
|
+
}
|
|
158
|
+
// All checks passed
|
|
159
|
+
result.isValid = true;
|
|
160
|
+
logger.info(`Signature verification successful. ${result.witnessCount} valid signature(s).`);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
result.errorMessage = `Failed to verify signature: ${error.message}`;
|
|
164
|
+
logger.error(result.errorMessage);
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Verify signature and throw on failure
|
|
170
|
+
*
|
|
171
|
+
* @param signedTxCbor - The signed transaction in CBOR hex format
|
|
172
|
+
* @param options - Verification options
|
|
173
|
+
* @throws {TransactionValidationError} if verification fails
|
|
174
|
+
*/
|
|
175
|
+
verifyOrThrow(signedTxCbor, options = {}) {
|
|
176
|
+
const result = this.verify(signedTxCbor, options);
|
|
177
|
+
if (!result.isValid) {
|
|
178
|
+
throw new errors_1.TransactionValidationError(result.errorMessage || 'Signature verification failed', new Error(result.errorMessage));
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Extract transaction body hash from unsigned or signed CBOR
|
|
184
|
+
*
|
|
185
|
+
* @param txCbor - Transaction CBOR (signed or unsigned)
|
|
186
|
+
* @returns Transaction body hash as hex string
|
|
187
|
+
* @throws {Error} if CBOR is invalid
|
|
188
|
+
*/
|
|
189
|
+
extractTxBodyHash(txCbor) {
|
|
190
|
+
try {
|
|
191
|
+
// Use harmoniclabs for consistent hash computation
|
|
192
|
+
const txBytes = (0, uint8array_utils_1.fromHex)(txCbor);
|
|
193
|
+
const tx = cardano_ledger_ts_1.Tx.fromCbor(txBytes);
|
|
194
|
+
return tx.hash.toString();
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
throw new errors_1.BackendError(`Failed to extract transaction body hash: ${error.message}`, 400, error_codes_1.ERROR_CODES.INVALID_INPUT);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a transaction is signed (has witnesses)
|
|
202
|
+
*
|
|
203
|
+
* @param txCbor - Transaction CBOR
|
|
204
|
+
* @returns true if transaction has at least one witness
|
|
205
|
+
*/
|
|
206
|
+
isSigned(txCbor) {
|
|
207
|
+
try {
|
|
208
|
+
const txBytes = Buffer.from(txCbor, 'hex');
|
|
209
|
+
const tx = CSL.Transaction.from_bytes(txBytes);
|
|
210
|
+
const witnessSet = tx.witness_set();
|
|
211
|
+
const vkeyWitnesses = witnessSet.vkeys();
|
|
212
|
+
return vkeyWitnesses !== undefined && vkeyWitnesses.len() > 0;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get witness count from transaction
|
|
220
|
+
*
|
|
221
|
+
* @param txCbor - Transaction CBOR
|
|
222
|
+
* @returns Number of witnesses
|
|
223
|
+
*/
|
|
224
|
+
getWitnessCount(txCbor) {
|
|
225
|
+
try {
|
|
226
|
+
const txBytes = Buffer.from(txCbor, 'hex');
|
|
227
|
+
const tx = CSL.Transaction.from_bytes(txBytes);
|
|
228
|
+
const witnessSet = tx.witness_set();
|
|
229
|
+
const vkeyWitnesses = witnessSet.vkeys();
|
|
230
|
+
return vkeyWitnesses ? vkeyWitnesses.len() : 0;
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.SignatureVerifier = SignatureVerifier;
|
|
238
|
+
// Singleton instance
|
|
239
|
+
let verifierInstance = null;
|
|
240
|
+
/**
|
|
241
|
+
* Get the singleton SignatureVerifier instance
|
|
242
|
+
*/
|
|
243
|
+
function getSignatureVerifier() {
|
|
244
|
+
if (!verifierInstance) {
|
|
245
|
+
verifierInstance = new SignatureVerifier();
|
|
246
|
+
}
|
|
247
|
+
return verifierInstance;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=signature-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature-verifier.js","sourceRoot":"","sources":["signature-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildooor-tx.d.ts","sourceRoot":"","sources":["buildooor-tx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,cAAc,EAAE,aAAa,EAAkC,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AA0BhM,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKlD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,SAAgB,IAAI,wBAAwB;IAC5C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAiB;IAEtC;;;;OAIG;IACU,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlG;;;;;OAKG;IACU,wBAAwB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA+D1F,oCAAoC,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA8DtG,kCAAkC,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA4EpG,4BAA4B,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAqLlG,mCAAmC,CAAC,GAAG,EAAE,yBAAyB,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA0K7H;;;;OAIG;IACH,OAAO,CAAC,qCAAqC;IAiB7C;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAsBnC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IA+BtC;;;;OAIG;IACH,OAAO,CAAC,mCAAmC;IAsB3C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CA0B3B"}
|