@bitgo-beta/sdk-coin-avaxp 2.0.0

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 (113) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.json +7 -0
  3. package/.mocharc.yml +8 -0
  4. package/CHANGELOG.md +168 -0
  5. package/LICENSE +191 -0
  6. package/README.md +39 -0
  7. package/dist/src/avaxp.d.ts +69 -0
  8. package/dist/src/avaxp.d.ts.map +1 -0
  9. package/dist/src/avaxp.js +248 -0
  10. package/dist/src/iface.d.ts +43 -0
  11. package/dist/src/iface.d.ts.map +1 -0
  12. package/dist/src/iface.js +3 -0
  13. package/dist/src/index.d.ts +5 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +30 -0
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts +33 -0
  17. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/atomicTransactionBuilder.js +122 -0
  19. package/dist/src/lib/delegatorTxBuilder.d.ts +96 -0
  20. package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/delegatorTxBuilder.js +287 -0
  22. package/dist/src/lib/errors.d.ts +8 -0
  23. package/dist/src/lib/errors.d.ts.map +1 -0
  24. package/dist/src/lib/errors.js +19 -0
  25. package/dist/src/lib/exportTxBuilder.d.ts +34 -0
  26. package/dist/src/lib/exportTxBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/exportTxBuilder.js +88 -0
  28. package/dist/src/lib/iface.d.ts +58 -0
  29. package/dist/src/lib/iface.d.ts.map +1 -0
  30. package/dist/src/lib/iface.js +18 -0
  31. package/dist/src/lib/importInCTxBuilder.d.ts +48 -0
  32. package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/importInCTxBuilder.js +152 -0
  34. package/dist/src/lib/importTxBuilder.d.ts +18 -0
  35. package/dist/src/lib/importTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/importTxBuilder.js +67 -0
  37. package/dist/src/lib/index.d.ts +9 -0
  38. package/dist/src/lib/index.d.ts.map +1 -0
  39. package/dist/src/lib/index.js +29 -0
  40. package/dist/src/lib/keyPair.d.ts +59 -0
  41. package/dist/src/lib/keyPair.d.ts.map +1 -0
  42. package/dist/src/lib/keyPair.js +151 -0
  43. package/dist/src/lib/transaction.d.ts +81 -0
  44. package/dist/src/lib/transaction.d.ts.map +1 -0
  45. package/dist/src/lib/transaction.js +277 -0
  46. package/dist/src/lib/transactionBuilder.d.ts +122 -0
  47. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/transactionBuilder.js +224 -0
  49. package/dist/src/lib/transactionBuilderFactory.d.ts +42 -0
  50. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  51. package/dist/src/lib/transactionBuilderFactory.js +107 -0
  52. package/dist/src/lib/transferBuilder.d.ts +18 -0
  53. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  54. package/dist/src/lib/transferBuilder.js +31 -0
  55. package/dist/src/lib/utils.d.ts +152 -0
  56. package/dist/src/lib/utils.d.ts.map +1 -0
  57. package/dist/src/lib/utils.js +300 -0
  58. package/dist/src/lib/utxoEngine.d.ts +45 -0
  59. package/dist/src/lib/utxoEngine.d.ts.map +1 -0
  60. package/dist/src/lib/utxoEngine.js +89 -0
  61. package/dist/src/lib/validatorTxBuilder.d.ts +37 -0
  62. package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/validatorTxBuilder.js +69 -0
  64. package/dist/src/tavaxp.d.ts +9 -0
  65. package/dist/src/tavaxp.d.ts.map +1 -0
  66. package/dist/src/tavaxp.js +14 -0
  67. package/dist/test/resources/avaxp.d.ts +178 -0
  68. package/dist/test/resources/avaxp.d.ts.map +1 -0
  69. package/dist/test/resources/avaxp.js +953 -0
  70. package/dist/test/resources/errors.d.ts +18 -0
  71. package/dist/test/resources/errors.d.ts.map +1 -0
  72. package/dist/test/resources/errors.js +21 -0
  73. package/dist/test/resources/keychains.d.ts +18 -0
  74. package/dist/test/resources/keychains.d.ts.map +1 -0
  75. package/dist/test/resources/keychains.js +30 -0
  76. package/dist/test/resources/tx/importC.d.ts +29 -0
  77. package/dist/test/resources/tx/importC.d.ts.map +1 -0
  78. package/dist/test/resources/tx/importC.js +42 -0
  79. package/dist/test/resources/tx/importP.d.ts +29 -0
  80. package/dist/test/resources/tx/importP.d.ts.map +1 -0
  81. package/dist/test/resources/tx/importP.js +42 -0
  82. package/dist/test/unit/avaxp.d.ts +2 -0
  83. package/dist/test/unit/avaxp.d.ts.map +1 -0
  84. package/dist/test/unit/avaxp.js +553 -0
  85. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +2 -0
  86. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +1 -0
  87. package/dist/test/unit/lib/exportP2CTxBuilder.js +173 -0
  88. package/dist/test/unit/lib/importC2PTxBuilder.d.ts +2 -0
  89. package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +1 -0
  90. package/dist/test/unit/lib/importC2PTxBuilder.js +85 -0
  91. package/dist/test/unit/lib/importP2CTxBuilder.d.ts +2 -0
  92. package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +1 -0
  93. package/dist/test/unit/lib/importP2CTxBuilder.js +125 -0
  94. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  95. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  96. package/dist/test/unit/lib/keyPair.js +172 -0
  97. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  98. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  99. package/dist/test/unit/lib/signFlowTestSuit.js +80 -0
  100. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  101. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  102. package/dist/test/unit/lib/transactionBuilderFactory.js +114 -0
  103. package/dist/test/unit/lib/utils.d.ts +2 -0
  104. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  105. package/dist/test/unit/lib/utils.js +69 -0
  106. package/dist/test/unit/lib/utxoEngine.d.ts +2 -0
  107. package/dist/test/unit/lib/utxoEngine.d.ts.map +1 -0
  108. package/dist/test/unit/lib/utxoEngine.js +168 -0
  109. package/dist/test/unit/lib/validateTxBuilder.d.ts +2 -0
  110. package/dist/test/unit/lib/validateTxBuilder.d.ts.map +1 -0
  111. package/dist/test/unit/lib/validateTxBuilder.js +318 -0
  112. package/dist/tsconfig.tsbuildinfo +10238 -0
  113. package/package.json +62 -0
