@bitgo-beta/key-card 0.0.1-beta.2015 → 0.0.1-beta.2017

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.
@@ -0,0 +1,27 @@
1
+ /**
2
+ * PDF-generation helpers for the wallet encryption upgrade flow.
3
+ *
4
+ * Orchestration (unlocking the session, re-encrypting keychains, PUT-ing to the server) lives on
5
+ * `Wallet.upgradeEncryption` in `@bitgo-beta/sdk-core`. This module contains only the pieces that
6
+ * depend on `jspdf`/`qrcode` — a factory that returns a `UpgradeEncryptionPdfGenerator` the
7
+ * caller can pass into that method, plus a Node-side coin-logo loader.
8
+ */
9
+ import * as https from 'https';
10
+ import { UpgradeEncryptionPdfGenerator } from '@bitgo-beta/sdk-core';
11
+ /**
12
+ * Fetch a coin logo image and return an HTMLImageElement-compatible object.
13
+ * jsPDF reads `.src` in Node.js; computeKeyCardImageDimensions reads `.width`/`.height`.
14
+ * Returns undefined on any failure — the keycard is generated without the logo in that case.
15
+ */
16
+ export declare function loadKeycardImage(url: string, httpGet?: typeof https.get): Promise<HTMLImageElement | undefined>;
17
+ export interface KeycardPdfGeneratorOptions {
18
+ /** Base URL for loading the coin logo (e.g. Environments[env].uri). Omit to skip the logo. */
19
+ imageBaseUrl?: string;
20
+ }
21
+ /**
22
+ * Build a {@link UpgradeEncryptionPdfGenerator} that regenerates the keycard PDF with the
23
+ * canonical `generateQrData` + `drawKeycard` flow. Pass the returned function into
24
+ * `Wallet.upgradeEncryption({ generatePdf })`.
25
+ */
26
+ export declare function createKeycardPdfGenerator(options?: KeycardPdfGeneratorOptions): UpgradeEncryptionPdfGenerator;
27
+ //# sourceMappingURL=upgradeWalletEncryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeWalletEncryption.d.ts","sourceRoot":"","sources":["../../src/upgradeWalletEncryption.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAKrE;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,OAAO,KAAK,CAAC,GAAe,GACpC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAyBvC;AAED,MAAM,WAAW,0BAA0B;IACzC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,6BAA6B,CA2BjH"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * PDF-generation helpers for the wallet encryption upgrade flow.
4
+ *
5
+ * Orchestration (unlocking the session, re-encrypting keychains, PUT-ing to the server) lives on
6
+ * `Wallet.upgradeEncryption` in `@bitgo-beta/sdk-core`. This module contains only the pieces that
7
+ * depend on `jspdf`/`qrcode` — a factory that returns a `UpgradeEncryptionPdfGenerator` the
8
+ * caller can pass into that method, plus a Node-side coin-logo loader.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.loadKeycardImage = loadKeycardImage;
45
+ exports.createKeycardPdfGenerator = createKeycardPdfGenerator;
46
+ const https = __importStar(require("https"));
47
+ const statics_1 = require("@bitgo-beta/statics");
48
+ const generateQrData_1 = require("./generateQrData");
49
+ const faq_1 = require("./faq");
50
+ const drawKeycard_1 = require("./drawKeycard");
51
+ /**
52
+ * Fetch a coin logo image and return an HTMLImageElement-compatible object.
53
+ * jsPDF reads `.src` in Node.js; computeKeyCardImageDimensions reads `.width`/`.height`.
54
+ * Returns undefined on any failure — the keycard is generated without the logo in that case.
55
+ */
56
+ async function loadKeycardImage(url, httpGet = https.get) {
57
+ return new Promise((resolve) => {
58
+ httpGet(url, (res) => {
59
+ if (res.statusCode !== 200) {
60
+ console.warn(`Warning: coin logo not loaded (HTTP ${res.statusCode}) — keycard will be generated without it`);
61
+ resolve(undefined);
62
+ return;
63
+ }
64
+ const chunks = [];
65
+ res.on('data', (chunk) => chunks.push(chunk));
66
+ res.on('end', () => {
67
+ const contentType = res.headers['content-type'] ?? 'image/png';
68
+ const dataUrl = `data:${contentType};base64,${Buffer.concat(chunks).toString('base64')}`;
69
+ const img = { src: dataUrl, width: 303, height: 40 };
70
+ resolve(img);
71
+ });
72
+ res.on('error', (err) => {
73
+ console.warn(`Warning: coin logo not loaded (${err.message}) — keycard will be generated without it`);
74
+ resolve(undefined);
75
+ });
76
+ }).on('error', (err) => {
77
+ console.warn(`Warning: coin logo not loaded (${err.message}) — keycard will be generated without it`);
78
+ resolve(undefined);
79
+ });
80
+ });
81
+ }
82
+ /**
83
+ * Build a {@link UpgradeEncryptionPdfGenerator} that regenerates the keycard PDF with the
84
+ * canonical `generateQrData` + `drawKeycard` flow. Pass the returned function into
85
+ * `Wallet.upgradeEncryption({ generatePdf })`.
86
+ */
87
+ function createKeycardPdfGenerator(options = {}) {
88
+ const { imageBaseUrl } = options;
89
+ return async ({ coinName, userKeychain, backupKeychain, bitgoKeychain, passphrase, passcodeEncryptionCode, walletLabel, }) => {
90
+ const staticsCoin = statics_1.coins.get(coinName);
91
+ const keyCardImage = imageBaseUrl
92
+ ? await loadKeycardImage(`${imageBaseUrl}/web/assets/keycards/${staticsCoin.family.toLowerCase()}.png`)
93
+ : undefined;
94
+ const qrData = await (0, generateQrData_1.generateQrData)({
95
+ coin: staticsCoin,
96
+ userKeychain,
97
+ backupKeychain,
98
+ bitgoKeychain,
99
+ passphrase,
100
+ passcodeEncryptionCode,
101
+ encryptionVersion: 2,
102
+ });
103
+ const questions = (0, faq_1.generateFaq)(staticsCoin.fullName);
104
+ return (0, drawKeycard_1.drawKeycard)({ qrData, questions, walletLabel, keyCardImage });
105
+ };
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZVdhbGxldEVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXBncmFkZVdhbGxldEVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY0gsNENBNEJDO0FBWUQsOERBMkJDO0FBL0VELDZDQUErQjtBQUMvQixpREFBc0Q7QUFFdEQscURBQWtEO0FBQ2xELCtCQUFvQztBQUNwQywrQ0FBNEM7QUFFNUM7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsR0FBVyxFQUNYLFVBQTRCLEtBQUssQ0FBQyxHQUFHO0lBRXJDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxHQUFHLENBQUMsVUFBVSwwQ0FBMEMsQ0FBQyxDQUFDO2dCQUM5RyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25CLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNqQixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFdBQVcsQ0FBQztnQkFDL0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxXQUFXLFdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDekYsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBaUMsQ0FBQztnQkFDcEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7WUFDSCxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLENBQUMsT0FBTywwQ0FBMEMsQ0FBQyxDQUFDO2dCQUN0RyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLE9BQU8sMENBQTBDLENBQUMsQ0FBQztZQUN0RyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFPRDs7OztHQUlHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQUMsVUFBc0MsRUFBRTtJQUNoRixNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2pDLE9BQU8sS0FBSyxFQUFFLEVBQ1osUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsYUFBYSxFQUNiLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsV0FBVyxHQUNaLEVBQUUsRUFBRTtRQUNILE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFhLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsWUFBWTtZQUMvQixDQUFDLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLFlBQVksd0JBQXdCLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztZQUN2RyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLCtCQUFjLEVBQUM7WUFDbEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1lBQ2IsVUFBVTtZQUNWLHNCQUFzQjtZQUN0QixpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLElBQUEsaUJBQVcsRUFBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsT0FBTyxJQUFBLHlCQUFXLEVBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBERi1nZW5lcmF0aW9uIGhlbHBlcnMgZm9yIHRoZSB3YWxsZXQgZW5jcnlwdGlvbiB1cGdyYWRlIGZsb3cuXG4gKlxuICogT3JjaGVzdHJhdGlvbiAodW5sb2NraW5nIHRoZSBzZXNzaW9uLCByZS1lbmNyeXB0aW5nIGtleWNoYWlucywgUFVULWluZyB0byB0aGUgc2VydmVyKSBsaXZlcyBvblxuICogYFdhbGxldC51cGdyYWRlRW5jcnlwdGlvbmAgaW4gYEBiaXRnby1iZXRhL3Nkay1jb3JlYC4gVGhpcyBtb2R1bGUgY29udGFpbnMgb25seSB0aGUgcGllY2VzIHRoYXRcbiAqIGRlcGVuZCBvbiBganNwZGZgL2BxcmNvZGVgIOKAlCBhIGZhY3RvcnkgdGhhdCByZXR1cm5zIGEgYFVwZ3JhZGVFbmNyeXB0aW9uUGRmR2VuZXJhdG9yYCB0aGVcbiAqIGNhbGxlciBjYW4gcGFzcyBpbnRvIHRoYXQgbWV0aG9kLCBwbHVzIGEgTm9kZS1zaWRlIGNvaW4tbG9nbyBsb2FkZXIuXG4gKi9cblxuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBVcGdyYWRlRW5jcnlwdGlvblBkZkdlbmVyYXRvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGdlbmVyYXRlUXJEYXRhIH0gZnJvbSAnLi9nZW5lcmF0ZVFyRGF0YSc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZhcSB9IGZyb20gJy4vZmFxJztcbmltcG9ydCB7IGRyYXdLZXljYXJkIH0gZnJvbSAnLi9kcmF3S2V5Y2FyZCc7XG5cbi8qKlxuICogRmV0Y2ggYSBjb2luIGxvZ28gaW1hZ2UgYW5kIHJldHVybiBhbiBIVE1MSW1hZ2VFbGVtZW50LWNvbXBhdGlibGUgb2JqZWN0LlxuICoganNQREYgcmVhZHMgYC5zcmNgIGluIE5vZGUuanM7IGNvbXB1dGVLZXlDYXJkSW1hZ2VEaW1lbnNpb25zIHJlYWRzIGAud2lkdGhgL2AuaGVpZ2h0YC5cbiAqIFJldHVybnMgdW5kZWZpbmVkIG9uIGFueSBmYWlsdXJlIOKAlCB0aGUga2V5Y2FyZCBpcyBnZW5lcmF0ZWQgd2l0aG91dCB0aGUgbG9nbyBpbiB0aGF0IGNhc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkS2V5Y2FyZEltYWdlKFxuICB1cmw6IHN0cmluZyxcbiAgaHR0cEdldDogdHlwZW9mIGh0dHBzLmdldCA9IGh0dHBzLmdldFxuKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50IHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGh0dHBHZXQodXJsLCAocmVzKSA9PiB7XG4gICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IGNvaW4gbG9nbyBub3QgbG9hZGVkIChIVFRQICR7cmVzLnN0YXR1c0NvZGV9KSDigJQga2V5Y2FyZCB3aWxsIGJlIGdlbmVyYXRlZCB3aXRob3V0IGl0YCk7XG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID8/ICdpbWFnZS9wbmcnO1xuICAgICAgICBjb25zdCBkYXRhVXJsID0gYGRhdGE6JHtjb250ZW50VHlwZX07YmFzZTY0LCR7QnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xuICAgICAgICBjb25zdCBpbWcgPSB7IHNyYzogZGF0YVVybCwgd2lkdGg6IDMwMywgaGVpZ2h0OiA0MCB9IGFzIHVua25vd24gYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICAgICAgcmVzb2x2ZShpbWcpO1xuICAgICAgfSk7XG4gICAgICByZXMub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IGNvaW4gbG9nbyBub3QgbG9hZGVkICgke2Vyci5tZXNzYWdlfSkg4oCUIGtleWNhcmQgd2lsbCBiZSBnZW5lcmF0ZWQgd2l0aG91dCBpdGApO1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICB9KS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IGNvaW4gbG9nbyBub3QgbG9hZGVkICgke2Vyci5tZXNzYWdlfSkg4oCUIGtleWNhcmQgd2lsbCBiZSBnZW5lcmF0ZWQgd2l0aG91dCBpdGApO1xuICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXljYXJkUGRmR2VuZXJhdG9yT3B0aW9ucyB7XG4gIC8qKiBCYXNlIFVSTCBmb3IgbG9hZGluZyB0aGUgY29pbiBsb2dvIChlLmcuIEVudmlyb25tZW50c1tlbnZdLnVyaSkuIE9taXQgdG8gc2tpcCB0aGUgbG9nby4gKi9cbiAgaW1hZ2VCYXNlVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEge0BsaW5rIFVwZ3JhZGVFbmNyeXB0aW9uUGRmR2VuZXJhdG9yfSB0aGF0IHJlZ2VuZXJhdGVzIHRoZSBrZXljYXJkIFBERiB3aXRoIHRoZVxuICogY2Fub25pY2FsIGBnZW5lcmF0ZVFyRGF0YWAgKyBgZHJhd0tleWNhcmRgIGZsb3cuIFBhc3MgdGhlIHJldHVybmVkIGZ1bmN0aW9uIGludG9cbiAqIGBXYWxsZXQudXBncmFkZUVuY3J5cHRpb24oeyBnZW5lcmF0ZVBkZiB9KWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVLZXljYXJkUGRmR2VuZXJhdG9yKG9wdGlvbnM6IEtleWNhcmRQZGZHZW5lcmF0b3JPcHRpb25zID0ge30pOiBVcGdyYWRlRW5jcnlwdGlvblBkZkdlbmVyYXRvciB7XG4gIGNvbnN0IHsgaW1hZ2VCYXNlVXJsIH0gPSBvcHRpb25zO1xuICByZXR1cm4gYXN5bmMgKHtcbiAgICBjb2luTmFtZSxcbiAgICB1c2VyS2V5Y2hhaW4sXG4gICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBwYXNzcGhyYXNlLFxuICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgd2FsbGV0TGFiZWwsXG4gIH0pID0+IHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW5zLmdldChjb2luTmFtZSkgYXMgQmFzZUNvaW47XG4gICAgY29uc3Qga2V5Q2FyZEltYWdlID0gaW1hZ2VCYXNlVXJsXG4gICAgICA/IGF3YWl0IGxvYWRLZXljYXJkSW1hZ2UoYCR7aW1hZ2VCYXNlVXJsfS93ZWIvYXNzZXRzL2tleWNhcmRzLyR7c3RhdGljc0NvaW4uZmFtaWx5LnRvTG93ZXJDYXNlKCl9LnBuZ2ApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBxckRhdGEgPSBhd2FpdCBnZW5lcmF0ZVFyRGF0YSh7XG4gICAgICBjb2luOiBzdGF0aWNzQ29pbixcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgfSk7XG4gICAgY29uc3QgcXVlc3Rpb25zID0gZ2VuZXJhdGVGYXEoc3RhdGljc0NvaW4uZnVsbE5hbWUpO1xuICAgIHJldHVybiBkcmF3S2V5Y2FyZCh7IHFyRGF0YSwgcXVlc3Rpb25zLCB3YWxsZXRMYWJlbCwga2V5Q2FyZEltYWdlIH0pO1xuICB9O1xufVxuIl19