@bitgo-beta/sdk-api 1.10.1-beta.185 → 1.10.1-beta.1851

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 -571
  78. package/dist/web/main.js +0 -2
  79. package/dist/web/main.js.LICENSE.txt +0 -110
package/dist/package.json CHANGED
@@ -1,32 +1,22 @@
1
1
  {
2
2
  "name": "@bitgo-beta/sdk-api",
3
- "version": "1.10.1-beta.185",
3
+ "version": "1.10.1-beta.1851",
4
4
  "description": "REST wrapper for BitGoJS",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
7
- "exports": {
8
- "./package.json": "./package.json",
9
- ".": {
10
- "node": "./dist/src/index.js",
11
- "default": "./dist/web/main.js"
12
- }
13
- },
14
7
  "browser": {
15
8
  "proxy-agent": false
16
9
  },
17
10
  "scripts": {
18
11
  "build": "yarn tsc --build --incremental --verbose .",
19
12
  "fmt": "prettier --write .",
20
- "check-fmt": "prettier --check .",
13
+ "check-fmt": "prettier --check '**/*.{ts,js,json}'",
21
14
  "clean": "rm -r ./dist",
22
15
  "lint": "eslint --quiet .",
23
16
  "prepare": "npm run build",
24
- "webpack-dev": "yarn webpack",
25
- "webpack-prod": "yarn webpack --mode=production --node-env=production",
26
- "prepublishOnly": "yarn webpack-prod",
27
17
  "test": "npm run coverage",
28
18
  "coverage": "nyc -- npm run unit-test",
29
- "unit-test": "mocha"
19
+ "unit-test": "mocha 'test/unit/**/*.ts'"
30
20
  },
31
21
  "author": "BitGo SDK Team <sdkteam@bitgo.com>",
32
22
  "license": "MIT",
@@ -50,23 +40,23 @@
50
40
  ]
51
41
  },
52
42
  "dependencies": {
53
- "@bitgo-beta/sdk-core": "8.2.1-beta.185",
54
- "@bitgo-beta/sjcl": "1.0.2-beta.423",
55
- "@bitgo-beta/unspents": "0.13.2-beta.185",
56
- "@bitgo-beta/utxo-lib": "8.0.3-beta.186",
43
+ "@bitgo-beta/argon2": "0.0.1-beta.169",
44
+ "@bitgo-beta/sdk-core": "8.2.1-beta.1855",
45
+ "@bitgo-beta/sdk-hmac": "1.0.1-beta.1231",
46
+ "@bitgo-beta/sjcl": "1.0.2-beta.2104",
47
+ "@bitgo-beta/unspents": "0.13.2-beta.1857",
48
+ "@bitgo-beta/utxo-lib": "8.0.3-beta.1858",
57
49
  "@types/superagent": "4.1.15",
58
- "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.2",
59
- "bluebird": "^3.5.3",
60
- "browser-or-node": "2.0.0",
61
- "bs58": "^2.0.1",
50
+ "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3",
62
51
  "debug": "3.1.0",
63
52
  "eol": "^0.5.0",
64
- "lodash": "^4.17.15",
65
- "proxy-agent": "6.3.1",
66
- "sanitize-html": "^2.11",
67
- "secp256k1": "^4.0.2",
53
+ "io-ts": "npm:@bitgo-forks/io-ts@2.1.4",
54
+ "lodash": "^4.18.0",
55
+ "proxy-agent": "6.4.0",
56
+ "sanitize-html": "^2.17.4",
57
+ "secp256k1": "5.0.1",
68
58
  "secrets.js-grempe": "^1.1.0",
69
- "superagent": "3.8.3"
59
+ "superagent": "^9.0.1"
70
60
  },
71
61
  "overrides": {
72
62
  "degenerator": "5.0.0"
@@ -74,5 +64,8 @@
74
64
  "resolutions": {
75
65
  "degenerator": "5.0.0"
76
66
  },
77
- "gitHead": "d3c0a1f84926d42e5770beff42845e3df18fd840"
67
+ "gitHead": "2ec8c1fcb91a63a77bf0af4edb93a3e0f24af2ff",
68
+ "files": [
69
+ "dist"
70
+ ]
78
71
  }
package/dist/src/api.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import * as superagent from 'superagent';
1
+ import superagent from 'superagent';
2
2
  import { BitGoRequest } from '@bitgo-beta/sdk-core';
3
- import { VerifyResponseOptions } from './types';
3
+ import { AuthVersion, VerifyResponseOptions } from './types';
4
4
  import { BitGoAPI } from './bitgoAPI';
5
5
  /**
6
6
  * Add the bitgo-specific result() function on a superagent request.
@@ -29,8 +29,10 @@ export declare function handleResponseError(e: Error & {
29
29
  response?: superagent.Response;
30
30
  }): never;
31
31
  /**
32
- * Serialize request data based on the request content type
33
- * Note: Not sure this is still needed or even useful. Consider removing.
32
+ * Serialize request data based on the request content type.
33
+ * If data is already a string, returns it as-is to preserve exact bytes for HMAC.
34
+ * If data is a Buffer, converts to UTF-8 string.
35
+ * If data is an object, serializes it based on Content-Type.
34
36
  * @param req
35
37
  */
36
38
  export declare function serializeRequestData(req: superagent.Request): string | undefined;
@@ -43,5 +45,6 @@ export declare function setRequestQueryString(req: superagent.SuperAgentRequest)
43
45
  * Verify that the response received from the server is signed correctly.
44
46
  * Right now, it is very permissive with the timestamp variance.
45
47
  */
46
- export declare function verifyResponse(bitgo: BitGoAPI, token: string | undefined, method: VerifyResponseOptions['method'], req: superagent.SuperAgentRequest, response: superagent.Response): superagent.Response;
48
+ export declare function verifyResponse(bitgo: BitGoAPI, token: string | undefined, method: VerifyResponseOptions['method'], req: superagent.SuperAgentRequest, response: superagent.Response, authVersion: AuthVersion): superagent.Response;
49
+ export declare function verifyResponseAsync(bitgo: BitGoAPI, token: string | undefined, method: VerifyResponseOptions['method'], req: superagent.SuperAgentRequest, response: superagent.Response, authVersion: AuthVersion): Promise<superagent.Response>;
47
50
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAIzC,OAAO,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,kBAAkB,GAAG,GAAG,EACrD,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAChC,YAAY,CAAC,kBAAkB,CAAC,CASlC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,EACrD,aAAa,CAAC,EAAE,MAAM,GACrB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,KAAK,kBAAkB,CAOlD;AAkBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAA;CAAE,GAAG,KAAK,CAKxF;AAgCD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS,CAkBhF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAwB7E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,GAAG,EAAE,UAAU,CAAC,iBAAiB,EACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,GAC5B,UAAU,CAAC,QAAQ,CA+CrB"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAOA,OAAO,UAAU,MAAM,YAAY,CAAC;AAIpC,OAAO,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAsB,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,kBAAkB,GAAG,GAAG,EACrD,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAChC,YAAY,CAAC,kBAAkB,CAAC,CASlC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,EACrD,aAAa,CAAC,EAAE,MAAM,GACrB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,KAAK,kBAAkB,CAalD;AAkBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAA;CAAE,GAAG,KAAK,CAKxF;AAgCD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS,CAsDhF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAwB7E;AAqCD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,GAAG,EAAE,UAAU,CAAC,iBAAiB,EACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAC7B,WAAW,EAAE,WAAW,GACvB,UAAU,CAAC,QAAQ,CAkBrB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,GAAG,EAAE,UAAU,CAAC,iBAAiB,EACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAC7B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAkB9B"}
package/dist/src/api.js CHANGED
@@ -1,18 +1,27 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.verifyResponse = exports.setRequestQueryString = exports.serializeRequestData = exports.handleResponseError = exports.handleResponseResult = exports.toBitgoRequest = void 0;
6
+ exports.toBitgoRequest = toBitgoRequest;
7
+ exports.handleResponseResult = handleResponseResult;
8
+ exports.handleResponseError = handleResponseError;
9
+ exports.serializeRequestData = serializeRequestData;
10
+ exports.setRequestQueryString = setRequestQueryString;
11
+ exports.verifyResponse = verifyResponse;
12
+ exports.verifyResponseAsync = verifyResponseAsync;
4
13
  /**
5
14
  * @prettier
6
15
  */
