@bitgo/sdk-api 2.4.2 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,14 +15,14 @@ export declare const GCM_IV_LENGTH = 12;
15
15
  export declare const HKDF_SALT_LENGTH = 32;
16
16
  declare const V2EnvelopeCodec: t.IntersectionC<[t.TypeC<{
17
17
  v: t.LiteralC<2>;
18
+ iv: t.Type<string, string, unknown>;
19
+ ct: t.Type<string, string, unknown>;
20
+ }>, t.PartialC<{
18
21
  m: t.Type<number, number, unknown>;
19
22
  t: t.Type<number, number, unknown>;
20
23
  p: t.Type<number, number, unknown>;
21
24
  salt: t.Type<string, string, unknown>;
22
- iv: t.Type<string, string, unknown>;
23
- ct: t.Type<string, string, unknown>;
24
- }>, t.PartialC<{
25
- /** Base64-encoded per-call HKDF salt -- present only in session-produced envelopes */
25
+ /** Base64-encoded HKDF salt -- session envelopes and HKDF-only envelopes */
26
26
  hkdfSalt: t.Type<string, string, unknown>;
27
27
  /** Additional authenticated data for context binding (e.g. transaction hash + derivation path) */
28
28
  adata: t.StringC;
@@ -33,7 +33,7 @@ export declare function argon2ToHkdfKey(password: string, salt: Uint8Array, para
33
33
  iterations: number;
34
34
  parallelism: number;
35
35
  }): Promise<CryptoKey>;
36
- export declare function hkdfDeriveAesKey(hkdfKey: CryptoKey, hkdfSalt: Uint8Array, usage: KeyUsage): Promise<CryptoKey>;
36
+ export declare function hkdfDeriveAesKey(hkdfKey: CryptoKey, hkdfSalt: Uint8Array, usage: KeyUsage, info?: Uint8Array): Promise<CryptoKey>;
37
37
  export declare function aesGcmEncrypt(key: CryptoKey, iv: Uint8Array, plaintext: string, additionalData?: Uint8Array): Promise<Uint8Array>;
38
38
  export declare function aesGcmDecrypt(key: CryptoKey, iv: Uint8Array, ct: Uint8Array, additionalData?: Uint8Array): Promise<string>;
39
39
  export declare function parseV2Envelope(ciphertext: string): V2Envelope;
@@ -55,11 +55,10 @@ export declare function encryptV2(password: string, plaintext: string, options?:
55
55
  adata?: string;
56
56
  }): Promise<string>;
57
57
  /**
58
- * Decrypt a v2 envelope (Argon2id + AES-256-GCM).
59
- *
60
- * Handles both envelope types automatically:
61
- * - Standard (no hkdfSalt): Argon2id -> AES-GCM
62
- * - Session (hkdfSalt present): Argon2id -> HKDF -> AES-GCM
58
+ * Decrypt a v2 envelope. Auto-detects shape:
59
+ * - Standard (Argon2 params, no hkdfSalt): Argon2id -> AES-GCM
60
+ * - Session (Argon2 params + hkdfSalt): Argon2id -> HKDF -> AES-GCM
61
+ * - HKDF-only (hkdfSalt, no Argon2 params): HKDF(password) -> AES-GCM
63
62
  *
64
63
  * All parameters are stored in the envelope -- no session context required.
65
64
  */
@@ -1 +1 @@
1
- {"version":3,"file":"encryptV2.d.ts","sourceRoot":"","sources":["../../src/encryptV2.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAK3B;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAaX,qCAAqC;AACrC,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAOnC,QAAA,MAAM,eAAe;;;;;;;;;IAWjB,sFAAsF;;IAEtF,kGAAkG;;IAGpG,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AA6B1D,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,SAAS,CAAC,CAGpB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAQ9G;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAID;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBrF"}
1
+ {"version":3,"file":"encryptV2.d.ts","sourceRoot":"","sources":["../../src/encryptV2.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAK3B;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAaX,qCAAqC;AACrC,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAcnC,QAAA,MAAM,eAAe;;;;;;;;;IAWjB,4EAA4E;;IAE5E,kGAAkG;;IAGpG,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAgD1D,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,SAAS,CAAC,CAGpB;AAOD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,QAAQ,EACf,IAAI,GAAE,UAA8B,GACnC,OAAO,CAAC,SAAS,CAAC,CAQpB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAY9D;AAID;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrF"}
@@ -72,25 +72,41 @@ exports.GCM_IV_LENGTH = 12;
72
72
  /** HKDF per-call salt length in bytes */
73
73
  exports.HKDF_SALT_LENGTH = 32;
74
74
  /** Fixed HKDF info string for domain separation across BitGo v2 session keys */
75
- const HKDF_INFO = new TextEncoder().encode('bitgo-v2-session');
75
+ const HKDF_SESSION_INFO = new TextEncoder().encode('bitgo-v2-session');
76
+ /** HKDF info for high-entropy IKM (ECDH secrets). Distinct from session info. */
77
+ const HKDF_ONLY_INFO = new TextEncoder().encode('bitgo-v2-hkdf');
76
78
  // Envelope codec
79
+ //
80
+ // Two valid v2 shapes (presence rule enforced after decode):
81
+ // - Argon2 / session: m, t, p, salt required; hkdfSalt optional (session)
82
+ // - HKDF-only: hkdfSalt required; Argon2 params absent
77
83
  const V2EnvelopeCodec = t.intersection([
78
84
  t.type({
79
85
  v: t.literal(2),
80
- m: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.memorySize, 'memorySize'),
81
- t: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.iterations, 'iterations'),
82
- p: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.parallelism, 'parallelism'),
83
- salt: sdk_core_1.base64String,
84
86
  iv: sdk_core_1.base64String,
85
87
  ct: sdk_core_1.base64String,
86
88
  }),
87
89
  t.partial({
88
- /** Base64-encoded per-call HKDF salt -- present only in session-produced envelopes */
90
+ m: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.memorySize, 'memorySize'),
91
+ t: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.iterations, 'iterations'),
92
+ p: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.parallelism, 'parallelism'),
93
+ salt: sdk_core_1.base64String,
94
+ /** Base64-encoded HKDF salt -- session envelopes and HKDF-only envelopes */
89
95
  hkdfSalt: sdk_core_1.base64String,
90
96
  /** Additional authenticated data for context binding (e.g. transaction hash + derivation path) */
91
97
  adata: t.string,
92
98
  }),
93
99
  ]);
100
+ function hasArgon2Params(envelope) {
101
+ return (envelope.m !== undefined && envelope.t !== undefined && envelope.p !== undefined && envelope.salt !== undefined);
102
+ }
103
+ function isHkdfOnlyEnvelope(envelope) {
104
+ return (envelope.hkdfSalt !== undefined &&
105
+ envelope.m === undefined &&
106
+ envelope.t === undefined &&
107
+ envelope.p === undefined &&
108
+ envelope.salt === undefined);
109
+ }
94
110
  // Crypto helpers
