@bitgo-beta/sdk-api 1.10.1-beta.2095 → 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 +8 -11
- package/dist/src/decryptV1.d.ts +6 -27
- package/dist/src/decryptV1.d.ts.map +1 -1
- package/dist/src/decryptV1.js +10 -25
- package/dist/src/encrypt.d.ts +10 -5
- package/dist/src/encrypt.d.ts.map +1 -1
- package/dist/src/encrypt.js +31 -31
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -11
- package/dist/test/unit/decryptV1.browser.d.ts +0 -2
- package/dist/test/unit/decryptV1.browser.d.ts.map +0 -1
- package/dist/test/unit/decryptV1.browser.js +0 -133
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/sdk-api",
|
|
3
|
-
"version": "1.10.1-beta.
|
|
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.
|
|
44
|
-
"@bitgo-beta/sdk-core": "8.2.1-beta.
|
|
45
|
-
"@bitgo-beta/sdk-hmac": "1.0.1-beta.
|
|
46
|
-
"@bitgo-beta/sjcl": "1.0.2-beta.
|
|
47
|
-
"@bitgo-beta/unspents": "0.13.2-beta.
|
|
48
|
-
"@bitgo-beta/utxo-lib": "8.0.3-beta.
|
|
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": "
|
|
67
|
+
"gitHead": "2add91a6f5c0cc3bab05e0a8f71dedf2189101d9",
|
|
71
68
|
"files": [
|
|
72
69
|
"dist"
|
|
73
70
|
]
|
package/dist/src/decryptV1.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
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":"
|
|
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"}
|
package/dist/src/decryptV1.js
CHANGED
|
@@ -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
|
|
94
|
+
* Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope with Node's native
|
|
95
|
+
* `node:crypto`.
|
|
97
96
|
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
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
|
|
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)(
|
|
121
|
-
const decipher =
|
|
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==
|
package/dist/src/encrypt.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
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":"
|
|
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"}
|
package/dist/src/encrypt.js
CHANGED
|
@@ -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
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
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
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLGtDQUtDO0FBdUNELDBCQVNDO0FBcUNELHNEQXFDQztBQU1ELDBCQWdCQztBQTVLRCx1REFBeUM7QUFDekMsbUNBQXFDO0FBRXJDLDJDQUF5RDtBQUN6RCwyQ0FBbUQ7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUE2QjtJQUN2RCxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUNoQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixPQUF3RDtJQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJ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Y2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby1iZXRhL3NqY2wnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0VjEsIHBhcnNlVjFFbnZlbG9wZSB9IGZyb20gJy4vZGVjcnlwdFYxJztcbmltcG9ydCB7IGRlY3J5cHRWMiwgZW5jcnlwdFYyIH0gZnJvbSAnLi9lbmNyeXB0VjInO1xuXG4vKipcbiAqIFRydWUgaW4gYSBicm93c2VyIG1haW4gdGhyZWFkIChgd2luZG93YCkgb3Igd29ya2VyIChgc2VsZmApIHJ1bnRpbWUuIFRoZVxuICogYGNyeXB0b2Agd2VicGFjayBzdWJzdGl0dXRlcyBmb3IgYG5vZGU6Y3J5cHRvYCB0aGVyZSAoYGNyeXB0by1icm93c2VyaWZ5YCxcbiAqIGJhY2tlZCBieSBgYnJvd3NlcmlmeS1hZXNgKSBoYXMgbm8gd29ya2luZyBBRVMtQ0NNLCBzbyBhIG5hdGl2ZSB2MSBhdHRlbXB0XG4gKiB3b3VsZCBvbmx5IHBheSBmb3IgYSBkb29tZWQgUEJLREYyIHJ1biBiZWZvcmUgZmFsbGluZyBiYWNrLiBCcm93c2VyXG4gKiBydW50aW1lcyByb3V0ZSB2MSBkZWNyeXB0IHN0cmFpZ2h0IHRvIFNKQ0wgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gaXNCcm93c2VyUnVudGltZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBjb252ZXJ0IGEgNCBlbGVtZW50IFVpbnQ4QXJyYXkgdG8gYSA0IGJ5dGUgTnVtYmVyXG4gKlxuICogQHBhcmFtIGJ5dGVzXG4gKiBAcmV0dXJuIDQgYnl0ZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9Xb3JkKGJ5dGVzPzogVWludDhBcnJheSB8IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKCEoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBieXRlcy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J5dGVzIG11c3QgYmUgYSBVaW50OEFycmF5IHdpdGggbGVuZ3RoIDQnKTtcbiAgfVxuICByZXR1cm4gYnl0ZXMucmVkdWNlKChudW0sIGJ5dGUpID0+IG51bSAqIDB4MTAwICsgYnl0ZSwgMCk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgdjEgKFNKQ0wgUEJLREYyLVNIQTI1NiArIEFFUy0yNTYtQ0NNKSBlbmNyeXB0IGhlbHBlci5cbiAqXG4gKiBOb3QgZXhwb3J0ZWQgYXMgcGFydCBvZiB0aGUgcHVibGljIGVuY3J5cHQvZGVjcnlwdCBzdXJmYWNlOiBjYWxsZXJzIG11c3Qgbm90IHVzZVxuICogdGhpcyBkaXJlY3RseS4gdjEgb3V0cHV0IGlzIHJlcXVlc3RlZCB2aWEgYGVuY3J5cHQoLi4uLCB7IGVuY3J5cHRpb25WZXJzaW9uOiAxIH0pYC5cbiAqL1xuZnVuY3Rpb24gZW5jcnlwdFYxKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nIH1cbik6IHN0cmluZyB7XG4gIGNvbnN0IHNhbHQgPSBvcHRpb25zPy5zYWx0IHx8IHJhbmRvbUJ5dGVzKDgpO1xuICBpZiAoc2FsdC5sZW5ndGggIT09IDgpIHRocm93IG5ldyBFcnJvcignc2FsdCBtdXN0IGJlIDggYnl0ZXMnKTtcbiAgY29uc3QgaXYgPSBvcHRpb25zPy5pdiB8fCByYW5kb21CeXRlcygxNik7XG4gIGlmIChpdi5sZW5ndGggIT09IDE2KSB0aHJvdyBuZXcgRXJyb3IoJ2l2IG11c3QgYmUgMTYgYnl0ZXMnKTtcblxuICBjb25zdCBlbmNyeXB0T3B0aW9uczogeyBpdGVyOiBudW1iZXI7IGtzOiBudW1iZXI7IHNhbHQ6IG51bWJlcltdOyBpdjogbnVtYmVyW107IGFkYXRhPzogc3RyaW5nIH0gPSB7XG4gICAgaXRlcjogMTAwMDAsXG4gICAga3M6IDI1NixcbiAgICBzYWx0OiBbYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSgwLCA0KSksIGJ5dGVzVG9Xb3JkKHNhbHQuc2xpY2UoNCkpXSxcbiAgICBpdjogW1xuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMCwgNCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoNCwgOCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoOCwgMTIpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDEyLCAxNikpLFxuICAgIF0sXG4gIH07XG4gIGlmIChvcHRpb25zPy5hZGF0YSkgZW5jcnlwdE9wdGlvbnMuYWRhdGEgPSBvcHRpb25zLmFkYXRhO1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGBwbGFpbnRleHRgIHdpdGggYHBhc3N3b3JkYC4gRGVmYXVsdHMgdG8gdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pLlxuICpcbiAqIFBhc3MgYGVuY3J5cHRpb25WZXJzaW9uOiAxYCB0byBwcm9kdWNlIGEgbGVnYWN5IHYxIChTSkNMKSBlbnZlbG9wZTsgdGhpcyBpcyB0aGVcbiAqIG9ubHkgc3VwcG9ydGVkIHdheSB0byByZXF1ZXN0IHYxIGVuY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nOyBlbmNyeXB0aW9uVmVyc2lvbj86IDEgfCAyIH1cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiBlbmNyeXB0VjEocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhOiBvcHRpb25zPy5hZGF0YSB9KTtcbn1cblxuLyoqXG4gKiBJdGVyLWNhcCB2aW9sYXRpb25zIGFyZSB0aGUgb25seSBlcnJvciB3ZSByZWZ1c2UgdG8gZmFsbCBiYWNrIG9uOiBTSkNMIGhhc1xuICogbm8gdXBwZXIgYm91bmQgb24gYGl0ZXJgLCBzbyBmYWxsaW5nIHRocm91Z2ggdG8gaXQgd291bGQgbGV0IGEgaG9zdGlsZVxuICogZW52ZWxvcGUgYnVybiBDUFUgcnVubmluZyBhbiBpbmZsYXRlZCBQQktERjIuIEV2ZXJ5dGhpbmcgZWxzZSAtLSBjb2RlY1xuICogcmVqZWN0aW9uIG9mIGEgc2hhcGUgU0pDTCB3b3VsZCBhY2NlcHQsIG5hdGl2ZSBjcnlwdG8gYnVnLCBhdXRoLXRhZ1xuICogbWlzbWF0Y2ggLS0gaXMgc2FmZSB0byBmYWxsIHRocm91Z2ggdG8gU0pDTC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyQ2FwVmlvbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgL2l0ZXI6XFxzKmV4cGVjdGVkIGludGVnZXJ8aXRlciBvdXQgb2YgcmFuZ2UvaS50ZXN0KGVyci5tZXNzYWdlKTtcbn1cblxuLyoqXG4gKiB2MSBkZWNyeXB0IHdpdGggYW4gU0pDTCBzYWZldHkgbmV0LlxuICpcbiAqIE5vZGU6IG5hdGl2ZSBgbm9kZTpjcnlwdG9gIGZpcnN0LCBTSkNMIGZhbGxiYWNrLiBEZXNpZ24gaW50ZW50IGR1cmluZ1xuICogcm9sbG91dDogemVybyBmYWxzZSBuZWdhdGl2ZXMuIEFueSBuYXRpdmUgZmFpbHVyZSAoZW52ZWxvcGUgc2hhcGUgb3VyXG4gKiBzdHJpY3RlciBjb2RlYyByZWplY3RzLCBmcmFtaW5nIGJ1ZywgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtLCBhdXRoLXRhZ1xuICogbWlzbWF0Y2gsIGV0Yy4pIGZhbGxzIHRocm91Z2ggdG8gYHNqY2wuZGVjcnlwdGAgc28gdGhlIGNhbGxlciBpcyBuZXZlclxuICogYmxvY2tlZC4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGFuIGl0ZXItY2FwIHZpb2xhdGlvbiwgd2hpY2ggaXMgcmV0aHJvd25cbiAqIHRvIHByZXNlcnZlIERvUyBwcm90ZWN0aW9uLlxuICpcbiAqIEJyb3dzZXIvd29ya2VyOiBza2lwIHRoZSBuYXRpdmUgYXR0ZW1wdCBlbnRpcmVseSAoaXRzIHBvbHlmaWxsZWQgQUVTLUNDTVxuICogaXMgYnJva2VuKSBhbmQgZ28gc3RyYWlnaHQgdG8gYHNqY2wuZGVjcnlwdGAsIGFmdGVyIHJ1bm5pbmcgdGhlIHNhbWVcbiAqIGBwYXJzZVYxRW52ZWxvcGVgIGl0ZXItY2FwIGNoZWNrIHRoZSBuYXRpdmUgcGF0aCB3b3VsZCBydW4uXG4gKlxuICogVGhlIGNvbnNvbGUud2FybiBvbmx5IGZpcmVzIHdoZW4gbmF0aXZlIGZhaWxzIEFORCBTSkNMIHN1Y2NlZWRzIC0tIGkuZS5cbiAqIHdoZW4gdGhlIHR3byBlbmdpbmVzIGRpc2FncmVlLCB3aGljaCBpcyB0aGUgb25seSBzaWduYWwgd29ydGhcbiAqIGludmVzdGlnYXRpbmcuIFdyb25nIHBhc3N3b3JkIGZhaWxzIGJvdGggZW5naW5lcyBzaWxlbnRseSBhbmQgc3VyZmFjZXNcbiAqIFNKQ0wncyBhdXRoIGVycm9yIChtYXBwZWQgdXBzdHJlYW0gdG8gXCJpbmNvcnJlY3QgcGFzc3dvcmRcIikuXG4gKlxuICogYG5hdGl2ZWAgZGVmYXVsdHMgdG8gdGhlIG1vZHVsZSdzIGBkZWNyeXB0VjFgIGJ1dCBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyXG4gKiBzbyB0ZXN0cyBjYW4gaW5qZWN0IGEgdGhyb3dpbmcgdmVyc2lvbiB0byBleGVyY2lzZSB0aGUgZmFsbGJhY2sgcGF0aC5cbiAqIGBpc0Jyb3dzZXJgIGRlZmF1bHRzIHRvIGEgcmVhbCBydW50aW1lIGNoZWNrIGJ1dCBpcyBleHBvc2VkIHNvIHRlc3RzIGNhblxuICogZXhlcmNpc2UgdGhlIGJyb3dzZXItb25seSBicmFuY2ggdW5kZXIgTm9kZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRWMVdpdGhGYWxsYmFjayhcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgY2lwaGVydGV4dDogc3RyaW5nLFxuICBuYXRpdmU6IChwdzogc3RyaW5nLCBjdDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gPSBkZWNyeXB0VjEsXG4gIGlzQnJvd3NlcjogYm9vbGVhbiA9IGlzQnJvd3NlclJ1bnRpbWUoKVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHRyeSB7XG4gICAgICBwYXJzZVYxRW52ZWxvcGUoY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAocGFyc2VFcnIpIHtcbiAgICAgIC8vIE9ubHkgaG9ub3IgdGhlIGl0ZXItY2FwIHZpb2xhdGlvbjogU0pDTCBoYXMgbm8gdXBwZXIgYm91bmQgb24gYGl0ZXJgLFxuICAgICAgLy8gc28gZmFsbGluZyB0aHJvdWdoIHdvdWxkIGxldCBhIGhvc3RpbGUgZW52ZWxvcGUgYnVybiBDUFUgcnVubmluZyBhblxuICAgICAgLy8gaW5mbGF0ZWQgUEJLREYyLiBBbnkgb3RoZXIgc2hhcGUgcmVqZWN0aW9uIChlLmcuIGEgbGVnYWN5IGVudmVsb3BlXG4gICAgICAvLyB3aXRob3V0IGEgYHZgIGZpZWxkKSBpcyBhIGZvcm0gU0pDTCBzdGlsbCBhY2NlcHRzLCBzbyBsZXRcbiAgICAgIC8vIHNqY2wuZGVjcnlwdCBtYWtlIHRoZSBmaW5hbCBjYWxsLlxuICAgICAgaWYgKGlzSXRlckNhcFZpb2xhdGlvbihwYXJzZUVycikpIHRocm93IHBhcnNlRXJyO1xuICAgIH1cbiAgICByZXR1cm4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuYXRpdmUocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIChuYXRpdmVFcnIpIHtcbiAgICBpZiAoaXNJdGVyQ2FwVmlvbGF0aW9uKG5hdGl2ZUVycikpIHRocm93IG5hdGl2ZUVycjtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAoc2pjbEVycikge1xuICAgICAgLy8gQm90aCBlbmdpbmVzIHJlamVjdGVkIC0tIGFsbW9zdCBjZXJ0YWlubHkgYSByZWFsIGF1dGggZmFpbHVyZS5cbiAgICAgIC8vIFJldGhyb3cgU0pDTCdzIGVycm9yIHNvIEJpdEdvQVBJLmRlY3J5cHQgbWFwcyBpdCB0byBcImluY29ycmVjdCBwYXNzd29yZFwiLlxuICAgICAgdGhyb3cgc2pjbEVycjtcbiAgICB9XG4gICAgLy8gTmF0aXZlIGZhaWxlZCBidXQgU0pDTCBzdWNjZWVkZWQgLS0gcmVhbCBzaWduYWwsIGxvZyBmb3IgdGhlIG9wZXJhdG9yLlxuICAgIGNvbnN0IG1lc3NhZ2UgPSBuYXRpdmVFcnIgaW5zdGFuY2VvZiBFcnJvciA/IG5hdGl2ZUVyci5tZXNzYWdlIDogU3RyaW5nKG5hdGl2ZUVycik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oJ1tiaXRnby1zZGtdIHYxIG5hdGl2ZSBkZWNyeXB0IGZhaWxlZDsgU0pDTCBmYWxsYmFjayBzdWNjZWVkZWQ6JywgbWVzc2FnZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tZGV0ZWN0IHYxIChQQktERjItU0hBMjU2ICsgQUVTLUNDTSkgb3IgdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pXG4gKiBmcm9tIHRoZSBlbnZlbG9wZSBgdmAgZmllbGQgYW5kIGRlY3J5cHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBlbnZlbG9wZVZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgZW52ZWxvcGVWZXJzaW9uID0gZW52ZWxvcGUudjtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0OiBjaXBoZXJ0ZXh0IGlzIG5vdCB2YWxpZCBKU09OJyk7XG4gIH1cbiAgaWYgKGVudmVsb3BlVmVyc2lvbiA9PT0gMikge1xuICAgIC8vIERvIG5vdCBjYXRjaDogd3JvbmcgcGFzc3dvcmQgb24gdjIgbXVzdCBub3Qgc2lsZW50bHkgZmFsbCB0aHJvdWdoIHRvIHYxLlxuICAgIHJldHVybiBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9XG4gIGlmIChlbnZlbG9wZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbnZlbG9wZVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY3J5cHQ6IHVua25vd24gZW52ZWxvcGUgdmVyc2lvbiAke2VudmVsb3BlVmVyc2lvbn1gKTtcbiAgfVxuICByZXR1cm4gZGVjcnlwdFYxV2l0aEZhbGxiYWNrKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbn1cbiJdfQ==
|