@bitgo-beta/sdk-api 1.10.1-beta.184 → 1.10.1-beta.1841

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 (79) hide show
  1. package/dist/package.json +20 -27
  2. package/dist/src/api.d.ts +8 -5
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +130 -71
  5. package/dist/src/bitgoAPI.d.ts +133 -16
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +796 -306
  8. package/dist/src/encrypt.d.ts +23 -4
  9. package/dist/src/encrypt.d.ts.map +1 -1
  10. package/dist/src/encrypt.js +86 -13
  11. package/dist/src/encryptV2.d.ts +68 -0
  12. package/dist/src/encryptV2.d.ts.map +1 -0
  13. package/dist/src/encryptV2.js +202 -0
  14. package/dist/src/encryptionSession.d.ts +34 -0
  15. package/dist/src/encryptionSession.d.ts.map +1 -0
  16. package/dist/src/encryptionSession.js +95 -0
  17. package/dist/src/index.d.ts +2 -0
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/index.js +8 -2
  20. package/dist/src/types.d.ts +64 -44
  21. package/dist/src/types.d.ts.map +1 -1
  22. package/dist/src/types.js +4 -2
  23. package/dist/src/util.d.ts +12 -0
  24. package/dist/src/util.d.ts.map +1 -1
  25. package/dist/src/util.js +57 -4
  26. package/dist/src/v1/blockchain.js +25 -12
  27. package/dist/src/v1/keychains.js +39 -26
  28. package/dist/src/v1/markets.js +10 -5
  29. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  30. package/dist/src/v1/pendingapproval.js +57 -18
  31. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  32. package/dist/src/v1/pendingapprovals.js +41 -7
  33. package/dist/src/v1/signPsbt.d.ts +14 -0
  34. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  35. package/dist/src/v1/signPsbt.js +69 -0
  36. package/dist/src/v1/transactionBuilder.js +221 -91
  37. package/dist/src/v1/travelRule.js +163 -66
  38. package/dist/src/v1/verifyAddress.d.ts +6 -0
  39. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  40. package/dist/src/v1/verifyAddress.js +50 -0
  41. package/dist/src/v1/wallet.d.ts.map +1 -1
  42. package/dist/src/v1/wallet.js +501 -230
  43. package/dist/src/v1/wallets.js +118 -53
  44. package/dist/test/unit/api.d.ts +2 -0
  45. package/dist/test/unit/api.d.ts.map +1 -0
  46. package/dist/test/unit/api.js +307 -0
  47. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  48. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  49. package/dist/test/unit/bitgoAPI.js +1027 -0
  50. package/dist/test/unit/encrypt.d.ts +2 -0
  51. package/dist/test/unit/encrypt.d.ts.map +1 -0
  52. package/dist/test/unit/encrypt.js +415 -0
  53. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  54. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  55. package/dist/test/unit/hmacStrategy.js +136 -0
  56. package/dist/test/unit/utils.d.ts +2 -0
  57. package/dist/test/unit/utils.d.ts.map +1 -0
  58. package/dist/test/unit/utils.js +65 -0
  59. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  60. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  61. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  62. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  63. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  64. package/dist/test/unit/v1/fixtures/index.js +24 -0
  65. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  66. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  67. package/dist/test/unit/v1/signPsbt.js +53 -0
  68. package/dist/test/unit/v1/travelRule.d.ts +2 -0
  69. package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
  70. package/dist/test/unit/v1/travelRule.js +173 -0
  71. package/dist/test/unit/v1/wallet.d.ts +2 -0
  72. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  73. package/dist/test/unit/v1/wallet.js +1658 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -0
  75. package/package.json +20 -27
  76. package/.eslintignore +0 -5
  77. package/CHANGELOG.md +0 -555
  78. package/dist/web/main.js +0 -2
  79. package/dist/web/main.js.LICENSE.txt +0 -110
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const src_1 = require("../../src");
38
+ describe('bitgo:api unit tests', function () {
39
+ describe('serializeRequestData', function () {
40
+ it('should return string data as-is for v4 raw body support', function () {
41
+ const stringBody = '{"address": "tb1qtest", "amount":100000}';
42
+ const mockReq = {
43
+ _data: stringBody,
44
+ get: () => 'application/json',
45
+ };
46
+ const result = (0, src_1.serializeRequestData)(mockReq);
47
+ assert.strictEqual(result, stringBody);
48
+ // Verify _data was not modified
49
+ assert.strictEqual(mockReq._data, stringBody);
50
+ });
51
+ it('should return empty string as-is', function () {
52
+ const mockReq = {
53
+ _data: '',
54
+ get: () => 'application/json',
55
+ };
56
+ const result = (0, src_1.serializeRequestData)(mockReq);
57
+ assert.strictEqual(result, '');
58
+ });
59
+ it('should convert Buffer to UTF-8 string and mutate _data', function () {
60
+ const jsonString = '{"address":"tb1qtest","amount":100000}';
61
+ const bufferBody = Buffer.from(jsonString, 'utf8');
62
+ const mockReq = {
63
+ _data: bufferBody,
64
+ get: () => 'application/json',
65
+ };
66
+ const result = (0, src_1.serializeRequestData)(mockReq);
67
+ assert.strictEqual(typeof result, 'string');
68
+ assert.strictEqual(result, jsonString);
69
+ // Verify _data WAS mutated to string - critical for superagent to send correct bytes
70
+ assert.strictEqual(typeof mockReq._data, 'string');
71
+ assert.strictEqual(mockReq._data, jsonString);
72
+ });
73
+ it('should convert empty Buffer to empty string and mutate _data', function () {
74
+ const mockReq = {
75
+ _data: Buffer.from(''),
76
+ get: () => 'application/json',
77
+ };
78
+ const result = (0, src_1.serializeRequestData)(mockReq);
79
+ assert.strictEqual(typeof result, 'string');
80
+ assert.strictEqual(result, '');
81
+ // Verify _data WAS mutated to string
82
+ assert.strictEqual(typeof mockReq._data, 'string');
83
+ assert.strictEqual(mockReq._data, '');
84
+ });
85
+ it('should produce identical results on retry for HMAC consistency', function () {
86
+ const jsonString = '{"address":"tb1qtest","amount":100000}';
87
+ const bufferBody = Buffer.from(jsonString, 'utf8');
88
+ const mockReq = {
89
+ _data: bufferBody,
90
+ get: () => 'application/json',
91
+ };
92
+ // First call (original request) - converts Buffer to string, mutates _data
93
+ const result1 = (0, src_1.serializeRequestData)(mockReq);
94
+ assert.strictEqual(result1, jsonString);
95
+ assert.strictEqual(typeof mockReq._data, 'string');
96
+ // Second call (simulating retry) - _data is now a string, returns as-is
97
+ const result2 = (0, src_1.serializeRequestData)(mockReq);
98
+ // Both calls should return identical strings for consistent HMAC
99
+ assert.strictEqual(result1, result2);
100
+ assert.strictEqual(result2, jsonString);
101
+ // _data should now be a string (mutated on first call)
102
+ assert.strictEqual(typeof mockReq._data, 'string');
103
+ assert.strictEqual(mockReq._data, jsonString);
104
+ });
105
+ it('should mutate Buffer to prevent superagent JSON serialization', function () {
106
+ // This test verifies the critical behavior: if we don't mutate _data from Buffer to string,
107
+ // superagent will serialize the Buffer as {"type":"Buffer","data":[...]}, which won't match
108
+ // the HMAC calculated on the UTF-8 string. By mutating _data, we ensure superagent sends
109
+ // the exact bytes we used for HMAC calculation.
110
+ const jsonString = '{"address":"tb1qtest","amount":100000}';
111
+ const bufferBody = Buffer.from(jsonString, 'utf8');
112
+ const mockReq = {
113
+ _data: bufferBody,
114
+ get: () => 'application/json',
115
+ };
116
+ (0, src_1.serializeRequestData)(mockReq);
117
+ // After serialization, _data MUST be a string, not a Buffer
118
+ assert.strictEqual(typeof mockReq._data, 'string');
119
+ assert.strictEqual(mockReq._data, jsonString);
120
+ // This ensures when superagent sends the request, it sends the UTF-8 string,
121
+ // not the JSON-serialized Buffer representation.
122
+ });
123
+ it('should serialize object data to JSON', function () {
124
+ const objectBody = { address: 'tb1qtest', amount: 100000 };
125
+ const mockReq = {
126
+ _data: objectBody,
127
+ get: () => 'application/json',
128
+ };
129
+ const result = (0, src_1.serializeRequestData)(mockReq);
130
+ assert.strictEqual(result, JSON.stringify(objectBody));
131
+ // Verify _data was updated to serialized form
132
+ assert.strictEqual(mockReq._data, JSON.stringify(objectBody));
133
+ });
134
+ it('should handle nested objects', function () {
135
+ const nestedBody = { level1: { level2: { value: 'deep' } } };
136
+ const mockReq = {
137
+ _data: nestedBody,
138
+ get: () => 'application/json',
139
+ };
140
+ const result = (0, src_1.serializeRequestData)(mockReq);
141
+ assert.strictEqual(result, JSON.stringify(nestedBody));
142
+ });
143
+ it('should return undefined for undefined data', function () {
144
+ const mockReq = {
145
+ _data: undefined,
146
+ get: () => 'application/json',
147
+ };
148
+ const result = (0, src_1.serializeRequestData)(mockReq);
149
+ assert.strictEqual(result, undefined);
150
+ });
151
+ it('should return undefined for null data', function () {
152
+ const mockReq = {
153
+ _data: null,
154
+ get: () => 'application/json',
155
+ };
156
+ const result = (0, src_1.serializeRequestData)(mockReq);
157
+ assert.strictEqual(result, undefined);
158
+ });
159
+ it('should handle Content-Type with charset', function () {
160
+ const objectBody = { test: 'value' };
161
+ const mockReq = {
162
+ _data: objectBody,
163
+ get: () => 'application/json; charset=utf-8',
164
+ };
165
+ const result = (0, src_1.serializeRequestData)(mockReq);
166
+ assert.strictEqual(result, JSON.stringify(objectBody));
167
+ });
168
+ it('should handle application/vnd.api+json content type', function () {
169
+ const objectBody = { data: 'test' };
170
+ const mockReq = {
171
+ _data: objectBody,
172
+ get: () => 'application/vnd.api+json',
173
+ };
174
+ const result = (0, src_1.serializeRequestData)(mockReq);
175
+ assert.strictEqual(result, JSON.stringify(objectBody));
176
+ });
177
+ it('should return undefined for unsupported content type without serializer', function () {
178
+ const objectBody = { test: 'value' };
179
+ const mockReq = {
180
+ _data: objectBody,
181
+ get: () => 'text/plain',
182
+ };
183
+ const result = (0, src_1.serializeRequestData)(mockReq);
184
+ // text/plain doesn't have a JSON serializer, so returns undefined
185
+ assert.strictEqual(result, undefined);
186
+ });
187
+ });
188
+ describe('handleResponseResult', function () {
189
+ it('should return text for text-based responses', function () {
190
+ const csvText = `transactionId,date,amount,currency,status
191
+ 12345,2025-01-15,100.00,USD,completed
192
+ 67890,2025-01-22,50.50,EUR,completed
193
+ 13579,2025-02-10,200.00,USD,pending
194
+ 24680,2025-02-28,75.25,BTC,completed`;
195
+ const response = {
196
+ status: 200,
197
+ header: { 'content-type': 'text/csv' },
198
+ text: csvText,
199
+ };
200
+ const result = (0, src_1.handleResponseResult)()(response);
201
+ assert.strictEqual(result, response.text);
202
+ });
203
+ it('should parse JSON response and return the entire body if no field is specified', function () {
204
+ const response = {
205
+ status: 200,
206
+ header: { 'content-type': 'application/json' },
207
+ body: { foo: 'bar', baz: 123 },
208
+ };
209
+ const result = (0, src_1.handleResponseResult)()(response);
210
+ assert.deepStrictEqual(result, response.body);
211
+ });
212
+ it('should parse JSON response and return the specified field if provided', function () {
213
+ const response = {
214
+ status: 200,
215
+ header: { 'content-type': 'application/json' },
216
+ body: { foo: 'bar', baz: 123 },
217
+ };
218
+ const result = (0, src_1.handleResponseResult)('foo')(response);
219
+ assert.strictEqual(result, 'bar');
220
+ });
221
+ it('should return the entire response for non-JSON and non-text responses', function () {
222
+ const response = {
223
+ status: 200,
224
+ header: { 'content-type': 'image/png' },
225
+ blob: 'abcdefghijk',
226
+ };
227
+ const result = (0, src_1.handleResponseResult)()(response);
228
+ assert.strictEqual(result, response);
229
+ });
230
+ it('should return the full body if this field exists', function () {
231
+ const response = {
232
+ status: 200,
233
+ header: { 'content-type': 'application/octet-stream' },
234
+ body: { irrelevant: true },
235
+ };
236
+ const result = (0, src_1.handleResponseResult)()(response);
237
+ assert.strictEqual(result, response.body);
238
+ });
239
+ });
240
+ describe('handleResponseError', function () {
241
+ it('should re-throw an error without response property', function () {
242
+ const originalError = new Error('Han shot first');
243
+ assert.throws(() => (0, src_1.handleResponseError)(originalError), { name: 'Error', message: 'Han shot first' });
244
+ });
245
+ it('should use the status code if the response has no error text', function () {
246
+ const originalError = new Error();
247
+ originalError.response = { status: 400 };
248
+ assert.throws(() => (0, src_1.handleResponseError)(originalError), {
249
+ name: 'ApiResponseError',
250
+ message: '400',
251
+ invalidToken: false,
252
+ needsOTP: false,
253
+ result: undefined,
254
+ status: 400,
255
+ });
256
+ });
257
+ it('should use the response body.error text', function () {
258
+ const originalError = new Error();
259
+ originalError.response = { status: 400, body: { error: 'Han shot first' } };
260
+ assert.throws(() => (0, src_1.handleResponseError)(originalError), {
261
+ name: 'ApiResponseError',
262
+ message: 'Han shot first',
263
+ invalidToken: false,
264
+ needsOTP: false,
265
+ result: originalError.response.body,
266
+ status: 400,
267
+ });
268
+ });
269
+ it('should parse HTML code from the response text', function () {
270
+ const originalError = new Error();
271
+ originalError.response = { status: 400, text: ' <b> Han shot first </b>' };
272
+ assert.throws(() => (0, src_1.handleResponseError)(originalError), {
273
+ name: 'ApiResponseError',
274
+ message: '400\nHan shot first',
275
+ invalidToken: false,
276
+ needsOTP: false,
277
+ result: undefined,
278
+ status: 400,
279
+ });
280
+ });
281
+ it('should annotate invalidToken property', function () {
282
+ const originalError = new Error();
283
+ originalError.response = { status: 400, header: { 'x-auth-required': 'true' } };
284
+ assert.throws(() => (0, src_1.handleResponseError)(originalError), {
285
+ name: 'ApiResponseError',
286
+ message: '400',
287
+ invalidToken: true,
288
+ needsOTP: false,
289
+ result: undefined,
290
+ status: 400,
291
+ });
292
+ });
293
+ it('should annotate needsOTP property', function () {
294
+ const originalError = new Error();
295
+ originalError.response = { status: 400, body: { needsOTP: true } };
296
+ assert.throws(() => (0, src_1.handleResponseError)(originalError), {
297
+ name: 'ApiResponseError',
298
+ message: '400',
299
+ invalidToken: false,
300
+ needsOTP: true,
301
+ result: originalError.response.body,
302
+ status: 400,
303
+ });
304
+ });
305
+ });
306
+ });
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBNEY7QUFFNUYsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUMvQixFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsTUFBTSxVQUFVLEdBQUcsNkNBQTZDLENBQUM7WUFDakUsTUFBTSxPQUFPLEdBQVE7Z0JBQ25CLEtBQUssRUFBRSxVQUFVO2dCQUNqQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCO2FBQzlCLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFvQixFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLGdDQUFnQztZQUNoQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQVE7Z0JBQ25CLEtBQUssRUFBRSxFQUFFO2dCQUNULEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0I7YUFDOUIsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsMEJBQW9CLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxVQUFVLEdBQUcsd0NBQXdDLENBQUM7WUFDNUQsTUFBTSxVQUFVLEdBQUcs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QUksRUFBRSxrQkFBa0I7Z0JBQ3hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFlBQVksRUFBRSxLQUFLO2dCQUNuQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxNQUFNLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQyxNQUFNLEVBQUUsR0FBRzthQUNaLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgaGFuZGxlUmVzcG9uc2VFcnJvciwgaGFuZGxlUmVzcG9uc2VSZXN1bHQsIHNlcmlhbGl6ZVJlcXVlc3REYXRhIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ2JpdGdvOmFwaSB1bml0IHRlc3RzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnc2VyaWFsaXplUmVxdWVzdERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc3RyaW5nIGRhdGEgYXMtaXMgZm9yIHY0IHJhdyBib2R5IHN1cHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHJpbmdCb2R5ID0gJ3tcImFkZHJlc3NcIjogIFwidGIxcXRlc3RcIiwgICBcImFtb3VudFwiOjEwMDAwMH0nO1xuICAgICAgY29uc3QgbW9ja1JlcTogYW55ID0ge1xuICAgICAgICBfZGF0YTogc3RyaW5nQm9keSxcbiAgICAgICAgZ2V0OiAoKSA9PiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShtb2NrUmVxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHN0cmluZ0JvZHkpO1xuICAgICAgLy8gVmVyaWZ5IF9kYXRhIHdhcyBub3QgbW9kaWZpZWRcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrUmVxLl9kYXRhLCBzdHJpbmdCb2R5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyBhcy1pcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6ICcnLFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IEJ1ZmZlciB0byBVVEYtOCBzdHJpbmcgYW5kIG11dGF0ZSBfZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAne1wiYWRkcmVzc1wiOlwidGIxcXRlc3RcIixcImFtb3VudFwiOjEwMDAwMH0nO1xuICAgICAgY29uc3QgYnVmZmVyQm9keSA9IEJ1ZmZlci5mcm9tKGpzb25TdHJpbmcsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBidWZmZXJCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGpzb25TdHJpbmcpO1xuICAgICAgLy8gVmVyaWZ5IF9kYXRhIFdBUyBtdXRhdGVkIHRvIHN0cmluZyAtIGNyaXRpY2FsIGZvciBzdXBlcmFnZW50IHRvIHNlbmQgY29ycmVjdCBieXRlc1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwganNvblN0cmluZyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgZW1wdHkgQnVmZmVyIHRvIGVtcHR5IHN0cmluZyBhbmQgbXV0YXRlIF9kYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1JlcTogYW55ID0ge1xuICAgICAgICBfZGF0YTogQnVmZmVyLmZyb20oJycpLFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsICcnKTtcbiAgICAgIC8vIFZlcmlmeSBfZGF0YSBXQVMgbXV0YXRlZCB0byBzdHJpbmdcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgbW9ja1JlcS5fZGF0YSwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tSZXEuX2RhdGEsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgcmVzdWx0cyBvbiByZXRyeSBmb3IgSE1BQyBjb25zaXN0ZW5jeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAne1wiYWRkcmVzc1wiOlwidGIxcXRlc3RcIixcImFtb3VudFwiOjEwMDAwMH0nO1xuICAgICAgY29uc3QgYnVmZmVyQm9keSA9IEJ1ZmZlci5mcm9tKGpzb25TdHJpbmcsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBidWZmZXJCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGNhbGwgKG9yaWdpbmFsIHJlcXVlc3QpIC0gY29udmVydHMgQnVmZmVyIHRvIHN0cmluZywgbXV0YXRlcyBfZGF0YVxuICAgICAgY29uc3QgcmVzdWx0MSA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdDEsIGpzb25TdHJpbmcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG5cbiAgICAgIC8vIFNlY29uZCBjYWxsIChzaW11bGF0aW5nIHJldHJ5KSAtIF9kYXRhIGlzIG5vdyBhIHN0cmluZywgcmV0dXJucyBhcy1pc1xuICAgICAgY29uc3QgcmVzdWx0MiA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuXG4gICAgICAvLyBCb3RoIGNhbGxzIHNob3VsZCByZXR1cm4gaWRlbnRpY2FsIHN0cmluZ3MgZm9yIGNvbnNpc3RlbnQgSE1BQ1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdDEsIHJlc3VsdDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdDIsIGpzb25TdHJpbmcpO1xuICAgICAgLy8gX2RhdGEgc2hvdWxkIG5vdyBiZSBhIHN0cmluZyAobXV0YXRlZCBvbiBmaXJzdCBjYWxsKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwganNvblN0cmluZyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG11dGF0ZSBCdWZmZXIgdG8gcHJldmVudCBzdXBlcmFnZW50IEpTT04gc2VyaWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgY3JpdGljYWwgYmVoYXZpb3I6IGlmIHdlIGRvbid0IG11dGF0ZSBfZGF0YSBmcm9tIEJ1ZmZlciB0byBzdHJpbmcsXG4gICAgICAvLyBzdXBlcmFnZW50IHdpbGwgc2VyaWFsaXplIHRoZSBCdWZmZXIgYXMge1widHlwZVwiOlwiQnVmZmVyXCIsXCJkYXRhXCI6Wy4uLl19LCB3aGljaCB3b24ndCBtYXRjaFxuICAgICAgLy8gdGhlIEhNQUMgY2FsY3VsYXRlZCBvbiB0aGUgVVRGLTggc3RyaW5nLiBCeSBtdXRhdGluZyBfZGF0YSwgd2UgZW5zdXJlIHN1cGVyYWdlbnQgc2VuZHNcbiAgICAgIC8vIHRoZSBleGFjdCBieXRlcyB3ZSB1c2VkIGZvciBITUFDIGNhbGN1bGF0aW9uLlxuICAgICAgY29uc3QganNvblN0cmluZyA9ICd7XCJhZGRyZXNzXCI6XCJ0YjFxdGVzdFwiLFwiYW1vdW50XCI6MTAwMDAwfSc7XG4gICAgICBjb25zdCBidWZmZXJCb2R5ID0gQnVmZmVyLmZyb20oanNvblN0cmluZywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IGJ1ZmZlckJvZHksXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcblxuICAgICAgc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG5cbiAgICAgIC8vIEFmdGVyIHNlcmlhbGl6YXRpb24sIF9kYXRhIE1VU1QgYmUgYSBzdHJpbmcsIG5vdCBhIEJ1ZmZlclxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwganNvblN0cmluZyk7XG5cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB3aGVuIHN1cGVyYWdlbnQgc2VuZHMgdGhlIHJlcXVlc3QsIGl0IHNlbmRzIHRoZSBVVEYtOCBzdHJpbmcsXG4gICAgICAvLyBub3QgdGhlIEpTT04tc2VyaWFsaXplZCBCdWZmZXIgcmVwcmVzZW50YXRpb24uXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSBvYmplY3QgZGF0YSB0byBKU09OJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqZWN0Qm9keSA9IHsgYWRkcmVzczogJ3RiMXF0ZXN0JywgYW1vdW50OiAxMDAwMDAgfTtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IG9iamVjdEJvZHksXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBKU09OLnN0cmluZ2lmeShvYmplY3RCb2R5KSk7XG4gICAgICAvLyBWZXJpZnkgX2RhdGEgd2FzIHVwZGF0ZWQgdG8gc2VyaWFsaXplZCBmb3JtXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwgSlNPTi5zdHJpbmdpZnkob2JqZWN0Qm9keSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmVzdGVkIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZXN0ZWRCb2R5ID0geyBsZXZlbDE6IHsgbGV2ZWwyOiB7IHZhbHVlOiAnZGVlcCcgfSB9IH07XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBuZXN0ZWRCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgSlNPTi5zdHJpbmdpZnkobmVzdGVkQm9keSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB1bmRlZmluZWQgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0OiAoKSA9PiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShtb2NrUmVxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIG51bGwgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IG51bGwsXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgQ29udGVudC1UeXBlIHdpdGggY2hhcnNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iamVjdEJvZHkgPSB7IHRlc3Q6ICd2YWx1ZScgfTtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IG9iamVjdEJvZHksXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBKU09OLnN0cmluZ2lmeShvYmplY3RCb2R5KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24gY29udGVudCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqZWN0Qm9keSA9IHsgZGF0YTogJ3Rlc3QnIH07XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBvYmplY3RCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBKU09OLnN0cmluZ2lmeShvYmplY3RCb2R5KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIHVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSB3aXRob3V0IHNlcmlhbGl6ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmplY3RCb2R5ID0geyB0ZXN0OiAndmFsdWUnIH07XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBvYmplY3RCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICd0ZXh0L3BsYWluJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgLy8gdGV4dC9wbGFpbiBkb2Vzbid0IGhhdmUgYSBKU09OIHNlcmlhbGl6ZXIsIHNvIHJldHVybnMgdW5kZWZpbmVkXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlUmVzcG9uc2VSZXN1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGV4dCBmb3IgdGV4dC1iYXNlZCByZXNwb25zZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjc3ZUZXh0ID0gYHRyYW5zYWN0aW9uSWQsZGF0ZSxhbW91bnQsY3VycmVuY3ksc3RhdHVzXG4gICAgICAgIDEyMzQ1LDIwMjUtMDEtMTUsMTAwLjAwLFVTRCxjb21wbGV0ZWRcbiAgICAgICAgNjc4OTAsMjAyNS0wMS0yMiw1MC41MCxFVVIsY29tcGxldGVkXG4gICAgICAgIDEzNTc5LDIwMjUtMDItMTAsMjAwLjAwLFVTRCxwZW5kaW5nXG4gICAgICAgIDI0NjgwLDIwMjUtMDItMjgsNzUuMjUsQlRDLGNvbXBsZXRlZGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2NzdicgfSxcbiAgICAgICAgdGV4dDogY3N2VGV4dCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVJlc3BvbnNlUmVzdWx0KCkocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcmVzcG9uc2UudGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIEpTT04gcmVzcG9uc2UgYW5kIHJldHVybiB0aGUgZW50aXJlIGJvZHkgaWYgbm8gZmllbGQgaXMgc3BlY2lmaWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIGhlYWRlcjogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IHsgZm9vOiAnYmFyJywgYmF6OiAxMjMgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVJlc3BvbnNlUmVzdWx0KCkocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlLmJvZHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBKU09OIHJlc3BvbnNlIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBmaWVsZCBpZiBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiB7IGZvbzogJ2JhcicsIGJhejogMTIzIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgnZm9vJykocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgJ2JhcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGVudGlyZSByZXNwb25zZSBmb3Igbm9uLUpTT04gYW5kIG5vbi10ZXh0IHJlc3BvbnNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICdpbWFnZS9wbmcnIH0sXG4gICAgICAgIGJsb2I6ICdhYmNkZWZnaGlqaycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBmdWxsIGJvZHkgaWYgdGhpcyBmaWVsZCBleGlzdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9LFxuICAgICAgICBib2R5OiB7IGlycmVsZXZhbnQ6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVJlc3BvbnNlUmVzdWx0KCkocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcmVzcG9uc2UuYm9keSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdoYW5kbGVSZXNwb25zZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmUtdGhyb3cgYW4gZXJyb3Igd2l0aG91dCByZXNwb25zZSBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSBuZXcgRXJyb3IoJ0hhbiBzaG90IGZpcnN0Jyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHsgbmFtZTogJ0Vycm9yJywgbWVzc2FnZTogJ0hhbiBzaG90IGZpcnN0JyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBzdGF0dXMgY29kZSBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vIGVycm9yIHRleHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yOiBhbnkgPSBuZXcgRXJyb3IoKTtcbiAgICAgIG9yaWdpbmFsRXJyb3IucmVzcG9uc2UgPSB7IHN0YXR1czogNDAwIH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwJyxcbiAgICAgICAgaW52YWxpZFRva2VuOiBmYWxzZSxcbiAgICAgICAgbmVlZHNPVFA6IGZhbHNlLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSByZXNwb25zZSBib2R5LmVycm9yIHRleHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yOiBhbnkgPSBuZXcgRXJyb3IoKTtcbiAgICAgIG9yaWdpbmFsRXJyb3IucmVzcG9uc2UgPSB7IHN0YXR1czogNDAwLCBib2R5OiB7IGVycm9yOiAnSGFuIHNob3QgZmlyc3QnIH0gfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFuZGxlUmVzcG9uc2VFcnJvcihvcmlnaW5hbEVycm9yKSwge1xuICAgICAgICBuYW1lOiAnQXBpUmVzcG9uc2VFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdIYW4gc2hvdCBmaXJzdCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiBvcmlnaW5hbEVycm9yLnJlc3BvbnNlLmJvZHksXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIEhUTUwgY29kZSBmcm9tIHRoZSByZXNwb25zZSB0ZXh0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCwgdGV4dDogJyA8Yj4gSGFuIHNob3QgZmlyc3QgPC9iPicgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFuZGxlUmVzcG9uc2VFcnJvcihvcmlnaW5hbEVycm9yKSwge1xuICAgICAgICBuYW1lOiAnQXBpUmVzcG9uc2VFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICc0MDBcXG5IYW4gc2hvdCBmaXJzdCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFubm90YXRlIGludmFsaWRUb2tlbiBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3I6IGFueSA9IG5ldyBFcnJvcigpO1xuICAgICAgb3JpZ2luYWxFcnJvci5yZXNwb25zZSA9IHsgc3RhdHVzOiA0MDAsIGhlYWRlcjogeyAneC1hdXRoLXJlcXVpcmVkJzogJ3RydWUnIH0gfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFuZGxlUmVzcG9uc2VFcnJvcihvcmlnaW5hbEVycm9yKSwge1xuICAgICAgICBuYW1lOiAnQXBpUmVzcG9uc2VFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICc0MDAnLFxuICAgICAgICBpbnZhbGlkVG9rZW46IHRydWUsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFubm90YXRlIG5lZWRzT1RQIHByb3BlcnR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCwgYm9keTogeyBuZWVkc09UUDogdHJ1ZSB9IH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwJyxcbiAgICAgICAgaW52YWxpZFRva2VuOiBmYWxzZSxcbiAgICAgICAgbmVlZHNPVFA6IHRydWUsXG4gICAgICAgIHJlc3VsdDogb3JpZ2luYWxFcnJvci5yZXNwb25zZS5ib2R5LFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=bitgoAPI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitgoAPI.d.ts","sourceRoot":"","sources":["../../../test/unit/bitgoAPI.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}