UNPKG

@bitgo/utxo-bin

Version:

Command-line utility for BitGo UTXO transactions

177 lines 21.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAsPlaceholderDescription = getAsPlaceholderDescription; exports.getFixedScriptAddressPlaceholderDescription = getFixedScriptAddressPlaceholderDescription; exports.formatAddressTree = formatAddressTree; exports.formatAddressWithFormatString = formatAddressWithFormatString; exports.formatFixedScriptAddress = formatFixedScriptAddress; exports.getRange = getRange; exports.parseIndexRange = parseIndexRange; exports.generateFixedScriptAddress = generateFixedScriptAddress; exports.getDescriptorAddressPlaceholderDescription = getDescriptorAddressPlaceholderDescription; exports.formatDescriptorAddress = formatDescriptorAddress; exports.generateDescriptorAddress = generateDescriptorAddress; const assert_1 = __importDefault(require("assert")); const utxolib = __importStar(require("@bitgo/utxo-lib")); const wasm_utxo_1 = require("@bitgo/wasm-utxo"); const Parser_1 = require("./Parser"); const parseUnknown_1 = require("./parseUnknown"); const format_1 = require("./format"); const args_1 = require("./args"); function getDefaultChainCodes() { return utxolib.bitgo.chainCodes.filter( // these are rare and show an annoying warning in stderr (c) => utxolib.bitgo.scriptTypeForChain(c) !== 'p2tr' && utxolib.bitgo.scriptTypeForChain(c) !== 'p2trMusig2'); } const fixedScriptPlaceholders = { '%c': 'chain', '%i': 'index', '%p': 'userPath', '%t': 'type', '%p0': 'userPath', '%p1': 'backupPath', '%p2': 'bitgoPath', '%k0': 'userKey', '%k1': 'backupKey', '%k2': 'bitgoKey', '%s': 'scriptPubKey', '%r': 'redeemScript', '%w': 'witnessScript', '%a': 'address', }; function getAsPlaceholderDescription(v) { return Object.entries(v) .map(([placeholder, prop]) => `${placeholder} -> ${prop}`) .join('\n'); } function getFixedScriptAddressPlaceholderDescription() { return getAsPlaceholderDescription(fixedScriptPlaceholders); } function getAddressProperties(keys, chain, index, network) { const [userPath, backupPath, bitgoPath] = keys.triple.map((k) => keys.getDerivationPath(k, chain, index)); const scripts = utxolib.bitgo.getWalletOutputScripts(keys, chain, index); const [userKey, backupKey, bitgoKey] = keys.triple.map((k) => k.derivePath(userPath).publicKey.toString('hex')); const address = utxolib.address.fromOutputScript(scripts.scriptPubKey, network); return { chain, index, type: utxolib.bitgo.scriptTypeForChain(chain), userPath, backupPath, bitgoPath, userKey, backupKey, bitgoKey, scriptPubKey: scripts.scriptPubKey.toString('hex'), redeemScript: scripts.redeemScript?.toString('hex'), witnessScript: scripts.witnessScript?.toString('hex'), address, }; } function formatAddressTree(props) { const parser = new Parser_1.Parser(); return (0, format_1.formatTree)((0, parseUnknown_1.parseUnknown)(parser, 'address', props)); } function formatAddressWithFormatString(props, placeholders, format) { // replace all patterns with a % prefix from format string with the corresponding property // e.g. %p0 -> userPath, %k1 -> backupKey, etc. return format.replace(/%[a-z0-9]+/gi, (match) => { if (match in placeholders) { const prop = placeholders[match]; return String(props[prop]); } return match; }); } function formatFixedScriptAddress(props, format) { return formatAddressWithFormatString(props, fixedScriptPlaceholders, format); } function getRange(start, end) { return Array.from({ length: end - start + 1 }, (_, i) => start + i); } function parseIndexRange(ranges) { return ranges.flatMap((range) => { const [start, end] = range.split('-'); if (end) { return getRange(Number(start), Number(end)); } return [Number(start)]; }); } function* generateFixedScriptAddress(argv) { const rootXpubs = (0, args_1.getRootWalletKeys)(argv); const chains = argv.chain ?? getDefaultChainCodes(); for (const i of argv.index) { for (const chain of chains) { (0, assert_1.default)(utxolib.bitgo.isChainCode(chain)); // yield formatAddress(rootXpubs, chain, i, argv.network ?? utxolib.networks.bitcoin, argv.format); yield getAddressProperties(rootXpubs, chain, i, argv.network ?? utxolib.networks.bitcoin); } } } const descriptorAddressPlaceholders = { '%d': 'descriptor', '%i': 'index', '%e': 'explicitScript', '%s': 'scriptPubKey', '%a': 'address', }; function getDescriptorAddressPlaceholderDescription() { return getAsPlaceholderDescription(descriptorAddressPlaceholders); } function formatDescriptorAddress(props, format) { return formatAddressWithFormatString(props, descriptorAddressPlaceholders, format); } function* generateDescriptorAddress(argv) { const descriptor = wasm_utxo_1.Descriptor.fromString(argv.descriptor, 'derivable'); for (const i of argv.index) { const derived = descriptor.atDerivationIndex(i); const explicitScript = Buffer.from(derived.encode()); const scriptPubKey = Buffer.from(derived.scriptPubkey()); const address = utxolib.address.fromOutputScript(scriptPubKey, argv.network); yield { descriptor: derived.toString(), index: i, address, explicitScript: explicitScript.toString('hex'), scriptPubKey: scriptPubKey.toString('hex'), }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVBZGRyZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlbmVyYXRlQWRkcmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtEQSxrRUFJQztBQUVELGtHQUVDO0FBNkJELDhDQUdDO0FBRUQsc0VBY0M7QUFFRCw0REFFQztBQUVELDRCQUVDO0FBRUQsMENBUUM7QUFFRCxnRUFpQkM7QUFrQkQsZ0dBRUM7QUFFRCwwREFFQztBQUVELDhEQW9CQztBQTdMRCxvREFBNEI7QUFFNUIseURBQTJDO0FBQzNDLGdEQUE4QztBQUU5QyxxQ0FBa0M7QUFDbEMsaURBQThDO0FBQzlDLHFDQUFzQztBQUN0QyxpQ0FBdUQ7QUFFdkQsU0FBUyxvQkFBb0I7SUFDM0IsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0lBQ3BDLHdEQUF3RDtJQUN4RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQzlHLENBQUM7QUFDSixDQUFDO0FBa0JELE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsSUFBSSxFQUFFLE9BQU87SUFDYixJQUFJLEVBQUUsT0FBTztJQUNiLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLFVBQVU7SUFDakIsS0FBSyxFQUFFLFlBQVk7SUFDbkIsS0FBSyxFQUFFLFdBQVc7SUFDbEIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsS0FBSyxFQUFFLFdBQVc7SUFDbEIsS0FBSyxFQUFFLFVBQVU7SUFDakIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsSUFBSSxF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QUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsTUFBTTtZQUNKLFVBQVUsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQzlCLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTztZQUNQLGNBQWMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5QyxZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDM0MsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vUGFyc2VyJztcbmltcG9ydCB7IHBhcnNlVW5rbm93biB9IGZyb20gJy4vcGFyc2VVbmtub3duJztcbmltcG9ydCB7IGZvcm1hdFRyZWUgfSBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQgeyBLZXlPcHRpb25zLCBnZXRSb290V2FsbGV0S2V5cyB9IGZyb20gJy4vYXJncyc7XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRDaGFpbkNvZGVzKCk6IG51bWJlcltdIHtcbiAgcmV0dXJuIHV0eG9saWIuYml0Z28uY2hhaW5Db2Rlcy5maWx0ZXIoXG4gICAgLy8gdGhlc2UgYXJlIHJhcmUgYW5kIHNob3cgYW4gYW5ub3lpbmcgd2FybmluZyBpbiBzdGRlcnJcbiAgICAoYykgPT4gdXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oYykgIT09ICdwMnRyJyAmJiB1dHhvbGliLmJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjKSAhPT0gJ3AydHJNdXNpZzInXG4gICk7XG59XG5cbnR5cGUgRml4ZWRTY3JpcHRBZGRyZXNzUHJvcGVydGllcyA9IHtcbiAgY2hhaW46IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlO1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTtcbiAgdXNlclBhdGg6IHN0cmluZztcbiAgYmFja3VwUGF0aDogc3RyaW5nO1xuICBiaXRnb1BhdGg6IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgcmVkZWVtU2NyaXB0Pzogc3RyaW5nO1xuICB3aXRuZXNzU2NyaXB0Pzogc3RyaW5nO1xuICBzY3JpcHRQdWJLZXk6IHN0cmluZztcbiAgYWRkcmVzczogc3RyaW5nO1xufTtcblxuY29uc3QgZml4ZWRTY3JpcHRQbGFjZWhvbGRlcnMgPSB7XG4gICclYyc6ICdjaGFpbicsXG4gICclaSc6ICdpbmRleCcsXG4gICclcCc6ICd1c2VyUGF0aCcsXG4gICcldCc6ICd0eXBlJyxcbiAgJyVwMCc6ICd1c2VyUGF0aCcsXG4gICclcDEnOiAnYmFja3VwUGF0aCcsXG4gICclcDInOiAnYml0Z29QYXRoJyxcbiAgJyVrMCc6ICd1c2VyS2V5JyxcbiAgJyVrMSc6ICdiYWNrdXBLZXknLFxuICAnJWsyJzogJ2JpdGdvS2V5JyxcbiAgJyVzJzogJ3NjcmlwdFB1YktleScsXG4gICclcic6ICdyZWRlZW1TY3JpcHQnLFxuICAnJXcnOiAnd2l0bmVzc1NjcmlwdCcsXG4gICclYSc6ICdhZGRyZXNzJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc1BsYWNlaG9sZGVyRGVzY3JpcHRpb24odjogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2KVxuICAgIC5tYXAoKFtwbGFjZWhvbGRlciwgcHJvcF0pID0+IGAke3BsYWNlaG9sZGVyfSAtPiAke3Byb3B9YClcbiAgICAuam9pbignXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXhlZFNjcmlwdEFkZHJlc3NQbGFjZWhvbGRlckRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBc1BsYWNlaG9sZGVyRGVzY3JpcHRpb24oZml4ZWRTY3JpcHRQbGFjZWhvbGRlcnMpO1xufVxuXG5mdW5jdGlvbiBnZXRBZGRyZXNzUHJvcGVydGllcyhcbiAga2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgY2hhaW46IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlLFxuICBpbmRleDogbnVtYmVyLFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IEZpeGVkU2NyaXB0QWRkcmVzc1Byb3BlcnRpZXMge1xuICBjb25zdCBbdXNlclBhdGgsIGJhY2t1cFBhdGgsIGJpdGdvUGF0aF0gPSBrZXlzLnRyaXBsZS5tYXAoKGspID0+IGtleXMuZ2V0RGVyaXZhdGlvblBhdGgoaywgY2hhaW4sIGluZGV4KSk7XG4gIGNvbnN0IHNjcmlwdHMgPSB1dHhvbGliLmJpdGdvLmdldFdhbGxldE91dHB1dFNjcmlwdHMoa2V5cywgY2hhaW4sIGluZGV4KTtcbiAgY29uc3QgW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldID0ga2V5cy50cmlwbGUubWFwKChrKSA9PiBrLmRlcml2ZVBhdGgodXNlclBhdGgpLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xuICBjb25zdCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0cy5zY3JpcHRQdWJLZXksIG5ldHdvcmspO1xuICByZXR1cm4ge1xuICAgIGNoYWluLFxuICAgIGluZGV4LFxuICAgIHR5cGU6IHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSxcbiAgICB1c2VyUGF0aCxcbiAgICBiYWNrdXBQYXRoLFxuICAgIGJpdGdvUGF0aCxcbiAgICB1c2VyS2V5LFxuICAgIGJhY2t1cEtleSxcbiAgICBiaXRnb0tleSxcbiAgICBzY3JpcHRQdWJLZXk6IHNjcmlwdHMuc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICByZWRlZW1TY3JpcHQ6IHNjcmlwdHMucmVkZWVtU2NyaXB0Py50b1N0cmluZygnaGV4JyksXG4gICAgd2l0bmVzc1NjcmlwdDogc2NyaXB0cy53aXRuZXNzU2NyaXB0Py50b1N0cmluZygnaGV4JyksXG4gICAgYWRkcmVzcyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEFkZHJlc3NUcmVlKHByb3BzOiBGaXhlZFNjcmlwdEFkZHJlc3NQcm9wZXJ0aWVzIHwgRGVzY3JpcHRvckFkZHJlc3NQcm9wZXJ0aWVzKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICByZXR1cm4gZm9ybWF0VHJlZShwYXJzZVVua25vd24ocGFyc2VyLCAnYWRkcmVzcycsIHByb3BzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBZGRyZXNzV2l0aEZvcm1hdFN0cmluZyhcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwbGFjZWhvbGRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGZvcm1hdDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICAvLyByZXBsYWNlIGFsbCBwYXR0ZXJucyB3aXRoIGEgJSBwcmVmaXggZnJvbSBmb3JtYXQgc3RyaW5nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHlcbiAgLy8gZS5nLiAlcDAgLT4gdXNlclBhdGgsICVrMSAtPiBiYWNrdXBLZXksIGV0Yy5cbiAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC8lW2EtejAtOV0rL2dpLCAobWF0Y2gpID0+IHtcbiAgICBpZiAobWF0Y2ggaW4gcGxhY2Vob2xkZXJzKSB7XG4gICAgICBjb25zdCBwcm9wID0gcGxhY2Vob2xkZXJzW21hdGNoXTtcbiAgICAgIHJldHVybiBTdHJpbmcocHJvcHNbcHJvcF0pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Rml4ZWRTY3JpcHRBZGRyZXNzKHByb3BzOiBGaXhlZFNjcmlwdEFkZHJlc3NQcm9wZXJ0aWVzLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRBZGRyZXNzV2l0aEZvcm1hdFN0cmluZyhwcm9wcywgZml4ZWRTY3JpcHRQbGFjZWhvbGRlcnMsIGZvcm1hdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGVuZCAtIHN0YXJ0ICsgMSB9LCAoXywgaSkgPT4gc3RhcnQgKyBpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5kZXhSYW5nZShyYW5nZXM6IHN0cmluZ1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gcmFuZ2VzLmZsYXRNYXAoKHJhbmdlKSA9PiB7XG4gICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcmFuZ2Uuc3BsaXQoJy0nKTtcbiAgICBpZiAoZW5kKSB7XG4gICAgICByZXR1cm4gZ2V0UmFuZ2UoTnVtYmVyKHN0YXJ0KSwgTnVtYmVyKGVuZCkpO1xuICAgIH1cbiAgICByZXR1cm4gW051bWJlcihzdGFydCldO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZW5lcmF0ZUZpeGVkU2NyaXB0QWRkcmVzcyhcbiAgYXJndjogS2V5T3B0aW9ucyAmIHtcbiAgICBuZXR3b3JrPzogdXR4b2xpYi5OZXR3b3JrO1xuICAgIGNoYWluPzogbnVtYmVyW107XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgaW5kZXg6IG51bWJlcltdO1xuICB9XG4pOiBHZW5lcmF0b3I8Rml4ZWRTY3JpcHRBZGRyZXNzUHJvcGVydGllcz4ge1xuICBjb25zdCByb290WHB1YnMgPSBnZXRSb290V2FsbGV0S2V5cyhhcmd2KTtcbiAgY29uc3QgY2hhaW5zID0gYXJndi5jaGFpbiA/PyBnZXREZWZhdWx0Q2hhaW5Db2RlcygpO1xuICBmb3IgKGNvbnN0IGkgb2YgYXJndi5pbmRleCkge1xuICAgIGZvciAoY29uc3QgY2hhaW4gb2YgY2hhaW5zKSB7XG4gICAgICBhc3NlcnQodXR4b2xpYi5iaXRnby5pc0NoYWluQ29kZShjaGFpbikpO1xuICAgICAgLy8geWllbGQgZm9ybWF0QWRkcmVzcyhyb290WHB1YnMsIGNoYWluLCBpLCBhcmd2Lm5ldHdvcmsgPz8gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLCBhcmd2LmZvcm1hdCk7XG4gICAgICB5aWVsZCBnZXRBZGRyZXNzUHJvcGVydGllcyhyb290WHB1YnMsIGNoYWluLCBpLCBhcmd2Lm5ldHdvcmsgPz8gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBEZXNjcmlwdG9yQWRkcmVzc1Byb3BlcnRpZXMgPSB7XG4gIGRlc2NyaXB0b3I6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbiAgZXhwbGljaXRTY3JpcHQ6IHN0cmluZztcbiAgc2NyaXB0UHViS2V5OiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbn07XG5cbmNvbnN0IGRlc2NyaXB0b3JBZGRyZXNzUGxhY2Vob2xkZXJzID0ge1xuICAnJWQnOiAnZGVzY3JpcHRvcicsXG4gICclaSc6ICdpbmRleCcsXG4gICclZSc6ICdleHBsaWNpdFNjcmlwdCcsXG4gICclcyc6ICdzY3JpcHRQdWJLZXknLFxuICAnJWEnOiAnYWRkcmVzcycsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckFkZHJlc3NQbGFjZWhvbGRlckRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBc1BsYWNlaG9sZGVyRGVzY3JpcHRpb24oZGVzY3JpcHRvckFkZHJlc3NQbGFjZWhvbGRlcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVzY3JpcHRvckFkZHJlc3MocHJvcHM6IERlc2NyaXB0b3JBZGRyZXNzUHJvcGVydGllcywgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0QWRkcmVzc1dpdGhGb3JtYXRTdHJpbmcocHJvcHMsIGRlc2NyaXB0b3JBZGRyZXNzUGxhY2Vob2xkZXJzLCBmb3JtYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24qIGdlbmVyYXRlRGVzY3JpcHRvckFkZHJlc3MoYXJndjoge1xuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG4gIGRlc2NyaXB0b3I6IHN0cmluZztcbiAgZm9ybWF0OiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXJbXTtcbn0pOiBHZW5lcmF0b3I8RGVzY3JpcHRvckFkZHJlc3NQcm9wZXJ0aWVzPiB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoYXJndi5kZXNjcmlwdG9yLCAnZGVyaXZhYmxlJyk7XG4gIGZvciAoY29uc3QgaSBvZiBhcmd2LmluZGV4KSB7XG4gICAgY29uc3QgZGVyaXZlZCA9IGRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoaSk7XG4gICAgY29uc3QgZXhwbGljaXRTY3JpcHQgPSBCdWZmZXIuZnJvbShkZXJpdmVkLmVuY29kZSgpKTtcbiAgICBjb25zdCBzY3JpcHRQdWJLZXkgPSBCdWZmZXIuZnJvbShkZXJpdmVkLnNjcmlwdFB1YmtleSgpKTtcbiAgICBjb25zdCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0UHViS2V5LCBhcmd2Lm5ldHdvcmspO1xuICAgIHlpZWxkIHtcbiAgICAgIGRlc2NyaXB0b3I6IGRlcml2ZWQudG9TdHJpbmcoKSxcbiAgICAgIGluZGV4OiBpLFxuICAgICAgYWRkcmVzcyxcbiAgICAgIGV4cGxpY2l0U2NyaXB0OiBleHBsaWNpdFNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgICBzY3JpcHRQdWJLZXk6IHNjcmlwdFB1YktleS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxufVxuIl19