@bitgo-beta/sdk-coin-flrp 1.0.1-beta.64 → 1.0.1-beta.641
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/src/flrp.d.ts +34 -17
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +139 -78
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +43 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +150 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +42 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +227 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +34 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +192 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +38 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +220 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +12 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +30 -41
- package/dist/src/lib/atomicTransactionBuilder.d.ts +81 -70
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +220 -267
- package/dist/src/lib/iface.d.ts +73 -55
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +20 -14
- package/dist/src/lib/index.d.ts +4 -3
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +10 -7
- package/dist/src/lib/keyPair.d.ts +5 -5
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +17 -9
- package/dist/src/lib/permissionlessDelegatorTxBuilder.d.ts +140 -0
- package/dist/src/lib/permissionlessDelegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessDelegatorTxBuilder.js +402 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +27 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +83 -205
- package/dist/src/lib/transaction.d.ts +34 -64
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +392 -194
- package/dist/src/lib/transactionBuilder.d.ts +71 -41
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +146 -85
- package/dist/src/lib/transactionBuilderFactory.d.ts +56 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +141 -71
- package/dist/src/lib/utils.d.ts +137 -148
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +365 -330
- package/dist/test/resources/account.d.ts +102 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +100 -0
- package/dist/test/resources/transactionData/delegatorTx.d.ts +83 -0
- package/dist/test/resources/transactionData/delegatorTx.d.ts.map +1 -0
- package/dist/test/resources/transactionData/delegatorTx.js +77 -0
- package/dist/test/resources/transactionData/exportInC.d.ts +50 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +58 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +60 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +100 -0
- package/dist/test/resources/transactionData/importInC.d.ts +56 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +120 -0
- package/dist/test/resources/transactionData/importInP.d.ts +66 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +84 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.d.ts +86 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.d.ts.map +1 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.js +101 -0
- package/dist/test/unit/flrp.js +874 -60
- package/dist/test/unit/lib/exportInCTxBuilder.js +232 -508
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +424 -351
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +260 -235
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +261 -478
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/permissionlessDelegatorTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/permissionlessDelegatorTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/permissionlessDelegatorTxBuilder.js +1006 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +83 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +90 -0
- package/dist/test/unit/lib/utils.js +691 -206
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +20 -11
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -27
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -170
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -227
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -199
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -120
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
package/dist/src/flrp.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseCoin as StaticsBaseCoin, CoinFamily } from '@bitgo-beta/statics';
|
|
2
|
-
import { BaseCoin, BitGoBase, KeyPair,
|
|
2
|
+
import { AuditDecryptedKeyParams, BaseCoin, BitGoBase, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, ParseTransactionOptions, SignedTransaction, VerifyAddressOptions, ITransactionRecipient } from '@bitgo-beta/sdk-core';
|
|
3
3
|
import * as FlrpLib from './lib';
|
|
4
|
-
import {
|
|
4
|
+
import { FlrpEntry, FlrpExplainTransactionOptions, FlrpSignTransactionOptions, FlrpTransactionParams, FlrpVerifyTransactionOptions } from './lib/iface';
|
|
5
5
|
export declare class Flrp extends BaseCoin {
|
|
6
6
|
protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;
|
|
7
7
|
constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
|
|
@@ -12,13 +12,11 @@ export declare class Flrp extends BaseCoin {
|
|
|
12
12
|
getBaseFactor(): string | number;
|
|
13
13
|
/** inherited doc */
|
|
14
14
|
getDefaultMultisigType(): MultisigType;
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*/
|
|
21
|
-
validateStakingTx(stakingOptions: FlrpTransactionStakingOptions, explainedTx: FlrpLib.TransactionExplanation): void;
|
|
15
|
+
/** @inheritdoc */
|
|
16
|
+
supportsTss(): boolean;
|
|
17
|
+
/** @inheritdoc */
|
|
18
|
+
getMPCAlgorithm(): MPCAlgorithm;
|
|
19
|
+
verifyTransaction(params: FlrpVerifyTransactionOptions): Promise<boolean>;
|
|
22
20
|
/**
|
|
23
21
|
* Check if export txn is valid, based on expected tx params.
|
|
24
22
|
*
|
|
@@ -29,11 +27,19 @@ export declare class Flrp extends BaseCoin {
|
|
|
29
27
|
/**
|
|
30
28
|
* Check if import txn into P is valid, based on expected tx params.
|
|
31
29
|
*
|
|
32
|
-
* @param {
|
|
30
|
+
* @param {FlrpEntry[]} explainedTxInputs tx inputs (unspents to be imported)
|
|
33
31
|
* @param {FlrpTransactionParams} txParams expected tx info to check against
|
|
34
32
|
*/
|
|
35
|
-
validateImportTx(explainedTxInputs:
|
|
36
|
-
|
|
33
|
+
validateImportTx(explainedTxInputs: FlrpEntry[], txParams: FlrpTransactionParams): void;
|
|
34
|
+
/**
|
|
35
|
+
* Validate AddPermissionlessDelegator transaction parameters.
|
|
36
|
+
* Validates both expected txParams and the parsed explainedTx for consistency.
|
|
37
|
+
*
|
|
38
|
+
* @param {FlrpTransactionParams} txParams - Expected transaction parameters
|
|
39
|
+
* @param {FlrpLib.TransactionExplanation} explainedTx - Parsed transaction explanation
|
|
40
|
+
*/
|
|
41
|
+
validateDelegationTx(txParams: FlrpTransactionParams, explainedTx: FlrpLib.TransactionExplanation): void;
|
|
42
|
+
private getBuilder;
|
|
37
43
|
/**
|
|
38
44
|
* Check if address is valid, then make sure it matches the root address.
|
|
39
45
|
*
|
|
@@ -72,19 +78,30 @@ export declare class Flrp extends BaseCoin {
|
|
|
72
78
|
isValidPrv(prv: string): boolean;
|
|
73
79
|
isValidAddress(address: string | string[]): boolean;
|
|
74
80
|
/**
|
|
75
|
-
*
|
|
81
|
+
* Get the raw bytes that need to be signed by the MPC ceremony.
|
|
82
|
+
* MPC.sign() internally SHA-256 hashes, so return raw unsigned tx bytes.
|
|
83
|
+
*/
|
|
84
|
+
getSignablePayload(txHex: string): Promise<Buffer>;
|
|
85
|
+
/**
|
|
86
|
+
* Inject an MPC-produced signature into an unsigned transaction.
|
|
87
|
+
* @param txHex - Unsigned transaction hex
|
|
88
|
+
* @param signature - 65-byte ECDSA signature (r || s || recovery)
|
|
89
|
+
* @returns Signed transaction hex
|
|
90
|
+
*/
|
|
91
|
+
addSignatureToTransaction(txHex: string, signature: Buffer): Promise<string>;
|
|
92
|
+
/**
|
|
93
|
+
* Signs Avaxp transaction
|
|
76
94
|
*/
|
|
77
95
|
signTransaction(params: FlrpSignTransactionOptions): Promise<SignedTransaction>;
|
|
78
96
|
parseTransaction(params: ParseTransactionOptions): Promise<ParsedTransaction>;
|
|
79
97
|
/**
|
|
80
|
-
* Explain a
|
|
98
|
+
* Explain a Avaxp transaction from txHex
|
|
81
99
|
* @param params
|
|
82
100
|
* @param callback
|
|
83
101
|
*/
|
|
84
|
-
explainTransaction(params:
|
|
85
|
-
recoverySignature(
|
|
102
|
+
explainTransaction(params: FlrpExplainTransactionOptions): Promise<FlrpLib.TransactionExplanation>;
|
|
103
|
+
recoverySignature(messageHash: Buffer, signature: Buffer): Buffer;
|
|
86
104
|
signMessage(key: KeyPair, message: string | Buffer): Promise<Buffer>;
|
|
87
|
-
private getBuilder;
|
|
88
105
|
/** @inheritDoc */
|
|
89
106
|
auditDecryptedKey(params: AuditDecryptedKeyParams): void;
|
|
90
107
|
}
|
package/dist/src/flrp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flrp.d.ts","sourceRoot":"","sources":["../../src/flrp.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"flrp.d.ts","sourceRoot":"","sources":["../../src/flrp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/flrp.js
CHANGED
|
@@ -42,6 +42,7 @@ const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
|
42
42
|
const FlrpLib = __importStar(require("./lib"));
|
|
43
43
|
const utils_1 = __importDefault(require("./lib/utils"));
|
|
44
44
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
45
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
45
46
|
class Flrp extends sdk_core_1.BaseCoin {
|
|
46
47
|
constructor(bitgo, staticsCoin) {
|
|
47
48
|
super(bitgo);
|
|
@@ -69,60 +70,13 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
69
70
|
getDefaultMultisigType() {
|
|
70
71
|
return sdk_core_1.multisigTypes.onchain;
|
|
71
72
|
}
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
* @param {FlrpTransactionStakingOptions} stakingOptions expected staking params to check against
|
|
76
|
-
* @param {FlrpLib.TransactionExplanation} explainedTx explained staking transaction
|
|
77
|
-
*/
|
|
78
|
-
validateStakingTx(stakingOptions, explainedTx) {
|
|
79
|
-
const filteredRecipients = [{ address: stakingOptions.nodeID, amount: stakingOptions.amount }];
|
|
80
|
-
const filteredOutputs = explainedTx.outputs.map((output) => utils_1.default.pick(output, ['address', 'amount']));
|
|
81
|
-
if (!utils_1.default.isEqual(filteredOutputs, filteredRecipients)) {
|
|
82
|
-
throw new Error('Tx outputs does not match with expected txParams');
|
|
83
|
-
}
|
|
84
|
-
if (stakingOptions?.amount !== explainedTx.outputAmount) {
|
|
85
|
-
throw new Error('Tx total amount does not match with expected total amount field');
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Check if export txn is valid, based on expected tx params.
|
|
90
|
-
*
|
|
91
|
-
* @param {ITransactionRecipient[]} recipients expected recipients and info
|
|
92
|
-
* @param {FlrpLib.TransactionExplanation} explainedTx explained export transaction
|
|
93
|
-
*/
|
|
94
|
-
validateExportTx(recipients, explainedTx) {
|
|
95
|
-
if (recipients.length !== 1 || explainedTx.outputs.length !== 1) {
|
|
96
|
-
throw new Error('Export Tx requires one recipient');
|
|
97
|
-
}
|
|
98
|
-
const maxImportFee = this._staticsCoin.network.maxImportFee || '0';
|
|
99
|
-
const recipientAmount = new bignumber_js_1.default(recipients[0].amount);
|
|
100
|
-
if (recipientAmount.isGreaterThan(explainedTx.outputAmount) ||
|
|
101
|
-
recipientAmount.plus(maxImportFee).isLessThan(explainedTx.outputAmount)) {
|
|
102
|
-
throw new Error(`Tx total amount ${explainedTx.outputAmount} does not match with expected total amount field ${recipientAmount} and max import fee ${maxImportFee}`);
|
|
103
|
-
}
|
|
104
|
-
if (explainedTx.outputs && !utils_1.default.isValidAddress(explainedTx.outputs[0].address)) {
|
|
105
|
-
throw new Error(`Invalid P-chain address ${explainedTx.outputs[0].address}`);
|
|
106
|
-
}
|
|
73
|
+
/** @inheritdoc */
|
|
74
|
+
supportsTss() {
|
|
75
|
+
return true;
|
|
107
76
|
}
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* @param {FlrpLib.FlrpEntry[]} explainedTxInputs tx inputs (unspents to be imported)
|
|
112
|
-
* @param {FlrpTransactionParams} txParams expected tx info to check against
|
|
113
|
-
*/
|
|
114
|
-
validateImportTx(explainedTxInputs, txParams) {
|
|
115
|
-
if (txParams.unspents) {
|
|
116
|
-
if (explainedTxInputs.length !== txParams.unspents.length) {
|
|
117
|
-
throw new Error(`Expected ${txParams.unspents.length} UTXOs, transaction had ${explainedTxInputs.length}`);
|
|
118
|
-
}
|
|
119
|
-
const unspents = new Set(txParams.unspents);
|
|
120
|
-
for (const unspent of explainedTxInputs) {
|
|
121
|
-
if (!unspents.has(unspent.id)) {
|
|
122
|
-
throw new Error(`Transaction should not contain the UTXO: ${unspent.id}`);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
77
|
+
/** @inheritdoc */
|
|
78
|
+
getMPCAlgorithm() {
|
|
79
|
+
return 'ecdsa';
|
|
126
80
|
}
|
|
127
81
|
async verifyTransaction(params) {
|
|
128
82
|
const txHex = params.txPrebuild && params.txPrebuild.txHex;
|
|
@@ -135,24 +89,21 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
135
89
|
tx = await txBuilder.build();
|
|
136
90
|
}
|
|
137
91
|
catch (error) {
|
|
138
|
-
throw new Error(
|
|
92
|
+
throw new Error(`Invalid transaction: ${error.message}`);
|
|
139
93
|
}
|
|
140
94
|
const explainedTx = tx.explainTransaction();
|
|
141
|
-
const
|
|
142
|
-
//
|
|
143
|
-
|
|
95
|
+
const type = params.txParams.type;
|
|
96
|
+
// 'stake' is the intent-type alias for AddPermissionlessDelegator; normalize it
|
|
97
|
+
// so the TransactionType enum lookup succeeds.
|
|
98
|
+
const normalizedType = type === 'stake' ? 'AddPermissionlessDelegator' : type;
|
|
99
|
+
// When type is provided, verify it matches the parsed transaction.
|
|
100
|
+
// When type is not provided (MPC/TSS intent flow where buildParams are unavailable),
|
|
101
|
+
// skip the type match check and rely on explainedTx.type from the parsed hex —
|
|
102
|
+
// the transaction was built by wallet-platform and the hex is the source of truth.
|
|
103
|
+
if (normalizedType && normalizedType !== 'ImportToC' && explainedTx.type !== sdk_core_1.TransactionType[normalizedType]) {
|
|
144
104
|
throw new Error('Tx type does not match with expected txParams type');
|
|
145
105
|
}
|
|
146
106
|
switch (explainedTx.type) {
|
|
147
|
-
// @deprecated
|
|
148
|
-
case sdk_core_1.TransactionType.AddDelegator:
|
|
149
|
-
case sdk_core_1.TransactionType.AddValidator:
|
|
150
|
-
case sdk_core_1.TransactionType.AddPermissionlessDelegator:
|
|
151
|
-
case sdk_core_1.TransactionType.AddPermissionlessValidator:
|
|
152
|
-
if (stakingOptions) {
|
|
153
|
-
this.validateStakingTx(stakingOptions, explainedTx);
|
|
154
|
-
}
|
|
155
|
-
break;
|
|
156
107
|
case sdk_core_1.TransactionType.Export:
|
|
157
108
|
if (!params.txParams.recipients || params.txParams.recipients?.length !== 1) {
|
|
158
109
|
throw new Error('Export Tx requires a recipient');
|
|
@@ -179,11 +130,96 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
179
130
|
this.validateImportTx(explainedTx.inputs, params.txParams);
|
|
180
131
|
}
|
|
181
132
|
break;
|
|
133
|
+
case sdk_core_1.TransactionType.AddPermissionlessDelegator:
|
|
134
|
+
if (params.txParams.stakingOptions) {
|
|
135
|
+
this.validateDelegationTx(params.txParams, explainedTx);
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
182
138
|
default:
|
|
183
139
|
throw new Error('Tx type is not supported yet');
|
|
184
140
|
}
|
|
185
141
|
return true;
|
|
186
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if export txn is valid, based on expected tx params.
|
|
145
|
+
*
|
|
146
|
+
* @param {ITransactionRecipient[]} recipients expected recipients and info
|
|
147
|
+
* @param {FlrpLib.TransactionExplanation} explainedTx explained export transaction
|
|
148
|
+
*/
|
|
149
|
+
validateExportTx(recipients, explainedTx) {
|
|
150
|
+
if (recipients.length !== 1 || explainedTx.outputs.length !== 1) {
|
|
151
|
+
throw new Error('Export Tx requires one recipient');
|
|
152
|
+
}
|
|
153
|
+
const maxImportFee = this._staticsCoin.network.maxImportFee;
|
|
154
|
+
const recipientAmount = new bignumber_js_1.default(recipients[0].amount);
|
|
155
|
+
if (recipientAmount.isGreaterThan(explainedTx.outputAmount) ||
|
|
156
|
+
recipientAmount.plus(maxImportFee).isLessThan(explainedTx.outputAmount)) {
|
|
157
|
+
throw new Error(`Tx total amount ${explainedTx.outputAmount} does not match with expected total amount field ${recipientAmount} and max import fee ${maxImportFee}`);
|
|
158
|
+
}
|
|
159
|
+
if (explainedTx.outputs && !utils_1.default.isValidAddress(explainedTx.outputs[0].address)) {
|
|
160
|
+
throw new Error(`Invalid P-chain address ${explainedTx.outputs[0].address}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if import txn into P is valid, based on expected tx params.
|
|
165
|
+
*
|
|
166
|
+
* @param {FlrpEntry[]} explainedTxInputs tx inputs (unspents to be imported)
|
|
167
|
+
* @param {FlrpTransactionParams} txParams expected tx info to check against
|
|
168
|
+
*/
|
|
169
|
+
validateImportTx(explainedTxInputs, txParams) {
|
|
170
|
+
if (txParams.unspents) {
|
|
171
|
+
if (explainedTxInputs.length !== txParams.unspents.length) {
|
|
172
|
+
throw new Error(`Expected ${txParams.unspents.length} UTXOs, transaction had ${explainedTxInputs.length}`);
|
|
173
|
+
}
|
|
174
|
+
const unspents = new Set(txParams.unspents);
|
|
175
|
+
for (const unspent of explainedTxInputs) {
|
|
176
|
+
if (!unspents.has(unspent.id)) {
|
|
177
|
+
throw new Error(`Transaction should not contain the UTXO: ${unspent.id}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate AddPermissionlessDelegator transaction parameters.
|
|
184
|
+
* Validates both expected txParams and the parsed explainedTx for consistency.
|
|
185
|
+
*
|
|
186
|
+
* @param {FlrpTransactionParams} txParams - Expected transaction parameters
|
|
187
|
+
* @param {FlrpLib.TransactionExplanation} explainedTx - Parsed transaction explanation
|
|
188
|
+
*/
|
|
189
|
+
validateDelegationTx(txParams, explainedTx) {
|
|
190
|
+
if (!txParams.stakingOptions) {
|
|
191
|
+
throw new Error('Delegation transaction requires stakingOptions');
|
|
192
|
+
}
|
|
193
|
+
const { nodeID, amount, durationSeconds, rewardAddress } = txParams.stakingOptions;
|
|
194
|
+
if (!nodeID) {
|
|
195
|
+
throw new Error('Delegation transaction requires nodeID');
|
|
196
|
+
}
|
|
197
|
+
if (!amount) {
|
|
198
|
+
throw new Error('Delegation transaction requires amount');
|
|
199
|
+
}
|
|
200
|
+
if (!durationSeconds) {
|
|
201
|
+
throw new Error('Delegation transaction requires durationSeconds');
|
|
202
|
+
}
|
|
203
|
+
if (!rewardAddress) {
|
|
204
|
+
throw new Error('Delegation transaction requires rewardAddress');
|
|
205
|
+
}
|
|
206
|
+
// Validate nodeID format using utility method
|
|
207
|
+
if (!utils_1.default.isValidNodeID(nodeID)) {
|
|
208
|
+
throw new Error(`Invalid nodeID format: ${nodeID}`);
|
|
209
|
+
}
|
|
210
|
+
// Validate that the parsed transaction's output amount matches the expected staking amount
|
|
211
|
+
// The outputAmount in explainedTx represents the total stake amount in the transaction
|
|
212
|
+
if (explainedTx.outputAmount) {
|
|
213
|
+
const expectedAmount = new bignumber_js_1.default(amount);
|
|
214
|
+
const actualAmount = new bignumber_js_1.default(explainedTx.outputAmount);
|
|
215
|
+
if (!expectedAmount.isEqualTo(actualAmount)) {
|
|
216
|
+
throw new Error(`Delegation amount mismatch: expected ${amount}, transaction has ${explainedTx.outputAmount}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
getBuilder() {
|
|
221
|
+
return new FlrpLib.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
|
|
222
|
+
}
|
|
187
223
|
/**
|
|
188
224
|
* Check if address is valid, then make sure it matches the root address.
|
|
189
225
|
*
|
|
@@ -195,11 +231,19 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
195
231
|
if (!this.isValidAddress(address)) {
|
|
196
232
|
throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
|
|
197
233
|
}
|
|
234
|
+
// multisig addresses are separated by ~
|
|
235
|
+
const splitAddresses = address.split('~');
|
|
236
|
+
// MPC/TSS: single address derived from common keychain
|
|
237
|
+
if (splitAddresses.length === 1 && keychains?.length === 1) {
|
|
238
|
+
const expectedAddr = new FlrpLib.KeyPair({ pub: keychains[0].pub }).getAddress(this._staticsCoin.network.type);
|
|
239
|
+
if (expectedAddr !== address) {
|
|
240
|
+
throw new sdk_core_1.UnexpectedAddressError(`address validation failure: ${address} is not of this wallet`);
|
|
241
|
+
}
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
198
244
|
if (!keychains || keychains.length !== 3) {
|
|
199
245
|
throw new Error('Invalid keychains');
|
|
200
246
|
}
|
|
201
|
-
// multisig addresses are separated by ~
|
|
202
|
-
const splitAddresses = address.split('~');
|
|
203
247
|
// derive addresses from keychain
|
|
204
248
|
const unlockAddresses = keychains.map((keychain) => new FlrpLib.KeyPair({ pub: keychain.pub }).getAddress(this._staticsCoin.network.type));
|
|
205
249
|
if (splitAddresses.length !== unlockAddresses.length) {
|
|
@@ -272,13 +316,34 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
272
316
|
return false;
|
|
273
317
|
}
|
|
274
318
|
// validate eth address for cross-chain txs to c-chain
|
|
275
|
-
if (typeof address === 'string' &&
|
|
319
|
+
if (typeof address === 'string' && (0, ethereumjs_util_1.isValidAddress)(address)) {
|
|
276
320
|
return true;
|
|
277
321
|
}
|
|
278
322
|
return FlrpLib.Utils.isValidAddress(address);
|
|
279
323
|
}
|
|
280
324
|
/**
|
|
281
|
-
*
|
|
325
|
+
* Get the raw bytes that need to be signed by the MPC ceremony.
|
|
326
|
+
* MPC.sign() internally SHA-256 hashes, so return raw unsigned tx bytes.
|
|
327
|
+
*/
|
|
328
|
+
async getSignablePayload(txHex) {
|
|
329
|
+
const txBuilder = this.getBuilder().from(txHex);
|
|
330
|
+
const tx = (await txBuilder.build());
|
|
331
|
+
return Buffer.from(tx.signablePayload);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Inject an MPC-produced signature into an unsigned transaction.
|
|
335
|
+
* @param txHex - Unsigned transaction hex
|
|
336
|
+
* @param signature - 65-byte ECDSA signature (r || s || recovery)
|
|
337
|
+
* @returns Signed transaction hex
|
|
338
|
+
*/
|
|
339
|
+
async addSignatureToTransaction(txHex, signature) {
|
|
340
|
+
const txBuilder = this.getBuilder().from(txHex);
|
|
341
|
+
const tx = await txBuilder.build();
|
|
342
|
+
tx.addExternalSignature(new Uint8Array(signature));
|
|
343
|
+
return tx.toBroadcastFormat();
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Signs Avaxp transaction
|
|
282
347
|
*/
|
|
283
348
|
async signTransaction(params) {
|
|
284
349
|
// deserialize raw transaction (note: fromAddress has onchain order)
|
|
@@ -299,7 +364,7 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
299
364
|
return {};
|
|
300
365
|
}
|
|
301
366
|
/**
|
|
302
|
-
* Explain a
|
|
367
|
+
* Explain a Avaxp transaction from txHex
|
|
303
368
|
* @param params
|
|
304
369
|
* @param callback
|
|
305
370
|
*/
|
|
@@ -317,8 +382,8 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
317
382
|
throw new Error(`Invalid transaction: ${e.message}`);
|
|
318
383
|
}
|
|
319
384
|
}
|
|
320
|
-
recoverySignature(
|
|
321
|
-
return FlrpLib.Utils.recoverySignature(
|
|
385
|
+
recoverySignature(messageHash, signature) {
|
|
386
|
+
return FlrpLib.Utils.recoverySignature(messageHash, signature);
|
|
322
387
|
}
|
|
323
388
|
async signMessage(key, message) {
|
|
324
389
|
const prv = new FlrpLib.KeyPair(key).getPrivateKey();
|
|
@@ -330,14 +395,10 @@ class Flrp extends sdk_core_1.BaseCoin {
|
|
|
330
395
|
}
|
|
331
396
|
return FlrpLib.Utils.createSignature(this._staticsCoin.network, message, prv);
|
|
332
397
|
}
|
|
333
|
-
getBuilder() {
|
|
334
|
-
return new FlrpLib.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
|
|
335
|
-
}
|
|
336
398
|
/** @inheritDoc */
|
|
337
399
|
auditDecryptedKey(params) {
|
|
338
|
-
/** https://bitgoinc.atlassian.net/browse/COIN-4213 */
|
|
339
400
|
throw new sdk_core_1.MethodNotImplementedError();
|
|
340
401
|
}
|
|
341
402
|
}
|
|
342
403
|
exports.Flrp = Flrp;
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxycC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mbHJwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFtRztBQUNuRyxtREFtQjhCO0FBQzlCLCtDQUFpQztBQVFqQyx3REFBZ0M7QUFDaEMsZ0VBQXFDO0FBRXJDLE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBR2hDLFlBQVksS0FBZ0IsRUFBRSxXQUF1QztRQUNuRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBQ0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUNELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsc0JBQXNCO1FBQ3BCLE9BQU8sd0JBQWEsQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENB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Q0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVksRUFBRSxPQUF3QjtRQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLHVCQUFZLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUF1QixFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksT0FBTyxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLE1BQStCO1FBQy9DLHNEQUFzRDtRQUN0RCxNQUFNLElBQUksb0NBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUFuVkQsb0JBbVZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhcmVOZXR3b3JrLCBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgSVRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgRmxycExpYiBmcm9tICcuL2xpYic7XG5pbXBvcnQge1xuICBGbHJwU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRmxycFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRmxycFRyYW5zYWN0aW9uU3Rha2luZ09wdGlvbnMsXG4gIEZscnBUcmFuc2FjdGlvblBhcmFtcyxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZscnAgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuXG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRpY3NDb2luID0gc3RhdGljc0NvaW47XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgRmxycChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuICBnZXRCYXNlRmFjdG9yKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy5vbmNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHN0YWtpbmcgdHhuIGlzIHZhbGlkLCBiYXNlZCBvbiBleHBlY3RlZCB0eCBwYXJhbXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RmxycFRyYW5zYWN0aW9uU3Rha2luZ09wdGlvbnN9IHN0YWtpbmdPcHRpb25zIGV4cGVjdGVkIHN0YWtpbmcgcGFyYW1zIHRvIGNoZWNrIGFnYWluc3RcbiAgICogQHBhcmFtIHtGbHJwTGliLlRyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhaW5lZFR4IGV4cGxhaW5lZCBzdGFraW5nIHRyYW5zYWN0aW9uXG4gICAqL1xuICB2YWxpZGF0ZVN0YWtpbmdUeChzdGFraW5nT3B0aW9uczogRmxycFRyYW5zYWN0aW9uU3Rha2luZ09wdGlvbnMsIGV4cGxhaW5lZFR4OiBGbHJwTGliLlRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJlZFJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiBzdGFraW5nT3B0aW9ucy5ub2RlSUQsIGFtb3VudDogc3Rha2luZ09wdGlvbnMuYW1vdW50IH1dO1xuICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0cyA9IGV4cGxhaW5lZFR4Lm91dHB1dHMubWFwKChvdXRwdXQpID0+IHV0aWxzLnBpY2sob3V0cHV0LCBbJ2FkZHJlc3MnLCAnYW1vdW50J10pKTtcblxuICAgIGlmICghdXRpbHMuaXNFcXVhbChmaWx0ZXJlZE91dHB1dHMsIGZpbHRlcmVkUmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggb3V0cHV0cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zJyk7XG4gICAgfVxuICAgIGlmIChzdGFraW5nT3B0aW9ucz8uYW1vdW50ICE9PSBleHBsYWluZWRUeC5vdXRwdXRBbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggdG90YWwgYW1vdW50IGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdG90YWwgYW1vdW50IGZpZWxkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4cG9ydCB0eG4gaXMgdmFsaWQsIGJhc2VkIG9uIGV4cGVjdGVkIHR4IHBhcmFtcy5cbiAgICpcbiAgICogQHBhcmFtIHtJVHJhbnNhY3Rpb25SZWNpcGllbnRbXX0gcmVjaXBpZW50cyBleHBlY3RlZCByZWNpcGllbnRzIGFuZCBpbmZvXG4gICAqIEBwYXJhbSB7RmxycExpYi5UcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYWluZWRUeCBleHBsYWluZWQgZXhwb3J0IHRyYW5zYWN0aW9uXG4gICAqL1xuICB2YWxpZGF0ZUV4cG9ydFR4KHJlY2lwaWVudHM6IElUcmFuc2FjdGlvblJlY2lwaWVudFtdLCBleHBsYWluZWRUeDogRmxycExpYi5UcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoICE9PSAxIHx8IGV4cGxhaW5lZFR4Lm91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBUeCByZXF1aXJlcyBvbmUgcmVjaXBpZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4SW1wb3J0RmVlID0gKHRoaXMuX3N0YXRpY3NDb2luLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrKS5tYXhJbXBvcnRGZWUgfHwgJzAnO1xuICAgIGNvbnN0IHJlY2lwaWVudEFtb3VudCA9IG5ldyBCaWdOdW1iZXIocmVjaXBpZW50c1swXS5hbW91bnQpO1xuICAgIGlmIChcbiAgICAgIHJlY2lwaWVudEFtb3VudC5pc0dyZWF0ZXJUaGFuKGV4cGxhaW5lZFR4Lm91dHB1dEFtb3VudCkgfHxcbiAgICAgIHJlY2lwaWVudEFtb3VudC5wbHVzKG1heEltcG9ydEZlZSkuaXNMZXNzVGhhbihleHBsYWluZWRUeC5vdXRwdXRBbW91bnQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUeCB0b3RhbCBhbW91bnQgJHtleHBsYWluZWRUeC5vdXRwdXRBbW91bnR9IGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdG90YWwgYW1vdW50IGZpZWxkICR7cmVjaXBpZW50QW1vdW50fSBhbmQgbWF4IGltcG9ydCBmZWUgJHttYXhJbXBvcnRGZWV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXhwbGFpbmVkVHgub3V0cHV0cyAmJiAhdXRpbHMuaXNWYWxpZEFkZHJlc3MoZXhwbGFpbmVkVHgub3V0cHV0c1swXS5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFAtY2hhaW4gYWRkcmVzcyAke2V4cGxhaW5lZFR4Lm91dHB1dHNbMF0uYWRkcmVzc31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgaW1wb3J0IHR4biBpbnRvIFAgaXMgdmFsaWQsIGJhc2VkIG9uIGV4cGVjdGVkIHR4IHBhcmFtcy5cbiAgICpcbiAgICogQHBhcmFtIHtGbHJwTGliLkZscnBFbnRyeVtdfSBleHBsYWluZWRUeElucHV0cyB0eCBpbnB1dHMgKHVuc3BlbnRzIHRvIGJlIGltcG9ydGVkKVxuICAgKiBAcGFyYW0ge0ZscnBUcmFuc2FjdGlvblBhcmFtc30gdHhQYXJhbXMgZXhwZWN0ZWQgdHggaW5mbyB0byBjaGVjayBhZ2FpbnN0XG4gICAqL1xuICB2YWxpZGF0ZUltcG9ydFR4KGV4cGxhaW5lZFR4SW5wdXRzOiBGbHJwTGliLkZscnBFbnRyeVtdLCB0eFBhcmFtczogRmxycFRyYW5zYWN0aW9uUGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKHR4UGFyYW1zLnVuc3BlbnRzKSB7XG4gICAgICBpZiAoZXhwbGFpbmVkVHhJbnB1dHMubGVuZ3RoICE9PSB0eFBhcmFtcy51bnNwZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke3R4UGFyYW1zLnVuc3BlbnRzLmxlbmd0aH0gVVRYT3MsIHRyYW5zYWN0aW9uIGhhZCAke2V4cGxhaW5lZFR4SW5wdXRzLmxlbmd0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdW5zcGVudHMgPSBuZXcgU2V0KHR4UGFyYW1zLnVuc3BlbnRzKTtcblxuICAgICAgZm9yIChjb25zdCB1bnNwZW50IG9mIGV4cGxhaW5lZFR4SW5wdXRzKSB7XG4gICAgICAgIGlmICghdW5zcGVudHMuaGFzKHVuc3BlbnQuaWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiBzaG91bGQgbm90IGNvbnRhaW4gdGhlIFVUWE86ICR7dW5zcGVudC5pZH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogRmxycFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGxldCB0eDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZnJvbSh0eEhleCk7XG4gICAgICB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZXhwbGFpbmVkVHggPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgIGNvbnN0IHsgdHlwZSwgc3Rha2luZ09wdGlvbnMgfSA9IHBhcmFtcy50eFBhcmFtcztcbiAgICAvLyBUT0RPKEJHLTYyMTEyKTogY2hhbmdlIEltcG9ydFRvQyB0eXBlIHRvIEltcG9ydFxuICAgIGlmICghdHlwZSB8fCAodHlwZSAhPT0gJ0ltcG9ydFRvQycgJiYgZXhwbGFpbmVkVHgudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlW3R5cGVdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCB0eXBlIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgdHlwZScpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXhwbGFpbmVkVHgudHlwZSkge1xuICAgICAgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICAgIGlmIChzdGFraW5nT3B0aW9ucykge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVTdGFraW5nVHgoc3Rha2luZ09wdGlvbnMsIGV4cGxhaW5lZFR4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgaWYgKCFwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cyB8fCBwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBvcnQgVHggcmVxdWlyZXMgYSByZWNpcGllbnQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRXhwb3J0VHgocGFyYW1zLnR4UGFyYW1zLnJlY2lwaWVudHMsIGV4cGxhaW5lZFR4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaWYgKHR4LmlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4pIHtcbiAgICAgICAgICAvLyBJbXBvcnQgdG8gQy1jaGFpblxuICAgICAgICAgIGlmIChleHBsYWluZWRUeC5vdXRwdXRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCAxIG91dHB1dCBpbiBpbXBvcnQgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cyB8fCBwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgMSByZWNpcGllbnQgaW4gaW1wb3J0IHRyYW5zYWN0aW9uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEltcG9ydCB0byBQLWNoYWluXG4gICAgICAgICAgaWYgKGV4cGxhaW5lZFR4Lm91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIDEgb3V0cHV0IGluIGltcG9ydCB0cmFuc2FjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnZhbGlkYXRlSW1wb3J0VHgoZXhwbGFpbmVkVHguaW5wdXRzLCBwYXJhbXMudHhQYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIHJvb3QgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgcHVibGljIGtleXMgdG8gZ2VuZXJhdGUgdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGtleWNoYWlucyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIGlmICgha2V5Y2hhaW5zIHx8IGtleWNoYWlucy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXljaGFpbnMnKTtcbiAgICB9XG5cbiAgICAvLyBtdWx0aXNpZyBhZGRyZXNzZXMgYXJlIHNlcGFyYXRlZCBieSB+XG4gICAgY29uc3Qgc3BsaXRBZGRyZXNzZXMgPSBhZGRyZXNzLnNwbGl0KCd+Jyk7XG5cbiAgICAvLyBkZXJpdmUgYWRkcmVzc2VzIGZyb20ga2V5Y2hhaW5cbiAgICBjb25zdCB1bmxvY2tBZGRyZXNzZXMgPSBrZXljaGFpbnMubWFwKChrZXljaGFpbikgPT5cbiAgICAgIG5ldyBGbHJwTGliLktleVBhaXIoeyBwdWI6IGtleWNoYWluLnB1YiB9KS5nZXRBZGRyZXNzKHRoaXMuX3N0YXRpY3NDb2luLm5ldHdvcmsudHlwZSlcbiAgICApO1xuXG4gICAgaWYgKHNwbGl0QWRkcmVzc2VzLmxlbmd0aCAhPT0gdW5sb2NrQWRkcmVzc2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBtdWx0aXNpZyBhZGRyZXNzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaGApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hZHJlc3Nlc0FycmF5c01hdGNoKHNwbGl0QWRkcmVzc2VzLCB1bmxvY2tBZGRyZXNzZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICR7YWRkcmVzc30gaXMgbm90IG9mIHRoaXMgd2FsbGV0YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0d28gbXVsdGlzaWcgYWRkcmVzcyBhcnJheXMgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cywgb3JkZXIgZG9lc250IG1hdHRlclxuICAgKiBAcGFyYW0gYWRkcmVzc0FycmF5MVxuICAgKiBAcGFyYW0gYWRkcmVzc0FycmF5MlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFkZHJlc3MgYXJyYXlzIGhhdmUgdGhlIHNhbWUgYWRkcmVzc2VzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFkcmVzc2VzQXJyYXlzTWF0Y2goYWRkcmVzc0FycmF5MTogc3RyaW5nW10sIGFkZHJlc3NBcnJheTI6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFkZHJlc3NBcnJheTEuc29ydCgpKSA9PT0gSlNPTi5zdHJpbmdpZnkoYWRkcmVzc0FycmF5Mi5zb3J0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIEZscnAga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNlZWQgLSBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEZscnBMaWIuS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgRmxycExpYi5LZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuXG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBGbHJwTGliLktleVBhaXIoeyBwdWIgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwcml2YXRlIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBydiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBGbHJwTGliLktleVBhaXIoeyBwcnYgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgZXRoIGFkZHJlc3MgZm9yIGNyb3NzLWNoYWluIHR4cyB0byBjLWNoYWluXG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJyAmJiB1dGlscy5pc1ZhbGlkRXRoZXJldW1BZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gRmxycExpYi5VdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBGbHJwIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBGbHJwU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBkZXNlcmlhbGl6ZSByYXcgdHJhbnNhY3Rpb24gKG5vdGU6IGZyb21BZGRyZXNzIGhhcyBvbmNoYWluIG9yZGVyKVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcigpLmZyb20ocGFyYW1zLnR4UHJlYnVpbGQudHhIZXgpO1xuICAgIGNvbnN0IGtleSA9IHBhcmFtcy5wcnY7XG5cbiAgICAvLyBwdXNoIHRoZSBrZXlwYWlyIHRvIHNpZ25lciBhcnJheVxuICAgIHR4QnVpbGRlci5zaWduKHsga2V5IH0pO1xuXG4gICAgLy8gYnVpbGQgdGhlIHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IEJhc2VUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGJ1aWxkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5zaWduYXR1cmUubGVuZ3RoID49IDJcbiAgICAgID8geyB0eEhleDogdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSB9XG4gICAgICA6IHsgaGFsZlNpZ25lZDogeyB0eEhleDogdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSB9IH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gYSBGbHJwIHRyYW5zYWN0aW9uIGZyb20gdHhIZXhcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEZscnBMaWIuVHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4SGV4ID8/IHBhcmFtcz8uaGFsZlNpZ25lZD8udHhIZXg7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHRyYW5zYWN0aW9uIGhleCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgcmV0dXJuIHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0cmFuc2FjdGlvbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVjb3ZlcnlTaWduYXR1cmUobWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEZscnBMaWIuVXRpbHMucmVjb3ZlcnlTaWduYXR1cmUodGhpcy5fc3RhdGljc0NvaW4ubmV0d29yayBhcyBGbGFyZU5ldHdvcmssIG1lc3NhZ2UsIHNpZ25hdHVyZSk7XG4gIH1cblxuICBhc3luYyBzaWduTWVzc2FnZShrZXk6IEtleVBhaXIsIG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcHJ2ID0gbmV3IEZscnBMaWIuS2V5UGFpcihrZXkpLmdldFByaXZhdGVLZXkoKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShtZXNzYWdlLCAnaGV4Jyk7XG4gICAgfVxuICAgIHJldHVybiBGbHJwTGliLlV0aWxzLmNyZWF0ZVNpZ25hdHVyZSh0aGlzLl9zdGF0aWNzQ29pbi5uZXR3b3JrIGFzIEZsYXJlTmV0d29yaywgbWVzc2FnZSwgcHJ2KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRlcigpOiBGbHJwTGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgRmxycExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleShwYXJhbXM6IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgLyoqIGh0dHBzOi8vYml0Z29pbmMuYXRsYXNzaWFuLm5ldC9icm93c2UvQ09JTi00MjEzICovXG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxufVxuIl19
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxycC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mbHJwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFtRztBQUNuRyxtREFvQjhCO0FBQzlCLCtDQUFpQztBQVFqQyx3REFBZ0M7QUFDaEMsZ0VBQXFDO0FBQ3JDLHFEQUFzRTtBQUV0RSxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFZLEtBQWdCLEVBQUUsV0FBdUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUNELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQjtRQUNwQixPQUFPLHdCQUFhLENBQUMsT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFFRCxrQkFBa0I7SUFD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QUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLHVCQUFZLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUF1QixFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLE1BQStCO1FBQy9DLE1BQU0sSUFBSSxvQ0FBeUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQTVaRCxvQkE0WkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zLCBGbGFyZU5ldHdvcmsgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgSVRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBTaWduaW5nRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIEZscnBMaWIgZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgRmxycEVudHJ5LFxuICBGbHJwRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRmxycFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEZscnBUcmFuc2FjdGlvblBhcmFtcyxcbiAgRmxycFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGlzVmFsaWRBZGRyZXNzIGFzIGlzVmFsaWRFdGhBZGRyZXNzIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcblxuZXhwb3J0IGNsYXNzIEZscnAgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuXG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRpY3NDb2luID0gc3RhdGljc0NvaW47XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgRmxycChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuICBnZXRCYXNlRmFjdG9yKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy5vbmNoYWluO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWNkc2EnO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBGbHJwVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdHhIZXggPSBwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eEhleDtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG4gICAgbGV0IHR4O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5mcm9tKHR4SGV4KTtcbiAgICAgIHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0cmFuc2FjdGlvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBjb25zdCBleHBsYWluZWRUeCA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgY29uc3QgdHlwZSA9IHBhcmFtcy50eFBhcmFtcy50eXBlO1xuICAgIC8vICdzdGFrZScgaXMgdGhlIGludGVudC10eXBlIGFsaWFzIGZvciBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjsgbm9ybWFsaXplIGl0XG4gICAgLy8gc28gdGhlIFRyYW5zYWN0aW9uVHlwZSBlbnVtIGxvb2t1cCBzdWNjZWVkcy5cbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHR5cGUgPT09ICdzdGFrZScgPyAnQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3InIDogdHlwZTtcblxuICAgIC8vIFdoZW4gdHlwZSBpcyBwcm92aWRlZCwgdmVyaWZ5IGl0IG1hdGNoZXMgdGhlIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICAvLyBXaGVuIHR5cGUgaXMgbm90IHByb3ZpZGVkIChNUEMvVFNTIGludGVudCBmbG93IHdoZXJlIGJ1aWxkUGFyYW1zIGFyZSB1bmF2YWlsYWJsZSksXG4gICAgLy8gc2tpcCB0aGUgdHlwZSBtYXRjaCBjaGVjayBhbmQgcmVseSBvbiBleHBsYWluZWRUeC50eXBlIGZyb20gdGhlIHBhcnNlZCBoZXgg4oCUXG4gICAgLy8gdGhlIHRyYW5zYWN0aW9uIHdhcyBidWlsdCBieSB3YWxsZXQtcGxhdGZvcm0gYW5kIHRoZSBoZXggaXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpZiAobm9ybWFsaXplZFR5cGUgJiYgbm9ybWFsaXplZFR5cGUgIT09ICdJbXBvcnRUb0MnICYmIGV4cGxhaW5lZFR4LnR5cGUgIT09IFRyYW5zYWN0aW9uVHlwZVtub3JtYWxpemVkVHlwZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggdHlwZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHR5cGUnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV4cGxhaW5lZFR4LnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgaWYgKCFwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cyB8fCBwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBvcnQgVHggcmVxdWlyZXMgYSByZWNpcGllbnQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRXhwb3J0VHgocGFyYW1zLnR4UGFyYW1zLnJlY2lwaWVudHMsIGV4cGxhaW5lZFR4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaWYgKHR4LmlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4pIHtcbiAgICAgICAgICAvLyBJbXBvcnQgdG8gQy1jaGFpblxuICAgICAgICAgIGlmIChleHBsYWluZWRUeC5vdXRwdXRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCAxIG91dHB1dCBpbiBpbXBvcnQgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cyB8fCBwYXJhbXMudHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgMSByZWNpcGllbnQgaW4gaW1wb3J0IHRyYW5zYWN0aW9uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEltcG9ydCB0byBQLWNoYWluXG4gICAgICAgICAgaWYgKGV4cGxhaW5lZFR4Lm91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIDEgb3V0cHV0IGluIGltcG9ydCB0cmFuc2FjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnZhbGlkYXRlSW1wb3J0VHgoZXhwbGFpbmVkVHguaW5wdXRzLCBwYXJhbXMudHhQYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3I6XG4gICAgICAgIGlmIChwYXJhbXMudHhQYXJhbXMuc3Rha2luZ09wdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRGVsZWdhdGlvblR4KHBhcmFtcy50eFBhcmFtcywgZXhwbGFpbmVkVHgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4cG9ydCB0eG4gaXMgdmFsaWQsIGJhc2VkIG9uIGV4cGVjdGVkIHR4IHBhcmFtcy5cbiAgICpcbiAgICogQHBhcmFtIHtJVHJhbnNhY3Rpb25SZWNpcGllbnRbXX0gcmVjaXBpZW50cyBleHBlY3RlZCByZWNpcGllbnRzIGFuZCBpbmZvXG4gICAqIEBwYXJhbSB7RmxycExpYi5UcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYWluZWRUeCBleHBsYWluZWQgZXhwb3J0IHRyYW5zYWN0aW9uXG4gICAqL1xuICB2YWxpZGF0ZUV4cG9ydFR4KHJlY2lwaWVudHM6IElUcmFuc2FjdGlvblJlY2lwaWVudFtdLCBleHBsYWluZWRUeDogRmxycExpYi5UcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoICE9PSAxIHx8IGV4cGxhaW5lZFR4Lm91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBUeCByZXF1aXJlcyBvbmUgcmVjaXBpZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4SW1wb3J0RmVlID0gKHRoaXMuX3N0YXRpY3NDb2luLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrKS5tYXhJbXBvcnRGZWU7XG4gICAgY29uc3QgcmVjaXBpZW50QW1vdW50ID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgaWYgKFxuICAgICAgcmVjaXBpZW50QW1vdW50LmlzR3JlYXRlclRoYW4oZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50KSB8fFxuICAgICAgcmVjaXBpZW50QW1vdW50LnBsdXMobWF4SW1wb3J0RmVlKS5pc0xlc3NUaGFuKGV4cGxhaW5lZFR4Lm91dHB1dEFtb3VudClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFR4IHRvdGFsIGFtb3VudCAke2V4cGxhaW5lZFR4Lm91dHB1dEFtb3VudH0gZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0b3RhbCBhbW91bnQgZmllbGQgJHtyZWNpcGllbnRBbW91bnR9IGFuZCBtYXggaW1wb3J0IGZlZSAke21heEltcG9ydEZlZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChleHBsYWluZWRUeC5vdXRwdXRzICYmICF1dGlscy5pc1ZhbGlkQWRkcmVzcyhleHBsYWluZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgUC1jaGFpbiBhZGRyZXNzICR7ZXhwbGFpbmVkVHgub3V0cHV0c1swXS5hZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBpbXBvcnQgdHhuIGludG8gUCBpcyB2YWxpZCwgYmFzZWQgb24gZXhwZWN0ZWQgdHggcGFyYW1zLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZscnBFbnRyeVtdfSBleHBsYWluZWRUeElucHV0cyB0eCBpbnB1dHMgKHVuc3BlbnRzIHRvIGJlIGltcG9ydGVkKVxuICAgKiBAcGFyYW0ge0ZscnBUcmFuc2FjdGlvblBhcmFtc30gdHhQYXJhbXMgZXhwZWN0ZWQgdHggaW5mbyB0byBjaGVjayBhZ2FpbnN0XG4gICAqL1xuICB2YWxpZGF0ZUltcG9ydFR4KGV4cGxhaW5lZFR4SW5wdXRzOiBGbHJwRW50cnlbXSwgdHhQYXJhbXM6IEZscnBUcmFuc2FjdGlvblBhcmFtcyk6IHZvaWQge1xuICAgIGlmICh0eFBhcmFtcy51bnNwZW50cykge1xuICAgICAgaWYgKGV4cGxhaW5lZFR4SW5wdXRzLmxlbmd0aCAhPT0gdHhQYXJhbXMudW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHt0eFBhcmFtcy51bnNwZW50cy5sZW5ndGh9IFVUWE9zLCB0cmFuc2FjdGlvbiBoYWQgJHtleHBsYWluZWRUeElucHV0cy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVuc3BlbnRzID0gbmV3IFNldCh0eFBhcmFtcy51bnNwZW50cyk7XG5cbiAgICAgIGZvciAoY29uc3QgdW5zcGVudCBvZiBleHBsYWluZWRUeElucHV0cykge1xuICAgICAgICBpZiAoIXVuc3BlbnRzLmhhcyh1bnNwZW50LmlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gc2hvdWxkIG5vdCBjb250YWluIHRoZSBVVFhPOiAke3Vuc3BlbnQuaWR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHJhbnNhY3Rpb24gcGFyYW1ldGVycy5cbiAgICogVmFsaWRhdGVzIGJvdGggZXhwZWN0ZWQgdHhQYXJhbXMgYW5kIHRoZSBwYXJzZWQgZXhwbGFpbmVkVHggZm9yIGNvbnNpc3RlbmN5LlxuICAgKlxuICAgKiBAcGFyYW0ge0ZscnBUcmFuc2FjdGlvblBhcmFtc30gdHhQYXJhbXMgLSBFeHBlY3RlZCB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7RmxycExpYi5UcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYWluZWRUeCAtIFBhcnNlZCB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKi9cbiAgdmFsaWRhdGVEZWxlZ2F0aW9uVHgodHhQYXJhbXM6IEZscnBUcmFuc2FjdGlvblBhcmFtcywgZXhwbGFpbmVkVHg6IEZscnBMaWIuVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IHZvaWQge1xuICAgIGlmICghdHhQYXJhbXMuc3Rha2luZ09wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVsZWdhdGlvbiB0cmFuc2FjdGlvbiByZXF1aXJlcyBzdGFraW5nT3B0aW9ucycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbm9kZUlELCBhbW91bnQsIGR1cmF0aW9uU2Vjb25kcywgcmV3YXJkQWRkcmVzcyB9ID0gdHhQYXJhbXMuc3Rha2luZ09wdGlvbnM7XG5cbiAgICBpZiAoIW5vZGVJRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHJlcXVpcmVzIG5vZGVJRCcpO1xuICAgIH1cblxuICAgIGlmICghYW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlbGVnYXRpb24gdHJhbnNhY3Rpb24gcmVxdWlyZXMgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFkdXJhdGlvblNlY29uZHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVsZWdhdGlvbiB0cmFuc2FjdGlvbiByZXF1aXJlcyBkdXJhdGlvblNlY29uZHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXJld2FyZEFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVsZWdhdGlvbiB0cmFuc2FjdGlvbiByZXF1aXJlcyByZXdhcmRBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbm9kZUlEIGZvcm1hdCB1c2luZyB1dGlsaXR5IG1ldGhvZFxuICAgIGlmICghdXRpbHMuaXNWYWxpZE5vZGVJRChub2RlSUQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbm9kZUlEIGZvcm1hdDogJHtub2RlSUR9YCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcGFyc2VkIHRyYW5zYWN0aW9uJ3Mgb3V0cHV0IGFtb3VudCBtYXRjaGVzIHRoZSBleHBlY3RlZCBzdGFraW5nIGFtb3VudFxuICAgIC8vIFRoZSBvdXRwdXRBbW91bnQgaW4gZXhwbGFpbmVkVHggcmVwcmVzZW50cyB0aGUgdG90YWwgc3Rha2UgYW1vdW50IGluIHRoZSB0cmFuc2FjdGlvblxuICAgIGlmIChleHBsYWluZWRUeC5vdXRwdXRBbW91bnQpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICAgICAgY29uc3QgYWN0dWFsQW1vdW50ID0gbmV3IEJpZ051bWJlcihleHBsYWluZWRUeC5vdXRwdXRBbW91bnQpO1xuICAgICAgaWYgKCFleHBlY3RlZEFtb3VudC5pc0VxdWFsVG8oYWN0dWFsQW1vdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGVnYXRpb24gYW1vdW50IG1pc21hdGNoOiBleHBlY3RlZCAke2Ftb3VudH0sIHRyYW5zYWN0aW9uIGhhcyAke2V4cGxhaW5lZFR4Lm91dHB1dEFtb3VudH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXIoKTogRmxycExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IEZscnBMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWRkcmVzcyBpcyB2YWxpZCwgdGhlbiBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgcm9vdCBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWlucyBwdWJsaWMga2V5cyB0byBnZW5lcmF0ZSB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgYWRkcmVzcywga2V5Y2hhaW5zIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICAvLyBtdWx0aXNpZyBhZGRyZXNzZXMgYXJlIHNlcGFyYXRlZCBieSB+XG4gICAgY29uc3Qgc3BsaXRBZGRyZXNzZXMgPSBhZGRyZXNzLnNwbGl0KCd+Jyk7XG5cbiAgICAvLyBNUEMvVFNTOiBzaW5nbGUgYWRkcmVzcyBkZXJpdmVkIGZyb20gY29tbW9uIGtleWNoYWluXG4gICAgaWYgKHNwbGl0QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSAmJiBrZXljaGFpbnM/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWRBZGRyID0gbmV3IEZscnBMaWIuS2V5UGFpcih7IHB1Yjoga2V5Y2hhaW5zWzBdLnB1YiB9KS5nZXRBZGRyZXNzKHRoaXMuX3N0YXRpY3NDb2luLm5ldHdvcmsudHlwZSk7XG4gICAgICBpZiAoZXhwZWN0ZWRBZGRyICE9PSBhZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogJHthZGRyZXNzfSBpcyBub3Qgb2YgdGhpcyB3YWxsZXRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zIHx8IGtleWNoYWlucy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXljaGFpbnMnKTtcbiAgICB9XG5cbiAgICAvLyBkZXJpdmUgYWRkcmVzc2VzIGZyb20ga2V5Y2hhaW5cbiAgICBjb25zdCB1bmxvY2tBZGRyZXNzZXMgPSBrZXljaGFpbnMubWFwKChrZXljaGFpbikgPT5cbiAgICAgIG5ldyBGbHJwTGliLktleVBhaXIoeyBwdWI6IGtleWNoYWluLnB1YiB9KS5nZXRBZGRyZXNzKHRoaXMuX3N0YXRpY3NDb2luLm5ldHdvcmsudHlwZSlcbiAgICApO1xuXG4gICAgaWYgKHNwbGl0QWRkcmVzc2VzLmxlbmd0aCAhPT0gdW5sb2NrQWRkcmVzc2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBtdWx0aXNpZyBhZGRyZXNzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaGApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hZHJlc3Nlc0FycmF5c01hdGNoKHNwbGl0QWRkcmVzc2VzLCB1bmxvY2tBZGRyZXNzZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICR7YWRkcmVzc30gaXMgbm90IG9mIHRoaXMgd2FsbGV0YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0d28gbXVsdGlzaWcgYWRkcmVzcyBhcnJheXMgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cywgb3JkZXIgZG9lc250IG1hdHRlclxuICAgKiBAcGFyYW0gYWRkcmVzc0FycmF5MVxuICAgKiBAcGFyYW0gYWRkcmVzc0FycmF5MlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFkZHJlc3MgYXJyYXlzIGhhdmUgdGhlIHNhbWUgYWRkcmVzc2VzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFkcmVzc2VzQXJyYXlzTWF0Y2goYWRkcmVzc0FycmF5MTogc3RyaW5nW10sIGFkZHJlc3NBcnJheTI6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFkZHJlc3NBcnJheTEuc29ydCgpKSA9PT0gSlNPTi5zdHJpbmdpZnkoYWRkcmVzc0FycmF5Mi5zb3J0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIEZscnAga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNlZWQgLSBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEZscnBMaWIuS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgRmxycExpYi5LZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuXG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBGbHJwTGliLktleVBhaXIoeyBwdWIgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwcml2YXRlIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBydiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBGbHJwTGliLktleVBhaXIoeyBwcnYgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgZXRoIGFkZHJlc3MgZm9yIGNyb3NzLWNoYWluIHR4cyB0byBjLWNoYWluXG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJyAmJiBpc1ZhbGlkRXRoQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEZscnBMaWIuVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByYXcgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNpZ25lZCBieSB0aGUgTVBDIGNlcmVtb255LlxuICAgKiBNUEMuc2lnbigpIGludGVybmFsbHkgU0hBLTI1NiBoYXNoZXMsIHNvIHJldHVybiByYXcgdW5zaWduZWQgdHggYnl0ZXMuXG4gICAqL1xuICBhc3luYyBnZXRTaWduYWJsZVBheWxvYWQodHhIZXg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZnJvbSh0eEhleCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZscnBMaWIuVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHR4LnNpZ25hYmxlUGF5bG9hZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGFuIE1QQy1wcm9kdWNlZCBzaWduYXR1cmUgaW50byBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHR4SGV4IC0gVW5zaWduZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEBwYXJhbSBzaWduYXR1cmUgLSA2NS1ieXRlIEVDRFNBIHNpZ25hdHVyZSAociB8fCBzIHx8IHJlY292ZXJ5KVxuICAgKiBAcmV0dXJucyBTaWduZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqL1xuICBhc3luYyBhZGRTaWduYXR1cmVUb1RyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcsIHNpZ25hdHVyZTogQnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5mcm9tKHR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICh0eCBhcyBGbHJwTGliLlRyYW5zYWN0aW9uKS5hZGRFeHRlcm5hbFNpZ25hdHVyZShuZXcgVWludDhBcnJheShzaWduYXR1cmUpKTtcbiAgICByZXR1cm4gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBBdmF4cCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogRmxycFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgLy8gZGVzZXJpYWxpemUgcmF3IHRyYW5zYWN0aW9uIChub3RlOiBmcm9tQWRkcmVzcyBoYXMgb25jaGFpbiBvcmRlcilcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5mcm9tKHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCBrZXkgPSBwYXJhbXMucHJ2O1xuXG4gICAgLy8gcHVzaCB0aGUga2V5cGFpciB0byBzaWduZXIgYXJyYXlcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleSB9KTtcblxuICAgIC8vIGJ1aWxkIHRoZSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBCYXNlVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0Vycm9yIHdoaWxlIHRyeWluZyB0byBidWlsZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA+PSAyXG4gICAgICA/IHsgdHhIZXg6IHRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCkgfVxuICAgICAgOiB7IGhhbGZTaWduZWQ6IHsgdHhIZXg6IHRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCkgfSB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluIGEgQXZheHAgdHJhbnNhY3Rpb24gZnJvbSB0eEhleFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRmxycEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEZscnBMaWIuVHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4SGV4ID8/IHBhcmFtcz8uaGFsZlNpZ25lZD8udHhIZXg7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHRyYW5zYWN0aW9uIGhleCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgcmV0dXJuIHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0cmFuc2FjdGlvbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVjb3ZlcnlTaWduYXR1cmUobWVzc2FnZUhhc2g6IEJ1ZmZlciwgc2lnbmF0dXJlOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiBGbHJwTGliLlV0aWxzLnJlY292ZXJ5U2lnbmF0dXJlKG1lc3NhZ2VIYXNoLCBzaWduYXR1cmUpO1xuICB9XG5cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiBLZXlQYWlyLCBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IHBydiA9IG5ldyBGbHJwTGliLktleVBhaXIoa2V5KS5nZXRQcml2YXRlS2V5KCk7XG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0ludmFsaWQga2V5IHBhaXIgb3B0aW9ucycpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gQnVmZmVyLmZyb20obWVzc2FnZSwgJ2hleCcpO1xuICAgIH1cbiAgICByZXR1cm4gRmxycExpYi5VdGlscy5jcmVhdGVTaWduYXR1cmUodGhpcy5fc3RhdGljc0NvaW4ubmV0d29yayBhcyBGbGFyZU5ldHdvcmssIG1lc3NhZ2UsIHBydik7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkocGFyYW1zOiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC;AACjC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -40,6 +40,5 @@ exports.FlrPLib = void 0;
|
|
|
40
40
|
__exportStar(require("./flrp"), exports);
|
|
41
41
|
__exportStar(require("./tflrp"), exports);
|
|
42
42
|
exports.FlrPLib = __importStar(require("./lib"));
|
|
43
|
-
__exportStar(require("./iface"), exports);
|
|
44
43
|
__exportStar(require("./register"), exports);
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQXVCO0FBQ3ZCLDBDQUF3QjtBQUN4QixpREFBaUM7QUFDakMsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9mbHJwJztcbmV4cG9ydCAqIGZyb20gJy4vdGZscnAnO1xuZXhwb3J0ICogYXMgRmxyUExpYiBmcm9tICcuL2xpYic7XG5leHBvcnQgKiBmcm9tICcuL3JlZ2lzdGVyJztcbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { AtomicInCTransactionBuilder } from './atomicInCTransactionBuilder';
|
|
4
|
+
import { Credential } from '@flarenetwork/flarejs';
|
|
5
|
+
import { Tx, DecodedUtxoObj } from './iface';
|
|
6
|
+
export declare class ExportInCTxBuilder extends AtomicInCTransactionBuilder {
|
|
7
|
+
private _nonce;
|
|
8
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
9
|
+
/**
|
|
10
|
+
* UTXOs are not required for Export Tx from C-Chain (uses EVM balance instead).
|
|
11
|
+
* Override to prevent usage by throwing an error.
|
|
12
|
+
*
|
|
13
|
+
* @throws {BuildTransactionError} always throws as UTXOs are not applicable
|
|
14
|
+
*/
|
|
15
|
+
decodedUtxos(_decodedUtxos: DecodedUtxoObj[]): this;
|
|
16
|
+
/**
|
|
17
|
+
* Set the nonce of C-Chain sender address
|
|
18
|
+
*
|
|
19
|
+
* @param {number | string} nonce - number that can be only used once
|
|
20
|
+
*/
|
|
21
|
+
nonce(nonce: number | string): this;
|
|
22
|
+
/**
|
|
23
|
+
* Export tx target P wallet.
|
|
24
|
+
*
|
|
25
|
+
* @param pAddresses
|
|
26
|
+
*/
|
|
27
|
+
to(pAddresses: string | string[]): this;
|
|
28
|
+
protected get transactionType(): TransactionType;
|
|
29
|
+
initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
|
|
30
|
+
static verifyTxType(txnType: string): boolean;
|
|
31
|
+
verifyTxType(txnType: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Build the export in C-chain transaction
|
|
34
|
+
* @protected
|
|
35
|
+
*/
|
|
36
|
+
protected buildFlareTransaction(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Check the nonce is non-negative.
|
|
39
|
+
* @param nonce
|
|
40
|
+
*/
|
|
41
|
+
validateNonce(nonce: bigint): void;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ExportInCTxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportInCTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ExportInCTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAGL,UAAU,EAKX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,EAAE,EAA0C,cAAc,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,kBAAmB,SAAQ,2BAA2B;IACjE,OAAO,CAAC,MAAM,CAAS;gBAEX,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;;OAKG;IACH,YAAY,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI;IAInD;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOnC;;;;OAIG;IACH,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMvC,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IAyD9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAkDvC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAKnC"}
|