UNPKG

@coolwallet/ltc

Version:
226 lines (192 loc) 36.6 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.addressToOutScript = addressToOutScript; exports.pubkeyToAddressAndOutScript = pubkeyToAddressAndOutScript; exports.createUnsignedTransactions = createUnsignedTransactions; exports.composeFinalTransaction = composeFinalTransaction; var _core = require("@coolwallet/core"); var bufferUtil = _interopRequireWildcard(require("./bufferUtil")); var cryptoUtil = _interopRequireWildcard(require("./cryptoUtil")); var params = _interopRequireWildcard(require("../config/params")); var bitcoin = _interopRequireWildcard(require("bitcoinjs-lib")); var types = _interopRequireWildcard(require("../config/types")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function addressToOutScript(address) { var input = { address: address, network: params.activeNet }; var scriptType; var payment; if (address.startsWith('L')) { scriptType = types.ScriptType.P2PKH; payment = bitcoin.payments.p2pkh(input); } else if (address.startsWith('M')) { scriptType = types.ScriptType.P2SH_P2WPKH; payment = bitcoin.payments.p2sh(input); } else if (address.startsWith('ltc')) { scriptType = types.ScriptType.P2WPKH; payment = bitcoin.payments.p2wpkh(input); } else { throw new _core.error.SDKError(addressToOutScript.name, "Unsupport Address '".concat(address, "'")); } if (!payment.output) throw new _core.error.SDKError(addressToOutScript.name, "No OutScript for Address '".concat(address, "'")); var outScript = payment.output; var outHash = payment.hash; return { scriptType: scriptType, outScript: outScript, outHash: outHash }; } function pubkeyToAddressAndOutScript(burPublicKey, scriptType) { var input = { pubkey: burPublicKey, network: params.activeNet }; var payment; if (scriptType === types.ScriptType.P2PKH) { payment = bitcoin.payments.p2pkh(input); } else if (scriptType === types.ScriptType.P2SH_P2WPKH) { payment = bitcoin.payments.p2sh({ redeem: bitcoin.payments.p2wpkh(input) }); } else if (scriptType === types.ScriptType.P2WPKH) { payment = bitcoin.payments.p2wpkh(input); } else { throw new _core.error.SDKError(pubkeyToAddressAndOutScript.name, "Unsupport ScriptType '".concat(scriptType, "'")); } if (!payment.address) throw new _core.error.SDKError(pubkeyToAddressAndOutScript.name, "No Address for ScriptType '".concat(scriptType, "'")); if (!payment.output) throw new _core.error.SDKError(pubkeyToAddressAndOutScript.name, "No OutScript for ScriptType '".concat(scriptType, "'")); if (!payment.hash) throw new _core.error.SDKError(pubkeyToAddressAndOutScript.name, "No OutScript for ScriptType '".concat(scriptType, "'")); return { address: payment.address, outScript: payment.output, hash: payment.hash }; } function createUnsignedTransactions(scriptType, inputs, output, change) { var version = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; var lockTime = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; var versionBuf = bufferUtil.toUintBuffer(version, 4); var lockTimeBuf = bufferUtil.toUintBuffer(lockTime, 4); var inputsCount = bufferUtil.toVarUintBuffer(inputs.length); var preparedInputs = inputs.map(function (_ref) { var preTxHash = _ref.preTxHash, preIndex = _ref.preIndex, preValue = _ref.preValue, sequence = _ref.sequence, addressIndex = _ref.addressIndex, pubkeyBuf = _ref.pubkeyBuf; if (!pubkeyBuf) throw new _core.error.SDKError(createUnsignedTransactions.name, 'Public Key not exists !!'); var preOutPointBuf = Buffer.concat([Buffer.from(preTxHash, 'hex').reverse(), bufferUtil.toUintBuffer(preIndex, 4)]); var preValueBuf = bufferUtil.toUintBuffer(preValue, 8); var sequenceBuf = sequence ? bufferUtil.toUintBuffer(sequence, 4) : Buffer.from('ffffffff', 'hex'); return { addressIndex: addressIndex, pubkeyBuf: pubkeyBuf, preOutPointBuf: preOutPointBuf, preValueBuf: preValueBuf, sequenceBuf: sequenceBuf }; }); var _addressToOutScript = addressToOutScript(output.address), outputType = _addressToOutScript.scriptType, outputScript = _addressToOutScript.outScript; var outputScriptLen = bufferUtil.toVarUintBuffer(outputScript.length); var outputArray = [Buffer.concat([bufferUtil.toUintBuffer(output.value, 8), outputScriptLen, outputScript])]; if (change) { if (!change.pubkeyBuf) throw new _core.error.SDKError(createUnsignedTransactions.name, 'Public Key not exists !!'); var changeValue = bufferUtil.toUintBuffer(change.value, 8); var _pubkeyToAddressAndOu = pubkeyToAddressAndOutScript(change.pubkeyBuf, scriptType), outScript = _pubkeyToAddressAndOu.outScript; var outScriptLen = bufferUtil.toVarUintBuffer(outScript.length); outputArray.push(Buffer.concat([changeValue, outScriptLen, outScript])); } var outputsCount = bufferUtil.toVarUintBuffer(change ? 2 : 1); var outputsBuf = Buffer.concat(outputArray); var hashPrevouts = cryptoUtil.hash256(Buffer.concat(preparedInputs.map(function (input) { return input.preOutPointBuf; }))); var hashSequence = cryptoUtil.hash256(Buffer.concat(preparedInputs.map(function (input) { return input.sequenceBuf; }))); var hashOutputs = cryptoUtil.hash256(outputsBuf); var unsignedTransactions = preparedInputs.map(function (_ref2) { var pubkeyBuf = _ref2.pubkeyBuf, preOutPointBuf = _ref2.preOutPointBuf, preValueBuf = _ref2.preValueBuf, sequenceBuf = _ref2.sequenceBuf; if (scriptType === types.ScriptType.P2PKH) { var _pubkeyToAddressAndOu2 = pubkeyToAddressAndOutScript(pubkeyBuf, scriptType), _outScript = _pubkeyToAddressAndOu2.outScript; var _outScriptLen = bufferUtil.toVarUintBuffer(_outScript.length); return Buffer.concat([versionBuf, bufferUtil.toVarUintBuffer(1), preOutPointBuf, _outScriptLen, // preOutScriptBuf _outScript, // preOutScriptBuf sequenceBuf, outputsCount, outputsBuf, lockTimeBuf, Buffer.from('81000000', 'hex')]); } else { return Buffer.concat([versionBuf, hashPrevouts, hashSequence, preOutPointBuf, Buffer.from("1976a914".concat(cryptoUtil.hash160(pubkeyBuf).toString('hex'), "88ac"), 'hex'), // ScriptCode preValueBuf, sequenceBuf, hashOutputs, lockTimeBuf, Buffer.from('01000000', 'hex')]); } }); return { preparedData: { versionBuf: versionBuf, inputsCount: inputsCount, preparedInputs: preparedInputs, outputType: outputType, outputsCount: outputsCount, outputsBuf: outputsBuf, lockTimeBuf: lockTimeBuf }, unsignedTransactions: unsignedTransactions }; } function composeFinalTransaction(scriptType, preparedData, signatures) { var versionBuf = preparedData.versionBuf, inputsCount = preparedData.inputsCount, preparedInputs = preparedData.preparedInputs, outputsCount = preparedData.outputsCount, outputsBuf = preparedData.outputsBuf, lockTimeBuf = preparedData.lockTimeBuf; if (scriptType !== types.ScriptType.P2PKH && scriptType !== types.ScriptType.P2WPKH && scriptType !== types.ScriptType.P2SH_P2WPKH) { throw new _core.error.SDKError(composeFinalTransaction.name, "Unsupport ScriptType : ".concat(scriptType)); } if (scriptType === types.ScriptType.P2PKH) { var inputsBuf = Buffer.concat(preparedInputs.map(function (data, i) { var pubkeyBuf = data.pubkeyBuf, preOutPointBuf = data.preOutPointBuf, sequenceBuf = data.sequenceBuf; var signature = signatures[i]; var inScript = Buffer.concat([Buffer.from((signature.length + 1).toString(16), 'hex'), signature, Buffer.from('81', 'hex'), Buffer.from(pubkeyBuf.length.toString(16), 'hex'), pubkeyBuf]); return Buffer.concat([preOutPointBuf, bufferUtil.toVarUintBuffer(inScript.length), inScript, sequenceBuf]); })); return Buffer.concat([versionBuf, inputsCount, inputsBuf, outputsCount, outputsBuf, lockTimeBuf]); } else { var flagBuf = Buffer.from('0001', 'hex'); var segwitBuf = Buffer.concat(preparedInputs.map(function (_ref3, i) { var pubkeyBuf = _ref3.pubkeyBuf; var signature = signatures[i]; var segwitScript = Buffer.concat([Buffer.from((signature.length + 1).toString(16), 'hex'), signature, Buffer.from('01', 'hex'), Buffer.from(pubkeyBuf.length.toString(16), 'hex'), pubkeyBuf]); return Buffer.concat([Buffer.from('02', 'hex'), segwitScript]); })); var _inputsBuf = Buffer.concat(preparedInputs.map(function (_ref4) { var pubkeyBuf = _ref4.pubkeyBuf, preOutPointBuf = _ref4.preOutPointBuf, sequenceBuf = _ref4.sequenceBuf; if (scriptType === types.ScriptType.P2SH_P2WPKH) { var _pubkeyToAddressAndOu3 = pubkeyToAddressAndOutScript(pubkeyBuf, types.ScriptType.P2WPKH), outScript = _pubkeyToAddressAndOu3.outScript; var inScript = Buffer.concat([Buffer.from(outScript.length.toString(16), 'hex'), outScript]); return Buffer.concat([preOutPointBuf, bufferUtil.toVarUintBuffer(inScript.length), inScript, sequenceBuf]); } return Buffer.concat([preOutPointBuf, Buffer.from('00', 'hex'), sequenceBuf]); })); return Buffer.concat([versionBuf, flagBuf, inputsCount, _inputsBuf, outputsCount, outputsBuf, segwitBuf, lockTimeBuf]); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy90cmFuc2FjdGlvblV0aWwudHMiXSwibmFtZXMiOlsiYWRkcmVzc1RvT3V0U2NyaXB0IiwiYWRkcmVzcyIsImlucHV0IiwibmV0d29yayIsInBhcmFtcyIsImFjdGl2ZU5ldCIsInNjcmlwdFR5cGUiLCJwYXltZW50Iiwic3RhcnRzV2l0aCIsInR5cGVzIiwiU2NyaXB0VHlwZSIsIlAyUEtIIiwiYml0Y29pbiIsInBheW1lbnRzIiwicDJwa2giLCJQMlNIX1AyV1BLSCIsInAyc2giLCJQMldQS0giLCJwMndwa2giLCJlcnJvciIsIlNES0Vycm9yIiwibmFtZSIsIm91dHB1dCIsIm91dFNjcmlwdCIsIm91dEhhc2giLCJoYXNoIiwicHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0IiwiYnVyUHVibGljS2V5IiwicHVia2V5IiwicmVkZWVtIiwiY3JlYXRlVW5zaWduZWRUcmFuc2FjdGlvbnMiLCJpbnB1dHMiLCJjaGFuZ2UiLCJ2ZXJzaW9uIiwibG9ja1RpbWUiLCJ2ZXJzaW9uQnVmIiwiYnVmZmVyVXRpbCIsInRvVWludEJ1ZmZlciIsImxvY2tUaW1lQnVmIiwiaW5wdXRzQ291bnQiLCJ0b1ZhclVpbnRCdWZmZXIiLCJsZW5ndGgiLCJwcmVwYXJlZElucHV0cyIsIm1hcCIsInByZVR4SGFzaCIsInByZUluZGV4IiwicHJlVmFsdWUiLCJzZXF1ZW5jZSIsImFkZHJlc3NJbmRleCIsInB1YmtleUJ1ZiIsInByZU91dFBvaW50QnVmIiwiQnVmZmVyIiwiY29uY2F0IiwiZnJvbSIsInJldmVyc2UiLCJwcmVWYWx1ZUJ1ZiIsInNlcXVlbmNlQnVmIiwib3V0cHV0VHlwZSIsIm91dHB1dFNjcmlwdCIsIm91dHB1dFNjcmlwdExlbiIsIm91dHB1dEFycmF5IiwidmFsdWUiLCJjaGFuZ2VWYWx1ZSIsIm91dFNjcmlwdExlbiIsInB1c2giLCJvdXRwdXRzQ291bnQiLCJvdXRwdXRzQnVmIiwiaGFzaFByZXZvdXRzIiwiY3J5cHRvVXRpbCIsImhhc2gyNTYiLCJoYXNoU2VxdWVuY2UiLCJoYXNoT3V0cHV0cyIsInVuc2lnbmVkVHJhbnNhY3Rpb25zIiwiaGFzaDE2MCIsInRvU3RyaW5nIiwicHJlcGFyZWREYXRhIiwiY29tcG9zZUZpbmFsVHJhbnNhY3Rpb24iLCJzaWduYXR1cmVzIiwiaW5wdXRzQnVmIiwiZGF0YSIsImkiLCJzaWduYXR1cmUiLCJpblNjcmlwdCIsImZsYWdCdWYiLCJzZWd3aXRCdWYiLCJzZWd3aXRTY3JpcHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFTyxTQUFTQSxrQkFBVCxDQUE0QkMsT0FBNUIsRUFJTDtBQUNBLE1BQU1DLEtBQUssR0FBRztBQUNaRCxJQUFBQSxPQUFPLEVBQUVBLE9BREc7QUFFWkUsSUFBQUEsT0FBTyxFQUFFQyxNQUFNLENBQUNDO0FBRkosR0FBZDtBQUlBLE1BQUlDLFVBQUo7QUFDQSxNQUFJQyxPQUFKOztBQUNBLE1BQUlOLE9BQU8sQ0FBQ08sVUFBUixDQUFtQixHQUFuQixDQUFKLEVBQTZCO0FBQzNCRixJQUFBQSxVQUFVLEdBQUdHLEtBQUssQ0FBQ0MsVUFBTixDQUFpQkMsS0FBOUI7QUFDQUosSUFBQUEsT0FBTyxHQUFHSyxPQUFPLENBQUNDLFFBQVIsQ0FBaUJDLEtBQWpCLENBQXVCWixLQUF2QixDQUFWO0FBQ0QsR0FIRCxNQUdPLElBQUlELE9BQU8sQ0FBQ08sVUFBUixDQUFtQixHQUFuQixDQUFKLEVBQTZCO0FBQ2xDRixJQUFBQSxVQUFVLEdBQUdHLEtBQUssQ0FBQ0MsVUFBTixDQUFpQkssV0FBOUI7QUFDQVIsSUFBQUEsT0FBTyxHQUFHSyxPQUFPLENBQUNDLFFBQVIsQ0FBaUJHLElBQWpCLENBQXNCZCxLQUF0QixDQUFWO0FBQ0QsR0FITSxNQUdBLElBQUlELE9BQU8sQ0FBQ08sVUFBUixDQUFtQixLQUFuQixDQUFKLEVBQStCO0FBQ3BDRixJQUFBQSxVQUFVLEdBQUdHLEtBQUssQ0FBQ0MsVUFB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WUFBTTJELFFBQVEsR0FBRy9CLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLENBQUNELE1BQU0sQ0FBQ0UsSUFBUCxDQUFZOUIsU0FBUyxDQUFDa0IsTUFBVixDQUFpQmlDLFFBQWpCLENBQTBCLEVBQTFCLENBQVosRUFBMkMsS0FBM0MsQ0FBRCxFQUFvRG5ELFNBQXBELENBQWQsQ0FBakI7QUFDQSxlQUFPNEIsTUFBTSxDQUFDQyxNQUFQLENBQWMsQ0FBQ0YsY0FBRCxFQUFpQmQsVUFBVSxDQUFDSSxlQUFYLENBQTJCMEMsUUFBUSxDQUFDekMsTUFBcEMsQ0FBakIsRUFBOER5QyxRQUE5RCxFQUF3RTFCLFdBQXhFLENBQWQsQ0FBUDtBQUNEOztBQUNELGFBQU9MLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLENBQUNGLGNBQUQsRUFBaUJDLE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FBakIsRUFBMkNHLFdBQTNDLENBQWQsQ0FBUDtBQUNELEtBUEQsQ0FEZ0IsQ0FBbEI7O0FBV0EsV0FBT0wsTUFBTSxDQUFDQyxNQUFQLENBQWMsQ0FDbkJqQixVQURtQixFQUVuQmdELE9BRm1CLEVBR25CNUMsV0FIbUIsRUFJbkJ1QyxVQUptQixFQUtuQmIsWUFMbUIsRUFNbkJDLFVBTm1CLEVBT25Ca0IsU0FQbUIsRUFRbkI5QyxXQVJtQixDQUFkLENBQVA7QUFVRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3IgfSBmcm9tICdAY29vbHdhbGxldC9jb3JlJztcbmltcG9ydCAqIGFzIGJ1ZmZlclV0aWwgZnJvbSAnLi9idWZmZXJVdGlsJztcbmltcG9ydCAqIGFzIGNyeXB0b1V0aWwgZnJvbSAnLi9jcnlwdG9VdGlsJztcbmltcG9ydCAqIGFzIHBhcmFtcyBmcm9tICcuLi9jb25maWcvcGFyYW1zJztcbmltcG9ydCAqIGFzIGJpdGNvaW4gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkcmVzc1RvT3V0U2NyaXB0KGFkZHJlc3M6IHN0cmluZyk6IHtcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZTtcbiAgb3V0U2NyaXB0OiBCdWZmZXI7XG4gIG91dEhhc2g/OiBCdWZmZXI7XG59IHtcbiAgY29uc3QgaW5wdXQgPSB7XG4gICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICBuZXR3b3JrOiBwYXJhbXMuYWN0aXZlTmV0LFxuICB9O1xuICBsZXQgc2NyaXB0VHlwZTtcbiAgbGV0IHBheW1lbnQ7XG4gIGlmIChhZGRyZXNzLnN0YXJ0c1dpdGgoJ0wnKSkge1xuICAgIHNjcmlwdFR5cGUgPSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIO1xuICAgIHBheW1lbnQgPSBiaXRjb2luLnBheW1lbnRzLnAycGtoKGlucHV0KTtcbiAgfSBlbHNlIGlmIChhZGRyZXNzLnN0YXJ0c1dpdGgoJ00nKSkge1xuICAgIHNjcmlwdFR5cGUgPSB0eXBlcy5TY3JpcHRUeXBlLlAyU0hfUDJXUEtIO1xuICAgIHBheW1lbnQgPSBiaXRjb2luLnBheW1lbnRzLnAyc2goaW5wdXQpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgnbHRjJykpIHtcbiAgICBzY3JpcHRUeXBlID0gdHlwZXMuU2NyaXB0VHlwZS5QMldQS0g7XG4gICAgcGF5bWVudCA9IGJpdGNvaW4ucGF5bWVudHMucDJ3cGtoKGlucHV0KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoYWRkcmVzc1RvT3V0U2NyaXB0Lm5hbWUsIGBVbnN1cHBvcnQgQWRkcmVzcyAnJHthZGRyZXNzfSdgKTtcbiAgfVxuXG4gIGlmICghcGF5bWVudC5vdXRwdXQpIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihhZGRyZXNzVG9PdXRTY3JpcHQubmFtZSwgYE5vIE91dFNjcmlwdCBmb3IgQWRkcmVzcyAnJHthZGRyZXNzfSdgKTtcbiAgY29uc3Qgb3V0U2NyaXB0ID0gcGF5bWVudC5vdXRwdXQ7XG4gIGNvbnN0IG91dEhhc2ggPSBwYXltZW50Lmhhc2g7XG4gIHJldHVybiB7IHNjcmlwdFR5cGUsIG91dFNjcmlwdCwgb3V0SGFzaCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0KFxuICBidXJQdWJsaWNLZXk6IEJ1ZmZlcixcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZVxuKTogeyBhZGRyZXNzOiBzdHJpbmc7IG91dFNjcmlwdDogQnVmZmVyOyBoYXNoOiBCdWZmZXIgfSB7XG4gIGNvbnN0IGlucHV0ID0ge1xuICAgIHB1YmtleTogYnVyUHVibGljS2V5LFxuICAgIG5ldHdvcms6IHBhcmFtcy5hY3RpdmVOZXQsXG4gIH07XG5cbiAgbGV0IHBheW1lbnQ7XG4gIGlmIChzY3JpcHRUeXBlID09PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIKSB7XG4gICAgcGF5bWVudCA9IGJpdGNvaW4ucGF5bWVudHMucDJwa2goaW5wdXQpO1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09IHR5cGVzLlNjcmlwdFR5cGUuUDJTSF9QMldQS0gpIHtcbiAgICBwYXltZW50ID0gYml0Y29pbi5wYXltZW50cy5wMnNoKHtcbiAgICAgIHJlZGVlbTogYml0Y29pbi5wYXltZW50cy5wMndwa2goaW5wdXQpLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09IHR5cGVzLlNjcmlwdFR5cGUuUDJXUEtIKSB7XG4gICAgcGF5bWVudCA9IGJpdGNvaW4ucGF5bWVudHMucDJ3cGtoKGlucHV0KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IocHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0Lm5hbWUsIGBVbnN1cHBvcnQgU2NyaXB0VHlwZSAnJHtzY3JpcHRUeXBlfSdgKTtcbiAgfVxuXG4gIGlmICghcGF5bWVudC5hZGRyZXNzKVxuICAgIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihwdWJrZXlUb0FkZHJlc3NBbmRPdXRTY3JpcHQubmFtZSwgYE5vIEFkZHJlc3MgZm9yIFNjcmlwdFR5cGUgJyR7c2NyaXB0VHlwZX0nYCk7XG4gIGlmICghcGF5bWVudC5vdXRwdXQpXG4gICAgdGhyb3cgbmV3IGVycm9yLlNES0Vycm9yKHB1YmtleVRvQWRkcmVzc0FuZE91dFNjcmlwdC5uYW1lLCBgTm8gT3V0U2NyaXB0IGZvciBTY3JpcHRUeXBlICcke3NjcmlwdFR5cGV9J2ApO1xuICBpZiAoIXBheW1lbnQuaGFzaClcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IocHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0Lm5hbWUsIGBObyBPdXRTY3JpcHQgZm9yIFNjcmlwdFR5cGUgJyR7c2NyaXB0VHlwZX0nYCk7XG4gIHJldHVybiB7IGFkZHJlc3M6IHBheW1lbnQuYWRkcmVzcywgb3V0U2NyaXB0OiBwYXltZW50Lm91dHB1dCwgaGFzaDogcGF5bWVudC5oYXNoIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVbnNpZ25lZFRyYW5zYWN0aW9ucyhcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZSxcbiAgaW5wdXRzOiBBcnJheTx0eXBlcy5JbnB1dD4sXG4gIG91dHB1dDogdHlwZXMuT3V0cHV0LFxuICBjaGFuZ2U6IHR5cGVzLkNoYW5nZSB8IHVuZGVmaW5lZCxcbiAgdmVyc2lvbiA9IDEsXG4gIGxvY2tUaW1lID0gMFxuKToge1xuICBwcmVwYXJlZERhdGE6IHR5cGVzLlByZXBhcmVkRGF0YTtcbiAgdW5zaWduZWRUcmFuc2FjdGlvbnM6IEFycmF5PEJ1ZmZlcj47XG59IHtcbiAgY29uc3QgdmVyc2lvbkJ1ZiA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKHZlcnNpb24sIDQpO1xuICBjb25zdCBsb2NrVGltZUJ1ZiA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKGxvY2tUaW1lLCA0KTtcblxuICBjb25zdCBpbnB1dHNDb3VudCA9IGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKGlucHV0cy5sZW5ndGgpO1xuICBjb25zdCBwcmVwYXJlZElucHV0cyA9IGlucHV0cy5tYXAoKHsgcHJlVHhIYXNoLCBwcmVJbmRleCwgcHJlVmFsdWUsIHNlcXVlbmNlLCBhZGRyZXNzSW5kZXgsIHB1YmtleUJ1ZiB9KSA9PiB7XG4gICAgaWYgKCFwdWJrZXlCdWYpIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihjcmVhdGVVbnNpZ25lZFRyYW5zYWN0aW9ucy5uYW1lLCAnUHVibGljIEtleSBub3QgZXhpc3RzICEhJyk7XG5cbiAgICBjb25zdCBwcmVPdXRQb2ludEJ1ZiA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20ocHJlVHhIYXNoLCAnaGV4JykucmV2ZXJzZSgpLFxuICAgICAgYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIocHJlSW5kZXgsIDQpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcHJlVmFsdWVCdWYgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcihwcmVWYWx1ZSwgOCk7XG4gICAgY29uc3Qgc2VxdWVuY2VCdWYgPSBzZXF1ZW5jZSA/IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKHNlcXVlbmNlLCA0KSA6IEJ1ZmZlci5mcm9tKCdmZmZmZmZmZicsICdoZXgnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzSW5kZXgsXG4gICAgICBwdWJrZXlCdWYsXG4gICAgICBwcmVPdXRQb2ludEJ1ZixcbiAgICAgIHByZVZhbHVlQnVmLFxuICAgICAgc2VxdWVuY2VCdWYsXG4gICAgfTtcbiAgfSk7XG5cbiAgY29uc3QgeyBzY3JpcHRUeXBlOiBvdXRwdXRUeXBlLCBvdXRTY3JpcHQ6IG91dHB1dFNjcmlwdCB9ID0gYWRkcmVzc1RvT3V0U2NyaXB0KG91dHB1dC5hZGRyZXNzKTtcblxuICBjb25zdCBvdXRwdXRTY3JpcHRMZW4gPSBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihvdXRwdXRTY3JpcHQubGVuZ3RoKTtcblxuICBjb25zdCBvdXRwdXRBcnJheSA9IFtCdWZmZXIuY29uY2F0KFtidWZmZXJVdGlsLnRvVWludEJ1ZmZlcihvdXRwdXQudmFsdWUsIDgpLCBvdXRwdXRTY3JpcHRMZW4sIG91dHB1dFNjcmlwdF0pXTtcblxuICBpZiAoY2hhbmdlKSB7XG4gICAgaWYgKCFjaGFuZ2UucHVia2V5QnVmKSB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoY3JlYXRlVW5zaWduZWRUcmFuc2FjdGlvbnMubmFtZSwgJ1B1YmxpYyBLZXkgbm90IGV4aXN0cyAhIScpO1xuICAgIGNvbnN0IGNoYW5nZVZhbHVlID0gYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIoY2hhbmdlLnZhbHVlLCA4KTtcbiAgICBjb25zdCB7IG91dFNjcmlwdCB9ID0gcHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0KGNoYW5nZS5wdWJrZXlCdWYsIHNjcmlwdFR5cGUpO1xuICAgIGNvbnN0IG91dFNjcmlwdExlbiA9IGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKG91dFNjcmlwdC5sZW5ndGgpO1xuICAgIG91dHB1dEFycmF5LnB1c2goQnVmZmVyLmNvbmNhdChbY2hhbmdlVmFsdWUsIG91dFNjcmlwdExlbiwgb3V0U2NyaXB0XSkpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0c0NvdW50ID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoY2hhbmdlID8gMiA6IDEpO1xuICBjb25zdCBvdXRwdXRzQnVmID0gQnVmZmVyLmNvbmNhdChvdXRwdXRBcnJheSk7XG5cbiAgY29uc3QgaGFzaFByZXZvdXRzID0gY3J5cHRvVXRpbC5oYXNoMjU2KEJ1ZmZlci5jb25jYXQocHJlcGFyZWRJbnB1dHMubWFwKChpbnB1dCkgPT4gaW5wdXQucHJlT3V0UG9pbnRCdWYpKSk7XG4gIGNvbnN0IGhhc2hTZXF1ZW5jZSA9IGNyeXB0b1V0aWwuaGFzaDI1NihCdWZmZXIuY29uY2F0KHByZXBhcmVkSW5wdXRzLm1hcCgoaW5wdXQpID0+IGlucHV0LnNlcXVlbmNlQnVmKSkpO1xuICBjb25zdCBoYXNoT3V0cHV0cyA9IGNyeXB0b1V0aWwuaGFzaDI1NihvdXRwdXRzQnVmKTtcblxuICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9ucyA9IHByZXBhcmVkSW5wdXRzLm1hcCgoeyBwdWJrZXlCdWYsIHByZU91dFBvaW50QnVmLCBwcmVWYWx1ZUJ1Ziwgc2VxdWVuY2VCdWYgfSkgPT4ge1xuICAgIGlmIChzY3JpcHRUeXBlID09PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIKSB7XG4gICAgICBjb25zdCB7IG91dFNjcmlwdCB9ID0gcHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0KHB1YmtleUJ1Ziwgc2NyaXB0VHlwZSk7XG4gICAgICBjb25zdCBvdXRTY3JpcHRMZW4gPSBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihvdXRTY3JpcHQubGVuZ3RoKTtcbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgdmVyc2lvbkJ1ZixcbiAgICAgICAgYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoMSksXG4gICAgICAgIHByZU91dFBvaW50QnVmLFxuICAgICAgICBvdXRTY3JpcHRMZW4sIC8vIHByZU91dFNjcmlwdEJ1ZlxuICAgICAgICBvdXRTY3JpcHQsIC8vIHByZU91dFNjcmlwdEJ1ZlxuICAgICAgICBzZXF1ZW5jZUJ1ZixcbiAgICAgICAgb3V0cHV0c0NvdW50LFxuICAgICAgICBvdXRwdXRzQnVmLFxuICAgICAgICBsb2NrVGltZUJ1ZixcbiAgICAgICAgQnVmZmVyLmZyb20oJzgxMDAwMDAwJywgJ2hleCcpLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgdmVyc2lvbkJ1ZixcbiAgICAgICAgaGFzaFByZXZvdXRzLFxuICAgICAgICBoYXNoU2VxdWVuY2UsXG4gICAgICAgIHByZU91dFBvaW50QnVmLFxuICAgICAgICBCdWZmZXIuZnJvbShgMTk3NmE5MTQke2NyeXB0b1V0aWwuaGFzaDE2MChwdWJrZXlCdWYpLnRvU3RyaW5nKCdoZXgnKX04OGFjYCwgJ2hleCcpLCAvLyBTY3JpcHRDb2RlXG4gICAgICAgIHByZVZhbHVlQnVmLFxuICAgICAgICBzZXF1ZW5jZUJ1ZixcbiAgICAgICAgaGFzaE91dHB1dHMsXG4gICAgICAgIGxvY2tUaW1lQnVmLFxuICAgICAgICBCdWZmZXIuZnJvbSgnMDEwMDAwMDAnLCAnaGV4JyksXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJlcGFyZWREYXRhOiB7XG4gICAgICB2ZXJzaW9uQnVmLFxuICAgICAgaW5wdXRzQ291bnQsXG4gICAgICBwcmVwYXJlZElucHV0cyxcbiAgICAgIG91dHB1dFR5cGUsXG4gICAgICBvdXRwdXRzQ291bnQsXG4gICAgICBvdXRwdXRzQnVmLFxuICAgICAgbG9ja1RpbWVCdWYsXG4gICAgfSxcbiAgICB1bnNpZ25lZFRyYW5zYWN0aW9ucyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VGaW5hbFRyYW5zYWN0aW9uKFxuICBzY3JpcHRUeXBlOiB0eXBlcy5TY3JpcHRUeXBlLFxuICBwcmVwYXJlZERhdGE6IHR5cGVzLlByZXBhcmVkRGF0YSxcbiAgc2lnbmF0dXJlczogQXJyYXk8QnVmZmVyPlxuKTogQnVmZmVyIHtcbiAgY29uc3QgeyB2ZXJzaW9uQnVmLCBpbnB1dHNDb3VudCwgcHJlcGFyZWRJbnB1dHMsIG91dHB1dHNDb3VudCwgb3V0cHV0c0J1ZiwgbG9ja1RpbWVCdWYgfSA9IHByZXBhcmVkRGF0YTtcblxuICBpZiAoXG4gICAgc2NyaXB0VHlwZSAhPT0gdHlwZXMuU2NyaXB0VHlwZS5QMlBLSCAmJlxuICAgIHNjcmlwdFR5cGUgIT09IHR5cGVzLlNjcmlwdFR5cGUuUDJXUEtIICYmXG4gICAgc2NyaXB0VHlwZSAhPT0gdHlwZXMuU2NyaXB0VHlwZS5QMlNIX1AyV1BLSFxuICApIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoY29tcG9zZUZpbmFsVHJhbnNhY3Rpb24ubmFtZSwgYFVuc3VwcG9ydCBTY3JpcHRUeXBlIDogJHtzY3JpcHRUeXBlfWApO1xuICB9XG5cbiAgaWYgKHNjcmlwdFR5cGUgPT09IHR5cGVzLlNjcmlwdFR5cGUuUDJQS0gpIHtcbiAgICBjb25zdCBpbnB1dHNCdWYgPSBCdWZmZXIuY29uY2F0KFxuICAgICAgcHJlcGFyZWRJbnB1dHMubWFwKChkYXRhLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHVia2V5QnVmLCBwcmVPdXRQb2ludEJ1Ziwgc2VxdWVuY2VCdWYgfSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZXNbaV07XG4gICAgICAgIGNvbnN0IGluU2NyaXB0ID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgQnVmZmVyLmZyb20oKHNpZ25hdHVyZS5sZW5ndGggKyAxKS50b1N0cmluZygxNiksICdoZXgnKSxcbiAgICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgICAgQnVmZmVyLmZyb20oJzgxJywgJ2hleCcpLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleUJ1Zi5sZW5ndGgudG9TdHJpbmcoMTYpLCAnaGV4JyksXG4gICAgICAgICAgcHVia2V5QnVmLFxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3ByZU91dFBvaW50QnVmLCBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihpblNjcmlwdC5sZW5ndGgpLCBpblNjcmlwdCwgc2VxdWVuY2VCdWZdKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbdmVyc2lvbkJ1ZiwgaW5wdXRzQ291bnQsIGlucHV0c0J1Ziwgb3V0cHV0c0NvdW50LCBvdXRwdXRzQnVmLCBsb2NrVGltZUJ1Zl0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZsYWdCdWYgPSBCdWZmZXIuZnJvbSgnMDAwMScsICdoZXgnKTtcbiAgICBjb25zdCBzZWd3aXRCdWYgPSBCdWZmZXIuY29uY2F0KFxuICAgICAgcHJlcGFyZWRJbnB1dHMubWFwKCh7IHB1YmtleUJ1ZiB9LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZXNbaV07XG4gICAgICAgIGNvbnN0IHNlZ3dpdFNjcmlwdCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgIEJ1ZmZlci5mcm9tKChzaWduYXR1cmUubGVuZ3RoICsgMSkudG9TdHJpbmcoMTYpLCAnaGV4JyksXG4gICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKCcwMScsICdoZXgnKSxcbiAgICAgICAgICBCdWZmZXIuZnJvbShwdWJrZXlCdWYubGVuZ3RoLnRvU3RyaW5nKDE2KSwgJ2hleCcpLFxuICAgICAgICAgIHB1YmtleUJ1ZixcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbSgnMDInLCAnaGV4JyksIHNlZ3dpdFNjcmlwdF0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaW5wdXRzQnVmID0gQnVmZmVyLmNvbmNhdChcbiAgICAgIHByZXBhcmVkSW5wdXRzLm1hcCgoeyBwdWJrZXlCdWYsIHByZU91dFBvaW50QnVmLCBzZXF1ZW5jZUJ1ZiB9KSA9PiB7XG4gICAgICAgIGlmIChzY3JpcHRUeXBlID09PSB0eXBlcy5TY3JpcHRUeXBlLlAyU0hfUDJXUEtIKSB7XG4gICAgICAgICAgY29uc3QgeyBvdXRTY3JpcHQgfSA9IHB1YmtleVRvQWRkcmVzc0FuZE91dFNjcmlwdChwdWJrZXlCdWYsIHR5cGVzLlNjcmlwdFR5cGUuUDJXUEtIKTtcbiAgICAgICAgICBjb25zdCBpblNjcmlwdCA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKG91dFNjcmlwdC5sZW5ndGgudG9TdHJpbmcoMTYpLCAnaGV4JyksIG91dFNjcmlwdF0pO1xuICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtwcmVPdXRQb2ludEJ1ZiwgYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoaW5TY3JpcHQubGVuZ3RoKSwgaW5TY3JpcHQsIHNlcXVlbmNlQnVmXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3ByZU91dFBvaW50QnVmLCBCdWZmZXIuZnJvbSgnMDAnLCAnaGV4JyksIHNlcXVlbmNlQnVmXSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbXG4gICAgICB2ZXJzaW9uQnVmLFxuICAgICAgZmxhZ0J1ZixcbiAgICAgIGlucHV0c0NvdW50LFxuICAgICAgaW5wdXRzQnVmLFxuICAgICAgb3V0cHV0c0NvdW50LFxuICAgICAgb3V0cHV0c0J1ZixcbiAgICAgIHNlZ3dpdEJ1ZixcbiAgICAgIGxvY2tUaW1lQnVmLFxuICAgIF0pO1xuICB9XG59XG4iXX0=