@bitgo/sdk-coin-sui 5.19.2 → 5.19.3

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 (65) hide show
  1. package/dist/test/integration/index.d.ts +1 -0
  2. package/dist/test/integration/index.d.ts.map +1 -0
  3. package/dist/test/integration/index.js +1 -0
  4. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  5. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  6. package/dist/test/local_fullnode/RpcClient.js +111 -0
  7. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  8. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  9. package/dist/test/local_fullnode/faucet.js +17 -0
  10. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  11. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  12. package/dist/test/local_fullnode/transactions.js +190 -0
  13. package/dist/test/resources/sui.d.ts +463 -0
  14. package/dist/test/resources/sui.d.ts.map +1 -0
  15. package/dist/test/resources/sui.js +632 -0
  16. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  17. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  18. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  19. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  20. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  21. package/dist/test/unit/getBuilderFactory.js +10 -0
  22. package/dist/test/unit/keyPair.d.ts +2 -0
  23. package/dist/test/unit/keyPair.d.ts.map +1 -0
  24. package/dist/test/unit/keyPair.js +72 -0
  25. package/dist/test/unit/sui.d.ts +2 -0
  26. package/dist/test/unit/sui.d.ts.map +1 -0
  27. package/dist/test/unit/sui.js +2399 -0
  28. package/dist/test/unit/suiToken.d.ts +2 -0
  29. package/dist/test/unit/suiToken.d.ts.map +1 -0
  30. package/dist/test/unit/suiToken.js +39 -0
  31. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  32. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  34. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  35. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  36. package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
  37. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  38. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  39. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +149 -0
  40. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  41. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  42. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  43. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  44. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  45. package/dist/test/unit/transactionBuilder/transferBuilder.js +192 -0
  46. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  49. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  50. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  51. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
  52. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  53. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  54. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
  55. package/dist/test/unit/transferTransaction.d.ts +2 -0
  56. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  57. package/dist/test/unit/transferTransaction.js +94 -0
  58. package/dist/test/unit/utils.d.ts +2 -0
  59. package/dist/test/unit/utils.d.ts.map +1 -0
  60. package/dist/test/unit/utils.js +81 -0
  61. package/dist/tsconfig.tsbuildinfo +1 -0
  62. package/package.json +10 -7
  63. package/.eslintignore +0 -6
  64. package/.mocharc.yml +0 -7
  65. package/CHANGELOG.md +0 -1166
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/integration/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIiXX0=
@@ -0,0 +1,60 @@
1
+ import { SuiObjectData, SuiTransactionBlockResponse } from '../../src/lib/mystenlab/types';
2
+ import { DelegatedStake } from '../../src/lib/mystenlab/types/validator';
3
+ export declare class RpcError extends Error {
4
+ rpcError: {
5
+ code: number;
6
+ message: string;
7
+ };
8
+ constructor(rpcError: {
9
+ code: number;
10
+ message: string;
11
+ });
12
+ static isRpcErrorWithCode(e: Error, code: number): boolean;
13
+ }
14
+ export type Coin = {
15
+ coinType: string;
16
+ coinObjectId: string;
17
+ version: string;
18
+ digest: string;
19
+ balance: string;
20
+ previousTransaction: string;
21
+ };
22
+ /** Wrapper around https://docs.sui.io/sui-jsonrpc */
23
+ export declare class RpcClient {
24
+ url: string;
25
+ id: number;
26
+ constructor(url: string);
27
+ static createCheckedConnection(url: string): Promise<RpcClient>;
28
+ exec<T>(method: string, ...params: unknown[]): Promise<T>;
29
+ /**
30
+ * https://docs.sui.io/sui-jsonrpc#suix_getCoins
31
+ */
32
+ getCoins(owner: string, coinType?: string, cursor?: string, limit?: number): Promise<{
33
+ data: Coin[];
34
+ nextCursor?: string;
35
+ hasNextPage?: boolean;
36
+ }>;
37
+ executeTransactionBlock(tx_bytes: string, signatures: string[], options?: unknown, request_type?: unknown): Promise<SuiTransactionBlockResponse>;
38
+ /**
39
+ * https://docs.sui.io/sui-jsonrpc#suix_getValidatorsApy
40
+ * APY = Annual Percentage Yield
41
+ */
42
+ getValidatorsApy(): Promise<{
43
+ apys: {
44
+ address: string;
45
+ apy: string;
46
+ }[];
47
+ epoch: string;
48
+ }>;
49
+ /**
50
+ * https://docs.sui.io/sui-jsonrpc#suix_getStakes
51
+ */
52
+ getStakes(owner: string): Promise<DelegatedStake[]>;
53
+ /**
54
+ * https://docs.sui.io/sui-jsonrpc#sui_getObject
55
+ */
56
+ getObject(object_id: string): Promise<{
57
+ data: SuiObjectData;
58
+ }>;
59
+ }
60
+ //# sourceMappingURL=RpcClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RpcClient.d.ts","sourceRoot":"","sources":["../../../test/local_fullnode/RpcClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,qBAAa,QAAS,SAAQ,KAAK;IAC1B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;gBAEvC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAKvD,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3D;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qDAAqD;AACrD,qBAAa,SAAS;IACb,GAAG,EAAE,MAAM,CAAC;IAEnB,EAAE,SAAK;gBAEK,GAAG,EAAE,MAAM;WAIV,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ/D,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAwB/D;;OAEG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;QACT,IAAI,EAAE,IAAI,EAAE,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IAII,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE,OAAO,EACjB,YAAY,CAAC,EAAE,OAAO,GACrB,OAAO,CAAC,2BAA2B,CAAC;IAiBvC;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAIF;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzD;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC;CAGrE"}
@@ -0,0 +1,111 @@
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.RpcClient = exports.RpcError = void 0;
7
+ const util_1 = __importDefault(require("util"));
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const debug = (0, debug_1.default)('RpcClient');
11
+ function elideResponse(method) {
12
+ return method === 'sui_getProtocolConfig';
13
+ }
14
+ function unwrapResult(method, v) {
15
+ if ('error' in v) {
16
+ debug('< %s ERROR', method, v.error);
17
+ throw new Error(JSON.stringify(v.error));
18
+ }
19
+ if (elideResponse(method)) {
20
+ debug('< %s ...', method);
21
+ }
22
+ else {
23
+ debug('< %s', method, util_1.default.inspect(v.result, { depth: 10 }));
24
+ }
25
+ return v.result;
26
+ }
27
+ class RpcError extends Error {
28
+ constructor(rpcError) {
29
+ super(`RPC error: ${rpcError.message} (code=${rpcError.code})`);
30
+ this.rpcError = rpcError;
31
+ }
32
+ static isRpcErrorWithCode(e, code) {
33
+ return e instanceof RpcError && e.rpcError.code === code;
34
+ }
35
+ }
36
+ exports.RpcError = RpcError;
37
+ /** Wrapper around https://docs.sui.io/sui-jsonrpc */
38
+ class RpcClient {
39
+ constructor(url) {
40
+ // Running counter, increments every request
41
+ this.id = 0;
42
+ this.url = url;
43
+ }
44
+ static async createCheckedConnection(url) {
45
+ const rpcClient = new RpcClient(url);
46
+ const { protocolVersion } = await rpcClient.exec('sui_getProtocolConfig');
47
+ const chainId = await rpcClient.exec('sui_getChainIdentifier');
48
+ debug('Connected to', url, 'protocolVersion', protocolVersion, 'chainId', chainId);
49
+ return rpcClient;
50
+ }
51
+ async exec(method, ...params) {
52
+ params = params.filter((v) => v !== undefined);
53
+ try {
54
+ debug('>', this.url, method, params);
55
+ const response = await axios_1.default.post(this.url, {
56
+ jsonrpc: '2.0',
57
+ method,
58
+ params,
59
+ id: `${this.id++}`,
60
+ });
61
+ return unwrapResult(method, response.data);
62
+ }
63
+ catch (e) {
64
+ if (e.isAxiosError && e.response) {
65
+ e = e;
66
+ debug('< %s ERROR', method, e.response.statusText, util_1.default.inspect(e.response.data, { depth: 10 }));
67
+ e = e;
68
+ const { error = {} } = e.response.data;
69
+ throw new RpcError(error);
70
+ }
71
+ throw e;
72
+ }
73
+ }
74
+ /**
75
+ * https://docs.sui.io/sui-jsonrpc#suix_getCoins
76
+ */
77
+ async getCoins(owner, coinType, cursor, limit) {
78
+ return this.exec('suix_getCoins', owner, coinType, cursor, limit);
79
+ }
80
+ async executeTransactionBlock(tx_bytes, signatures, options, request_type) {
81
+ return this.exec('sui_executeTransactionBlock', tx_bytes, signatures, {
82
+ showInput: true,
83
+ showRawInput: true,
84
+ showEffects: true,
85
+ showEvents: true,
86
+ showObjectChanges: true,
87
+ showBalanceChanges: true,
88
+ }, request_type);
89
+ }
90
+ /**
91
+ * https://docs.sui.io/sui-jsonrpc#suix_getValidatorsApy
92
+ * APY = Annual Percentage Yield
93
+ */
94
+ async getValidatorsApy() {
95
+ return this.exec('suix_getValidatorsApy');
96
+ }
97
+ /**
98
+ * https://docs.sui.io/sui-jsonrpc#suix_getStakes
99
+ */
100
+ async getStakes(owner) {
101
+ return this.exec('suix_getStakes', owner);
102
+ }
103
+ /**
104
+ * https://docs.sui.io/sui-jsonrpc#sui_getObject
105
+ */
106
+ async getObject(object_id) {
107
+ return this.exec('sui_getObject', object_id, { showData: true });
108
+ }
109
+ }
110
+ exports.RpcClient = RpcClient;
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnBjQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9sb2NhbF9mdWxsbm9kZS9ScGNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLGtEQUEwQztBQUMxQyxrREFBK0I7QUFJL0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFVLEVBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEMsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxPQUFPLE1BQU0sS0FBSyx1QkFBdUIsQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUksTUFBYyxFQUFFLENBQStEO0lBQ3RHLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pCLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBYSxRQUFTLFNBQVEsS0FBSztJQUdqQyxZQUFZLFFBQTJDO1FBQ3JELEtBQUssQ0FBQyxjQUFjLFFBQVEsQ0FBQyxPQUFPLFVBQVUsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFD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akIsWUFBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLDZCQUE2QixFQUM3QixRQUFRLEVBQ1IsVUFBVSxFQUNWO1lBQ0UsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsSUFBSTtZQUNoQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGtCQUFrQixFQUFFLElBQUk7U0FDekIsRUFDRCxZQUFZLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZ0JBQWdCO1FBSXBCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFpQjtRQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDRjtBQXZHRCw4QkF1R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCBheGlvcywgeyBBeGlvc0Vycm9yIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IGJ1aWxkRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgU3VpT2JqZWN0RGF0YSwgU3VpVHJhbnNhY3Rpb25CbG9ja1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9teXN0ZW5sYWIvdHlwZXMnO1xuaW1wb3J0IHsgRGVsZWdhdGVkU3Rha2UgfSBmcm9tICcuLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcy92YWxpZGF0b3InO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ1JwY0NsaWVudCcpO1xuXG5mdW5jdGlvbiBlbGlkZVJlc3BvbnNlKG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBtZXRob2QgPT09ICdzdWlfZ2V0UHJvdG9jb2xDb25maWcnO1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXN1bHQ8QT4obWV0aG9kOiBzdHJpbmcsIHY6IHsgcmVzdWx0OiBBIH0gfCB7IGVycm9yOiB7IGNvZGU6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH0gfSk6IEEge1xuICBpZiAoJ2Vycm9yJyBpbiB2KSB7XG4gICAgZGVidWcoJzwgJXMgRVJST1InLCBtZXRob2QsIHYuZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh2LmVycm9yKSk7XG4gIH1cbiAgaWYgKGVsaWRlUmVzcG9uc2UobWV0aG9kKSkge1xuICAgIGRlYnVnKCc8ICVzIC4uLicsIG1ldGhvZCk7XG4gIH0gZWxzZSB7XG4gICAgZGVidWcoJzwgJXMnLCBtZXRob2QsIHV0aWwuaW5zcGVjdCh2LnJlc3VsdCwgeyBkZXB0aDogMTAgfSkpO1xuICB9XG4gIHJldHVybiB2LnJlc3VsdDtcbn1cblxuZXhwb3J0IGNsYXNzIFJwY0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcnBjRXJyb3I6IHsgY29kZTogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihycGNFcnJvcjogeyBjb2RlOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoYFJQQyBlcnJvcjogJHtycGNFcnJvci5tZXNzYWdlfSAoY29kZT0ke3JwY0Vycm9yLmNvZGV9KWApO1xuICAgIHRoaXMucnBjRXJyb3IgPSBycGNFcnJvcjtcbiAgfVxuXG4gIHN0YXRpYyBpc1JwY0Vycm9yV2l0aENvZGUoZTogRXJyb3IsIGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgUnBjRXJyb3IgJiYgZS5ycGNFcnJvci5jb2RlID09PSBjb2RlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENvaW4gPSB7XG4gIGNvaW5UeXBlOiBzdHJpbmc7XG4gIGNvaW5PYmplY3RJZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGRpZ2VzdDogc3RyaW5nO1xuICBiYWxhbmNlOiBzdHJpbmc7XG4gIHByZXZpb3VzVHJhbnNhY3Rpb246IHN0cmluZztcbn07XG5cbi8qKiBXcmFwcGVyIGFyb3VuZCBodHRwczovL2RvY3Muc3VpLmlvL3N1aS1qc29ucnBjICovXG5leHBvcnQgY2xhc3MgUnBjQ2xpZW50IHtcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICAvLyBSdW5uaW5nIGNvdW50ZXIsIGluY3JlbWVudHMgZXZlcnkgcmVxdWVzdFxuICBpZCA9IDA7XG5cbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVDaGVja2VkQ29ubmVjdGlvbih1cmw6IHN0cmluZyk6IFByb21pc2U8UnBjQ2xpZW50PiB7XG4gICAgY29uc3QgcnBjQ2xpZW50ID0gbmV3IFJwY0NsaWVudCh1cmwpO1xuICAgIGNvbnN0IHsgcHJvdG9jb2xWZXJzaW9uIH0gPSBhd2FpdCBycGNDbGllbnQuZXhlYzx7IHByb3RvY29sVmVyc2lvbjogc3RyaW5nIH0+KCdzdWlfZ2V0UHJvdG9jb2xDb25maWcnKTtcbiAgICBjb25zdCBjaGFpbklkID0gYXdhaXQgcnBjQ2xpZW50LmV4ZWMoJ3N1aV9nZXRDaGFpbklkZW50aWZpZXInKTtcbiAgICBkZWJ1ZygnQ29ubmVjdGVkIHRvJywgdXJsLCAncHJvdG9jb2xWZXJzaW9uJywgcHJvdG9jb2xWZXJzaW9uLCAnY2hhaW5JZCcsIGNoYWluSWQpO1xuICAgIHJldHVybiBycGNDbGllbnQ7XG4gIH1cblxuICBhc3luYyBleGVjPFQ+KG1ldGhvZDogc3RyaW5nLCAuLi5wYXJhbXM6IHVua25vd25bXSk6IFByb21pc2U8VD4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5maWx0ZXIoKHYpID0+IHYgIT09IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKCc+JywgdGhpcy51cmwsIG1ldGhvZCwgcGFyYW1zKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdCh0aGlzLnVybCwge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGlkOiBgJHt0aGlzLmlkKyt9YCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVud3JhcFJlc3VsdChtZXRob2QsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmlzQXhpb3NFcnJvciAmJiBlLnJlc3BvbnNlKSB7XG4gICAgICAgIGUgPSBlIGFzIEF4aW9zRXJyb3I7XG4gICAgICAgIGRlYnVnKCc8ICVzIEVSUk9SJywgbWV0aG9kLCBlLnJlc3BvbnNlLnN0YXR1c1RleHQsIHV0aWwuaW5zcGVjdChlLnJlc3BvbnNlLmRhdGEsIHsgZGVwdGg6IDEwIH0pKTtcbiAgICAgICAgZSA9IGUgYXMgQXhpb3NFcnJvcjtcbiAgICAgICAgY29uc3QgeyBlcnJvciA9IHt9IH0gPSBlLnJlc3BvbnNlLmRhdGE7XG4gICAgICAgIHRocm93IG5ldyBScGNFcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vZG9jcy5zdWkuaW8vc3VpLWpzb25ycGMjc3VpeF9nZXRDb2luc1xuICAgKi9cbiAgYXN5bmMgZ2V0Q29pbnMoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZyxcbiAgICBjdXJzb3I/OiBzdHJpbmcsXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTx7XG4gICAgZGF0YTogQ29pbltdO1xuICAgIG5leHRDdXJzb3I/OiBzdHJpbmc7XG4gICAgaGFzTmV4dFBhZ2U/OiBib29sZWFuO1xuICB9PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlYygnc3VpeF9nZXRDb2lucycsIG93bmVyLCBjb2luVHlwZSwgY3Vyc29yLCBsaW1pdCk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHJhbnNhY3Rpb25CbG9jayhcbiAgICB0eF9ieXRlczogc3RyaW5nLFxuICAgIHNpZ25hdHVyZXM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiB1bmtub3duLFxuICAgIHJlcXVlc3RfdHlwZT86IHVua25vd25cbiAgKTogUHJvbWlzZTxTdWlUcmFuc2FjdGlvbkJsb2NrUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjKFxuICAgICAgJ3N1aV9leGVjdXRlVHJhbnNhY3Rpb25CbG9jaycsXG4gICAgICB0eF9ieXRlcyxcbiAgICAgIHNpZ25hdHVyZXMsXG4gICAgICB7XG4gICAgICAgIHNob3dJbnB1dDogdHJ1ZSxcbiAgICAgICAgc2hvd1Jhd0lucHV0OiB0cnVlLFxuICAgICAgICBzaG93RWZmZWN0czogdHJ1ZSxcbiAgICAgICAgc2hvd0V2ZW50czogdHJ1ZSxcbiAgICAgICAgc2hvd09iamVjdENoYW5nZXM6IHRydWUsXG4gICAgICAgIHNob3dCYWxhbmNlQ2hhbmdlczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0X3R5cGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vZG9jcy5zdWkuaW8vc3VpLWpzb25ycGMjc3VpeF9nZXRWYWxpZGF0b3JzQXB5XG4gICAqIEFQWSA9IEFubnVhbCBQZXJjZW50YWdlIFlpZWxkXG4gICAqL1xuICBhc3luYyBnZXRWYWxpZGF0b3JzQXB5KCk6IFByb21pc2U8e1xuICAgIGFweXM6IHsgYWRkcmVzczogc3RyaW5nOyBhcHk6IHN0cmluZyB9W107XG4gICAgZXBvY2g6IHN0cmluZztcbiAgfT4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWMoJ3N1aXhfZ2V0VmFsaWRhdG9yc0FweScpO1xuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vZG9jcy5zdWkuaW8vc3VpLWpzb25ycGMjc3VpeF9nZXRTdGFrZXNcbiAgICovXG4gIGFzeW5jIGdldFN0YWtlcyhvd25lcjogc3RyaW5nKTogUHJvbWlzZTxEZWxlZ2F0ZWRTdGFrZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlYygnc3VpeF9nZXRTdGFrZXMnLCBvd25lcik7XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9kb2NzLnN1aS5pby9zdWktanNvbnJwYyNzdWlfZ2V0T2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0X2lkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogU3VpT2JqZWN0RGF0YSB9PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlYygnc3VpX2dldE9iamVjdCcsIG9iamVjdF9pZCwgeyBzaG93RGF0YTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export declare class Faucet {
2
+ url: string;
3
+ constructor(url: string);
4
+ getCoins(address: string, amount: number): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=faucet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faucet.d.ts","sourceRoot":"","sources":["../../../test/local_fullnode/faucet.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACV,GAAG,EAAE,MAAM,CAAC;gBACP,GAAG,EAAE,MAAM;IAIjB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/D"}
@@ -0,0 +1,17 @@
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.Faucet = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ class Faucet {
9
+ constructor(url) {
10
+ this.url = url;
11
+ }
12
+ async getCoins(address, amount) {
13
+ await axios_1.default.post(this.url + '/gas', { FixedAmountRequest: { recipient: address } });
14
+ }
15
+ }
16
+ exports.Faucet = Faucet;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmF1Y2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9sb2NhbF9mdWxsbm9kZS9mYXVjZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBRTFCLE1BQWEsTUFBTTtJQUVqQixZQUFZLEdBQVc7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBZSxFQUFFLE1BQWM7UUFDNUMsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7Q0FDRjtBQVRELHdCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuZXhwb3J0IGNsYXNzIEZhdWNldCB7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuXG4gIGFzeW5jIGdldENvaW5zKGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBheGlvcy5wb3N0KHRoaXMudXJsICsgJy9nYXMnLCB7IEZpeGVkQW1vdW50UmVxdWVzdDogeyByZWNpcGllbnQ6IGFkZHJlc3MgfSB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../../test/local_fullnode/transactions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,190 @@
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
+ process.env.DEBUG = 'RpcClient,SuiTransactionTypes';
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const util_1 = __importDefault(require("util"));
9
+ const faucet_1 = require("./faucet");
10
+ const debug_1 = __importDefault(require("debug"));
11
+ const crypto_1 = require("crypto");
12
+ const src_1 = require("../../src");
13
+ const RpcClient_1 = require("./RpcClient");
14
+ const getBuilderFactory_1 = require("../unit/getBuilderFactory");
15
+ const iface_1 = require("../../src/lib/iface");
16
+ const constants_1 = require("../../src/lib/constants");
17
+ const debug = (0, debug_1.default)('SuiTransactionTypes');
18
+ async function getAllCoins(conn, address) {
19
+ return (await conn.getCoins(address)).data.map((v) => {
20
+ return {
21
+ digest: v.digest,
22
+ objectId: v.coinObjectId,
23
+ version: v.version,
24
+ };
25
+ });
26
+ }
27
+ /**
28
+ * @returns The stakes array with the stakedSui amount reduced by amount. If amount is undefined, the stakedSui is removed.
29
+ */
30
+ function subtractStake(stakes, stakedSui, amount) {
31
+ return stakes.flatMap((s) => {
32
+ if (s.stakedSuiId === stakedSui.stakedSuiId) {
33
+ if (amount === undefined) {
34
+ // remove the stake
35
+ return [];
36
+ }
37
+ else {
38
+ // reduce the stake by amount
39
+ return [{ ...s, principal: Number(s.principal) - amount }];
40
+ }
41
+ }
42
+ else {
43
+ // keep the stake unchanged
44
+ return [s];
45
+ }
46
+ });
47
+ }
48
+ /**
49
+ * Asserts that the stakesAfter array is the same as the stakesBefore array with the stakedSui amount reduced by amount.
50
+ */
51
+ function assertReducedStake(stakesBefore, stakesAfter, stakedSui, amount) {
52
+ /*
53
+ * Normalize the stake objects by converting the principal to a number and removing the estimatedReward.
54
+ */
55
+ function normStake(s) {
56
+ return { ...s, principal: Number(s.principal), estimatedReward: undefined };
57
+ }
58
+ stakesBefore = stakesBefore.map(normStake);
59
+ stakesAfter = stakesAfter.map(normStake);
60
+ assert_1.default.deepStrictEqual(stakesAfter, subtractStake(stakesBefore, stakedSui, amount));
61
+ }
62
+ async function getStakes(conn, owner, params = {}) {
63
+ const all = await conn.getStakes(owner);
64
+ const result = await Promise.all(all.flatMap((s) => s.stakes
65
+ .filter((v) => params.filterStatus === undefined || v.status === params.filterStatus)
66
+ .filter((v) => params.filterMinValue === undefined || params.filterMinValue <= Number(v.principal))));
67
+ if (result.length) {
68
+ return result;
69
+ }
70
+ const { attempts = 60, sleepMs = 1000 } = params;
71
+ if (0 < attempts) {
72
+ await new Promise((resolve) => setTimeout(resolve, sleepMs));
73
+ return await getStakes(conn, owner, { ...params, attempts: attempts - 1, sleepMs });
74
+ }
75
+ else {
76
+ throw new Error('getAllActiveStakedSuis: no active staked suis found');
77
+ }
78
+ }
79
+ async function resolveStakedSui(conn, stake) {
80
+ return (await conn.getObject(stake.stakedSuiId)).data;
81
+ }
82
+ function getKeyPair(seed) {
83
+ const seedBuf = (0, crypto_1.createHash)('sha256').update(seed).digest();
84
+ return new src_1.KeyPair({ seed: seedBuf });
85
+ }
86
+ async function signAndSubmit(conn, keyPair, txb) {
87
+ txb.sign({ key: keyPair.getKeys().prv });
88
+ const tx = (await txb.build());
89
+ debug('tx', util_1.default.inspect(tx.suiTransaction.tx, { depth: 10 }));
90
+ const result = await conn.executeTransactionBlock(tx.toBroadcastFormat(), [
91
+ Buffer.from(tx.serializedSig).toString('base64'),
92
+ ]);
93
+ if (result.effects?.status.status !== 'success') {
94
+ throw new Error(`Transaction failed: ${JSON.stringify(result.effects?.status)}`);
95
+ }
96
+ }
97
+ async function fundFromFaucet(url, v, amount = 100e9) {
98
+ if (typeof v !== 'string') {
99
+ v = v.getAddress();
100
+ }
101
+ await new faucet_1.Faucet(url).getCoins(v, 10e9);
102
+ }
103
+ describe('Sui Transaction Types', function () {
104
+ if (process.env.DRONE) {
105
+ console.log('skipping local_fullnode/transactions.ts on drone');
106
+ return;
107
+ }
108
+ const keyPair = getKeyPair('test');
109
+ const address = keyPair.getAddress();
110
+ debug('address', address);
111
+ const fullnodeUrl = process.env.SUI_FULLNODE_URL || 'http://127.0.0.1:9000';
112
+ const faucetUrl = process.env.SUI_FAUCET_URL || 'http://127.0.0.1:9123';
113
+ async function getDefaultGasData(keyPair) {
114
+ return {
115
+ owner: keyPair.getAddress(),
116
+ payment: await getAllCoins(conn, keyPair.getAddress()),
117
+ budget: 100000000,
118
+ price: constants_1.DUMMY_SUI_GAS_PRICE,
119
+ };
120
+ }
121
+ let conn;
122
+ let validator;
123
+ before('establish connection', async function () {
124
+ conn = await RpcClient_1.RpcClient.createCheckedConnection(fullnodeUrl);
125
+ const { apys } = await conn.getValidatorsApy();
126
+ validator = apys[0].address;
127
+ });
128
+ before('fund via faucet', async function () {
129
+ if (faucetUrl) {
130
+ await fundFromFaucet(faucetUrl, address);
131
+ }
132
+ });
133
+ it('has coins', async function () {
134
+ const { data } = await conn.getCoins(address);
135
+ assert_1.default.notStrictEqual(data.length, 0);
136
+ });
137
+ it('can transfer coins', async function () {
138
+ const builder = (0, getBuilderFactory_1.getBuilderFactory)('tsui').getTransferBuilder();
139
+ const txb = builder
140
+ .type(iface_1.SuiTransactionType.Transfer)
141
+ .sender(address)
142
+ .send([{ address, amount: (111111).toString() }])
143
+ .gasData(await getDefaultGasData(keyPair));
144
+ await signAndSubmit(conn, keyPair, txb);
145
+ });
146
+ async function stakeAmount(keyPair, amount) {
147
+ const builder = (0, getBuilderFactory_1.getBuilderFactory)('tsui').getStakingBuilder();
148
+ const txb = builder
149
+ .type(iface_1.SuiTransactionType.AddStake)
150
+ .sender(keyPair.getAddress())
151
+ .stake([{ amount, validatorAddress: validator }])
152
+ .gasData(await getDefaultGasData(keyPair));
153
+ await signAndSubmit(conn, keyPair, txb);
154
+ }
155
+ it('can stake coins', async function () {
156
+ await stakeAmount(keyPair, 1e9);
157
+ });
158
+ function testUnstake(amount) {
159
+ describe(`unstake (amount=${amount})`, function () {
160
+ const keyPairStakeTest = getKeyPair(`stake-test-amount-${amount !== undefined}`);
161
+ const address = keyPairStakeTest.getAddress();
162
+ before('stake coins', async function () {
163
+ await fundFromFaucet(faucetUrl, address);
164
+ await stakeAmount(keyPairStakeTest, 10e9);
165
+ });
166
+ it(`can unstake`, async function () {
167
+ const activeStakedSui = await getStakes(conn, address, {
168
+ filterStatus: 'Active',
169
+ filterMinValue: constants_1.MIN_STAKING_THRESHOLD + (amount || 0),
170
+ });
171
+ (0, assert_1.default)(activeStakedSui.length > 0, 'No staked coins found');
172
+ for (const stakedSui of activeStakedSui.slice(0, 3)) {
173
+ debug('unstaking', stakedSui);
174
+ const builder = (0, getBuilderFactory_1.getBuilderFactory)('tsui').getUnstakingBuilder();
175
+ const stakedBefore = await getStakes(conn, address);
176
+ const txb = builder
177
+ .type(iface_1.SuiTransactionType.WithdrawStake)
178
+ .sender(address)
179
+ .unstake({ stakedSui: await resolveStakedSui(conn, stakedSui), amount })
180
+ .gasData(await getDefaultGasData(keyPairStakeTest));
181
+ await signAndSubmit(conn, keyPairStakeTest, txb);
182
+ assertReducedStake(stakedBefore, await getStakes(conn, address), stakedSui, amount);
183
+ }
184
+ });
185
+ });
186
+ }
187
+ testUnstake(undefined);
188
+ testUnstake(1e9);
189
+ });
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9sb2NhbF9mdWxsbm9kZS90cmFuc2FjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRywrQkFBK0IsQ0FBQztBQUVwRCxvREFBNEI7QUFDNUIsZ0RBQXdCO0FBQ3hCLHFDQUFrQztBQUNsQyxrREFBK0I7QUFDL0IsbUNBQW9DO0FBRXBDLG1DQVFtQjtBQUNuQiwyQ0FBd0M7QUFDeEMsaUVBQThEO0FBQzlELCtDQUF5RDtBQUV6RCx1REFBcUY7QUFFckYsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFVLEVBQUMscUJBQXFCLENBQUMsQ0FBQztBQUVoRCxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQWUsRUFBRSxPQUFlO0lBQ3pELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbkQsT0FBTztZQUNMLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNoQixRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVk7WUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1NBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLE1BQXFCLEVBQUUsU0FBc0IsRUFBRSxNQUEwQjtJQUM5RixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQWlCLEVBQUU7UUFDekMsSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekIsbUJBQW1CO2dCQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNa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QUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Rha2VPYmplY3QgfSBmcm9tICcuLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcy92YWxpZGF0b3InO1xuXG5wcm9jZXNzLmVudi5ERUJVRyA9ICdScGNDbGllbnQsU3VpVHJhbnNhY3Rpb25UeXBlcyc7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgRmF1Y2V0IH0gZnJvbSAnLi9mYXVjZXQnO1xuaW1wb3J0IGJ1aWxkRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7XG4gIEtleVBhaXIsXG4gIFN0YWtpbmdCdWlsZGVyLFxuICBTdGFraW5nVHJhbnNhY3Rpb24sXG4gIFRyYW5zZmVyQnVpbGRlcixcbiAgVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgVW5zdGFraW5nQnVpbGRlcixcbiAgVW5zdGFraW5nVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBScGNDbGllbnQgfSBmcm9tICcuL1JwY0NsaWVudCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL3VuaXQvZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgU3VpVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBHYXNEYXRhLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcyc7XG5pbXBvcnQgeyBEVU1NWV9TVUlfR0FTX1BSSUNFLCBNSU5fU1RBS0lOR19USFJFU0hPTEQgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlYnVnID0gYnVpbGREZWJ1ZygnU3VpVHJhbnNhY3Rpb25UeXBlcycpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxDb2lucyhjb25uOiBScGNDbGllbnQsIGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8U3VpT2JqZWN0UmVmW10+IHtcbiAgcmV0dXJuIChhd2FpdCBjb25uLmdldENvaW5zKGFkZHJlc3MpKS5kYXRhLm1hcCgodikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBkaWdlc3Q6IHYuZGlnZXN0LFxuICAgICAgb2JqZWN0SWQ6IHYuY29pbk9iamVjdElkLFxuICAgICAgdmVyc2lvbjogdi52ZXJzaW9uLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzdGFrZXMgYXJyYXkgd2l0aCB0aGUgc3Rha2VkU3VpIGFtb3VudCByZWR1Y2VkIGJ5IGFtb3VudC4gSWYgYW1vdW50IGlzIHVuZGVmaW5lZCwgdGhlIHN0YWtlZFN1aSBpcyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdWJ0cmFjdFN0YWtlKHN0YWtlczogU3Rha2VPYmplY3RbXSwgc3Rha2VkU3VpOiBTdGFrZU9iamVjdCwgYW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQpOiBTdGFrZU9iamVjdFtdIHtcbiAgcmV0dXJuIHN0YWtlcy5mbGF0TWFwKChzKTogU3Rha2VPYmplY3RbXSA9PiB7XG4gICAgaWYgKHMuc3Rha2VkU3VpSWQgPT09IHN0YWtlZFN1aS5zdGFrZWRTdWlJZCkge1xuICAgICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgc3Rha2VcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVkdWNlIHRoZSBzdGFrZSBieSBhbW91bnRcbiAgICAgICAgcmV0dXJuIFt7IC4uLnMsIHByaW5jaXBhbDogTnVtYmVyKHMucHJpbmNpcGFsKSAtIGFtb3VudCB9XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8ga2VlcCB0aGUgc3Rha2UgdW5jaGFuZ2VkXG4gICAgICByZXR1cm4gW3NdO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBzdGFrZXNBZnRlciBhcnJheSBpcyB0aGUgc2FtZSBhcyB0aGUgc3Rha2VzQmVmb3JlIGFycmF5IHdpdGggdGhlIHN0YWtlZFN1aSBhbW91bnQgcmVkdWNlZCBieSBhbW91bnQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZWRTdGFrZShcbiAgc3Rha2VzQmVmb3JlOiBTdGFrZU9iamVjdFtdLFxuICBzdGFrZXNBZnRlcjogU3Rha2VPYmplY3RbXSxcbiAgc3Rha2VkU3VpOiBTdGFrZU9iamVjdCxcbiAgYW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWRcbikge1xuICAvKlxuICAgKiBOb3JtYWxpemUgdGhlIHN0YWtlIG9iamVjdHMgYnkgY29udmVydGluZyB0aGUgcHJpbmNpcGFsIHRvIGEgbnVtYmVyIGFuZCByZW1vdmluZyB0aGUgZXN0aW1hdGVkUmV3YXJkLlxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybVN0YWtlKHM6IFN0YWtlT2JqZWN0KTogU3Rha2VPYmplY3Qge1xuICAgIHJldHVybiB7IC4uLnMsIHByaW5jaXBhbDogTnVtYmVyKHMucHJpbmNpcGFsKSwgZXN0aW1hdGVkUmV3YXJkOiB1bmRlZmluZWQgfTtcbiAgfVxuICBzdGFrZXNCZWZvcmUgPSBzdGFrZXNCZWZvcmUubWFwKG5vcm1TdGFrZSk7XG4gIHN0YWtlc0FmdGVyID0gc3Rha2VzQWZ0ZXIubWFwKG5vcm1TdGFrZSk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc3Rha2VzQWZ0ZXIsIHN1YnRyYWN0U3Rha2Uoc3Rha2VzQmVmb3JlLCBzdGFrZWRTdWksIGFtb3VudCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdGFrZXMoXG4gIGNvbm46IFJwY0NsaWVudCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcGFyYW1zOiB7XG4gICAgZmlsdGVyU3RhdHVzPzogU3Rha2VPYmplY3RbJ3N0YXR1cyddO1xuICAgIGZpbHRlck1pblZhbHVlPzogbnVtYmVyO1xuICAgIGF0dGVtcHRzPzogbnVtYmVyO1xuICAgIHNsZWVwTXM/OiBudW1iZXI7XG4gIH0gPSB7fVxuKTogUHJvbWlzZTxTdGFrZU9iamVjdFtdPiB7XG4gIGNvbnN0IGFsbCA9IGF3YWl0IGNvbm4uZ2V0U3Rha2VzKG93bmVyKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgYWxsLmZsYXRNYXAoKHMpID0+XG4gICAgICBzLnN0YWtlc1xuICAgICAgICAuZmlsdGVyKCh2KSA9PiBwYXJhbXMuZmlsdGVyU3RhdHVzID09PSB1bmRlZmluZWQgfHwgdi5zdGF0dXMgPT09IHBhcmFtcy5maWx0ZXJTdGF0dXMpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHBhcmFtcy5maWx0ZXJNaW5WYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5maWx0ZXJNaW5WYWx1ZSA8PSBOdW1iZXIodi5wcmluY2lwYWwpKVxuICAgIClcbiAgKTtcbiAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IHsgYXR0ZW1wdHMgPSA2MCwgc2xlZXBNcyA9IDEwMDAgfSA9IHBhcmFtcztcbiAgaWYgKDAgPCBhdHRlbXB0cykge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHNsZWVwTXMpKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0U3Rha2VzKGNvbm4sIG93bmVyLCB7IC4uLnBhcmFtcywgYXR0ZW1wdHM6IGF0dGVtcHRzIC0gMSwgc2xlZXBNcyB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldEFsbEFjdGl2ZVN0YWtlZFN1aXM6IG5vIGFjdGl2ZSBzdGFrZWQgc3VpcyBmb3VuZCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTdGFrZWRTdWkoY29ubjogUnBjQ2xpZW50LCBzdGFrZTogU3Rha2VPYmplY3QpOiBQcm9taXNlPFN1aU9iamVjdFJlZj4ge1xuICByZXR1cm4gKGF3YWl0IGNvbm4uZ2V0T2JqZWN0KHN0YWtlLnN0YWtlZFN1aUlkKSkuZGF0YTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5UGFpcihzZWVkOiBzdHJpbmcpOiBLZXlQYWlyIHtcbiAgY29uc3Qgc2VlZEJ1ZiA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHsgc2VlZDogc2VlZEJ1ZiB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2lnbkFuZFN1Ym1pdChcbiAgY29ubjogUnBjQ2xpZW50LFxuICBrZXlQYWlyOiBLZXlQYWlyLFxuICB0eGI6IFRyYW5zZmVyQnVpbGRlciB8IFN0YWtpbmdCdWlsZGVyIHwgVW5zdGFraW5nQnVpbGRlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHR4Yi5zaWduKHsga2V5OiBrZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gIGNvbnN0IHR4ID0gKGF3YWl0IHR4Yi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uIHwgU3Rha2luZ1RyYW5zYWN0aW9uIHwgVW5zdGFraW5nVHJhbnNhY3Rpb247XG4gIGRlYnVnKCd0eCcsIHV0aWwuaW5zcGVjdCh0eC5zdWlUcmFuc2FjdGlvbi50eCwgeyBkZXB0aDogMTAgfSkpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uLmV4ZWN1dGVUcmFuc2FjdGlvbkJsb2NrKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIFtcbiAgICBCdWZmZXIuZnJvbSh0eC5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0JyksXG4gIF0pO1xuICBpZiAocmVzdWx0LmVmZmVjdHM/LnN0YXR1cy5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdC5lZmZlY3RzPy5zdGF0dXMpfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZ1bmRGcm9tRmF1Y2V0KHVybDogc3RyaW5nLCB2OiBLZXlQYWlyIHwgc3RyaW5nLCBhbW91bnQgPSAxMDBlOSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdiA9IHYuZ2V0QWRkcmVzcygpO1xuICB9XG4gIGF3YWl0IG5ldyBGYXVjZXQodXJsKS5nZXRDb2lucyh2LCAxMGU5KTtcbn1cblxuZGVzY3JpYmUoJ1N1aSBUcmFuc2FjdGlvbiBUeXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHByb2Nlc3MuZW52LkRST05FKSB7XG4gICAgY29uc29sZS5sb2coJ3NraXBwaW5nIGxvY2FsX2Z1bGxub2RlL3RyYW5zYWN0aW9ucy50cyBvbiBkcm9uZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGtleVBhaXIgPSBnZXRLZXlQYWlyKCd0ZXN0Jyk7XG4gIGNvbnN0IGFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgZGVidWcoJ2FkZHJlc3MnLCBhZGRyZXNzKTtcblxuICBjb25zdCBmdWxsbm9kZVVybCA9IHByb2Nlc3MuZW52LlNVSV9GVUxMTk9ERV9VUkwgfHwgJ2h0dHA6Ly8xMjcuMC4wLjE6OTAwMCc7XG4gIGNvbnN0IGZhdWNldFVybCA9IHByb2Nlc3MuZW52LlNVSV9GQVVDRVRfVVJMIHx8ICdodHRwOi8vMTI3LjAuMC4xOjkxMjMnO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldERlZmF1bHRHYXNEYXRhKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPEdhc0RhdGE+IHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXI6IGtleVBhaXIuZ2V0QWRkcmVzcygpLFxuICAgICAgcGF5bWVudDogYXdhaXQgZ2V0QWxsQ29pbnMoY29ubiwga2V5UGFpci5nZXRBZGRyZXNzKCkpLFxuICAgICAgYnVkZ2V0OiAxMDBfMDAwXzAwMCxcbiAgICAgIHByaWNlOiBEVU1NWV9TVUlfR0FTX1BSSUNFLFxuICAgIH07XG4gIH1cblxuICBsZXQgY29ubjogUnBjQ2xpZW50O1xuICBsZXQgdmFsaWRhdG9yOiBzdHJpbmc7XG4gIGJlZm9yZSgnZXN0YWJsaXNoIGNvbm5lY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29ubiA9IGF3YWl0IFJwY0NsaWVudC5jcmVhdGVDaGVja2VkQ29ubmVjdGlvbihmdWxsbm9kZVVybCk7XG4gICAgY29uc3QgeyBhcHlzIH0gPSBhd2FpdCBjb25uLmdldFZhbGlkYXRvcnNBcHkoKTtcbiAgICB2YWxpZGF0b3IgPSBhcHlzWzBdLmFkZHJlc3M7XG4gIH0pO1xuXG4gIGJlZm9yZSgnZnVuZCB2aWEgZmF1Y2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGlmIChmYXVjZXRVcmwpIHtcbiAgICAgIGF3YWl0IGZ1bmRGcm9tRmF1Y2V0KGZhdWNldFVybCwgYWRkcmVzcyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnaGFzIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgY29ubi5nZXRDb2lucyhhZGRyZXNzKTtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoZGF0YS5sZW5ndGgsIDApO1xuICB9KTtcblxuICBpdCgnY2FuIHRyYW5zZmVyIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpLmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGNvbnN0IHR4YiA9IGJ1aWxkZXJcbiAgICAgIC50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcilcbiAgICAgIC5zZW5kZXIoYWRkcmVzcylcbiAgICAgIC5zZW5kKFt7IGFkZHJlc3MsIGFtb3VudDogKDExMV8xMTEpLnRvU3RyaW5nKCkgfV0pXG4gICAgICAuZ2FzRGF0YShhd2FpdCBnZXREZWZhdWx0R2FzRGF0YShrZXlQYWlyKSk7XG5cbiAgICBhd2FpdCBzaWduQW5kU3VibWl0KGNvbm4sIGtleVBhaXIsIHR4Yik7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YWtlQW1vdW50KGtleVBhaXI6IEtleVBhaXIsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJykuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICBjb25zdCB0eGIgPSBidWlsZGVyXG4gICAgICAudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpXG4gICAgICAuc2VuZGVyKGtleVBhaXIuZ2V0QWRkcmVzcygpKVxuICAgICAgLnN0YWtlKFt7IGFtb3VudCwgdmFsaWRhdG9yQWRkcmVzczogdmFsaWRhdG9yIH1dKVxuICAgICAgLmdhc0RhdGEoYXdhaXQgZ2V0RGVmYXVsdEdhc0RhdGEoa2V5UGFpcikpO1xuXG4gICAgYXdhaXQgc2lnbkFuZFN1Ym1pdChjb25uLCBrZXlQYWlyLCB0eGIpO1xuICB9XG5cbiAgaXQoJ2NhbiBzdGFrZSBjb2lucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBzdGFrZUFtb3VudChrZXlQYWlyLCAxZTkpO1xuICB9KTtcblxuICBmdW5jdGlvbiB0ZXN0VW5zdGFrZShhbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGRlc2NyaWJlKGB1bnN0YWtlIChhbW91bnQ9JHthbW91bnR9KWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXJTdGFrZVRlc3QgPSBnZXRLZXlQYWlyKGBzdGFrZS10ZXN0LWFtb3VudC0ke2Ftb3VudCAhPT0gdW5kZWZpbmVkfWApO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXJTdGFrZVRlc3QuZ2V0QWRkcmVzcygpO1xuXG4gICAgICBiZWZvcmUoJ3N0YWtlIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBmdW5kRnJvbUZhdWNldChmYXVjZXRVcmwsIGFkZHJlc3MpO1xuICAgICAgICBhd2FpdCBzdGFrZUFtb3VudChrZXlQYWlyU3Rha2VUZXN0LCAxMGU5KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgY2FuIHVuc3Rha2VgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVN0YWtlZFN1aSA9IGF3YWl0IGdldFN0YWtlcyhjb25uLCBhZGRyZXNzLCB7XG4gICAgICAgICAgZmlsdGVyU3RhdHVzOiAnQWN0aXZlJyxcbiAgICAgICAgICBmaWx0ZXJNaW5WYWx1ZTogTUlOX1NUQUtJTkdfVEhSRVNIT0xEICsgKGFtb3VudCB8fCAwKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFzc2VydChhY3RpdmVTdGFrZWRTdWkubGVuZ3RoID4gMCwgJ05vIHN0YWtlZCBjb2lucyBmb3VuZCcpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3Rha2VkU3VpIG9mIGFjdGl2ZVN0YWtlZFN1aS5zbGljZSgwLCAzKSkge1xuICAgICAgICAgIGRlYnVnKCd1bnN0YWtpbmcnLCBzdGFrZWRTdWkpO1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpLmdldFVuc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgICAgICBjb25zdCBzdGFrZWRCZWZvcmUgPSBhd2FpdCBnZXRTdGFrZXMoY29ubiwgYWRkcmVzcyk7XG4gICAgICAgICAgY29uc3QgdHhiID0gYnVpbGRlclxuICAgICAgICAgICAgLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpXG4gICAgICAgICAgICAuc2VuZGVyKGFkZHJlc3MpXG4gICAgICAgICAgICAudW5zdGFrZSh7IHN0YWtlZFN1aTogYXdhaXQgcmVzb2x2ZVN0YWtlZFN1aShjb25uLCBzdGFrZWRTdWkpLCBhbW91bnQgfSlcbiAgICAgICAgICAgIC5nYXNEYXRhKGF3YWl0IGdldERlZmF1bHRHYXNEYXRhKGtleVBhaXJTdGFrZVRlc3QpKTtcbiAgICAgICAgICBhd2FpdCBzaWduQW5kU3VibWl0KGNvbm4sIGtleVBhaXJTdGFrZVRlc3QsIHR4Yik7XG5cbiAgICAgICAgICBhc3NlcnRSZWR1Y2VkU3Rha2Uoc3Rha2VkQmVmb3JlLCBhd2FpdCBnZXRTdGFrZXMoY29ubiwgYWRkcmVzcyksIHN0YWtlZFN1aSwgYW1vdW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB0ZXN0VW5zdGFrZSh1bmRlZmluZWQpO1xuICB0ZXN0VW5zdGFrZSgxZTkpO1xufSk7XG4iXX0=