@@ -0,0 +1,168 @@
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
+ const assert_1 = __importDefault(require("assert"));
7
+ require("should");
8
+ const utxoEngine_1 = require("../../../src/lib/utxoEngine");
9
+ const utils_1 = __importDefault(require("./../../../src/lib/utils"));
10
+ describe('AvaxP UTXO engine', () => {
11
+ describe('should fail', () => {
12
+ const sender = [
13
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
14
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
15
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
16
+ ].map((a) => utils_1.default.parseAddress(a));
17
+ it('should return empty input for utxos of wrong type', () => {
18
+ const utxos = [1, 2, 3, 4].map((n) => ({
19
+ outputID: n,
20
+ amount: '509999975',
21
+ txid: 'CEbFa3hCDfMFu8ASZP9rT1s3X2X8wqoPAN258kkStk9JX3wsH',
22
+ outputidx: '1111XiaYg',
23
+ addresses: [
24
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
25
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
26
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
27
+ ],
28
+ threshold: 2,
29
+ }));
30
+ const { inputs } = utxoEngine_1.utxoToInput(utxos, sender);
31
+ inputs.should.be.empty();
32
+ });
33
+ it('should fail with wrong address', () => {
34
+ const utxos = [
35
+ {
36
+ outputID: 7,
37
+ amount: '509999975',
38
+ txid: 'CEbFa3hCDfMFu8ASZP9rT1s3X2X8wqoPAN258kkStk9JX3wsH',
39
+ outputidx: '1111XiaYg',
40
+ addresses: [
41
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
42
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
43
+ 'P-fuji13pyc89t4x5483fgdfgg9lcnpxz7ggr09vn6m6c',
44
+ ],
45
+ threshold: 2,
46
+ },
47
+ ];
48
+ assert_1.default.throws(() => utxoEngine_1.utxoToInput(utxos, sender), (e) => e.message === 'Addresses are inconsistent: CEbFa3hCDfMFu8ASZP9rT1s3X2X8wqoPAN258kkStk9JX3wsH');
49
+ });
50
+ it('should fail with wrong threshold', () => {
51
+ const utxos = [
52
+ {
53
+ outputID: 7,
54
+ amount: '509999975',
55
+ txid: 'CEbFa3hCDfMFu8ASZP9rT1s3X2X8wqoPAN258kkStk9JX3wsH',
56
+ outputidx: '1111XiaYg',
57
+ addresses: [
58
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
59
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
60
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
61
+ ],
62
+ threshold: 3,
63
+ },
64
+ ];
65
+ assert_1.default.throws(() => utxoEngine_1.utxoToInput(utxos, sender), (e) => e.message === 'Threshold is inconsistent');
66
+ });
67
+ });
68
+ describe('2 of 3 signers', () => {
69
+ const utxos = [
70
+ {
71
+ outputID: 7,
72
+ amount: '509999975',
73
+ txid: 'CEbFa3hCDfMFu8ASZP9rT1s3X2X8wqoPAN258kkStk9JX3wsH',
74
+ outputidx: '1111XiaYg',
75
+ addresses: [
76
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
77
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
78
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
79
+ ],
80
+ threshold: 2,
81
+ },
82
+ {
83
+ outputID: 7,
84
+ amount: '26932830273',
85
+ txid: '2VyWNR4q8p7ZnKfaot37SbMBCWHbEbqEca7Af1tiRTArkJMdXt',
86
+ outputidx: '1111XiaYg',
87
+ addresses: [
88
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
89
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
90
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
91
+ ],
92
+ threshold: 2,
93
+ },
94
+ ];
95
+ const sender = [
96
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
97
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
98
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
99
+ ].map((a) => utils_1.default.parseAddress(a));
100
+ const firstSigner = sender[0].toString('hex');
101
+ // second signer is Zeros credential.
102
+ it('should return credential 2 of 3', () => {
103
+ const { inputs } = utxoEngine_1.utxoToInput(utxos, sender);
104
+ inputs.forEach((input, i) => {
105
+ const expectedSignature = input.signatures.map((signature) => signature.toBuffer().toString('hex').substring(90));
106
+ expectedSignature.should.containEql(firstSigner);
107
+ const fistSignatureIdx = input.signaturesIdx[expectedSignature.indexOf(firstSigner)];
108
+ utils_1.default.parseAddress(utxos[i].addresses[fistSignatureIdx]).toString('hex').should.be.equal(firstSigner);
109
+ });
110
+ });
111
+ });
112
+ describe('4 of 4 signers', () => {
113
+ const utxos = [
114
+ {
115
+ outputID: 7,
116
+ amount: '509999975',
117
+ txid: 'CEbFa3hCDfMFu8ASZP9rT1s3X2X8wqoPAN258kkStk9JX3wsH',
118
+ outputidx: '1111XiaYg',
119
+ addresses: [
120
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
121
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
122
+ 'P-fuji13pyc89t4x5483fgdfgg9lcnpxz7ggr09vn6m6c',
123
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
124
+ ],
125
+ threshold: 4,
126
+ },
127
+ {
128
+ outputID: 7,
129
+ amount: '26932830273',
130
+ txid: '2VyWNR4q8p7ZnKfaot37SbMBCWHbEbqEca7Af1tiRTArkJMdXt',
131
+ outputidx: '1111XiaYg',
132
+ addresses: [
133
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
134
+ 'P-fuji13pyc89t4x5483fgdfgg9lcnpxz7ggr09vn6m6c',
135
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
136
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
137
+ ],
138
+ threshold: 4,
139
+ },
140
+ ];
141
+ const sender = [
142
+ 'P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822',
143
+ 'P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4',
144
+ 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59',
145
+ 'P-fuji13pyc89t4x5483fgdfgg9lcnpxz7ggr09vn6m6c',
146
+ ].map((a) => utils_1.default.parseAddress(a));
147
+ const firstSigner = sender[0].toString('hex');
148
+ // second signer is Zeros credential.
149
+ const thirdSigner = sender[2].toString('hex');
150
+ const forthSigner = sender[3].toString('hex');
151
+ it('should return credential', () => {
152
+ const { inputs } = utxoEngine_1.utxoToInput(utxos, sender, 4);
153
+ inputs.forEach((input, i) => {
154
+ const expectedSignature = input.signatures.map((signature) => signature.toBuffer().toString('hex').substring(90));
155
+ expectedSignature.should.containEql(firstSigner);
156
+ const fistSignatureIdx = input.signaturesIdx[expectedSignature.indexOf(firstSigner)];
157
+ utils_1.default.parseAddress(utxos[i].addresses[fistSignatureIdx]).toString('hex').should.be.equal(firstSigner);
158
+ expectedSignature.should.containEql(thirdSigner);
159
+ const thirdSignatureIdx = input.signaturesIdx[expectedSignature.indexOf(thirdSigner)];
160
+ utils_1.default.parseAddress(utxos[i].addresses[thirdSignatureIdx]).toString('hex').should.be.equal(thirdSigner);
161
+ expectedSignature.should.containEql(forthSigner);
162
+ const forthSignatureIdx = input.signaturesIdx[expectedSignature.indexOf(forthSigner)];
163
+ utils_1.default.parseAddress(utxos[i].addresses[forthSignatureIdx]).toString('hex').should.be.equal(forthSigner);
164
+ });
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXR4b0VuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9saWIvdXR4b0VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIsNERBQTBEO0FBRzFELHFFQUE2QztBQUU3QyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQ2pDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sTUFBTSxHQUFpQjtZQUMzQiwrQ0FBK0M7WUFDL0MsK0NBQStDO1lBQy9DLCtDQUErQztTQUNoRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBDLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxHQUFHLEVBQUU7WUFDM0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixJQUFJLEVBQUUsbURBQW1EO2dCQUN6RCxTQUFTLEVBQUUsV0FBVztnQkFDdEIsU0FBUyxFQUFFO29CQUNULCtDQUErQztvQkFDL0MsK0NBQStDO29CQUMvQywrQ0FBK0M7aUJBQ2hEO2dCQUNELFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsd0JBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sS0FBSyxHQUFHO2dCQUNaO29CQUNFLFFBQVEsRUFBRSxDQUFDO29CQUNYLE1BQU0sRUFBRSxXQUFXO29CQUNuQixJQUFJLEVBQUUsbURBQW1EO29CQUN6RCxTQUFTLEVBQUUsV0FBVztvQkFDdEIsU0FBUyxFQUFFO3dCQUNULCtDQUErQzt3QkFDL0MsK0NBQStDO3dCQUMvQywrQ0FBK0M7cUJBQ2hEO29CQUNELFNBQVMsRUFBRSxDQUFDO2lCQUNiO2FBQ0YsQ0FBQztZQUNGLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLHdCQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUNoQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSywrRUFBK0UsQ0FDckcsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtZQUMxQyxNQUFNLEtBQUssR0FBRztnQkFDWjtvQkFDRSxRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUsV0FBVztvQkFDbkIsSUFBSSxFQUFFLG1EQUFtRDtvQkFDekQsU0FBUyxFQUFFLFdBQVc7b0JBQ3RCLFNBQVMsRUFBRTt3QkFDVCwrQ0FBK0M7d0JBQy9DLCtDQUErQzt3QkFDL0MsK0NBQStDO3FCQUNoRDtvQkFDRCxTQUFTLEVBQUUsQ0FBQztpQkFDYjthQUNGLENBQUM7WUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyx3QkFBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFDaEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssMkJBQTJCLENBQ2pELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUM5QixNQUFNLEtBQUssR0FBcUI7WUFDOUI7Z0JBQ0UsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLElBQUksRUFBRSxtREFBbUQ7Z0JBQ3pELFNBQVMsRUFBRSxXQUFXO2dCQUN0QixTQUFTLEVBQUU7b0JBQ1QsK0NBQStDO29CQUMvQywrQ0FBK0M7b0JBQy9DLCtDQUErQztpQkFDaEQ7Z0JBQ0QsU0FBUyxFQUFFLENBQUM7YUFDYjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixJQUFJLEVBQUUsb0RBQW9EO2dCQUMxRCxTQUFTLEVBQUUsV0FBVztnQkFDdEIsU0FBUyxFQUFFO29CQUNULCtDQUErQztvQkFDL0MsK0NBQStDO29CQUMvQywrQ0FBK0M7aUJBQ2hEO2dCQUNELFNBQVMsRUFBRSxDQUFDO2FBQ2I7U0FDRixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQWlCO1lBQzNCLCtDQUErQztZQUMvQywrQ0FBK0M7WUFDL0MsK0NBQStDO1NBQ2hELENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxxQ0FBcUM7UUFDckMsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtZQUN6QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsd0JBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzNELFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUNuRCxDQUFDO2dCQUNGLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDckYsZUFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEcsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUM5QixNQUFNLEtBQUssR0FBcUI7WUFDOUI7Z0JBQ0UsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLElBQUksRUFBRSxtREFBbUQ7Z0JBQ3pELFNBQVMsRUFBRSxXQUFXO2dCQUN0QixTQUFTLEVBQUU7b0JBQ1QsK0NBQStDO29CQUMvQywrQ0FBK0M7b0JBQy9DLCtDQUErQztvQkFDL0MsK0NBQStDO2lCQUNoRDtnQkFDRCxTQUFTLEVBQUUsQ0FBQzthQUNiO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLElBQUksRUFBRSxvREFBb0Q7Z0JBQzFELFNBQVMsRUFBRSxXQUFXO2dCQUN0QixTQUFTLEVBQUU7b0JBQ1QsK0NBQStDO29CQUMvQywrQ0FBK0M7b0JBQy9DLCtDQUErQztvQkFDL0MsK0NBQStDO2lCQUNoRDtnQkFDRCxTQUFTLEVBQUUsQ0FBQzthQUNiO1NBQ0YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFpQjtZQUMzQiwrQ0FBK0M7WUFDL0MsK0NBQStDO1lBQy9DLCtDQUErQztZQUMvQywrQ0FBK0M7U0FDaEQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLHFDQUFxQztRQUNyQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtZQUNsQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsd0JBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUMzRCxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FDbkQsQ0FBQztnQkFDRixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JGLGVBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUV0RyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLGVBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUV2RyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLGVBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pHLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgdXR4b1RvSW5wdXQgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0eG9FbmdpbmUnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCB1dGlscyBmcm9tICcuLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5kZXNjcmliZSgnQXZheFAgVVRYTyBlbmdpbmUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdzaG91bGQgZmFpbCcsICgpID0+IHtcbiAgICBjb25zdCBzZW5kZXI6IEJ1ZmZlckF2YXhbXSA9IFtcbiAgICAgICdQLWZ1amkxMDNjbW50c3NwNnFudWNlamFoZGR5NDJ3Y3k0cXR5MHVqNDI4MjInLFxuICAgICAgJ1AtZnVqaTFoZGs3bnR3MGh1aHFtbGhsaGVtZTl0N3Njc3k5bGhmaHczeXd5NCcsXG4gICAgICAnUC1mdWppMXl6cGZzZGFsaGZ3a3EyY2Vld2dzOXd2N2swdWZ0NDB5ZHB1ajU5JyxcbiAgICBdLm1hcCgoYSkgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGEpKTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IGlucHV0IGZvciB1dHhvcyBvZiB3cm9uZyB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXR4b3MgPSBbMSwgMiwgMywgNF0ubWFwKChuKSA9PiAoe1xuICAgICAgICBvdXRwdXRJRDogbixcbiAgICAgICAgYW1vdW50OiAnNTA5OTk5OTc1JyxcbiAgICAgICAgdHhpZDogJ0NFYkZhM2hDRGZNRnU4QVNaUDlyVDFzM1gyWDh3cW9QQU4yNThra1N0azlKWDN3c0gnLFxuICAgICAgICBvdXRwdXRpZHg6ICcxMTExWGlhWWcnLFxuICAgICAgICBhZGRyZXNzZXM6IFtcbiAgICAgICAgICAnUC1mdWppMWhkazdudHcwaHVocW1saGxoZW1lOXQ3c2NzeTlsaGZodzN5d3k0JyxcbiAgICAgICAgICAnUC1mdWppMXl6cGZzZGFsaGZ3a3EyY2Vld2dzOXd2N2swdWZ0NDB5ZHB1ajU5JyxcbiAgICAgICAgICAnUC1mdWppMTAzY21udHNzcDZxbnVjZWphaGRkeTQyd2N5NHF0eTB1ajQyODIyJyxcbiAgICAgICAgXSxcbiAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgeyBpbnB1dHMgfSA9IHV0eG9Ub0lucHV0KHV0eG9zLCBzZW5kZXIpO1xuICAgICAgaW5wdXRzLnNob3VsZC5iZS5lbXB0eSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggd3JvbmcgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgYW1vdW50OiAnNTA5OTk5OTc1JyxcbiAgICAgICAgICB0eGlkOiAnQ0ViRmEzaENEZk1GdThBU1pQOXJUMXMzWDJYOHdxb1BBTjI1OGtrU3RrOUpYM3dzSCcsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMTExMVhpYVlnJyxcbiAgICAgICAgICBhZGRyZXNzZXM6IFtcbiAgICAgICAgICAgICdQLWZ1amkxaGRrN250dzBodWhxbWxobGhlbWU5dDdzY3N5OWxoZmh3M3l3eTQnLFxuICAgICAgICAgICAgJ1AtZnVqaTF5enBmc2RhbGhmd2txMmNlZXdnczl3djdrMHVmdDQweWRwdWo1OScsXG4gICAgICAgICAgICAnUC1mdWppMTNweWM4OXQ0eDU0ODNmZ2RmZ2c5bGNucHh6N2dncjA5dm42bTZjJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB1dHhvVG9JbnB1dCh1dHhvcywgc2VuZGVyKSxcbiAgICAgICAgKGUpID0+IGUubWVzc2FnZSA9PT0gJ0FkZHJlc3NlcyBhcmUgaW5jb25zaXN0ZW50OiBDRWJGYTNoQ0RmTUZ1OEFTWlA5clQxczNYMlg4d3FvUEFOMjU4a2tTdGs5Slgzd3NIJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIHdyb25nIHRocmVzaG9sZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgYW1vdW50OiAnNTA5OTk5OTc1JyxcbiAgICAgICAgICB0eGlkOiAnQ0ViRmEzaENEZk1GdThBU1pQOXJUMXMzWDJYOHdxb1BBTjI1OGtrU3RrOUpYM3dzSCcsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMTExMVhpYVlnJyxcbiAgICAgICAgICBhZGRyZXNzZXM6IFtcbiAgICAgICAgICAgICdQLWZ1amkxaGRrN250dzBodWhxbWxobGhlbWU5dDdzY3N5OWxoZmh3M3l3eTQnLFxuICAgICAgICAgICAgJ1AtZnVqaTF5enBmc2RhbGhmd2txMmNlZXdnczl3djdrMHVmdDQweWRwdWo1OScsXG4gICAgICAgICAgICAnUC1mdWppMTAzY21udHNzcDZxbnVjZWphaGRkeTQyd2N5NHF0eTB1ajQyODIyJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRocmVzaG9sZDogMyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB1dHhvVG9JbnB1dCh1dHhvcywgc2VuZGVyKSxcbiAgICAgICAgKGUpID0+IGUubWVzc2FnZSA9PT0gJ1RocmVzaG9sZCBpcyBpbmNvbnNpc3RlbnQnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnMiBvZiAzIHNpZ25lcnMnLCAoKSA9PiB7XG4gICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICB7XG4gICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICBhbW91bnQ6ICc1MDk5OTk5NzUnLFxuICAgICAgICB0eGlkOiAnQ0ViRmEzaENEZk1GdThBU1pQOXJUMXMzWDJYOHdxb1BBTjI1OGtrU3RrOUpYM3dzSCcsXG4gICAgICAgIG91dHB1dGlkeDogJzExMTFYaWFZZycsXG4gICAgICAgIGFkZHJlc3NlczogW1xuICAgICAgICAgICdQLWZ1amkxaGRrN250dzBodWhxbWxobGhlbWU5dDdzY3N5OWxoZmh3M3l3eTQnLFxuICAgICAgICAgICdQLWZ1amkxeXpwZnNkYWxoZndrcTJjZWV3Z3M5d3Y3azB1ZnQ0MHlkcHVqNTknLFxuICAgICAgICAgICdQLWZ1amkxMDNjbW50c3NwNnFudWNlamFoZGR5NDJ3Y3k0cXR5MHVqNDI4MjInLFxuICAgICAgICBdLFxuICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgYW1vdW50OiAnMjY5MzI4MzAyNzMnLFxuICAgICAgICB0eGlkOiAnMlZ5V05SNHE4cDdabktmYW90MzdTYk1CQ1dIYkVicUVjYTdBZjF0aVJUQXJrSk1kWHQnLFxuICAgICAgICBvdXRwdXRpZHg6ICcxMTExWGlhWWcnLFxuICAgICAgICBhZGRyZXNzZXM6IFtcbiAgICAgICAgICAnUC1mdWppMXl6cGZzZGFsaGZ3a3EyY2Vld2dzOXd2N2swdWZ0NDB5ZHB1ajU5JyxcbiAgICAgICAgICAnUC1mdWppMTAzY21udHNzcDZxbnVjZWphaGRkeTQyd2N5NHF0eTB1ajQyODIyJyxcbiAgICAgICAgICAnUC1mdWppMWhkazdudHcwaHVocW1saGxoZW1lOXQ3c2NzeTlsaGZodzN5d3k0JyxcbiAgICAgICAgXSxcbiAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IHNlbmRlcjogQnVmZmVyQXZheFtdID0gW1xuICAgICAgJ1AtZnVqaTEwM2NtbnRzc3A2cW51Y2VqYWhkZHk0MndjeTRxdHkwdWo0MjgyMicsXG4gICAgICAnUC1mdWppMWhkazdudHcwaHVocW1saGxoZW1lOXQ3c2NzeTlsaGZodzN5d3k0JyxcbiAgICAgICdQLWZ1amkxeXpwZnNkYWxoZndrcTJjZWV3Z3M5d3Y3azB1ZnQ0MHlkcHVqNTknLFxuICAgIF0ubWFwKChhKSA9PiB1dGlscy5wYXJzZUFkZHJlc3MoYSkpO1xuXG4gICAgY29uc3QgZmlyc3RTaWduZXIgPSBzZW5kZXJbMF0udG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIHNlY29uZCBzaWduZXIgaXMgWmVyb3MgY3JlZGVudGlhbC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjcmVkZW50aWFsIDIgb2YgMycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXRzIH0gPSB1dHhvVG9JbnB1dCh1dHhvcywgc2VuZGVyKTtcbiAgICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBleHBlY3RlZFNpZ25hdHVyZSA9IGlucHV0LnNpZ25hdHVyZXMubWFwKChzaWduYXR1cmUpID0+XG4gICAgICAgICAgc2lnbmF0dXJlLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLnN1YnN0cmluZyg5MClcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0ZWRTaWduYXR1cmUuc2hvdWxkLmNvbnRhaW5FcWwoZmlyc3RTaWduZXIpO1xuICAgICAgICBjb25zdCBmaXN0U2lnbmF0dXJlSWR4ID0gaW5wdXQuc2lnbmF0dXJlc0lkeFtleHBlY3RlZFNpZ25hdHVyZS5pbmRleE9mKGZpcnN0U2lnbmVyKV07XG4gICAgICAgIHV0aWxzLnBhcnNlQWRkcmVzcyh1dHhvc1tpXS5hZGRyZXNzZXNbZmlzdFNpZ25hdHVyZUlkeF0pLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuYmUuZXF1YWwoZmlyc3RTaWduZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCc0IG9mIDQgc2lnbmVycycsICgpID0+IHtcbiAgICBjb25zdCB1dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgIGFtb3VudDogJzUwOTk5OTk3NScsXG4gICAgICAgIHR4aWQ6ICdDRWJGYTNoQ0RmTUZ1OEFTWlA5clQxczNYMlg4d3FvUEFOMjU4a2tTdGs5Slgzd3NIJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMTExMVhpYVlnJyxcbiAgICAgICAgYWRkcmVzc2VzOiBbXG4gICAgICAgICAgJ1AtZnVqaTFoZGs3bnR3MGh1aHFtbGhsaGVtZTl0N3Njc3k5bGhmaHczeXd5NCcsXG4gICAgICAgICAgJ1AtZnVqaTF5enBmc2RhbGhmd2txMmNlZXdnczl3djdrMHVmdDQweWRwdWo1OScsXG4gICAgICAgICAgJ1AtZnVqaTEzcHljODl0NHg1NDgzZmdkZmdnOWxjbnB4ejdnZ3IwOXZuNm02YycsXG4gICAgICAgICAgJ1AtZnVqaTEwM2NtbnRzc3A2cW51Y2VqYWhkZHk0MndjeTRxdHkwdWo0MjgyMicsXG4gICAgICAgIF0sXG4gICAgICAgIHRocmVzaG9sZDogNCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICBhbW91bnQ6ICcyNjkzMjgzMDI3MycsXG4gICAgICAgIHR4aWQ6ICcyVnlXTlI0cThwN1puS2Zhb3QzN1NiTUJDV0hiRWJxRWNhN0FmMXRpUlRBcmtKTWRYdCcsXG4gICAgICAgIG91dHB1dGlkeDogJzExMTFYaWFZZycsXG4gICAgICAgIGFkZHJlc3NlczogW1xuICAgICAgICAgICdQLWZ1amkxeXpwZnNkYWxoZndrcTJjZWV3Z3M5d3Y3azB1ZnQ0MHlkcHVqNTknLFxuICAgICAgICAgICdQLWZ1amkxM3B5Yzg5dDR4NTQ4M2ZnZGZnZzlsY25weHo3Z2dyMDl2bjZtNmMnLFxuICAgICAgICAgICdQLWZ1amkxMDNjbW50c3NwNnFudWNlamFoZGR5NDJ3Y3k0cXR5MHVqNDI4MjInLFxuICAgICAgICAgICdQLWZ1amkxaGRrN250dzBodWhxbWxobGhlbWU5dDdzY3N5OWxoZmh3M3l3eTQnLFxuICAgICAgICBdLFxuICAgICAgICB0aHJlc2hvbGQ6IDQsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3Qgc2VuZGVyOiBCdWZmZXJBdmF4W10gPSBbXG4gICAgICAnUC1mdWppMTAzY21udHNzcDZxbnVjZWphaGRkeTQyd2N5NHF0eTB1ajQyODIyJyxcbiAgICAgICdQLWZ1amkxaGRrN250dzBodWhxbWxobGhlbWU5dDdzY3N5OWxoZmh3M3l3eTQnLFxuICAgICAgJ1AtZnVqaTF5enBmc2RhbGhmd2txMmNlZXdnczl3djdrMHVmdDQweWRwdWo1OScsXG4gICAgICAnUC1mdWppMTNweWM4OXQ0eDU0ODNmZ2RmZ2c5bGNucHh6N2dncjA5dm42bTZjJyxcbiAgICBdLm1hcCgoYSkgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGEpKTtcblxuICAgIGNvbnN0IGZpcnN0U2lnbmVyID0gc2VuZGVyWzBdLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBzZWNvbmQgc2lnbmVyIGlzIFplcm9zIGNyZWRlbnRpYWwuXG4gICAgY29uc3QgdGhpcmRTaWduZXIgPSBzZW5kZXJbMl0udG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGZvcnRoU2lnbmVyID0gc2VuZGVyWzNdLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNyZWRlbnRpYWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0cyB9ID0gdXR4b1RvSW5wdXQodXR4b3MsIHNlbmRlciwgNCk7XG4gICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRTaWduYXR1cmUgPSBpbnB1dC5zaWduYXR1cmVzLm1hcCgoc2lnbmF0dXJlKSA9PlxuICAgICAgICAgIHNpZ25hdHVyZS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKS5zdWJzdHJpbmcoOTApXG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdGVkU2lnbmF0dXJlLnNob3VsZC5jb250YWluRXFsKGZpcnN0U2lnbmVyKTtcbiAgICAgICAgY29uc3QgZmlzdFNpZ25hdHVyZUlkeCA9IGlucHV0LnNpZ25hdHVyZXNJZHhbZXhwZWN0ZWRTaWduYXR1cmUuaW5kZXhPZihmaXJzdFNpZ25lcildO1xuICAgICAgICB1dGlscy5wYXJzZUFkZHJlc3ModXR4b3NbaV0uYWRkcmVzc2VzW2Zpc3RTaWduYXR1cmVJZHhdKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmJlLmVxdWFsKGZpcnN0U2lnbmVyKTtcblxuICAgICAgICBleHBlY3RlZFNpZ25hdHVyZS5zaG91bGQuY29udGFpbkVxbCh0aGlyZFNpZ25lcik7XG4gICAgICAgIGNvbnN0IHRoaXJkU2lnbmF0dXJlSWR4ID0gaW5wdXQuc2lnbmF0dXJlc0lkeFtleHBlY3RlZFNpZ25hdHVyZS5pbmRleE9mKHRoaXJkU2lnbmVyKV07XG4gICAgICAgIHV0aWxzLnBhcnNlQWRkcmVzcyh1dHhvc1tpXS5hZGRyZXNzZXNbdGhpcmRTaWduYXR1cmVJZHhdKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmJlLmVxdWFsKHRoaXJkU2lnbmVyKTtcblxuICAgICAgICBleHBlY3RlZFNpZ25hdHVyZS5zaG91bGQuY29udGFpbkVxbChmb3J0aFNpZ25lcik7XG4gICAgICAgIGNvbnN0IGZvcnRoU2lnbmF0dXJlSWR4ID0gaW5wdXQuc2lnbmF0dXJlc0lkeFtleHBlY3RlZFNpZ25hdHVyZS5pbmRleE9mKGZvcnRoU2lnbmVyKV07XG4gICAgICAgIHV0aWxzLnBhcnNlQWRkcmVzcyh1dHhvc1tpXS5hZGRyZXNzZXNbZm9ydGhTaWduYXR1cmVJZHhdKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmJlLmVxdWFsKGZvcnRoU2lnbmVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=validateTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateTxBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/validateTxBuilder.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,318 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const assert_1 = __importDefault(require("assert"));
26
+ require("should");
27
+ const utils_1 = __importDefault(require("../../../src/lib/utils"));
28
+ const testData = __importStar(require("../../resources/avaxp"));
29
+ const errorMessage = __importStar(require("../../resources/errors"));
30
+ const lib_1 = require("../../../src/lib");
31
+ const statics_1 = require("@bitgo-beta/statics");
32
+ const avalanche_1 = require("avalanche");
33
+ describe('AvaxP Validate Tx Builder', () => {
34
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('avaxp'));
35
+ describe('validate txBuilder fields', () => {
36
+ const txBuilder = factory.getValidatorBuilder();
37
+ it('should fail nodeID tag incorrect', () => {
38
+ assert_1.default.throws(() => {
39
+ txBuilder.validateNodeID(testData.INVALID_NODE_ID_MISSING_NODE_ID);
40
+ }, (e) => e.message === errorMessage.ERROR_NODE_ID);
41
+ });
42
+ it('should fail nodeID length incorrect', () => {
43
+ assert_1.default.throws(() => {
44
+ txBuilder.validateNodeID(testData.INVALID_NODE_ID_LENGTH);
45
+ }, (e) => e.message === errorMessage.ERROR_NODE_ID_LENGTH);
46
+ });
47
+ it('should suucess nodeID length incorrect', () => {
48
+ txBuilder.validateNodeID(testData.NODE_ID_2);
49
+ });
50
+ it('should fail endTime less than 2 weeks', () => {
51
+ assert_1.default.throws(() => {
52
+ txBuilder.validateStakeDuration(testData.START_TIME, testData.START_TIME.add(testData.ONE_WEEK));
53
+ }, (e) => e.message === errorMessage.ERROR_STAKE_DURATION_SHORT_TIME);
54
+ });
55
+ it('should fail endTime greater than 1 year', () => {
56
+ assert_1.default.throws(() => {
57
+ txBuilder.validateStakeDuration(testData.START_TIME, testData.START_TIME.add(testData.TWO_YEAR));
58
+ }, (e) => e.message === errorMessage.ERROR_STAKE_DURATION_LONG_TIME);
59
+ });
60
+ it('should fail startTime too soon', () => {
61
+ assert_1.default.throws(() => {
62
+ txBuilder.validateStakeDuration(new avalanche_1.BN(Date.now()), testData.ONE_WEEK);
63
+ }, (e) => e.message === errorMessage.ERROR_STAKE_START_TIME_TOO_SHORT);
64
+ });
65
+ it('should fail stake amount less than 2000', () => {
66
+ assert_1.default.throws(() => {
67
+ txBuilder.validateStakeAmount(testData.INVALID_STAKE_AMOUNT);
68
+ }, (e) => e.message === errorMessage.ERROR_STAKE_AMOUNT);
69
+ });
70
+ it('should fail delegationFeeRate too low', () => {
71
+ assert_1.default.throws(() => {
72
+ txBuilder.validateDelegationFeeRate(testData.INVALID_DELEGATION_FEE);
73
+ }, (e) => e.message === errorMessage.ERROR_DELEGATION_FEE);
74
+ });
75
+ it('should fail validate Utxos empty string', () => {
76
+ assert_1.default.throws(() => {
77
+ txBuilder.validateUtxos([]);
78
+ }, (e) => e.message === errorMessage.ERROR_UTXOS_EMPTY);
79
+ });
80
+ it('should fail validate Utxos without amount field', () => {
81
+ assert_1.default.throws(() => {
82
+ txBuilder.validateUtxos([{ outputID: '' }]);
83
+ }, (e) => e.message === errorMessage.ERROR_UTXOS_AMOUNT);
84
+ });
85
+ });
86
+ describe('Utils tests', () => {
87
+ it('should fail address is invalid', () => {
88
+ utils_1.default.isValidAddress(testData.INVALID_ADDRESS).should.be.false();
89
+ });
90
+ it('should fail blockId is invalid', () => {
91
+ utils_1.default.isValidBlockId(testData.INVALID_BLOCK_ID).should.be.false();
92
+ });
93
+ it('should fail blockId length is invalid', () => {
94
+ utils_1.default.isValidBlockId(testData.INVALID_BLOCK_ID_LENGTH).should.be.false();
95
+ });
96
+ it('should pass blockId is valid', () => {
97
+ utils_1.default.isValidBlockId(testData.VALID_BLOCK_ID).should.be.true();
98
+ });
99
+ it('should pass address is valid', () => {
100
+ utils_1.default.isValidAddress(testData.VALID_ADDRESS).should.be.true();
101
+ });
102
+ });
103
+ describe('should build ', () => {
104
+ it('Should create AddValidator tx for same values', async () => {
105
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
106
+ .getValidatorBuilder()
107
+ .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
108
+ .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
109
+ .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
110
+ .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
111
+ .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
112
+ .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
113
+ .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
114
+ .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
115
+ .memo(testData.ADDVALIDATOR_SAMPLES.memo)
116
+ .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
117
+ const tx = await txBuilder.build();
118
+ const rawTx = tx.toBroadcastFormat();
119
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
120
+ });
121
+ it('Should create AddValidator tx when change amount is 0', async () => {
122
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
123
+ .getValidatorBuilder()
124
+ .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
125
+ .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
126
+ .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
127
+ .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
128
+ .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
129
+ .stakeAmount('24938830298') // stake amount is total amount in outputs
130
+ .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
131
+ .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
132
+ .memo(testData.ADDVALIDATOR_SAMPLES.memo)
133
+ .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
134
+ await txBuilder.build().should.not.throw();
135
+ });
136
+ it('Should recover AddValidator tx from raw tx', async () => {
137
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
138
+ const tx = await txBuilder.build();
139
+ const rawTx = tx.toBroadcastFormat();
140
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
141
+ });
142
+ it('Should create half signed AddValidator tx for same values', async () => {
143
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
144
+ .getValidatorBuilder()
145
+ .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
146
+ .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
147
+ .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
148
+ .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
149
+ .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
150
+ .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
151
+ .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
152
+ .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
153
+ .memo(testData.ADDVALIDATOR_SAMPLES.memo)
154
+ .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
155
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
156
+ const tx = await txBuilder.build();
157
+ const rawTx = tx.toBroadcastFormat();
158
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
159
+ });
160
+ it('Should recover half signed AddValidator from raw tx', async () => {
161
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
162
+ const tx = await txBuilder.build();
163
+ const rawTx = tx.toBroadcastFormat();
164
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
165
+ });
166
+ it('Should half sign a AddValidator tx from unsigned raw tx', async () => {
167
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
168
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
169
+ const tx = await txBuilder.build();
170
+ const rawTx = tx.toBroadcastFormat();
171
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
172
+ });
173
+ it('Should recover half signed AddValidator from half signed raw tx', async () => {
174
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
175
+ const tx = await txBuilder.build();
176
+ const rawTx = tx.toBroadcastFormat();
177
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
178
+ });
179
+ it('Should recover signed AddValidator from signed raw tx', async () => {
180
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
181
+ const tx = await txBuilder.build();
182
+ const rawTx = tx.toBroadcastFormat();
183
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
184
+ });
185
+ it('Should full sign a AddValidator tx for same values', async () => {
186
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
187
+ .getValidatorBuilder()
188
+ .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
189
+ .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
190
+ .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
191
+ .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
192
+ .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
193
+ .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
194
+ .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
195
+ .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
196
+ .memo(testData.ADDVALIDATOR_SAMPLES.memo)
197
+ .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
198
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
199
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
200
+ const tx = await txBuilder.build();
201
+ const rawTx = tx.toBroadcastFormat();
202
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
203
+ });
204
+ it('Should full sign a AddValidator tx from half signed raw tx', async () => {
205
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
206
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
207
+ const tx = await txBuilder.build();
208
+ const rawTx = tx.toBroadcastFormat();
209
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
210
+ });
211
+ it('Should full sign a AddValidator tx from unsigned raw tx', async () => {
212
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
213
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
214
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
215
+ const tx = await txBuilder.build();
216
+ const rawTx = tx.toBroadcastFormat();
217
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
218
+ });
219
+ it('Should full sign a AddValidator tx with recovery key for same values', async () => {
220
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
221
+ .getValidatorBuilder()
222
+ .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
223
+ .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
224
+ .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
225
+ .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
226
+ .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
227
+ .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
228
+ .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
229
+ .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
230
+ .memo(testData.ADDVALIDATOR_SAMPLES.memo)
231
+ .utxos(testData.ADDVALIDATOR_SAMPLES.outputs)
232
+ .recoverMode();
233
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv3 });
234
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
235
+ const tx = await txBuilder.build();
236
+ const rawTx = tx.toBroadcastFormat();
237
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryFullsigntxHex);
238
+ });
239
+ it('Should recover half sign a AddValidator tx with recovery key from half signed raw tx', async () => {
240
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
241
+ const tx = await txBuilder.build();
242
+ const rawTx = tx.toBroadcastFormat();
243
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
244
+ });
245
+ it('Should full sign a AddValidator tx with recovery key from half signed raw tx', async () => {
246
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
247
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
248
+ const tx = await txBuilder.build();
249
+ const rawTx = tx.toBroadcastFormat();
250
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryFullsigntxHex);
251
+ });
252
+ it('Should full sign a AddValidator tx with recovery key from unsigned raw tx', async () => {
253
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryUnsignedTxHex);
254
+ // txBuilder.recoverMode()
255
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv3 });
256
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
257
+ const tx = await txBuilder.build();
258
+ const rawTx = tx.toBroadcastFormat();
259
+ rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryFullsigntxHex);
260
+ });
261
+ xit('Compare size and location of signatures in credentials for halfsign', async () => {
262
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
263
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
264
+ // look into credentials make sure that index 0 is signed with user key
265
+ });
266
+ xit('Compare size and location of signatures in credentials for full sign', async () => {
267
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
268
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
269
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
270
+ // look into credentials make sure that index 0 and 2 is signed
271
+ });
272
+ });
273
+ describe('Key cannot sign the transaction ', () => {
274
+ it('Should full sign a AddValidator tx from unsigned raw tx', () => {
275
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
276
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
277
+ txBuilder
278
+ .build()
279
+ .then((ok) => assert_1.default.fail('it can sign'))
280
+ .catch((err) => {
281
+ err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
282
+ });
283
+ });
284
+ it('Should 2 full sign a AddValidator tx from unsigned raw tx', () => {
285
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryUnsignedTxHex);
286
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
287
+ txBuilder
288
+ .build()
289
+ .then((ok) => assert_1.default.fail('it can sign'))
290
+ .catch((err) => {
291
+ err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
292
+ });
293
+ });
294
+ // HSM expected empty credential, we cannot verify if the next signature is the correct.
295
+ xit('Should full sign a AddValidator tx from unsigned raw tx', () => {
296
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
297
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
298
+ txBuilder
299
+ .build()
300
+ .then((ok) => assert_1.default.fail('it can sign'))
301
+ .catch((err) => {
302
+ err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
303
+ });
304
+ });
305
+ // HSM expected empty credential, we cannot verify if the next signature is the correct.
306
+ xit('Should full sign a AddValidator tx from unsigned raw tx', () => {
307
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
308
+ txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
309
+ txBuilder
310
+ .build()
311
+ .then((ok) => assert_1.default.fail('it can sign'))
312
+ .catch((err) => {
313
+ err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
314
+ });
315
+ });
316
+ });
317
+ });
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3ZhbGlkYXRlVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIsbUVBQTJDO0FBQzNDLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLGlEQUE0QztBQUM1Qyx5Q0FBK0I7QUFFL0IsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVsRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2hELEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDckUsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxhQUFhLENBQ2hELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUU7WUFDN0MsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDNUQsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVks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QyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2F2YXhwJztcbmltcG9ydCAqIGFzIGVycm9yTWVzc2FnZSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZXJyb3JzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdhdmFsYW5jaGUnO1xuXG5kZXNjcmliZSgnQXZheFAgVmFsaWRhdGUgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgnYXZheHAnKSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRWYWxpZGF0b3JCdWlsZGVyKCk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIG5vZGVJRCB0YWcgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZU5vZGVJRCh0ZXN0RGF0YS5JTlZBTElEX05PREVfSURfTUlTU0lOR19OT0RFX0lEKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX05PREVfSURcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIG5vZGVJRCBsZW5ndGggaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZU5vZGVJRCh0ZXN0RGF0YS5JTlZBTElEX05PREVfSURfTEVOR1RIKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX05PREVfSURfTEVOR1RIXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgc3V1Y2VzcyBub2RlSUQgbGVuZ3RoIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgIHR4QnVpbGRlci52YWxpZGF0ZU5vZGVJRCh0ZXN0RGF0YS5OT0RFX0lEXzIpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCBlbmRUaW1lIGxlc3MgdGhhbiAyIHdlZWtzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVN0YWtlRHVyYXRpb24odGVzdERhdGEuU1RBUlRfVElNRSwgdGVzdERhdGEuU1RBUlRfVElNRS5hZGQodGVzdERhdGEuT05FX1dFRUspKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1NUQUtFX0RVUkFUSU9OX1NIT1JUX1RJTUVcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGVuZFRpbWUgZ3JlYXRlciB0aGFuIDEgeWVhcicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHRlc3REYXRhLlNUQVJUX1RJTUUsIHRlc3REYXRhLlNUQVJUX1RJTUUuYWRkKHRlc3REYXRhLlRXT19ZRUFSKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9TVEFLRV9EVVJBVElPTl9MT05HX1RJTUVcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHN0YXJ0VGltZSB0b28gc29vbicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKG5ldyBCTihEYXRlLm5vdygpKSwgdGVzdERhdGEuT05FX1dFRUspO1xuICAgICAgICB9LFxuICAgICAgICAoZSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfU1RBS0VfU1RBUlRfVElNRV9UT09fU0hPUlRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHN0YWtlIGFtb3VudCBsZXNzIHRoYW4gMjAwMCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVTdGFrZUFtb3VudCh0ZXN0RGF0YS5JTlZBTElEX1NUQUtFX0FNT1VOVCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9TVEFLRV9BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGRlbGVnYXRpb25GZWVSYXRlIHRvbyBsb3cnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlRGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuSU5WQUxJRF9ERUxFR0FUSU9OX0ZFRSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9ERUxFR0FUSU9OX0ZFRVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfVVRYT1NfRU1QVFlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3Mgd2l0aG91dCBhbW91bnQgZmllbGQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW3sgb3V0cHV0SUQ6ICcnIH0gYXMgYW55IGFzIERlY29kZWRVdHhvT2JqXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9VVFhPU19BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdVdGlscyB0ZXN0cycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYWRkcmVzcyBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgdXRpbHMuaXNWYWxpZEFkZHJlc3ModGVzdERhdGEuSU5WQUxJRF9BRERSRVNTKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYmxvY2tJZCBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgdXRpbHMuaXNWYWxpZEJsb2NrSWQodGVzdERhdGEuSU5WQUxJRF9CTE9DS19JRCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJsb2NrSWQgbGVuZ3RoIGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICB1dGlscy5pc1ZhbGlkQmxvY2tJZCh0ZXN0RGF0YS5JTlZBTElEX0JMT0NLX0lEX0xFTkdUSCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIGJsb2NrSWQgaXMgdmFsaWQnLCAoKSA9PiB7XG4gICAgICB1dGlscy5pc1ZhbGlkQmxvY2tJZCh0ZXN0RGF0YS5WQUxJRF9CTE9DS19JRCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHBhc3MgYWRkcmVzcyBpcyB2YWxpZCcsICgpID0+IHtcbiAgICAgIHV0aWxzLmlzVmFsaWRBZGRyZXNzKHRlc3REYXRhLlZBTElEX0FERFJFU1MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgIGl0KCdTaG91bGQgY3JlYXRlIEFkZFZhbGlkYXRvciB0eCBmb3Igc2FtZSB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0VmFsaWRhdG9yQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnBBZGRyZXNzZXMpXG4gICAgICAgIC5zdGFydFRpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuc3RhcnRUaW1lKVxuICAgICAgICAuZW5kVGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5lbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubWluVmFsaWRhdG9yU3Rha2UpXG4gICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5kZWxlZ2F0aW9uRmVlKVxuICAgICAgICAubm9kZUlEKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm5vZGVJRClcbiAgICAgICAgLm1lbW8odGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubWVtbylcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm91dHB1dHMpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBjcmVhdGUgQWRkVmFsaWRhdG9yIHR4IHdoZW4gY2hhbmdlIGFtb3VudCBpcyAwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldFZhbGlkYXRvckJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZW5kVGltZSlcbiAgICAgICAgLnN0YWtlQW1vdW50KCcyNDkzODgzMDI5OCcpIC8vIHN0YWtlIGFtb3VudCBpcyB0b3RhbCBhbW91bnQgaW4gb3V0cHV0c1xuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZGVsZWdhdGlvbkZlZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpXG4gICAgICAgIC5tZW1vKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1lbW8pXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5vdXRwdXRzKTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCByZWNvdmVyIEFkZFZhbGlkYXRvciB0eCBmcm9tIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBjcmVhdGUgaGFsZiBzaWduZWQgQWRkVmFsaWRhdG9yIHR4IGZvciBzYW1lIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRWYWxpZGF0b3JCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucEFkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5zdGFydFRpbWUpXG4gICAgICAgIC5lbmRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSlcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmRlbGVnYXRpb25GZWUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKVxuICAgICAgICAubWVtbyh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5tZW1vKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMub3V0cHV0cyk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCByZWNvdmVyIGhhbGYgc2lnbmVkIEFkZFZhbGlkYXRvciBmcm9tIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBoYWxmIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlY292ZXIgaGFsZiBzaWduZWQgQWRkVmFsaWRhdG9yIGZyb20gaGFsZiBzaWduZWQgcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlY292ZXIgc2lnbmVkIEFkZFZhbGlkYXRvciBmcm9tIHNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4XG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgQWRkVmFsaWRhdG9yIHR4IGZvciBzYW1lIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRWYWxpZGF0b3JCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucEFkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5zdGFydFRpbWUpXG4gICAgICAgIC5lbmRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSlcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmRlbGVnYXRpb25GZWUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKVxuICAgICAgICAubWVtbyh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5tZW1vKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMub3V0cHV0cyk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYyIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgQWRkVmFsaWRhdG9yIHR4IGZyb20gaGFsZiBzaWduZWQgcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmZ1bGxzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmZ1bGxzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggd2l0aCByZWNvdmVyeSBrZXkgZm9yIHNhbWUgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldFZhbGlkYXRvckJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZW5kVGltZSlcbiAgICAgICAgLnN0YWtlQW1vdW50KHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZGVsZWdhdGlvbkZlZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpXG4gICAgICAgIC5tZW1vKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1lbW8pXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKTtcblxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5RnVsbHNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlY292ZXIgaGFsZiBzaWduIGEgQWRkVmFsaWRhdG9yIHR4IHdpdGggcmVjb3Zlcnkga2V5IGZyb20gaGFsZiBzaWduZWQgcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucmVjb3ZlcnlIYWxmc2lnbnR4SGV4XG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5yZWNvdmVyeUhhbGZzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggd2l0aCByZWNvdmVyeSBrZXkgZnJvbSBoYWxmIHNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5yZWNvdmVyeUhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYyIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5yZWNvdmVyeUZ1bGxzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggd2l0aCByZWNvdmVyeSBrZXkgZnJvbSB1bnNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5yZWNvdmVyeVVuc2lnbmVkVHhIZXhcbiAgICAgICk7XG4gICAgICAvLyB0eEJ1aWxkZXIucmVjb3Zlck1vZGUoKVxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5RnVsbHNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICB4aXQoJ0NvbXBhcmUgc2l6ZSBhbmQgbG9jYXRpb24gb2Ygc2lnbmF0dXJlcyBpbiBjcmVkZW50aWFscyBmb3IgaGFsZnNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIC8vIGxvb2sgaW50byBjcmVkZW50aWFscyBtYWtlIHN1cmUgdGhhdCBpbmRleCAwIGlzIHNpZ25lZCB3aXRoIHVzZXIga2V5XG4gICAgfSk7XG4gICAgeGl0KCdDb21wYXJlIHNpemUgYW5kIGxvY2F0aW9uIG9mIHNpZ25hdHVyZXMgaW4gY3JlZGVudGlhbHMgZm9yIGZ1bGwgc2lnbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXhcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYxIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIC8vIGxvb2sgaW50byBjcmVkZW50aWFscyBtYWtlIHN1cmUgdGhhdCBpbmRleCAwIGFuZCAyIGlzIHNpZ25lZFxuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ0tleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24gJywgKCkgPT4ge1xuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgQWRkVmFsaWRhdG9yIHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMudW5zaWduZWRUeEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKG9rKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCAyIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5VW5zaWduZWRUeEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKG9rKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gSFNNIGV4cGVjdGVkIGVtcHR5IGNyZWRlbnRpYWwsIHdlIGNhbm5vdCB2ZXJpZnkgaWYgdGhlIG5leHQgc2lnbmF0dXJlIGlzIHRoZSBjb3JyZWN0LlxuICAgIHhpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYyIH0pO1xuXG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKG9rKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gSFNNIGV4cGVjdGVkIGVtcHR5IGNyZWRlbnRpYWwsIHdlIGNhbm5vdCB2ZXJpZnkgaWYgdGhlIG5leHQgc2lnbmF0dXJlIGlzIHRoZSBjb3JyZWN0LlxuICAgIHhpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5SGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKG9rKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19