@dynamic-labs-wallet/btc 1.0.106 → 1.0.107
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/index.cjs +21 -19
- package/index.esm.js +22 -20
- package/package.json +3 -3
- package/src/client/client.d.ts +11 -1
- package/src/client/client.d.ts.map +1 -1
package/index.cjs
CHANGED
|
@@ -490,6 +490,14 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
490
490
|
/**
|
|
491
491
|
* Sign a Bitcoin Transaction (PSBT)
|
|
492
492
|
*
|
|
493
|
+
* ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
|
|
494
|
+
* hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
|
|
495
|
+
* is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
|
|
496
|
+
* commitment, and is a canonical multisig containing this wallet's public key.
|
|
497
|
+
* Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
|
|
498
|
+
* PSBT carries this wallet's partialSig and is NOT finalized — remaining
|
|
499
|
+
* co-signers add their signatures before finalizing.
|
|
500
|
+
*
|
|
493
501
|
* @param transaction - The PSBT to sign in hex format
|
|
494
502
|
* @param senderAddress - The address of the sender
|
|
495
503
|
* @param password - The password to use for the transaction
|
|
@@ -503,7 +511,7 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
503
511
|
* from the PSBT; this only restricts which declared types are accepted. An empty
|
|
504
512
|
* array permits nothing; omit the parameter to permit any declared type
|
|
505
513
|
* @returns The signed PSBT
|
|
506
|
-
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash }) {
|
|
514
|
+
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
|
|
507
515
|
try {
|
|
508
516
|
await this.verifyPassword({
|
|
509
517
|
accountAddress: senderAddress,
|
|
@@ -548,32 +556,29 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
548
556
|
}
|
|
549
557
|
const pubKey = btcUtils.normalizePublicKey(derivedPublicKey, addressType);
|
|
550
558
|
const tx = psbt.__CACHE.__TX;
|
|
551
|
-
|
|
559
|
+
const isTaproot = addressType === browser.BitcoinAddressType.TAPROOT;
|
|
560
|
+
// Filter inputs to only sign those that belong to the current address.
|
|
561
|
+
// P2WSH (multisig) inputs are opt-in: matched only when the caller
|
|
562
|
+
// allowlisted the witnessScript and it contains this wallet's key —
|
|
563
|
+
// ECDSA wallets only.
|
|
564
|
+
const walletPubKey = isTaproot ? undefined : pubKey;
|
|
565
|
+
const p2wshAllowlist = isTaproot ? undefined : allowedWitnessScripts;
|
|
552
566
|
let inputsToSign = psbt.data.inputs.map((input, i)=>({
|
|
553
567
|
input,
|
|
554
568
|
index: i
|
|
555
|
-
})).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, senderAddress, network));
|
|
569
|
+
})).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, senderAddress, network, walletPubKey, p2wshAllowlist));
|
|
556
570
|
this.logger.debug('[BTC Client] signTransaction - Filtering inputs', {
|
|
557
571
|
totalInputs: psbt.data.inputs.length,
|
|
558
572
|
inputsToSign: inputsToSign.length,
|
|
559
573
|
senderAddress
|
|
560
574
|
});
|
|
561
|
-
|
|
562
|
-
const walletOwnedIndexSet = new Set(inputsToSign.map(({ index })=>index));
|
|
563
|
-
const invalidIndexes = signingIndexes.filter((i)=>!walletOwnedIndexSet.has(i));
|
|
564
|
-
if (invalidIndexes.length > 0) {
|
|
565
|
-
throw new Error(`signingIndexes contains indexes that do not belong to the signing address: ${invalidIndexes.join(', ')}`);
|
|
566
|
-
}
|
|
567
|
-
const requestedIndexSet = new Set(signingIndexes);
|
|
568
|
-
inputsToSign = inputsToSign.filter(({ index })=>requestedIndexSet.has(index));
|
|
569
|
-
}
|
|
575
|
+
inputsToSign = btcUtils.filterInputsBySigningIndexes(inputsToSign, signingIndexes);
|
|
570
576
|
if (inputsToSign.length === 0) {
|
|
571
577
|
this.logger.warn('[BTC Client] signTransaction - No inputs found for address', {
|
|
572
578
|
senderAddress,
|
|
573
579
|
totalInputs: psbt.data.inputs.length
|
|
574
580
|
});
|
|
575
581
|
}
|
|
576
|
-
const isTaproot = addressType === browser.BitcoinAddressType.TAPROOT;
|
|
577
582
|
btcUtils.assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
|
|
578
583
|
if (isTaproot) {
|
|
579
584
|
const tweak = btcUtils.calculateTaprootTweak(pubKey);
|
|
@@ -623,12 +628,9 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
623
628
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
624
629
|
}
|
|
625
630
|
const { script, value } = input.witnessUtxo;
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
});
|
|
630
|
-
const scriptCode = p2pkh.output;
|
|
631
|
-
if (!scriptCode) throw new Error('Failed to generate scriptCode');
|
|
631
|
+
// Shared with extractPsbtSighashes; re-verifies the P2WSH
|
|
632
|
+
// commitment at the signer, independent of the ownership filter.
|
|
633
|
+
const scriptCode = btcUtils.getSegwitV0ScriptCode(input, script, i, btcUtils.getBitcoinNetwork(network));
|
|
632
634
|
const sigHashType = btcUtils.getSigHashType(input, false);
|
|
633
635
|
const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
|
|
634
636
|
const signature = await this.sign({
|
package/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DynamicWalletClient, BitcoinNetwork, BitcoinAddressType, getMPCChainConfig, ERROR_CREATE_WALLET_ACCOUNT, ERROR_PASSWORD_MISMATCH, ERROR_MULTIPLE_WALLETS_PER_CHAIN, ERROR_ACCOUNT_ADDRESS_REQUIRED, ERROR_SIGN_MESSAGE, ERROR_IMPORT_PRIVATE_KEY } from '@dynamic-labs-wallet/browser';
|
|
2
2
|
import * as bitcoin from 'bitcoinjs-lib';
|
|
3
3
|
import ecc from '@bitcoinerlab/secp256k1';
|
|
4
|
-
import { extractPublicKeyHex, normalizePublicKey, publicKeyToBitcoinAddress, getAddressTypeFromDerivationPath, calculateBip322Hash, calculateTaprootTweak, encodeBip322Signature, wifToPrivateKey, getPublicKeyFromPrivateKey, privateKeyToWIF, doesInputBelongToAddress, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getBitcoinNetwork, convertSignatureToDER, getFeeRates, getUTXOs, selectUTXOs, getDefaultRpcUrl, initEccLib } from '@dynamic-labs-wallet/btc-utils';
|
|
4
|
+
import { extractPublicKeyHex, normalizePublicKey, publicKeyToBitcoinAddress, getAddressTypeFromDerivationPath, calculateBip322Hash, calculateTaprootTweak, encodeBip322Signature, wifToPrivateKey, getPublicKeyFromPrivateKey, privateKeyToWIF, doesInputBelongToAddress, filterInputsBySigningIndexes, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getSegwitV0ScriptCode, getBitcoinNetwork, convertSignatureToDER, getFeeRates, getUTXOs, selectUTXOs, getDefaultRpcUrl, initEccLib } from '@dynamic-labs-wallet/btc-utils';
|
|
5
5
|
|
|
6
6
|
function _extends() {
|
|
7
7
|
_extends = Object.assign || function assign(target) {
|
|
@@ -469,6 +469,14 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
469
469
|
/**
|
|
470
470
|
* Sign a Bitcoin Transaction (PSBT)
|
|
471
471
|
*
|
|
472
|
+
* ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
|
|
473
|
+
* hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
|
|
474
|
+
* is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
|
|
475
|
+
* commitment, and is a canonical multisig containing this wallet's public key.
|
|
476
|
+
* Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
|
|
477
|
+
* PSBT carries this wallet's partialSig and is NOT finalized — remaining
|
|
478
|
+
* co-signers add their signatures before finalizing.
|
|
479
|
+
*
|
|
472
480
|
* @param transaction - The PSBT to sign in hex format
|
|
473
481
|
* @param senderAddress - The address of the sender
|
|
474
482
|
* @param password - The password to use for the transaction
|
|
@@ -482,7 +490,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
482
490
|
* from the PSBT; this only restricts which declared types are accepted. An empty
|
|
483
491
|
* array permits nothing; omit the parameter to permit any declared type
|
|
484
492
|
* @returns The signed PSBT
|
|
485
|
-
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash }) {
|
|
493
|
+
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
|
|
486
494
|
try {
|
|
487
495
|
await this.verifyPassword({
|
|
488
496
|
accountAddress: senderAddress,
|
|
@@ -527,32 +535,29 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
527
535
|
}
|
|
528
536
|
const pubKey = normalizePublicKey(derivedPublicKey, addressType);
|
|
529
537
|
const tx = psbt.__CACHE.__TX;
|
|
530
|
-
|
|
538
|
+
const isTaproot = addressType === BitcoinAddressType.TAPROOT;
|
|
539
|
+
// Filter inputs to only sign those that belong to the current address.
|
|
540
|
+
// P2WSH (multisig) inputs are opt-in: matched only when the caller
|
|
541
|
+
// allowlisted the witnessScript and it contains this wallet's key —
|
|
542
|
+
// ECDSA wallets only.
|
|
543
|
+
const walletPubKey = isTaproot ? undefined : pubKey;
|
|
544
|
+
const p2wshAllowlist = isTaproot ? undefined : allowedWitnessScripts;
|
|
531
545
|
let inputsToSign = psbt.data.inputs.map((input, i)=>({
|
|
532
546
|
input,
|
|
533
547
|
index: i
|
|
534
|
-
})).filter(({ input })=>doesInputBelongToAddress(input, senderAddress, network));
|
|
548
|
+
})).filter(({ input })=>doesInputBelongToAddress(input, senderAddress, network, walletPubKey, p2wshAllowlist));
|
|
535
549
|
this.logger.debug('[BTC Client] signTransaction - Filtering inputs', {
|
|
536
550
|
totalInputs: psbt.data.inputs.length,
|
|
537
551
|
inputsToSign: inputsToSign.length,
|
|
538
552
|
senderAddress
|
|
539
553
|
});
|
|
540
|
-
|
|
541
|
-
const walletOwnedIndexSet = new Set(inputsToSign.map(({ index })=>index));
|
|
542
|
-
const invalidIndexes = signingIndexes.filter((i)=>!walletOwnedIndexSet.has(i));
|
|
543
|
-
if (invalidIndexes.length > 0) {
|
|
544
|
-
throw new Error(`signingIndexes contains indexes that do not belong to the signing address: ${invalidIndexes.join(', ')}`);
|
|
545
|
-
}
|
|
546
|
-
const requestedIndexSet = new Set(signingIndexes);
|
|
547
|
-
inputsToSign = inputsToSign.filter(({ index })=>requestedIndexSet.has(index));
|
|
548
|
-
}
|
|
554
|
+
inputsToSign = filterInputsBySigningIndexes(inputsToSign, signingIndexes);
|
|
549
555
|
if (inputsToSign.length === 0) {
|
|
550
556
|
this.logger.warn('[BTC Client] signTransaction - No inputs found for address', {
|
|
551
557
|
senderAddress,
|
|
552
558
|
totalInputs: psbt.data.inputs.length
|
|
553
559
|
});
|
|
554
560
|
}
|
|
555
|
-
const isTaproot = addressType === BitcoinAddressType.TAPROOT;
|
|
556
561
|
assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
|
|
557
562
|
if (isTaproot) {
|
|
558
563
|
const tweak = calculateTaprootTweak(pubKey);
|
|
@@ -602,12 +607,9 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
602
607
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
603
608
|
}
|
|
604
609
|
const { script, value } = input.witnessUtxo;
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
});
|
|
609
|
-
const scriptCode = p2pkh.output;
|
|
610
|
-
if (!scriptCode) throw new Error('Failed to generate scriptCode');
|
|
610
|
+
// Shared with extractPsbtSighashes; re-verifies the P2WSH
|
|
611
|
+
// commitment at the signer, independent of the ownership filter.
|
|
612
|
+
const scriptCode = getSegwitV0ScriptCode(input, script, i, getBitcoinNetwork(network));
|
|
611
613
|
const sigHashType = getSigHashType(input, false);
|
|
612
614
|
const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
|
|
613
615
|
const signature = await this.sign({
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/btc",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.107",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@dynamic-labs/sdk-api-core": "^0.0.1093",
|
|
9
|
-
"@dynamic-labs-wallet/browser": "1.0.
|
|
10
|
-
"@dynamic-labs-wallet/btc-utils": "1.0.
|
|
9
|
+
"@dynamic-labs-wallet/browser": "1.0.107",
|
|
10
|
+
"@dynamic-labs-wallet/btc-utils": "1.0.107",
|
|
11
11
|
"@bitcoinerlab/secp256k1": "^1.2.0",
|
|
12
12
|
"bitcoinjs-lib": "^7.0.0"
|
|
13
13
|
},
|
package/src/client/client.d.ts
CHANGED
|
@@ -130,6 +130,14 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
130
130
|
/**
|
|
131
131
|
* Sign a Bitcoin Transaction (PSBT)
|
|
132
132
|
*
|
|
133
|
+
* ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
|
|
134
|
+
* hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
|
|
135
|
+
* is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
|
|
136
|
+
* commitment, and is a canonical multisig containing this wallet's public key.
|
|
137
|
+
* Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
|
|
138
|
+
* PSBT carries this wallet's partialSig and is NOT finalized — remaining
|
|
139
|
+
* co-signers add their signatures before finalizing.
|
|
140
|
+
*
|
|
133
141
|
* @param transaction - The PSBT to sign in hex format
|
|
134
142
|
* @param senderAddress - The address of the sender
|
|
135
143
|
* @param password - The password to use for the transaction
|
|
@@ -144,7 +152,7 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
144
152
|
* array permits nothing; omit the parameter to permit any declared type
|
|
145
153
|
* @returns The signed PSBT
|
|
146
154
|
*/
|
|
147
|
-
signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, }: {
|
|
155
|
+
signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts, }: {
|
|
148
156
|
transaction: string;
|
|
149
157
|
senderAddress: string;
|
|
150
158
|
network: BitcoinNetwork;
|
|
@@ -156,6 +164,8 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
156
164
|
onError?: (error: Error) => void;
|
|
157
165
|
signingIndexes?: number[];
|
|
158
166
|
allowedSighash?: number[];
|
|
167
|
+
/** Hex-encoded witnessScripts the wallet may co-sign (P2WSH opt-in). */
|
|
168
|
+
allowedWitnessScripts?: string[];
|
|
159
169
|
}): Promise<string>;
|
|
160
170
|
/**
|
|
161
171
|
* Creates a PSBT for a transaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EAQnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EAQnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AA+BrE,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;IAE3B;;;OAGG;gBACS,KAAK,EAAE,wBAAwB,EAAE,eAAe,CAAC,EAAE,kCAAkC;IAOjG;;;;;;;;OAQG;IACG,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,EACpB,OAAO,EACP,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,cAAc,GAAG,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;KACrF,CAAC;IAgHF;;;;;;;;;OASG;IACH,oBAAoB,CAAC,EACnB,YAAY,EACZ,WAAW,EACX,OAAO,GACR,EAAE;QACD,YAAY,EAAE,GAAG,CAAC;QAClB,WAAW,EAAE,kBAAkB,CAAC;QAChC,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;IAQ9B;;;;;;;;;;;OAWG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,OAAO,EACP,QAAoB,EACpB,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,OAAO,GACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,cAAc,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,OAAO,CAAC,EAAE,kBAAkB,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC;IAkHD;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,EACpB,eAAe,EACf,QAAQ,EACR,mBAAmB,GACpB,EAAE,8BAA8B,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAkDpB;;;;;;;;;;;OAWG;IACG,gBAAgB,CAAC,EACrB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,QAAoB,EACpB,OAAO,EACP,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,cAAc,GACf,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,4DAA4D;QAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,cAAc,GAAG,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;KACrF,CAAC;IA4HF;;;;;;OAMG;IACH,OAAO,CAAC,gCAAgC;IA4BxC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,eAAe,CAAC,EACpB,WAAW,EACX,aAAa,EACb,OAAO,EACP,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,OAAO,EACP,cAAc,EACd,cAAc,EACd,qBAAqB,GACtB,EAAE;QACD,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,cAAc,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,OAAO,CAAC,EAAE,kBAAkB,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,wEAAwE;QACxE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;KAClC,GAAG,OAAO,CAAC,MAAM,CAAC;IAoNnB;;;;;;;;OAQG;IACG,iBAAiB,CAAC,EACtB,eAAe,EACf,MAAM,EACN,aAAa,EACb,OAAO,EACP,YAAuB,GACxB,EAAE;QACD,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,cAAc,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;KAC3C,GAAG,OAAO,CAAC,MAAM,CAAC;IAwGnB;;;;;OAKG;YACW,QAAQ;IAWtB;;;OAGG;IACG,iBAAiB;CAKxB"}
|