@bitgo-beta/sdk-coin-flrp 1.0.1-beta.36 → 1.0.1-beta.361
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 +10 -17
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +51 -77
- 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 +51 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +190 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +277 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +268 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +192 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +57 -71
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +246 -209
- package/dist/src/lib/iface.d.ts +38 -61
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +13 -14
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +12 -2
- 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/permissionlessValidatorTxBuilder.d.ts +43 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
- package/dist/src/lib/transaction.d.ts +25 -65
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +341 -199
- package/dist/src/lib/transactionBuilder.d.ts +107 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +210 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +129 -72
- package/dist/src/lib/utils.d.ts +78 -147
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +238 -324
- package/dist/test/resources/account.d.ts +51 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +54 -0
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +39 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/flrp.js +446 -68
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +192 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +325 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +400 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +307 -0
- 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/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 +60 -0
- package/dist/test/unit/lib/utils.js +539 -207
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -10
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- 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 -11
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -17
- 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 -170
- 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 -56
- 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/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
- 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/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
|
@@ -1,252 +1,289 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.AtomicTransactionBuilder = void 0;
|
|
4
|
-
const
|
|
7
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
8
|
+
const transaction_1 = require("./transaction");
|
|
5
9
|
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class AtomicTransactionBuilder {
|
|
14
|
-
constructor(coinConfig) {
|
|
15
|
-
this._utxos = [];
|
|
16
|
-
this.transaction = {
|
|
17
|
-
_network: {},
|
|
18
|
-
_networkID: 0,
|
|
19
|
-
_blockchainID: Buffer.alloc(0),
|
|
20
|
-
_assetId: Buffer.alloc(0),
|
|
21
|
-
_fromAddresses: [],
|
|
22
|
-
_to: [],
|
|
23
|
-
_locktime: 0n,
|
|
24
|
-
_threshold: 1,
|
|
25
|
-
_fee: { fee: '0' },
|
|
26
|
-
hasCredentials: false,
|
|
27
|
-
setTransaction: function (_tx) {
|
|
28
|
-
this._tx = _tx;
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
this._coinConfig = coinConfig;
|
|
32
|
-
}
|
|
33
|
-
validateAmount(amount) {
|
|
34
|
-
if (amount <= 0n) {
|
|
35
|
-
throw new sdk_core_1.BuildTransactionError('Amount must be positive');
|
|
36
|
-
}
|
|
10
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
11
|
+
class AtomicTransactionBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
12
|
+
constructor(_coinConfig) {
|
|
13
|
+
super(_coinConfig);
|
|
14
|
+
this.recoverSigner = false;
|
|
15
|
+
this.transaction = new transaction_1.Transaction(_coinConfig);
|
|
16
|
+
this.transaction._fee.fee = this.fixedFee;
|
|
37
17
|
}
|
|
38
18
|
/**
|
|
39
|
-
*
|
|
40
|
-
* @param
|
|
19
|
+
* Create inputs and outputs from UTXOs
|
|
20
|
+
* @param {bigint} amount Amount to transfer
|
|
21
|
+
* @return {
|
|
22
|
+
* inputs: TransferableInput[];
|
|
23
|
+
* outputs: TransferableInput[];
|
|
24
|
+
* credentials: Credential[];
|
|
25
|
+
* }
|
|
26
|
+
* @protected
|
|
41
27
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
28
|
+
createInputOutput(amount) {
|
|
29
|
+
const sender = this.transaction._fromAddresses.slice();
|
|
30
|
+
if (this.recoverSigner) {
|
|
31
|
+
// switch first and last signer
|
|
32
|
+
const tmp = sender.pop();
|
|
33
|
+
sender.push(sender[0]);
|
|
34
|
+
if (tmp) {
|
|
35
|
+
sender[0] = tmp;
|
|
49
36
|
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
|
|
54
|
-
* Based on AVAX P-chain implementation adapted for FlareJS.
|
|
55
|
-
*
|
|
56
|
-
* Note: This is a simplified implementation that creates the core structure.
|
|
57
|
-
* The FlareJS type system integration will be refined in future iterations.
|
|
58
|
-
*
|
|
59
|
-
* @param total - Total amount needed including fees
|
|
60
|
-
* @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
|
|
61
|
-
*/
|
|
62
|
-
createInputOutput(total) {
|
|
63
|
-
if (!this._utxos || this._utxos.length === 0) {
|
|
64
|
-
throw new sdk_core_1.BuildTransactionError('UTXOs are required for creating inputs and outputs');
|
|
65
37
|
}
|
|
38
|
+
let totalAmount = BigInt(0);
|
|
66
39
|
const inputs = [];
|
|
67
40
|
const outputs = [];
|
|
68
41
|
const credentials = [];
|
|
69
|
-
|
|
70
|
-
const addressIndices = {};
|
|
71
|
-
let nextAddressIndex = 0;
|
|
72
|
-
// Sort UTXOs by amount in descending order for optimal coin selection
|
|
73
|
-
const sortedUtxos = [...this._utxos].sort((a, b) => {
|
|
74
|
-
const amountA = BigInt(a.amount);
|
|
75
|
-
const amountB = BigInt(b.amount);
|
|
76
|
-
if (amountA > amountB)
|
|
77
|
-
return -1;
|
|
78
|
-
if (amountA < amountB)
|
|
79
|
-
return 1;
|
|
80
|
-
return 0;
|
|
81
|
-
});
|
|
82
|
-
// Process UTXOs to create inputs and credentials
|
|
83
|
-
for (const utxo of sortedUtxos) {
|
|
42
|
+
this.transaction._utxos.forEach((utxo) => {
|
|
84
43
|
const utxoAmount = BigInt(utxo.amount);
|
|
85
|
-
|
|
86
|
-
|
|
44
|
+
totalAmount += utxoAmount;
|
|
45
|
+
// Create input
|
|
46
|
+
const input = {
|
|
47
|
+
_type: flarejs_1.TypeSymbols.Input,
|
|
48
|
+
amount: () => utxoAmount,
|
|
49
|
+
sigIndices: sender.map((_, i) => i),
|
|
50
|
+
toBytes: () => new Uint8Array(),
|
|
51
|
+
};
|
|
52
|
+
// Create asset with Amounter interface
|
|
53
|
+
const assetId = {
|
|
54
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
55
|
+
amount: () => utxoAmount,
|
|
56
|
+
toBytes: () => {
|
|
57
|
+
const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
58
|
+
return bytes;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
// Create TransferableInput
|
|
62
|
+
const transferableInput = new flarejs_1.TransferableInput({
|
|
63
|
+
_type: flarejs_1.TypeSymbols.UTXOID,
|
|
64
|
+
txID: new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.txid, 'hex'))),
|
|
65
|
+
outputIdx: new flarejs_1.Int(Number(utxo.outputidx)),
|
|
66
|
+
ID: () => utxo.txid,
|
|
67
|
+
toBytes: () => {
|
|
68
|
+
const txIdBytes = new Uint8Array(Buffer.from(utxo.txid, 'hex'));
|
|
69
|
+
const outputIdxBytes = new Uint8Array(4);
|
|
70
|
+
new DataView(outputIdxBytes.buffer).setInt32(0, Number(utxo.outputidx), true);
|
|
71
|
+
return Buffer.concat([txIdBytes, outputIdxBytes]);
|
|
72
|
+
},
|
|
73
|
+
}, new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.outputidx.toString()))), assetId);
|
|
74
|
+
// Set input properties
|
|
75
|
+
Object.assign(transferableInput, { input });
|
|
76
|
+
inputs.push(transferableInput);
|
|
77
|
+
// Create credential with empty signatures for slot identification
|
|
78
|
+
// Match avaxp behavior: dynamic ordering based on addressesIndex from UTXO
|
|
79
|
+
const hasAddresses = sender && sender.length >= this.transaction._threshold;
|
|
80
|
+
if (!hasAddresses) {
|
|
81
|
+
// If addresses not available, use all zeros
|
|
82
|
+
const emptySignatures = sender.map(() => utils_1.default.createNewSig(''));
|
|
83
|
+
credentials.push(new flarejs_1.Credential(emptySignatures));
|
|
87
84
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
else {
|
|
86
|
+
// Compute addressesIndex: position of each _fromAddresses in UTXO's address list
|
|
87
|
+
const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
|
|
88
|
+
const addressesIndex = sender.map((a) => utxoAddresses.findIndex((u) => Buffer.compare(Buffer.from(u), Buffer.from(a)) === 0));
|
|
89
|
+
// either user (0) or recovery (2)
|
|
90
|
+
const firstIndex = this.recoverSigner ? 2 : 0;
|
|
91
|
+
const bitgoIndex = 1;
|
|
92
|
+
// Dynamic ordering based on addressesIndex
|
|
93
|
+
let emptySignatures;
|
|
94
|
+
if (addressesIndex[bitgoIndex] < addressesIndex[firstIndex]) {
|
|
95
|
+
// Bitgo comes first in signature order: [zeros, userAddress]
|
|
96
|
+
emptySignatures = [
|
|
97
|
+
utils_1.default.createNewSig(''),
|
|
98
|
+
utils_1.default.createEmptySigWithAddress(Buffer.from(sender[firstIndex]).toString('hex')),
|
|
99
|
+
];
|
|
98
100
|
}
|
|
99
|
-
|
|
101
|
+
else {
|
|
102
|
+
// User comes first in signature order: [userAddress, zeros]
|
|
103
|
+
emptySignatures = [
|
|
104
|
+
utils_1.default.createEmptySigWithAddress(Buffer.from(sender[firstIndex]).toString('hex')),
|
|
105
|
+
utils_1.default.createNewSig(''),
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
credentials.push(new flarejs_1.Credential(emptySignatures));
|
|
100
109
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
});
|
|
111
|
+
// Create output if there is change
|
|
112
|
+
if (totalAmount > amount) {
|
|
113
|
+
const changeAmount = totalAmount - amount;
|
|
114
|
+
const output = {
|
|
115
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
116
|
+
amount: () => changeAmount,
|
|
117
|
+
addresses: sender,
|
|
118
|
+
locktime: this.transaction._locktime,
|
|
119
|
+
threshold: this.transaction._threshold,
|
|
120
|
+
toBytes: () => new Uint8Array(),
|
|
121
|
+
};
|
|
122
|
+
// Create asset with Amounter interface
|
|
123
|
+
const assetId = {
|
|
124
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
125
|
+
amount: () => changeAmount,
|
|
126
|
+
toBytes: () => {
|
|
127
|
+
const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
128
|
+
return bytes;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
// Create TransferableOutput
|
|
132
|
+
const transferableOutput = new flarejs_1.TransferableInput({
|
|
133
|
+
_type: flarejs_1.TypeSymbols.UTXOID,
|
|
134
|
+
txID: new flarejs_1.Id(new Uint8Array(32)),
|
|
135
|
+
outputIdx: new flarejs_1.Int(0),
|
|
136
|
+
ID: () => '',
|
|
137
|
+
toBytes: () => {
|
|
138
|
+
const txIdBytes = new Uint8Array(32);
|
|
139
|
+
const outputIdxBytes = new Uint8Array(4);
|
|
140
|
+
return Buffer.concat([txIdBytes, outputIdxBytes]);
|
|
141
|
+
},
|
|
142
|
+
}, new flarejs_1.Id(new Uint8Array([0])), assetId);
|
|
143
|
+
// Set output properties
|
|
144
|
+
Object.assign(transferableOutput, { output });
|
|
145
|
+
outputs.push(transferableOutput);
|
|
108
146
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
147
|
+
return {
|
|
148
|
+
inputs,
|
|
149
|
+
outputs,
|
|
150
|
+
credentials,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/** @inheritdoc */
|
|
154
|
+
async buildImplementation() {
|
|
155
|
+
this.buildFlareTransaction();
|
|
156
|
+
this.setTransactionType(this.transactionType);
|
|
157
|
+
if (this.hasSigner()) {
|
|
158
|
+
// Sign sequentially to ensure proper order
|
|
159
|
+
for (const keyPair of this._signer) {
|
|
160
|
+
await this.transaction.sign(keyPair);
|
|
161
|
+
}
|
|
112
162
|
}
|
|
113
|
-
|
|
114
|
-
// The TransferableOutput creation will be implemented once FlareJS types are resolved
|
|
115
|
-
return { inputs, outputs, credentials };
|
|
163
|
+
return this.transaction;
|
|
116
164
|
}
|
|
117
165
|
/**
|
|
118
|
-
*
|
|
166
|
+
* Fee is fix for AVM atomic tx.
|
|
119
167
|
*
|
|
120
|
-
* @
|
|
121
|
-
* @
|
|
168
|
+
* @returns network.txFee
|
|
169
|
+
* @protected
|
|
122
170
|
*/
|
|
123
|
-
|
|
124
|
-
this.
|
|
125
|
-
return this;
|
|
171
|
+
get fixedFee() {
|
|
172
|
+
return this.transaction._network.txFee;
|
|
126
173
|
}
|
|
127
174
|
/**
|
|
128
|
-
*
|
|
129
|
-
* Creates a credential with the provided signatures
|
|
175
|
+
* Set the transaction type
|
|
130
176
|
*
|
|
131
|
-
* @param
|
|
132
|
-
* @param signatures - Array of signature hex strings or empty strings for placeholders
|
|
133
|
-
* @returns Credential instance
|
|
177
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
134
178
|
*/
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
throw new sdk_core_1.BuildTransactionError('Signatures must be an array');
|
|
138
|
-
}
|
|
139
|
-
if (signatures.length === 0) {
|
|
140
|
-
throw new sdk_core_1.BuildTransactionError('Signatures array cannot be empty');
|
|
141
|
-
}
|
|
142
|
-
const sigs = signatures.map((sig, index) => {
|
|
143
|
-
// Handle empty/placeholder signatures
|
|
144
|
-
if (!sig || sig.length === 0) {
|
|
145
|
-
return new flarejs_1.Signature(new Uint8Array(SECP256K1_SIGNATURE_LENGTH));
|
|
146
|
-
}
|
|
147
|
-
// Validate hex string format
|
|
148
|
-
const cleanSig = sig.startsWith('0x') ? sig.slice(2) : sig;
|
|
149
|
-
if (!/^[0-9a-fA-F]*$/.test(cleanSig)) {
|
|
150
|
-
throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
|
|
151
|
-
}
|
|
152
|
-
// Convert to buffer and validate length
|
|
153
|
-
const sigBuffer = Buffer.from(cleanSig, 'hex');
|
|
154
|
-
if (sigBuffer.length > SECP256K1_SIGNATURE_LENGTH) {
|
|
155
|
-
throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${SECP256K1_SIGNATURE_LENGTH})`);
|
|
156
|
-
}
|
|
157
|
-
// Create fixed-length buffer and copy signature data
|
|
158
|
-
const fixedLengthBuffer = Buffer.alloc(SECP256K1_SIGNATURE_LENGTH);
|
|
159
|
-
sigBuffer.copy(fixedLengthBuffer);
|
|
160
|
-
try {
|
|
161
|
-
return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
try {
|
|
168
|
-
return new flarejs_1.Credential(sigs);
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to create credential: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
172
|
-
}
|
|
179
|
+
setTransactionType(transactionType) {
|
|
180
|
+
this.transaction._type = transactionType;
|
|
173
181
|
}
|
|
174
182
|
/**
|
|
175
|
-
*
|
|
183
|
+
* The internal chain is the one set for the coin in coinConfig.network. The external chain is the other chain involved.
|
|
184
|
+
* The external chain id is the source on import and the destination on export.
|
|
185
|
+
*
|
|
186
|
+
* @param {string} chainId - id of the external chain
|
|
176
187
|
*/
|
|
177
|
-
|
|
188
|
+
externalChainId(chainId) {
|
|
189
|
+
const newTargetChainId = typeof chainId === 'string' ? utils_1.default.cb58Decode(chainId) : Buffer.from(chainId);
|
|
190
|
+
this.validateChainId(newTargetChainId);
|
|
191
|
+
this._externalChainId = newTargetChainId;
|
|
178
192
|
return this;
|
|
179
193
|
}
|
|
180
194
|
/**
|
|
181
|
-
*
|
|
182
|
-
*
|
|
195
|
+
* Set the transaction fee
|
|
196
|
+
*
|
|
197
|
+
* @param {string | bigint} feeValue - the fee value
|
|
183
198
|
*/
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
this.transaction.hasCredentials = true;
|
|
199
|
+
fee(feeValue) {
|
|
200
|
+
const fee = typeof feeValue === 'string' ? feeValue : feeValue.toString();
|
|
201
|
+
this.transaction._fee.fee = fee;
|
|
188
202
|
return this;
|
|
189
203
|
}
|
|
190
204
|
/**
|
|
191
|
-
*
|
|
192
|
-
*
|
|
205
|
+
* Create credential with dynamic ordering based on addressesIndex from UTXO
|
|
206
|
+
* Matches avaxp behavior: signature order depends on UTXO address positions
|
|
207
|
+
* @param utxo - The UTXO to create credential for
|
|
208
|
+
* @param threshold - Number of signatures required
|
|
209
|
+
* @returns Credential with empty signatures ordered based on UTXO positions
|
|
210
|
+
* @protected
|
|
193
211
|
*/
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
};
|
|
229
|
-
return mockTransaction;
|
|
212
|
+
createCredentialForUtxo(utxo, threshold) {
|
|
213
|
+
const sender = this.transaction._fromAddresses;
|
|
214
|
+
const hasAddresses = sender && sender.length >= threshold;
|
|
215
|
+
if (!hasAddresses || !utxo.addresses || utxo.addresses.length === 0) {
|
|
216
|
+
// Fallback: use all zeros if no addresses available
|
|
217
|
+
const emptySignatures = [];
|
|
218
|
+
for (let i = 0; i < threshold; i++) {
|
|
219
|
+
emptySignatures.push(utils_1.default.createNewSig(''));
|
|
220
|
+
}
|
|
221
|
+
return new flarejs_1.Credential(emptySignatures);
|
|
222
|
+
}
|
|
223
|
+
// Compute addressesIndex: position of each _fromAddresses in UTXO's address list
|
|
224
|
+
const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
|
|
225
|
+
const addressesIndex = sender.map((a) => utxoAddresses.findIndex((u) => Buffer.compare(Buffer.from(u), Buffer.from(a)) === 0));
|
|
226
|
+
// either user (0) or recovery (2)
|
|
227
|
+
const firstIndex = this.recoverSigner ? 2 : 0;
|
|
228
|
+
const bitgoIndex = 1;
|
|
229
|
+
// Dynamic ordering based on addressesIndex
|
|
230
|
+
let emptySignatures;
|
|
231
|
+
if (addressesIndex[bitgoIndex] < addressesIndex[firstIndex]) {
|
|
232
|
+
// Bitgo comes first in signature order: [zeros, userAddress]
|
|
233
|
+
emptySignatures = [
|
|
234
|
+
utils_1.default.createNewSig(''),
|
|
235
|
+
utils_1.default.createEmptySigWithAddress(Buffer.from(sender[firstIndex]).toString('hex')),
|
|
236
|
+
];
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// User comes first in signature order: [userAddress, zeros]
|
|
240
|
+
emptySignatures = [
|
|
241
|
+
utils_1.default.createEmptySigWithAddress(Buffer.from(sender[firstIndex]).toString('hex')),
|
|
242
|
+
utils_1.default.createNewSig(''),
|
|
243
|
+
];
|
|
244
|
+
}
|
|
245
|
+
return new flarejs_1.Credential(emptySignatures);
|
|
230
246
|
}
|
|
231
247
|
/**
|
|
232
|
-
*
|
|
233
|
-
*
|
|
248
|
+
* Create AddressMap based on signature slot order (matching credential order), not sorted addresses
|
|
249
|
+
* This matches the approach used in credentials: addressesIndex determines signature order
|
|
250
|
+
* AddressMaps should map addresses to signature slots in the same order as credentials
|
|
251
|
+
* @param utxo - The UTXO to create AddressMap for
|
|
252
|
+
* @param threshold - Number of signatures required
|
|
253
|
+
* @returns AddressMap that maps addresses to signature slots based on UTXO order
|
|
254
|
+
* @protected
|
|
234
255
|
*/
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
256
|
+
createAddressMapForUtxo(utxo, threshold) {
|
|
257
|
+
const addressMap = new flarejs_1.utils.AddressMap();
|
|
258
|
+
const sender = this.transaction._fromAddresses;
|
|
259
|
+
// If UTXO has addresses, compute addressesIndex to determine signature order
|
|
260
|
+
if (utxo && utxo.addresses && utxo.addresses.length > 0 && sender && sender.length >= threshold) {
|
|
261
|
+
const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
|
|
262
|
+
const addressesIndex = sender.map((a) => utxoAddresses.findIndex((u) => Buffer.compare(Buffer.from(u), Buffer.from(a)) === 0));
|
|
263
|
+
const firstIndex = this.recoverSigner ? 2 : 0;
|
|
264
|
+
const bitgoIndex = 1;
|
|
265
|
+
// Determine signature slot order based on addressesIndex (same logic as credentials)
|
|
266
|
+
if (addressesIndex[bitgoIndex] < addressesIndex[firstIndex]) {
|
|
267
|
+
// Bitgo comes first: slot 0 = bitgo, slot 1 = firstIndex
|
|
268
|
+
addressMap.set(new flarejs_1.Address(sender[bitgoIndex]), 0);
|
|
269
|
+
addressMap.set(new flarejs_1.Address(sender[firstIndex]), 1);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// User/recovery comes first: slot 0 = firstIndex, slot 1 = bitgo
|
|
273
|
+
addressMap.set(new flarejs_1.Address(sender[firstIndex]), 0);
|
|
274
|
+
addressMap.set(new flarejs_1.Address(sender[bitgoIndex]), 1);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// Fallback: map addresses sequentially if no UTXO addresses available
|
|
279
|
+
if (sender && sender.length >= threshold) {
|
|
280
|
+
sender.slice(0, threshold).forEach((addr, i) => {
|
|
281
|
+
addressMap.set(new flarejs_1.Address(addr), i);
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return addressMap;
|
|
249
286
|
}
|
|
250
287
|
}
|
|
251
288
|
exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUdyRyxtQ0FBbUM7QUFDbkMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQXNCLHdCQUF3QjtJQW9DNUMsWUFBWSxVQUFnQztRQS9CbEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFFOUIsZ0JBQVcsR0FhakI7WUFDRixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDO1lBQ2IsYUFBYSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSxFQUFFO1lBQ2IsVUFBVSxFQUFFLENBQUM7WUFDYixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQ2xCLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGNBQWMsRUFBRSxVQUFVLEdBQVk7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ2pCLENBQUM7U0FDRixDQUFDO1FBR0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUlELGNBQWMsQ0FBQyxNQUFjO1FBQzNCLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sbUJBQW1CLENBQUMsV0FBeUI7UUFDckQsSUFBSSxDQUFDLEtBQUss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RyxFQUFFO2FBQ2xCLENBQUM7WUFDRixzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO2dCQUN6QixpQkFBaUI7WUFDbkIsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2pCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUI7WUFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQ0csQ0FBQztRQUVoQyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLHlDQUF5QztRQUN6QyxvQ0FBb0M7UUFDcEMsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1lBQ1gsWUFBWSxFQUFFLEdBQUc7WUFDakIsZUFBZSxFQUFFLEVBQUU7WUFDbkIsRUFBRSxFQUFFLHFCQUFxQjtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2U0QsNERBdVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUsIEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IENyZWRlbnRpYWwsIFNpZ25hdHVyZSwgVHJhbnNmZXJhYmxlSW5wdXQsIFRyYW5zZmVyYWJsZU91dHB1dCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vLyBDb25zdGFudHMgZm9yIHNpZ25hdHVyZSBoYW5kbGluZ1xuY29uc3QgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEggPSA2NTtcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiAwLFxuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLFxuICAgIF9mcm9tQWRkcmVzc2VzOiBbXSxcbiAgICBfdG86IFtdLFxuICAgIF9sb2NrdGltZTogMG4sXG4gICAgX3RocmVzaG9sZDogMSxcbiAgICBfZmVlOiB7IGZlZTogJzAnIH0sXG4gICAgaGFzQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHNldFRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoX3R4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLl90eCA9IF90eDtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBjcmVkZW50aWFscyBhcnJheSBpcyBwcm9wZXJseSBmb3JtZWRcbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIC0gQXJyYXkgb2YgY3JlZGVudGlhbHMgdG8gdmFsaWRhdGVcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10pOiB2b2lkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3JlZGVudGlhbHMpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdDcmVkZW50aWFscyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgY3JlZGVudGlhbHMuZm9yRWFjaCgoY3JlZGVudGlhbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghKGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBDcmVkZW50aWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGNyZWRlbnRpYWwgYXQgaW5kZXggJHtpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGlucHV0cywgb3V0cHV0cywgYW5kIGNyZWRlbnRpYWxzIGZvciBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbnMuXG4gICAqIEJhc2VkIG9uIEFWQVggUC1jaGFpbiBpbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZvciBGbGFyZUpTLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIGNvcmUgc3RydWN0dXJlLlxuICAgKiBUaGUgRmxhcmVKUyB0eXBlIHN5c3RlbSBpbnRlZ3JhdGlvbiB3aWxsIGJlIHJlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB0b3RhbCAtIFRvdGFsIGFtb3VudCBuZWVkZWQgaW5jbHVkaW5nIGZlZXNcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgVHJhbnNmZXJhYmxlSW5wdXRbXSwgVHJhbnNmZXJhYmxlT3V0cHV0W10sIGFuZCBDcmVkZW50aWFsW11cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dCh0b3RhbDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBpZiAoIXRoaXMuX3V0eG9zIHx8IHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBjcmVhdGluZyBpbnB1dHMgYW5kIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IENyZWF0ZSBwcm9wZXIgRmxhcmVKUyBUcmFuc2ZlcmFibGVJbnB1dCBvbmNlIHR5cGUgaXNzdWVzIGFyZSByZXNvbHZlZFxuICAgICAgLy8gRm9yIG5vdywgd2UgY3JlYXRlIGEgcGxhY2Vob2xkZXIgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHN0cnVjdHVyZVxuICAgICAgLy8gVGhlIGFjdHVhbCBGbGFyZUpTIGludGVncmF0aW9uIHdpbGwgbmVlZCBwcm9wZXIgVVRYT0lEIGhhbmRsaW5nXG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBwbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZXNlIHdvdWxkIGJlIGFjdHVhbCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdXR4by50aHJlc2hvbGQgfSwgKCkgPT4gJycpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHRoaXMuY3JlYXRlRmxhcmVDcmVkZW50aWFsKDAsIHNpZ25hdHVyZXMpO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChjcmVkZW50aWFsKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgd2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgaWYgKGlucHV0U3VtIDwgdG90YWwpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEluc3VmZmljaWVudCBmdW5kczogbmVlZCAke3RvdGFsfSwgaGF2ZSAke2lucHV0U3VtfWApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IENyZWF0ZSBjaGFuZ2Ugb3V0cHV0IGlmIHdlIGhhdmUgZXhjZXNzIGlucHV0XG4gICAgLy8gVGhlIFRyYW5zZmVyYWJsZU91dHB1dCBjcmVhdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkIG9uY2UgRmxhcmVKUyB0eXBlcyBhcmUgcmVzb2x2ZWRcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1NpZ25hdHVyZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU2lnbmF0dXJlcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKCcweCcpID8gc2lnLnNsaWNlKDIpIDogc2lnO1xuICAgICAgaWYgKCEvXlswLTlhLWZBLUZdKiQvLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCAnaGV4Jyk7XG4gICAgICBpZiAoc2lnQnVmZmVyLmxlbmd0aCA+IFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYFNpZ25hdHVyZSB0b28gbG9uZyBhdCBpbmRleCAke2luZGV4fTogJHtzaWdCdWZmZXIubGVuZ3RofSBieXRlcyAobWF4ICR7U0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEh9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGZpeGVkLWxlbmd0aCBidWZmZXIgYW5kIGNvcHkgc2lnbmF0dXJlIGRhdGFcbiAgICAgIGNvbnN0IGZpeGVkTGVuZ3RoQnVmZmVyID0gQnVmZmVyLmFsbG9jKFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKTtcbiAgICAgIHNpZ0J1ZmZlci5jb3B5KGZpeGVkTGVuZ3RoQnVmZmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoZml4ZWRMZW5ndGhCdWZmZXIpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IENyZWRlbnRpYWwoc2lncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIGNyZWRlbnRpYWw6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgKHBsYWNlaG9sZGVyIGltcGxlbWVudGF0aW9uKVxuICAgKiBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIEZsYXJlSlMgc2lnbmluZ1xuICAgKi9cbiAgc2lnbihfcGFyYW1zOiB7IGtleTogc3RyaW5nIH0pOiB0aGlzIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyBzaWduaW5nXG4gICAgLy8gRm9yIG5vdywganVzdCBtYXJrIGFzIGhhdmluZyBjcmVkZW50aWFsc1xuICAgIHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiAocGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb24pXG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBidWlsZGluZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBUT0RPOiBDcmVhdGUgYWN0dWFsIEZsYXJlSlMgVW5zaWduZWRUeFxuICAgIC8vIEZvciBub3csIHJldHVybiBhIG1vY2sgdHJhbnNhY3Rpb24gdGhhdCBzYXRpc2ZpZXMgdGhlIGludGVyZmFjZVxuICAgIGNvbnN0IG1vY2tUcmFuc2FjdGlvbiA9IHtcbiAgICAgIF9pZDogJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgX2lucHV0czogW10sXG4gICAgICBfb3V0cHV0czogW10sXG4gICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICBzaWduYXR1cmU6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+ICdtb2NrLXR4LWhleCcsXG4gICAgICB0b0pzb246ICgpID0+ICh7fSksXG4gICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgIGlkOiAnbW9jay10cmFuc2FjdGlvbi1pZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogJzAnIH0sXG4gICAgICB9KSxcbiAgICAgIGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW46IGZhbHNlLFxuICAgICAgZnJvbUFkZHJlc3NlczogW10sXG4gICAgICB2YWxpZGF0aW9uRXJyb3JzOiBbXSxcbiAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgIC8qIHBsYWNlaG9sZGVyICovXG4gICAgICB9LFxuICAgICAgaW5wdXRzOiAoKSA9PiBbXSxcbiAgICAgIG91dHB1dHM6ICgpID0+IFtdLFxuICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6ICcwJyB9KSxcbiAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICBpZDogKCkgPT4gJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgfSBhcyB1bmtub3duIGFzIEJhc2VUcmFuc2FjdGlvbjtcblxuICAgIHJldHVybiBtb2NrVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCAocGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb24pXG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBwYXJzaW5nXG4gICAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgLy8gVE9ETzogUGFyc2UgYWN0dWFsIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gYmFzaWMgZXhwbGFuYXRpb25cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBvdXRwdXRBbW91bnQ6ICcwJyxcbiAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICBpZDogJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIGZlZTogeyBmZWU6ICcwJyB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQTBEO0FBQzFELCtDQUE0QztBQUM1QyxtREFRK0I7QUFFL0Isb0RBQTRCO0FBUzVCLE1BQXNCLHdCQUF5QixTQUFRLHVDQUFrQjtJQUl2RSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUhYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSTlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxpQkFBaUIsQ0FBQyxNQUFjO1FBS3hDLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxXQUEyQixDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QiwrQkFBK0I7WUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztR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QUMsR0FBRyxDQUFDLElBQUksaUJBQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixzRUFBc0U7WUFDdEUsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3QyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksaUJBQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXpVRCw0REF5VUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgVHJhbnNmZXJhYmxlSW5wdXQsXG4gIEludCxcbiAgSWQsXG4gIFR5cGVTeW1ib2xzLFxuICBDcmVkZW50aWFsLFxuICBBZGRyZXNzLFxuICB1dGlscyBhcyBGbGFyZVV0aWxzLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLy8gSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgY2FuIHByb3ZpZGUgYW4gYW1vdW50XG5pbnRlcmZhY2UgQW1vdW50ZXIge1xuICBfdHlwZTogVHlwZVN5bWJvbHM7XG4gIGFtb3VudDogKCkgPT4gYmlnaW50O1xuICB0b0J5dGVzOiAoKSA9PiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF9leHRlcm5hbENoYWluSWQ6IEJ1ZmZlcjtcbiAgcHJvdGVjdGVkIHJlY292ZXJTaWduZXIgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSA9IHRoaXMuZml4ZWRGZWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlucHV0cyBhbmQgb3V0cHV0cyBmcm9tIFVUWE9zXG4gICAqIEBwYXJhbSB7YmlnaW50fSBhbW91bnQgQW1vdW50IHRvIHRyYW5zZmVyXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgKiAgICAgb3V0cHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICogICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW107XG4gICAqIH1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUlucHV0T3V0cHV0KGFtb3VudDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW107XG4gIH0ge1xuICAgIGNvbnN0IHNlbmRlciA9ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fZnJvbUFkZHJlc3Nlcy5zbGljZSgpO1xuICAgIGlmICh0aGlzLnJlY292ZXJTaWduZXIpIHtcbiAgICAgIC8vIHN3aXRjaCBmaXJzdCBhbmQgbGFzdCBzaWduZXJcbiAgICAgIGNvbnN0IHRtcCA9IHNlbmRlci5wb3AoKTtcbiAgICAgIHNlbmRlci5wdXNoKHNlbmRlclswXSk7XG4gICAgICBpZiAodG1wKSB7XG4gICAgICAgIHNlbmRlclswXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG90YWxBbW91bnQgPSBCaWdJbnQoMCk7XG4gICAgY29uc3QgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gW107XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fdXR4b3MuZm9yRWFjaCgodXR4bzogRGVjb2RlZFV0eG9PYmopID0+IHtcbiAgICAgIGNvbnN0IHV0eG9BbW91bnQgPSBCaWdJbnQodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxBbW91bnQgKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gQ3JlYXRlIGlucHV0XG4gICAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLklucHV0LFxuICAgICAgICBhbW91bnQ6ICgpID0+IHV0eG9BbW91bnQsXG4gICAgICAgIHNpZ0luZGljZXM6IHNlbmRlci5tYXAoKF8sIGkpID0+IGkpLFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGFzc2V0IHdpdGggQW1vdW50ZXIgaW50ZXJmYWNlXG4gICAgICBjb25zdCBhc3NldElkOiBBbW91bnRlciA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLkJhc2VUeCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiB1dHhvQW1vdW50LFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Fzc2V0SWQsICdoZXgnKSk7XG4gICAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0XG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAge1xuICAgICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5VVFhPSUQsXG4gICAgICAgICAgdHhJRDogbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8udHhpZCwgJ2hleCcpKSksXG4gICAgICAgICAgb3V0cHV0SWR4OiBuZXcgSW50KE51bWJlcih1dHhvLm91dHB1dGlkeCkpLFxuICAgICAgICAgIElEOiAoKSA9PiB1dHhvLnR4aWQsXG4gICAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXR4by50eGlkLCAnaGV4JykpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SWR4Qnl0ZXMgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIG5ldyBEYXRhVmlldyhvdXRwdXRJZHhCeXRlcy5idWZmZXIpLnNldEludDMyKDAsIE51bWJlcih1dHhvLm91dHB1dGlkeCksIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3R4SWRCeXRlcywgb3V0cHV0SWR4Qnl0ZXNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXR4by5vdXRwdXRpZHgudG9TdHJpbmcoKSkpKSxcbiAgICAgICAgYXNzZXRJZFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IGlucHV0IHByb3BlcnRpZXNcbiAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNmZXJhYmxlSW5wdXQsIHsgaW5wdXQgfSk7XG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggZW1wdHkgc2lnbmF0dXJlcyBmb3Igc2xvdCBpZGVudGlmaWNhdGlvblxuICAgICAgLy8gTWF0Y2ggYXZheHAgYmVoYXZpb3I6IGR5bmFtaWMgb3JkZXJpbmcgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXggZnJvbSBVVFhPXG4gICAgICBjb25zdCBoYXNBZGRyZXNzZXMgPSBzZW5kZXIgJiYgc2VuZGVyLmxlbmd0aCA+PSAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX3RocmVzaG9sZDtcblxuICAgICAgaWYgKCFoYXNBZGRyZXNzZXMpIHtcbiAgICAgICAgLy8gSWYgYWRkcmVzc2VzIG5vdCBhdmFpbGFibGUsIHVzZSBhbGwgemVyb3NcbiAgICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzID0gc2VuZGVyLm1hcCgoKSA9PiB1dGlscy5jcmVhdGVOZXdTaWcoJycpKTtcbiAgICAgICAgY3JlZGVudGlhbHMucHVzaChuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENvbXB1dGUgYWRkcmVzc2VzSW5kZXg6IHBvc2l0aW9uIG9mIGVhY2ggX2Zyb21BZGRyZXNzZXMgaW4gVVRYTydzIGFkZHJlc3MgbGlzdFxuICAgICAgICBjb25zdCB1dHhvQWRkcmVzc2VzID0gdXR4by5hZGRyZXNzZXMubWFwKChhOiBzdHJpbmcpID0+IHV0aWxzLnBhcnNlQWRkcmVzcyhhKSk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3Nlc0luZGV4ID0gc2VuZGVyLm1hcCgoYSkgPT5cbiAgICAgICAgICB1dHhvQWRkcmVzc2VzLmZpbmRJbmRleCgodSkgPT4gQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20odSksIEJ1ZmZlci5mcm9tKGEpKSA9PT0gMClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBlaXRoZXIgdXNlciAoMCkgb3IgcmVjb3ZlcnkgKDIpXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLnJlY292ZXJTaWduZXIgPyAyIDogMDtcbiAgICAgICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAgICAgLy8gRHluYW1pYyBvcmRlcmluZyBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleFxuICAgICAgICBsZXQgZW1wdHlTaWduYXR1cmVzOiBSZXR1cm5UeXBlPHR5cGVvZiB1dGlscy5jcmVhdGVOZXdTaWc+W107XG4gICAgICAgIGlmIChhZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XSA8IGFkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdKSB7XG4gICAgICAgICAgLy8gQml0Z28gY29tZXMgZmlyc3QgaW4gc2lnbmF0dXJlIG9yZGVyOiBbemVyb3MsIHVzZXJBZGRyZXNzXVxuICAgICAgICAgIGVtcHR5U2lnbmF0dXJlcyA9IFtcbiAgICAgICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZygnJyksXG4gICAgICAgICAgICB1dGlscy5jcmVhdGVFbXB0eVNpZ1dpdGhBZGRyZXNzKEJ1ZmZlci5mcm9tKHNlbmRlcltmaXJzdEluZGV4XSkudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZXIgY29tZXMgZmlyc3QgaW4gc2lnbmF0dXJlIG9yZGVyOiBbdXNlckFkZHJlc3MsIHplcm9zXVxuICAgICAgICAgIGVtcHR5U2lnbmF0dXJlcyA9IFtcbiAgICAgICAgICAgIHV0aWxzLmNyZWF0ZUVtcHR5U2lnV2l0aEFkZHJlc3MoQnVmZmVyLmZyb20oc2VuZGVyW2ZpcnN0SW5kZXhdKS50b1N0cmluZygnaGV4JykpLFxuICAgICAgICAgICAgdXRpbHMuY3JlYXRlTmV3U2lnKCcnKSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNyZWRlbnRpYWxzLnB1c2gobmV3IENyZWRlbnRpYWwoZW1wdHlTaWduYXR1cmVzKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgb3V0cHV0IGlmIHRoZXJlIGlzIGNoYW5nZVxuICAgIGlmICh0b3RhbEFtb3VudCA+IGFtb3VudCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdG90YWxBbW91bnQgLSBhbW91bnQ7XG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5CYXNlVHgsXG4gICAgICAgIGFtb3VudDogKCkgPT4gY2hhbmdlQW1vdW50LFxuICAgICAgICBhZGRyZXNzZXM6IHNlbmRlcixcbiAgICAgICAgbG9ja3RpbWU6ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fbG9ja3RpbWUsXG4gICAgICAgIHRocmVzaG9sZDogKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl90aHJlc2hvbGQsXG4gICAgICAgIHRvQnl0ZXM6ICgpID0+IG5ldyBVaW50OEFycmF5KCksXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgYXNzZXQgd2l0aCBBbW91bnRlciBpbnRlcmZhY2VcbiAgICAgIGNvbnN0IGFzc2V0SWQ6IEFtb3VudGVyID0ge1xuICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuQmFzZVR4LFxuICAgICAgICBhbW91bnQ6ICgpID0+IGNoYW5nZUFtb3VudCxcbiAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9hc3NldElkLCAnaGV4JykpO1xuICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBUcmFuc2ZlcmFibGVPdXRwdXRcbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZU91dHB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAge1xuICAgICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5VVFhPSUQsXG4gICAgICAgICAgdHhJRDogbmV3IElkKG5ldyBVaW50OEFycmF5KDMyKSksXG4gICAgICAgICAgb3V0cHV0SWR4OiBuZXcgSW50KDApLFxuICAgICAgICAgIElEOiAoKSA9PiAnJyxcbiAgICAgICAgICB0b0J5dGVzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eElkQnl0ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRJZHhCeXRlcyA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3R4SWRCeXRlcywgb3V0cHV0SWR4Qnl0ZXNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoWzBdKSksXG4gICAgICAgIGFzc2V0SWRcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBvdXRwdXQgcHJvcGVydGllc1xuICAgICAgT2JqZWN0LmFzc2lnbih0cmFuc2ZlcmFibGVPdXRwdXQsIHsgb3V0cHV0IH0pO1xuICAgICAgb3V0cHV0cy5wdXNoKHRyYW5zZmVyYWJsZU91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBpZiAodGhpcy5oYXNTaWduZXIoKSkge1xuICAgICAgLy8gU2lnbiBzZXF1ZW50aWFsbHkgdG8gZW5zdXJlIHByb3BlciBvcmRlclxuICAgICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX3NpZ25lcikge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ24oa2V5UGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgRmxhcmUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9uIGZpZWxkIGlzIGNoYW5nZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBGZWUgaXMgZml4IGZvciBBVk0gYXRvbWljIHR4LlxuICAgKlxuICAgKiBAcmV0dXJucyBuZXR3b3JrLnR4RmVlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZml4ZWRGZWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGNoYWluIGlzIHRoZSBvbmUgc2V0IGZvciB0aGUgY29pbiBpbiBjb2luQ29uZmlnLm5ldHdvcmsuIFRoZSBleHRlcm5hbCBjaGFpbiBpcyB0aGUgb3RoZXIgY2hhaW4gaW52b2x2ZWQuXG4gICAqIFRoZSBleHRlcm5hbCBjaGFpbiBpZCBpcyB0aGUgc291cmNlIG9uIGltcG9ydCBhbmQgdGhlIGRlc3RpbmF0aW9uIG9uIGV4cG9ydC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYWluSWQgLSBpZCBvZiB0aGUgZXh0ZXJuYWwgY2hhaW5cbiAgICovXG4gIGV4dGVybmFsQ2hhaW5JZChjaGFpbklkOiBzdHJpbmcgfCBCdWZmZXIpOiB0aGlzIHtcbiAgICBjb25zdCBuZXdUYXJnZXRDaGFpbklkID0gdHlwZW9mIGNoYWluSWQgPT09ICdzdHJpbmcnID8gdXRpbHMuY2I1OERlY29kZShjaGFpbklkKSA6IEJ1ZmZlci5mcm9tKGNoYWluSWQpO1xuICAgIHRoaXMudmFsaWRhdGVDaGFpbklkKG5ld1RhcmdldENoYWluSWQpO1xuICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IG5ld1RhcmdldENoYWluSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiBmZWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBiaWdpbnR9IGZlZVZhbHVlIC0gdGhlIGZlZSB2YWx1ZVxuICAgKi9cbiAgZmVlKGZlZVZhbHVlOiBzdHJpbmcgfCBiaWdpbnQpOiB0aGlzIHtcbiAgICBjb25zdCBmZWUgPSB0eXBlb2YgZmVlVmFsdWUgPT09ICdzdHJpbmcnID8gZmVlVmFsdWUgOiBmZWVWYWx1ZS50b1N0cmluZygpO1xuICAgICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fZmVlLmZlZSA9IGZlZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY3JlZGVudGlhbCB3aXRoIGR5bmFtaWMgb3JkZXJpbmcgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXggZnJvbSBVVFhPXG4gICAqIE1hdGNoZXMgYXZheHAgYmVoYXZpb3I6IHNpZ25hdHVyZSBvcmRlciBkZXBlbmRzIG9uIFVUWE8gYWRkcmVzcyBwb3NpdGlvbnNcbiAgICogQHBhcmFtIHV0eG8gLSBUaGUgVVRYTyB0byBjcmVhdGUgY3JlZGVudGlhbCBmb3JcbiAgICogQHBhcmFtIHRocmVzaG9sZCAtIE51bWJlciBvZiBzaWduYXR1cmVzIHJlcXVpcmVkXG4gICAqIEByZXR1cm5zIENyZWRlbnRpYWwgd2l0aCBlbXB0eSBzaWduYXR1cmVzIG9yZGVyZWQgYmFzZWQgb24gVVRYTyBwb3NpdGlvbnNcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvKHV0eG86IERlY29kZWRVdHhvT2JqLCB0aHJlc2hvbGQ6IG51bWJlcik6IENyZWRlbnRpYWwge1xuICAgIGNvbnN0IHNlbmRlciA9ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fZnJvbUFkZHJlc3NlcztcbiAgICBjb25zdCBoYXNBZGRyZXNzZXMgPSBzZW5kZXIgJiYgc2VuZGVyLmxlbmd0aCA+PSB0aHJlc2hvbGQ7XG5cbiAgICBpZiAoIWhhc0FkZHJlc3NlcyB8fCAhdXR4by5hZGRyZXNzZXMgfHwgdXR4by5hZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBGYWxsYmFjazogdXNlIGFsbCB6ZXJvcyBpZiBubyBhZGRyZXNzZXMgYXZhaWxhYmxlXG4gICAgICBjb25zdCBlbXB0eVNpZ25hdHVyZXM6IFJldHVyblR5cGU8dHlwZW9mIHV0aWxzLmNyZWF0ZU5ld1NpZz5bXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlc2hvbGQ7IGkrKykge1xuICAgICAgICBlbXB0eVNpZ25hdHVyZXMucHVzaCh1dGlscy5jcmVhdGVOZXdTaWcoJycpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgYWRkcmVzc2VzSW5kZXg6IHBvc2l0aW9uIG9mIGVhY2ggX2Zyb21BZGRyZXNzZXMgaW4gVVRYTydzIGFkZHJlc3MgbGlzdFxuICAgIGNvbnN0IHV0eG9BZGRyZXNzZXMgPSB1dHhvLmFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLnBhcnNlQWRkcmVzcyhhKSk7XG4gICAgY29uc3QgYWRkcmVzc2VzSW5kZXggPSBzZW5kZXIubWFwKChhKSA9PlxuICAgICAgdXR4b0FkZHJlc3Nlcy5maW5kSW5kZXgoKHUpID0+IEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKHUpLCBCdWZmZXIuZnJvbShhKSkgPT09IDApXG4gICAgKTtcblxuICAgIC8vIGVpdGhlciB1c2VyICgwKSBvciByZWNvdmVyeSAoMilcbiAgICBjb25zdCBmaXJzdEluZGV4ID0gdGhpcy5yZWNvdmVyU2lnbmVyID8gMiA6IDA7XG4gICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAvLyBEeW5hbWljIG9yZGVyaW5nIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4XG4gICAgbGV0IGVtcHR5U2lnbmF0dXJlczogUmV0dXJuVHlwZTx0eXBlb2YgdXRpbHMuY3JlYXRlTmV3U2lnPltdO1xuICAgIGlmIChhZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XSA8IGFkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdKSB7XG4gICAgICAvLyBCaXRnbyBjb21lcyBmaXJzdCBpbiBzaWduYXR1cmUgb3JkZXI6IFt6ZXJvcywgdXNlckFkZHJlc3NdXG4gICAgICBlbXB0eVNpZ25hdHVyZXMgPSBbXG4gICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZygnJyksXG4gICAgICAgIHV0aWxzLmNyZWF0ZUVtcHR5U2lnV2l0aEFkZHJlc3MoQnVmZmVyLmZyb20oc2VuZGVyW2ZpcnN0SW5kZXhdKS50b1N0cmluZygnaGV4JykpLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlciBjb21lcyBmaXJzdCBpbiBzaWduYXR1cmUgb3JkZXI6IFt1c2VyQWRkcmVzcywgemVyb3NdXG4gICAgICBlbXB0eVNpZ25hdHVyZXMgPSBbXG4gICAgICAgIHV0aWxzLmNyZWF0ZUVtcHR5U2lnV2l0aEFkZHJlc3MoQnVmZmVyLmZyb20oc2VuZGVyW2ZpcnN0SW5kZXhdKS50b1N0cmluZygnaGV4JykpLFxuICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoJycpLFxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDcmVkZW50aWFsKGVtcHR5U2lnbmF0dXJlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEFkZHJlc3NNYXAgYmFzZWQgb24gc2lnbmF0dXJlIHNsb3Qgb3JkZXIgKG1hdGNoaW5nIGNyZWRlbnRpYWwgb3JkZXIpLCBub3Qgc29ydGVkIGFkZHJlc3Nlc1xuICAgKiBUaGlzIG1hdGNoZXMgdGhlIGFwcHJvYWNoIHVzZWQgaW4gY3JlZGVudGlhbHM6IGFkZHJlc3Nlc0luZGV4IGRldGVybWluZXMgc2lnbmF0dXJlIG9yZGVyXG4gICAqIEFkZHJlc3NNYXBzIHNob3VsZCBtYXAgYWRkcmVzc2VzIHRvIHNpZ25hdHVyZSBzbG90cyBpbiB0aGUgc2FtZSBvcmRlciBhcyBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gdXR4byAtIFRoZSBVVFhPIHRvIGNyZWF0ZSBBZGRyZXNzTWFwIGZvclxuICAgKiBAcGFyYW0gdGhyZXNob2xkIC0gTnVtYmVyIG9mIHNpZ25hdHVyZXMgcmVxdWlyZWRcbiAgICogQHJldHVybnMgQWRkcmVzc01hcCB0aGF0IG1hcHMgYWRkcmVzc2VzIHRvIHNpZ25hdHVyZSBzbG90cyBiYXNlZCBvbiBVVFhPIG9yZGVyXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBZGRyZXNzTWFwRm9yVXR4byh1dHhvOiBEZWNvZGVkVXR4b09iaiwgdGhyZXNob2xkOiBudW1iZXIpOiBGbGFyZVV0aWxzLkFkZHJlc3NNYXAge1xuICAgIGNvbnN0IGFkZHJlc3NNYXAgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwKCk7XG4gICAgY29uc3Qgc2VuZGVyID0gKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9mcm9tQWRkcmVzc2VzO1xuXG4gICAgLy8gSWYgVVRYTyBoYXMgYWRkcmVzc2VzLCBjb21wdXRlIGFkZHJlc3Nlc0luZGV4IHRvIGRldGVybWluZSBzaWduYXR1cmUgb3JkZXJcbiAgICBpZiAodXR4byAmJiB1dHhvLmFkZHJlc3NlcyAmJiB1dHhvLmFkZHJlc3Nlcy5sZW5ndGggPiAwICYmIHNlbmRlciAmJiBzZW5kZXIubGVuZ3RoID49IHRocmVzaG9sZCkge1xuICAgICAgY29uc3QgdXR4b0FkZHJlc3NlcyA9IHV0eG8uYWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGEpKTtcbiAgICAgIGNvbnN0IGFkZHJlc3Nlc0luZGV4ID0gc2VuZGVyLm1hcCgoYSkgPT5cbiAgICAgICAgdXR4b0FkZHJlc3Nlcy5maW5kSW5kZXgoKHUpID0+IEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKHUpLCBCdWZmZXIuZnJvbShhKSkgPT09IDApXG4gICAgICApO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gdGhpcy5yZWNvdmVyU2lnbmVyID8gMiA6IDA7XG4gICAgICBjb25zdCBiaXRnb0luZGV4ID0gMTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHNpZ25hdHVyZSBzbG90IG9yZGVyIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4IChzYW1lIGxvZ2ljIGFzIGNyZWRlbnRpYWxzKVxuICAgICAgaWYgKGFkZHJlc3Nlc0luZGV4W2JpdGdvSW5kZXhdIDwgYWRkcmVzc2VzSW5kZXhbZmlyc3RJbmRleF0pIHtcbiAgICAgICAgLy8gQml0Z28gY29tZXMgZmlyc3Q6IHNsb3QgMCA9IGJpdGdvLCBzbG90IDEgPSBmaXJzdEluZGV4XG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKHNlbmRlcltiaXRnb0luZGV4XSksIDApO1xuICAgICAgICBhZGRyZXNzTWFwLnNldChuZXcgQWRkcmVzcyhzZW5kZXJbZmlyc3RJbmRleF0pLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZXIvcmVjb3ZlcnkgY29tZXMgZmlyc3Q6IHNsb3QgMCA9IGZpcnN0SW5kZXgsIHNsb3QgMSA9IGJpdGdvXG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKHNlbmRlcltmaXJzdEluZGV4XSksIDApO1xuICAgICAgICBhZGRyZXNzTWFwLnNldChuZXcgQWRkcmVzcyhzZW5kZXJbYml0Z29JbmRleF0pLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2s6IG1hcCBhZGRyZXNzZXMgc2VxdWVudGlhbGx5IGlmIG5vIFVUWE8gYWRkcmVzc2VzIGF2YWlsYWJsZVxuICAgICAgaWYgKHNlbmRlciAmJiBzZW5kZXIubGVuZ3RoID49IHRocmVzaG9sZCkge1xuICAgICAgICBzZW5kZXIuc2xpY2UoMCwgdGhyZXNob2xkKS5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICAgICAgYWRkcmVzc01hcC5zZXQobmV3IEFkZHJlc3MoYWRkciksIGkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWRkcmVzc01hcDtcbiAgfVxufVxuIl19
|