@bitgo-beta/sdk-api 1.10.1-beta.2094 → 1.10.1-beta.2096

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.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo-beta/sdk-api",
3
- "version": "1.10.1-beta.2094",
3
+ "version": "1.10.1-beta.2096",
4
4
  "description": "REST wrapper for BitGoJS",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -40,12 +40,12 @@
40
40
  ]
41
41
  },
42
42
  "dependencies": {
43
- "@bitgo-beta/argon2": "0.0.1-beta.435",
44
- "@bitgo-beta/sdk-core": "8.2.1-beta.2106",
45
- "@bitgo-beta/sdk-hmac": "1.0.1-beta.1498",
46
- "@bitgo-beta/sjcl": "1.0.2-beta.2372",
47
- "@bitgo-beta/unspents": "0.13.2-beta.2116",
48
- "@bitgo-beta/utxo-lib": "8.0.3-beta.2119",
43
+ "@bitgo-beta/argon2": "0.0.1-beta.437",
44
+ "@bitgo-beta/sdk-core": "8.2.1-beta.2108",
45
+ "@bitgo-beta/sdk-hmac": "1.0.1-beta.1500",
46
+ "@bitgo-beta/sjcl": "1.0.2-beta.2374",
47
+ "@bitgo-beta/unspents": "0.13.2-beta.2118",
48
+ "@bitgo-beta/utxo-lib": "8.0.3-beta.2121",
49
49
  "@types/superagent": "4.1.15",
50
50
  "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3",
51
51
  "debug": "3.1.0",
@@ -58,16 +58,13 @@
58
58
  "secrets.js-grempe": "^1.1.0",
59
59
  "superagent": "^9.0.1"
60
60
  },
61
- "devDependencies": {
62
- "crypto-browserify": "^3.12.0"
63
- },
64
61
  "overrides": {
65
62
  "degenerator": "5.0.0"
66
63
  },
67
64
  "resolutions": {
68
65
  "degenerator": "5.0.0"
69
66
  },
70
- "gitHead": "d9e7516ac891df98153ee3381693ca37e1473323",
67
+ "gitHead": "2add91a6f5c0cc3bab05e0a8f71dedf2189101d9",
71
68
  "files": [
72
69
  "dist"
73
70
  ]
@@ -1,14 +1,4 @@
1
- import { createDecipheriv, pbkdf2 } from 'crypto';
2
1
  import * as t from 'io-ts';
3
- /**
4
- * Minimal shape the decrypt path needs from a crypto module. Both `node:crypto`
5
- * and `crypto-browserify` satisfy this. Passing this in from tests lets the
6
- * browser-shim test suite exercise the real decrypt code instead of a copy.
7
- */
8
- export interface CryptoModule {
9
- pbkdf2: typeof pbkdf2;
10
- createDecipheriv: typeof createDecipheriv;
11
- }
12
2
  /**
13
3
  * Upper bound on PBKDF2 iterations accepted from a v1 envelope. BitGo-produced
14
4
  * v1 envelopes use 10,000; this cap is 10x that. Envelope validation enforces
@@ -36,24 +26,13 @@ declare const V1EnvelopeCodec: t.IntersectionC<[t.TypeC<{
36
26
  export type V1Envelope = t.TypeOf<typeof V1EnvelopeCodec>;
37
27
  export declare function parseV1Envelope(ciphertext: string): V1Envelope;
38
28
  /**
39
- * Decrypt a parsed v1 envelope given a crypto module.
40
- *
41
- * v1 = PBKDF2-SHA256(password, salt, iter, keyLen) then AES-CCM(key, nonce, ct||tag).
42
- * Byte-for-byte compatible with `sjcl.decrypt` output for the same envelope.
43
- *
44
- * Exported so tests can inject `crypto-browserify` and exercise the exact
45
- * runtime path the webpack browser bundle produces, without duplicating the
46
- * decrypt logic.
47
- */
48
- export declare function decryptV1WithCrypto(password: string, ciphertext: string, crypto: CryptoModule): Promise<string>;
49
- /**
50
- * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope.
29
+ * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope with Node's native
30
+ * `node:crypto`.
51
31
  *
52
- * Runs the same `node:crypto` code on server and browser. The BitGoJS webpack
53
- * config already maps `crypto` -> `crypto-browserify`, whose `aes-256-ccm` and
54
- * `pbkdf2` implementations are byte-compatible with Node's native ones and
55
- * with SJCL's envelope format. Parity is guarded by tests in
56
- * `test/unit/decryptV1.browser.ts`.
32
+ * Node runtimes only: the `crypto` webpack substitutes in browser bundles
33
+ * (`crypto-browserify`) has no working AES-CCM, so `decryptV1WithFallback`
34
+ * routes browser runtimes straight to the frozen SJCL decoder instead of
35
+ * ever calling this.
57
36
  */
58
37
  export declare function decryptV1(password: string, ciphertext: string): Promise<string>;
