@bitgo-beta/abstract-substrate 1.0.1-beta.13 → 1.0.1-beta.1300

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.
Files changed (47) hide show
  1. package/dist/src/abstractSubstrateCoin.d.ts +61 -4
  2. package/dist/src/abstractSubstrateCoin.d.ts.map +1 -1
  3. package/dist/src/abstractSubstrateCoin.js +419 -16
  4. package/dist/src/index.d.ts +1 -0
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +16 -1
  7. package/dist/src/lib/constants.d.ts +7 -0
  8. package/dist/src/lib/constants.d.ts.map +1 -0
  9. package/dist/src/lib/constants.js +10 -0
  10. package/dist/src/lib/errors.d.ts +8 -0
  11. package/dist/src/lib/errors.d.ts.map +1 -0
  12. package/dist/src/lib/errors.js +19 -0
  13. package/dist/src/lib/iface.d.ts +250 -0
  14. package/dist/src/lib/iface.d.ts.map +1 -0
  15. package/dist/src/lib/iface.js +83 -0
  16. package/dist/src/lib/index.d.ts +12 -0
  17. package/dist/src/lib/index.d.ts.map +1 -0
  18. package/dist/src/lib/index.js +61 -0
  19. package/dist/src/lib/keyPair.d.ts +31 -0
  20. package/dist/src/lib/keyPair.d.ts.map +1 -0
  21. package/dist/src/lib/keyPair.js +110 -0
  22. package/dist/src/lib/nativeTransferBuilder.d.ts +61 -0
  23. package/dist/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/nativeTransferBuilder.js +150 -0
  25. package/dist/src/lib/singletonRegistry.d.ts +8 -0
  26. package/dist/src/lib/singletonRegistry.d.ts.map +1 -0
  27. package/dist/src/lib/singletonRegistry.js +20 -0
  28. package/dist/src/lib/transaction.d.ts +92 -0
  29. package/dist/src/lib/transaction.d.ts.map +1 -0
  30. package/dist/src/lib/transaction.js +572 -0
  31. package/dist/src/lib/transactionBuilder.d.ts +121 -0
  32. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/transactionBuilder.js +334 -0
  34. package/dist/src/lib/transferBuilder.d.ts +6 -0
  35. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/transferBuilder.js +11 -0
  37. package/dist/src/lib/txnSchema.d.ts +12 -0
  38. package/dist/src/lib/txnSchema.d.ts.map +1 -0
  39. package/dist/src/lib/txnSchema.js +71 -0
  40. package/dist/src/lib/utils.d.ts +152 -0
  41. package/dist/src/lib/utils.d.ts.map +1 -0
  42. package/dist/src/lib/utils.js +297 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +24 -6
  45. package/.eslintignore +0 -5
  46. package/.mocharc.yml +0 -8
  47. package/CHANGELOG.md +0 -14
