@bitgo-beta/sdk-coin-flrp 1.0.1-beta.32 → 1.0.1-beta.320
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 +9 -16
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +49 -75
- 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 +188 -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 +273 -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 +215 -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 +180 -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 +42 -76
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +141 -218
- 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 +14 -69
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +258 -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 +74 -147
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +235 -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 +34 -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 +449 -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 +166 -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 +121 -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 +47 -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 +73 -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 +89 -0
- package/dist/test/unit/lib/utils.js +507 -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
|
@@ -5,127 +5,190 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Transaction = void 0;
|
|
7
7
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
8
9
|
const buffer_1 = require("buffer");
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
9
11
|
const iface_1 = require("./iface");
|
|
10
12
|
const utils_1 = __importDefault(require("./utils"));
|
|
11
13
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
+
* Checks if a signature is empty (first 90 hex chars are zeros)
|
|
15
|
+
* @param signature
|
|
16
|
+
* @returns {boolean}
|
|
14
17
|
*/
|
|
18
|
+
function isEmptySignature(signature) {
|
|
19
|
+
return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Checks if an empty signature has an embedded address (non-zero bytes after position 90)
|
|
23
|
+
* @param signature Hex string of the signature
|
|
24
|
+
*/
|
|
25
|
+
function hasEmbeddedAddress(signature) {
|
|
26
|
+
if (!isEmptySignature(signature))
|
|
27
|
+
return false;
|
|
28
|
+
const cleanSig = utils_1.default.removeHexPrefix(signature);
|
|
29
|
+
if (cleanSig.length < 130)
|
|
30
|
+
return false;
|
|
31
|
+
const embeddedPart = cleanSig.substring(90, 130);
|
|
32
|
+
// Check if it's not all zeros
|
|
33
|
+
return embeddedPart !== '0'.repeat(40);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generates a function to check if a signature slot matches a given address.
|
|
37
|
+
* If signatures have embedded addresses, it matches by address.
|
|
38
|
+
* Otherwise, it just finds empty slots.
|
|
39
|
+
* @param signatures Array of signature hex strings
|
|
40
|
+
*/
|
|
41
|
+
function generateSelectorSignature(signatures) {
|
|
42
|
+
// Check if any empty signature has an embedded address
|
|
43
|
+
const hasEmbeddedAddresses = signatures.some((sig) => isEmptySignature(sig) && hasEmbeddedAddress(sig));
|
|
44
|
+
if (hasEmbeddedAddresses) {
|
|
45
|
+
// Look for address embedded in the empty signature (after position 90)
|
|
46
|
+
return function (sig, address) {
|
|
47
|
+
try {
|
|
48
|
+
if (!isEmptySignature(sig)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const cleanSig = utils_1.default.removeHexPrefix(sig);
|
|
52
|
+
const embeddedAddr = cleanSig.substring(90, 130).toLowerCase();
|
|
53
|
+
return embeddedAddr === address.toLowerCase();
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Look for any empty slot (no embedded addresses)
|
|
62
|
+
return function (sig, address) {
|
|
63
|
+
return isEmptySignature(sig);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
15
67
|
class Transaction extends sdk_core_1.BaseTransaction {
|
|
16
68
|
constructor(coinConfig) {
|
|
17
69
|
super(coinConfig);
|
|
18
70
|
this._threshold = 2;
|
|
19
71
|
this._locktime = BigInt(0);
|
|
20
72
|
this._fromAddresses = [];
|
|
73
|
+
this._to = [];
|
|
21
74
|
this._rewardAddresses = [];
|
|
22
|
-
this._utxos = [];
|
|
75
|
+
this._utxos = []; // Define proper type based on Flare's UTXO structure
|
|
23
76
|
this._fee = {};
|
|
24
|
-
this._memo = new Uint8Array(); // FlareJS memo field
|
|
25
77
|
this._network = coinConfig.network;
|
|
26
|
-
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Get the base transaction from FlareJS UnsignedTx
|
|
32
|
-
* TODO: Implement proper FlareJS transaction extraction
|
|
33
|
-
*/
|
|
34
|
-
get flareTransaction() {
|
|
35
|
-
return this._flareTransaction;
|
|
78
|
+
// Decode cb58-encoded asset ID to hex for use in transaction serialization
|
|
79
|
+
this._assetId = utils_1.default.cb58Decode(this._network.assetId).toString('hex');
|
|
80
|
+
this._blockchainID = this._network.blockchainID;
|
|
81
|
+
this._networkID = this._network.networkID;
|
|
36
82
|
}
|
|
37
83
|
get signature() {
|
|
38
|
-
if (this.
|
|
84
|
+
if (!this.hasCredentials) {
|
|
39
85
|
return [];
|
|
40
86
|
}
|
|
41
|
-
|
|
42
|
-
// For now, return placeholder
|
|
43
|
-
return [];
|
|
87
|
+
return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
|
|
44
88
|
}
|
|
45
89
|
get credentials() {
|
|
46
|
-
|
|
47
|
-
// For now, return empty array
|
|
48
|
-
return [];
|
|
90
|
+
return this._flareTransaction?.credentials;
|
|
49
91
|
}
|
|
50
92
|
get hasCredentials() {
|
|
51
93
|
return this.credentials !== undefined && this.credentials.length > 0;
|
|
52
94
|
}
|
|
53
95
|
/** @inheritdoc */
|
|
54
96
|
canSign({ key }) {
|
|
55
|
-
// TODO: Implement proper signing validation for FlareJS
|
|
56
97
|
return true;
|
|
57
98
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Sign a Flare transaction using FlareJS
|
|
60
|
-
* @param {KeyPair} keyPair
|
|
61
|
-
*/
|
|
62
99
|
async sign(keyPair) {
|
|
63
100
|
const prv = keyPair.getPrivateKey();
|
|
64
101
|
if (!prv) {
|
|
65
102
|
throw new sdk_core_1.SigningError('Missing private key');
|
|
66
103
|
}
|
|
67
|
-
if (!this.
|
|
104
|
+
if (!this._flareTransaction) {
|
|
68
105
|
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
|
|
69
106
|
}
|
|
70
107
|
if (!this.hasCredentials) {
|
|
71
108
|
throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
|
|
72
109
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
//
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
110
|
+
const unsignedTx = this._flareTransaction;
|
|
111
|
+
const unsignedBytes = unsignedTx.toBytes();
|
|
112
|
+
const publicKey = flarejs_1.secp256k1.getPublicKey(prv);
|
|
113
|
+
// Derive both EVM and P-chain addresses from the public key
|
|
114
|
+
const evmAddressHex = new flarejs_1.Address(flarejs_1.secp256k1.publicKeyToEthAddress(publicKey)).toHex();
|
|
115
|
+
// P-chain address derivation: ripemd160(sha256(publicKey))
|
|
116
|
+
const sha256Hash = (0, crypto_1.createHash)('sha256').update(buffer_1.Buffer.from(publicKey)).digest();
|
|
117
|
+
const pChainAddressBuffer = (0, crypto_1.createHash)('ripemd160').update(sha256Hash).digest();
|
|
118
|
+
const pChainAddressHex = pChainAddressBuffer.toString('hex');
|
|
119
|
+
const addressMap = unsignedTx.getAddresses();
|
|
120
|
+
// Check for both EVM and P-chain address formats
|
|
121
|
+
const hasMatchingAddress = addressMap.some((addr) => {
|
|
122
|
+
const addrHex = buffer_1.Buffer.from(addr).toString('hex').toLowerCase();
|
|
123
|
+
return (addrHex === utils_1.default.removeHexPrefix(evmAddressHex).toLowerCase() || addrHex === pChainAddressHex.toLowerCase());
|
|
124
|
+
});
|
|
125
|
+
const signature = await flarejs_1.secp256k1.sign(unsignedBytes, prv);
|
|
126
|
+
let signatureSet = false;
|
|
127
|
+
if (hasMatchingAddress) {
|
|
128
|
+
// Use address-based slot matching (like AVAX-P)
|
|
129
|
+
let checkSign = undefined;
|
|
130
|
+
for (const credential of unsignedTx.credentials) {
|
|
131
|
+
const signatures = credential.getSignatures();
|
|
132
|
+
if (checkSign === undefined) {
|
|
133
|
+
checkSign = generateSelectorSignature(signatures);
|
|
134
|
+
}
|
|
135
|
+
// Find the slot that matches this address
|
|
136
|
+
for (let i = 0; i < signatures.length; i++) {
|
|
137
|
+
const sig = signatures[i];
|
|
138
|
+
// Try matching with P-chain address first, then EVM address
|
|
139
|
+
if (checkSign(sig, pChainAddressHex) || checkSign(sig, utils_1.default.removeHexPrefix(evmAddressHex).toLowerCase())) {
|
|
140
|
+
credential.setSignature(i, signature);
|
|
141
|
+
signatureSet = true;
|
|
142
|
+
// Clear raw signed bytes since we've modified the transaction
|
|
143
|
+
this._rawSignedBytes = undefined;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (signatureSet)
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Fallback: If address-based matching didn't work (e.g., ImportInC loaded from unsigned tx
|
|
152
|
+
// where P-chain addresses aren't in addressMaps), try to sign the first empty slot.
|
|
153
|
+
// This handles the case where we have empty credentials but signer address isn't in the map.
|
|
154
|
+
if (!signatureSet) {
|
|
155
|
+
for (const credential of unsignedTx.credentials) {
|
|
156
|
+
const signatures = credential.getSignatures();
|
|
157
|
+
for (let i = 0; i < signatures.length; i++) {
|
|
158
|
+
if (isEmptySignature(signatures[i])) {
|
|
159
|
+
credential.setSignature(i, signature);
|
|
160
|
+
signatureSet = true;
|
|
161
|
+
this._rawSignedBytes = undefined;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (signatureSet)
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!signatureSet) {
|
|
170
|
+
throw new sdk_core_1.SigningError('No matching signature slot found for this private key');
|
|
171
|
+
}
|
|
117
172
|
}
|
|
118
|
-
/** @inheritdoc */
|
|
119
173
|
toBroadcastFormat() {
|
|
120
|
-
if (!this.
|
|
174
|
+
if (!this._flareTransaction) {
|
|
121
175
|
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
122
176
|
}
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
177
|
+
// If we have the original raw signed bytes, use them directly to preserve exact format
|
|
178
|
+
if (this._rawSignedBytes) {
|
|
179
|
+
return flarejs_1.utils.bufferToHex(this._rawSignedBytes);
|
|
180
|
+
}
|
|
181
|
+
const unsignedTx = this._flareTransaction;
|
|
182
|
+
// For signed transactions, return the full signed tx with credentials
|
|
183
|
+
// Check signature.length for robustness
|
|
184
|
+
if (this.signature.length > 0) {
|
|
185
|
+
return flarejs_1.utils.bufferToHex(unsignedTx.getSignedTx().toBytes());
|
|
186
|
+
}
|
|
187
|
+
// For unsigned transactions, return just the transaction bytes
|
|
188
|
+
return flarejs_1.utils.bufferToHex(unsignedTx.toBytes());
|
|
126
189
|
}
|
|
127
190
|
toJson() {
|
|
128
|
-
if (!this.
|
|
191
|
+
if (!this._flareTransaction) {
|
|
129
192
|
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
130
193
|
}
|
|
131
194
|
return {
|
|
@@ -138,167 +201,168 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
138
201
|
signatures: this.signature,
|
|
139
202
|
outputs: this.outputs,
|
|
140
203
|
changeOutputs: this.changeOutputs,
|
|
141
|
-
sourceChain: this._network.blockchainID,
|
|
142
|
-
destinationChain: this._network.cChainBlockchainID,
|
|
143
|
-
memo: this.getMemoString(), // Include memo in JSON representation
|
|
144
204
|
};
|
|
145
205
|
}
|
|
146
206
|
setTransaction(tx) {
|
|
147
207
|
this._flareTransaction = tx;
|
|
148
208
|
}
|
|
149
209
|
/**
|
|
150
|
-
*
|
|
151
|
-
* @
|
|
210
|
+
* Get the underlying Flare transaction
|
|
211
|
+
* @returns The Flare transaction object
|
|
152
212
|
*/
|
|
213
|
+
getFlareTransaction() {
|
|
214
|
+
return this._flareTransaction;
|
|
215
|
+
}
|
|
153
216
|
setTransactionType(transactionType) {
|
|
154
|
-
|
|
155
|
-
sdk_core_1.TransactionType.Export,
|
|
156
|
-
sdk_core_1.TransactionType.Import,
|
|
157
|
-
sdk_core_1.TransactionType.AddValidator,
|
|
158
|
-
sdk_core_1.TransactionType.AddDelegator,
|
|
159
|
-
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
160
|
-
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
161
|
-
];
|
|
162
|
-
if (!supportedTypes.includes(transactionType)) {
|
|
217
|
+
if (![sdk_core_1.TransactionType.AddPermissionlessValidator].includes(transactionType)) {
|
|
163
218
|
throw new Error(`Transaction type ${transactionType} is not supported`);
|
|
164
219
|
}
|
|
165
220
|
this._type = transactionType;
|
|
166
221
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
169
|
-
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
170
|
-
*/
|
|
171
222
|
get signablePayload() {
|
|
172
|
-
|
|
173
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction for signing');
|
|
174
|
-
}
|
|
175
|
-
// TODO: Implement FlareJS signable payload extraction
|
|
176
|
-
// For now, return placeholder
|
|
177
|
-
return buffer_1.Buffer.from('flare-signable-payload');
|
|
223
|
+
return utils_1.default.sha256(this._flareTransaction.toBytes());
|
|
178
224
|
}
|
|
179
225
|
get id() {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
// TODO: Implement FlareJS transaction ID generation
|
|
184
|
-
// For now, return placeholder
|
|
185
|
-
return 'flare-transaction-id-placeholder';
|
|
226
|
+
const bufferArray = utils_1.default.sha256(this._flareTransaction.toBytes());
|
|
227
|
+
return utils_1.default.cb58Encode(buffer_1.Buffer.from(bufferArray));
|
|
186
228
|
}
|
|
187
229
|
get fromAddresses() {
|
|
188
|
-
return this._fromAddresses.map((
|
|
189
|
-
// TODO: Format addresses using FlareJS utilities
|
|
190
|
-
return address;
|
|
191
|
-
});
|
|
230
|
+
return this._fromAddresses.map((a) => flarejs_1.utils.format(this._network.alias, this._network.hrp, a));
|
|
192
231
|
}
|
|
193
232
|
get rewardAddresses() {
|
|
194
|
-
return this._rewardAddresses.map((
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
233
|
+
return this._rewardAddresses.map((a) => flarejs_1.utils.format(this._network.alias, this._network.hrp, a));
|
|
234
|
+
}
|
|
235
|
+
get fee() {
|
|
236
|
+
return { fee: '0', ...this._fee };
|
|
198
237
|
}
|
|
199
238
|
/**
|
|
200
|
-
*
|
|
239
|
+
* Check if this transaction is for C-chain (EVM transactions)
|
|
201
240
|
*/
|
|
241
|
+
get isTransactionForCChain() {
|
|
242
|
+
const tx = this._flareTransaction.getTx();
|
|
243
|
+
const txType = tx._type;
|
|
244
|
+
return txType === iface_1.FlareTransactionType.EvmExportTx || txType === iface_1.FlareTransactionType.EvmImportTx;
|
|
245
|
+
}
|
|
202
246
|
get outputs() {
|
|
247
|
+
const tx = this._flareTransaction.getTx();
|
|
203
248
|
switch (this.type) {
|
|
204
|
-
case sdk_core_1.TransactionType.Export:
|
|
205
|
-
// TODO: Extract export outputs from FlareJS transaction
|
|
206
|
-
return [];
|
|
207
249
|
case sdk_core_1.TransactionType.Import:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
250
|
+
if (this.isTransactionForCChain) {
|
|
251
|
+
// C-chain Import: output is to a C-chain address
|
|
252
|
+
const importTx = tx;
|
|
253
|
+
return importTx.Outs.map((out) => ({
|
|
254
|
+
address: '0x' + buffer_1.Buffer.from(out.address.toBytes()).toString('hex'),
|
|
255
|
+
value: out.amount.value().toString(),
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
// P-chain Import: outputs are the baseTx.outputs (destination on P-chain)
|
|
260
|
+
const pvmImportTx = tx;
|
|
261
|
+
return pvmImportTx.baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
|
|
262
|
+
}
|
|
263
|
+
case sdk_core_1.TransactionType.Export:
|
|
264
|
+
if (this.isTransactionForCChain) {
|
|
265
|
+
// C-chain Export: exported outputs go to P-chain
|
|
266
|
+
const exportTx = tx;
|
|
267
|
+
return exportTx.exportedOutputs.map(utils_1.default.mapOutputToEntry(this._network));
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// P-chain Export: exported outputs go to C-chain
|
|
271
|
+
const pvmExportTx = tx;
|
|
272
|
+
return pvmExportTx.outs.map(utils_1.default.mapOutputToEntry(this._network));
|
|
273
|
+
}
|
|
211
274
|
case sdk_core_1.TransactionType.AddPermissionlessValidator:
|
|
212
|
-
// TODO: Extract validator outputs from FlareJS transaction
|
|
213
275
|
return [
|
|
214
276
|
{
|
|
215
|
-
address:
|
|
216
|
-
value:
|
|
217
|
-
},
|
|
218
|
-
];
|
|
219
|
-
case sdk_core_1.TransactionType.AddDelegator:
|
|
220
|
-
case sdk_core_1.TransactionType.AddPermissionlessDelegator:
|
|
221
|
-
// TODO: Extract delegator outputs from FlareJS transaction
|
|
222
|
-
return [
|
|
223
|
-
{
|
|
224
|
-
address: this._nodeID || 'placeholder-node-id',
|
|
225
|
-
value: this._stakeAmount?.toString() || '0',
|
|
277
|
+
address: tx.subnetValidator.validator.nodeId.toString(),
|
|
278
|
+
value: tx.subnetValidator.validator.weight.toJSON(),
|
|
226
279
|
},
|
|
227
280
|
];
|
|
228
281
|
default:
|
|
229
282
|
return [];
|
|
230
283
|
}
|
|
231
284
|
}
|
|
232
|
-
get fee() {
|
|
233
|
-
return { fee: '0', ...this._fee };
|
|
234
|
-
}
|
|
235
285
|
get changeOutputs() {
|
|
236
|
-
|
|
237
|
-
//
|
|
238
|
-
|
|
286
|
+
const tx = this._flareTransaction.getTx();
|
|
287
|
+
// C-chain transactions and Import transactions don't have change outputs
|
|
288
|
+
if (this.isTransactionForCChain || this.type === sdk_core_1.TransactionType.Import) {
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
switch (this.type) {
|
|
292
|
+
case sdk_core_1.TransactionType.Export:
|
|
293
|
+
// P-chain Export: change outputs are in baseTx.outputs
|
|
294
|
+
return tx.baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
|
|
295
|
+
case sdk_core_1.TransactionType.AddPermissionlessValidator:
|
|
296
|
+
return tx.baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
|
|
297
|
+
default:
|
|
298
|
+
return [];
|
|
299
|
+
}
|
|
239
300
|
}
|
|
240
301
|
get inputs() {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
302
|
+
const tx = this._flareTransaction.getTx();
|
|
303
|
+
switch (this.type) {
|
|
304
|
+
case sdk_core_1.TransactionType.Import:
|
|
305
|
+
if (this.isTransactionForCChain) {
|
|
306
|
+
// C-chain Import: inputs come from P-chain (importedInputs)
|
|
307
|
+
const importTx = tx;
|
|
308
|
+
return importTx.importedInputs.map((input) => ({
|
|
309
|
+
id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
|
|
310
|
+
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
311
|
+
value: input.amount().toString(),
|
|
312
|
+
}));
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
// P-chain Import: inputs are ins (imported from C-chain)
|
|
316
|
+
const pvmImportTx = tx;
|
|
317
|
+
return pvmImportTx.ins.map((input) => ({
|
|
318
|
+
id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
|
|
319
|
+
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
320
|
+
value: input.amount().toString(),
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
case sdk_core_1.TransactionType.Export:
|
|
324
|
+
if (this.isTransactionForCChain) {
|
|
325
|
+
// C-chain Export: inputs are from C-chain (EVM inputs)
|
|
326
|
+
const exportTx = tx;
|
|
327
|
+
return exportTx.ins.map((evmInput) => ({
|
|
328
|
+
address: '0x' + buffer_1.Buffer.from(evmInput.address.toBytes()).toString('hex'),
|
|
329
|
+
value: evmInput.amount.value().toString(),
|
|
330
|
+
nonce: Number(evmInput.nonce.value()),
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
// P-chain Export: inputs are from baseTx.inputs
|
|
335
|
+
const pvmExportTx = tx;
|
|
336
|
+
return pvmExportTx.baseTx.inputs.map((input) => ({
|
|
337
|
+
id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
|
|
338
|
+
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
339
|
+
value: input.amount().toString(),
|
|
340
|
+
}));
|
|
341
|
+
}
|
|
342
|
+
case sdk_core_1.TransactionType.AddPermissionlessValidator:
|
|
343
|
+
default:
|
|
344
|
+
const baseTx = tx;
|
|
345
|
+
if (baseTx.baseTx?.inputs) {
|
|
346
|
+
return baseTx.baseTx.inputs.map((input) => ({
|
|
347
|
+
id: utils_1.default.cb58Encode(buffer_1.Buffer.from(input.utxoID.txID.toBytes())) + ':' + input.utxoID.outputIdx.value(),
|
|
348
|
+
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
349
|
+
value: input.amount().toString(),
|
|
350
|
+
}));
|
|
351
|
+
}
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
265
354
|
}
|
|
266
|
-
/** @inheritdoc */
|
|
267
355
|
explainTransaction() {
|
|
268
356
|
const txJson = this.toJson();
|
|
269
357
|
const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
displayOrder.push('memo');
|
|
273
|
-
}
|
|
274
|
-
// Calculate total output amount
|
|
275
|
-
const outputAmount = txJson.outputs
|
|
276
|
-
.reduce((sum, output) => {
|
|
277
|
-
return sum + BigInt(output.value || '0');
|
|
278
|
-
}, BigInt(0))
|
|
279
|
-
.toString();
|
|
280
|
-
// Calculate total change amount
|
|
281
|
-
const changeAmount = txJson.changeOutputs
|
|
282
|
-
.reduce((sum, output) => {
|
|
283
|
-
return sum + BigInt(output.value || '0');
|
|
284
|
-
}, BigInt(0))
|
|
285
|
-
.toString();
|
|
358
|
+
const outputAmount = txJson.outputs.reduce((p, n) => p + BigInt(n.value), BigInt(0)).toString();
|
|
359
|
+
const changeAmount = txJson.changeOutputs.reduce((p, n) => p + BigInt(n.value), BigInt(0)).toString();
|
|
286
360
|
let rewardAddresses;
|
|
287
|
-
|
|
288
|
-
sdk_core_1.TransactionType.AddValidator,
|
|
289
|
-
sdk_core_1.TransactionType.AddDelegator,
|
|
290
|
-
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
291
|
-
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
292
|
-
];
|
|
293
|
-
if (stakingTypes.includes(txJson.type)) {
|
|
361
|
+
if ([sdk_core_1.TransactionType.AddPermissionlessValidator].includes(txJson.type)) {
|
|
294
362
|
rewardAddresses = this.rewardAddresses;
|
|
295
363
|
displayOrder.splice(6, 0, 'rewardAddresses');
|
|
296
364
|
}
|
|
297
|
-
|
|
298
|
-
if (this.isTransactionForCChain) {
|
|
299
|
-
displayOrder.push('sourceChain', 'destinationChain');
|
|
300
|
-
}
|
|
301
|
-
const explanation = {
|
|
365
|
+
return {
|
|
302
366
|
displayOrder,
|
|
303
367
|
id: txJson.id,
|
|
304
368
|
inputs: txJson.inputs,
|
|
@@ -310,12 +374,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
|
|
|
310
374
|
fee: this.fee,
|
|
311
375
|
type: txJson.type,
|
|
312
376
|
};
|
|
313
|
-
// Add memo to explanation if present
|
|
314
|
-
if (this.hasMemo()) {
|
|
315
|
-
explanation.memo = this.getMemoString();
|
|
316
|
-
}
|
|
317
|
-
return explanation;
|
|
318
377
|
}
|
|
319
378
|
}
|
|
320
379
|
exports.Transaction = Transaction;
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUU5QixtQ0FBZ0M7QUFDaEMsbUNBUWlCO0FBRWpCLG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQXNCOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFaYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsY0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFFOUIsU0FBSSxHQUE0QixFQUFFLENBQUM7UUFHbkMsVUFBSyxHQUFlLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFJaEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBdUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLG9CQUFvQjtRQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQStCLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFD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QU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7UUFFRixxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuQixXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBNVdELGtDQTRXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVuc2lnbmVkVHgsIENyZWRlbnRpYWwgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25GZWUsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmxhcmVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHtcbiAgQUREUkVTU19TRVBBUkFUT1IsXG4gIERlY29kZWRVdHhvT2JqLFxuICBJTlBVVF9TRVBBUkFUT1IsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFR4LFxuICBUeERhdGEsXG4gIEZscnBFbnRyeSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9uIGltcGxlbWVudGF0aW9uIHVzaW5nIEZsYXJlSlNcbiAqIEJhc2VkIG9uIEFWQVggdHJhbnNhY3Rpb24gcGF0dGVybnMgYWRhcHRlZCBmb3IgRmxhcmUgbmV0d29ya1xuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2ZsYXJlVHJhbnNhY3Rpb246IFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBGbGFyZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogc3RyaW5nO1xuICBwdWJsaWMgX2Jsb2NrY2hhaW5JRDogc3RyaW5nO1xuICBwdWJsaWMgX25vZGVJRDogc3RyaW5nO1xuICBwdWJsaWMgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwdWJsaWMgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWUgPSBCaWdJbnQoMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcbiAgcHVibGljIF90bzogc3RyaW5nW107XG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuICBwdWJsaWMgX2Jsc1B1YmxpY0tleTogc3RyaW5nO1xuICBwdWJsaWMgX2Jsc1NpZ25hdHVyZTogc3RyaW5nO1xuICBwdWJsaWMgX21lbW86IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgpOyAvLyBGbGFyZUpTIG1lbW8gZmllbGRcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX25ldHdvcmsgPSBjb2luQ29uZmlnLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrO1xuICAgIHRoaXMuX2Fzc2V0SWQgPSAnRkxSJzsgLy8gRGVmYXVsdCBGTFIgYXNzZXRcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCB8fCAnJztcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRCB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmFzZSB0cmFuc2FjdGlvbiBmcm9tIEZsYXJlSlMgVW5zaWduZWRUeFxuICAgKiBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIEZsYXJlSlMgdHJhbnNhY3Rpb24gZXh0cmFjdGlvblxuICAgKi9cbiAgZ2V0IGZsYXJlVHJhbnNhY3Rpb24oKTogVW5zaWduZWRUeCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBUT0RPOiBFeHRyYWN0IHNpZ25hdHVyZXMgZnJvbSBGbGFyZUpTIGNyZWRlbnRpYWxzXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBjcmVkZW50aWFscyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHByb3BlciBzaWduaW5nIHZhbGlkYXRpb24gZm9yIEZsYXJlSlNcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgRmxhcmUgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKU1xuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpIGFzIEJ1ZmZlcjtcblxuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmluZyBwcm9jZXNzXG4gICAgLy8gVGhpcyB3aWxsIGludm9sdmU6XG4gICAgLy8gMS4gQ3JlYXRpbmcgRmxhcmVKUyBzaWduYXR1cmUgdXNpbmcgcHJpdmF0ZSBrZXlcbiAgICAvLyAyLiBBdHRhY2hpbmcgc2lnbmF0dXJlIHRvIGFwcHJvcHJpYXRlIGNyZWRlbnRpYWxcbiAgICAvLyAzLiBVcGRhdGluZyB0cmFuc2FjdGlvbiB3aXRoIHNpZ25lZCBjcmVkZW50aWFsc1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGbGFyZUpTIHNpZ25pbmcgbm90IHlldCBpbXBsZW1lbnRlZCAtIHBsYWNlaG9sZGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1lbW8gZnJvbSBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lbW8gLSBNZW1vIHRleHRcbiAgICovXG4gIHNldE1lbW8obWVtbzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWVtbyA9IHV0aWxzLnN0cmluZ1RvQnl0ZXMobWVtbyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1lbW8gZnJvbSB2YXJpb3VzIGZvcm1hdHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVpbnQ4QXJyYXl9IG1lbW8gLSBNZW1vIGRhdGFcbiAgICovXG4gIHNldE1lbW9EYXRhKG1lbW86IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVWludDhBcnJheSk6IHZvaWQge1xuICAgIHRoaXMuX21lbW8gPSB1dGlscy5jcmVhdGVNZW1vQnl0ZXMobWVtbyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lbW8gYXMgYnl0ZXMgKEZsYXJlSlMgZm9ybWF0KVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gTWVtbyBieXRlc1xuICAgKi9cbiAgZ2V0TWVtb0J5dGVzKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9tZW1vO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vIGFzIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBNZW1vIHN0cmluZ1xuICAgKi9cbiAgZ2V0TWVtb1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dGlscy5wYXJzZU1lbW9CeXRlcyh0aGlzLl9tZW1vKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0cmFuc2FjdGlvbiBoYXMgbWVtb1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtZW1vIGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gICAqL1xuICBoYXNNZW1vKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tZW1vLmxlbmd0aCA+IDA7XG4gIH1cblxuICB0b0hleFN0cmluZyhieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlQXJyYXkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyB0cmFuc2FjdGlvbiBzZXJpYWxpemF0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuICdmbGFyZS10eC1oZXgtcGxhY2Vob2xkZXInO1xuICB9XG5cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUsXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0aGlzLmNoYW5nZU91dHB1dHMsXG4gICAgICBzb3VyY2VDaGFpbjogdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQsXG4gICAgICBkZXN0aW5hdGlvbkNoYWluOiB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCxcbiAgICAgIG1lbW86IHRoaXMuZ2V0TWVtb1N0cmluZygpLCAvLyBJbmNsdWRlIG1lbW8gaW4gSlNPTiByZXByZXNlbnRhdGlvblxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9mbGFyZVRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBzdXBwb3J0ZWRUeXBlcyA9IFtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuSW1wb3J0LFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcixcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gICAgXTtcblxuICAgIGlmICghc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXModHJhbnNhY3Rpb25UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmFibGUgcGF5bG9hZCBleHRyYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKCdmbGFyZS1zaWduYWJsZS1wYXlsb2FkJyk7XG4gIH1cblxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBmb3IgSUQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHRyYW5zYWN0aW9uIElEIGdlbmVyYXRpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gcGxhY2Vob2xkZXJcbiAgICByZXR1cm4gJ2ZsYXJlLXRyYW5zYWN0aW9uLWlkLXBsYWNlaG9sZGVyJztcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IGV4cG9ydCBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW107XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIC8vIFRPRE86IEV4dHJhY3QgaW1wb3J0IG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IHZhbGlkYXRvciBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25vZGVJRCB8fCAncGxhY2Vob2xkZXItbm9kZS1pZCcsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fc3Rha2VBbW91bnQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjpcbiAgICAgICAgLy8gVE9ETzogRXh0cmFjdCBkZWxlZ2F0b3Igb3V0cHV0cyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9ub2RlSUQgfHwgJ3BsYWNlaG9sZGVyLW5vZGUtaWQnLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3N0YWtlQW1vdW50Py50b1N0cmluZygpIHx8ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIC8vIFRPRE86IEV4dHJhY3QgY2hhbmdlIG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIGVtcHR5IGFycmF5XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBGbHJwRW50cnlbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBpbnB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyIGJhc2VkIG9uIFVUWE9zXG4gICAgcmV0dXJuIHRoaXMuX3V0eG9zLm1hcCgodXR4bykgPT4gKHtcbiAgICAgIGlkOiB1dHhvLnR4aWQgKyBJTlBVVF9TRVBBUkFUT1IgKyB1dHhvLm91dHB1dGlkeCxcbiAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICB2YWx1ZTogdXR4by5hbW91bnQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXJlIHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHNpZ25hdHVyZSBjcmVhdGlvblxuICAgIC8vIFRoaXMgc2hvdWxkIHVzZSBGbGFyZUpTIHNpZ25pbmcgdXRpbGl0aWVzXG4gICAgY29uc3Qgc2lnbnZhbCA9IHV0aWxzLmNyZWF0ZVNpZ25hdHVyZSh0aGlzLl9uZXR3b3JrLCB0aGlzLnNpZ25hYmxlUGF5bG9hZCwgcHJ2KTtcbiAgICByZXR1cm4gc2lnbnZhbC50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgZm9yIEMtY2hhaW4gKGNyb3NzLWNoYWluKVxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCB8fCB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdpbnB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcblxuICAgIC8vIEFkZCBtZW1vIHRvIGRpc3BsYXkgb3JkZXIgaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLmhhc01lbW8oKSkge1xuICAgICAgZGlzcGxheU9yZGVyLnB1c2goJ21lbW8nKTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgb3V0cHV0IGFtb3VudFxuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHR4SnNvbi5vdXRwdXRzXG4gICAgICAucmVkdWNlKChzdW0sIG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgQmlnSW50KG91dHB1dC52YWx1ZSB8fCAnMCcpO1xuICAgICAgfSwgQmlnSW50KDApKVxuICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgY2hhbmdlIGFtb3VudFxuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHR4SnNvbi5jaGFuZ2VPdXRwdXRzXG4gICAgICAucmVkdWNlKChzdW0sIG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgQmlnSW50KG91dHB1dC52YWx1ZSB8fCAnMCcpO1xuICAgICAgfSwgQmlnSW50KDApKVxuICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGNvbnN0IHN0YWtpbmdUeXBlcyA9IFtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yLFxuICAgIF07XG5cbiAgICBpZiAoc3Rha2luZ1R5cGVzLmluY2x1ZGVzKHR4SnNvbi50eXBlKSkge1xuICAgICAgcmV3YXJkQWRkcmVzc2VzID0gdGhpcy5yZXdhcmRBZGRyZXNzZXM7XG4gICAgICBkaXNwbGF5T3JkZXIuc3BsaWNlKDYsIDAsICdyZXdhcmRBZGRyZXNzZXMnKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY3Jvc3MtY2hhaW4gaW5mb3JtYXRpb24gZm9yIGV4cG9ydC9pbXBvcnRcbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICBkaXNwbGF5T3JkZXIucHVzaCgnc291cmNlQ2hhaW4nLCAnZGVzdGluYXRpb25DaGFpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uICYgeyBtZW1vPzogc3RyaW5nIH0gPSB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgaW5wdXRzOiB0eEpzb24uaW5wdXRzLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0eEpzb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIGNoYW5nZUFtb3VudCxcbiAgICAgIHJld2FyZEFkZHJlc3NlcyxcbiAgICAgIGZlZTogdGhpcy5mZWUsXG4gICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIG1lbW8gdG8gZXhwbGFuYXRpb24gaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLmhhc01lbW8oKSkge1xuICAgICAgZXhwbGFuYXRpb24ubWVtbyA9IHRoaXMuZ2V0TWVtb1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsYW5hdGlvbjtcbiAgfVxufVxuIl19
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUM5QixtREFTK0I7QUFDL0IsbUNBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBc0g7QUFFdEgsb0RBQTRCO0FBRTVCOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQWlCO0lBQ3pDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFTRDs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQWlCO0lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsOEJBQThCO0lBQzlCLE9BQU8sWUFBWSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFvQjtJQUNyRCx1REFBdUQ7SUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FB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WUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU87WUFDTCxZQUFZO1lBQ1osRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RSxZQUFZO1lBQ1osYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFlBQVk7WUFDWixlQUFlO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE5V0Qsa0NBOFdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhcmVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFRyYW5zYWN0aW9uRmVlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQge1xuICB1dGlscyBhcyBGbGFyZVV0aWxzLFxuICBDcmVkZW50aWFsLFxuICBwdm1TZXJpYWwsXG4gIGV2bVNlcmlhbCxcbiAgVW5zaWduZWRUeCxcbiAgc2VjcDI1NmsxLFxuICBFVk1VbnNpZ25lZFR4LFxuICBBZGRyZXNzLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4LCBUeERhdGEsIEFERFJFU1NfU0VQQVJBVE9SLCBGbGFyZVRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc2lnbmF0dXJlIGlzIGVtcHR5IChmaXJzdCA5MCBoZXggY2hhcnMgYXJlIHplcm9zKVxuICogQHBhcmFtIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc2lnbmF0dXJlICYmIHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpLnN0YXJ0c1dpdGgoJycucGFkU3RhcnQoOTAsICcwJykpO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3Igc2lnbmF0dXJlIHNsb3QgY2hlY2tpbmdcbiAqL1xuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ25hdHVyZTogc3RyaW5nLCBhZGRyZXNzSGV4OiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBlbXB0eSBzaWduYXR1cmUgaGFzIGFuIGVtYmVkZGVkIGFkZHJlc3MgKG5vbi16ZXJvIGJ5dGVzIGFmdGVyIHBvc2l0aW9uIDkwKVxuICogQHBhcmFtIHNpZ25hdHVyZSBIZXggc3RyaW5nIG9mIHRoZSBzaWduYXR1cmVcbiAqL1xuZnVuY3Rpb24gaGFzRW1iZWRkZWRBZGRyZXNzKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNFbXB0eVNpZ25hdHVyZShzaWduYXR1cmUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGNsZWFuU2lnID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KHNpZ25hdHVyZSk7XG4gIGlmIChjbGVhblNpZy5sZW5ndGggPCAxMzApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZW1iZWRkZWRQYXJ0ID0gY2xlYW5TaWcuc3Vic3RyaW5nKDkwLCAxMzApO1xuICAvLyBDaGVjayBpZiBpdCdzIG5vdCBhbGwgemVyb3NcbiAgcmV0dXJuIGVtYmVkZGVkUGFydCAhPT0gJzAnLnJlcGVhdCg0MCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBzaWduYXR1cmUgc2xvdCBtYXRjaGVzIGEgZ2l2ZW4gYWRkcmVzcy5cbiAqIElmIHNpZ25hdHVyZXMgaGF2ZSBlbWJlZGRlZCBhZGRyZXNzZXMsIGl0IG1hdGNoZXMgYnkgYWRkcmVzcy5cbiAqIE90aGVyd2lzZSwgaXQganVzdCBmaW5kcyBlbXB0eSBzbG90cy5cbiAqIEBwYXJhbSBzaWduYXR1cmVzIEFycmF5IG9mIHNpZ25hdHVyZSBoZXggc3RyaW5nc1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKHNpZ25hdHVyZXM6IHN0cmluZ1tdKTogQ2hlY2tTaWduYXR1cmUge1xuICAvLyBDaGVjayBpZiBhbnkgZW1wdHkgc2lnbmF0dXJlIGhhcyBhbiBlbWJlZGRlZCBhZGRyZXNzXG4gIGNvbnN0IGhhc0VtYmVkZGVkQWRkcmVzc2VzID0gc2lnbmF0dXJlcy5zb21lKChzaWcpID0+IGlzRW1wdHlTaWduYXR1cmUoc2lnKSAmJiBoYXNFbWJlZGRlZEFkZHJlc3Moc2lnKSk7XG5cbiAgaWYgKGhhc0VtYmVkZGVkQWRkcmVzc2VzKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcyBlbWJlZGRlZCBpbiB0aGUgZW1wdHkgc2lnbmF0dXJlIChhZnRlciBwb3NpdGlvbiA5MClcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZzogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzaWcpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsZWFuU2lnID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KHNpZyk7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkQWRkciA9IGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZW1iZWRkZWRBZGRyID09PSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIExvb2sgZm9yIGFueSBlbXB0eSBzbG90IChubyBlbWJlZGRlZCBhZGRyZXNzZXMpXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWc6IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gaXNFbXB0eVNpZ25hdHVyZShzaWcpO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9mbGFyZVRyYW5zYWN0aW9uOiBUeDtcbiAgcHVibGljIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHB1YmxpYyBfbmV0d29yazogRmxhcmVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IHN0cmluZztcbiAgcHVibGljIF9ibG9ja2NoYWluSUQ6IHN0cmluZztcbiAgcHVibGljIF9ub2RlSUQ6IHN0cmluZztcbiAgcHVibGljIF9zdGFydFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9lbmRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfc3Rha2VBbW91bnQ6IGJpZ2ludDtcbiAgcHVibGljIF90aHJlc2hvbGQgPSAyO1xuICBwdWJsaWMgX2xvY2t0aW1lID0gQmlnSW50KDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBwdWJsaWMgX3RvOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107IC8vIERlZmluZSBwcm9wZXIgdHlwZSBiYXNlZCBvbiBGbGFyZSdzIFVUWE8gc3RydWN0dXJlXG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuICAvLyBTdG9yZSBvcmlnaW5hbCByYXcgc2lnbmVkIGJ5dGVzIHRvIHByZXNlcnZlIGV4YWN0IGZvcm1hdCB3aGVuIHJlLXNlcmlhbGl6aW5nXG4gIHB1YmxpYyBfcmF3U2lnbmVkQnl0ZXM6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX25ldHdvcmsgPSBjb2luQ29uZmlnLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrO1xuICAgIC8vIERlY29kZSBjYjU4LWVuY29kZWQgYXNzZXQgSUQgdG8gaGV4IGZvciB1c2UgaW4gdHJhbnNhY3Rpb24gc2VyaWFsaXphdGlvblxuICAgIHRoaXMuX2Fzc2V0SWQgPSB1dGlscy5jYjU4RGVjb2RlKHRoaXMuX25ldHdvcmsuYXNzZXRJZCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIHRoaXMuX2Jsb2NrY2hhaW5JRCA9IHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEO1xuICAgIHRoaXMuX25ldHdvcmtJRCA9IHRoaXMuX25ldHdvcmsubmV0d29ya0lEO1xuICB9XG5cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzWzBdLmdldFNpZ25hdHVyZXMoKS5maWx0ZXIoKHMpID0+ICFpc0VtcHR5U2lnbmF0dXJlKHMpKTtcbiAgfVxuXG4gIGdldCBjcmVkZW50aWFscygpOiBDcmVkZW50aWFsW10ge1xuICAgIHJldHVybiAodGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KT8uY3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcnYgPSBrZXlQYWlyLmdldFByaXZhdGVLZXkoKSBhcyBVaW50OEFycmF5O1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgRVZNVW5zaWduZWRUeDtcbiAgICBjb25zdCB1bnNpZ25lZEJ5dGVzID0gdW5zaWduZWRUeC50b0J5dGVzKCk7XG4gICAgY29uc3QgcHVibGljS2V5ID0gc2VjcDI1NmsxLmdldFB1YmxpY0tleShwcnYpO1xuXG4gICAgLy8gRGVyaXZlIGJvdGggRVZNIGFuZCBQLWNoYWluIGFkZHJlc3NlcyBmcm9tIHRoZSBwdWJsaWMga2V5XG4gICAgY29uc3QgZXZtQWRkcmVzc0hleCA9IG5ldyBBZGRyZXNzKHNlY3AyNTZrMS5wdWJsaWNLZXlUb0V0aEFkZHJlc3MocHVibGljS2V5KSkudG9IZXgoKTtcblxuICAgIC8vIFAtY2hhaW4gYWRkcmVzcyBkZXJpdmF0aW9uOiByaXBlbWQxNjAoc2hhMjU2KHB1YmxpY0tleSkpXG4gICAgY29uc3Qgc2hhMjU2SGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShCdWZmZXIuZnJvbShwdWJsaWNLZXkpKS5kaWdlc3QoKTtcbiAgICBjb25zdCBwQ2hhaW5BZGRyZXNzQnVmZmVyID0gY3JlYXRlSGFzaCgncmlwZW1kMTYwJykudXBkYXRlKHNoYTI1Nkhhc2gpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IHBDaGFpbkFkZHJlc3NIZXggPSBwQ2hhaW5BZGRyZXNzQnVmZmVyLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IGFkZHJlc3NNYXAgPSB1bnNpZ25lZFR4LmdldEFkZHJlc3NlcygpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGJvdGggRVZNIGFuZCBQLWNoYWluIGFkZHJlc3MgZm9ybWF0c1xuICAgIGNvbnN0IGhhc01hdGNoaW5nQWRkcmVzcyA9IGFkZHJlc3NNYXAuc29tZSgoYWRkcikgPT4ge1xuICAgICAgY29uc3QgYWRkckhleCA9IEJ1ZmZlci5mcm9tKGFkZHIpLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYWRkckhleCA9PT0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KGV2bUFkZHJlc3NIZXgpLnRvTG93ZXJDYXNlKCkgfHwgYWRkckhleCA9PT0gcENoYWluQWRkcmVzc0hleC50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgc2VjcDI1NmsxLnNpZ24odW5zaWduZWRCeXRlcywgcHJ2KTtcbiAgICBsZXQgc2lnbmF0dXJlU2V0ID0gZmFsc2U7XG5cbiAgICBpZiAoaGFzTWF0Y2hpbmdBZGRyZXNzKSB7XG4gICAgICAvLyBVc2UgYWRkcmVzcy1iYXNlZCBzbG90IG1hdGNoaW5nIChsaWtlIEFWQVgtUClcbiAgICAgIGxldCBjaGVja1NpZ246IENoZWNrU2lnbmF0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgdW5zaWduZWRUeC5jcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGlmIChjaGVja1NpZ24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNoZWNrU2lnbiA9IGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoc2lnbmF0dXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIHRoZSBzbG90IHRoYXQgbWF0Y2hlcyB0aGlzIGFkZHJlc3NcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgc2lnID0gc2lnbmF0dXJlc1tpXTtcbiAgICAgICAgICAvLyBUcnkgbWF0Y2hpbmcgd2l0aCBQLWNoYWluIGFkZHJlc3MgZmlyc3QsIHRoZW4gRVZNIGFkZHJlc3NcbiAgICAgICAgICBpZiAoY2hlY2tTaWduKHNpZywgcENoYWluQWRkcmVzc0hleCkgfHwgY2hlY2tTaWduKHNpZywgdXRpbHMucmVtb3ZlSGV4UHJlZml4KGV2bUFkZHJlc3NIZXgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBjcmVkZW50aWFsLnNldFNpZ25hdHVyZShpLCBzaWduYXR1cmUpO1xuICAgICAgICAgICAgc2lnbmF0dXJlU2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIENsZWFyIHJhdyBzaWduZWQgYnl0ZXMgc2luY2Ugd2UndmUgbW9kaWZpZWQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAgICAgICB0aGlzLl9yYXdTaWduZWRCeXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaWduYXR1cmVTZXQpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBJZiBhZGRyZXNzLWJhc2VkIG1hdGNoaW5nIGRpZG4ndCB3b3JrIChlLmcuLCBJbXBvcnRJbkMgbG9hZGVkIGZyb20gdW5zaWduZWQgdHhcbiAgICAvLyB3aGVyZSBQLWNoYWluIGFkZHJlc3NlcyBhcmVuJ3QgaW4gYWRkcmVzc01hcHMpLCB0cnkgdG8gc2lnbiB0aGUgZmlyc3QgZW1wdHkgc2xvdC5cbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBlbXB0eSBjcmVkZW50aWFscyBidXQgc2lnbmVyIGFkZHJlc3MgaXNuJ3QgaW4gdGhlIG1hcC5cbiAgICBpZiAoIXNpZ25hdHVyZVNldCkge1xuICAgICAgZm9yIChjb25zdCBjcmVkZW50aWFsIG9mIHVuc2lnbmVkVHguY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpZ25hdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaXNFbXB0eVNpZ25hdHVyZShzaWduYXR1cmVzW2ldKSkge1xuICAgICAgICAgICAgY3JlZGVudGlhbC5zZXRTaWduYXR1cmUoaSwgc2lnbmF0dXJlKTtcbiAgICAgICAgICAgIHNpZ25hdHVyZVNldCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yYXdTaWduZWRCeXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmF0dXJlU2V0KSBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNpZ25hdHVyZVNldCkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTm8gbWF0Y2hpbmcgc2lnbmF0dXJlIHNsb3QgZm91bmQgZm9yIHRoaXMgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gIH1cblxuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIC8vIElmIHdlIGhhdmUgdGhlIG9yaWdpbmFsIHJhdyBzaWduZWQgYnl0ZXMsIHVzZSB0aGVtIGRpcmVjdGx5IHRvIHByZXNlcnZlIGV4YWN0IGZvcm1hdFxuICAgIGlmICh0aGlzLl9yYXdTaWduZWRCeXRlcykge1xuICAgICAgcmV0dXJuIEZsYXJlVXRpbHMuYnVmZmVyVG9IZXgodGhpcy5fcmF3U2lnbmVkQnl0ZXMpO1xuICAgIH1cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gdGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4O1xuICAgIC8vIEZvciBzaWduZWQgdHJhbnNhY3Rpb25zLCByZXR1cm4gdGhlIGZ1bGwgc2lnbmVkIHR4IHdpdGggY3JlZGVudGlhbHNcbiAgICAvLyBDaGVjayBzaWduYXR1cmUubGVuZ3RoIGZvciByb2J1c3RuZXNzXG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBGbGFyZVV0aWxzLmJ1ZmZlclRvSGV4KHVuc2lnbmVkVHguZ2V0U2lnbmVkVHgoKS50b0J5dGVzKCkpO1xuICAgIH1cbiAgICAvLyBGb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zLCByZXR1cm4ganVzdCB0aGUgdHJhbnNhY3Rpb24gYnl0ZXNcbiAgICByZXR1cm4gRmxhcmVVdGlscy5idWZmZXJUb0hleCh1bnNpZ25lZFR4LnRvQnl0ZXMoKSk7XG4gIH1cblxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpbnB1dHM6IHRoaXMuaW5wdXRzLFxuICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy5mcm9tQWRkcmVzc2VzLFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl90aHJlc2hvbGQsXG4gICAgICBsb2NrdGltZTogdGhpcy5fbG9ja3RpbWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLFxuICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgY2hhbmdlT3V0cHV0czogdGhpcy5jaGFuZ2VPdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9mbGFyZVRyYW5zYWN0aW9uID0gdHggYXMgVW5zaWduZWRUeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgRmxhcmUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgVGhlIEZsYXJlIHRyYW5zYWN0aW9uIG9iamVjdFxuICAgKi9cbiAgZ2V0RmxhcmVUcmFuc2FjdGlvbigpOiBUeCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIVtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYoKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlckFycmF5ID0gdXRpbHMuc2hhMjU2KCh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLnRvQnl0ZXMoKSk7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oYnVmZmVyQXJyYXkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IEZsYXJlVXRpbHMuZm9ybWF0KHRoaXMuX25ldHdvcmsuYWxpYXMsIHRoaXMuX25ldHdvcmsuaHJwLCBhKSk7XG4gIH1cblxuICBnZXQgcmV3YXJkQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcmV3YXJkQWRkcmVzc2VzLm1hcCgoYSkgPT4gRmxhcmVVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGZvciBDLWNoYWluIChFVk0gdHJhbnNhY3Rpb25zKVxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHggPSAodGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpO1xuICAgIGNvbnN0IHR4VHlwZSA9ICh0eCBhcyB7IF90eXBlPzogc3RyaW5nIH0pLl90eXBlO1xuICAgIHJldHVybiB0eFR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLkV2bUV4cG9ydFR4IHx8IHR4VHlwZSA9PT0gRmxhcmVUcmFuc2FjdGlvblR5cGUuRXZtSW1wb3J0VHg7XG4gIH1cblxuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBjb25zdCB0eCA9ICh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICAgICAgLy8gQy1jaGFpbiBJbXBvcnQ6IG91dHB1dCBpcyB0byBhIEMtY2hhaW4gYWRkcmVzc1xuICAgICAgICAgIGNvbnN0IGltcG9ydFR4ID0gdHggYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBpbXBvcnRUeC5PdXRzLm1hcCgob3V0KSA9PiAoe1xuICAgICAgICAgICAgYWRkcmVzczogJzB4JyArIEJ1ZmZlci5mcm9tKG91dC5hZGRyZXNzLnRvQnl0ZXMoKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgICAgdmFsdWU6IG91dC5hbW91bnQudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQLWNoYWluIEltcG9ydDogb3V0cHV0cyBhcmUgdGhlIGJhc2VUeC5vdXRwdXRzIChkZXN0aW5hdGlvbiBvbiBQLWNoYWluKVxuICAgICAgICAgIGNvbnN0IHB2bUltcG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBwdm1JbXBvcnRUeC5iYXNlVHgub3V0cHV0cy5tYXAodXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICAgICAgLy8gQy1jaGFpbiBFeHBvcnQ6IGV4cG9ydGVkIG91dHB1dHMgZ28gdG8gUC1jaGFpblxuICAgICAgICAgIGNvbnN0IGV4cG9ydFR4ID0gdHggYXMgZXZtU2VyaWFsLkV4cG9ydFR4O1xuICAgICAgICAgIHJldHVybiBleHBvcnRUeC5leHBvcnRlZE91dHB1dHMubWFwKHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFAtY2hhaW4gRXhwb3J0OiBleHBvcnRlZCBvdXRwdXRzIGdvIHRvIEMtY2hhaW5cbiAgICAgICAgICBjb25zdCBwdm1FeHBvcnRUeCA9IHR4IGFzIHB2bVNlcmlhbC5FeHBvcnRUeDtcbiAgICAgICAgICByZXR1cm4gcHZtRXhwb3J0VHgub3V0cy5tYXAodXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogKHR4IGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KS5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLm5vZGVJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6ICh0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci53ZWlnaHQudG9KU09OKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIGNvbnN0IHR4ID0gKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKTtcblxuICAgIC8vIEMtY2hhaW4gdHJhbnNhY3Rpb25zIGFuZCBJbXBvcnQgdHJhbnNhY3Rpb25zIGRvbid0IGhhdmUgY2hhbmdlIG91dHB1dHNcbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluIHx8IHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkltcG9ydCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIC8vIFAtY2hhaW4gRXhwb3J0OiBjaGFuZ2Ugb3V0cHV0cyBhcmUgaW4gYmFzZVR4Lm91dHB1dHNcbiAgICAgICAgcmV0dXJuICh0eCBhcyBwdm1TZXJpYWwuRXhwb3J0VHgpLmJhc2VUeC5vdXRwdXRzLm1hcCh1dGlscy5tYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICAgIHJldHVybiAodHggYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeC5vdXRwdXRzLm1hcCh1dGlscy5tYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpbnB1dHMoKTogRW50cnlbXSB7XG4gICAgY29uc3QgdHggPSAodGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaWYgKHRoaXMuaXNUcmFuc2FjdGlvbkZvckNDaGFpbikge1xuICAgICAgICAgIC8vIEMtY2hhaW4gSW1wb3J0OiBpbnB1dHMgY29tZSBmcm9tIFAtY2hhaW4gKGltcG9ydGVkSW5wdXRzKVxuICAgICAgICAgIGNvbnN0IGltcG9ydFR4ID0gdHggYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBpbXBvcnRUeC5pbXBvcnRlZElucHV0cy5tYXAoKGlucHV0KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKSkgKyAnOicgKyBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCksXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFAtY2hhaW4gSW1wb3J0OiBpbnB1dHMgYXJlIGlucyAoaW1wb3J0ZWQgZnJvbSBDLWNoYWluKVxuICAgICAgICAgIGNvbnN0IHB2bUltcG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkltcG9ydFR4O1xuICAgICAgICAgIHJldHVybiBwdm1JbXBvcnRUeC5pbnMubWFwKChpbnB1dCkgPT4gKHtcbiAgICAgICAgICAgIGlkOiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKGlucHV0LnV0eG9JRC50eElELnRvQnl0ZXMoKSkpICsgJzonICsgaW5wdXQudXR4b0lELm91dHB1dElkeC52YWx1ZSgpLFxuICAgICAgICAgICAgYWRkcmVzczogdGhpcy5mcm9tQWRkcmVzc2VzLnNvcnQoKS5qb2luKEFERFJFU1NfU0VQQVJBVE9SKSxcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh0aGlzLmlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4pIHtcbiAgICAgICAgICAvLyBDLWNoYWluIEV4cG9ydDogaW5wdXRzIGFyZSBmcm9tIEMtY2hhaW4gKEVWTSBpbnB1dHMpXG4gICAgICAgICAgY29uc3QgZXhwb3J0VHggPSB0eCBhcyBldm1TZXJpYWwuRXhwb3J0VHg7XG4gICAgICAgICAgcmV0dXJuIGV4cG9ydFR4Lmlucy5tYXAoKGV2bUlucHV0KSA9PiAoe1xuICAgICAgICAgICAgYWRkcmVzczogJzB4JyArIEJ1ZmZlci5mcm9tKGV2bUlucHV0LmFkZHJlc3MudG9CeXRlcygpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICB2YWx1ZTogZXZtSW5wdXQuYW1vdW50LnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5vbmNlOiBOdW1iZXIoZXZtSW5wdXQubm9uY2UudmFsdWUoKSksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFAtY2hhaW4gRXhwb3J0OiBpbnB1dHMgYXJlIGZyb20gYmFzZVR4LmlucHV0c1xuICAgICAgICAgIGNvbnN0IHB2bUV4cG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkV4cG9ydFR4O1xuICAgICAgICAgIHJldHVybiBwdm1FeHBvcnRUeC5iYXNlVHguaW5wdXRzLm1hcCgoaW5wdXQpID0+ICh7XG4gICAgICAgICAgICBpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbShpbnB1dC51dHhvSUQudHhJRC50b0J5dGVzKCkpKSArICc6JyArIGlucHV0LnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKSxcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBiYXNlVHggPSB0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeDtcbiAgICAgICAgaWYgKGJhc2VUeC5iYXNlVHg/LmlucHV0cykge1xuICAgICAgICAgIHJldHVybiBiYXNlVHguYmFzZVR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKSkgKyAnOicgKyBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCksXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwICsgQmlnSW50KG4udmFsdWUpLCBCaWdJbnQoMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwICsgQmlnSW50KG4udmFsdWUpLCBCaWdJbnQoMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|