7
- const debug_1 = require("debug");
8
- const eol = require("eol");
9
- const _ = require("lodash");
10
- const sanitizeHtml = require("sanitize-html");
11
- const superagent = require("superagent");
12
- const urlLib = require("url");
13
- const querystring = require("querystring");
16
+ const debug_1 = __importDefault(require("debug"));
17
+ const eol_1 = __importDefault(require("eol"));
18
+ const lodash_1 = __importDefault(require("lodash"));
19
+ const sanitize_html_1 = __importDefault(require("sanitize-html"));
20
+ const superagent_1 = __importDefault(require("superagent"));
21
+ const url_1 = __importDefault(require("url"));
22
+ const querystring_1 = __importDefault(require("querystring"));
14
23
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
15
- const debug = debug_1.default('bitgo:api');
24
+ const debug = (0, debug_1.default)('bitgo:api');
16
25
  /**
17
26
  * Add the bitgo-specific result() function on a superagent request.
18
27
  *
@@ -31,7 +40,6 @@ function toBitgoRequest(req) {
31
40
  },
32
41
  });
33
42
  }
34
- exports.toBitgoRequest = toBitgoRequest;
35
43
  /**
36
44
  * Return a function which extracts the specified response body property from the response if successful,
37
45
  * otherwise throw an `ApiErrorResponse` parsed from the response body.
@@ -39,13 +47,17 @@ exports.toBitgoRequest = toBitgoRequest;
39
47
  */