59
38
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"decryptV1.d.ts","sourceRoot":"","sources":["../../src/decryptV1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAG3B;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;CAC3C;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAU,CAAC;AAEnC;;;;GAIG;AACH,QAAA,MAAM,eAAe;;;;;;;;;;;;IAenB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAeD;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBrH;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErF"}
1
+ {"version":3,"file":"decryptV1.d.ts","sourceRoot":"","sources":["../../src/decryptV1.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAG3B;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAU,CAAC;AAEnC;;;;GAIG;AACH,QAAA,MAAM,eAAe;;;;;;;;;;;;IAenB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAeD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBrF"}
@@ -35,13 +35,11 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.V1_MAX_ITER = void 0;
37
37
  exports.parseV1Envelope = parseV1Envelope;
38
- exports.decryptV1WithCrypto = decryptV1WithCrypto;
39
38
  exports.decryptV1 = decryptV1;
40
39
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
40
  const crypto_1 = require("crypto");
42
41
  const t = __importStar(require("io-ts"));
43
42
  const util_1 = require("util");
44
- const defaultCrypto = { pbkdf2: crypto_1.pbkdf2, createDecipheriv: crypto_1.createDecipheriv };
45
43
  /**
46
44
  * Upper bound on PBKDF2 iterations accepted from a v1 envelope. BitGo-produced
47
45
  * v1 envelopes use 10,000; this cap is 10x that. Envelope validation enforces
@@ -93,16 +91,15 @@ function ccmNonceLength(plaintextLen) {
93
91
  return 15 - L;
94
92
  }
95
93
  /**
96
- * Decrypt a parsed v1 envelope given a crypto module.
94
+ * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope with Node's native
95
+ * `node:crypto`.
97
96
  *
98
- * v1 = PBKDF2-SHA256(password, salt, iter, keyLen) then AES-CCM(key, nonce, ct||tag).
99
- * Byte-for-byte compatible with `sjcl.decrypt` output for the same envelope.
100
- *
101
- * Exported so tests can inject `crypto-browserify` and exercise the exact
102
- * runtime path the webpack browser bundle produces, without duplicating the
103
- * decrypt logic.
97
+ * Node runtimes only: the `crypto` webpack substitutes in browser bundles
98
+ * (`crypto-browserify`) has no working AES-CCM, so `decryptV1WithFallback`
99
+ * routes browser runtimes straight to the frozen SJCL decoder instead of
100
+ * ever calling this.
104
101
  */
105
- async function decryptV1WithCrypto(password, ciphertext, crypto) {
102
+ async function decryptV1(password, ciphertext) {
106
103
  const env = parseV1Envelope(ciphertext);
107
104
  const salt = Buffer.from(env.salt, 'base64');
108
105
  const ivFull = Buffer.from(env.iv, 'base64');
@@ -117,24 +114,12 @@ async function decryptV1WithCrypto(password, ciphertext, crypto) {
117
114
  throw new Error('v1 decrypt: iv shorter than nonce');
118
115
  const iv = ivFull.subarray(0, nonceLen);
119
116
  const keyBytes = env.ks / 8;
120
- const key = await (0, util_1.promisify)(crypto.pbkdf2)(password, salt, env.iter, keyBytes, 'sha256');
121
- const decipher = crypto.createDecipheriv(`aes-${env.ks}-ccm`, key, iv, { authTagLength: tagBytes });
117
+ const key = await (0, util_1.promisify)(crypto_1.pbkdf2)(password, salt, env.iter, keyBytes, 'sha256');
118
+ const decipher = (0, crypto_1.createDecipheriv)(`aes-${env.ks}-ccm`, key, iv, { authTagLength: tagBytes });
122
119
  decipher.setAuthTag(authTag);
123
120
  const aad = env.adata ? Buffer.from(env.adata, 'utf8') : Buffer.alloc(0);
124
121
  decipher.setAAD(aad, { plaintextLength: cipher.length });
125
122
  const pt = Buffer.concat([decipher.update(cipher), decipher.final()]);
126
123
  return pt.toString('utf8');
127
124
  }
128
- /**
129
- * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope.
130
- *
131
- * Runs the same `node:crypto` code on server and browser. The BitGoJS webpack
132
- * config already maps `crypto` -> `crypto-browserify`, whose `aes-256-ccm` and
133
- * `pbkdf2` implementations are byte-compatible with Node's native ones and
134
- * with SJCL's envelope format. Parity is guarded by tests in
135
- * `test/unit/decryptV1.browser.ts`.
136
- */
137
- async function decryptV1(password, ciphertext) {
138
- return decryptV1WithCrypto(password, ciphertext, defaultCrypto);
139
- }
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdFYxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY3J5cHRWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREEsMENBUUM7QUF5QkQsa0RBd0JDO0FBV0QsOEJBRUM7QUF0SEQsbURBQWlGO0FBQ2pGLG1DQUFrRDtBQUNsRCx5Q0FBMkI7QUFDM0IsK0JBQWlDO0FBWWpDLE1BQU0sYUFBYSxHQUFpQixFQUFFLE1BQU0sRUFBTixlQUFNLEVBQUUsZ0JBQWdCLEVBQWhCLHlCQUFnQixFQUFFLENBQUM7QUFFakU7Ozs7R0FJRztBQUNVLFFBQUEsV0FBVyxHQUFHLE1BQU8sQ0FBQztBQUVuQzs7OztHQUlHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxFQUFFLElBQUEscUJBQVUsRUFBQyxDQUFDLEVBQUUsbUJBQVcsRUFBRSxNQUFNLENBQUM7UUFDeEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FB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SUFDcEcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFekQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBQ2xFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZTY0U3RyaW5nLCBib3VuZGVkSW50LCBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVEZWNpcGhlcml2LCBwYmtkZjIgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcblxuLyoqXG4gKiBNaW5pbWFsIHNoYXBlIHRoZSBkZWNyeXB0IHBhdGggbmVlZHMgZnJvbSBhIGNyeXB0byBtb2R1bGUuIEJvdGggYG5vZGU6Y3J5cHRvYFxuICogYW5kIGBjcnlwdG8tYnJvd3NlcmlmeWAgc2F0aXNmeSB0aGlzLiBQYXNzaW5nIHRoaXMgaW4gZnJvbSB0ZXN0cyBsZXRzIHRoZVxuICogYnJvd3Nlci1zaGltIHRlc3Qgc3VpdGUgZXhlcmNpc2UgdGhlIHJlYWwgZGVjcnlwdCBjb2RlIGluc3RlYWQgb2YgYSBjb3B5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyeXB0b01vZHVsZSB7XG4gIHBia2RmMjogdHlwZW9mIHBia2RmMjtcbiAgY3JlYXRlRGVjaXBoZXJpdjogdHlwZW9mIGNyZWF0ZURlY2lwaGVyaXY7XG59XG5cbmNvbnN0IGRlZmF1bHRDcnlwdG86IENyeXB0b01vZHVsZSA9IHsgcGJrZGYyLCBjcmVhdGVEZWNpcGhlcml2IH07XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gUEJLREYyIGl0ZXJhdGlvbnMgYWNjZXB0ZWQgZnJvbSBhIHYxIGVudmVsb3BlLiBCaXRHby1wcm9kdWNlZFxuICogdjEgZW52ZWxvcGVzIHVzZSAxMCwwMDA7IHRoaXMgY2FwIGlzIDEweCB0aGF0LiBFbnZlbG9wZSB2YWxpZGF0aW9uIGVuZm9yY2VzXG4gKiBpdCB1cCBmcm9udCBiZWZvcmUgYW55IEtERiB3b3JrIHJ1bnMuXG4gKi9cbmV4cG9ydCBjb25zdCBWMV9NQVhfSVRFUiA9IDEwMF8wMDA7XG5cbi8qKlxuICogaW8tdHMgY29kZWMgZm9yIGEgdjEgKFNKQ0wpIGVudmVsb3BlLlxuICpcbiAqIEVuZm9yY2VzIHRoZSBzaGFwZSBhbmQgdGhlIGBpdGVyYCBjYXAgdXAgZnJvbnQsIGJlZm9yZSBhbnkgS0RGIHdvcmsgcnVucy5cbiAqL1xuY29uc3QgVjFFbnZlbG9wZUNvZGVjID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoe1xuICAgIHY6IHQubGl0ZXJhbCgxKSxcbiAgICBpdGVyOiBib3VuZGVkSW50KDEsIFYxX01BWF9JVEVSLCAnaXRlcicpLFxuICAgIGtzOiB0LnVuaW9uKFt0LmxpdGVyYWwoMTI4KSwgdC5saXRlcmFsKDI1NildKSxcbiAgICB0czogdC51bmlvbihbdC5saXRlcmFsKDY0KSwgdC5saXRlcmFsKDk2KSwgdC5saXRlcmFsKDEyOCldKSxcbiAgICBtb2RlOiB0LmxpdGVyYWwoJ2NjbScpLFxuICAgIGNpcGhlcjogdC5saXRlcmFsKCdhZXMnKSxcbiAgICBzYWx0OiBiYXNlNjRTdHJpbmcsXG4gICAgaXY6IGJhc2U2NFN0cmluZyxcbiAgICBjdDogYmFzZTY0U3RyaW5nLFxuICB9KSxcbiAgdC5wYXJ0aWFsKHtcbiAgICBhZGF0YTogdC5zdHJpbmcsXG4gIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIFYxRW52ZWxvcGUgPSB0LlR5cGVPZjx0eXBlb2YgVjFFbnZlbG9wZUNvZGVjPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVjFFbnZlbG9wZShjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBWMUVudmVsb3BlIHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGludmFsaWQgSlNPTiBlbnZlbG9wZScpO1xuICB9XG4gIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoVjFFbnZlbG9wZUNvZGVjLCBwYXJzZWQsICd2MSBkZWNyeXB0OiBpbnZhbGlkIGVudmVsb3BlJyk7XG59XG5cbi8qKlxuICogQ0NNIGxlbmd0aCBmaWVsZCBzaXplIEwsIGluIGJ5dGVzLCBjaG9zZW4gdG8gZW5jb2RlIHRoZSBwbGFpbnRleHQgbGVuZ3RoLlxuICpcbiAqIFNKQ0wgcGlja3MgdGhlIHNtYWxsZXN0IEwgaW4gWzIsIDQpIHRoYXQgY2FuIHJlcHJlc2VudCB0aGUgcGxhaW50ZXh0IGxlbmd0aCxcbiAqIHRoZW4gZGVyaXZlcyB0aGUgbm9uY2UgbGVuZ3RoIGFzICgxNSAtIEwpLiBXZSBtaXJyb3IgdGhhdCBzbyBOb2RlJ3MgQ0NNXG4gKiB1c2VzIHRoZSBzYW1lIG5vbmNlIGZyYW1pbmcgYXMgdGhlIFNKQ0wgZW5jb2RlciBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gY2NtTm9uY2VMZW5ndGgocGxhaW50ZXh0TGVuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgTCA9IDI7XG4gIHdoaWxlIChMIDwgNCAmJiBwbGFpbnRleHRMZW4gPj0gTWF0aC5wb3coMiwgOCAqIEwpKSBMKys7XG4gIHJldHVybiAxNSAtIEw7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIHBhcnNlZCB2MSBlbnZlbG9wZSBnaXZlbiBhIGNyeXB0byBtb2R1bGUuXG4gKlxuICogdjEgPSBQQktERjItU0hBMjU2KHBhc3N3b3JkLCBzYWx0LCBpdGVyLCBrZXlMZW4pIHRoZW4gQUVTLUNDTShrZXksIG5vbmNlLCBjdHx8dGFnKS5cbiAqIEJ5dGUtZm9yLWJ5dGUgY29tcGF0aWJsZSB3aXRoIGBzamNsLmRlY3J5cHRgIG91dHB1dCBmb3IgdGhlIHNhbWUgZW52ZWxvcGUuXG4gKlxuICogRXhwb3J0ZWQgc28gdGVzdHMgY2FuIGluamVjdCBgY3J5cHRvLWJyb3dzZXJpZnlgIGFuZCBleGVyY2lzZSB0aGUgZXhhY3RcbiAqIHJ1bnRpbWUgcGF0aCB0aGUgd2VicGFjayBicm93c2VyIGJ1bmRsZSBwcm9kdWNlcywgd2l0aG91dCBkdXBsaWNhdGluZyB0aGVcbiAqIGRlY3J5cHQgbG9naWMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjFXaXRoQ3J5cHRvKHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZywgY3J5cHRvOiBDcnlwdG9Nb2R1bGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlbnYgPSBwYXJzZVYxRW52ZWxvcGUoY2lwaGVydGV4dCk7XG4gIGNvbnN0IHNhbHQgPSBCdWZmZXIuZnJvbShlbnYuc2FsdCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBpdkZ1bGwgPSBCdWZmZXIuZnJvbShlbnYuaXYsICdiYXNlNjQnKTtcbiAgY29uc3QgZnVsbCA9IEJ1ZmZlci5mcm9tKGVudi5jdCwgJ2Jhc2U2NCcpO1xuICBjb25zdCB0YWdCeXRlcyA9IGVudi50cyAvIDg7XG4gIGlmIChmdWxsLmxlbmd0aCA8IHRhZ0J5dGVzKSB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGNpcGhlcnRleHQgc2hvcnRlciB0aGFuIHRhZycpO1xuXG4gIGNvbnN0IGNpcGhlciA9IGZ1bGwuc3ViYXJyYXkoMCwgZnVsbC5sZW5ndGggLSB0YWdCeXRlcyk7XG4gIGNvbnN0IGF1dGhUYWcgPSBmdWxsLnN1YmFycmF5KGZ1bGwubGVuZ3RoIC0gdGFnQnl0ZXMpO1xuICBjb25zdCBub25jZUxlbiA9IGNjbU5vbmNlTGVuZ3RoKGNpcGhlci5sZW5ndGgpO1xuICBpZiAoaXZGdWxsLmxlbmd0aCA8IG5vbmNlTGVuKSB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGl2IHNob3J0ZXIgdGhhbiBub25jZScpO1xuICBjb25zdCBpdiA9IGl2RnVsbC5zdWJhcnJheSgwLCBub25jZUxlbik7XG5cbiAgY29uc3Qga2V5Qnl0ZXMgPSBlbnYua3MgLyA4O1xuICBjb25zdCBrZXk6IEJ1ZmZlciA9IGF3YWl0IHByb21pc2lmeShjcnlwdG8ucGJrZGYyKShwYXNzd29yZCwgc2FsdCwgZW52Lml0ZXIsIGtleUJ5dGVzLCAnc2hhMjU2Jyk7XG5cbiAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihgYWVzLSR7ZW52LmtzfS1jY21gLCBrZXksIGl2LCB7IGF1dGhUYWdMZW5ndGg6IHRhZ0J5dGVzIH0pO1xuICBkZWNpcGhlci5zZXRBdXRoVGFnKGF1dGhUYWcpO1xuICBjb25zdCBhYWQgPSBlbnYuYWRhdGEgPyBCdWZmZXIuZnJvbShlbnYuYWRhdGEsICd1dGY4JykgOiBCdWZmZXIuYWxsb2MoMCk7XG4gIGRlY2lwaGVyLnNldEFBRChhYWQsIHsgcGxhaW50ZXh0TGVuZ3RoOiBjaXBoZXIubGVuZ3RoIH0pO1xuXG4gIGNvbnN0IHB0ID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKGNpcGhlciksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgcmV0dXJuIHB0LnRvU3RyaW5nKCd1dGY4Jyk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIHYxIChTSkNMIFBCS0RGMi1TSEEyNTYgKyBBRVMtQ0NNKSBlbnZlbG9wZS5cbiAqXG4gKiBSdW5zIHRoZSBzYW1lIGBub2RlOmNyeXB0b2AgY29kZSBvbiBzZXJ2ZXIgYW5kIGJyb3dzZXIuIFRoZSBCaXRHb0pTIHdlYnBhY2tcbiAqIGNvbmZpZyBhbHJlYWR5IG1hcHMgYGNyeXB0b2AgLT4gYGNyeXB0by1icm93c2VyaWZ5YCwgd2hvc2UgYGFlcy0yNTYtY2NtYCBhbmRcbiAqIGBwYmtkZjJgIGltcGxlbWVudGF0aW9ucyBhcmUgYnl0ZS1jb21wYXRpYmxlIHdpdGggTm9kZSdzIG5hdGl2ZSBvbmVzIGFuZFxuICogd2l0aCBTSkNMJ3MgZW52ZWxvcGUgZm9ybWF0LiBQYXJpdHkgaXMgZ3VhcmRlZCBieSB0ZXN0cyBpblxuICogYHRlc3QvdW5pdC9kZWNyeXB0VjEuYnJvd3Nlci50c2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjEocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGRlY3J5cHRWMVdpdGhDcnlwdG8ocGFzc3dvcmQsIGNpcGhlcnRleHQsIGRlZmF1bHRDcnlwdG8pO1xufVxuIl19
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdFYxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY3J5cHRWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ0EsMENBUUM7QUF3QkQsOEJBd0JDO0FBNUZELG1EQUFpRjtBQUNqRixtQ0FBa0Q7QUFDbEQseUNBQTJCO0FBQzNCLCtCQUFpQztBQUVqQzs7OztHQUlHO0FBQ1UsUUFBQSxXQUFXLEdBQUcsTUFBTyxDQUFDO0FBRW5DOzs7O0dBSUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDTCxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDZixJQUFJLEVBQUUsSUFBQSxxQkFBVSxFQUFDLENBQUMsRUFBRSxtQkFBVyxFQUFFLE1BQU0sQ0FBQztRQUN4QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDdEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3hCLElBQUksRUFBRSx1QkFBWTtRQUNsQixFQUFFLEVBQUUsdUJBQVk7UUFDaEIsRUFBRSxFQUFFLHVCQUFZO0tBQ2pCLENBQUM7SUFDRixDQUFD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Q0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFekQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJhc2U2NFN0cmluZywgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlRGVjaXBoZXJpdiwgcGJrZGYyIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gUEJLREYyIGl0ZXJhdGlvbnMgYWNjZXB0ZWQgZnJvbSBhIHYxIGVudmVsb3BlLiBCaXRHby1wcm9kdWNlZFxuICogdjEgZW52ZWxvcGVzIHVzZSAxMCwwMDA7IHRoaXMgY2FwIGlzIDEweCB0aGF0LiBFbnZlbG9wZSB2YWxpZGF0aW9uIGVuZm9yY2VzXG4gKiBpdCB1cCBmcm9udCBiZWZvcmUgYW55IEtERiB3b3JrIHJ1bnMuXG4gKi9cbmV4cG9ydCBjb25zdCBWMV9NQVhfSVRFUiA9IDEwMF8wMDA7XG5cbi8qKlxuICogaW8tdHMgY29kZWMgZm9yIGEgdjEgKFNKQ0wpIGVudmVsb3BlLlxuICpcbiAqIEVuZm9yY2VzIHRoZSBzaGFwZSBhbmQgdGhlIGBpdGVyYCBjYXAgdXAgZnJvbnQsIGJlZm9yZSBhbnkgS0RGIHdvcmsgcnVucy5cbiAqL1xuY29uc3QgVjFFbnZlbG9wZUNvZGVjID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoe1xuICAgIHY6IHQubGl0ZXJhbCgxKSxcbiAgICBpdGVyOiBib3VuZGVkSW50KDEsIFYxX01BWF9JVEVSLCAnaXRlcicpLFxuICAgIGtzOiB0LnVuaW9uKFt0LmxpdGVyYWwoMTI4KSwgdC5saXRlcmFsKDI1NildKSxcbiAgICB0czogdC51bmlvbihbdC5saXRlcmFsKDY0KSwgdC5saXRlcmFsKDk2KSwgdC5saXRlcmFsKDEyOCldKSxcbiAgICBtb2RlOiB0LmxpdGVyYWwoJ2NjbScpLFxuICAgIGNpcGhlcjogdC5saXRlcmFsKCdhZXMnKSxcbiAgICBzYWx0OiBiYXNlNjRTdHJpbmcsXG4gICAgaXY6IGJhc2U2NFN0cmluZyxcbiAgICBjdDogYmFzZTY0U3RyaW5nLFxuICB9KSxcbiAgdC5wYXJ0aWFsKHtcbiAgICBhZGF0YTogdC5zdHJpbmcsXG4gIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIFYxRW52ZWxvcGUgPSB0LlR5cGVPZjx0eXBlb2YgVjFFbnZlbG9wZUNvZGVjPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVjFFbnZlbG9wZShjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBWMUVudmVsb3BlIHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGludmFsaWQgSlNPTiBlbnZlbG9wZScpO1xuICB9XG4gIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoVjFFbnZlbG9wZUNvZGVjLCBwYXJzZWQsICd2MSBkZWNyeXB0OiBpbnZhbGlkIGVudmVsb3BlJyk7XG59XG5cbi8qKlxuICogQ0NNIGxlbmd0aCBmaWVsZCBzaXplIEwsIGluIGJ5dGVzLCBjaG9zZW4gdG8gZW5jb2RlIHRoZSBwbGFpbnRleHQgbGVuZ3RoLlxuICpcbiAqIFNKQ0wgcGlja3MgdGhlIHNtYWxsZXN0IEwgaW4gWzIsIDQpIHRoYXQgY2FuIHJlcHJlc2VudCB0aGUgcGxhaW50ZXh0IGxlbmd0aCxcbiAqIHRoZW4gZGVyaXZlcyB0aGUgbm9uY2UgbGVuZ3RoIGFzICgxNSAtIEwpLiBXZSBtaXJyb3IgdGhhdCBzbyBOb2RlJ3MgQ0NNXG4gKiB1c2VzIHRoZSBzYW1lIG5vbmNlIGZyYW1pbmcgYXMgdGhlIFNKQ0wgZW5jb2RlciBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gY2NtTm9uY2VMZW5ndGgocGxhaW50ZXh0TGVuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgTCA9IDI7XG4gIHdoaWxlIChMIDwgNCAmJiBwbGFpbnRleHRMZW4gPj0gTWF0aC5wb3coMiwgOCAqIEwpKSBMKys7XG4gIHJldHVybiAxNSAtIEw7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIHYxIChTSkNMIFBCS0RGMi1TSEEyNTYgKyBBRVMtQ0NNKSBlbnZlbG9wZSB3aXRoIE5vZGUncyBuYXRpdmVcbiAqIGBub2RlOmNyeXB0b2AuXG4gKlxuICogTm9kZSBydW50aW1lcyBvbmx5OiB0aGUgYGNyeXB0b2Agd2VicGFjayBzdWJzdGl0dXRlcyBpbiBicm93c2VyIGJ1bmRsZXNcbiAqIChgY3J5cHRvLWJyb3dzZXJpZnlgKSBoYXMgbm8gd29ya2luZyBBRVMtQ0NNLCBzbyBgZGVjcnlwdFYxV2l0aEZhbGxiYWNrYFxuICogcm91dGVzIGJyb3dzZXIgcnVudGltZXMgc3RyYWlnaHQgdG8gdGhlIGZyb3plbiBTSkNMIGRlY29kZXIgaW5zdGVhZCBvZlxuICogZXZlciBjYWxsaW5nIHRoaXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjEocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZW52ID0gcGFyc2VWMUVudmVsb3BlKGNpcGhlcnRleHQpO1xuICBjb25zdCBzYWx0ID0gQnVmZmVyLmZyb20oZW52LnNhbHQsICdiYXNlNjQnKTtcbiAgY29uc3QgaXZGdWxsID0gQnVmZmVyLmZyb20oZW52Lml2LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGZ1bGwgPSBCdWZmZXIuZnJvbShlbnYuY3QsICdiYXNlNjQnKTtcbiAgY29uc3QgdGFnQnl0ZXMgPSBlbnYudHMgLyA4O1xuICBpZiAoZnVsbC5sZW5ndGggPCB0YWdCeXRlcykgdGhyb3cgbmV3IEVycm9yKCd2MSBkZWNyeXB0OiBjaXBoZXJ0ZXh0IHNob3J0ZXIgdGhhbiB0YWcnKTtcblxuICBjb25zdCBjaXBoZXIgPSBmdWxsLnN1YmFycmF5KDAsIGZ1bGwubGVuZ3RoIC0gdGFnQnl0ZXMpO1xuICBjb25zdCBhdXRoVGFnID0gZnVsbC5zdWJhcnJheShmdWxsLmxlbmd0aCAtIHRhZ0J5dGVzKTtcbiAgY29uc3Qgbm9uY2VMZW4gPSBjY21Ob25jZUxlbmd0aChjaXBoZXIubGVuZ3RoKTtcbiAgaWYgKGl2RnVsbC5sZW5ndGggPCBub25jZUxlbikgdGhyb3cgbmV3IEVycm9yKCd2MSBkZWNyeXB0OiBpdiBzaG9ydGVyIHRoYW4gbm9uY2UnKTtcbiAgY29uc3QgaXYgPSBpdkZ1bGwuc3ViYXJyYXkoMCwgbm9uY2VMZW4pO1xuXG4gIGNvbnN0IGtleUJ5dGVzID0gZW52LmtzIC8gODtcbiAgY29uc3Qga2V5OiBCdWZmZXIgPSBhd2FpdCBwcm9taXNpZnkocGJrZGYyKShwYXNzd29yZCwgc2FsdCwgZW52Lml0ZXIsIGtleUJ5dGVzLCAnc2hhMjU2Jyk7XG5cbiAgY29uc3QgZGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlcml2KGBhZXMtJHtlbnYua3N9LWNjbWAsIGtleSwgaXYsIHsgYXV0aFRhZ0xlbmd0aDogdGFnQnl0ZXMgfSk7XG4gIGRlY2lwaGVyLnNldEF1dGhUYWcoYXV0aFRhZyk7XG4gIGNvbnN0IGFhZCA9IGVudi5hZGF0YSA/IEJ1ZmZlci5mcm9tKGVudi5hZGF0YSwgJ3V0ZjgnKSA6IEJ1ZmZlci5hbGxvYygwKTtcbiAgZGVjaXBoZXIuc2V0QUFEKGFhZCwgeyBwbGFpbnRleHRMZW5ndGg6IGNpcGhlci5sZW5ndGggfSk7XG5cbiAgY29uc3QgcHQgPSBCdWZmZXIuY29uY2F0KFtkZWNpcGhlci51cGRhdGUoY2lwaGVyKSwgZGVjaXBoZXIuZmluYWwoKV0pO1xuICByZXR1cm4gcHQudG9TdHJpbmcoJ3V0ZjgnKTtcbn1cbiJdfQ==
@@ -20,11 +20,16 @@ export declare function encrypt(password: string, plaintext: string, options?: {
20
20
  /**
21
21
  * v1 decrypt with an SJCL safety net.
22
22
  *
23
- * Design intent during rollout: zero false negatives. Any native failure
24
- * (envelope shape our stricter codec rejects, framing bug, unsupported
25
- * algorithm, auth-tag mismatch, etc.) falls through to `sjcl.decrypt` so the
26
- * caller is never blocked. The only exception is an iter-cap violation,
27
- * which is rethrown to preserve DoS protection.
23
+ * Node: native `node:crypto` first, SJCL fallback. Design intent during
24
+ * rollout: zero false negatives. Any native failure (envelope shape our
25
+ * stricter codec rejects, framing bug, unsupported algorithm, auth-tag
26
+ * mismatch, etc.) falls through to `sjcl.decrypt` so the caller is never
27
+ * blocked. The only exception is an iter-cap violation, which is rethrown
28
+ * to preserve DoS protection.
29
+ *
30
+ * Browser/worker: skip the native attempt entirely (its polyfilled AES-CCM
31
+ * is broken) and go straight to `sjcl.decrypt`, after running the same
32
+ * `parseV1Envelope` iter-cap check the native path would run.
28
33
  *
29
34
  * The console.warn only fires when native fails AND SJCL succeeds -- i.e.
30
35
  * when the two engines disagree, which is the only signal worth
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAiCA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAa,EAC/D,SAAS,GAAE,OAA0B,GACpC,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAaD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAa,EAC/D,SAAS,GAAE,OAA4B,GACtC,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
@@ -42,30 +42,14 @@ const crypto_1 = require("crypto");
42
42
  const decryptV1_1 = require("./decryptV1");
43
43
  const encryptV2_1 = require("./encryptV2");
44
44
  /**
45
- * True when running in a bundled browser build. `browserify-aes` -- the AES
46
- * polyfill webpack substitutes for `node:crypto` in browser bundles -- has no
47
- * AES-CCM mode at all, so native v1 decrypt fails on literally every call
48
- * there. There's no point paying for the doomed native attempt (a full
49
- * PBKDF2 run) before falling back; go straight to SJCL.
45
+ * True in a browser main thread (`window`) or worker (`self`) runtime. The
46
+ * `crypto` webpack substitutes for `node:crypto` there (`crypto-browserify`,
47
+ * backed by `browserify-aes`) has no working AES-CCM, so a native v1 attempt
48
+ * would only pay for a doomed PBKDF2 run before falling back. Browser
49
+ * runtimes route v1 decrypt straight to SJCL instead.
50
50
  */
51
- const isBrowserRuntime = typeof window !== 'undefined';
52
- /**
53
- * SJCL has no upper bound on `iter`, so a hostile v1 envelope could burn CPU
54
- * running an inflated PBKDF2. Native decrypt's codec normally catches this
55
- * before any KDF work runs; the browser path skips native entirely, so it
56
- * needs this narrow check to preserve the same DoS protection.
57
- */
58
- function assertIterWithinCap(ciphertext) {
59
- let iter;
60
- try {
61
- iter = JSON.parse(ciphertext)?.iter;
62
- }
63
- catch {
64
- return; // malformed JSON -- let sjcl.decrypt raise its own error
65
- }
66
- if (typeof iter === 'number' && iter > decryptV1_1.V1_MAX_ITER) {
67
- throw new Error(`v1 decrypt: iter ${iter} exceeds cap of ${decryptV1_1.V1_MAX_ITER}`);
68
- }
51
+ function isBrowserRuntime() {
52
+ return typeof window !== 'undefined' || typeof self !== 'undefined';
69
53
  }
70
54
  /**
71
55
  * convert a 4 element Uint8Array to a 4 byte Number
@@ -132,11 +116,16 @@ function isIterCapViolation(err) {
132
116
  /**
133
117
  * v1 decrypt with an SJCL safety net.
134
118
  *
135
- * Design intent during rollout: zero false negatives. Any native failure
136
- * (envelope shape our stricter codec rejects, framing bug, unsupported
137
- * algorithm, auth-tag mismatch, etc.) falls through to `sjcl.decrypt` so the
138
- * caller is never blocked. The only exception is an iter-cap violation,
139
- * which is rethrown to preserve DoS protection.
119
+ * Node: native `node:crypto` first, SJCL fallback. Design intent during
120
+ * rollout: zero false negatives. Any native failure (envelope shape our
121
+ * stricter codec rejects, framing bug, unsupported algorithm, auth-tag
122
+ * mismatch, etc.) falls through to `sjcl.decrypt` so the caller is never
123
+ * blocked. The only exception is an iter-cap violation, which is rethrown
124
+ * to preserve DoS protection.
125
+ *
126
+ * Browser/worker: skip the native attempt entirely (its polyfilled AES-CCM
127
+ * is broken) and go straight to `sjcl.decrypt`, after running the same
128
+ * `parseV1Envelope` iter-cap check the native path would run.
140
129
  *
141
130
  * The console.warn only fires when native fails AND SJCL succeeds -- i.e.
142
131
  * when the two engines disagree, which is the only signal worth
@@ -148,9 +137,20 @@ function isIterCapViolation(err) {
148
137
  * `isBrowser` defaults to a real runtime check but is exposed so tests can
149
138
  * exercise the browser-only branch under Node.
150
139
  */
151
- async function decryptV1WithFallback(password, ciphertext, native = decryptV1_1.decryptV1, isBrowser = isBrowserRuntime) {
140
+ async function decryptV1WithFallback(password, ciphertext, native = decryptV1_1.decryptV1, isBrowser = isBrowserRuntime()) {
152
141
  if (isBrowser) {
153
- assertIterWithinCap(ciphertext);
142
+ try {
143
+ (0, decryptV1_1.parseV1Envelope)(ciphertext);
144
+ }
145
+ catch (parseErr) {
146
+ // Only honor the iter-cap violation: SJCL has no upper bound on `iter`,
147
+ // so falling through would let a hostile envelope burn CPU running an
148
+ // inflated PBKDF2. Any other shape rejection (e.g. a legacy envelope
149
+ // without a `v` field) is a form SJCL still accepts, so let
150
+ // sjcl.decrypt make the final call.
151
+ if (isIterCapViolation(parseErr))
152
+ throw parseErr;
153
+ }
154
154
  return sjcl.decrypt(password, ciphertext);
155
155
  }
156
156
  try {
@@ -197,4 +197,4 @@ async function decrypt(password, ciphertext) {
197
197
  }
198
198
  return decryptV1WithFallback(password, ciphertext);
199
199
  }
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUNBLGtDQUtDO0FBdUNELDBCQVNDO0FBZ0NELHNEQTRCQztBQU1ELDBCQWdCQztBQTlLRCx1REFBeUM7QUFDekMsbUNBQXFDO0FBRXJDLDJDQUFxRDtBQUNyRCwyQ0FBbUQ7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQWtCO0lBQzdDLElBQUksSUFBYSxDQUFDO0lBQ2xCLElBQUksQ0FBQztRQUNILElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxDQUFDLHlEQUF5RDtJQUNuRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLHVCQUFXLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLG1CQUFtQix1QkFBVyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQTZCO0lBQ3ZELElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxH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QUFLLENBQUMscUNBQXFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby1iZXRhL3NqY2wnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0VjEsIFYxX01BWF9JVEVSIH0gZnJvbSAnLi9kZWNyeXB0VjEnO1xuaW1wb3J0IHsgZGVjcnlwdFYyLCBlbmNyeXB0VjIgfSBmcm9tICcuL2VuY3J5cHRWMic7XG5cbi8qKlxuICogVHJ1ZSB3aGVuIHJ1bm5pbmcgaW4gYSBidW5kbGVkIGJyb3dzZXIgYnVpbGQuIGBicm93c2VyaWZ5LWFlc2AgLS0gdGhlIEFFU1xuICogcG9seWZpbGwgd2VicGFjayBzdWJzdGl0dXRlcyBmb3IgYG5vZGU6Y3J5cHRvYCBpbiBicm93c2VyIGJ1bmRsZXMgLS0gaGFzIG5vXG4gKiBBRVMtQ0NNIG1vZGUgYXQgYWxsLCBzbyBuYXRpdmUgdjEgZGVjcnlwdCBmYWlscyBvbiBsaXRlcmFsbHkgZXZlcnkgY2FsbFxuICogdGhlcmUuIFRoZXJlJ3Mgbm8gcG9pbnQgcGF5aW5nIGZvciB0aGUgZG9vbWVkIG5hdGl2ZSBhdHRlbXB0IChhIGZ1bGxcbiAqIFBCS0RGMiBydW4pIGJlZm9yZSBmYWxsaW5nIGJhY2s7IGdvIHN0cmFpZ2h0IHRvIFNKQ0wuXG4gKi9cbmNvbnN0IGlzQnJvd3NlclJ1bnRpbWUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblxuLyoqXG4gKiBTSkNMIGhhcyBubyB1cHBlciBib3VuZCBvbiBgaXRlcmAsIHNvIGEgaG9zdGlsZSB2MSBlbnZlbG9wZSBjb3VsZCBidXJuIENQVVxuICogcnVubmluZyBhbiBpbmZsYXRlZCBQQktERjIuIE5hdGl2ZSBkZWNyeXB0J3MgY29kZWMgbm9ybWFsbHkgY2F0Y2hlcyB0aGlzXG4gKiBiZWZvcmUgYW55IEtERiB3b3JrIHJ1bnM7IHRoZSBicm93c2VyIHBhdGggc2tpcHMgbmF0aXZlIGVudGlyZWx5LCBzbyBpdFxuICogbmVlZHMgdGhpcyBuYXJyb3cgY2hlY2sgdG8gcHJlc2VydmUgdGhlIHNhbWUgRG9TIHByb3RlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEl0ZXJXaXRoaW5DYXAoY2lwaGVydGV4dDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBpdGVyOiB1bmtub3duO1xuICB0cnkge1xuICAgIGl0ZXIgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpPy5pdGVyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIG1hbGZvcm1lZCBKU09OIC0tIGxldCBzamNsLmRlY3J5cHQgcmFpc2UgaXRzIG93biBlcnJvclxuICB9XG4gIGlmICh0eXBlb2YgaXRlciA9PT0gJ251bWJlcicgJiYgaXRlciA+IFYxX01BWF9JVEVSKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB2MSBkZWNyeXB0OiBpdGVyICR7aXRlcn0gZXhjZWVkcyBjYXAgb2YgJHtWMV9NQVhfSVRFUn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgYSA0IGVsZW1lbnQgVWludDhBcnJheSB0byBhIDQgYnl0ZSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0gYnl0ZXNcbiAqIEByZXR1cm4gNCBieXRlIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb1dvcmQoYnl0ZXM/OiBVaW50OEFycmF5IHwgbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoIShieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGJ5dGVzLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnl0ZXMgbXVzdCBiZSBhIFVpbnQ4QXJyYXkgd2l0aCBsZW5ndGggNCcpO1xuICB9XG4gIHJldHVybiBieXRlcy5yZWR1Y2UoKG51bSwgYnl0ZSkgPT4gbnVtICogMHgxMDAgKyBieXRlLCAwKTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCB2MSAoU0pDTCBQQktERjItU0hBMjU2ICsgQUVTLTI1Ni1DQ00pIGVuY3J5cHQgaGVscGVyLlxuICpcbiAqIE5vdCBleHBvcnRlZCBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgZW5jcnlwdC9kZWNyeXB0IHN1cmZhY2U6IGNhbGxlcnMgbXVzdCBub3QgdXNlXG4gKiB0aGlzIGRpcmVjdGx5LiB2MSBvdXRwdXQgaXMgcmVxdWVzdGVkIHZpYSBgZW5jcnlwdCguLi4sIHsgZW5jcnlwdGlvblZlcnNpb246IDEgfSlgLlxuICovXG5mdW5jdGlvbiBlbmNyeXB0VjEoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBzYWx0PzogQnVmZmVyOyBpdj86IEJ1ZmZlcjsgYWRhdGE/OiBzdHJpbmcgfVxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdCA9IG9wdGlvbnM/LnNhbHQgfHwgcmFuZG9tQnl0ZXMoOCk7XG4gIGlmIChzYWx0Lmxlbmd0aCAhPT0gOCkgdGhyb3cgbmV3IEVycm9yKCdzYWx0IG11c3QgYmUgOCBieXRlcycpO1xuICBjb25zdCBpdiA9IG9wdGlvbnM/Lml2IHx8IHJhbmRvbUJ5dGVzKDE2KTtcbiAgaWYgKGl2Lmxlbmd0aCAhPT0gMTYpIHRocm93IG5ldyBFcnJvcignaXYgbXVzdCBiZSAxNiBieXRlcycpO1xuXG4gIGNvbnN0IGVuY3J5cHRPcHRpb25zOiB7IGl0ZXI6IG51bWJlcjsga3M6IG51bWJlcjsgc2FsdDogbnVtYmVyW107IGl2OiBudW1iZXJbXTsgYWRhdGE/OiBzdHJpbmcgfSA9IHtcbiAgICBpdGVyOiAxMDAwMCxcbiAgICBrczogMjU2LFxuICAgIHNhbHQ6IFtieXRlc1RvV29yZChzYWx0LnNsaWNlKDAsIDQpKSwgYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSg0KSldLFxuICAgIGl2OiBbXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgwLCA0KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg0LCA4KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg4LCAxMikpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMTIsIDE2KSksXG4gICAgXSxcbiAgfTtcbiAgaWYgKG9wdGlvbnM/LmFkYXRhKSBlbmNyeXB0T3B0aW9ucy5hZGF0YSA9IG9wdGlvbnMuYWRhdGE7XG4gIHJldHVybiBzamNsLmVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgZW5jcnlwdE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVuY3J5cHQgYHBsYWludGV4dGAgd2l0aCBgcGFzc3dvcmRgLiBEZWZhdWx0cyB0byB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSkuXG4gKlxuICogUGFzcyBgZW5jcnlwdGlvblZlcnNpb246IDFgIHRvIHByb2R1Y2UgYSBsZWdhY3kgdjEgKFNKQ0wpIGVudmVsb3BlOyB0aGlzIGlzIHRoZVxuICogb25seSBzdXBwb3J0ZWQgd2F5IHRvIHJlcXVlc3QgdjEgZW5jcnlwdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHQoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBzYWx0PzogQnVmZmVyOyBpdj86IEJ1ZmZlcjsgYWRhdGE/OiBzdHJpbmc7IGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDIgfVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb25WZXJzaW9uID09PSAxKSB7XG4gICAgcmV0dXJuIGVuY3J5cHRWMShwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgYWRhdGE6IG9wdGlvbnM/LmFkYXRhIH0pO1xufVxuXG4vKipcbiAqIEl0ZXItY2FwIHZpb2xhdGlvbnMgYXJlIHRoZSBvbmx5IGVycm9yIHdlIHJlZnVzZSB0byBmYWxsIGJhY2sgb246IFNKQ0wgaGFzXG4gKiBubyB1cHBlciBib3VuZCBvbiBgaXRlcmAsIHNvIGZhbGxpbmcgdGhyb3VnaCB0byBpdCB3b3VsZCBsZXQgYSBob3N0aWxlXG4gKiBlbnZlbG9wZSBidXJuIENQVSBydW5uaW5nIGFuIGluZmxhdGVkIFBCS0RGMi4gRXZlcnl0aGluZyBlbHNlIC0tIGNvZGVjXG4gKiByZWplY3Rpb24gb2YgYSBzaGFwZSBTSkNMIHdvdWxkIGFjY2VwdCwgbmF0aXZlIGNyeXB0byBidWcsIGF1dGgtdGFnXG4gKiBtaXNtYXRjaCAtLSBpcyBzYWZlIHRvIGZhbGwgdGhyb3VnaCB0byBTSkNMLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJDYXBWaW9sYXRpb24oZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAvaXRlcjpcXHMqZXhwZWN0ZWQgaW50ZWdlcnxpdGVyIG91dCBvZiByYW5nZS9pLnRlc3QoZXJyLm1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIHYxIGRlY3J5cHQgd2l0aCBhbiBTSkNMIHNhZmV0eSBuZXQuXG4gKlxuICogRGVzaWduIGludGVudCBkdXJpbmcgcm9sbG91dDogemVybyBmYWxzZSBuZWdhdGl2ZXMuIEFueSBuYXRpdmUgZmFpbHVyZVxuICogKGVudmVsb3BlIHNoYXBlIG91ciBzdHJpY3RlciBjb2RlYyByZWplY3RzLCBmcmFtaW5nIGJ1ZywgdW5zdXBwb3J0ZWRcbiAqIGFsZ29yaXRobSwgYXV0aC10YWcgbWlzbWF0Y2gsIGV0Yy4pIGZhbGxzIHRocm91Z2ggdG8gYHNqY2wuZGVjcnlwdGAgc28gdGhlXG4gKiBjYWxsZXIgaXMgbmV2ZXIgYmxvY2tlZC4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGFuIGl0ZXItY2FwIHZpb2xhdGlvbixcbiAqIHdoaWNoIGlzIHJldGhyb3duIHRvIHByZXNlcnZlIERvUyBwcm90ZWN0aW9uLlxuICpcbiAqIFRoZSBjb25zb2xlLndhcm4gb25seSBmaXJlcyB3aGVuIG5hdGl2ZSBmYWlscyBBTkQgU0pDTCBzdWNjZWVkcyAtLSBpLmUuXG4gKiB3aGVuIHRoZSB0d28gZW5naW5lcyBkaXNhZ3JlZSwgd2hpY2ggaXMgdGhlIG9ubHkgc2lnbmFsIHdvcnRoXG4gKiBpbnZlc3RpZ2F0aW5nLiBXcm9uZyBwYXNzd29yZCBmYWlscyBib3RoIGVuZ2luZXMgc2lsZW50bHkgYW5kIHN1cmZhY2VzXG4gKiBTSkNMJ3MgYXV0aCBlcnJvciAobWFwcGVkIHVwc3RyZWFtIHRvIFwiaW5jb3JyZWN0IHBhc3N3b3JkXCIpLlxuICpcbiAqIGBuYXRpdmVgIGRlZmF1bHRzIHRvIHRoZSBtb2R1bGUncyBgZGVjcnlwdFYxYCBidXQgaXMgZXhwb3NlZCBhcyBhIHBhcmFtZXRlclxuICogc28gdGVzdHMgY2FuIGluamVjdCBhIHRocm93aW5nIHZlcnNpb24gdG8gZXhlcmNpc2UgdGhlIGZhbGxiYWNrIHBhdGguXG4gKiBgaXNCcm93c2VyYCBkZWZhdWx0cyB0byBhIHJlYWwgcnVudGltZSBjaGVjayBidXQgaXMgZXhwb3NlZCBzbyB0ZXN0cyBjYW5cbiAqIGV4ZXJjaXNlIHRoZSBicm93c2VyLW9ubHkgYnJhbmNoIHVuZGVyIE5vZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjFXaXRoRmFsbGJhY2soXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIGNpcGhlcnRleHQ6IHN0cmluZyxcbiAgbmF0aXZlOiAocHc6IHN0cmluZywgY3Q6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+ID0gZGVjcnlwdFYxLFxuICBpc0Jyb3dzZXI6IGJvb2xlYW4gPSBpc0Jyb3dzZXJSdW50aW1lXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNCcm93c2VyKSB7XG4gICAgYXNzZXJ0SXRlcldpdGhpbkNhcChjaXBoZXJ0ZXh0KTtcbiAgICByZXR1cm4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuYXRpdmUocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIChuYXRpdmVFcnIpIHtcbiAgICBpZiAoaXNJdGVyQ2FwVmlvbGF0aW9uKG5hdGl2ZUVycikpIHRocm93IG5hdGl2ZUVycjtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAoc2pjbEVycikge1xuICAgICAgLy8gQm90aCBlbmdpbmVzIHJlamVjdGVkIC0tIGFsbW9zdCBjZXJ0YWlubHkgYSByZWFsIGF1dGggZmFpbHVyZS5cbiAgICAgIC8vIFJldGhyb3cgU0pDTCdzIGVycm9yIHNvIEJpdEdvQVBJLmRlY3J5cHQgbWFwcyBpdCB0byBcImluY29ycmVjdCBwYXNzd29yZFwiLlxuICAgICAgdGhyb3cgc2pjbEVycjtcbiAgICB9XG4gICAgLy8gTmF0aXZlIGZhaWxlZCBidXQgU0pDTCBzdWNjZWVkZWQgLS0gcmVhbCBzaWduYWwsIGxvZyBmb3IgdGhlIG9wZXJhdG9yLlxuICAgIGNvbnN0IG1lc3NhZ2UgPSBuYXRpdmVFcnIgaW5zdGFuY2VvZiBFcnJvciA/IG5hdGl2ZUVyci5tZXNzYWdlIDogU3RyaW5nKG5hdGl2ZUVycik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oJ1tiaXRnby1zZGtdIHYxIG5hdGl2ZSBkZWNyeXB0IGZhaWxlZDsgU0pDTCBmYWxsYmFjayBzdWNjZWVkZWQ6JywgbWVzc2FnZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tZGV0ZWN0IHYxIChQQktERjItU0hBMjU2ICsgQUVTLUNDTSkgb3IgdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pXG4gKiBmcm9tIHRoZSBlbnZlbG9wZSBgdmAgZmllbGQgYW5kIGRlY3J5cHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBlbnZlbG9wZVZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgZW52ZWxvcGVWZXJzaW9uID0gZW52ZWxvcGUudjtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0OiBjaXBoZXJ0ZXh0IGlzIG5vdCB2YWxpZCBKU09OJyk7XG4gIH1cbiAgaWYgKGVudmVsb3BlVmVyc2lvbiA9PT0gMikge1xuICAgIC8vIERvIG5vdCBjYXRjaDogd3JvbmcgcGFzc3dvcmQgb24gdjIgbXVzdCBub3Qgc2lsZW50bHkgZmFsbCB0aHJvdWdoIHRvIHYxLlxuICAgIHJldHVybiBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9XG4gIGlmIChlbnZlbG9wZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbnZlbG9wZVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY3J5cHQ6IHVua25vd24gZW52ZWxvcGUgdmVyc2lvbiAke2VudmVsb3BlVmVyc2lvbn1gKTtcbiAgfVxuICByZXR1cm4gZGVjcnlwdFYxV2l0aEZhbGxiYWNrKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbn1cbiJdfQ==
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLGtDQUtDO0FBdUNELDBCQVNDO0FBcUNELHNEQXFDQztBQU1ELDBCQWdCQztBQTVLRCx1REFBeUM7QUFDekMsbUNBQXFDO0FBRXJDLDJDQUF5RDtBQUN6RCwyQ0FBbUQ7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUE2QjtJQUN2RCxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUNoQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixPQUF3RDtJQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUU3RCxNQUFNLGNBQWMsR0FBK0U7UUFDakcsSUFBSSxFQUFFLEtBQUs7UUFDWCxFQUFFLEVBQUUsR0FBRztRQUNQLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsRUFBRSxFQUFFO1lBQ0YsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzlCO0tBQ0YsQ0FBQztJQUNGLElBQUksT0FBTyxFQUFFLEtBQUs7UUFBRSxjQUFjLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDekQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FDM0IsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsT0FBbUY7SUFFbkYsSUFBSSxPQUFPLEVBQUUsaUJBQWlCLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxJQUFBLHFCQUFTLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZO0lBQ3RDLE9BQU8sR0FBRyxZQUFZLEtBQUssSUFBSSw2Q0FBNkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pHLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLFNBQXNELHFCQUFTLEVBQy9ELFlBQXFCLGdCQUFnQixFQUFFO0lBRXZDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUM7WUFDSCxJQUFBLDJCQUFlLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7WUFDbEIsd0VBQXdFO1lBQ3hFLHNFQUFzRTtZQUN0RSxxRUFBcUU7WUFDckUsNERBQTREO1lBQzVELG9DQUFvQztZQUNwQyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztnQkFBRSxNQUFNLFFBQVEsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7WUFBRSxNQUFNLFNBQVMsQ0FBQztRQUNuRCxJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDakIsaUVBQWlFO1lBQ2pFLDRFQUE0RTtZQUM1RSxNQUFNLE9BQU8sQ0FBQztRQUNoQixDQUFDO1FBQ0QseUVBQXlFO1FBQ3pFLE1BQU0sT0FBTyxHQUFHLFNBQVMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRixzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtJQUNoRSxJQUFJLGVBQW1DLENBQUM7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQiwyRUFBMkU7UUFDM0UsT0FBTyxJQUFBLHFCQUFTLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby1iZXRhL3NqY2wnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0VjEsIHBhcnNlVjFFbnZlbG9wZSB9IGZyb20gJy4vZGVjcnlwdFYxJztcbmltcG9ydCB7IGRlY3J5cHRWMiwgZW5jcnlwdFYyIH0gZnJvbSAnLi9lbmNyeXB0VjInO1xuXG4vKipcbiAqIFRydWUgaW4gYSBicm93c2VyIG1haW4gdGhyZWFkIChgd2luZG93YCkgb3Igd29ya2VyIChgc2VsZmApIHJ1bnRpbWUuIFRoZVxuICogYGNyeXB0b2Agd2VicGFjayBzdWJzdGl0dXRlcyBmb3IgYG5vZGU6Y3J5cHRvYCB0aGVyZSAoYGNyeXB0by1icm93c2VyaWZ5YCxcbiAqIGJhY2tlZCBieSBgYnJvd3NlcmlmeS1hZXNgKSBoYXMgbm8gd29ya2luZyBBRVMtQ0NNLCBzbyBhIG5hdGl2ZSB2MSBhdHRlbXB0XG4gKiB3b3VsZCBvbmx5IHBheSBmb3IgYSBkb29tZWQgUEJLREYyIHJ1biBiZWZvcmUgZmFsbGluZyBiYWNrLiBCcm93c2VyXG4gKiBydW50aW1lcyByb3V0ZSB2MSBkZWNyeXB0IHN0cmFpZ2h0IHRvIFNKQ0wgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gaXNCcm93c2VyUnVudGltZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBjb252ZXJ0IGEgNCBlbGVtZW50IFVpbnQ4QXJyYXkgdG8gYSA0IGJ5dGUgTnVtYmVyXG4gKlxuICogQHBhcmFtIGJ5dGVzXG4gKiBAcmV0dXJuIDQgYnl0ZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9Xb3JkKGJ5dGVzPzogVWludDhBcnJheSB8IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKCEoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBieXRlcy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J5dGVzIG11c3QgYmUgYSBVaW50OEFycmF5IHdpdGggbGVuZ3RoIDQnKTtcbiAgfVxuICByZXR1cm4gYnl0ZXMucmVkdWNlKChudW0sIGJ5dGUpID0+IG51bSAqIDB4MTAwICsgYnl0ZSwgMCk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgdjEgKFNKQ0wgUEJLREYyLVNIQTI1NiArIEFFUy0yNTYtQ0NNKSBlbmNyeXB0IGhlbHBlci5cbiAqXG4gKiBOb3QgZXhwb3J0ZWQgYXMgcGFydCBvZiB0aGUgcHVibGljIGVuY3J5cHQvZGVjcnlwdCBzdXJmYWNlOiBjYWxsZXJzIG11c3Qgbm90IHVzZVxuICogdGhpcyBkaXJlY3RseS4gdjEgb3V0cHV0IGlzIHJlcXVlc3RlZCB2aWEgYGVuY3J5cHQoLi4uLCB7IGVuY3J5cHRpb25WZXJzaW9uOiAxIH0pYC5cbiAqL1xuZnVuY3Rpb24gZW5jcnlwdFYxKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nIH1cbik6IHN0cmluZyB7XG4gIGNvbnN0IHNhbHQgPSBvcHRpb25zPy5zYWx0IHx8IHJhbmRvbUJ5dGVzKDgpO1xuICBpZiAoc2FsdC5sZW5ndGggIT09IDgpIHRocm93IG5ldyBFcnJvcignc2FsdCBtdXN0IGJlIDggYnl0ZXMnKTtcbiAgY29uc3QgaXYgPSBvcHRpb25zPy5pdiB8fCByYW5kb21CeXRlcygxNik7XG4gIGlmIChpdi5sZW5ndGggIT09IDE2KSB0aHJvdyBuZXcgRXJyb3IoJ2l2IG11c3QgYmUgMTYgYnl0ZXMnKTtcblxuICBjb25zdCBlbmNyeXB0T3B0aW9uczogeyBpdGVyOiBudW1iZXI7IGtzOiBudW1iZXI7IHNhbHQ6IG51bWJlcltdOyBpdjogbnVtYmVyW107IGFkYXRhPzogc3RyaW5nIH0gPSB7XG4gICAgaXRlcjogMTAwMDAsXG4gICAga3M6IDI1NixcbiAgICBzYWx0OiBbYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSgwLCA0KSksIGJ5dGVzVG9Xb3JkKHNhbHQuc2xpY2UoNCkpXSxcbiAgICBpdjogW1xuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMCwgNCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoNCwgOCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoOCwgMTIpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDEyLCAxNikpLFxuICAgIF0sXG4gIH07XG4gIGlmIChvcHRpb25zPy5hZGF0YSkgZW5jcnlwdE9wdGlvbnMuYWRhdGEgPSBvcHRpb25zLmFkYXRhO1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGBwbGFpbnRleHRgIHdpdGggYHBhc3N3b3JkYC4gRGVmYXVsdHMgdG8gdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pLlxuICpcbiAqIFBhc3MgYGVuY3J5cHRpb25WZXJzaW9uOiAxYCB0byBwcm9kdWNlIGEgbGVnYWN5IHYxIChTSkNMKSBlbnZlbG9wZTsgdGhpcyBpcyB0aGVcbiAqIG9ubHkgc3VwcG9ydGVkIHdheSB0byByZXF1ZXN0IHYxIGVuY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nOyBlbmNyeXB0aW9uVmVyc2lvbj86IDEgfCAyIH1cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiBlbmNyeXB0VjEocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhOiBvcHRpb25zPy5hZGF0YSB9KTtcbn1cblxuLyoqXG4gKiBJdGVyLWNhcCB2aW9sYXRpb25zIGFyZSB0aGUgb25seSBlcnJvciB3ZSByZWZ1c2UgdG8gZmFsbCBiYWNrIG9uOiBTSkNMIGhhc1xuICogbm8gdXBwZXIgYm91bmQgb24gYGl0ZXJgLCBzbyBmYWxsaW5nIHRocm91Z2ggdG8gaXQgd291bGQgbGV0IGEgaG9zdGlsZVxuICogZW52ZWxvcGUgYnVybiBDUFUgcnVubmluZyBhbiBpbmZsYXRlZCBQQktERjIuIEV2ZXJ5dGhpbmcgZWxzZSAtLSBjb2RlY1xuICogcmVqZWN0aW9uIG9mIGEgc2hhcGUgU0pDTCB3b3VsZCBhY2NlcHQsIG5hdGl2ZSBjcnlwdG8gYnVnLCBhdXRoLXRhZ1xuICogbWlzbWF0Y2ggLS0gaXMgc2FmZSB0byBmYWxsIHRocm91Z2ggdG8gU0pDTC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyQ2FwVmlvbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgL2l0ZXI6XFxzKmV4cGVjdGVkIGludGVnZXJ8aXRlciBvdXQgb2YgcmFuZ2UvaS50ZXN0KGVyci5tZXNzYWdlKTtcbn1cblxuLyoqXG4gKiB2MSBkZWNyeXB0IHdpdGggYW4gU0pDTCBzYWZldHkgbmV0LlxuICpcbiAqIE5vZGU6IG5hdGl2ZSBgbm9kZTpjcnlwdG9gIGZpcnN0LCBTSkNMIGZhbGxiYWNrLiBEZXNpZ24gaW50ZW50IGR1cmluZ1xuICogcm9sbG91dDogemVybyBmYWxzZSBuZWdhdGl2ZXMuIEFueSBuYXRpdmUgZmFpbHVyZSAoZW52ZWxvcGUgc2hhcGUgb3VyXG4gKiBzdHJpY3RlciBjb2RlYyByZWplY3RzLCBmcmFtaW5nIGJ1ZywgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtLCBhdXRoLXRhZ1xuICogbWlzbWF0Y2gsIGV0Yy4pIGZhbGxzIHRocm91Z2ggdG8gYHNqY2wuZGVjcnlwdGAgc28gdGhlIGNhbGxlciBpcyBuZXZlclxuICogYmxvY2tlZC4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGFuIGl0ZXItY2FwIHZpb2xhdGlvbiwgd2hpY2ggaXMgcmV0aHJvd25cbiAqIHRvIHByZXNlcnZlIERvUyBwcm90ZWN0aW9uLlxuICpcbiAqIEJyb3dzZXIvd29ya2VyOiBza2lwIHRoZSBuYXRpdmUgYXR0ZW1wdCBlbnRpcmVseSAoaXRzIHBvbHlmaWxsZWQgQUVTLUNDTVxuICogaXMgYnJva2VuKSBhbmQgZ28gc3RyYWlnaHQgdG8gYHNqY2wuZGVjcnlwdGAsIGFmdGVyIHJ1bm5pbmcgdGhlIHNhbWVcbiAqIGBwYXJzZVYxRW52ZWxvcGVgIGl0ZXItY2FwIGNoZWNrIHRoZSBuYXRpdmUgcGF0aCB3b3VsZCBydW4uXG4gKlxuICogVGhlIGNvbnNvbGUud2FybiBvbmx5IGZpcmVzIHdoZW4gbmF0aXZlIGZhaWxzIEFORCBTSkNMIHN1Y2NlZWRzIC0tIGkuZS5cbiAqIHdoZW4gdGhlIHR3byBlbmdpbmVzIGRpc2FncmVlLCB3aGljaCBpcyB0aGUgb25seSBzaWduYWwgd29ydGhcbiAqIGludmVzdGlnYXRpbmcuIFdyb25nIHBhc3N3b3JkIGZhaWxzIGJvdGggZW5naW5lcyBzaWxlbnRseSBhbmQgc3VyZmFjZXNcbiAqIFNKQ0wncyBhdXRoIGVycm9yIChtYXBwZWQgdXBzdHJlYW0gdG8gXCJpbmNvcnJlY3QgcGFzc3dvcmRcIikuXG4gKlxuICogYG5hdGl2ZWAgZGVmYXVsdHMgdG8gdGhlIG1vZHVsZSdzIGBkZWNyeXB0VjFgIGJ1dCBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyXG4gKiBzbyB0ZXN0cyBjYW4gaW5qZWN0IGEgdGhyb3dpbmcgdmVyc2lvbiB0byBleGVyY2lzZSB0aGUgZmFsbGJhY2sgcGF0aC5cbiAqIGBpc0Jyb3dzZXJgIGRlZmF1bHRzIHRvIGEgcmVhbCBydW50aW1lIGNoZWNrIGJ1dCBpcyBleHBvc2VkIHNvIHRlc3RzIGNhblxuICogZXhlcmNpc2UgdGhlIGJyb3dzZXItb25seSBicmFuY2ggdW5kZXIgTm9kZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRWMVdpdGhGYWxsYmFjayhcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgY2lwaGVydGV4dDogc3RyaW5nLFxuICBuYXRpdmU6IChwdzogc3RyaW5nLCBjdDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gPSBkZWNyeXB0VjEsXG4gIGlzQnJvd3NlcjogYm9vbGVhbiA9IGlzQnJvd3NlclJ1bnRpbWUoKVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHRyeSB7XG4gICAgICBwYXJzZVYxRW52ZWxvcGUoY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAocGFyc2VFcnIpIHtcbiAgICAgIC8vIE9ubHkgaG9ub3IgdGhlIGl0ZXItY2FwIHZpb2xhdGlvbjogU0pDTCBoYXMgbm8gdXBwZXIgYm91bmQgb24gYGl0ZXJgLFxuICAgICAgLy8gc28gZmFsbGluZyB0aHJvdWdoIHdvdWxkIGxldCBhIGhvc3RpbGUgZW52ZWxvcGUgYnVybiBDUFUgcnVubmluZyBhblxuICAgICAgLy8gaW5mbGF0ZWQgUEJLREYyLiBBbnkgb3RoZXIgc2hhcGUgcmVqZWN0aW9uIChlLmcuIGEgbGVnYWN5IGVudmVsb3BlXG4gICAgICAvLyB3aXRob3V0IGEgYHZgIGZpZWxkKSBpcyBhIGZvcm0gU0pDTCBzdGlsbCBhY2NlcHRzLCBzbyBsZXRcbiAgICAgIC8vIHNqY2wuZGVjcnlwdCBtYWtlIHRoZSBmaW5hbCBjYWxsLlxuICAgICAgaWYgKGlzSXRlckNhcFZpb2xhdGlvbihwYXJzZUVycikpIHRocm93IHBhcnNlRXJyO1xuICAgIH1cbiAgICByZXR1cm4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuYXRpdmUocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIChuYXRpdmVFcnIpIHtcbiAgICBpZiAoaXNJdGVyQ2FwVmlvbGF0aW9uKG5hdGl2ZUVycikpIHRocm93IG5hdGl2ZUVycjtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAoc2pjbEVycikge1xuICAgICAgLy8gQm90aCBlbmdpbmVzIHJlamVjdGVkIC0tIGFsbW9zdCBjZXJ0YWlubHkgYSByZWFsIGF1dGggZmFpbHVyZS5cbiAgICAgIC8vIFJldGhyb3cgU0pDTCdzIGVycm9yIHNvIEJpdEdvQVBJLmRlY3J5cHQgbWFwcyBpdCB0byBcImluY29ycmVjdCBwYXNzd29yZFwiLlxuICAgICAgdGhyb3cgc2pjbEVycjtcbiAgICB9XG4gICAgLy8gTmF0aXZlIGZhaWxlZCBidXQgU0pDTCBzdWNjZWVkZWQgLS0gcmVhbCBzaWduYWwsIGxvZyBmb3IgdGhlIG9wZXJhdG9yLlxuICAgIGNvbnN0IG1lc3NhZ2UgPSBuYXRpdmVFcnIgaW5zdGFuY2VvZiBFcnJvciA/IG5hdGl2ZUVyci5tZXNzYWdlIDogU3RyaW5nKG5hdGl2ZUVycik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oJ1tiaXRnby1zZGtdIHYxIG5hdGl2ZSBkZWNyeXB0IGZhaWxlZDsgU0pDTCBmYWxsYmFjayBzdWNjZWVkZWQ6JywgbWVzc2FnZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tZGV0ZWN0IHYxIChQQktERjItU0hBMjU2ICsgQUVTLUNDTSkgb3IgdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pXG4gKiBmcm9tIHRoZSBlbnZlbG9wZSBgdmAgZmllbGQgYW5kIGRlY3J5cHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBlbnZlbG9wZVZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgZW52ZWxvcGVWZXJzaW9uID0gZW52ZWxvcGUudjtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0OiBjaXBoZXJ0ZXh0IGlzIG5vdCB2YWxpZCBKU09OJyk7XG4gIH1cbiAgaWYgKGVudmVsb3BlVmVyc2lvbiA9PT0gMikge1xuICAgIC8vIERvIG5vdCBjYXRjaDogd3JvbmcgcGFzc3dvcmQgb24gdjIgbXVzdCBub3Qgc2lsZW50bHkgZmFsbCB0aHJvdWdoIHRvIHYxLlxuICAgIHJldHVybiBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9XG4gIGlmIChlbnZlbG9wZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbnZlbG9wZVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY3J5cHQ6IHVua25vd24gZW52ZWxvcGUgdmVyc2lvbiAke2VudmVsb3BlVmVyc2lvbn1gKTtcbiAgfVxuICByZXR1cm4gZGVjcnlwdFYxV2l0aEZhbGxiYWNrKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbn1cbiJdfQ==