95
111
  async function argon2Hash(password, salt, params) {
96
112
  return (0, argon2_1.argon2id)({
@@ -111,8 +127,12 @@ async function argon2ToHkdfKey(password, salt, params) {
111
127
  const keyBytes = await argon2Hash(password, salt, params);
112
128
  return subtle.importKey('raw', keyBytes, 'HKDF', false, ['deriveKey']);
113
129
  }
114
- function hkdfDeriveAesKey(hkdfKey, hkdfSalt, usage) {
115
- return subtle.deriveKey({ name: 'HKDF', hash: 'SHA-256', salt: hkdfSalt, info: HKDF_INFO }, hkdfKey, { name: 'AES-GCM', length: 256 }, false, [usage]);
130
+ async function passwordToHkdfKey(password) {
131
+ const ikm = new TextEncoder().encode(password);
132
+ return subtle.importKey('raw', ikm, 'HKDF', false, ['deriveKey']);
133
+ }
134
+ function hkdfDeriveAesKey(hkdfKey, hkdfSalt, usage, info = HKDF_SESSION_INFO) {
135
+ return subtle.deriveKey({ name: 'HKDF', hash: 'SHA-256', salt: hkdfSalt, info }, hkdfKey, { name: 'AES-GCM', length: 256 }, false, [usage]);
116
136
  }
117
137
  async function aesGcmEncrypt(key, iv, plaintext, additionalData) {
118
138
  const params = { name: 'AES-GCM', iv, tagLength: 128 };
@@ -136,7 +156,11 @@ function parseV2Envelope(ciphertext) {
136
156
  catch {
137
157
  throw new Error('v2 decrypt: invalid JSON envelope');
138
158
  }
139
- return (0, sdk_core_1.decodeWithCodec)(V2EnvelopeCodec, parsed, 'v2 decrypt: invalid envelope');
159
+ const envelope = (0, sdk_core_1.decodeWithCodec)(V2EnvelopeCodec, parsed, 'v2 decrypt: invalid envelope');
160
+ if (!hasArgon2Params(envelope) && !isHkdfOnlyEnvelope(envelope)) {
161
+ throw new Error('v2 decrypt: invalid envelope');
162
+ }
163
+ return envelope;
140
164
  }
141
165
  // Public API
142
166
  /**
@@ -175,21 +199,29 @@ async function encryptV2(password, plaintext, options) {
175
199
  return JSON.stringify(envelope);
176
200
  }
177
201
  /**
178
- * Decrypt a v2 envelope (Argon2id + AES-256-GCM).
179
- *
180
- * Handles both envelope types automatically:
181
- * - Standard (no hkdfSalt): Argon2id -> AES-GCM
182
- * - Session (hkdfSalt present): Argon2id -> HKDF -> AES-GCM
202
+ * Decrypt a v2 envelope. Auto-detects shape:
203
+ * - Standard (Argon2 params, no hkdfSalt): Argon2id -> AES-GCM
204
+ * - Session (Argon2 params + hkdfSalt): Argon2id -> HKDF -> AES-GCM
205
+ * - HKDF-only (hkdfSalt, no Argon2 params): HKDF(password) -> AES-GCM
183
206
  *
184
207
  * All parameters are stored in the envelope -- no session context required.
185
208
  */
186
209
  async function decryptV2(password, ciphertext) {
187
210
  const envelope = parseV2Envelope(ciphertext);
188
- const salt = new Uint8Array(Buffer.from(envelope.salt, 'base64'));
189
211
  const iv = new Uint8Array(Buffer.from(envelope.iv, 'base64'));
190
212
  const ct = new Uint8Array(Buffer.from(envelope.ct, 'base64'));
191
- const params = { memorySize: envelope.m, iterations: envelope.t, parallelism: envelope.p };
192
213
  const adataBytes = envelope.adata ? new TextEncoder().encode(envelope.adata) : undefined;
214
+ if (isHkdfOnlyEnvelope(envelope)) {
215
+ const hkdfKey = await passwordToHkdfKey(password);
216
+ const hkdfSalt = new Uint8Array(Buffer.from(envelope.hkdfSalt, 'base64'));
217
+ const aesKey = await hkdfDeriveAesKey(hkdfKey, hkdfSalt, 'decrypt', HKDF_ONLY_INFO);
218
+ return aesGcmDecrypt(aesKey, iv, ct, adataBytes);
219
+ }
220
+ if (!hasArgon2Params(envelope)) {
221
+ throw new Error('v2 decrypt: invalid envelope');
222
+ }
223
+ const salt = new Uint8Array(Buffer.from(envelope.salt, 'base64'));
224
+ const params = { memorySize: envelope.m, iterations: envelope.t, parallelism: envelope.p };
193
225
  if (envelope.hkdfSalt) {
194
226
  const hkdfKey = await argon2ToHkdfKey(password, salt, params);
195
227
  const hkdfSalt = new Uint8Array(Buffer.from(envelope.hkdfSalt, 'base64'));
@@ -199,4 +231,4 @@ async function decryptV2(password, ciphertext) {
199
231
  const key = await argon2ToAesKey(password, salt, params);
200
232
  return aesGcmDecrypt(key, iv, ct, adataBytes);
201
233
  }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdFYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuY3J5cHRWMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3RkEsMENBT0M7QUFFRCw0Q0FRQztBQUVELHNDQVVDO0FBRUQsc0NBVUM7QUFFRCwwQ0FRQztBQWFELDhCQXFDQztBQVdELDhCQWlCQztBQXpORCwwQ0FBeUM7QUFDekMsOENBQTRFO0FBQzVFLG1DQUFnRDtBQUNoRCx5Q0FBMkI7QUFFM0IsMEZBQTBGO0FBQzFGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLGtCQUFTLENBQUMsTUFBTSxDQUFDO0FBRTdEOztHQUVHO0FBQ1UsUUFBQSxlQUFlLEdBQUc7SUFDN0IsVUFBVSxFQUFFLEtBQUssRUFBRSxnQkFBZ0I7SUFDbkMsVUFBVSxFQUFFLENBQUM7SUFDYixXQUFXLEVBQUUsQ0FBQztJQUNkLFVBQVUsRUFBRSxFQUFFLEVBQUUsY0FBYztJQUM5QixVQUFVLEVBQUUsRUFBRSxFQUFFLGVBQWU7Q0FDdkIsQ0FBQztBQUVYOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixVQUFVLEVBQUUsTUFBTTtJQUNsQixVQUFVLEVBQUUsRUFBRTtJQUNkLFdBQVcsRUFBRSxFQUFFO0NBQ1AsQ0FBQztBQUVYLHFDQUFxQztBQUN4QixRQUFBLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFaEMseUNBQXlDO0FBQzVCLFFBQUEsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLGdGQUFnRjtBQUNoRixNQUFNLFNBQVMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRS9ELGlCQUFpQjtBQUVqQixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFD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QUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFekYsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEUsT0FBTyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekQsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFyZ29uMmlkIH0gZnJvbSAnQGJpdGdvL2FyZ29uMic7XG5pbXBvcnQgeyBiYXNlNjRTdHJpbmcsIGJvdW5kZWRJbnQsIGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcywgd2ViY3J5cHRvIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuXG4vKiogV2ViIENyeXB0byBzdWJ0bGUg4oCUIGJyb3dzZXIgZ2xvYmFsIGluIERPTTsgTm9kZS9FbGVjdHJvbiBtYWluIG11c3QgdXNlIGB3ZWJjcnlwdG9gLiAqL1xuY29uc3Qgc3VidGxlID0gZ2xvYmFsVGhpcy5jcnlwdG8/LnN1YnRsZSA/PyB3ZWJjcnlwdG8uc3VidGxlO1xuXG4vKiogRGVmYXVsdCBBcmdvbjJpZCBwYXJhbWV0ZXJzIHBlciBSRkMgOTEwNiBzZWNvbmQgcmVjb21tZW5kYXRpb25cbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMDYjc2VjdGlvbi00XG4gKi9cbmV4cG9ydCBjb25zdCBBUkdPTjJfREVGQVVMVFMgPSB7XG4gIG1lbW9yeVNpemU6IDY1NTM2LCAvLyA2NCBNaUIgaW4gS2lCXG4gIGl0ZXJhdGlvbnM6IDMsXG4gIHBhcmFsbGVsaXNtOiA0LFxuICBoYXNoTGVuZ3RoOiAzMiwgLy8gMjU2LWJpdCBrZXlcbiAgc2FsdExlbmd0aDogMTYsIC8vIDEyOC1iaXQgc2FsdFxufSBhcyBjb25zdDtcblxuLyoqIE1heGltdW0gYWxsb3dlZCBBcmdvbjJpZCBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgRG9TIHZpYSBjcmFmdGVkIGVudmVsb3Blcy5cbiAqIG1lbW9yeVNpemU6IDI1NiBNaUIgKDR4IGRlZmF1bHQpIC0tIGNhcHMgbWVtb3J5IGFsbG9jYXRpb24gb24gdW50cnVzdGVkIGlucHV0LlxuICogaXRlcmF0aW9uczogMTYgLS0gY2FwcyBDUFUgdGltZS5cbiAqIHBhcmFsbGVsaXNtOiAxNiAtLSBjYXBzIHRocmVhZCBjb3VudC5cbiAqL1xuY29uc3QgQVJHT04yX01BWCA9IHtcbiAgbWVtb3J5U2l6ZTogMjYyMTQ0LFxuICBpdGVyYXRpb25zOiAxNixcbiAgcGFyYWxsZWxpc206IDE2LFxufSBhcyBjb25zdDtcblxuLyoqIEFFUy0yNTYtR0NNIElWIGxlbmd0aCBpbiBieXRlcyAqL1xuZXhwb3J0IGNvbnN0IEdDTV9JVl9MRU5HVEggPSAxMjtcblxuLyoqIEhLREYgcGVyLWNhbGwgc2FsdCBsZW5ndGggaW4gYnl0ZXMgKi9cbmV4cG9ydCBjb25zdCBIS0RGX1NBTFRfTEVOR1RIID0gMzI7XG5cbi8qKiBGaXhlZCBIS0RGIGluZm8gc3RyaW5nIGZvciBkb21haW4gc2VwYXJhdGlvbiBhY3Jvc3MgQml0R28gdjIgc2Vzc2lvbiBrZXlzICovXG5jb25zdCBIS0RGX0lORk8gPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ2JpdGdvLXYyLXNlc3Npb24nKTtcblxuLy8gRW52ZWxvcGUgY29kZWNcblxuY29uc3QgVjJFbnZlbG9wZUNvZGVjID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoe1xuICAgIHY6IHQubGl0ZXJhbCgyKSxcbiAgICBtOiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVgubWVtb3J5U2l6ZSwgJ21lbW9yeVNpemUnKSxcbiAgICB0OiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVguaXRlcmF0aW9ucywgJ2l0ZXJhdGlvbnMnKSxcbiAgICBwOiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVgucGFyYWxsZWxpc20sICdwYXJhbGxlbGlzbScpLFxuICAgIHNhbHQ6IGJhc2U2NFN0cmluZyxcbiAgICBpdjogYmFzZTY0U3RyaW5nLFxuICAgIGN0OiBiYXNlNjRTdHJpbmcsXG4gIH0pLFxuICB0LnBhcnRpYWwoe1xuICAgIC8qKiBCYXNlNjQtZW5jb2RlZCBwZXItY2FsbCBIS0RGIHNhbHQgLS0gcHJlc2VudCBvbmx5IGluIHNlc3Npb24tcHJvZHVjZWQgZW52ZWxvcGVzICovXG4gICAgaGtkZlNhbHQ6IGJhc2U2NFN0cmluZyxcbiAgICAvKiogQWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEgZm9yIGNvbnRleHQgYmluZGluZyAoZS5nLiB0cmFuc2FjdGlvbiBoYXNoICsgZGVyaXZhdGlvbiBwYXRoKSAqL1xuICAgIGFkYXRhOiB0LnN0cmluZyxcbiAgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgVjJFbnZlbG9wZSA9IHQuVHlwZU9mPHR5cGVvZiBWMkVudmVsb3BlQ29kZWM+O1xuXG4vLyBDcnlwdG8gaGVscGVyc1xuXG5hc3luYyBmdW5jdGlvbiBhcmdvbjJIYXNoKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBzYWx0OiBVaW50OEFycmF5LFxuICBwYXJhbXM6IHsgbWVtb3J5U2l6ZTogbnVtYmVyOyBpdGVyYXRpb25zOiBudW1iZXI7IHBhcmFsbGVsaXNtOiBudW1iZXIgfVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiBhcmdvbjJpZCh7XG4gICAgcGFzc3dvcmQsXG4gICAgc2FsdCxcbiAgICBtZW1vcnlTaXplOiBwYXJhbXMubWVtb3J5U2l6ZSxcbiAgICBpdGVyYXRpb25zOiBwYXJhbXMuaXRlcmF0aW9ucyxcbiAgICBwYXJhbGxlbGlzbTogcGFyYW1zLnBhcmFsbGVsaXNtLFxuICAgIGhhc2hMZW5ndGg6IEFSR09OMl9ERUZBVUxUUy5oYXNoTGVuZ3RoLFxuICAgIG91dHB1dFR5cGU6ICdiaW5hcnknLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXJnb24yVG9BZXNLZXkoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHNhbHQ6IFVpbnQ4QXJyYXksXG4gIHBhcmFtczogeyBtZW1vcnlTaXplOiBudW1iZXI7IGl0ZXJhdGlvbnM6IG51bWJlcjsgcGFyYWxsZWxpc206IG51bWJlciB9XG4pOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICBjb25zdCBrZXlCeXRlcyA9IGF3YWl0IGFyZ29uMkhhc2gocGFzc3dvcmQsIHNhbHQsIHBhcmFtcyk7XG4gIHJldHVybiBzdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCBrZXlCeXRlcywgeyBuYW1lOiAnQUVTLUdDTScgfSwgZmFsc2UsIFsnZW5jcnlwdCcsICdkZWNyeXB0J10pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJnb24yVG9Ia2RmS2V5KFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBzYWx0OiBVaW50OEFycmF5LFxuICBwYXJhbXM6IHsgbWVtb3J5U2l6ZTogbnVtYmVyOyBpdGVyYXRpb25zOiBudW1iZXI7IHBhcmFsbGVsaXNtOiBudW1iZXIgfVxuKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgY29uc3Qga2V5Qnl0ZXMgPSBhd2FpdCBhcmdvbjJIYXNoKHBhc3N3b3JkLCBzYWx0LCBwYXJhbXMpO1xuICByZXR1cm4gc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5Qnl0ZXMsICdIS0RGJywgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGtkZkRlcml2ZUFlc0tleShoa2RmS2V5OiBDcnlwdG9LZXksIGhrZGZTYWx0OiBVaW50OEFycmF5LCB1c2FnZTogS2V5VXNhZ2UpOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICByZXR1cm4gc3VidGxlLmRlcml2ZUtleShcbiAgICB7IG5hbWU6ICdIS0RGJywgaGFzaDogJ1NIQS0yNTYnLCBzYWx0OiBoa2RmU2FsdCwgaW5mbzogSEtERl9JTkZPIH0sXG4gICAgaGtkZktleSxcbiAgICB7IG5hbWU6ICdBRVMtR0NNJywgbGVuZ3RoOiAyNTYgfSxcbiAgICBmYWxzZSxcbiAgICBbdXNhZ2VdXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZXNHY21FbmNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgaXY6IFVpbnQ4QXJyYXksXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICBhZGRpdGlvbmFsRGF0YT86IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBwYXJhbXM6IEFlc0djbVBhcmFtcyA9IHsgbmFtZTogJ0FFUy1HQ00nLCBpdiwgdGFnTGVuZ3RoOiAxMjggfTtcbiAgaWYgKGFkZGl0aW9uYWxEYXRhKSBwYXJhbXMuYWRkaXRpb25hbERhdGEgPSBhZGRpdGlvbmFsRGF0YTtcbiAgY29uc3QgY3QgPSBhd2FpdCBzdWJ0bGUuZW5jcnlwdChwYXJhbXMsIGtleSwgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHBsYWludGV4dCkpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWVzR2NtRGVjcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGl2OiBVaW50OEFycmF5LFxuICBjdDogVWludDhBcnJheSxcbiAgYWRkaXRpb25hbERhdGE/OiBVaW50OEFycmF5XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJhbXM6IEFlc0djbVBhcmFtcyA9IHsgbmFtZTogJ0FFUy1HQ00nLCBpdiwgdGFnTGVuZ3RoOiAxMjggfTtcbiAgaWYgKGFkZGl0aW9uYWxEYXRhKSBwYXJhbXMuYWRkaXRpb25hbERhdGEgPSBhZGRpdGlvbmFsRGF0YTtcbiAgY29uc3QgcGxhaW50ZXh0ID0gYXdhaXQgc3VidGxlLmRlY3J5cHQocGFyYW1zLCBrZXksIGN0KTtcbiAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwbGFpbnRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWMkVudmVsb3BlKGNpcGhlcnRleHQ6IHN0cmluZyk6IFYyRW52ZWxvcGUge1xuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcigndjIgZGVjcnlwdDogaW52YWxpZCBKU09OIGVudmVsb3BlJyk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhWMkVudmVsb3BlQ29kZWMsIHBhcnNlZCwgJ3YyIGRlY3J5cHQ6IGludmFsaWQgZW52ZWxvcGUnKTtcbn1cblxuLy8gUHVibGljIEFQSVxuXG4vKipcbiAqIEVuY3J5cHQgcGxhaW50ZXh0IHVzaW5nIEFyZ29uMmlkIEtERiArIEFFUy0yNTYtR0NNLlxuICpcbiAqIFJldHVybnMgYSBzZWxmLWRlc2NyaWJpbmcgSlNPTiB2MiBlbnZlbG9wZSBjb250YWluaW5nIGFsbCBBcmdvbjJpZCBwYXJhbWV0ZXJzLFxuICogc2FsdCwgSVYsIGFuZCBjaXBoZXJ0ZXh0IC0tIGZ1bGx5IHN0YW5kYWxvbmUgZm9yIGRlY3J5cHRpb24uXG4gKlxuICogRm9yIG11bHRpLWNhbGwgb3BlcmF0aW9ucyAoTVBDIHNpZ25pbmcsIHdhbGxldCBjcmVhdGlvbiksIHByZWZlclxuICogY3JlYXRlRW5jcnlwdGlvblNlc3Npb24gdG8gcnVuIEFyZ29uMmlkIG9uY2UgYW5kIGRlcml2ZSBwZXItY2FsbCBrZXlzIHZpYSBIS0RGLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdFYyKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBzYWx0PzogVWludDhBcnJheTtcbiAgICBpdj86IFVpbnQ4QXJyYXk7XG4gICAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgICBpdGVyYXRpb25zPzogbnVtYmVyO1xuICAgIHBhcmFsbGVsaXNtPzogbnVtYmVyO1xuICAgIGFkYXRhPzogc3RyaW5nO1xuICB9XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtZW1vcnlTaXplID0gb3B0aW9ucz8ubWVtb3J5U2l6ZSA/PyBBUkdPTjJfREVGQVVMVFMubWVtb3J5U2l6ZTtcbiAgY29uc3QgaXRlcmF0aW9ucyA9IG9wdGlvbnM/Lml0ZXJhdGlvbnMgPz8gQVJHT04yX0RFRkFVTFRTLml0ZXJhdGlvbnM7XG4gIGNvbnN0IHBhcmFsbGVsaXNtID0gb3B0aW9ucz8ucGFyYWxsZWxpc20gPz8gQVJHT04yX0RFRkFVTFRTLnBhcmFsbGVsaXNtO1xuXG4gIGNvbnN0IHNhbHQgPSBvcHRpb25zPy5zYWx0ID8/IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEFSR09OMl9ERUZBVUxUUy5zYWx0TGVuZ3RoKSk7XG4gIGlmIChzYWx0Lmxlbmd0aCAhPT0gQVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGgpIHRocm93IG5ldyBFcnJvcihgc2FsdCBtdXN0IGJlICR7QVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGh9IGJ5dGVzYCk7XG5cbiAgY29uc3QgaXYgPSBvcHRpb25zPy5pdiA/PyBuZXcgVWludDhBcnJheShyYW5kb21CeXRlcyhHQ01fSVZfTEVOR1RIKSk7XG4gIGlmIChpdi5sZW5ndGggIT09IEdDTV9JVl9MRU5HVEgpIHRocm93IG5ldyBFcnJvcihgaXYgbXVzdCBiZSAke0dDTV9JVl9MRU5HVEh9IGJ5dGVzYCk7XG5cbiAgY29uc3QgYWRhdGFCeXRlcyA9IG9wdGlvbnM/LmFkYXRhID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG9wdGlvbnMuYWRhdGEpIDogdW5kZWZpbmVkO1xuICBjb25zdCBrZXkgPSBhd2FpdCBhcmdvbjJUb0Flc0tleShwYXNzd29yZCwgc2FsdCwgeyBtZW1vcnlTaXplLCBpdGVyYXRpb25zLCBwYXJhbGxlbGlzbSB9KTtcbiAgY29uc3QgY3QgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGtleSwgaXYsIHBsYWludGV4dCwgYWRhdGFCeXRlcyk7XG5cbiAgY29uc3QgZW52ZWxvcGU6IFYyRW52ZWxvcGUgPSB7XG4gICAgdjogMixcbiAgICBtOiBtZW1vcnlTaXplLFxuICAgIHQ6IGl0ZXJhdGlvbnMsXG4gICAgcDogcGFyYWxsZWxpc20sXG4gICAgc2FsdDogQnVmZmVyLmZyb20oc2FsdCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIGl2OiBCdWZmZXIuZnJvbShpdikudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIGN0OiBCdWZmZXIuZnJvbShjdCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xuICBpZiAob3B0aW9ucz8uYWRhdGEpIGVudmVsb3BlLmFkYXRhID0gb3B0aW9ucy5hZGF0YTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGEgdjIgZW52ZWxvcGUgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pLlxuICpcbiAqIEhhbmRsZXMgYm90aCBlbnZlbG9wZSB0eXBlcyBhdXRvbWF0aWNhbGx5OlxuICogICAtIFN0YW5kYXJkICAobm8gaGtkZlNhbHQpOiBBcmdvbjJpZCAtPiBBRVMtR0NNXG4gKiAgIC0gU2Vzc2lvbiAgIChoa2RmU2FsdCBwcmVzZW50KTogQXJnb24yaWQgLT4gSEtERiAtPiBBRVMtR0NNXG4gKlxuICogQWxsIHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiB0aGUgZW52ZWxvcGUgLS0gbm8gc2Vzc2lvbiBjb250ZXh0IHJlcXVpcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFYyKHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGVudmVsb3BlID0gcGFyc2VWMkVudmVsb3BlKGNpcGhlcnRleHQpO1xuICBjb25zdCBzYWx0ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZW52ZWxvcGUuc2FsdCwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5pdiwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgY3QgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5jdCwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgcGFyYW1zID0geyBtZW1vcnlTaXplOiBlbnZlbG9wZS5tLCBpdGVyYXRpb25zOiBlbnZlbG9wZS50LCBwYXJhbGxlbGlzbTogZW52ZWxvcGUucCB9O1xuICBjb25zdCBhZGF0YUJ5dGVzID0gZW52ZWxvcGUuYWRhdGEgPyBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZW52ZWxvcGUuYWRhdGEpIDogdW5kZWZpbmVkO1xuXG4gIGlmIChlbnZlbG9wZS5oa2RmU2FsdCkge1xuICAgIGNvbnN0IGhrZGZLZXkgPSBhd2FpdCBhcmdvbjJUb0hrZGZLZXkocGFzc3dvcmQsIHNhbHQsIHBhcmFtcyk7XG4gICAgY29uc3QgaGtkZlNhbHQgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5oa2RmU2FsdCwgJ2Jhc2U2NCcpKTtcbiAgICBjb25zdCBhZXNLZXkgPSBhd2FpdCBoa2RmRGVyaXZlQWVzS2V5KGhrZGZLZXksIGhrZGZTYWx0LCAnZGVjcnlwdCcpO1xuICAgIHJldHVybiBhZXNHY21EZWNyeXB0KGFlc0tleSwgaXYsIGN0LCBhZGF0YUJ5dGVzKTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IGF3YWl0IGFyZ29uMlRvQWVzS2V5KHBhc3N3b3JkLCBzYWx0LCBwYXJhbXMpO1xuICByZXR1cm4gYWVzR2NtRGVjcnlwdChrZXksIGl2LCBjdCwgYWRhdGFCeXRlcyk7XG59XG4iXX0=
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdFYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuY3J5cHRWMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrSEEsMENBT0M7QUFPRCw0Q0FhQztBQUVELHNDQVVDO0FBRUQsc0NBVUM7QUFFRCwwQ0FZQztBQWFELDhCQXFDQztBQVVELDhCQTZCQztBQTVRRCwwQ0FBeUM7QUFDekMsOENBQTRFO0FBQzVFLG1DQUFnRDtBQUNoRCx5Q0FBMkI7QUFFM0IsMEZBQTBGO0FBQzFGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLGtCQUFTLENBQUMsTUFBTSxDQUFDO0FBRTdEOztHQUVHO0FBQ1UsUUFBQSxlQUFlLEdBQUc7SUFDN0IsVUFBVSxFQUFFLEtBQUssRUFBRSxnQkFBZ0I7SUFDbkMsVUFBVSxFQUFFLENBQUM7SUFDYixXQUFXLEVBQUUsQ0FBQztJQUNkLFVBQVUsRUFBRSxFQUFFLEVBQUUsY0FBYztJQUM5QixVQUFVLEVBQUUsRUFBRSxFQUFFLGVBQWU7Q0FDdkIsQ0FBQztBQUVYOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixVQUFVLEVBQUUsTUFBTTtJQUNsQixVQUFVLEVBQUUsRUFBRTtJQUNkLFdBQVcsRUFBRSxFQUFFO0NBQ1AsQ0FBQztBQUVYLHFDQUFxQztBQUN4QixRQUFBLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFaEMseUNBQXlDO0FBQzVCLFFBQUEsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLGdGQUFnRjtBQUNoRixNQUFNLGlCQUFpQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFdkUsaUZBQWlGO0FBQ2pGLE1BQU0sY0FBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FB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LFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekQsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFyZ29uMmlkIH0gZnJvbSAnQGJpdGdvL2FyZ29uMic7XG5pbXBvcnQgeyBiYXNlNjRTdHJpbmcsIGJvdW5kZWRJbnQsIGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcywgd2ViY3J5cHRvIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuXG4vKiogV2ViIENyeXB0byBzdWJ0bGUg4oCUIGJyb3dzZXIgZ2xvYmFsIGluIERPTTsgTm9kZS9FbGVjdHJvbiBtYWluIG11c3QgdXNlIGB3ZWJjcnlwdG9gLiAqL1xuY29uc3Qgc3VidGxlID0gZ2xvYmFsVGhpcy5jcnlwdG8/LnN1YnRsZSA/PyB3ZWJjcnlwdG8uc3VidGxlO1xuXG4vKiogRGVmYXVsdCBBcmdvbjJpZCBwYXJhbWV0ZXJzIHBlciBSRkMgOTEwNiBzZWNvbmQgcmVjb21tZW5kYXRpb25cbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMDYjc2VjdGlvbi00XG4gKi9cbmV4cG9ydCBjb25zdCBBUkdPTjJfREVGQVVMVFMgPSB7XG4gIG1lbW9yeVNpemU6IDY1NTM2LCAvLyA2NCBNaUIgaW4gS2lCXG4gIGl0ZXJhdGlvbnM6IDMsXG4gIHBhcmFsbGVsaXNtOiA0LFxuICBoYXNoTGVuZ3RoOiAzMiwgLy8gMjU2LWJpdCBrZXlcbiAgc2FsdExlbmd0aDogMTYsIC8vIDEyOC1iaXQgc2FsdFxufSBhcyBjb25zdDtcblxuLyoqIE1heGltdW0gYWxsb3dlZCBBcmdvbjJpZCBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgRG9TIHZpYSBjcmFmdGVkIGVudmVsb3Blcy5cbiAqIG1lbW9yeVNpemU6IDI1NiBNaUIgKDR4IGRlZmF1bHQpIC0tIGNhcHMgbWVtb3J5IGFsbG9jYXRpb24gb24gdW50cnVzdGVkIGlucHV0LlxuICogaXRlcmF0aW9uczogMTYgLS0gY2FwcyBDUFUgdGltZS5cbiAqIHBhcmFsbGVsaXNtOiAxNiAtLSBjYXBzIHRocmVhZCBjb3VudC5cbiAqL1xuY29uc3QgQVJHT04yX01BWCA9IHtcbiAgbWVtb3J5U2l6ZTogMjYyMTQ0LFxuICBpdGVyYXRpb25zOiAxNixcbiAgcGFyYWxsZWxpc206IDE2LFxufSBhcyBjb25zdDtcblxuLyoqIEFFUy0yNTYtR0NNIElWIGxlbmd0aCBpbiBieXRlcyAqL1xuZXhwb3J0IGNvbnN0IEdDTV9JVl9MRU5HVEggPSAxMjtcblxuLyoqIEhLREYgcGVyLWNhbGwgc2FsdCBsZW5ndGggaW4gYnl0ZXMgKi9cbmV4cG9ydCBjb25zdCBIS0RGX1NBTFRfTEVOR1RIID0gMzI7XG5cbi8qKiBGaXhlZCBIS0RGIGluZm8gc3RyaW5nIGZvciBkb21haW4gc2VwYXJhdGlvbiBhY3Jvc3MgQml0R28gdjIgc2Vzc2lvbiBrZXlzICovXG5jb25zdCBIS0RGX1NFU1NJT05fSU5GTyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgnYml0Z28tdjItc2Vzc2lvbicpO1xuXG4vKiogSEtERiBpbmZvIGZvciBoaWdoLWVudHJvcHkgSUtNIChFQ0RIIHNlY3JldHMpLiBEaXN0aW5jdCBmcm9tIHNlc3Npb24gaW5mby4gKi9cbmNvbnN0IEhLREZfT05MWV9JTkZPID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCdiaXRnby12Mi1oa2RmJyk7XG5cbi8vIEVudmVsb3BlIGNvZGVjXG4vL1xuLy8gVHdvIHZhbGlkIHYyIHNoYXBlcyAocHJlc2VuY2UgcnVsZSBlbmZvcmNlZCBhZnRlciBkZWNvZGUpOlxuLy8gICAtIEFyZ29uMiAvIHNlc3Npb246IG0sIHQsIHAsIHNhbHQgcmVxdWlyZWQ7IGhrZGZTYWx0IG9wdGlvbmFsIChzZXNzaW9uKVxuLy8gICAtIEhLREYtb25seTogaGtkZlNhbHQgcmVxdWlyZWQ7IEFyZ29uMiBwYXJhbXMgYWJzZW50XG5cbmNvbnN0IFYyRW52ZWxvcGVDb2RlYyA9IHQuaW50ZXJzZWN0aW9uKFtcbiAgdC50eXBlKHtcbiAgICB2OiB0LmxpdGVyYWwoMiksXG4gICAgaXY6IGJhc2U2NFN0cmluZyxcbiAgICBjdDogYmFzZTY0U3RyaW5nLFxuICB9KSxcbiAgdC5wYXJ0aWFsKHtcbiAgICBtOiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVgubWVtb3J5U2l6ZSwgJ21lbW9yeVNpemUnKSxcbiAgICB0OiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVguaXRlcmF0aW9ucywgJ2l0ZXJhdGlvbnMnKSxcbiAgICBwOiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVgucGFyYWxsZWxpc20sICdwYXJhbGxlbGlzbScpLFxuICAgIHNhbHQ6IGJhc2U2NFN0cmluZyxcbiAgICAvKiogQmFzZTY0LWVuY29kZWQgSEtERiBzYWx0IC0tIHNlc3Npb24gZW52ZWxvcGVzIGFuZCBIS0RGLW9ubHkgZW52ZWxvcGVzICovXG4gICAgaGtkZlNhbHQ6IGJhc2U2NFN0cmluZyxcbiAgICAvKiogQWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEgZm9yIGNvbnRleHQgYmluZGluZyAoZS5nLiB0cmFuc2FjdGlvbiBoYXNoICsgZGVyaXZhdGlvbiBwYXRoKSAqL1xuICAgIGFkYXRhOiB0LnN0cmluZyxcbiAgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgVjJFbnZlbG9wZSA9IHQuVHlwZU9mPHR5cGVvZiBWMkVudmVsb3BlQ29kZWM+O1xuXG50eXBlIEFyZ29uMkVudmVsb3BlID0gVjJFbnZlbG9wZSAmIHsgbTogbnVtYmVyOyB0OiBudW1iZXI7IHA6IG51bWJlcjsgc2FsdDogc3RyaW5nIH07XG50eXBlIEhrZGZPbmx5RW52ZWxvcGUgPSBWMkVudmVsb3BlICYgeyBoa2RmU2FsdDogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIGhhc0FyZ29uMlBhcmFtcyhlbnZlbG9wZTogVjJFbnZlbG9wZSk6IGVudmVsb3BlIGlzIEFyZ29uMkVudmVsb3BlIHtcbiAgcmV0dXJuIChcbiAgICBlbnZlbG9wZS5tICE9PSB1bmRlZmluZWQgJiYgZW52ZWxvcGUudCAhPT0gdW5kZWZpbmVkICYmIGVudmVsb3BlLnAgIT09IHVuZGVmaW5lZCAmJiBlbnZlbG9wZS5zYWx0ICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNIa2RmT25seUVudmVsb3BlKGVudmVsb3BlOiBWMkVudmVsb3BlKTogZW52ZWxvcGUgaXMgSGtkZk9ubHlFbnZlbG9wZSB7XG4gIHJldHVybiAoXG4gICAgZW52ZWxvcGUuaGtkZlNhbHQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGVudmVsb3BlLm0gPT09IHVuZGVmaW5lZCAmJlxuICAgIGVudmVsb3BlLnQgPT09IHVuZGVmaW5lZCAmJlxuICAgIGVudmVsb3BlLnAgPT09IHVuZGVmaW5lZCAmJlxuICAgIGVudmVsb3BlLnNhbHQgPT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vLyBDcnlwdG8gaGVscGVyc1xuXG5hc3luYyBmdW5jdGlvbiBhcmdvbjJIYXNoKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBzYWx0OiBVaW50OEFycmF5LFxuICBwYXJhbXM6IHsgbWVtb3J5U2l6ZTogbnVtYmVyOyBpdGVyYXRpb25zOiBudW1iZXI7IHBhcmFsbGVsaXNtOiBudW1iZXIgfVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiBhcmdvbjJpZCh7XG4gICAgcGFzc3dvcmQsXG4gICAgc2FsdCxcbiAgICBtZW1vcnlTaXplOiBwYXJhbXMubWVtb3J5U2l6ZSxcbiAgICBpdGVyYXRpb25zOiBwYXJhbXMuaXRlcmF0aW9ucyxcbiAgICBwYXJhbGxlbGlzbTogcGFyYW1zLnBhcmFsbGVsaXNtLFxuICAgIGhhc2hMZW5ndGg6IEFSR09OMl9ERUZBVUxUUy5oYXNoTGVuZ3RoLFxuICAgIG91dHB1dFR5cGU6ICdiaW5hcnknLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXJnb24yVG9BZXNLZXkoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHNhbHQ6IFVpbnQ4QXJyYXksXG4gIHBhcmFtczogeyBtZW1vcnlTaXplOiBudW1iZXI7IGl0ZXJhdGlvbnM6IG51bWJlcjsgcGFyYWxsZWxpc206IG51bWJlciB9XG4pOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICBjb25zdCBrZXlCeXRlcyA9IGF3YWl0IGFyZ29uMkhhc2gocGFzc3dvcmQsIHNhbHQsIHBhcmFtcyk7XG4gIHJldHVybiBzdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCBrZXlCeXRlcywgeyBuYW1lOiAnQUVTLUdDTScgfSwgZmFsc2UsIFsnZW5jcnlwdCcsICdkZWNyeXB0J10pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJnb24yVG9Ia2RmS2V5KFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBzYWx0OiBVaW50OEFycmF5LFxuICBwYXJhbXM6IHsgbWVtb3J5U2l6ZTogbnVtYmVyOyBpdGVyYXRpb25zOiBudW1iZXI7IHBhcmFsbGVsaXNtOiBudW1iZXIgfVxuKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgY29uc3Qga2V5Qnl0ZXMgPSBhd2FpdCBhcmdvbjJIYXNoKHBhc3N3b3JkLCBzYWx0LCBwYXJhbXMpO1xuICByZXR1cm4gc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5Qnl0ZXMsICdIS0RGJywgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXNzd29yZFRvSGtkZktleShwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgY29uc3QgaWttID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHBhc3N3b3JkKTtcbiAgcmV0dXJuIHN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGlrbSwgJ0hLREYnLCBmYWxzZSwgWydkZXJpdmVLZXknXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoa2RmRGVyaXZlQWVzS2V5KFxuICBoa2RmS2V5OiBDcnlwdG9LZXksXG4gIGhrZGZTYWx0OiBVaW50OEFycmF5LFxuICB1c2FnZTogS2V5VXNhZ2UsXG4gIGluZm86IFVpbnQ4QXJyYXkgPSBIS0RGX1NFU1NJT05fSU5GT1xuKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgcmV0dXJuIHN1YnRsZS5kZXJpdmVLZXkoXG4gICAgeyBuYW1lOiAnSEtERicsIGhhc2g6ICdTSEEtMjU2Jywgc2FsdDogaGtkZlNhbHQsIGluZm8gfSxcbiAgICBoa2RmS2V5LFxuICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBsZW5ndGg6IDI1NiB9LFxuICAgIGZhbHNlLFxuICAgIFt1c2FnZV1cbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFlc0djbUVuY3J5cHQoXG4gIGtleTogQ3J5cHRvS2V5LFxuICBpdjogVWludDhBcnJheSxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIGFkZGl0aW9uYWxEYXRhPzogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IHBhcmFtczogQWVzR2NtUGFyYW1zID0geyBuYW1lOiAnQUVTLUdDTScsIGl2LCB0YWdMZW5ndGg6IDEyOCB9O1xuICBpZiAoYWRkaXRpb25hbERhdGEpIHBhcmFtcy5hZGRpdGlvbmFsRGF0YSA9IGFkZGl0aW9uYWxEYXRhO1xuICBjb25zdCBjdCA9IGF3YWl0IHN1YnRsZS5lbmNyeXB0KHBhcmFtcywga2V5LCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGxhaW50ZXh0KSk7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZXNHY21EZWNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgaXY6IFVpbnQ4QXJyYXksXG4gIGN0OiBVaW50OEFycmF5LFxuICBhZGRpdGlvbmFsRGF0YT86IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhcmFtczogQWVzR2NtUGFyYW1zID0geyBuYW1lOiAnQUVTLUdDTScsIGl2LCB0YWdMZW5ndGg6IDEyOCB9O1xuICBpZiAoYWRkaXRpb25hbERhdGEpIHBhcmFtcy5hZGRpdGlvbmFsRGF0YSA9IGFkZGl0aW9uYWxEYXRhO1xuICBjb25zdCBwbGFpbnRleHQgPSBhd2FpdCBzdWJ0bGUuZGVjcnlwdChwYXJhbXMsIGtleSwgY3QpO1xuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBsYWludGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVYyRW52ZWxvcGUoY2lwaGVydGV4dDogc3RyaW5nKTogVjJFbnZlbG9wZSB7XG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2MiBkZWNyeXB0OiBpbnZhbGlkIEpTT04gZW52ZWxvcGUnKTtcbiAgfVxuICBjb25zdCBlbnZlbG9wZSA9IGRlY29kZVdpdGhDb2RlYyhWMkVudmVsb3BlQ29kZWMsIHBhcnNlZCwgJ3YyIGRlY3J5cHQ6IGludmFsaWQgZW52ZWxvcGUnKTtcbiAgaWYgKCFoYXNBcmdvbjJQYXJhbXMoZW52ZWxvcGUpICYmICFpc0hrZGZPbmx5RW52ZWxvcGUoZW52ZWxvcGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2MiBkZWNyeXB0OiBpbnZhbGlkIGVudmVsb3BlJyk7XG4gIH1cbiAgcmV0dXJuIGVudmVsb3BlO1xufVxuXG4vLyBQdWJsaWMgQVBJXG5cbi8qKlxuICogRW5jcnlwdCBwbGFpbnRleHQgdXNpbmcgQXJnb24yaWQgS0RGICsgQUVTLTI1Ni1HQ00uXG4gKlxuICogUmV0dXJucyBhIHNlbGYtZGVzY3JpYmluZyBKU09OIHYyIGVudmVsb3BlIGNvbnRhaW5pbmcgYWxsIEFyZ29uMmlkIHBhcmFtZXRlcnMsXG4gKiBzYWx0LCBJViwgYW5kIGNpcGhlcnRleHQgLS0gZnVsbHkgc3RhbmRhbG9uZSBmb3IgZGVjcnlwdGlvbi5cbiAqXG4gKiBGb3IgbXVsdGktY2FsbCBvcGVyYXRpb25zIChNUEMgc2lnbmluZywgd2FsbGV0IGNyZWF0aW9uKSwgcHJlZmVyXG4gKiBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiB0byBydW4gQXJnb24yaWQgb25jZSBhbmQgZGVyaXZlIHBlci1jYWxsIGtleXMgdmlhIEhLREYuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0VjIoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIHNhbHQ/OiBVaW50OEFycmF5O1xuICAgIGl2PzogVWludDhBcnJheTtcbiAgICBtZW1vcnlTaXplPzogbnVtYmVyO1xuICAgIGl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gICAgcGFyYWxsZWxpc20/OiBudW1iZXI7XG4gICAgYWRhdGE/OiBzdHJpbmc7XG4gIH1cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1lbW9yeVNpemUgPSBvcHRpb25zPy5tZW1vcnlTaXplID8/IEFSR09OMl9ERUZBVUxUUy5tZW1vcnlTaXplO1xuICBjb25zdCBpdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyBBUkdPTjJfREVGQVVMVFMuaXRlcmF0aW9ucztcbiAgY29uc3QgcGFyYWxsZWxpc20gPSBvcHRpb25zPy5wYXJhbGxlbGlzbSA/PyBBUkdPTjJfREVGQVVMVFMucGFyYWxsZWxpc207XG5cbiAgY29uc3Qgc2FsdCA9IG9wdGlvbnM/LnNhbHQgPz8gbmV3IFVpbnQ4QXJyYXkocmFuZG9tQnl0ZXMoQVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGgpKTtcbiAgaWYgKHNhbHQubGVuZ3RoICE9PSBBUkdPTjJfREVGQVVMVFMuc2FsdExlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGBzYWx0IG11c3QgYmUgJHtBUkdPTjJfREVGQVVMVFMuc2FsdExlbmd0aH0gYnl0ZXNgKTtcblxuICBjb25zdCBpdiA9IG9wdGlvbnM/Lml2ID8/IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEdDTV9JVl9MRU5HVEgpKTtcbiAgaWYgKGl2Lmxlbmd0aCAhPT0gR0NNX0lWX0xFTkdUSCkgdGhyb3cgbmV3IEVycm9yKGBpdiBtdXN0IGJlICR7R0NNX0lWX0xFTkdUSH0gYnl0ZXNgKTtcblxuICBjb25zdCBhZGF0YUJ5dGVzID0gb3B0aW9ucz8uYWRhdGEgPyBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUob3B0aW9ucy5hZGF0YSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGFyZ29uMlRvQWVzS2V5KHBhc3N3b3JkLCBzYWx0LCB7IG1lbW9yeVNpemUsIGl0ZXJhdGlvbnMsIHBhcmFsbGVsaXNtIH0pO1xuICBjb25zdCBjdCA9IGF3YWl0IGFlc0djbUVuY3J5cHQoa2V5LCBpdiwgcGxhaW50ZXh0LCBhZGF0YUJ5dGVzKTtcblxuICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IHtcbiAgICB2OiAyLFxuICAgIG06IG1lbW9yeVNpemUsXG4gICAgdDogaXRlcmF0aW9ucyxcbiAgICBwOiBwYXJhbGxlbGlzbSxcbiAgICBzYWx0OiBCdWZmZXIuZnJvbShzYWx0KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgaXY6IEJ1ZmZlci5mcm9tKGl2KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgY3Q6IEJ1ZmZlci5mcm9tKGN0KS50b1N0cmluZygnYmFzZTY0JyksXG4gIH07XG4gIGlmIChvcHRpb25zPy5hZGF0YSkgZW52ZWxvcGUuYWRhdGEgPSBvcHRpb25zLmFkYXRhO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSB2MiBlbnZlbG9wZS4gQXV0by1kZXRlY3RzIHNoYXBlOlxuICogICAtIFN0YW5kYXJkICAoQXJnb24yIHBhcmFtcywgbm8gaGtkZlNhbHQpOiBBcmdvbjJpZCAtPiBBRVMtR0NNXG4gKiAgIC0gU2Vzc2lvbiAgIChBcmdvbjIgcGFyYW1zICsgaGtkZlNhbHQpOiBBcmdvbjJpZCAtPiBIS0RGIC0+IEFFUy1HQ01cbiAqICAgLSBIS0RGLW9ubHkgKGhrZGZTYWx0LCBubyBBcmdvbjIgcGFyYW1zKTogSEtERihwYXNzd29yZCkgLT4gQUVTLUdDTVxuICpcbiAqIEFsbCBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIGVudmVsb3BlIC0tIG5vIHNlc3Npb24gY29udGV4dCByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRWMihwYXNzd29yZDogc3RyaW5nLCBjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlbnZlbG9wZSA9IHBhcnNlVjJFbnZlbG9wZShjaXBoZXJ0ZXh0KTtcbiAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5pdiwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgY3QgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5jdCwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgYWRhdGFCeXRlcyA9IGVudmVsb3BlLmFkYXRhID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGVudmVsb3BlLmFkYXRhKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoaXNIa2RmT25seUVudmVsb3BlKGVudmVsb3BlKSkge1xuICAgIGNvbnN0IGhrZGZLZXkgPSBhd2FpdCBwYXNzd29yZFRvSGtkZktleShwYXNzd29yZCk7XG4gICAgY29uc3QgaGtkZlNhbHQgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5oa2RmU2FsdCwgJ2Jhc2U2NCcpKTtcbiAgICBjb25zdCBhZXNLZXkgPSBhd2FpdCBoa2RmRGVyaXZlQWVzS2V5KGhrZGZLZXksIGhrZGZTYWx0LCAnZGVjcnlwdCcsIEhLREZfT05MWV9JTkZPKTtcbiAgICByZXR1cm4gYWVzR2NtRGVjcnlwdChhZXNLZXksIGl2LCBjdCwgYWRhdGFCeXRlcyk7XG4gIH1cblxuICBpZiAoIWhhc0FyZ29uMlBhcmFtcyhlbnZlbG9wZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3YyIGRlY3J5cHQ6IGludmFsaWQgZW52ZWxvcGUnKTtcbiAgfVxuXG4gIGNvbnN0IHNhbHQgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5zYWx0LCAnYmFzZTY0JykpO1xuICBjb25zdCBwYXJhbXMgPSB7IG1lbW9yeVNpemU6IGVudmVsb3BlLm0sIGl0ZXJhdGlvbnM6IGVudmVsb3BlLnQsIHBhcmFsbGVsaXNtOiBlbnZlbG9wZS5wIH07XG5cbiAgaWYgKGVudmVsb3BlLmhrZGZTYWx0KSB7XG4gICAgY29uc3QgaGtkZktleSA9IGF3YWl0IGFyZ29uMlRvSGtkZktleShwYXNzd29yZCwgc2FsdCwgcGFyYW1zKTtcbiAgICBjb25zdCBoa2RmU2FsdCA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGVudmVsb3BlLmhrZGZTYWx0LCAnYmFzZTY0JykpO1xuICAgIGNvbnN0IGFlc0tleSA9IGF3YWl0IGhrZGZEZXJpdmVBZXNLZXkoaGtkZktleSwgaGtkZlNhbHQsICdkZWNyeXB0Jyk7XG4gICAgcmV0dXJuIGFlc0djbURlY3J5cHQoYWVzS2V5LCBpdiwgY3QsIGFkYXRhQnl0ZXMpO1xuICB9XG5cbiAgY29uc3Qga2V5ID0gYXdhaXQgYXJnb24yVG9BZXNLZXkocGFzc3dvcmQsIHNhbHQsIHBhcmFtcyk7XG4gIHJldHVybiBhZXNHY21EZWNyeXB0KGtleSwgaXYsIGN0LCBhZGF0YUJ5dGVzKTtcbn1cbiJdfQ==
@@ -24,11 +24,40 @@ export declare class EncryptionSession {
24
24
  private getSaltOrThrow;
25
25
  private buildEnvelope;
26
26
  }
27
- /** Create an EncryptionSession. Runs Argon2id once; all subsequent calls derive keys via HKDF. */
27
+ /**
28
+ * v1 (SJCL) shim that satisfies the same contract as EncryptionSession but does not open a
29
+ * real session. Every encrypt/decrypt call runs its own SJCL PBKDF2 derivation via encrypt() /
30
+ * decrypt(). Exists so callers that pin `encryptionVersion: 1` can use the same
31
+ * `createEncryptionSession(pw, ver)` factory as v2 callers — no per-site useV2 branching.
32
+ * Once the sjcl-replacement rollout removes v1 encrypt, this collapses to nothing.
33
+ */
34
+ export declare class V1EncryptionSession {
35
+ private password;
36
+ constructor(password: string);
37
+ encrypt(input: string, adata?: string): Promise<string>;
38
+ decrypt(ciphertext: string): Promise<string>;
39
+ destroy(): void;
40
+ private getPasswordOrThrow;
41
+ }
42
+ /**
43
+ * Create an EncryptionSession.
44
+ *
45
+ * When encryptionVersion is undefined or 2 (the default), runs Argon2id once so every
46
+ * subsequent encrypt/decrypt derives a per-call AES key via HKDF (<1ms, native WebCrypto).
47
+ *
48
+ * When encryptionVersion is 1, returns a V1EncryptionSession shim that runs SJCL PBKDF2 on
49
+ * every call. The shim satisfies the same interface so callers that must produce v1 (SJCL)
50
+ * envelopes for legacy consumers use one factory regardless of version. No useV2 branching
51
+ * needed at the call site.
52
+ *
53
+ * Callers MUST call destroy() to clear the HKDF root (or retained password in v1 mode) from
54
+ * memory. Use-after-destroy throws.
55
+ */
28
56
  export declare function createEncryptionSession(password: string, options?: {
29
57
  memorySize?: number;
30
58
  iterations?: number;
31
59
  parallelism?: number;
32
60
  salt?: Uint8Array;
33
- }): Promise<EncryptionSession>;
61
+ encryptionVersion?: 1 | 2;
62
+ }): Promise<EncryptionSession | V1EncryptionSession>;
34
63
  //# sourceMappingURL=encryptionSession.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"encryptionSession.d.ts","sourceRoot":"","sources":["../../src/encryptionSession.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,sEAAsE;gBAEpE,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IASnE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3D,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBlD,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;CAYtB;AAED,kGAAkG;AAClG,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,GAC9F,OAAO,CAAC,iBAAiB,CAAC,CAe5B"}
1
+ {"version":3,"file":"encryptionSession.d.ts","sourceRoot":"","sources":["../../src/encryptionSession.ts"],"names":[],"mappings":"AAeA;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,sEAAsE;gBAEpE,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IASnE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3D,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBlD,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;CAYtB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,EAAE,MAAM;IAItB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,kBAAkB;CAM3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CAC3B,GACA,OAAO,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,CAmBlD"}
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EncryptionSession = void 0;
3
+ exports.V1EncryptionSession = exports.EncryptionSession = void 0;
4
4
  exports.createEncryptionSession = createEncryptionSession;
5
5
  const crypto_1 = require("crypto");
6
+ const encrypt_1 = require("./encrypt");
6
7
  const encryptV2_1 = require("./encryptV2");
7
8
  /**
8
9
  * Runs Argon2id once on creation, then derives per-call AES-256-GCM keys via HKDF.
@@ -78,8 +79,52 @@ class EncryptionSession {
78
79
  }
79
80
  }
80
81
  exports.EncryptionSession = EncryptionSession;
81
- /** Create an EncryptionSession. Runs Argon2id once; all subsequent calls derive keys via HKDF. */
82
+ /**
83
+ * v1 (SJCL) shim that satisfies the same contract as EncryptionSession but does not open a
84
+ * real session. Every encrypt/decrypt call runs its own SJCL PBKDF2 derivation via encrypt() /
85
+ * decrypt(). Exists so callers that pin `encryptionVersion: 1` can use the same
86
+ * `createEncryptionSession(pw, ver)` factory as v2 callers — no per-site useV2 branching.
87
+ * Once the sjcl-replacement rollout removes v1 encrypt, this collapses to nothing.
88
+ */
89
+ class V1EncryptionSession {
90
+ constructor(password) {
91
+ this.password = password;
92
+ }
93
+ async encrypt(input, adata) {
94
+ return (0, encrypt_1.encrypt)(this.getPasswordOrThrow(), input, { adata, encryptionVersion: 1 });
95
+ }
96
+ async decrypt(ciphertext) {
97
+ return (0, encrypt_1.decrypt)(this.getPasswordOrThrow(), ciphertext);
98
+ }
99
+ destroy() {
100
+ this.password = null;
101
+ }
102
+ getPasswordOrThrow() {
103
+ if (this.password === null) {
104
+ throw new Error('V1EncryptionSession has been destroyed');
105
+ }
106
+ return this.password;
107
+ }
108
+ }
109
+ exports.V1EncryptionSession = V1EncryptionSession;
110
+ /**
111
+ * Create an EncryptionSession.
112
+ *
113
+ * When encryptionVersion is undefined or 2 (the default), runs Argon2id once so every
114
+ * subsequent encrypt/decrypt derives a per-call AES key via HKDF (<1ms, native WebCrypto).
115
+ *
116
+ * When encryptionVersion is 1, returns a V1EncryptionSession shim that runs SJCL PBKDF2 on
117
+ * every call. The shim satisfies the same interface so callers that must produce v1 (SJCL)
118
+ * envelopes for legacy consumers use one factory regardless of version. No useV2 branching
119
+ * needed at the call site.
120
+ *
121
+ * Callers MUST call destroy() to clear the HKDF root (or retained password in v1 mode) from
122
+ * memory. Use-after-destroy throws.
123
+ */
82
124
  async function createEncryptionSession(password, options) {
125
+ if (options?.encryptionVersion === 1) {
126
+ return new V1EncryptionSession(password);
127
+ }
83
128
  const memorySize = options?.memorySize ?? encryptV2_1.ARGON2_DEFAULTS.memorySize;
84
129
  const iterations = options?.iterations ?? encryptV2_1.ARGON2_DEFAULTS.iterations;
85
130
  const parallelism = options?.parallelism ?? encryptV2_1.ARGON2_DEFAULTS.parallelism;
@@ -92,4 +137,4 @@ async function createEncryptionSession(password, options) {
92
137
  const argon2SaltB64 = Buffer.from(argon2Salt).toString('base64');
93
138
  return new EncryptionSession(hkdfKey, argon2SaltB64, params);
94
139
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvblNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jcnlwdGlvblNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUdBLDBEQWtCQztBQXpIRCxtQ0FBcUM7QUFFckMsMkNBVXFCO0FBRXJCOzs7Ozs7R0FNRztBQUNILE1BQWEsaUJBQWlCO0lBTTVCLHNFQUFzRTtJQUN0RSxZQUNFLE9BQWtCLEVBQ2xCLGFBQXFCLEVBQ3JCLE1BQXVFO1FBRXZFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQWlCLEVBQUUsS0FBYztRQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBQSxvQkFBVyxFQUFDLDRCQUFnQixDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFBLG9CQUFXLEVBQUMseUJBQWEsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3ZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBZ0IsRUFBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hF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QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWpFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7XG4gIGFlc0djbURlY3J5cHQsXG4gIGFlc0djbUVuY3J5cHQsXG4gIEFSR09OMl9ERUZBVUxUUyxcbiAgYXJnb24yVG9Ia2RmS2V5LFxuICBHQ01fSVZfTEVOR1RILFxuICBoa2RmRGVyaXZlQWVzS2V5LFxuICBIS0RGX1NBTFRfTEVOR1RILFxuICBwYXJzZVYyRW52ZWxvcGUsXG4gIFYyRW52ZWxvcGUsXG59IGZyb20gJy4vZW5jcnlwdFYyJztcblxuLyoqXG4gKiBSdW5zIEFyZ29uMmlkIG9uY2Ugb24gY3JlYXRpb24sIHRoZW4gZGVyaXZlcyBwZXItY2FsbCBBRVMtMjU2LUdDTSBrZXlzIHZpYSBIS0RGLlxuICogVXNlIHdoZW4gZW5jcnlwdGluZyBvciBkZWNyeXB0aW5nIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIHBhc3N3b3JkLlxuICpcbiAqIFNlc3Npb24gZW52ZWxvcGVzIGFyZSBzZWxmLWRlc2NyaWJpbmcgYW5kIGNhbiBiZSBkZWNyeXB0ZWQgc3RhbmRhbG9uZSB2aWEgZGVjcnlwdFYyLlxuICogQ2FsbCBkZXN0cm95KCkgd2hlbiBkb25lIHRvIGNsZWFyIHRoZSBjYWNoZWQga2V5IGZyb20gbWVtb3J5LlxuICovXG5leHBvcnQgY2xhc3MgRW5jcnlwdGlvblNlc3Npb24ge1xuICBwcml2YXRlIGhrZGZLZXk6IENyeXB0b0tleSB8IG51bGw7XG4gIHByaXZhdGUgYXJnb24yU2FsdEI2NDogc3RyaW5nIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlcmF0aW9uczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFsbGVsaXNtOiBudW1iZXI7XG4gIC8qKiBVc2UgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24oKSBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4gKi9cbiAgY29uc3RydWN0b3IoXG4gICAgaGtkZktleTogQ3J5cHRvS2V5LFxuICAgIGFyZ29uMlNhbHRCNjQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IHsgbWVtb3J5U2l6ZTogbnVtYmVyOyBpdGVyYXRpb25zOiBudW1iZXI7IHBhcmFsbGVsaXNtOiBudW1iZXIgfVxuICApIHtcbiAgICB0aGlzLmhrZGZLZXkgPSBoa2RmS2V5O1xuICAgIHRoaXMuYXJnb24yU2FsdEI2NCA9IGFyZ29uMlNhbHRCNjQ7XG4gICAgdGhpcy5tZW1vcnlTaXplID0gcGFyYW1zLm1lbW9yeVNpemU7XG4gICAgdGhpcy5pdGVyYXRpb25zID0gcGFyYW1zLml0ZXJhdGlvbnM7XG4gICAgdGhpcy5wYXJhbGxlbGlzbSA9IHBhcmFtcy5wYXJhbGxlbGlzbTtcbiAgfVxuXG4gIGFzeW5jIGVuY3J5cHQocGxhaW50ZXh0OiBzdHJpbmcsIGFkYXRhPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleU9yVGhyb3coKTtcbiAgICBjb25zdCBoa2RmU2FsdCA9IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEhLREZfU0FMVF9MRU5HVEgpKTtcbiAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEdDTV9JVl9MRU5HVEgpKTtcbiAgICBjb25zdCBhZGF0YUJ5dGVzID0gYWRhdGEgPyBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoYWRhdGEpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFlc0tleSA9IGF3YWl0IGhrZGZEZXJpdmVBZXNLZXkoa2V5LCBoa2RmU2FsdCwgJ2VuY3J5cHQnKTtcbiAgICBjb25zdCBjdCA9IGF3YWl0IGFlc0djbUVuY3J5cHQoYWVzS2V5LCBpdiwgcGxhaW50ZXh0LCBhZGF0YUJ5dGVzKTtcbiAgICBjb25zdCBlbnZlbG9wZSA9IHRoaXMuYnVpbGRFbnZlbG9wZShoa2RmU2FsdCwgaXYsIGN0KTtcbiAgICBpZiAoYWRhdGEpIGVudmVsb3BlLmFkYXRhID0gYWRhdGE7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHQoY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleU9yVGhyb3coKTtcbiAgICBjb25zdCBlbnZlbG9wZSA9IHBhcnNlVjJFbnZlbG9wZShjaXBoZXJ0ZXh0KTtcbiAgICBpZiAoIWVudmVsb3BlLmhrZGZTYWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VudmVsb3BlIHdhcyBub3QgZW5jcnlwdGVkIHdpdGggYSBzZXNzaW9uOyB1c2UgZGVjcnlwdFYyIGluc3RlYWQnKTtcbiAgICB9XG4gICAgaWYgKGVudmVsb3BlLnNhbHQgIT09IHRoaXMuZ2V0U2FsdE9yVGhyb3coKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbnZlbG9wZSB3YXMgbm90IGVuY3J5cHRlZCB3aXRoIHRoaXMgc2Vzc2lvbicpO1xuICAgIH1cbiAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGVudmVsb3BlLml2LCAnYmFzZTY0JykpO1xuICAgIGNvbnN0IGN0ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZW52ZWxvcGUuY3QsICdiYXNlNjQnKSk7XG4gICAgY29uc3QgaGtkZlNhbHQgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5oa2RmU2FsdCwgJ2Jhc2U2NCcpKTtcbiAgICBjb25zdCBhZGF0YUJ5dGVzID0gZW52ZWxvcGUuYWRhdGEgPyBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZW52ZWxvcGUuYWRhdGEpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFlc0tleSA9IGF3YWl0IGhrZGZEZXJpdmVBZXNLZXkoa2V5LCBoa2RmU2FsdCwgJ2RlY3J5cHQnKTtcbiAgICByZXR1cm4gYWVzR2NtRGVjcnlwdChhZXNLZXksIGl2LCBjdCwgYWRhdGFCeXRlcyk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaGtkZktleSA9IG51bGw7XG4gICAgdGhpcy5hcmdvbjJTYWx0QjY0ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0S2V5T3JUaHJvdygpOiBDcnlwdG9LZXkge1xuICAgIGlmICh0aGlzLmhrZGZLZXkgPT09IG51bGwgfHwgdGhpcy5hcmdvbjJTYWx0QjY0ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRpb25TZXNzaW9uIGhhcyBiZWVuIGRlc3Ryb3llZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oa2RmS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTYWx0T3JUaHJvdygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmFyZ29uMlNhbHRCNjQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGlvblNlc3Npb24gaGFzIGJlZW4gZGVzdHJveWVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFyZ29uMlNhbHRCNjQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRW52ZWxvcGUoaGtkZlNhbHQ6IFVpbnQ4QXJyYXksIGl2OiBVaW50OEFycmF5LCBjdDogVWludDhBcnJheSk6IFYyRW52ZWxvcGUge1xuICAgIHJldHVybiB7XG4gICAgICB2OiAyLFxuICAgICAgbTogdGhpcy5tZW1vcnlTaXplLFxuICAgICAgdDogdGhpcy5pdGVyYXRpb25zLFxuICAgICAgcDogdGhpcy5wYXJhbGxlbGlzbSxcbiAgICAgIHNhbHQ6IHRoaXMuZ2V0U2FsdE9yVGhyb3coKSxcbiAgICAgIGhrZGZTYWx0OiBCdWZmZXIuZnJvbShoa2RmU2FsdCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgaXY6IEJ1ZmZlci5mcm9tKGl2KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICBjdDogQnVmZmVyLmZyb20oY3QpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYW4gRW5jcnlwdGlvblNlc3Npb24uIFJ1bnMgQXJnb24yaWQgb25jZTsgYWxsIHN1YnNlcXVlbnQgY2FsbHMgZGVyaXZlIGtleXMgdmlhIEhLREYuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRW5jcnlwdGlvblNlc3Npb24oXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IG1lbW9yeVNpemU/OiBudW1iZXI7IGl0ZXJhdGlvbnM/OiBudW1iZXI7IHBhcmFsbGVsaXNtPzogbnVtYmVyOyBzYWx0PzogVWludDhBcnJheSB9XG4pOiBQcm9taXNlPEVuY3J5cHRpb25TZXNzaW9uPiB7XG4gIGNvbnN0IG1lbW9yeVNpemUgPSBvcHRpb25zPy5tZW1vcnlTaXplID8/IEFSR09OMl9ERUZBVUxUUy5tZW1vcnlTaXplO1xuICBjb25zdCBpdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyBBUkdPTjJfREVGQVVMVFMuaXRlcmF0aW9ucztcbiAgY29uc3QgcGFyYWxsZWxpc20gPSBvcHRpb25zPy5wYXJhbGxlbGlzbSA/PyBBUkdPTjJfREVGQVVMVFMucGFyYWxsZWxpc207XG4gIGNvbnN0IHBhcmFtcyA9IHsgbWVtb3J5U2l6ZSwgaXRlcmF0aW9ucywgcGFyYWxsZWxpc20gfTtcblxuICBjb25zdCBhcmdvbjJTYWx0ID0gb3B0aW9ucz8uc2FsdCA/PyBuZXcgVWludDhBcnJheShyYW5kb21CeXRlcyhBUkdPTjJfREVGQVVMVFMuc2FsdExlbmd0aCkpO1xuICBpZiAoYXJnb24yU2FsdC5sZW5ndGggIT09IEFSR09OMl9ERUZBVUxUUy5zYWx0TGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzYWx0IG11c3QgYmUgJHtBUkdPTjJfREVGQVVMVFMuc2FsdExlbmd0aH0gYnl0ZXNgKTtcbiAgfVxuXG4gIGNvbnN0IGhrZGZLZXkgPSBhd2FpdCBhcmdvbjJUb0hrZGZLZXkocGFzc3dvcmQsIGFyZ29uMlNhbHQsIHBhcmFtcyk7XG4gIGNvbnN0IGFyZ29uMlNhbHRCNjQgPSBCdWZmZXIuZnJvbShhcmdvbjJTYWx0KS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgcmV0dXJuIG5ldyBFbmNyeXB0aW9uU2Vzc2lvbihoa2RmS2V5LCBhcmdvbjJTYWx0QjY0LCBwYXJhbXMpO1xufVxuIl19
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvblNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jcnlwdGlvblNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUpBLDBEQTRCQztBQW5MRCxtQ0FBcUM7QUFFckMsdUNBQTZDO0FBQzdDLDJDQVVxQjtBQUVyQjs7Ozs7O0dBTUc7QUFDSCxNQUFhLGlCQUFpQjtJQU01QixzRUFBc0U7SUFDdEUsWUFDRSxPQUFrQixFQUNsQixhQUFxQixFQUNyQixNQUF1RTtRQUV2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFpQixFQUFFLEtBQWM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUEsb0JBQVcsRUFBQyw0QkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBQSxvQkFBVyxFQUFDLHlCQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2RSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsNEJBQWdCLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENB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XG5cbmltcG9ydCB7IGRlY3J5cHQsIGVuY3J5cHQgfSBmcm9tICcuL2VuY3J5cHQnO1xuaW1wb3J0IHtcbiAgYWVzR2NtRGVjcnlwdCxcbiAgYWVzR2NtRW5jcnlwdCxcbiAgQVJHT04yX0RFRkFVTFRTLFxuICBhcmdvbjJUb0hrZGZLZXksXG4gIEdDTV9JVl9MRU5HVEgsXG4gIGhrZGZEZXJpdmVBZXNLZXksXG4gIEhLREZfU0FMVF9MRU5HVEgsXG4gIHBhcnNlVjJFbnZlbG9wZSxcbiAgVjJFbnZlbG9wZSxcbn0gZnJvbSAnLi9lbmNyeXB0VjInO1xuXG4vKipcbiAqIFJ1bnMgQXJnb24yaWQgb25jZSBvbiBjcmVhdGlvbiwgdGhlbiBkZXJpdmVzIHBlci1jYWxsIEFFUy0yNTYtR0NNIGtleXMgdmlhIEhLREYuXG4gKiBVc2Ugd2hlbiBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmcgbXVsdGlwbGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgcGFzc3dvcmQuXG4gKlxuICogU2Vzc2lvbiBlbnZlbG9wZXMgYXJlIHNlbGYtZGVzY3JpYmluZyBhbmQgY2FuIGJlIGRlY3J5cHRlZCBzdGFuZGFsb25lIHZpYSBkZWNyeXB0VjIuXG4gKiBDYWxsIGRlc3Ryb3koKSB3aGVuIGRvbmUgdG8gY2xlYXIgdGhlIGNhY2hlZCBrZXkgZnJvbSBtZW1vcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbmNyeXB0aW9uU2Vzc2lvbiB7XG4gIHByaXZhdGUgaGtkZktleTogQ3J5cHRvS2V5IHwgbnVsbDtcbiAgcHJpdmF0ZSBhcmdvbjJTYWx0QjY0OiBzdHJpbmcgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeVNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpdGVyYXRpb25zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyYWxsZWxpc206IG51bWJlcjtcbiAgLyoqIFVzZSBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbigpIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5LiAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBoa2RmS2V5OiBDcnlwdG9LZXksXG4gICAgYXJnb24yU2FsdEI2NDogc3RyaW5nLFxuICAgIHBhcmFtczogeyBtZW1vcnlTaXplOiBudW1iZXI7IGl0ZXJhdGlvbnM6IG51bWJlcjsgcGFyYWxsZWxpc206IG51bWJlciB9XG4gICkge1xuICAgIHRoaXMuaGtkZktleSA9IGhrZGZLZXk7XG4gICAgdGhpcy5hcmdvbjJTYWx0QjY0ID0gYXJnb24yU2FsdEI2NDtcbiAgICB0aGlzLm1lbW9yeVNpemUgPSBwYXJhbXMubWVtb3J5U2l6ZTtcbiAgICB0aGlzLml0ZXJhdGlvbnMgPSBwYXJhbXMuaXRlcmF0aW9ucztcbiAgICB0aGlzLnBhcmFsbGVsaXNtID0gcGFyYW1zLnBhcmFsbGVsaXNtO1xuICB9XG5cbiAgYXN5bmMgZW5jcnlwdChwbGFpbnRleHQ6IHN0cmluZywgYWRhdGE/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5T3JUaHJvdygpO1xuICAgIGNvbnN0IGhrZGZTYWx0ID0gbmV3IFVpbnQ4QXJyYXkocmFuZG9tQnl0ZXMoSEtERl9TQUxUX0xFTkdUSCkpO1xuICAgIGNvbnN0IGl2ID0gbmV3IFVpbnQ4QXJyYXkocmFuZG9tQnl0ZXMoR0NNX0lWX0xFTkdUSCkpO1xuICAgIGNvbnN0IGFkYXRhQnl0ZXMgPSBhZGF0YSA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShhZGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWVzS2V5ID0gYXdhaXQgaGtkZkRlcml2ZUFlc0tleShrZXksIGhrZGZTYWx0LCAnZW5jcnlwdCcpO1xuICAgIGNvbnN0IGN0ID0gYXdhaXQgYWVzR2NtRW5jcnlwdChhZXNLZXksIGl2LCBwbGFpbnRleHQsIGFkYXRhQnl0ZXMpO1xuICAgIGNvbnN0IGVudmVsb3BlID0gdGhpcy5idWlsZEVudmVsb3BlKGhrZGZTYWx0LCBpdiwgY3QpO1xuICAgIGlmIChhZGF0YSkgZW52ZWxvcGUuYWRhdGEgPSBhZGF0YTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpO1xuICB9XG5cbiAgYXN5bmMgZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5T3JUaHJvdygpO1xuICAgIGNvbnN0IGVudmVsb3BlID0gcGFyc2VWMkVudmVsb3BlKGNpcGhlcnRleHQpO1xuICAgIGlmICghZW52ZWxvcGUuaGtkZlNhbHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW52ZWxvcGUgd2FzIG5vdCBlbmNyeXB0ZWQgd2l0aCBhIHNlc3Npb247IHVzZSBkZWNyeXB0VjIgaW5zdGVhZCcpO1xuICAgIH1cbiAgICBpZiAoZW52ZWxvcGUuc2FsdCAhPT0gdGhpcy5nZXRTYWx0T3JUaHJvdygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VudmVsb3BlIHdhcyBub3QgZW5jcnlwdGVkIHdpdGggdGhpcyBzZXNzaW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IGl2ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZW52ZWxvcGUuaXYsICdiYXNlNjQnKSk7XG4gICAgY29uc3QgY3QgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5jdCwgJ2Jhc2U2NCcpKTtcbiAgICBjb25zdCBoa2RmU2FsdCA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGVudmVsb3BlLmhrZGZTYWx0LCAnYmFzZTY0JykpO1xuICAgIGNvbnN0IGFkYXRhQnl0ZXMgPSBlbnZlbG9wZS5hZGF0YSA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlbnZlbG9wZS5hZGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWVzS2V5ID0gYXdhaXQgaGtkZkRlcml2ZUFlc0tleShrZXksIGhrZGZTYWx0LCAnZGVjcnlwdCcpO1xuICAgIHJldHVybiBhZXNHY21EZWNyeXB0KGFlc0tleSwgaXYsIGN0LCBhZGF0YUJ5dGVzKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5oa2RmS2V5ID0gbnVsbDtcbiAgICB0aGlzLmFyZ29uMlNhbHRCNjQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRLZXlPclRocm93KCk6IENyeXB0b0tleSB7XG4gICAgaWYgKHRoaXMuaGtkZktleSA9PT0gbnVsbCB8fCB0aGlzLmFyZ29uMlNhbHRCNjQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGlvblNlc3Npb24gaGFzIGJlZW4gZGVzdHJveWVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhrZGZLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhbHRPclRocm93KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuYXJnb24yU2FsdEI2NCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uU2Vzc2lvbiBoYXMgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXJnb24yU2FsdEI2NDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbnZlbG9wZShoa2RmU2FsdDogVWludDhBcnJheSwgaXY6IFVpbnQ4QXJyYXksIGN0OiBVaW50OEFycmF5KTogVjJFbnZlbG9wZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHY6IDIsXG4gICAgICBtOiB0aGlzLm1lbW9yeVNpemUsXG4gICAgICB0OiB0aGlzLml0ZXJhdGlvbnMsXG4gICAgICBwOiB0aGlzLnBhcmFsbGVsaXNtLFxuICAgICAgc2FsdDogdGhpcy5nZXRTYWx0T3JUaHJvdygpLFxuICAgICAgaGtkZlNhbHQ6IEJ1ZmZlci5mcm9tKGhrZGZTYWx0KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICBpdjogQnVmZmVyLmZyb20oaXYpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIGN0OiBCdWZmZXIuZnJvbShjdCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiB2MSAoU0pDTCkgc2hpbSB0aGF0IHNhdGlzZmllcyB0aGUgc2FtZSBjb250cmFjdCBhcyBFbmNyeXB0aW9uU2Vzc2lvbiBidXQgZG9lcyBub3Qgb3BlbiBhXG4gKiByZWFsIHNlc3Npb24uIEV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBjYWxsIHJ1bnMgaXRzIG93biBTSkNMIFBCS0RGMiBkZXJpdmF0aW9uIHZpYSBlbmNyeXB0KCkgL1xuICogZGVjcnlwdCgpLiBFeGlzdHMgc28gY2FsbGVycyB0aGF0IHBpbiBgZW5jcnlwdGlvblZlcnNpb246IDFgIGNhbiB1c2UgdGhlIHNhbWVcbiAqIGBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwdywgdmVyKWAgZmFjdG9yeSBhcyB2MiBjYWxsZXJzIOKAlCBubyBwZXItc2l0ZSB1c2VWMiBicmFuY2hpbmcuXG4gKiBPbmNlIHRoZSBzamNsLXJlcGxhY2VtZW50IHJvbGxvdXQgcmVtb3ZlcyB2MSBlbmNyeXB0LCB0aGlzIGNvbGxhcHNlcyB0byBub3RoaW5nLlxuICovXG5leHBvcnQgY2xhc3MgVjFFbmNyeXB0aW9uU2Vzc2lvbiB7XG4gIHByaXZhdGUgcGFzc3dvcmQ6IHN0cmluZyB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgfVxuXG4gIGFzeW5jIGVuY3J5cHQoaW5wdXQ6IHN0cmluZywgYWRhdGE/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBlbmNyeXB0KHRoaXMuZ2V0UGFzc3dvcmRPclRocm93KCksIGlucHV0LCB7IGFkYXRhLCBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHQoY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZGVjcnlwdCh0aGlzLmdldFBhc3N3b3JkT3JUaHJvdygpLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5wYXNzd29yZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFBhc3N3b3JkT3JUaHJvdygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnBhc3N3b3JkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1YxRW5jcnlwdGlvblNlc3Npb24gaGFzIGJlZW4gZGVzdHJveWVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhc3N3b3JkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVuY3J5cHRpb25TZXNzaW9uLlxuICpcbiAqIFdoZW4gZW5jcnlwdGlvblZlcnNpb24gaXMgdW5kZWZpbmVkIG9yIDIgKHRoZSBkZWZhdWx0KSwgcnVucyBBcmdvbjJpZCBvbmNlIHNvIGV2ZXJ5XG4gKiBzdWJzZXF1ZW50IGVuY3J5cHQvZGVjcnlwdCBkZXJpdmVzIGEgcGVyLWNhbGwgQUVTIGtleSB2aWEgSEtERiAoPDFtcywgbmF0aXZlIFdlYkNyeXB0bykuXG4gKlxuICogV2hlbiBlbmNyeXB0aW9uVmVyc2lvbiBpcyAxLCByZXR1cm5zIGEgVjFFbmNyeXB0aW9uU2Vzc2lvbiBzaGltIHRoYXQgcnVucyBTSkNMIFBCS0RGMiBvblxuICogZXZlcnkgY2FsbC4gVGhlIHNoaW0gc2F0aXNmaWVzIHRoZSBzYW1lIGludGVyZmFjZSBzbyBjYWxsZXJzIHRoYXQgbXVzdCBwcm9kdWNlIHYxIChTSkNMKVxuICogZW52ZWxvcGVzIGZvciBsZWdhY3kgY29uc3VtZXJzIHVzZSBvbmUgZmFjdG9yeSByZWdhcmRsZXNzIG9mIHZlcnNpb24uIE5vIHVzZVYyIGJyYW5jaGluZ1xuICogbmVlZGVkIGF0IHRoZSBjYWxsIHNpdGUuXG4gKlxuICogQ2FsbGVycyBNVVNUIGNhbGwgZGVzdHJveSgpIHRvIGNsZWFyIHRoZSBIS0RGIHJvb3QgKG9yIHJldGFpbmVkIHBhc3N3b3JkIGluIHYxIG1vZGUpIGZyb21cbiAqIG1lbW9yeS4gVXNlLWFmdGVyLWRlc3Ryb3kgdGhyb3dzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRW5jcnlwdGlvblNlc3Npb24oXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgICBpdGVyYXRpb25zPzogbnVtYmVyO1xuICAgIHBhcmFsbGVsaXNtPzogbnVtYmVyO1xuICAgIHNhbHQ/OiBVaW50OEFycmF5O1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDI7XG4gIH1cbik6IFByb21pc2U8RW5jcnlwdGlvblNlc3Npb24gfCBWMUVuY3J5cHRpb25TZXNzaW9uPiB7XG4gIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgVjFFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCk7XG4gIH1cblxuICBjb25zdCBtZW1vcnlTaXplID0gb3B0aW9ucz8ubWVtb3J5U2l6ZSA/PyBBUkdPTjJfREVGQVVMVFMubWVtb3J5U2l6ZTtcbiAgY29uc3QgaXRlcmF0aW9ucyA9IG9wdGlvbnM/Lml0ZXJhdGlvbnMgPz8gQVJHT04yX0RFRkFVTFRTLml0ZXJhdGlvbnM7XG4gIGNvbnN0IHBhcmFsbGVsaXNtID0gb3B0aW9ucz8ucGFyYWxsZWxpc20gPz8gQVJHT04yX0RFRkFVTFRTLnBhcmFsbGVsaXNtO1xuICBjb25zdCBwYXJhbXMgPSB7IG1lbW9yeVNpemUsIGl0ZXJhdGlvbnMsIHBhcmFsbGVsaXNtIH07XG5cbiAgY29uc3QgYXJnb24yU2FsdCA9IG9wdGlvbnM/LnNhbHQgPz8gbmV3IFVpbnQ4QXJyYXkocmFuZG9tQnl0ZXMoQVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGgpKTtcbiAgaWYgKGFyZ29uMlNhbHQubGVuZ3RoICE9PSBBUkdPTjJfREVGQVVMVFMuc2FsdExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2FsdCBtdXN0IGJlICR7QVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGh9IGJ5dGVzYCk7XG4gIH1cblxuICBjb25zdCBoa2RmS2V5ID0gYXdhaXQgYXJnb24yVG9Ia2RmS2V5KHBhc3N3b3JkLCBhcmdvbjJTYWx0LCBwYXJhbXMpO1xuICBjb25zdCBhcmdvbjJTYWx0QjY0ID0gQnVmZmVyLmZyb20oYXJnb24yU2FsdCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiBuZXcgRW5jcnlwdGlvblNlc3Npb24oaGtkZktleSwgYXJnb24yU2FsdEI2NCwgcGFyYW1zKTtcbn1cbiJdfQ==