@@ -0,0 +1,152 @@
1
+ import { BaseUtils, Seed } from '@bitgo-beta/sdk-core';
2
+ import { NetworkType } from '@bitgo-beta/statics';
3
+ import { KeyringPair } from '@polkadot/keyring/types';
4
+ import { UnsignedTransaction } from '@substrate/txwrapper-core';
5
+ import { DecodedSignedTx, DecodedSigningPayload, TypeRegistry } from '@substrate/txwrapper-core/lib/types';
6
+ import { KeyPair } from '.';
7
+ import { HexString, Material, TransferAllArgs, TransferArgs, TxMethod, AddStakeArgs, RemoveStakeArgs, BondArgs, BondExtraArgs, NominateArgs, ChillArgs, UnbondArgs, WithdrawUnbondedArgs, BatchArgs, MoveStakeArgs } from './iface';
8
+ export declare class Utils implements BaseUtils {
9
+ /** @inheritdoc */
10
+ isValidAddress(address: string): boolean;
11
+ /** @inheritdoc */
12
+ isValidBlockId(hash: string): boolean;
13
+ /** @inheritdoc */
14
+ isValidPrivateKey(key: string): boolean;
15
+ /** @inheritdoc */
16
+ isValidPublicKey(key: string): boolean;
17
+ /** @inheritdoc */
18
+ isValidSignature(signature: string): boolean;
19
+ /**
20
+ * Verifies the signature on a given message
21
+ *
22
+ * @param {string} signedMessage the signed message for the signature
23
+ * @param {string} signature the signature to verify
24
+ * @param {string} address the address of the signer
25
+ * @returns {boolean} whether the signature is valid or not
26
+ */
27
+ verifySignature(signedMessage: string, signature: string, address: string): boolean;
28
+ /** @inheritdoc */
29
+ isValidTransactionId(txId: string): boolean;
30
+ /**
31
+ * decodeSeed decodes a substrate seed
32
+ *
33
+ * @param {string} seed - the seed to be validated.
34
+ * @returns {Seed} - the object Seed
35
+ */
36
+ decodeSeed(seed: string): Seed;
37
+ /**
38
+ * keyPairFromSeed generates an object with secretKey and publicKey using the substrate sdk
39
+ * @param seed 32 bytes long seed
40
+ * @returns KeyPair
41
+ */
42
+ keyPairFromSeed(seed: Uint8Array): KeyPair;
43
+ /**
44
+ * Signing function. Implement this on the OFFLINE signing device.
45
+ *
46
+ * @param {KeyringPair} pair - The signing pair.
47
+ * @param {string} signingPayload - Payload to sign.
48
+ * @param {UnsignedTransaction} transaction - raw transaction to sign
49
+ * @param {Object} options
50
+ * @param {HexString} options.metadataRpc - metadata that is needed for substrate to sign
51
+ * @param {TypeRegistry} options.registry - metadata that is needed for substrate to sign
52
+ */
53
+ createSignedTx(pair: KeyringPair, signingPayload: string, transaction: UnsignedTransaction, options: {
54
+ metadataRpc: HexString;
55
+ registry: TypeRegistry;
56
+ }): string;
57
+ /**
58
+ * Serializes the signed transaction
59
+ *
60
+ * @param transaction Transaction to serialize
61
+ * @param signature Signature of the message
62
+ * @param metadataRpc Network metadata
63
+ * @param registry Transaction registry
64
+ * @returns string Serialized transaction
65
+ */
66
+ serializeSignedTransaction(transaction: UnsignedTransaction, signature: HexString, metadataRpc: `0x${string}`, registry: TypeRegistry): string;
67
+ /**
68
+ * Decodes the substrate address from the given format
69
+ *
70
+ * @param {string} address
71
+ * @param {number} [ss58Format]
72
+ * @returns {string}
73
+ */
74
+ decodeSubstrateAddress(address: string, ss58Format: number): string;
75
+ /**
76
+ * Decodes the substrate address from the given format
77
+ *
78
+ * @param {string} address
79
+ * @param {number} [ss58Format]
80
+ * @returns {string}
81
+ */
82
+ encodeSubstrateAddress(address: string, ss58Format?: number): string;
83
+ /**
84
+ * Retrieves the txHash of a signed txHex
85
+ *
86
+ * @param txHex signed transaction hex
87
+ * @returns {string}
88
+ */
89
+ getTxHash(txHex: string): string;
90
+ isSigningPayload(payload: DecodedSigningPayload | DecodedSignedTx): payload is DecodedSigningPayload;
91
+ isTransfer(arg: TxMethod['args']): arg is TransferArgs;
92
+ isTransferAll(arg: TxMethod['args']): arg is TransferAllArgs;
93
+ isAddStake(arg: TxMethod['args']): arg is AddStakeArgs;
94
+ isRemoveStake(arg: TxMethod['args']): arg is RemoveStakeArgs;
95
+ isBond(arg: TxMethod['args']): arg is BondArgs;
96
+ isBondExtra(arg: TxMethod['args']): arg is BondExtraArgs;
97
+ isNominate(arg: TxMethod['args']): arg is NominateArgs;
98
+ isChill(arg: TxMethod['args']): arg is ChillArgs;
99
+ isUnbond(arg: TxMethod['args']): arg is UnbondArgs;
100
+ isWithdrawUnbonded(arg: TxMethod['args']): arg is WithdrawUnbondedArgs;
101
+ isBatch(arg: TxMethod['args']): arg is BatchArgs;
102
+ isMoveStake(arg: TxMethod['args']): arg is MoveStakeArgs;
103
+ /**
104
+ * extracts and returns the signature in hex format given a raw signed transaction
105
+ *
106
+ * @param {string} rawTx signed raw transaction
107
+ * @param options registry substrate registry used to retrieve the signature
108
+ */
109
+ recoverSignatureFromRawTx(rawTx: string, options: {
110
+ registry: TypeRegistry;
111
+ }): string;
112
+ /**
113
+ * Decodes the dot address from the given format
114
+ *
115
+ * @param {string} address
116
+ * @param {number} [ss58Format]
117
+ * @returns {KeyPair}
118
+ */
119
+ decodeSubstrateAddressToKeyPair(address: string, ss58Format?: number): KeyPair;
120
+ /**
121
+ * Checks whether the given input is a hex string with with 0 value
122
+ * used to check whether a given transaction is immortal or mortal
123
+ * @param hexValue
124
+ */
125
+ isZeroHex(hexValue: string): boolean;
126
+ getMaterial(networkType: NetworkType): Material;
127
+ /**
128
+ * Decodes a substrate transaction from raw transaction hex
129
+ *
130
+ * @param {string} txHex - The raw transaction hex string to decode (signed or unsigned)
131
+ * @param {Material} material - Network material containing metadata and chain information
132
+ * @param {boolean} [isImmortalEra] - Whether the transaction uses immortal era (optional)
133
+ * @returns {DecodedSignedTx | DecodedSigningPayload} The decoded transaction object
134
+ */
135
+ decodeTransaction(txHex: string, material: Material, isImmortalEra?: boolean): DecodedSignedTx | DecodedSigningPayload;
136
+ /**
137
+ * Returns the bytes that Substrate actually signs for a given raw encoded `ExtrinsicPayload`.
138
+ *
139
+ * Substrate signs the raw payload as-is when it is at most {@link MAX_RAW_SIGNING_PAYLOAD_BYTES}
140
+ * bytes, but for larger payloads it signs the 32-byte blake2_256 hash of those bytes instead
141
+ * (see Polkadot.js `@polkadot/types/extrinsic/util` and the HSM firmware). Using this helper
142
+ * ensures the user and the HSM sign the same message, which is required for TSS signature
143
+ * combination to succeed on large extrinsics (e.g. nominate with many validators).
144
+ *
145
+ * @param {Uint8Array} raw The raw encoded extrinsic payload bytes.
146
+ * @returns {Buffer} The bytes to sign: the raw payload, or its blake2_256 hash when oversized.
147
+ */
148
+ getSubstrateSigningBytes(raw: Uint8Array): Buffer;
149
+ }
150
+ declare const utils: Utils;
151
+ export default utils;
152
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Utils = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const keyring_1 = require("@polkadot/keyring");
9
+ const decode_1 = require("@polkadot/keyring/pair/decode");
10
+ const Extrinsic_1 = require("@polkadot/types/extrinsic/v4/Extrinsic");
11
+ const util_1 = require("@polkadot/util");
12
+ const util_crypto_1 = require("@polkadot/util-crypto");
13
+ const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
14
+ const bs58_1 = __importDefault(require("bs58"));
15
+ const hi_base32_1 = __importDefault(require("hi-base32"));
16
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
17
+ const _1 = require(".");
18
+ const singletonRegistry_1 = require("./singletonRegistry");
19
+ const constants_1 = require("./constants");
20
+ class Utils {
21
+ /** @inheritdoc */
22
+ isValidAddress(address) {
23
+ try {
24
+ (0, keyring_1.encodeAddress)((0, util_1.isHex)(address) ? (0, util_1.hexToU8a)(address) : (0, keyring_1.decodeAddress)(address));
25
+ return true;
26
+ }
27
+ catch (error) {
28
+ return false;
29
+ }
30
+ }
31
+ /** @inheritdoc */
32
+ isValidBlockId(hash) {
33
+ return (0, util_1.isHex)(hash, 256);
34
+ }
35
+ /** @inheritdoc */
36
+ isValidPrivateKey(key) {
37
+ try {
38
+ const decodedPrv = (0, util_1.hexToU8a)(key);
39
+ return decodedPrv.length === tweetnacl_1.default.sign.secretKeyLength / 2;
40
+ }
41
+ catch (e) {
42
+ return false;
43
+ }
44
+ }
45
+ /** @inheritdoc */
46
+ isValidPublicKey(key) {
47
+ let pubKey = key;
48
+ // convert base58 pub key to hex format
49
+ // tss common pub is in base58 format and decodes to length of 32
50
+ if ((0, sdk_core_1.isBase58)(pubKey, 32)) {
51
+ const base58Decode = bs58_1.default.decode(pubKey);
52
+ pubKey = base58Decode.toString('hex');
53
+ }
54
+ return (0, sdk_core_1.isValidEd25519PublicKey)(pubKey);
55
+ }
56
+ /** @inheritdoc */
57
+ isValidSignature(signature) {
58
+ const signatureU8a = (0, util_1.u8aToU8a)(signature);
59
+ return [64, 65, 66].includes(signatureU8a.length);
60
+ }
61
+ /**
62
+ * Verifies the signature on a given message
63
+ *
64
+ * @param {string} signedMessage the signed message for the signature
65
+ * @param {string} signature the signature to verify
66
+ * @param {string} address the address of the signer
67
+ * @returns {boolean} whether the signature is valid or not
68
+ */
69
+ verifySignature(signedMessage, signature, address) {
70
+ const publicKey = (0, keyring_1.decodeAddress)(address);
71
+ const hexPublicKey = (0, util_1.u8aToHex)(publicKey);
72
+ return (0, util_crypto_1.signatureVerify)(signedMessage, signature, hexPublicKey).isValid;
73
+ }
74
+ /** @inheritdoc */
75
+ isValidTransactionId(txId) {
76
+ return (0, util_1.isHex)(txId, 256);
77
+ }
78
+ /**
79
+ * decodeSeed decodes a substrate seed
80
+ *
81
+ * @param {string} seed - the seed to be validated.
82
+ * @returns {Seed} - the object Seed
83
+ */
84
+ decodeSeed(seed) {
85
+ const decoded = hi_base32_1.default.decode.asBytes(seed);
86
+ return {
87
+ seed: Buffer.from(decoded),
88
+ };
89
+ }
90
+ /**
91
+ * keyPairFromSeed generates an object with secretKey and publicKey using the substrate sdk
92
+ * @param seed 32 bytes long seed
93
+ * @returns KeyPair
94
+ */
95
+ keyPairFromSeed(seed) {
96
+ const keyring = new keyring_1.Keyring({ type: 'ed25519' });
97
+ const keyringPair = keyring.addFromSeed(seed);
98
+ const pairJson = keyringPair.toJson();
99
+ const decodedKeyPair = (0, decode_1.decodePair)('', (0, util_crypto_1.base64Decode)(pairJson.encoded), pairJson.encoding.type);
100
+ return new _1.KeyPair({ prv: Buffer.from(decodedKeyPair.secretKey).toString('hex') });
101
+ }
102
+ /**
103
+ * Signing function. Implement this on the OFFLINE signing device.
104
+ *
105
+ * @param {KeyringPair} pair - The signing pair.
106
+ * @param {string} signingPayload - Payload to sign.
107
+ * @param {UnsignedTransaction} transaction - raw transaction to sign
108
+ * @param {Object} options
109
+ * @param {HexString} options.metadataRpc - metadata that is needed for substrate to sign
110
+ * @param {TypeRegistry} options.registry - metadata that is needed for substrate to sign
111
+ */
112
+ createSignedTx(pair, signingPayload, transaction, options) {
113
+ const { registry, metadataRpc } = options;
114
+ const { signature } = registry
115
+ .createType('ExtrinsicPayload', signingPayload, {
116
+ version: Extrinsic_1.EXTRINSIC_VERSION,
117
+ })
118
+ .sign(pair);
119
+ // Serialize a signed transaction.
120
+ return this.serializeSignedTransaction(transaction, signature, metadataRpc, registry);
121
+ }
122
+ /**
123
+ * Serializes the signed transaction
124
+ *
125
+ * @param transaction Transaction to serialize
126
+ * @param signature Signature of the message
127
+ * @param metadataRpc Network metadata
128
+ * @param registry Transaction registry
129
+ * @returns string Serialized transaction
130
+ */
131
+ serializeSignedTransaction(transaction, signature, metadataRpc, registry) {
132
+ return txwrapper_polkadot_1.construct.signedTx(transaction, signature, {
133
+ metadataRpc,
134
+ registry,
135
+ });
136
+ }
137
+ /**
138
+ * Decodes the substrate address from the given format
139
+ *
140
+ * @param {string} address
141
+ * @param {number} [ss58Format]
142
+ * @returns {string}
143
+ */
144
+ decodeSubstrateAddress(address, ss58Format) {
145
+ const keypair = new _1.KeyPair({ pub: Buffer.from((0, keyring_1.decodeAddress)(address, undefined, ss58Format)).toString('hex') });
146
+ return keypair.getAddress(ss58Format);
147
+ }
148
+ /**
149
+ * Decodes the substrate address from the given format
150
+ *
151
+ * @param {string} address
152
+ * @param {number} [ss58Format]
153
+ * @returns {string}
154
+ */
155
+ encodeSubstrateAddress(address, ss58Format) {
156
+ return (0, keyring_1.encodeAddress)(address, ss58Format);
157
+ }
158
+ /**
159
+ * Retrieves the txHash of a signed txHex
160
+ *
161
+ * @param txHex signed transaction hex
162
+ * @returns {string}
163
+ */
164
+ getTxHash(txHex) {
165
+ return txwrapper_polkadot_1.construct.txHash(txHex);
166
+ }
167
+ isSigningPayload(payload) {
168
+ return payload.blockHash !== undefined;
169
+ }
170
+ isTransfer(arg) {
171
+ return arg.dest?.id !== undefined && arg.value !== undefined;
172
+ }
173
+ isTransferAll(arg) {
174
+ return arg.dest?.id !== undefined && arg.keepAlive !== undefined;
175
+ }
176
+ isAddStake(arg) {
177
+ return (arg.amountStaked !== undefined &&
178
+ arg.hotkey !== undefined &&
179
+ arg.netuid !== undefined);
180
+ }
181
+ isRemoveStake(arg) {
182
+ return (arg.amountUnstaked !== undefined &&
183
+ arg.hotkey !== undefined &&
184
+ arg.netuid !== undefined);
185
+ }
186
+ isBond(arg) {
187
+ return (arg.value !== undefined &&
188
+ arg.controller !== undefined &&
189
+ arg.payee !== undefined);
190
+ }
191
+ isBondExtra(arg) {
192
+ return arg.maxAdditional !== undefined;
193
+ }
194
+ isNominate(arg) {
195
+ return arg.targets !== undefined;
196
+ }
197
+ isChill(arg) {
198
+ return true; // Chill has no arguments, so any object can be considered ChillArgs
199
+ }
200
+ isUnbond(arg) {
201
+ return arg.value !== undefined;
202
+ }
203
+ isWithdrawUnbonded(arg) {
204
+ return arg.numSlashingSpans !== undefined;
205
+ }
206
+ isBatch(arg) {
207
+ return arg.calls !== undefined && Array.isArray(arg.calls);
208
+ }
209
+ isMoveStake(arg) {
210
+ return (arg.originHotkey !== undefined &&
211
+ arg.destinationHotkey !== undefined &&
212
+ arg.originNetuid !== undefined &&
213
+ arg.destinationNetuid !== undefined &&
214
+ arg.alphaAmount !== undefined);
215
+ }
216
+ /**
217
+ * extracts and returns the signature in hex format given a raw signed transaction
218
+ *
219
+ * @param {string} rawTx signed raw transaction
220
+ * @param options registry substrate registry used to retrieve the signature
221
+ */
222
+ recoverSignatureFromRawTx(rawTx, options) {
223
+ const { registry } = options;
224
+ const methodCall = registry.createType('Extrinsic', rawTx, {
225
+ isSigned: true,
226
+ });
227
+ let signature = (0, util_1.u8aToHex)(methodCall.signature);
228
+ // remove 0x from the signature since this is how it's returned from TSS signing
229
+ if (signature.startsWith('0x')) {
230
+ signature = signature.substr(2);
231
+ }
232
+ return signature;
233
+ }
234
+ /**
235
+ * Decodes the dot address from the given format
236
+ *
237
+ * @param {string} address
238
+ * @param {number} [ss58Format]
239
+ * @returns {KeyPair}
240
+ */
241
+ decodeSubstrateAddressToKeyPair(address, ss58Format) {
242
+ return new _1.KeyPair({ pub: Buffer.from((0, keyring_1.decodeAddress)(address, undefined, ss58Format)).toString('hex') });
243
+ }
244
+ /**
245
+ * Checks whether the given input is a hex string with with 0 value
246
+ * used to check whether a given transaction is immortal or mortal
247
+ * @param hexValue
248
+ */
249
+ isZeroHex(hexValue) {
250
+ return hexValue === '0x00';
251
+ }
252
+ getMaterial(networkType) {
253
+ throw new Error('Method not implemented.');
254
+ }
255
+ /**
256
+ * Decodes a substrate transaction from raw transaction hex
257
+ *
258
+ * @param {string} txHex - The raw transaction hex string to decode (signed or unsigned)
259
+ * @param {Material} material - Network material containing metadata and chain information
260
+ * @param {boolean} [isImmortalEra] - Whether the transaction uses immortal era (optional)
261
+ * @returns {DecodedSignedTx | DecodedSigningPayload} The decoded transaction object
262
+ */
263
+ decodeTransaction(txHex, material, isImmortalEra = false) {
264
+ try {
265
+ const registry = singletonRegistry_1.SingletonRegistry.getInstance(material);
266
+ // Attempt to decode as a signed transaction or unsigned transaction
267
+ const decoded = (0, txwrapper_polkadot_1.decode)(txHex, {
268
+ metadataRpc: material.metadata,
269
+ registry,
270
+ isImmortalEra,
271
+ });
272
+ return decoded;
273
+ }
274
+ catch (error) {
275
+ throw new Error(`Failed to decode transaction: ${error}`);
276
+ }
277
+ }
278
+ /**
279
+ * Returns the bytes that Substrate actually signs for a given raw encoded `ExtrinsicPayload`.
280
+ *
281
+ * Substrate signs the raw payload as-is when it is at most {@link MAX_RAW_SIGNING_PAYLOAD_BYTES}
282
+ * bytes, but for larger payloads it signs the 32-byte blake2_256 hash of those bytes instead
283
+ * (see Polkadot.js `@polkadot/types/extrinsic/util` and the HSM firmware). Using this helper
284
+ * ensures the user and the HSM sign the same message, which is required for TSS signature
285
+ * combination to succeed on large extrinsics (e.g. nominate with many validators).
286
+ *
287
+ * @param {Uint8Array} raw The raw encoded extrinsic payload bytes.
288
+ * @returns {Buffer} The bytes to sign: the raw payload, or its blake2_256 hash when oversized.
289
+ */
290
+ getSubstrateSigningBytes(raw) {
291
+ return (0, util_1.u8aToBuffer)(raw.length > constants_1.MAX_RAW_SIGNING_PAYLOAD_BYTES ? (0, util_crypto_1.blake2AsU8a)(raw, 256) : raw);
292
+ }
293
+ }
294
+ exports.Utils = Utils;
295
+ const utils = new Utils();
296
+ exports.default = utils;
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEwRjtBQUUxRiwrQ0FBMEU7QUFDMUUsMERBQTJEO0FBRTNELHNFQUEyRTtBQUMzRSx5Q0FBa0Y7QUFDbEYsdURBQW1GO0FBR25GLHNFQUFrRTtBQUNsRSxnREFBd0I7QUFDeEIsMERBQStCO0FBQy9CLDBEQUE2QjtBQUM3Qix3QkFBNEI7QUFrQjVCLDJEQUF3RDtBQUN4RCwyQ0FBNEQ7QUFFNUQsTUFBYSxLQUFLO0lBQ2hCLGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QixJQUFJLENBQUM7WUFDSCxJQUFBLHVCQUFhLEVBQUMsSUFBQSxZQUFLLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLHVCQUFhLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsSUFBWTtRQUN6QixPQUFPLElBQUEsWUFBSyxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBQSxlQUFRLEVBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLG1CQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtB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QUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VVdGlscywgaXNCYXNlNTgsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBTZWVkIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgTmV0d29ya1R5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGRlY29kZUFkZHJlc3MsIGVuY29kZUFkZHJlc3MsIEtleXJpbmcgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZyc7XG5pbXBvcnQgeyBkZWNvZGVQYWlyIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcvcGFpci9kZWNvZGUnO1xuaW1wb3J0IHsgS2V5cmluZ1BhaXIgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZy90eXBlcyc7XG5pbXBvcnQgeyBFWFRSSU5TSUNfVkVSU0lPTiB9IGZyb20gJ0Bwb2xrYWRvdC90eXBlcy9leHRyaW5zaWMvdjQvRXh0cmluc2ljJztcbmltcG9ydCB7IGhleFRvVThhLCBpc0hleCwgdThhVG9CdWZmZXIsIHU4YVRvSGV4LCB1OGFUb1U4YSB9IGZyb20gJ0Bwb2xrYWRvdC91dGlsJztcbmltcG9ydCB7IGJhc2U2NERlY29kZSwgYmxha2UyQXNVOGEsIHNpZ25hdHVyZVZlcmlmeSB9IGZyb20gJ0Bwb2xrYWRvdC91dGlsLWNyeXB0byc7XG5pbXBvcnQgeyBVbnNpZ25lZFRyYW5zYWN0aW9uIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZSc7XG5pbXBvcnQgeyBEZWNvZGVkU2lnbmVkVHgsIERlY29kZWRTaWduaW5nUGF5bG9hZCwgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZS9saWIvdHlwZXMnO1xuaW1wb3J0IHsgY29uc3RydWN0LCBkZWNvZGUgfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdCc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBiYXNlMzIgZnJvbSAnaGktYmFzZTMyJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLic7XG5pbXBvcnQge1xuICBIZXhTdHJpbmcsXG4gIE1hdGVyaWFsLFxuICBUcmFuc2ZlckFsbEFyZ3MsXG4gIFRyYW5zZmVyQXJncyxcbiAgVHhNZXRob2QsXG4gIEFkZFN0YWtlQXJncyxcbiAgUmVtb3ZlU3Rha2VBcmdzLFxuICBCb25kQXJncyxcbiAgQm9uZEV4dHJhQXJncyxcbiAgTm9taW5hdGVBcmdzLFxuICBDaGlsbEFyZ3MsXG4gIFVuYm9uZEFyZ3MsXG4gIFdpdGhkcmF3VW5ib25kZWRBcmdzLFxuICBCYXRjaEFyZ3MsXG4gIE1vdmVTdGFrZUFyZ3MsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgU2luZ2xldG9uUmVnaXN0cnkgfSBmcm9tICcuL3NpbmdsZXRvblJlZ2lzdHJ5JztcbmltcG9ydCB7IE1BWF9SQVdfU0lHTklOR19QQVlMT0FEX0JZVEVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGVuY29kZUFkZHJlc3MoaXNIZXgoYWRkcmVzcykgPyBoZXhUb1U4YShhZGRyZXNzKSA6IGRlY29kZUFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzSGV4KGhhc2gsIDI1Nik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZFBydiA9IGhleFRvVThhKGtleSk7XG4gICAgICByZXR1cm4gZGVjb2RlZFBydi5sZW5ndGggPT09IG5hY2wuc2lnbi5zZWNyZXRLZXlMZW5ndGggLyAyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBwdWJLZXkgPSBrZXk7XG5cbiAgICAvLyBjb252ZXJ0IGJhc2U1OCBwdWIga2V5IHRvIGhleCBmb3JtYXRcbiAgICAvLyB0c3MgY29tbW9uIHB1YiBpcyBpbiBiYXNlNTggZm9ybWF0IGFuZCBkZWNvZGVzIHRvIGxlbmd0aCBvZiAzMlxuICAgIGlmIChpc0Jhc2U1OChwdWJLZXksIDMyKSkge1xuICAgICAgY29uc3QgYmFzZTU4RGVjb2RlID0gYnM1OC5kZWNvZGUocHViS2V5KTtcbiAgICAgIHB1YktleSA9IGJhc2U1OERlY29kZS50b1N0cmluZygnaGV4Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5KHB1YktleSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNpZ25hdHVyZVU4YSA9IHU4YVRvVThhKHNpZ25hdHVyZSk7XG4gICAgcmV0dXJuIFs2NCwgNjUsIDY2XS5pbmNsdWRlcyhzaWduYXR1cmVVOGEubGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9uIGEgZ2l2ZW4gbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmVkTWVzc2FnZSB0aGUgc2lnbmVkIG1lc3NhZ2UgZm9yIHRoZSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2lnbmVyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQgb3Igbm90XG4gICAqL1xuICB2ZXJpZnlTaWduYXR1cmUoc2lnbmVkTWVzc2FnZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gZGVjb2RlQWRkcmVzcyhhZGRyZXNzKTtcbiAgICBjb25zdCBoZXhQdWJsaWNLZXkgPSB1OGFUb0hleChwdWJsaWNLZXkpO1xuXG4gICAgcmV0dXJuIHNpZ25hdHVyZVZlcmlmeShzaWduZWRNZXNzYWdlLCBzaWduYXR1cmUsIGhleFB1YmxpY0tleSkuaXNWYWxpZDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNIZXgodHhJZCwgMjU2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGVTZWVkIGRlY29kZXMgYSBzdWJzdHJhdGUgc2VlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VlZCAtIHRoZSBzZWVkIHRvIGJlIHZhbGlkYXRlZC5cbiAgICogQHJldHVybnMge1NlZWR9IC0gdGhlIG9iamVjdCBTZWVkXG4gICAqL1xuICBkZWNvZGVTZWVkKHNlZWQ6IHN0cmluZyk6IFNlZWQge1xuICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlMzIuZGVjb2RlLmFzQnl0ZXMoc2VlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlZWQ6IEJ1ZmZlci5mcm9tKGRlY29kZWQpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICoga2V5UGFpckZyb21TZWVkIGdlbmVyYXRlcyBhbiBvYmplY3Qgd2l0aCBzZWNyZXRLZXkgYW5kIHB1YmxpY0tleSB1c2luZyB0aGUgc3Vic3RyYXRlIHNka1xuICAgKiBAcGFyYW0gc2VlZCAzMiBieXRlcyBsb25nIHNlZWRcbiAgICogQHJldHVybnMgS2V5UGFpclxuICAgKi9cbiAga2V5UGFpckZyb21TZWVkKHNlZWQ6IFVpbnQ4QXJyYXkpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlyaW5nID0gbmV3IEtleXJpbmcoeyB0eXBlOiAnZWQyNTUxOScgfSk7XG4gICAgY29uc3Qga2V5cmluZ1BhaXIgPSBrZXlyaW5nLmFkZEZyb21TZWVkKHNlZWQpO1xuICAgIGNvbnN0IHBhaXJKc29uID0ga2V5cmluZ1BhaXIudG9Kc29uKCk7XG4gICAgY29uc3QgZGVjb2RlZEtleVBhaXIgPSBkZWNvZGVQYWlyKCcnLCBiYXNlNjREZWNvZGUocGFpckpzb24uZW5jb2RlZCksIHBhaXJKc29uLmVuY29kaW5nLnR5cGUpO1xuICAgIHJldHVybiBuZXcgS2V5UGFpcih7IHBydjogQnVmZmVyLmZyb20oZGVjb2RlZEtleVBhaXIuc2VjcmV0S2V5KS50b1N0cmluZygnaGV4JykgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbmluZyBmdW5jdGlvbi4gSW1wbGVtZW50IHRoaXMgb24gdGhlIE9GRkxJTkUgc2lnbmluZyBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5cmluZ1BhaXJ9IHBhaXIgLSBUaGUgc2lnbmluZyBwYWlyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmluZ1BheWxvYWQgLSBQYXlsb2FkIHRvIHNpZ24uXG4gICAqIEBwYXJhbSB7VW5zaWduZWRUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSByYXcgdHJhbnNhY3Rpb24gdG8gc2lnblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0hleFN0cmluZ30gb3B0aW9ucy5tZXRhZGF0YVJwYyAtIG1ldGFkYXRhIHRoYXQgaXMgbmVlZGVkIGZvciBzdWJzdHJhdGUgdG8gc2lnblxuICAgKiBAcGFyYW0ge1R5cGVSZWdpc3RyeX0gb3B0aW9ucy5yZWdpc3RyeSAtIG1ldGFkYXRhIHRoYXQgaXMgbmVlZGVkIGZvciBzdWJzdHJhdGUgdG8gc2lnblxuICAgKi9cbiAgY3JlYXRlU2lnbmVkVHgoXG4gICAgcGFpcjogS2V5cmluZ1BhaXIsXG4gICAgc2lnbmluZ1BheWxvYWQ6IHN0cmluZyxcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICBvcHRpb25zOiB7IG1ldGFkYXRhUnBjOiBIZXhTdHJpbmc7IHJlZ2lzdHJ5OiBUeXBlUmVnaXN0cnkgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgcmVnaXN0cnksIG1ldGFkYXRhUnBjIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgc2lnbmF0dXJlIH0gPSByZWdpc3RyeVxuICAgICAgLmNyZWF0ZVR5cGUoJ0V4dHJpbnNpY1BheWxvYWQnLCBzaWduaW5nUGF5bG9hZCwge1xuICAgICAgICB2ZXJzaW9uOiBFWFRSSU5TSUNfVkVSU0lPTixcbiAgICAgIH0pXG4gICAgICAuc2lnbihwYWlyKTtcblxuICAgIC8vIFNlcmlhbGl6ZSBhIHNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVTaWduZWRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgc2lnbmF0dXJlLCBtZXRhZGF0YVJwYywgcmVnaXN0cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gdG8gc2VyaWFsaXplXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgU2lnbmF0dXJlIG9mIHRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXRhZGF0YVJwYyBOZXR3b3JrIG1ldGFkYXRhXG4gICAqIEBwYXJhbSByZWdpc3RyeSBUcmFuc2FjdGlvbiByZWdpc3RyeVxuICAgKiBAcmV0dXJucyBzdHJpbmcgU2VyaWFsaXplZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgc2VyaWFsaXplU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgdHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgc2lnbmF0dXJlOiBIZXhTdHJpbmcsXG4gICAgbWV0YWRhdGFScGM6IGAweCR7c3RyaW5nfWAsXG4gICAgcmVnaXN0cnk6IFR5cGVSZWdpc3RyeVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25zdHJ1Y3Quc2lnbmVkVHgodHJhbnNhY3Rpb24sIHNpZ25hdHVyZSwge1xuICAgICAgbWV0YWRhdGFScGMsXG4gICAgICByZWdpc3RyeSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHRoZSBzdWJzdHJhdGUgYWRkcmVzcyBmcm9tIHRoZSBnaXZlbiBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzczU4Rm9ybWF0XVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZGVjb2RlU3Vic3RyYXRlQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIHNzNThGb3JtYXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKGFkZHJlc3MsIHVuZGVmaW5lZCwgc3M1OEZvcm1hdCkpLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgICByZXR1cm4ga2V5cGFpci5nZXRBZGRyZXNzKHNzNThGb3JtYXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIHN1YnN0cmF0ZSBhZGRyZXNzIGZyb20gdGhlIGdpdmVuIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3NzNThGb3JtYXRdXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmNvZGVTdWJzdHJhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgc3M1OEZvcm1hdD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVuY29kZUFkZHJlc3MoYWRkcmVzcywgc3M1OEZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB0eEhhc2ggb2YgYSBzaWduZWQgdHhIZXhcbiAgICpcbiAgICogQHBhcmFtIHR4SGV4IHNpZ25lZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFR4SGFzaCh0eEhleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uc3RydWN0LnR4SGFzaCh0eEhleCk7XG4gIH1cblxuICBpc1NpZ25pbmdQYXlsb2FkKHBheWxvYWQ6IERlY29kZWRTaWduaW5nUGF5bG9hZCB8IERlY29kZWRTaWduZWRUeCk6IHBheWxvYWQgaXMgRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHtcbiAgICByZXR1cm4gKHBheWxvYWQgYXMgRGVjb2RlZFNpZ25pbmdQYXlsb2FkKS5ibG9ja0hhc2ggIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzVHJhbnNmZXIoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIFRyYW5zZmVyQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgVHJhbnNmZXJBcmdzKS5kZXN0Py5pZCAhPT0gdW5kZWZpbmVkICYmIChhcmcgYXMgVHJhbnNmZXJBcmdzKS52YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNUcmFuc2ZlckFsbChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgVHJhbnNmZXJBbGxBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBUcmFuc2ZlckFsbEFyZ3MpLmRlc3Q/LmlkICE9PSB1bmRlZmluZWQgJiYgKGFyZyBhcyBUcmFuc2ZlckFsbEFyZ3MpLmtlZXBBbGl2ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNBZGRTdGFrZShhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgQWRkU3Rha2VBcmdzIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGFyZyBhcyBBZGRTdGFrZUFyZ3MpLmFtb3VudFN0YWtlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIEFkZFN0YWtlQXJncykuaG90a2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgQWRkU3Rha2VBcmdzKS5uZXR1aWQgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBpc1JlbW92ZVN0YWtlKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBSZW1vdmVTdGFrZUFyZ3Mge1xuICAgIHJldHVybiAoXG4gICAgICAoYXJnIGFzIFJlbW92ZVN0YWtlQXJncykuYW1vdW50VW5zdGFrZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBSZW1vdmVTdGFrZUFyZ3MpLmhvdGtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIFJlbW92ZVN0YWtlQXJncykubmV0dWlkICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgaXNCb25kKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBCb25kQXJncyB7XG4gICAgcmV0dXJuIChcbiAgICAgIChhcmcgYXMgQm9uZEFyZ3MpLnZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgQm9uZEFyZ3MpLmNvbnRyb2xsZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBCb25kQXJncykucGF5ZWUgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBpc0JvbmRFeHRyYShhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgQm9uZEV4dHJhQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgQm9uZEV4dHJhQXJncykubWF4QWRkaXRpb25hbCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNOb21pbmF0ZShhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgTm9taW5hdGVBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBOb21pbmF0ZUFyZ3MpLnRhcmdldHMgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzQ2hpbGwoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIENoaWxsQXJncyB7XG4gICAgcmV0dXJuIHRydWU7IC8vIENoaWxsIGhhcyBubyBhcmd1bWVudHMsIHNvIGFueSBvYmplY3QgY2FuIGJlIGNvbnNpZGVyZWQgQ2hpbGxBcmdzXG4gIH1cblxuICBpc1VuYm9uZChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgVW5ib25kQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgVW5ib25kQXJncykudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzV2l0aGRyYXdVbmJvbmRlZChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgV2l0aGRyYXdVbmJvbmRlZEFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIFdpdGhkcmF3VW5ib25kZWRBcmdzKS5udW1TbGFzaGluZ1NwYW5zICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0JhdGNoKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBCYXRjaEFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIEJhdGNoQXJncykuY2FsbHMgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KChhcmcgYXMgQmF0Y2hBcmdzKS5jYWxscyk7XG4gIH1cblxuICBpc01vdmVTdGFrZShhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgTW92ZVN0YWtlQXJncyB7XG4gICAgcmV0dXJuIChcbiAgICAgIChhcmcgYXMgTW92ZVN0YWtlQXJncykub3JpZ2luSG90a2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgTW92ZVN0YWtlQXJncykuZGVzdGluYXRpb25Ib3RrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBNb3ZlU3Rha2VBcmdzKS5vcmlnaW5OZXR1aWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBNb3ZlU3Rha2VBcmdzKS5kZXN0aW5hdGlvbk5ldHVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIE1vdmVTdGFrZUFyZ3MpLmFscGhhQW1vdW50ICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGFuZCByZXR1cm5zIHRoZSBzaWduYXR1cmUgaW4gaGV4IGZvcm1hdCBnaXZlbiBhIHJhdyBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1R4IHNpZ25lZCByYXcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgcmVnaXN0cnkgc3Vic3RyYXRlIHJlZ2lzdHJ5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHNpZ25hdHVyZVxuICAgKi9cbiAgcmVjb3ZlclNpZ25hdHVyZUZyb21SYXdUeChyYXdUeDogc3RyaW5nLCBvcHRpb25zOiB7IHJlZ2lzdHJ5OiBUeXBlUmVnaXN0cnkgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyByZWdpc3RyeSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBtZXRob2RDYWxsID0gcmVnaXN0cnkuY3JlYXRlVHlwZSgnRXh0cmluc2ljJywgcmF3VHgsIHtcbiAgICAgIGlzU2lnbmVkOiB0cnVlLFxuICAgIH0pO1xuICAgIGxldCBzaWduYXR1cmUgPSB1OGFUb0hleChtZXRob2RDYWxsLnNpZ25hdHVyZSkgYXMgc3RyaW5nO1xuXG4gICAgLy8gcmVtb3ZlIDB4IGZyb20gdGhlIHNpZ25hdHVyZSBzaW5jZSB0aGlzIGlzIGhvdyBpdCdzIHJldHVybmVkIGZyb20gVFNTIHNpZ25pbmdcbiAgICBpZiAoc2lnbmF0dXJlLnN0YXJ0c1dpdGgoJzB4JykpIHtcbiAgICAgIHNpZ25hdHVyZSA9IHNpZ25hdHVyZS5zdWJzdHIoMik7XG4gICAgfVxuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyB0aGUgZG90IGFkZHJlc3MgZnJvbSB0aGUgZ2l2ZW4gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc3M1OEZvcm1hdF1cbiAgICogQHJldHVybnMge0tleVBhaXJ9XG4gICAqL1xuICBkZWNvZGVTdWJzdHJhdGVBZGRyZXNzVG9LZXlQYWlyKGFkZHJlc3M6IHN0cmluZywgc3M1OEZvcm1hdD86IG51bWJlcik6IEtleVBhaXIge1xuICAgIHJldHVybiBuZXcgS2V5UGFpcih7IHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyhhZGRyZXNzLCB1bmRlZmluZWQsIHNzNThGb3JtYXQpKS50b1N0cmluZygnaGV4JykgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGlucHV0IGlzIGEgaGV4IHN0cmluZyB3aXRoIHdpdGggMCB2YWx1ZVxuICAgKiB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiB0cmFuc2FjdGlvbiBpcyBpbW1vcnRhbCBvciBtb3J0YWxcbiAgICogQHBhcmFtIGhleFZhbHVlXG4gICAqL1xuICBpc1plcm9IZXgoaGV4VmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoZXhWYWx1ZSA9PT0gJzB4MDAnO1xuICB9XG5cbiAgZ2V0TWF0ZXJpYWwobmV0d29ya1R5cGU6IE5ldHdvcmtUeXBlKTogTWF0ZXJpYWwge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgc3Vic3RyYXRlIHRyYW5zYWN0aW9uIGZyb20gcmF3IHRyYW5zYWN0aW9uIGhleFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHhIZXggLSBUaGUgcmF3IHRyYW5zYWN0aW9uIGhleCBzdHJpbmcgdG8gZGVjb2RlIChzaWduZWQgb3IgdW5zaWduZWQpXG4gICAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gTmV0d29yayBtYXRlcmlhbCBjb250YWluaW5nIG1ldGFkYXRhIGFuZCBjaGFpbiBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0ltbW9ydGFsRXJhXSAtIFdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHVzZXMgaW1tb3J0YWwgZXJhIChvcHRpb25hbClcbiAgICogQHJldHVybnMge0RlY29kZWRTaWduZWRUeCB8IERlY29kZWRTaWduaW5nUGF5bG9hZH0gVGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gb2JqZWN0XG4gICAqL1xuICBkZWNvZGVUcmFuc2FjdGlvbih0eEhleDogc3RyaW5nLCBtYXRlcmlhbDogTWF0ZXJpYWwsIGlzSW1tb3J0YWxFcmEgPSBmYWxzZSk6IERlY29kZWRTaWduZWRUeCB8IERlY29kZWRTaWduaW5nUGF5bG9hZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gU2luZ2xldG9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UobWF0ZXJpYWwpO1xuXG4gICAgICAvLyBBdHRlbXB0IHRvIGRlY29kZSBhcyBhIHNpZ25lZCB0cmFuc2FjdGlvbiBvciB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZSh0eEhleCwge1xuICAgICAgICBtZXRhZGF0YVJwYzogbWF0ZXJpYWwubWV0YWRhdGEsXG4gICAgICAgIHJlZ2lzdHJ5LFxuICAgICAgICBpc0ltbW9ydGFsRXJhLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZWNvZGUgdHJhbnNhY3Rpb246ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJ5dGVzIHRoYXQgU3Vic3RyYXRlIGFjdHVhbGx5IHNpZ25zIGZvciBhIGdpdmVuIHJhdyBlbmNvZGVkIGBFeHRyaW5zaWNQYXlsb2FkYC5cbiAgICpcbiAgICogU3Vic3RyYXRlIHNpZ25zIHRoZSByYXcgcGF5bG9hZCBhcy1pcyB3aGVuIGl0IGlzIGF0IG1vc3Qge0BsaW5rIE1BWF9SQVdfU0lHTklOR19QQVlMT0FEX0JZVEVTfVxuICAgKiBieXRlcywgYnV0IGZvciBsYXJnZXIgcGF5bG9hZHMgaXQgc2lnbnMgdGhlIDMyLWJ5dGUgYmxha2UyXzI1NiBoYXNoIG9mIHRob3NlIGJ5dGVzIGluc3RlYWRcbiAgICogKHNlZSBQb2xrYWRvdC5qcyBgQHBvbGthZG90L3R5cGVzL2V4dHJpbnNpYy91dGlsYCBhbmQgdGhlIEhTTSBmaXJtd2FyZSkuIFVzaW5nIHRoaXMgaGVscGVyXG4gICAqIGVuc3VyZXMgdGhlIHVzZXIgYW5kIHRoZSBIU00gc2lnbiB0aGUgc2FtZSBtZXNzYWdlLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgVFNTIHNpZ25hdHVyZVxuICAgKiBjb21iaW5hdGlvbiB0byBzdWNjZWVkIG9uIGxhcmdlIGV4dHJpbnNpY3MgKGUuZy4gbm9taW5hdGUgd2l0aCBtYW55IHZhbGlkYXRvcnMpLlxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHJhdyBUaGUgcmF3IGVuY29kZWQgZXh0cmluc2ljIHBheWxvYWQgYnl0ZXMuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSBieXRlcyB0byBzaWduOiB0aGUgcmF3IHBheWxvYWQsIG9yIGl0cyBibGFrZTJfMjU2IGhhc2ggd2hlbiBvdmVyc2l6ZWQuXG4gICAqL1xuICBnZXRTdWJzdHJhdGVTaWduaW5nQnl0ZXMocmF3OiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgICByZXR1cm4gdThhVG9CdWZmZXIocmF3Lmxlbmd0aCA+IE1BWF9SQVdfU0lHTklOR19QQVlMT0FEX0JZVEVTID8gYmxha2UyQXNVOGEocmF3LCAyNTYpIDogcmF3KTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==