40
48
  function handleResponseResult(optionalField) {
41
49
  return function (res) {
42
- if (_.isNumber(res.status) && res.status >= 200 && res.status < 300) {
43
- return optionalField ? res.body[optionalField] : res.body;
50
+ if (lodash_1.default.isNumber(res.status) && res.status >= 200 && res.status < 300) {
51
+ return (
52
+ // If there's an optional field and the body is non-nullish with that property, return it;
53
+ // otherwise return the body if available; if not, return the text; and finally fallback to the entire response.
54
+ (optionalField && res.body && res.body[optionalField] !== undefined ? res.body[optionalField] : res.body) ??
55
+ res.text ??
56
+ res);
44
57
  }
45
58
  throw errFromResponse(res);
46
59
  };
47
60
  }
48
- exports.handleResponseResult = handleResponseResult;
49
61
  /**
50
62
  * Extract relevant information from a successful response (that is, a response with an HTTP status code
51
63
  * between 200 and 299), but which resulted in an application specific error and use it to construct and
@@ -54,12 +66,11 @@ exports.handleResponseResult = handleResponseResult;
54
66
  * @param res
55
67
  */
56
68
  function errFromResponse(res) {
57
- var _a;
58
69
  const message = createResponseErrorString(res);
59
70
  const status = res.status;
60
71
  const result = res.body;
61
- const invalidToken = _.has(res.header, 'x-auth-required') && res.header['x-auth-required'] === 'true';
62
- const needsOtp = ((_a = res.body) === null || _a === void 0 ? void 0 : _a.needsOTP) !== undefined;
72
+ const invalidToken = lodash_1.default.has(res.header, 'x-auth-required') && res.header['x-auth-required'] === 'true';
73
+ const needsOtp = res.body?.needsOTP !== undefined;
63
74
  return new sdk_core_1.ApiResponseError(message, status, result, invalidToken, needsOtp);
64
75
  }
65
76
  /**
@@ -73,16 +84,14 @@ function handleResponseError(e) {
73
84
  }
74
85
  throw e;
75
86
  }
76
- exports.handleResponseError = handleResponseError;
77
87
  /**
78
88
  * There are many ways a request can fail, and may ways information on that failure can be
79
89
  * communicated to the client. This function tries to handle those cases and create a sane error string
80
90
  * @param res Response from an HTTP request
81
91
  */
82
92
  function createResponseErrorString(res) {
83
- var _a;
84
93
  let errString = res.status.toString(); // at the very least we'll have the status code
85
- if ((_a = res.body) === null || _a === void 0 ? void 0 : _a.error) {
94
+ if (res.body?.error) {
86
95
  // this is the case we hope for, where the server gives us a nice error from the JSON body
87
96
  errString = res.body.error;
88
97
  }
@@ -90,11 +99,11 @@ function createResponseErrorString(res) {
90
99
  // if the response came back as text, we try to parse it as HTML and remove all tags, leaving us
91
100
  // just the bare text, which we then trim of excessive newlines and limit to a certain length
92
101
  try {
93
- let sanitizedText = sanitizeHtml(res.text, { allowedTags: [] });
102
+ let sanitizedText = (0, sanitize_html_1.default)(res.text, { allowedTags: [] });
94
103
  sanitizedText = sanitizedText.trim();
95
- sanitizedText = eol.lf(sanitizedText); // use '\n' for all newlines
96
- sanitizedText = _.replace(sanitizedText, /\n[ |\t]{1,}\n/g, '\n\n'); // remove the spaces/tabs between newlines
97
- sanitizedText = _.replace(sanitizedText, /[\n]{3,}/g, '\n\n'); // have at most 2 consecutive newlines
104
+ sanitizedText = eol_1.default.lf(sanitizedText); // use '\n' for all newlines
105
+ sanitizedText = lodash_1.default.replace(sanitizedText, /\n[ |\t]{1,}\n/g, '\n\n'); // remove the spaces/tabs between newlines
106
+ sanitizedText = lodash_1.default.replace(sanitizedText, /[\n]{3,}/g, '\n\n'); // have at most 2 consecutive newlines
98
107
  sanitizedText = sanitizedText.substring(0, 5000); // prevent message from getting too large
99
108
  errString = errString + '\n' + sanitizedText; // add it to our existing errString (at this point the more info the better!)
100
109
  }
@@ -106,36 +115,68 @@ function createResponseErrorString(res) {
106
115
  return errString;
107
116
  }
108
117
  /**
109
- * Serialize request data based on the request content type
110
- * Note: Not sure this is still needed or even useful. Consider removing.
118
+ * Serialize request data based on the request content type.
119
+ * If data is already a string, returns it as-is to preserve exact bytes for HMAC.
120
+ * If data is a Buffer, converts to UTF-8 string.
121
+ * If data is an object, serializes it based on Content-Type.
111
122
  * @param req
112
123
  */
113
124
  function serializeRequestData(req) {
114
- let data = req._data;
115
- if (typeof data !== 'string') {
116
- let contentType = req.get('Content-Type');
117
- // Parse out just the content type from the header (ignore the charset)
118
- if (contentType) {
119
- contentType = contentType.split(';')[0];
120
- }
121
- let serialize = superagent.serialize[contentType];
122
- if (!serialize && /[\/+]json\b/.test(contentType)) {
123
- serialize = superagent.serialize['application/json'];
125
+ const data = req._data;
126
+ if (typeof data === 'string') {
127
+ return data;
128
+ }
129
+ if (Buffer.isBuffer(data)) {
130
+ // Convert Buffer to UTF-8 string and mutate _data to ensure consistency.
131
+ // This is critical: if _data stays as a Buffer, superagent will serialize it
132
+ // as JSON ({"type":"Buffer","data":[...]}), which won't match the HMAC.
133
+ // By mutating to string, superagent sends the exact bytes we hash.
134
+ // This is safe for retries: calling again with a string will hit the early return above.
135
+ const stringData = data.toString('utf8');
136
+ req._data = stringData;
137
+ return stringData;
138
+ }
139
+ if (data === undefined || data === null) {
140
+ return undefined;
141
+ }
142
+ // Serialize object data based on Content-Type
143
+ let contentType = req.get('Content-Type');
144
+ // Parse out just the content type from the header (ignore the charset)
145
+ if (contentType) {
146
+ contentType = contentType.split(';')[0].trim();
147
+ }
148
+ let serialize;
149
+ const serializers = superagent_1.default.serialize;
150
+ if (contentType) {
151
+ if (Object.prototype.hasOwnProperty.call(serializers, contentType)) {
152
+ const candidate = serializers[contentType];
153
+ if (typeof candidate === 'function') {
154
+ serialize = candidate;
155
+ }
124
156
  }
125
- if (serialize) {
126
- data = serialize(data);
127
- req._data = data;
128
- return data;
157
+ else if (/[\/+]json\b/.test(contentType)) {
158
+ // Fall back to the built-in JSON serializer for JSON-like content types
159
+ if (Object.prototype.hasOwnProperty.call(serializers, 'application/json')) {
160
+ const jsonSerializer = serializers['application/json'];
161
+ if (typeof jsonSerializer === 'function') {
162
+ serialize = jsonSerializer;
163
+ }
164
+ }
129
165
  }
130
166
  }
167
+ if (serialize) {
168
+ const serialized = serialize(data);
169
+ req._data = serialized;
170
+ return serialized;
171
+ }
172
+ return undefined;
131
173
  }
132
- exports.serializeRequestData = serializeRequestData;
133
174
  /**
134
175
  * Set the superagent query string correctly for browsers or node.
135
176
  * @param req
136
177
  */
137
178
  function setRequestQueryString(req) {
138
- const urlDetails = urlLib.parse(req.url);
179
+ const urlDetails = url_1.default.parse(req.url);
139
180
  let queryString;
140
181
  const query = req._query;
141
182
  const qs = req.qs;
@@ -146,7 +187,7 @@ function setRequestQueryString(req) {
146
187
  }
147
188
  else if (qs) {
148
189
  // node version
149
- queryString = querystring.stringify(qs);
190
+ queryString = querystring_1.default.stringify(qs);
150
191
  req.qs = null;
151
192
  }
152
193
  if (queryString) {
@@ -156,44 +197,26 @@ function setRequestQueryString(req) {
156
197
  else {
157
198
  urlDetails.search = '?' + queryString;
158
199
  }
159
- req.url = urlLib.format(urlDetails);
200
+ req.url = url_1.default.format(urlDetails);
160
201
  }
161
202
  }
162
- exports.setRequestQueryString = setRequestQueryString;
163
203
  /**
164
- * Verify that the response received from the server is signed correctly.
165
- * Right now, it is very permissive with the timestamp variance.
204
+ * Validate a completed verification response and throw a descriptive `ApiResponseError` if it
205
+ * indicates the response is invalid or outside the acceptable time window.
166
206
  */
167
- function verifyResponse(bitgo, token, method, req, response) {
168
- // we can't verify the response if we're not authenticated
169
- if (!req.isV2Authenticated || !req.authenticationToken) {
170
- return response;
171
- }
172
- const verificationResponse = bitgo.verifyResponse({
173
- url: req.url,
174
- hmac: response.header.hmac,
175
- statusCode: response.status,
176
- text: response.text,
177
- timestamp: response.header.timestamp,
178
- token: req.authenticationToken,
179
- method,
180
- });
207
+ function assertVerificationResponse(bitgo, token, req, response, verificationResponse) {
181
208
  if (!verificationResponse.isValid) {
182
- // calculate the HMAC
183
- const receivedHmac = response.header.hmac;
184
- const expectedHmac = verificationResponse.expectedHmac;
185
- const signatureSubject = verificationResponse.signatureSubject;
186
209
  // Log only the first 10 characters of the token to ensure the full token isn't logged.
187
210
  const partialBitgoToken = token ? token.substring(0, 10) : '';
188
211
  const errorDetails = {
189
- expectedHmac,
190
- receivedHmac,
191
- hmacInput: signatureSubject,
212
+ expectedHmac: verificationResponse.expectedHmac,
213
+ receivedHmac: response.header.hmac,
214
+ hmacInput: verificationResponse.signatureSubject,
192
215
  requestToken: req.authenticationToken,
193
216
  bitgoToken: partialBitgoToken,
194
217
  };
195
218
  debug('Invalid response HMAC: %O', errorDetails);
196
- throw new sdk_core_1.ApiResponseError('invalid response HMAC, possible man-in-the-middle-attack', 511, errorDetails);
219
+ throw new sdk_core_1.ApiResponseError('invalid response HMAC', 511, errorDetails);
197
220
  }
198
221
  if (bitgo.getAuthVersion() === 3 && !verificationResponse.isInResponseValidityWindow) {
199
222
  const errorDetails = {
@@ -201,9 +224,45 @@ function verifyResponse(bitgo, token, method, req, response) {
201
224
  verificationTime: verificationResponse.verificationTime,
202
225
  };
203
226
  debug('Server response outside response validity time window: %O', errorDetails);
204
- throw new sdk_core_1.ApiResponseError('server response outside response validity time window, possible man-in-the-middle-attack', 511, errorDetails);
227
+ throw new sdk_core_1.ApiResponseError('server response outside response validity time window', 511, errorDetails);
205
228
  }
229
+ }
230
+ /**
231
+ * Verify that the response received from the server is signed correctly.
232
+ * Right now, it is very permissive with the timestamp variance.
233
+ */
234
+ function verifyResponse(bitgo, token, method, req, response, authVersion) {
235
+ if (!req.isV2Authenticated || !req.authenticationToken) {
236
+ return response;
237
+ }
238
+ const verificationResponse = bitgo.verifyResponse({
239
+ url: req.url,
240
+ hmac: response.header.hmac,
241
+ statusCode: response.status,
242
+ text: response.text,
243
+ timestamp: response.header.timestamp,
244
+ token: req.authenticationToken,
245
+ method,
246
+ authVersion,
247
+ });
248
+ assertVerificationResponse(bitgo, token, req, response, verificationResponse);
206
249
  return response;
207
250
  }
208
- exports.verifyResponse = verifyResponse;
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILGlDQUEwQjtBQUMxQiwyQkFBMkI7QUFDM0IsNEJBQTRCO0FBQzVCLDhDQUE4QztBQUM5Qyx5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLDJDQUEyQztBQUUzQyxtREFBc0U7QUFLdEUsTUFBTSxLQUFLLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlDO0lBRWpDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLGFBQXNCO1lBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDYixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQXFCLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUMvRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVhELHdDQVdDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxhQUFzQjtJQUV0QixPQUFPLFVBQVUsR0FBd0I7UUFDdkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuRSxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztTQUMzRDtRQUNELE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdC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RkFBdUY7UUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsWUFBWTtZQUNaLFlBQVk7WUFDWixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLFlBQVksRUFBRSxHQUFHLENBQUMsbUJBQW1CO1lBQ3JDLFVBQVUsRUFBRSxpQkFBaUI7U0FDOUIsQ0FBQztRQUNGLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksMkJBQWdCLENBQUMsMERBQTBELEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQzNHO0lBRUQsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEVBQUU7UUFDcEYsTUFBTSxZQUFZLEdBQUc7WUFDbkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUztZQUNwQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxnQkFBZ0I7U0FDeEQsQ0FBQztRQUNGLEtBQUssQ0FBQywyREFBMkQsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRixNQUFNLElBQUksMkJBQWdCLENBQ3hCLDBGQUEwRixFQUMxRixHQUFHLEVBQ0gsWUFBWSxDQUNiLENBQUM7S0FDSDtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFyREQsd0NBcURDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCAqIGFzIGVvbCBmcm9tICdlb2wnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgc2FuaXRpemVIdG1sIGZyb20gJ3Nhbml0aXplLWh0bWwnO1xuaW1wb3J0ICogYXMgc3VwZXJhZ2VudCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCAqIGFzIHVybExpYiBmcm9tICd1cmwnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5pbXBvcnQgeyBBcGlSZXNwb25zZUVycm9yLCBCaXRHb1JlcXVlc3QgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICcuL2JpdGdvQVBJJztcblxuY29uc3QgZGVidWcgPSBEZWJ1ZygnYml0Z286YXBpJyk7XG5cbi8qKlxuICogQWRkIHRoZSBiaXRnby1zcGVjaWZpYyByZXN1bHQoKSBmdW5jdGlvbiBvbiBhIHN1cGVyYWdlbnQgcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgc2VydmVyIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIHRoZSBgcmVzdWx0KClgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVpdGhlciB0aGUgZW50aXJlIHJlc3BvbnNlIGJvZHksXG4gKiBvciB0aGUgZmllbGQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBzcGVjaWZpZWQgYnkgdGhlIGBvcHRpb25hbEZpZWxkYCBwYXJhbWV0ZXIgaWYgaXQgaXMgcHJvdmlkZWQuXG4gKlxuICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3aXRoIGFuIGVycm9yLCBgcmVzdWx0KClgIHdpbGwgaGFuZGxlIEhUVFAgZXJyb3JzIGFwcHJvcHJpYXRlbHkgYnlcbiAqIHJldGhyb3dpbmcgdGhlbSBhcyBhbiBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgcG9zc2libGUsIGFuZCBvdGhlcndpc2UgcmV0aHJvd2luZyB0aGUgdW5kZXJseWluZyByZXNwb25zZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JpdGdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGUgPSBhbnk+KFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Rcbik6IEJpdEdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGU+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVxLCB7XG4gICAgcmVzdWx0KG9wdGlvbmFsRmllbGQ/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXEudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PiBoYW5kbGVSZXNwb25zZVJlc3VsdDxSZXNwb25zZVJlc3VsdFR5cGU+KG9wdGlvbmFsRmllbGQpKHJlc3BvbnNlKSxcbiAgICAgICAgKGVycm9yKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIHJlc3BvbnNlIGJvZHkgcHJvcGVydHkgZnJvbSB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCxcbiAqIG90aGVyd2lzZSB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAgcGFyc2VkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gb3B0aW9uYWxGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8UmVzcG9uc2VSZXN1bHRUeXBlPihcbiAgb3B0aW9uYWxGaWVsZD86IHN0cmluZ1xuKTogKHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSkgPT4gUmVzcG9uc2VSZXN1bHRUeXBlIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXM6IHN1cGVyYWdlbnQuUmVzcG9uc2UpOiBSZXNwb25zZVJlc3VsdFR5cGUge1xuICAgIGlmIChfLmlzTnVtYmVyKHJlcy5zdGF0dXMpICYmIHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIHJldHVybiBvcHRpb25hbEZpZWxkID8gcmVzLmJvZHlbb3B0aW9uYWxGaWVsZF0gOiByZXMuYm9keTtcbiAgICB9XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKHJlcyk7XG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdCByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSAodGhhdCBpcywgYSByZXNwb25zZSB3aXRoIGFuIEhUVFAgc3RhdHVzIGNvZGVcbiAqIGJldHdlZW4gMjAwIGFuZCAyOTkpLCBidXQgd2hpY2ggcmVzdWx0ZWQgaW4gYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgZXJyb3IgYW5kIHVzZSBpdCB0byBjb25zdHJ1Y3QgYW5kXG4gKiB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHJlc1xuICovXG5mdW5jdGlvbiBlcnJGcm9tUmVzcG9uc2U8UmVzcG9uc2VCb2R5VHlwZT4ocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogQXBpUmVzcG9uc2VFcnJvciB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVSZXNwb25zZUVycm9yU3RyaW5nKHJlcyk7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGNvbnN0IHJlc3VsdCA9IHJlcy5ib2R5IGFzIFJlc3BvbnNlQm9keVR5cGU7XG4gIGNvbnN0IGludmFsaWRUb2tlbiA9IF8uaGFzKHJlcy5oZWFkZXIsICd4LWF1dGgtcmVxdWlyZWQnKSAmJiByZXMuaGVhZGVyWyd4LWF1dGgtcmVxdWlyZWQnXSA9PT0gJ3RydWUnO1xuICBjb25zdCBuZWVkc090cCA9IHJlcy5ib2R5Py5uZWVkc09UUCAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IEFwaVJlc3BvbnNlRXJyb3IobWVzc2FnZSwgc3RhdHVzLCByZXN1bHQsIGludmFsaWRUb2tlbiwgbmVlZHNPdHApO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhbiBlcnJvciBvciBhbiBlcnJvciBjb250YWluaW5nIGFuIEhUVFAgcmVzcG9uc2UgYW5kIHVzZSBpdCB0byB0aHJvdyBhIHdlbGwtZm9ybWVkIGVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VFcnJvcihlOiBFcnJvciAmIHsgcmVzcG9uc2U/OiBzdXBlcmFnZW50LlJlc3BvbnNlIH0pOiBuZXZlciB7XG4gIGlmIChlLnJlc3BvbnNlKSB7XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKGUucmVzcG9uc2UpO1xuICB9XG4gIHRocm93IGU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIG1hbnkgd2F5cyBhIHJlcXVlc3QgY2FuIGZhaWwsIGFuZCBtYXkgd2F5cyBpbmZvcm1hdGlvbiBvbiB0aGF0IGZhaWx1cmUgY2FuIGJlXG4gKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBoYW5kbGUgdGhvc2UgY2FzZXMgYW5kIGNyZWF0ZSBhIHNhbmUgZXJyb3Igc3RyaW5nXG4gKiBAcGFyYW0gcmVzIFJlc3BvbnNlIGZyb20gYW4gSFRUUCByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRXJyb3JTdHJpbmcocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogc3RyaW5nIHtcbiAgbGV0IGVyclN0cmluZyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTsgLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2UnbGwgaGF2ZSB0aGUgc3RhdHVzIGNvZGVcbiAgaWYgKHJlcy5ib2R5Py5lcnJvcikge1xuICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2UgaG9wZSBmb3IsIHdoZXJlIHRoZSBzZXJ2ZXIgZ2l2ZXMgdXMgYSBuaWNlIGVycm9yIGZyb20gdGhlIEpTT04gYm9keVxuICAgIGVyclN0cmluZyA9IHJlcy5ib2R5LmVycm9yO1xuICB9IGVsc2UgaWYgKHJlcy50ZXh0KSB7XG4gICAgLy8gaWYgdGhlIHJlc3BvbnNlIGNhbWUgYmFjayBhcyB0ZXh0LCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgSFRNTCBhbmQgcmVtb3ZlIGFsbCB0YWdzLCBsZWF2aW5nIHVzXG4gICAgLy8ganVzdCB0aGUgYmFyZSB0ZXh0LCB3aGljaCB3ZSB0aGVuIHRyaW0gb2YgZXhjZXNzaXZlIG5ld2xpbmVzIGFuZCBsaW1pdCB0byBhIGNlcnRhaW4gbGVuZ3RoXG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYW5pdGl6ZWRUZXh0ID0gc2FuaXRpemVIdG1sKHJlcy50ZXh0LCB7IGFsbG93ZWRUYWdzOiBbXSB9KTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnRyaW0oKTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBlb2wubGYoc2FuaXRpemVkVGV4dCk7IC8vIHVzZSAnXFxuJyBmb3IgYWxsIG5ld2xpbmVzXG4gICAgICBzYW5pdGl6ZWRUZXh0ID0gXy5yZXBsYWNlKHNhbml0aXplZFRleHQsIC9cXG5bIHxcXHRdezEsfVxcbi9nLCAnXFxuXFxuJyk7IC8vIHJlbW92ZSB0aGUgc3BhY2VzL3RhYnMgYmV0d2VlbiBuZXdsaW5lc1xuICAgICAgc2FuaXRpemVkVGV4dCA9IF8ucmVwbGFjZShzYW5pdGl6ZWRUZXh0LCAvW1xcbl17Myx9L2csICdcXG5cXG4nKTsgLy8gaGF2ZSBhdCBtb3N0IDIgY29uc2VjdXRpdmUgbmV3bGluZXNcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnN1YnN0cmluZygwLCA1MDAwKTsgLy8gcHJldmVudCBtZXNzYWdlIGZyb20gZ2V0dGluZyB0b28gbGFyZ2VcbiAgICAgIGVyclN0cmluZyA9IGVyclN0cmluZyArICdcXG4nICsgc2FuaXRpemVkVGV4dDsgLy8gYWRkIGl0IHRvIG91ciBleGlzdGluZyBlcnJTdHJpbmcgKGF0IHRoaXMgcG9pbnQgdGhlIG1vcmUgaW5mbyB0aGUgYmV0dGVyISlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcmVzcG9uc2UncyBIVE1MIHdhcyB0b28gd2Fja3kgdG8gYmUgcGFyc2VkIGNsZWFubHlcbiAgICAgIGRlYnVnKCdnb3QgZXJyb3Igd2l0aCBtZXNzYWdlIFwiJXNcIiB3aGlsZSBjcmVhdGluZyByZXNwb25zZSBlcnJvciBzdHJpbmcgZnJvbSByZXNwb25zZTogJXMnLCBlLm1lc3NhZ2UsIHJlcy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyU3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSByZXF1ZXN0IGRhdGEgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGVudCB0eXBlXG4gKiBOb3RlOiBOb3Qgc3VyZSB0aGlzIGlzIHN0aWxsIG5lZWRlZCBvciBldmVuIHVzZWZ1bC4gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZXF1ZXN0RGF0YShyZXE6IHN1cGVyYWdlbnQuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkYXRhOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IChyZXEgYXMgYW55KS5fZGF0YTtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIC8vIFBhcnNlIG91dCBqdXN0IHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgaGVhZGVyIChpZ25vcmUgdGhlIGNoYXJzZXQpXG4gICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF07XG4gICAgfVxuICAgIGxldCBzZXJpYWxpemUgPSBzdXBlcmFnZW50LnNlcmlhbGl6ZVtjb250ZW50VHlwZV07XG4gICAgaWYgKCFzZXJpYWxpemUgJiYgL1tcXC8rXWpzb25cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICBzZXJpYWxpemUgPSBzdXBlcmFnZW50LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24vanNvbiddO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXplKSB7XG4gICAgICBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICAgICAgKHJlcSBhcyBhbnkpLl9kYXRhID0gZGF0YTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNldCB0aGUgc3VwZXJhZ2VudCBxdWVyeSBzdHJpbmcgY29ycmVjdGx5IGZvciBicm93c2VycyBvciBub2RlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nKHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCk6IHZvaWQge1xuICBjb25zdCB1cmxEZXRhaWxzID0gdXJsTGliLnBhcnNlKHJlcS51cmwpO1xuXG4gIGxldCBxdWVyeVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyeTogc3RyaW5nW10gPSAocmVxIGFzIGFueSkuX3F1ZXJ5O1xuICBjb25zdCBxczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IChyZXEgYXMgYW55KS5xcztcbiAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAvLyBicm93c2VyIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5LmpvaW4oJyYnKTtcbiAgICAocmVxIGFzIGFueSkuX3F1ZXJ5ID0gW107XG4gIH0gZWxzZSBpZiAocXMpIHtcbiAgICAvLyBub2RlIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShxcyk7XG4gICAgKHJlcSBhcyBhbnkpLnFzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWVyeVN0cmluZykge1xuICAgIGlmICh1cmxEZXRhaWxzLnNlYXJjaCkge1xuICAgICAgdXJsRGV0YWlscy5zZWFyY2ggKz0gJyYnICsgcXVlcnlTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybERldGFpbHMuc2VhcmNoID0gJz8nICsgcXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIHJlcS51cmwgPSB1cmxMaWIuZm9ybWF0KHVybERldGFpbHMpO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZ5IHRoYXQgdGhlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBpcyBzaWduZWQgY29ycmVjdGx5LlxuICogUmlnaHQgbm93LCBpdCBpcyB2ZXJ5IHBlcm1pc3NpdmUgd2l0aCB0aGUgdGltZXN0YW1wIHZhcmlhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5UmVzcG9uc2UoXG4gIGJpdGdvOiBCaXRHb0FQSSxcbiAgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWV0aG9kOiBWZXJpZnlSZXNwb25zZU9wdGlvbnNbJ21ldGhvZCddLFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QsXG4gIHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlXG4pOiBzdXBlcmFnZW50LlJlc3BvbnNlIHtcbiAgLy8gd2UgY2FuJ3QgdmVyaWZ5IHRoZSByZXNwb25zZSBpZiB3ZSdyZSBub3QgYXV0aGVudGljYXRlZFxuICBpZiAoIXJlcS5pc1YyQXV0aGVudGljYXRlZCB8fCAhcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4pIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB2ZXJpZmljYXRpb25SZXNwb25zZSA9IGJpdGdvLnZlcmlmeVJlc3BvbnNlKHtcbiAgICB1cmw6IHJlcS51cmwsXG4gICAgaG1hYzogcmVzcG9uc2UuaGVhZGVyLmhtYWMsXG4gICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHRleHQ6IHJlc3BvbnNlLnRleHQsXG4gICAgdGltZXN0YW1wOiByZXNwb25zZS5oZWFkZXIudGltZXN0YW1wLFxuICAgIHRva2VuOiByZXEuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICBtZXRob2QsXG4gIH0pO1xuXG4gIGlmICghdmVyaWZpY2F0aW9uUmVzcG9uc2UuaXNWYWxpZCkge1xuICAgIC8vIGNhbGN1bGF0ZSB0aGUgSE1BQ1xuICAgIGNvbnN0IHJlY2VpdmVkSG1hYyA9IHJlc3BvbnNlLmhlYWRlci5obWFjO1xuICAgIGNvbnN0IGV4cGVjdGVkSG1hYyA9IHZlcmlmaWNhdGlvblJlc3BvbnNlLmV4cGVjdGVkSG1hYztcbiAgICBjb25zdCBzaWduYXR1cmVTdWJqZWN0ID0gdmVyaWZpY2F0aW9uUmVzcG9uc2Uuc2lnbmF0dXJlU3ViamVjdDtcbiAgICAvLyBMb2cgb25seSB0aGUgZmlyc3QgMTAgY2hhcmFjdGVycyBvZiB0aGUgdG9rZW4gdG8gZW5zdXJlIHRoZSBmdWxsIHRva2VuIGlzbid0IGxvZ2dlZC5cbiAgICBjb25zdCBwYXJ0aWFsQml0Z29Ub2tlbiA9IHRva2VuID8gdG9rZW4uc3Vic3RyaW5nKDAsIDEwKSA6ICcnO1xuICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IHtcbiAgICAgIGV4cGVjdGVkSG1hYyxcbiAgICAgIHJlY2VpdmVkSG1hYyxcbiAgICAgIGhtYWNJbnB1dDogc2lnbmF0dXJlU3ViamVjdCxcbiAgICAgIHJlcXVlc3RUb2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiaXRnb1Rva2VuOiBwYXJ0aWFsQml0Z29Ub2tlbixcbiAgICB9O1xuICAgIGRlYnVnKCdJbnZhbGlkIHJlc3BvbnNlIEhNQUM6ICVPJywgZXJyb3JEZXRhaWxzKTtcbiAgICB0aHJvdyBuZXcgQXBpUmVzcG9uc2VFcnJvcignaW52YWxpZCByZXNwb25zZSBITUFDLCBwb3NzaWJsZSBtYW4taW4tdGhlLW1pZGRsZS1hdHRhY2snLCA1MTEsIGVycm9yRGV0YWlscyk7XG4gIH1cblxuICBpZiAoYml0Z28uZ2V0QXV0aFZlcnNpb24oKSA9PT0gMyAmJiAhdmVyaWZpY2F0aW9uUmVzcG9uc2UuaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3cpIHtcbiAgICBjb25zdCBlcnJvckRldGFpbHMgPSB7XG4gICAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLmhlYWRlci50aW1lc3RhbXAsXG4gICAgICB2ZXJpZmljYXRpb25UaW1lOiB2ZXJpZmljYXRpb25SZXNwb25zZS52ZXJpZmljYXRpb25UaW1lLFxuICAgIH07XG4gICAgZGVidWcoJ1NlcnZlciByZXNwb25zZSBvdXRzaWRlIHJlc3BvbnNlIHZhbGlkaXR5IHRpbWUgd2luZG93OiAlTycsIGVycm9yRGV0YWlscyk7XG4gICAgdGhyb3cgbmV3IEFwaVJlc3BvbnNlRXJyb3IoXG4gICAgICAnc2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3csIHBvc3NpYmxlIG1hbi1pbi10aGUtbWlkZGxlLWF0dGFjaycsXG4gICAgICA1MTEsXG4gICAgICBlcnJvckRldGFpbHNcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cbiJdfQ==
251
+ async function verifyResponseAsync(bitgo, token, method, req, response, authVersion) {
252
+ if (!req.isV2Authenticated || !req.authenticationToken) {
253
+ return response;
254
+ }
255
+ const verificationResponse = await bitgo.verifyResponseAsync({
256
+ url: req.url,
257
+ hmac: response.header.hmac,
258
+ statusCode: response.status,
259
+ text: response.text,
260
+ timestamp: response.header.timestamp,
261
+ token: req.authenticationToken,
262
+ method,
263
+ authVersion,
264
+ });
265
+ assertVerificationResponse(bitgo, token, req, response, verificationResponse);
266
+ return response;
267
+ }
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZCQSx3Q0FXQztBQU9ELG9EQWVDO0FBdUJELGtEQUtDO0FBdUNELG9EQXNEQztBQU1ELHNEQXdCQztBQXlDRCx3Q0F5QkM7QUFFRCxrREF5QkM7QUFsVEQ7O0dBRUc7QUFDSCxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLG9EQUF1QjtBQUN2QixrRUFBeUM7QUFDekMsNERBQW9DO0FBQ3BDLDhDQUF5QjtBQUN6Qiw4REFBc0M7QUFFdEMsbURBQXNFO0FBS3RFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlDO0lBRWpDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLGFBQXNCO1lBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDYixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQXFCLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUMvRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsYUFBc0I7SUFFdEIsT0FBTyxVQUFVLEdBQXdCO1FBQ3ZDLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDcEUsT0FBTztZQUNMLDBGQUEwRjtZQUMxRixnSEFBZ0g7WUFDaEgsQ0FBQyxhQUFhLElB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RUFBRSxHQUFHLENBQUMsbUJBQW1CO1FBQzlCLE1BQU07UUFDTixXQUFXO0tBQ1osQ0FBQyxDQUFDO0lBRUgsMEJBQTBCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDOUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVNLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsS0FBZSxFQUNmLEtBQXlCLEVBQ3pCLE1BQXVDLEVBQ3ZDLEdBQWlDLEVBQ2pDLFFBQTZCLEVBQzdCLFdBQXdCO0lBRXhCLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN2RCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztRQUMzRCxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDWixJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQzFCLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTTtRQUMzQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUztRQUNwQyxLQUFLLEVBQUUsR0FBRyxDQUFDLG1CQUFtQjtRQUM5QixNQUFNO1FBQ04sV0FBVztLQUNaLENBQUMsQ0FBQztJQUVILDBCQUEwQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IGVvbCBmcm9tICdlb2wnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBzYW5pdGl6ZUh0bWwgZnJvbSAnc2FuaXRpemUtaHRtbCc7XG5pbXBvcnQgc3VwZXJhZ2VudCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCB1cmxMaWIgZnJvbSAndXJsJztcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tICdxdWVyeXN0cmluZyc7XG5cbmltcG9ydCB7IEFwaVJlc3BvbnNlRXJyb3IsIEJpdEdvUmVxdWVzdCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgQXV0aFZlcnNpb24sIFZlcmlmeVJlc3BvbnNlSW5mbywgVmVyaWZ5UmVzcG9uc2VPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJy4vYml0Z29BUEknO1xuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdiaXRnbzphcGknKTtcblxuLyoqXG4gKiBBZGQgdGhlIGJpdGdvLXNwZWNpZmljIHJlc3VsdCgpIGZ1bmN0aW9uIG9uIGEgc3VwZXJhZ2VudCByZXF1ZXN0LlxuICpcbiAqIElmIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgdGhlIGByZXN1bHQoKWAgZnVuY3Rpb24gd2lsbCByZXR1cm4gZWl0aGVyIHRoZSBlbnRpcmUgcmVzcG9uc2UgYm9keSxcbiAqIG9yIHRoZSBmaWVsZCBmcm9tIHRoZSByZXNwb25zZSBib2R5IHNwZWNpZmllZCBieSB0aGUgYG9wdGlvbmFsRmllbGRgIHBhcmFtZXRlciBpZiBpdCBpcyBwcm92aWRlZC5cbiAqXG4gKiBJZiB0aGUgc2VydmVyIHJlc3BvbnNlIHdpdGggYW4gZXJyb3IsIGByZXN1bHQoKWAgd2lsbCBoYW5kbGUgSFRUUCBlcnJvcnMgYXBwcm9wcmlhdGVseSBieVxuICogcmV0aHJvd2luZyB0aGVtIGFzIGFuIGBBcGlSZXNwb25zZUVycm9yYCBpZiBwb3NzaWJsZSwgYW5kIG90aGVyd2lzZSByZXRocm93aW5nIHRoZSB1bmRlcmx5aW5nIHJlc3BvbnNlIGVycm9yLlxuICpcbiAqIEBwYXJhbSByZXFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQml0Z29SZXF1ZXN0PFJlc3BvbnNlUmVzdWx0VHlwZSA9IGFueT4oXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdFxuKTogQml0R29SZXF1ZXN0PFJlc3BvbnNlUmVzdWx0VHlwZT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihyZXEsIHtcbiAgICByZXN1bHQob3B0aW9uYWxGaWVsZD86IHN0cmluZykge1xuICAgICAgcmV0dXJuIHJlcS50aGVuKFxuICAgICAgICAocmVzcG9uc2UpID0+IGhhbmRsZVJlc3BvbnNlUmVzdWx0PFJlc3BvbnNlUmVzdWx0VHlwZT4ob3B0aW9uYWxGaWVsZCkocmVzcG9uc2UpLFxuICAgICAgICAoZXJyb3IpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIGV4dHJhY3RzIHRoZSBzcGVjaWZpZWQgcmVzcG9uc2UgYm9keSBwcm9wZXJ0eSBmcm9tIHRoZSByZXNwb25zZSBpZiBzdWNjZXNzZnVsLFxuICogb3RoZXJ3aXNlIHRocm93IGFuIGBBcGlFcnJvclJlc3BvbnNlYCBwYXJzZWQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keS5cbiAqIEBwYXJhbSBvcHRpb25hbEZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVSZXNwb25zZVJlc3VsdDxSZXNwb25zZVJlc3VsdFR5cGU+KFxuICBvcHRpb25hbEZpZWxkPzogc3RyaW5nXG4pOiAocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiBSZXNwb25zZVJlc3VsdFR5cGUge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSk6IFJlc3BvbnNlUmVzdWx0VHlwZSB7XG4gICAgaWYgKF8uaXNOdW1iZXIocmVzLnN0YXR1cykgJiYgcmVzLnN0YXR1cyA+PSAyMDAgJiYgcmVzLnN0YXR1cyA8IDMwMCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgdGhlIGJvZHkgaXMgbm9uLW51bGxpc2ggd2l0aCB0aGF0IHByb3BlcnR5LCByZXR1cm4gaXQ7XG4gICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gdGhlIGJvZHkgaWYgYXZhaWxhYmxlOyBpZiBub3QsIHJldHVybiB0aGUgdGV4dDsgYW5kIGZpbmFsbHkgZmFsbGJhY2sgdG8gdGhlIGVudGlyZSByZXNwb25zZS5cbiAgICAgICAgKG9wdGlvbmFsRmllbGQgJiYgcmVzLmJvZHkgJiYgcmVzLmJvZHlbb3B0aW9uYWxGaWVsZF0gIT09IHVuZGVmaW5lZCA/IHJlcy5ib2R5W29wdGlvbmFsRmllbGRdIDogcmVzLmJvZHkpID8/XG4gICAgICAgIHJlcy50ZXh0ID8/XG4gICAgICAgIHJlc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKHJlcyk7XG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdCByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSAodGhhdCBpcywgYSByZXNwb25zZSB3aXRoIGFuIEhUVFAgc3RhdHVzIGNvZGVcbiAqIGJldHdlZW4gMjAwIGFuZCAyOTkpLCBidXQgd2hpY2ggcmVzdWx0ZWQgaW4gYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgZXJyb3IgYW5kIHVzZSBpdCB0byBjb25zdHJ1Y3QgYW5kXG4gKiB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHJlc1xuICovXG5mdW5jdGlvbiBlcnJGcm9tUmVzcG9uc2U8UmVzcG9uc2VCb2R5VHlwZT4ocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogQXBpUmVzcG9uc2VFcnJvciB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVSZXNwb25zZUVycm9yU3RyaW5nKHJlcyk7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGNvbnN0IHJlc3VsdCA9IHJlcy5ib2R5IGFzIFJlc3BvbnNlQm9keVR5cGU7XG4gIGNvbnN0IGludmFsaWRUb2tlbiA9IF8uaGFzKHJlcy5oZWFkZXIsICd4LWF1dGgtcmVxdWlyZWQnKSAmJiByZXMuaGVhZGVyWyd4LWF1dGgtcmVxdWlyZWQnXSA9PT0gJ3RydWUnO1xuICBjb25zdCBuZWVkc090cCA9IHJlcy5ib2R5Py5uZWVkc09UUCAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IEFwaVJlc3BvbnNlRXJyb3IobWVzc2FnZSwgc3RhdHVzLCByZXN1bHQsIGludmFsaWRUb2tlbiwgbmVlZHNPdHApO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhbiBlcnJvciBvciBhbiBlcnJvciBjb250YWluaW5nIGFuIEhUVFAgcmVzcG9uc2UgYW5kIHVzZSBpdCB0byB0aHJvdyBhIHdlbGwtZm9ybWVkIGVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VFcnJvcihlOiBFcnJvciAmIHsgcmVzcG9uc2U/OiBzdXBlcmFnZW50LlJlc3BvbnNlIH0pOiBuZXZlciB7XG4gIGlmIChlLnJlc3BvbnNlKSB7XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKGUucmVzcG9uc2UpO1xuICB9XG4gIHRocm93IGU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIG1hbnkgd2F5cyBhIHJlcXVlc3QgY2FuIGZhaWwsIGFuZCBtYXkgd2F5cyBpbmZvcm1hdGlvbiBvbiB0aGF0IGZhaWx1cmUgY2FuIGJlXG4gKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBoYW5kbGUgdGhvc2UgY2FzZXMgYW5kIGNyZWF0ZSBhIHNhbmUgZXJyb3Igc3RyaW5nXG4gKiBAcGFyYW0gcmVzIFJlc3BvbnNlIGZyb20gYW4gSFRUUCByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRXJyb3JTdHJpbmcocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogc3RyaW5nIHtcbiAgbGV0IGVyclN0cmluZyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTsgLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2UnbGwgaGF2ZSB0aGUgc3RhdHVzIGNvZGVcbiAgaWYgKHJlcy5ib2R5Py5lcnJvcikge1xuICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2UgaG9wZSBmb3IsIHdoZXJlIHRoZSBzZXJ2ZXIgZ2l2ZXMgdXMgYSBuaWNlIGVycm9yIGZyb20gdGhlIEpTT04gYm9keVxuICAgIGVyclN0cmluZyA9IHJlcy5ib2R5LmVycm9yO1xuICB9IGVsc2UgaWYgKHJlcy50ZXh0KSB7XG4gICAgLy8gaWYgdGhlIHJlc3BvbnNlIGNhbWUgYmFjayBhcyB0ZXh0LCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgSFRNTCBhbmQgcmVtb3ZlIGFsbCB0YWdzLCBsZWF2aW5nIHVzXG4gICAgLy8ganVzdCB0aGUgYmFyZSB0ZXh0LCB3aGljaCB3ZSB0aGVuIHRyaW0gb2YgZXhjZXNzaXZlIG5ld2xpbmVzIGFuZCBsaW1pdCB0byBhIGNlcnRhaW4gbGVuZ3RoXG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYW5pdGl6ZWRUZXh0ID0gc2FuaXRpemVIdG1sKHJlcy50ZXh0LCB7IGFsbG93ZWRUYWdzOiBbXSB9KTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnRyaW0oKTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBlb2wubGYoc2FuaXRpemVkVGV4dCk7IC8vIHVzZSAnXFxuJyBmb3IgYWxsIG5ld2xpbmVzXG4gICAgICBzYW5pdGl6ZWRUZXh0ID0gXy5yZXBsYWNlKHNhbml0aXplZFRleHQsIC9cXG5bIHxcXHRdezEsfVxcbi9nLCAnXFxuXFxuJyk7IC8vIHJlbW92ZSB0aGUgc3BhY2VzL3RhYnMgYmV0d2VlbiBuZXdsaW5lc1xuICAgICAgc2FuaXRpemVkVGV4dCA9IF8ucmVwbGFjZShzYW5pdGl6ZWRUZXh0LCAvW1xcbl17Myx9L2csICdcXG5cXG4nKTsgLy8gaGF2ZSBhdCBtb3N0IDIgY29uc2VjdXRpdmUgbmV3bGluZXNcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnN1YnN0cmluZygwLCA1MDAwKTsgLy8gcHJldmVudCBtZXNzYWdlIGZyb20gZ2V0dGluZyB0b28gbGFyZ2VcbiAgICAgIGVyclN0cmluZyA9IGVyclN0cmluZyArICdcXG4nICsgc2FuaXRpemVkVGV4dDsgLy8gYWRkIGl0IHRvIG91ciBleGlzdGluZyBlcnJTdHJpbmcgKGF0IHRoaXMgcG9pbnQgdGhlIG1vcmUgaW5mbyB0aGUgYmV0dGVyISlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcmVzcG9uc2UncyBIVE1MIHdhcyB0b28gd2Fja3kgdG8gYmUgcGFyc2VkIGNsZWFubHlcbiAgICAgIGRlYnVnKCdnb3QgZXJyb3Igd2l0aCBtZXNzYWdlIFwiJXNcIiB3aGlsZSBjcmVhdGluZyByZXNwb25zZSBlcnJvciBzdHJpbmcgZnJvbSByZXNwb25zZTogJXMnLCBlLm1lc3NhZ2UsIHJlcy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyU3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSByZXF1ZXN0IGRhdGEgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGVudCB0eXBlLlxuICogSWYgZGF0YSBpcyBhbHJlYWR5IGEgc3RyaW5nLCByZXR1cm5zIGl0IGFzLWlzIHRvIHByZXNlcnZlIGV4YWN0IGJ5dGVzIGZvciBITUFDLlxuICogSWYgZGF0YSBpcyBhIEJ1ZmZlciwgY29udmVydHMgdG8gVVRGLTggc3RyaW5nLlxuICogSWYgZGF0YSBpcyBhbiBvYmplY3QsIHNlcmlhbGl6ZXMgaXQgYmFzZWQgb24gQ29udGVudC1UeXBlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdERhdGEocmVxOiBzdXBlcmFnZW50LlJlcXVlc3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IChyZXEgYXMgYW55KS5fZGF0YTtcblxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgLy8gQ29udmVydCBCdWZmZXIgdG8gVVRGLTggc3RyaW5nIGFuZCBtdXRhdGUgX2RhdGEgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICAgIC8vIFRoaXMgaXMgY3JpdGljYWw6IGlmIF9kYXRhIHN0YXlzIGFzIGEgQnVmZmVyLCBzdXBlcmFnZW50IHdpbGwgc2VyaWFsaXplIGl0XG4gICAgLy8gYXMgSlNPTiAoe1widHlwZVwiOlwiQnVmZmVyXCIsXCJkYXRhXCI6Wy4uLl19KSwgd2hpY2ggd29uJ3QgbWF0Y2ggdGhlIEhNQUMuXG4gICAgLy8gQnkgbXV0YXRpbmcgdG8gc3RyaW5nLCBzdXBlcmFnZW50IHNlbmRzIHRoZSBleGFjdCBieXRlcyB3ZSBoYXNoLlxuICAgIC8vIFRoaXMgaXMgc2FmZSBmb3IgcmV0cmllczogY2FsbGluZyBhZ2FpbiB3aXRoIGEgc3RyaW5nIHdpbGwgaGl0IHRoZSBlYXJseSByZXR1cm4gYWJvdmUuXG4gICAgY29uc3Qgc3RyaW5nRGF0YSA9IGRhdGEudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAocmVxIGFzIGFueSkuX2RhdGEgPSBzdHJpbmdEYXRhO1xuICAgIHJldHVybiBzdHJpbmdEYXRhO1xuICB9XG5cbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBvYmplY3QgZGF0YSBiYXNlZCBvbiBDb250ZW50LVR5cGVcbiAgbGV0IGNvbnRlbnRUeXBlID0gcmVxLmdldCgnQ29udGVudC1UeXBlJyk7XG4gIC8vIFBhcnNlIG91dCBqdXN0IHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgaGVhZGVyIChpZ25vcmUgdGhlIGNoYXJzZXQpXG4gIGlmIChjb250ZW50VHlwZSkge1xuICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gIH1cbiAgbGV0IHNlcmlhbGl6ZTogKChib2R5OiB1bmtub3duKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkO1xuICBjb25zdCBzZXJpYWxpemVycyA9IHN1cGVyYWdlbnQuc2VyaWFsaXplIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoY29udGVudFR5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlcmlhbGl6ZXJzLCBjb250ZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHNlcmlhbGl6ZXJzW2NvbnRlbnRUeXBlXTtcbiAgICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNlcmlhbGl6ZSA9IGNhbmRpZGF0ZSBhcyAoYm9keTogdW5rbm93bikgPT4gc3RyaW5nO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL1tcXC8rXWpzb25cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJ1aWx0LWluIEpTT04gc2VyaWFsaXplciBmb3IgSlNPTi1saWtlIGNvbnRlbnQgdHlwZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VyaWFsaXplcnMsICdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgICAgY29uc3QganNvblNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc1snYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBpZiAodHlwZW9mIGpzb25TZXJpYWxpemVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2VyaWFsaXplID0ganNvblNlcmlhbGl6ZXIgYXMgKGJvZHk6IHVua25vd24pID0+IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZXJpYWxpemUpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplKGRhdGEpO1xuICAgIChyZXEgYXMgYW55KS5fZGF0YSA9IHNlcmlhbGl6ZWQ7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNldCB0aGUgc3VwZXJhZ2VudCBxdWVyeSBzdHJpbmcgY29ycmVjdGx5IGZvciBicm93c2VycyBvciBub2RlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nKHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCk6IHZvaWQge1xuICBjb25zdCB1cmxEZXRhaWxzID0gdXJsTGliLnBhcnNlKHJlcS51cmwpO1xuXG4gIGxldCBxdWVyeVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyeTogc3RyaW5nW10gPSAocmVxIGFzIGFueSkuX3F1ZXJ5O1xuICBjb25zdCBxczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IChyZXEgYXMgYW55KS5xcztcbiAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAvLyBicm93c2VyIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5LmpvaW4oJyYnKTtcbiAgICAocmVxIGFzIGFueSkuX3F1ZXJ5ID0gW107XG4gIH0gZWxzZSBpZiAocXMpIHtcbiAgICAvLyBub2RlIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShxcyk7XG4gICAgKHJlcSBhcyBhbnkpLnFzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWVyeVN0cmluZykge1xuICAgIGlmICh1cmxEZXRhaWxzLnNlYXJjaCkge1xuICAgICAgdXJsRGV0YWlscy5zZWFyY2ggKz0gJyYnICsgcXVlcnlTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybERldGFpbHMuc2VhcmNoID0gJz8nICsgcXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIHJlcS51cmwgPSB1cmxMaWIuZm9ybWF0KHVybERldGFpbHMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBjb21wbGV0ZWQgdmVyaWZpY2F0aW9uIHJlc3BvbnNlIGFuZCB0aHJvdyBhIGRlc2NyaXB0aXZlIGBBcGlSZXNwb25zZUVycm9yYCBpZiBpdFxuICogaW5kaWNhdGVzIHRoZSByZXNwb25zZSBpcyBpbnZhbGlkIG9yIG91dHNpZGUgdGhlIGFjY2VwdGFibGUgdGltZSB3aW5kb3cuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFZlcmlmaWNhdGlvblJlc3BvbnNlKFxuICBiaXRnbzogQml0R29BUEksXG4gIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCxcbiAgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UsXG4gIHZlcmlmaWNhdGlvblJlc3BvbnNlOiBWZXJpZnlSZXNwb25zZUluZm9cbik6IHZvaWQge1xuICBpZiAoIXZlcmlmaWNhdGlvblJlc3BvbnNlLmlzVmFsaWQpIHtcbiAgICAvLyBMb2cgb25seSB0aGUgZmlyc3QgMTAgY2hhcmFjdGVycyBvZiB0aGUgdG9rZW4gdG8gZW5zdXJlIHRoZSBmdWxsIHRva2VuIGlzbid0IGxvZ2dlZC5cbiAgICBjb25zdCBwYXJ0aWFsQml0Z29Ub2tlbiA9IHRva2VuID8gdG9rZW4uc3Vic3RyaW5nKDAsIDEwKSA6ICcnO1xuICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IHtcbiAgICAgIGV4cGVjdGVkSG1hYzogdmVyaWZpY2F0aW9uUmVzcG9uc2UuZXhwZWN0ZWRIbWFjLFxuICAgICAgcmVjZWl2ZWRIbWFjOiByZXNwb25zZS5oZWFkZXIuaG1hYyxcbiAgICAgIGhtYWNJbnB1dDogdmVyaWZpY2F0aW9uUmVzcG9uc2Uuc2lnbmF0dXJlU3ViamVjdCxcbiAgICAgIHJlcXVlc3RUb2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiaXRnb1Rva2VuOiBwYXJ0aWFsQml0Z29Ub2tlbixcbiAgICB9O1xuICAgIGRlYnVnKCdJbnZhbGlkIHJlc3BvbnNlIEhNQUM6ICVPJywgZXJyb3JEZXRhaWxzKTtcbiAgICB0aHJvdyBuZXcgQXBpUmVzcG9uc2VFcnJvcignaW52YWxpZCByZXNwb25zZSBITUFDJywgNTExLCBlcnJvckRldGFpbHMpO1xuICB9XG5cbiAgaWYgKGJpdGdvLmdldEF1dGhWZXJzaW9uKCkgPT09IDMgJiYgIXZlcmlmaWNhdGlvblJlc3BvbnNlLmlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93KSB7XG4gICAgY29uc3QgZXJyb3JEZXRhaWxzID0ge1xuICAgICAgdGltZXN0YW1wOiByZXNwb25zZS5oZWFkZXIudGltZXN0YW1wLFxuICAgICAgdmVyaWZpY2F0aW9uVGltZTogdmVyaWZpY2F0aW9uUmVzcG9uc2UudmVyaWZpY2F0aW9uVGltZSxcbiAgICB9O1xuICAgIGRlYnVnKCdTZXJ2ZXIgcmVzcG9uc2Ugb3V0c2lkZSByZXNwb25zZSB2YWxpZGl0eSB0aW1lIHdpbmRvdzogJU8nLCBlcnJvckRldGFpbHMpO1xuICAgIHRocm93IG5ldyBBcGlSZXNwb25zZUVycm9yKCdzZXJ2ZXIgcmVzcG9uc2Ugb3V0c2lkZSByZXNwb25zZSB2YWxpZGl0eSB0aW1lIHdpbmRvdycsIDUxMSwgZXJyb3JEZXRhaWxzKTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSByZXNwb25zZSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgaXMgc2lnbmVkIGNvcnJlY3RseS5cbiAqIFJpZ2h0IG5vdywgaXQgaXMgdmVyeSBwZXJtaXNzaXZlIHdpdGggdGhlIHRpbWVzdGFtcCB2YXJpYW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVJlc3BvbnNlKFxuICBiaXRnbzogQml0R29BUEksXG4gIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1ldGhvZDogVmVyaWZ5UmVzcG9uc2VPcHRpb25zWydtZXRob2QnXSxcbiAgcmVxOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0LFxuICByZXNwb25zZTogc3VwZXJhZ2VudC5SZXNwb25zZSxcbiAgYXV0aFZlcnNpb246IEF1dGhWZXJzaW9uXG4pOiBzdXBlcmFnZW50LlJlc3BvbnNlIHtcbiAgaWYgKCFyZXEuaXNWMkF1dGhlbnRpY2F0ZWQgfHwgIXJlcS5hdXRoZW50aWNhdGlvblRva2VuKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgY29uc3QgdmVyaWZpY2F0aW9uUmVzcG9uc2UgPSBiaXRnby52ZXJpZnlSZXNwb25zZSh7XG4gICAgdXJsOiByZXEudXJsLFxuICAgIGhtYWM6IHJlc3BvbnNlLmhlYWRlci5obWFjLFxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB0ZXh0OiByZXNwb25zZS50ZXh0LFxuICAgIHRpbWVzdGFtcDogcmVzcG9uc2UuaGVhZGVyLnRpbWVzdGFtcCxcbiAgICB0b2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgbWV0aG9kLFxuICAgIGF1dGhWZXJzaW9uLFxuICB9KTtcblxuICBhc3NlcnRWZXJpZmljYXRpb25SZXNwb25zZShiaXRnbywgdG9rZW4sIHJlcSwgcmVzcG9uc2UsIHZlcmlmaWNhdGlvblJlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVzcG9uc2VBc3luYyhcbiAgYml0Z286IEJpdEdvQVBJLFxuICB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtZXRob2Q6IFZlcmlmeVJlc3BvbnNlT3B0aW9uc1snbWV0aG9kJ10sXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCxcbiAgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UsXG4gIGF1dGhWZXJzaW9uOiBBdXRoVmVyc2lvblxuKTogUHJvbWlzZTxzdXBlcmFnZW50LlJlc3BvbnNlPiB7XG4gIGlmICghcmVxLmlzVjJBdXRoZW50aWNhdGVkIHx8ICFyZXEuYXV0aGVudGljYXRpb25Ub2tlbikge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3BvbnNlID0gYXdhaXQgYml0Z28udmVyaWZ5UmVzcG9uc2VBc3luYyh7XG4gICAgdXJsOiByZXEudXJsLFxuICAgIGhtYWM6IHJlc3BvbnNlLmhlYWRlci5obWFjLFxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB0ZXh0OiByZXNwb25zZS50ZXh0LFxuICAgIHRpbWVzdGFtcDogcmVzcG9uc2UuaGVhZGVyLnRpbWVzdGFtcCxcbiAgICB0b2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgbWV0aG9kLFxuICAgIGF1dGhWZXJzaW9uLFxuICB9KTtcblxuICBhc3NlcnRWZXJpZmljYXRpb25SZXNwb25zZShiaXRnbywgdG9rZW4sIHJlcSwgcmVzcG9uc2UsIHZlcmlmaWNhdGlvblJlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuIl19