UNPKG

@coolwallet/zen

Version:
188 lines (155 loc) 31.8 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 types = _interopRequireWildcard(require("../config/types")); var bufferUtil = _interopRequireWildcard(require("./bufferUtil")); 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; } var bs58check = require('bs58check'); var zencashjs = require('zencashjs'); function addressToOutScript(address) { var decode = bs58check.decode(address); var prefix = decode.slice(0, 2).toString('hex'); var outHash = decode.slice(2, decode.length); var scriptType, outScript; if (prefix === '2089') { scriptType = types.ScriptType.P2PKH; outScript = Buffer.from("76a914".concat(outHash.toString('hex'), "88ac"), 'hex'); } else if (prefix === '2096') { scriptType = types.ScriptType.P2SH; outScript = Buffer.from("a914".concat(outHash.toString('hex'), "87"), 'hex'); } else { throw new _core.error.SDKError(addressToOutScript.name, "Invalid Address '".concat(address, "'")); } return { scriptType: scriptType, outScript: outScript, outHash: outHash }; } function pubkeyToAddressAndOutScript(pubkey, scriptType) { if (scriptType !== types.ScriptType.P2PKH && scriptType !== types.ScriptType.P2SH) { throw new _core.error.SDKError(pubkeyToAddressAndOutScript.name, "Unsupport ScriptType '".concat(scriptType, "'")); } var address = zencashjs.address.pubKeyToAddr(pubkey); var _addressToOutScript = addressToOutScript(address), outScript = _addressToOutScript.outScript, outHash = _addressToOutScript.outHash; return { address: address, outScript: outScript, hash: outHash }; } 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.toReverseUintBuffer(version, 4); var lockTimeBuf = bufferUtil.toReverseUintBuffer(lockTime, 4); var inputsCount = bufferUtil.toVarUintBuffer(inputs.length); var preparedInputs = inputs.map(function (_ref) { var preTxHash = _ref.preTxHash, preIndex = _ref.preIndex, sequence = _ref.sequence, addressIndex = _ref.addressIndex, pubkeyBuf = _ref.pubkeyBuf, scriptPubKey = _ref.scriptPubKey; if (!pubkeyBuf) { throw new _core.error.SDKError(createUnsignedTransactions.name, 'Public Key not exists !!'); } var preOutPointBuf = Buffer.concat([Buffer.from(preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(preIndex, 4)]); var sequenceBuf = sequence ? bufferUtil.toReverseUintBuffer(sequence, 4) : Buffer.from('ffffffff', 'hex'); var scriptLen; var scriptPubKeyBuf = Buffer.from(scriptPubKey, 'hex'); if (scriptType == types.ScriptType.P2PKH) { scriptLen = 25; } else { scriptLen = 23; } var blockHashLen = parseInt(scriptPubKeyBuf[scriptLen].toString()); var blockHashBuf = scriptPubKeyBuf.slice(scriptLen + 1, scriptLen + 1 + blockHashLen); var blockHeightLen = parseInt(scriptPubKeyBuf[scriptLen + 1 + blockHashLen].toString()); var blockHeightBuf = scriptPubKeyBuf.slice(scriptLen + 1 + blockHashLen + 1, scriptLen + 1 + blockHashLen + 1 + blockHeightLen); return { addressIndex: addressIndex, pubkeyBuf: pubkeyBuf, preOutPointBuf: preOutPointBuf, sequenceBuf: sequenceBuf, blockHashBuf: blockHashBuf, blockHeightBuf: blockHeightBuf }; }); var _addressToOutScript2 = addressToOutScript(output.address), outputType = _addressToOutScript2.scriptType, outputScript = _addressToOutScript2.outScript; var outValue = bufferUtil.toReverseUintBuffer(output.value, 8); var outBlockHashBuf = Buffer.from(output.blockHash, 'hex').reverse(); var outBlockHeightBuf = bufferUtil.toVarUintBuffer(output.blockHeight).reverse(); var outScriptPubKey = Buffer.concat([outputScript, bufferUtil.toVarUintBuffer(outBlockHashBuf.length), outBlockHashBuf, bufferUtil.toVarUintBuffer(outBlockHeightBuf.length), outBlockHeightBuf, Buffer.from('b4', 'hex')]); var outScriptPubKeyLen = bufferUtil.toVarUintBuffer(outScriptPubKey.length); var outputArray = [Buffer.concat([outValue, outScriptPubKeyLen, outScriptPubKey])]; if (change) { if (!change.pubkeyBuf) throw new _core.error.SDKError(createUnsignedTransactions.name, 'Public Key not exists !!'); var _pubkeyToAddressAndOu = pubkeyToAddressAndOutScript(change.pubkeyBuf, scriptType), changeScript = _pubkeyToAddressAndOu.outScript; var changeValue = bufferUtil.toReverseUintBuffer(change.value, 8); var changeBlockHashBuf = Buffer.from(change.blockHash, 'hex'); var changeBlockHeightBuf = bufferUtil.toVarUintBuffer(change.blockHeight); var changeScriptPubKey = Buffer.concat([changeScript, bufferUtil.toVarUintBuffer(changeBlockHashBuf.length), changeBlockHashBuf.reverse(), bufferUtil.toVarUintBuffer(changeBlockHeightBuf.length), changeBlockHeightBuf.reverse(), Buffer.from('b4', 'hex')]); var changeScriptPubKeyLen = bufferUtil.toVarUintBuffer(changeScriptPubKey.length); outputArray.push(Buffer.concat([changeValue, changeScriptPubKeyLen, changeScriptPubKey])); } var outputsCount = bufferUtil.toVarUintBuffer(change ? 2 : 1); var outputsBuf = Buffer.concat(outputArray); var unsignedTransactions = preparedInputs.map(function (_ref2) { var pubkeyBuf = _ref2.pubkeyBuf, preOutPointBuf = _ref2.preOutPointBuf, sequenceBuf = _ref2.sequenceBuf, blockHashBuf = _ref2.blockHashBuf, blockHeightBuf = _ref2.blockHeightBuf; var _pubkeyToAddressAndOu2 = pubkeyToAddressAndOutScript(pubkeyBuf, scriptType), preOutScriptBuf = _pubkeyToAddressAndOu2.outScript; var fullInput = Buffer.concat([preOutScriptBuf, bufferUtil.toVarUintBuffer(blockHashBuf.length), blockHashBuf.reverse(), bufferUtil.toVarUintBuffer(blockHeightBuf.length), blockHeightBuf.reverse(), Buffer.from('b4', 'hex')]); //const fullInputLen = return Buffer.concat([versionBuf, bufferUtil.toVarUintBuffer(1), preOutPointBuf, bufferUtil.toVarUintBuffer(fullInput.length), fullInput, sequenceBuf, outputsCount, outputsBuf, lockTimeBuf, Buffer.from('81000000', '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.P2SH) { throw new _core.error.SDKError(composeFinalTransaction.name, "Unsupport ScriptType '".concat(scriptType, "'")); } 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]); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy90cmFuc2FjdGlvblV0aWwudHMiXSwibmFtZXMiOlsiYnM1OGNoZWNrIiwicmVxdWlyZSIsInplbmNhc2hqcyIsImFkZHJlc3NUb091dFNjcmlwdCIsImFkZHJlc3MiLCJkZWNvZGUiLCJwcmVmaXgiLCJzbGljZSIsInRvU3RyaW5nIiwib3V0SGFzaCIsImxlbmd0aCIsInNjcmlwdFR5cGUiLCJvdXRTY3JpcHQiLCJ0eXBlcyIsIlNjcmlwdFR5cGUiLCJQMlBLSCIsIkJ1ZmZlciIsImZyb20iLCJQMlNIIiwiZXJyb3IiLCJTREtFcnJvciIsIm5hbWUiLCJwdWJrZXlUb0FkZHJlc3NBbmRPdXRTY3JpcHQiLCJwdWJrZXkiLCJwdWJLZXlUb0FkZHIiLCJoYXNoIiwiY3JlYXRlVW5zaWduZWRUcmFuc2FjdGlvbnMiLCJpbnB1dHMiLCJvdXRwdXQiLCJjaGFuZ2UiLCJ2ZXJzaW9uIiwibG9ja1RpbWUiLCJ2ZXJzaW9uQnVmIiwiYnVmZmVyVXRpbCIsInRvUmV2ZXJzZVVpbnRCdWZmZXIiLCJsb2NrVGltZUJ1ZiIsImlucHV0c0NvdW50IiwidG9WYXJVaW50QnVmZmVyIiwicHJlcGFyZWRJbnB1dHMiLCJtYXAiLCJwcmVUeEhhc2giLCJwcmVJbmRleCIsInNlcXVlbmNlIiwiYWRkcmVzc0luZGV4IiwicHVia2V5QnVmIiwic2NyaXB0UHViS2V5IiwicHJlT3V0UG9pbnRCdWYiLCJjb25jYXQiLCJyZXZlcnNlIiwic2VxdWVuY2VCdWYiLCJzY3JpcHRMZW4iLCJzY3JpcHRQdWJLZXlCdWYiLCJibG9ja0hhc2hMZW4iLCJwYXJzZUludCIsImJsb2NrSGFzaEJ1ZiIsImJsb2NrSGVpZ2h0TGVuIiwiYmxvY2tIZWlnaHRCdWYiLCJvdXRwdXRUeXBlIiwib3V0cHV0U2NyaXB0Iiwib3V0VmFsdWUiLCJ2YWx1ZSIsIm91dEJsb2NrSGFzaEJ1ZiIsImJsb2NrSGFzaCIsIm91dEJsb2NrSGVpZ2h0QnVmIiwiYmxvY2tIZWlnaHQiLCJvdXRTY3JpcHRQdWJLZXkiLCJvdXRTY3JpcHRQdWJLZXlMZW4iLCJvdXRwdXRBcnJheSIsImNoYW5nZVNjcmlwdCIsImNoYW5nZVZhbHVlIiwiY2hhbmdlQmxvY2tIYXNoQnVmIiwiY2hhbmdlQmxvY2tIZWlnaHRCdWYiLCJjaGFuZ2VTY3JpcHRQdWJLZXkiLCJjaGFuZ2VTY3JpcHRQdWJLZXlMZW4iLCJwdXNoIiwib3V0cHV0c0NvdW50Iiwib3V0cHV0c0J1ZiIsInVuc2lnbmVkVHJhbnNhY3Rpb25zIiwicHJlT3V0U2NyaXB0QnVmIiwiZnVsbElucHV0IiwicHJlcGFyZWREYXRhIiwiY29tcG9zZUZpbmFsVHJhbnNhY3Rpb24iLCJzaWduYXR1cmVzIiwiaW5wdXRzQnVmIiwiZGF0YSIsImkiLCJzaWduYXR1cmUiLCJpblNjcmlwdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUNBLElBQU1BLFNBQVMsR0FBR0MsT0FBTyxDQUFDLFdBQUQsQ0FBekI7O0FBQ0EsSUFBTUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsV0FBRCxDQUF6Qjs7QUFFTyxTQUFTRSxrQkFBVCxDQUE0QkMsT0FBNUIsRUFJTDtBQUNBLE1BQU1DLE1BQU0sR0FBR0wsU0FBUyxDQUFDSyxNQUFWLENBQWlCRCxPQUFqQixDQUFmO0FBQ0EsTUFBTUUsTUFBTSxHQUFHRCxNQUFNLENBQUNFLEtBQVAsQ0FBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CQyxRQUFuQixDQUE0QixLQUE1QixDQUFmO0FBQ0EsTUFBTUMsT0FBTyxHQUFHSixNQUFNLENBQUNFLEtBQVAsQ0FBYSxDQUFiLEVBQWdCRixNQUFNLENBQUNLLE1BQXZCLENBQWhCO0FBQ0EsTUFBSUMsVUFBSixFQUFnQkMsU0FBaEI7O0FBQ0EsTUFBSU4sTUFBTSxLQUFLLE1BQWYsRUFBdUI7QUFDckJLLElBQUFBLFVBQVUsR0FBR0UsS0FBSyxDQUFDQyxVQUFOLENBQWlCQyxLQUE5QjtBQUNBSCxJQUFBQSxTQUFTLEdBQUdJLE1BQU0sQ0FBQ0MsSUFBUCxpQkFBcUJSLE9BQU8sQ0FBQ0QsUUFBUixDQUFpQixLQUFqQixDQUFyQixXQUFvRCxLQUFwRCxDQUFaO0FBQ0QsR0FIRCxNQUdPLElBQUlGLE1BQU0sS0FBSyxNQUFmLEVBQXVCO0FBQzVCSyxJQUFBQSxVQUFVLEdBQUdFLEtBQUssQ0FBQ0MsVUFBTixDQUFpQkksSUFBOUI7QUFDQU4sSUFBQUEsU0FBUyxHQUFHSSxNQUFNLENBQUNDLElBQVAsZUFBbUJSLE9BQU8sQ0FBQ0QsUUFBUixDQUFpQixLQUFqQixDQUFuQixTQUFnRCxLQUFoRCxDQUFaO0FBQ0QsR0FITSxNQUdBO0FBQ0wsVUFBTSxJQUFJVyxZQUFNQyxRQUFWLENBQW1CakIsa0JBQWtCLENBQUNrQixJQUF0Qyw2QkFBZ0VqQixPQUFoRSxPQUFOO0FBQ0Q7O0FBQ0QsU0FBTztBQUFFTyxJQUFBQSxVQUFVLEVBQVZBLFVBQUY7QUFBY0MsSUFBQUEsU0FBUyxFQUFUQSxTQUFkO0FBQXlCSCxJQUFBQSxPQUFPLEVBQVBBO0FBQXpCLEdBQVA7QUFDRDs7QUFFTSxTQUFTYSwyQkFBVCxDQUNMQyxNQURLLEVBRUxaLFVBRkssRUFPTDtBQUNBLE1BQUlBLFVBQVUsS0FBS0UsS0FBSyxDQUFDQyxVQUFOLENBQWlCQyxLQUFoQyxJQUF5Q0osVUFBVSxLQUFLRSxLQUFLLENBQUNDLFVBQU4sQ0FBaUJJLElBQTdFLEVBQW1GO0FBQ2pGLFVBQU0sSUFBSUMsWUFBTUMsUUFBVixDQUFtQkUsMkJBQTJCLENBQUNELElBQS9DLGtDQUE4RVYsVUFBOUUsT0FBTjtBQUNEOztBQUNELE1BQU1QLE9BQU8sR0FBR0YsU0FBUyxDQUFDRSxPQUFWLENBQWtCb0IsWUFBbEIsQ0FBK0JELE1BQS9CLENBQWhCOztBQUNBLDRCQUErQnBCLGtCQUFrQixDQUFDQyxPQUFELENBQWpEO0FBQUEsTUFBUVEsU0FBUix1QkFBUUEsU0FBUjtBQUFBLE1BQW1CSCxPQUFuQix1QkFBbUJBLE9BQW5COztBQUNBLFNBQU87QUFBRUwsSUFBQUEsT0FBTyxFQUFQQSxPQUFGO0FBQVdRLElBQUFBLFNBQVMsRUFBVEEsU0FBWDtBQUFzQmEsSUFBQUEsSUFBSSxFQUFFaEI7QUFBNUIsR0FBUDtBQUNEOztBQUVNLFNBQVNpQiwwQkFBVCxDQUNMZixVQURLLEVBRUxnQixNQUZLLEVBR0xDLE1BSEssRUFJTEMsTUFKSyxFQVVMO0FBQUEsTUFMQUMsT0FLQSx1RUFMa0IsQ0FLbEI7QUFBQSxNQUpBQyxRQUlBLHVFQUptQixDQUluQjtBQUNBLE1BQU1DLFVBQVUsR0FBR0MsVUFBVSxDQUFDQyxtQkFBWCxDQUErQkosT0FBL0IsRUFBd0MsQ0FBeEMsQ0FBbkI7QUFDQSxNQUFNSyxXQUFXLEdBQUdGLFVBQVUsQ0FBQ0MsbUJBQVgsQ0FBK0JILFFBQS9CLEVBQXlDLENBQXpDLENBQXBCO0FBQ0EsTUFBTUssV0FBVyxHQUFHSCxVQUFVLENBQUNJLGVBQVgsQ0FBMkJWLE1BQU0sQ0FBQ2pCLE1BQWxDLENBQXBCO0FBQ0EsTUFBTTRCLGNBQWMsR0FBR1gsTUFBTSxDQUFDWSxHQUFQLENBQVcsZ0JBQThFO0FBQUEsUUFBM0VDLFNBQTJFLFFBQTNFQSxTQUEyRTtBQUFBLFFBQWhFQyxRQUFnRSxRQUFoRUEsUUFBZ0U7QUFBQSxRQUF0REMsUUFBc0QsUUFBdERBLFFBQXNEO0FBQUEsUUFBNUNDLFlBQTRDLFFBQTVDQSxZQUE0QztBQUFBLFFBQTlCQyxTQUE4QixRQUE5QkEsU0FBOEI7QUFBQSxRQUFuQkMsWUFBbUIsUUFBbkJBLFlBQW1COztBQUM5RyxRQUFJLENBQUNELFNBQUwsRUFBZ0I7QUFDZCxZQUFNLElBQUl6QixZQUFNQyxRQUFWLENBQW1CTSwwQkFBMEIsQ0FBQ0wsSUFBOUMsRUFBb0QsMEJBQXBELENBQU47QUFDRDs7QUFDRCxRQUFNeUIsY0FBYyxHQUFHOUIsTUFBTSxDQUFDK0IsTUFBUCxDQUFjLENBQ25DL0IsTUFBTSxDQUFDQyxJQUFQLENBQVl1QixTQUFaLEVBQXVCLEtBQXZCLEVBQThCUSxPQUE5QixFQURtQyxFQUVuQ2YsVUFBVSxDQUFDQyxtQkFBWCxDQUErQk8sUUFBL0IsRUFBeUMsQ0FBekMsQ0FGbUMsQ0FBZCxDQUF2QjtBQUlBLFFBQU1RLFdBQVcsR0FBR1AsUUFBUSxHQUFHVCxVQUFVLENBQUNDLG1CQUFYLENBQStCUSxRQUEvQixFQUF5QyxDQUF6QyxDQUFILEdBQWlEMUIsTUFBTSxDQUFDQyxJQUFQLENBQVksVUFBWixFQUF3QixLQUF4QixDQUE3RTtBQUNBLFFBQUlpQyxTQUFKO0FBQ0EsUUFBTUMsZUFBZSxHQUFHbkMsTUFBTSxDQUFDQyxJQUFQLENBQVk0QixZQUFaLEVBQTBCLEtBQTFCLENBQXhCOztBQUNBLFFBQUlsQyxVQUFVLElBQUlFLEtBQUssQ0FBQ0MsVUFBTixDQUFpQkMsS0FBbkMsRUFBMEM7QUFDeENtQyxNQUFBQSxTQUFTLEdBQUcsRUFBWjtBQUNELEtBRkQsTUFFTztBQUNMQSxNQUFBQSxTQUFTLEdBQUcsRUFBWjtBQUNEOztBQUVELFFBQU1FLFlBQVksR0FBR0MsUUFBUSxDQUFDRixlQUFlLENBQUNELFNBQUQsQ0FBZixDQUEyQjFDLFFBQTNCLEVBQUQsQ0FBN0I7QUFDQSxRQUFNOEMsWUFBWSxHQUFHSCxlQUFlLENBQUM1QyxLQUFoQixDQUFzQjJDLFNBQVMsR0FBRyxDQUFsQyxFQUFxQ0EsU0FBUyxHQUFHLENBQVosR0FBZ0JFLFlBQXJELENBQXJCO0FBQ0EsUUFBTUcsY0FBYyxHQUFHRixRQUFRLENBQUNGLGVBQWUsQ0FBQ0QsU0FBUyxHQUFHLENBQVosR0FBZ0JFLFlBQWpCLENBQWYsQ0FBOEM1QyxRQUE5QyxFQUFELENBQS9CO0FBQ0EsUUFBTWdELGNBQWMsR0FBR0wsZUFBZSxDQUFDNUMsS0FBaEIsQ0FDckIyQyxTQUFTLEdBQUcsQ0FBWixHQUFnQkUsWUFBaEIsR0FBK0IsQ0FEVixFQUVyQkYsU0FBUyxHQUFHLENBQVosR0FBZ0JFLFlBQWhCLEdBQStCLENBQS9CLEdBQW1DRyxjQUZkLENBQXZCO0FBSUEsV0FBTztBQUNMWixNQUFBQSxZQUFZLEVBQVpBLFlBREs7QUFFTEMsTUFBQUEsU0FBUyxFQUFUQSxTQUZLO0FBR0xFLE1BQUFBLGNBQWMsRUFBZEEsY0FISztBQUlMRyxNQUFBQSxXQUFXLEVBQVhBLFdBSks7QUFLTEssTUFBQUEsWUFBWSxFQUFaQSxZQUxLO0FBTUxFLE1BQUFBLGNBQWMsRUFBZEE7QUFOSyxLQUFQO0FBUUQsR0FoQ3NCLENBQXZCOztBQWtDQSw2QkFBNERyRCxrQkFBa0IsQ0FBQ3lCLE1BQU0sQ0FBQ3hCLE9BQVIsQ0FBOUU7QUFBQSxNQUFvQnFELFVBQXBCLHdCQUFROUMsVUFBUjtBQUFBLE1BQTJDK0MsWUFBM0Msd0JBQWdDOUMsU0FBaEM7O0FBRUEsTUFBTStDLFFBQVEsR0FBRzFCLFVBQVUsQ0FBQ0MsbUJBQVgsQ0FBK0JOLE1BQU0sQ0FBQ2dDLEtBQXRDLEVBQTZDLENBQTdDLENBQWpCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHN0MsTUFBTSxDQUFDQyxJQUFQLENBQVlXLE1BQU0sQ0FBQ2tDLFNBQW5CLEVBQThCLEtBQTlCLEVBQXFDZCxPQUFyQyxFQUF4QjtBQUNBLE1BQU1lLGlCQUFpQixHQUFHOUIsVUFBVSxDQUFDSSxlQUFYLENBQTJCVCxNQUFNLENBQUNvQyxXQUFsQyxFQUErQ2hCLE9BQS9DLEVBQTFCO0FBQ0EsTUFBTWlCLGVBQWUsR0FBR2pELE1BQU0sQ0FBQytCLE1BQVAsQ0FBYyxDQUNwQ1csWUFEb0MsRUFFcEN6QixVQUFVLENBQUNJLGVBQVgsQ0FBMkJ3QixlQUFlLENBQUNuRCxNQUEzQyxDQUZvQyxFQUdwQ21ELGVBSG9DLEVBSXBDNUIsVUFBVSxDQUFDSSxlQUFYLENBQTJCMEIsaUJBQWlCLENBQUNyRCxNQUE3QyxDQUpvQyxFQUtwQ3FELGlCQUxvQyxFQU1wQy9DLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FOb0MsQ0FBZCxDQUF4QjtBQVFBLE1BQU1pRCxrQkFBa0IsR0FBR2pDLFVBQVUsQ0FBQ0ksZUFBWCxDQUEyQjRCLGVBQWUsQ0FBQ3ZELE1BQTNDLENBQTNCO0FBQ0EsTUFBTXlELFdBQVcsR0FBRyxDQUFDbkQsTUFBTSxDQUFDK0IsTUFBUCxDQUFjLENBQUNZLFFBQUQsRUFBV08sa0JBQVgsRUFBK0JELGVBQS9CLENBQWQsQ0FBRCxDQUFwQjs7QUFDQSxNQUFJcEMsTUFBSixFQUFZO0FBQ1YsUUFBSSxDQUFDQSxNQUFNLENBQUNlLFNBQVosRUFBdUIsTUFBTSxJQUFJekIsWUFBTUMsUUFBVixDQUFtQk0sMEJBQTBCLENBQUNMLElBQTlDLEVBQW9ELDBCQUFwRCxDQUFOOztBQUV2QixnQ0FBb0NDLDJCQUEyQixDQUFDTyxNQUFNLENBQUNlLFNBQVIsRUFBbUJqQyxVQUFuQixDQUEvRDtBQUFBLFFBQW1CeUQsWUFBbkIseUJBQVF4RCxTQUFSOztBQUNBLFFBQU15RCxXQUFXLEdBQUdwQyxVQUFVLENBQUNDLG1CQUFYLENBQStCTCxNQUFNLENBQUMrQixLQUF0QyxFQUE2QyxDQUE3QyxDQUFwQjtBQUNBLFFBQU1VLGtCQUFrQixHQUFHdEQsTUFBTSxDQUFDQyxJQUFQLENBQVlZLE1BQU0sQ0FBQ2lDLFNBQW5CLEVBQThCLEtBQTlCLENBQTNCO0FBQ0EsUUFBTVMsb0JBQW9CLEdBQUd0QyxVQUFVLENBQUNJLGVBQVgsQ0FBMkJSLE1BQU0sQ0FBQ21DLFdBQWxDLENBQTdCO0FBQ0EsUUFBTVEsa0JBQWtCLEdBQUd4RCxNQUFNLENBQUMrQixNQUFQLENBQWMsQ0FDdkNxQixZQUR1QyxFQUV2Q25DLFVBQVUsQ0FBQ0ksZUFBWCxDQUEyQmlDLGtCQUFrQixDQUFDNUQsTUFBOUMsQ0FGdUMsRUFHdkM0RCxrQkFBa0IsQ0FBQ3RCLE9BQW5CLEVBSHVDLEVBSXZDZixVQUFVLENBQUNJLGVBQVgsQ0FBMkJrQyxvQkFBb0IsQ0FBQzdELE1BQWhELENBSnVDLEVBS3ZDNkQsb0JBQW9CLENBQUN2QixPQUFyQixFQUx1QyxFQU12Q2hDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FOdUMsQ0FBZCxDQUEzQjtBQVFBLFFBQU13RCxxQkFBcUIsR0FBR3hDLFVBQVUsQ0FBQ0ksZUFBWCxDQUEyQm1DLGtCQUFrQixDQUFDOUQsTUFBOUMsQ0FBOUI7QUFDQXlELElBQUFBLFdBQVcsQ0FBQ08sSUFBWixDQUFpQjFELE1BQU0sQ0FBQytCLE1BQVAsQ0FBYyxDQUFDc0IsV0FBRCxFQUFjSSxxQkFBZCxFQUFxQ0Qsa0JBQXJDLENBQWQsQ0FBakI7QUFDRDs7QUFFRCxNQUFNRyxZQUFZLEdBQUcxQyxVQUFVLENBQUNJLGVBQVgsQ0FBMkJSLE1BQU0sR0FBRyxDQUFILEdBQU8sQ0FBeEMsQ0FBckI7QUFDQSxNQUFNK0MsVUFBVSxHQUFHNUQsTUFBTSxDQUFDK0IsTUFBUCxDQUFjb0IsV0FBZCxDQUFuQjtBQUVBLE1BQU1VLG9CQUFvQixHQUFHdkMsY0FBYyxDQUFDQyxHQUFmLENBQzNCLGlCQUE4RTtBQUFBLFFBQTNFSyxTQUEyRSxTQUEzRUEsU0FBMkU7QUFBQSxRQUFoRUUsY0FBZ0UsU0FBaEVBLGNBQWdFO0FBQUEsUUFBaERHLFdBQWdELFNBQWhEQSxXQUFnRDtBQUFBLFFBQW5DSyxZQUFtQyxTQUFuQ0EsWUFBbUM7QUFBQSxRQUFyQkUsY0FBcUIsU0FBckJBLGNBQXFCOztBQUM1RSxpQ0FBdUNsQywyQkFBMkIsQ0FBQ3NCLFNBQUQsRUFBWWpDLFVBQVosQ0FBbEU7QUFBQSxRQUFtQm1FLGVBQW5CLDBCQUFRbEUsU0FBUjs7QUFDQSxRQUFNbUUsU0FBUyxHQUFHL0QsTUFBTSxDQUFDK0IsTUFBUCxDQUFjLENBQzlCK0IsZUFEOEIsRUFFOUI3QyxVQUFVLENBQUNJLGVBQVgsQ0FBMkJpQixZQUFZLENBQUM1QyxNQUF4QyxDQUY4QixFQUc5QjRDLFlBQVksQ0FBQ04sT0FBYixFQUg4QixFQUk5QmYsVUFBVSxDQUFDSSxlQUFYLENBQTJCbUIsY0FBYyxDQUFDOUMsTUFBMUMsQ0FKOEIsRUFLOUI4QyxjQUFjLENBQUNSLE9BQWYsRUFMOEIsRUFNOUJoQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxJQUFaLEVBQWtCLEtBQWxCLENBTjhCLENBQWQsQ0FBbEIsQ0FGNEUsQ0FVNUU7O0FBQ0EsV0FBT0QsTUFBTSxDQUFDK0IsTUFBUCxDQUFjLENBQ25CZixVQURtQixFQUVuQkMsVUFBVSxDQUFDSSxlQUFYLENBQTJCLENBQTNCLENBRm1CLEVBR25CUyxjQUhtQixFQUluQmIsVUFBVSxDQUFDSSxlQUFYLENBQTJCMEMsU0FBUyxDQUFDckUsTUFBckMsQ0FKbUIsRUFLbkJxRSxTQUxtQixFQU1uQjlCLFdBTm1CLEVBT25CMEIsWUFQbUIsRUFRbkJDLFVBUm1CLEVBU25CekMsV0FUbUIsRUFVbkJuQixNQUFNLENBQUNDLElBQVAsQ0FBWSxVQUFaLEVBQXdCLEtBQXhCLENBVm1CLENBQWQsQ0FBUDtBQVlELEdBeEIwQixDQUE3QjtBQTJCQSxTQUFPO0FBQ0wrRCxJQUFBQSxZQUFZLEVBQUU7QUFDWmhELE1BQUFBLFVBQVUsRUFBVkEsVUFEWTtBQUVaSSxNQUFBQSxXQUFXLEVBQVhBLFdBRlk7QUFHWkUsTUFBQUEsY0FBYyxFQUFkQSxjQUhZO0FBSVptQixNQUFBQSxVQUFVLEVBQVZBLFVBSlk7QUFLWmtCLE1BQUFBLFlBQVksRUFBWkEsWUFMWTtBQU1aQyxNQUFBQSxVQUFVLEVBQVZBLFVBTlk7QUFPWnpDLE1BQUFBLFdBQVcsRUFBWEE7QUFQWSxLQURUO0FBVUwwQyxJQUFBQSxvQkFBb0IsRUFBcEJBO0FBVkssR0FBUDtBQVlEOztBQUVNLFNBQVNJLHVCQUFULENBQ0x0RSxVQURLLEVBRUxxRSxZQUZLLEVBR0xFLFVBSEssRUFJRztBQUNSLE1BQVFsRCxVQUFSLEdBQTJGZ0QsWUFBM0YsQ0FBUWhELFVBQVI7QUFBQSxNQUFvQkksV0FBcEIsR0FBMkY0QyxZQUEzRixDQUFvQjVDLFdBQXBCO0FBQUEsTUFBaUNFLGNBQWpDLEdBQTJGMEMsWUFBM0YsQ0FBaUMxQyxjQUFqQztBQUFBLE1BQWlEcUMsWUFBakQsR0FBMkZLLFlBQTNGLENBQWlETCxZQUFqRDtBQUFBLE1BQStEQyxVQUEvRCxHQUEyRkksWUFBM0YsQ0FBK0RKLFVBQS9EO0FBQUEsTUFBMkV6QyxXQUEzRSxHQUEyRjZDLFlBQTNGLENBQTJFN0MsV0FBM0U7O0FBRUEsTUFBSXhCLFVBQVUsS0FBS0UsS0FBSyxDQUFDQyxVQUFOLENBQWlCQyxLQUFoQyxJQUF5Q0osVUFBVSxLQUFLRSxLQUFLLENBQUNDLFVBQU4sQ0FBaUJJLElBQTdFLEVBQW1GO0FBQ2pGLFVBQU0sSUFBSUMsWUFBTUMsUUFBVixDQUFtQjZELHVCQUF1QixDQUFDNUQsSUFBM0Msa0NBQTBFVixVQUExRSxPQUFOO0FBQ0Q7O0FBRUQsTUFBTXdFLFNBQVMsR0FBR25FLE1BQU0sQ0FBQytCLE1BQVAsQ0FDaEJULGNBQWMsQ0FBQ0MsR0FBZixDQUFtQixVQUFDNkMsSUFBRCxFQUFPQyxDQUFQLEVBQWE7QUFDOUIsUUFBUXpDLFNBQVIsR0FBbUR3QyxJQUFuRCxDQUFReEMsU0FBUjtBQUFBLFFBQW1CRSxjQUFuQixHQUFtRHNDLElBQW5ELENBQW1CdEMsY0FBbkI7QUFBQSxRQUFtQ0csV0FBbkMsR0FBbURtQyxJQUFuRCxDQUFtQ25DLFdBQW5DO0FBQ0EsUUFBTXFDLFNBQVMsR0FBR0osVUFBVSxDQUFDRyxDQUFELENBQTVCO0FBQ0EsUUFBTUUsUUFBUSxHQUFHdkUsTUFBTSxDQUFDK0IsTUFBUCxDQUFjLENBQzdCL0IsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ3FFLFNBQVMsQ0FBQzVFLE1BQVYsR0FBbUIsQ0FBcEIsRUFBdUJGLFFBQXZCLENBQWdDLEVBQWhDLENBQVosRUFBaUQsS0FBakQsQ0FENkIsRUFFN0I4RSxTQUY2QixFQUc3QnRFLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FINkIsRUFJN0JELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZMkIsU0FBUyxDQUFDbEMsTUFBVixDQUFpQkYsUUFBakIsQ0FBMEIsRUFBMUIsQ0FBWixFQUEyQyxLQUEzQyxDQUo2QixFQUs3Qm9DLFNBTDZCLENBQWQsQ0FBakI7QUFPQSxXQUFPNUIsTUFBTSxDQUFDK0IsTUFBUCxDQUFjLENBQUNELGNBQUQsRUFBaUJiLFVBQVUsQ0FBQ0ksZUFBWCxDQUEyQmtELFFBQVEsQ0FBQzdFLE1BQXBDLENBQWpCLEVBQThENkUsUUFBOUQsRUFBd0V0QyxXQUF4RSxDQUFkLENBQVA7QUFDRCxHQVhELENBRGdCLENBQWxCO0FBY0EsU0FBT2pDLE1BQU0sQ0FBQytCLE1BQVAsQ0FBYyxDQUFDZixVQUFELEVBQWFJLFdBQWIsRUFBMEIrQyxTQUExQixFQUFxQ1IsWUFBckMsRUFBbURDLFVBQW5ELEVBQStEekMsV0FBL0QsQ0FBZCxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlcnJvciB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCAqIGFzIGJ1ZmZlclV0aWwgZnJvbSAnLi9idWZmZXJVdGlsJztcbmNvbnN0IGJzNThjaGVjayA9IHJlcXVpcmUoJ2JzNThjaGVjaycpO1xuY29uc3QgemVuY2FzaGpzID0gcmVxdWlyZSgnemVuY2FzaGpzJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRyZXNzVG9PdXRTY3JpcHQoYWRkcmVzczogc3RyaW5nKToge1xuICBzY3JpcHRUeXBlOiB0eXBlcy5TY3JpcHRUeXBlO1xuICBvdXRTY3JpcHQ6IEJ1ZmZlcjtcbiAgb3V0SGFzaDogQnVmZmVyO1xufSB7XG4gIGNvbnN0IGRlY29kZSA9IGJzNThjaGVjay5kZWNvZGUoYWRkcmVzcyk7XG4gIGNvbnN0IHByZWZpeCA9IGRlY29kZS5zbGljZSgwLCAyKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IG91dEhhc2ggPSBkZWNvZGUuc2xpY2UoMiwgZGVjb2RlLmxlbmd0aCk7XG4gIGxldCBzY3JpcHRUeXBlLCBvdXRTY3JpcHQ7XG4gIGlmIChwcmVmaXggPT09ICcyMDg5Jykge1xuICAgIHNjcmlwdFR5cGUgPSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIO1xuICAgIG91dFNjcmlwdCA9IEJ1ZmZlci5mcm9tKGA3NmE5MTQke291dEhhc2gudG9TdHJpbmcoJ2hleCcpfTg4YWNgLCAnaGV4Jyk7XG4gIH0gZWxzZSBpZiAocHJlZml4ID09PSAnMjA5NicpIHtcbiAgICBzY3JpcHRUeXBlID0gdHlwZXMuU2NyaXB0VHlwZS5QMlNIO1xuICAgIG91dFNjcmlwdCA9IEJ1ZmZlci5mcm9tKGBhOTE0JHtvdXRIYXNoLnRvU3RyaW5nKCdoZXgnKX04N2AsICdoZXgnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoYWRkcmVzc1RvT3V0U2NyaXB0Lm5hbWUsIGBJbnZhbGlkIEFkZHJlc3MgJyR7YWRkcmVzc30nYCk7XG4gIH1cbiAgcmV0dXJuIHsgc2NyaXB0VHlwZSwgb3V0U2NyaXB0LCBvdXRIYXNoIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdWJrZXlUb0FkZHJlc3NBbmRPdXRTY3JpcHQoXG4gIHB1YmtleTogQnVmZmVyLFxuICBzY3JpcHRUeXBlOiB0eXBlcy5TY3JpcHRUeXBlXG4pOiB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgb3V0U2NyaXB0OiBCdWZmZXI7XG4gIGhhc2g6IEJ1ZmZlcjtcbn0ge1xuICBpZiAoc2NyaXB0VHlwZSAhPT0gdHlwZXMuU2NyaXB0VHlwZS5QMlBLSCAmJiBzY3JpcHRUeXBlICE9PSB0eXBlcy5TY3JpcHRUeXBlLlAyU0gpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IocHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0Lm5hbWUsIGBVbnN1cHBvcnQgU2NyaXB0VHlwZSAnJHtzY3JpcHRUeXBlfSdgKTtcbiAgfVxuICBjb25zdCBhZGRyZXNzID0gemVuY2FzaGpzLmFkZHJlc3MucHViS2V5VG9BZGRyKHB1YmtleSk7XG4gIGNvbnN0IHsgb3V0U2NyaXB0LCBvdXRIYXNoIH0gPSBhZGRyZXNzVG9PdXRTY3JpcHQoYWRkcmVzcyk7XG4gIHJldHVybiB7IGFkZHJlc3MsIG91dFNjcmlwdCwgaGFzaDogb3V0SGFzaCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRUcmFuc2FjdGlvbnMoXG4gIHNjcmlwdFR5cGU6IHR5cGVzLlNjcmlwdFR5cGUsXG4gIGlucHV0czogQXJyYXk8dHlwZXMuSW5wdXQ+LFxuICBvdXRwdXQ6IHR5cGVzLk91dHB1dCxcbiAgY2hhbmdlOiB0eXBlcy5DaGFuZ2UgfCB1bmRlZmluZWQsXG4gIHZlcnNpb246IG51bWJlciA9IDEsXG4gIGxvY2tUaW1lOiBudW1iZXIgPSAwXG4pOiB7XG4gIHByZXBhcmVkRGF0YTogdHlwZXMuUHJlcGFyZWREYXRhO1xuICB1bnNpZ25lZFRyYW5zYWN0aW9uczogQXJyYXk8QnVmZmVyPjtcbn0ge1xuICBjb25zdCB2ZXJzaW9uQnVmID0gYnVmZmVyVXRpbC50b1JldmVyc2VVaW50QnVmZmVyKHZlcnNpb24sIDQpO1xuICBjb25zdCBsb2NrVGltZUJ1ZiA9IGJ1ZmZlclV0aWwudG9SZXZlcnNlVWludEJ1ZmZlcihsb2NrVGltZSwgNCk7XG4gIGNvbnN0IGlucHV0c0NvdW50ID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoaW5wdXRzLmxlbmd0aCk7XG4gIGNvbnN0IHByZXBhcmVkSW5wdXRzID0gaW5wdXRzLm1hcCgoeyBwcmVUeEhhc2gsIHByZUluZGV4LCBzZXF1ZW5jZSwgYWRkcmVzc0luZGV4LCBwdWJrZXlCdWYsIHNjcmlwdFB1YktleSB9KSA9PiB7XG4gICAgaWYgKCFwdWJrZXlCdWYpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihjcmVhdGVVbnNpZ25lZFRyYW5zYWN0aW9ucy5uYW1lLCAnUHVibGljIEtleSBub3QgZXhpc3RzICEhJyk7XG4gICAgfVxuICAgIGNvbnN0IHByZU91dFBvaW50QnVmID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBCdWZmZXIuZnJvbShwcmVUeEhhc2gsICdoZXgnKS5yZXZlcnNlKCksXG4gICAgICBidWZmZXJVdGlsLnRvUmV2ZXJzZVVpbnRCdWZmZXIocHJlSW5kZXgsIDQpLFxuICAgIF0pO1xuICAgIGNvbnN0IHNlcXVlbmNlQnVmID0gc2VxdWVuY2UgPyBidWZmZXJVdGlsLnRvUmV2ZXJzZVVpbnRCdWZmZXIoc2VxdWVuY2UsIDQpIDogQnVmZmVyLmZyb20oJ2ZmZmZmZmZmJywgJ2hleCcpO1xuICAgIGxldCBzY3JpcHRMZW47XG4gICAgY29uc3Qgc2NyaXB0UHViS2V5QnVmID0gQnVmZmVyLmZyb20oc2NyaXB0UHViS2V5LCAnaGV4Jyk7XG4gICAgaWYgKHNjcmlwdFR5cGUgPT0gdHlwZXMuU2NyaXB0VHlwZS5QMlBLSCkge1xuICAgICAgc2NyaXB0TGVuID0gMjU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdExlbiA9IDIzO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2NrSGFzaExlbiA9IHBhcnNlSW50KHNjcmlwdFB1YktleUJ1ZltzY3JpcHRMZW5dLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGJsb2NrSGFzaEJ1ZiA9IHNjcmlwdFB1YktleUJ1Zi5zbGljZShzY3JpcHRMZW4gKyAxLCBzY3JpcHRMZW4gKyAxICsgYmxvY2tIYXNoTGVuKTtcbiAgICBjb25zdCBibG9ja0hlaWdodExlbiA9IHBhcnNlSW50KHNjcmlwdFB1YktleUJ1ZltzY3JpcHRMZW4gKyAxICsgYmxvY2tIYXNoTGVuXS50b1N0cmluZygpKTtcbiAgICBjb25zdCBibG9ja0hlaWdodEJ1ZiA9IHNjcmlwdFB1YktleUJ1Zi5zbGljZShcbiAgICAgIHNjcmlwdExlbiArIDEgKyBibG9ja0hhc2hMZW4gKyAxLFxuICAgICAgc2NyaXB0TGVuICsgMSArIGJsb2NrSGFzaExlbiArIDEgKyBibG9ja0hlaWdodExlblxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NJbmRleCxcbiAgICAgIHB1YmtleUJ1ZixcbiAgICAgIHByZU91dFBvaW50QnVmLFxuICAgICAgc2VxdWVuY2VCdWYsXG4gICAgICBibG9ja0hhc2hCdWYsXG4gICAgICBibG9ja0hlaWdodEJ1ZixcbiAgICB9O1xuICB9KTtcblxuICBjb25zdCB7IHNjcmlwdFR5cGU6IG91dHB1dFR5cGUsIG91dFNjcmlwdDogb3V0cHV0U2NyaXB0IH0gPSBhZGRyZXNzVG9PdXRTY3JpcHQob3V0cHV0LmFkZHJlc3MpO1xuXG4gIGNvbnN0IG91dFZhbHVlID0gYnVmZmVyVXRpbC50b1JldmVyc2VVaW50QnVmZmVyKG91dHB1dC52YWx1ZSwgOCk7XG4gIGNvbnN0IG91dEJsb2NrSGFzaEJ1ZiA9IEJ1ZmZlci5mcm9tKG91dHB1dC5ibG9ja0hhc2gsICdoZXgnKS5yZXZlcnNlKCk7XG4gIGNvbnN0IG91dEJsb2NrSGVpZ2h0QnVmID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIob3V0cHV0LmJsb2NrSGVpZ2h0KS5yZXZlcnNlKCk7XG4gIGNvbnN0IG91dFNjcmlwdFB1YktleSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIG91dHB1dFNjcmlwdCxcbiAgICBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihvdXRCbG9ja0hhc2hCdWYubGVuZ3RoKSxcbiAgICBvdXRCbG9ja0hhc2hCdWYsXG4gICAgYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIob3V0QmxvY2tIZWlnaHRCdWYubGVuZ3RoKSxcbiAgICBvdXRCbG9ja0hlaWdodEJ1ZixcbiAgICBCdWZmZXIuZnJvbSgnYjQnLCAnaGV4JyksXG4gIF0pO1xuICBjb25zdCBvdXRTY3JpcHRQdWJLZXlMZW4gPSBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihvdXRTY3JpcHRQdWJLZXkubGVuZ3RoKTtcbiAgY29uc3Qgb3V0cHV0QXJyYXkgPSBbQnVmZmVyLmNvbmNhdChbb3V0VmFsdWUsIG91dFNjcmlwdFB1YktleUxlbiwgb3V0U2NyaXB0UHViS2V5XSldO1xuICBpZiAoY2hhbmdlKSB7XG4gICAgaWYgKCFjaGFuZ2UucHVia2V5QnVmKSB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoY3JlYXRlVW5zaWduZWRUcmFuc2FjdGlvbnMubmFtZSwgJ1B1YmxpYyBLZXkgbm90IGV4aXN0cyAhIScpO1xuXG4gICAgY29uc3QgeyBvdXRTY3JpcHQ6IGNoYW5nZVNjcmlwdCB9ID0gcHVia2V5VG9BZGRyZXNzQW5kT3V0U2NyaXB0KGNoYW5nZS5wdWJrZXlCdWYsIHNjcmlwdFR5cGUpO1xuICAgIGNvbnN0IGNoYW5nZVZhbHVlID0gYnVmZmVyVXRpbC50b1JldmVyc2VVaW50QnVmZmVyKGNoYW5nZS52YWx1ZSwgOCk7XG4gICAgY29uc3QgY2hhbmdlQmxvY2tIYXNoQnVmID0gQnVmZmVyLmZyb20oY2hhbmdlLmJsb2NrSGFzaCwgJ2hleCcpO1xuICAgIGNvbnN0IGNoYW5nZUJsb2NrSGVpZ2h0QnVmID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoY2hhbmdlLmJsb2NrSGVpZ2h0KTtcbiAgICBjb25zdCBjaGFuZ2VTY3JpcHRQdWJLZXkgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIGNoYW5nZVNjcmlwdCxcbiAgICAgIGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKGNoYW5nZUJsb2NrSGFzaEJ1Zi5sZW5ndGgpLFxuICAgICAgY2hhbmdlQmxvY2tIYXNoQnVmLnJldmVyc2UoKSxcbiAgICAgIGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKGNoYW5nZUJsb2NrSGVpZ2h0QnVmLmxlbmd0aCksXG4gICAgICBjaGFuZ2VCbG9ja0hlaWdodEJ1Zi5yZXZlcnNlKCksXG4gICAgICBCdWZmZXIuZnJvbSgnYjQnLCAnaGV4JyksXG4gICAgXSk7XG4gICAgY29uc3QgY2hhbmdlU2NyaXB0UHViS2V5TGVuID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoY2hhbmdlU2NyaXB0UHViS2V5Lmxlbmd0aCk7XG4gICAgb3V0cHV0QXJyYXkucHVzaChCdWZmZXIuY29uY2F0KFtjaGFuZ2VWYWx1ZSwgY2hhbmdlU2NyaXB0UHViS2V5TGVuLCBjaGFuZ2VTY3JpcHRQdWJLZXldKSk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRzQ291bnQgPSBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihjaGFuZ2UgPyAyIDogMSk7XG4gIGNvbnN0IG91dHB1dHNCdWYgPSBCdWZmZXIuY29uY2F0KG91dHB1dEFycmF5KTtcblxuICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9ucyA9IHByZXBhcmVkSW5wdXRzLm1hcChcbiAgICAoeyBwdWJrZXlCdWYsIHByZU91dFBvaW50QnVmLCBzZXF1ZW5jZUJ1ZiwgYmxvY2tIYXNoQnVmLCBibG9ja0hlaWdodEJ1ZiB9KSA9PiB7XG4gICAgICBjb25zdCB7IG91dFNjcmlwdDogcHJlT3V0U2NyaXB0QnVmIH0gPSBwdWJrZXlUb0FkZHJlc3NBbmRPdXRTY3JpcHQocHVia2V5QnVmLCBzY3JpcHRUeXBlKTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBwcmVPdXRTY3JpcHRCdWYsXG4gICAgICAgIGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKGJsb2NrSGFzaEJ1Zi5sZW5ndGgpLFxuICAgICAgICBibG9ja0hhc2hCdWYucmV2ZXJzZSgpLFxuICAgICAgICBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcihibG9ja0hlaWdodEJ1Zi5sZW5ndGgpLFxuICAgICAgICBibG9ja0hlaWdodEJ1Zi5yZXZlcnNlKCksXG4gICAgICAgIEJ1ZmZlci5mcm9tKCdiNCcsICdoZXgnKSxcbiAgICAgIF0pO1xuICAgICAgLy9jb25zdCBmdWxsSW5wdXRMZW4gPVxuICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICB2ZXJzaW9uQnVmLFxuICAgICAgICBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcigxKSxcbiAgICAgICAgcHJlT3V0UG9pbnRCdWYsXG4gICAgICAgIGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKGZ1bGxJbnB1dC5sZW5ndGgpLFxuICAgICAgICBmdWxsSW5wdXQsXG4gICAgICAgIHNlcXVlbmNlQnVmLFxuICAgICAgICBvdXRwdXRzQ291bnQsXG4gICAgICAgIG91dHB1dHNCdWYsXG4gICAgICAgIGxvY2tUaW1lQnVmLFxuICAgICAgICBCdWZmZXIuZnJvbSgnODEwMDAwMDAnLCAnaGV4JyksXG4gICAgICBdKTtcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcmVwYXJlZERhdGE6IHtcbiAgICAgIHZlcnNpb25CdWYsXG4gICAgICBpbnB1dHNDb3VudCxcbiAgICAgIHByZXBhcmVkSW5wdXRzLFxuICAgICAgb3V0cHV0VHlwZSxcbiAgICAgIG91dHB1dHNDb3VudCxcbiAgICAgIG91dHB1dHNCdWYsXG4gICAgICBsb2NrVGltZUJ1ZixcbiAgICB9LFxuICAgIHVuc2lnbmVkVHJhbnNhY3Rpb25zLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUZpbmFsVHJhbnNhY3Rpb24oXG4gIHNjcmlwdFR5cGU6IHR5cGVzLlNjcmlwdFR5cGUsXG4gIHByZXBhcmVkRGF0YTogdHlwZXMuUHJlcGFyZWREYXRhLFxuICBzaWduYXR1cmVzOiBBcnJheTxCdWZmZXI+XG4pOiBCdWZmZXIge1xuICBjb25zdCB7IHZlcnNpb25CdWYsIGlucHV0c0NvdW50LCBwcmVwYXJlZElucHV0cywgb3V0cHV0c0NvdW50LCBvdXRwdXRzQnVmLCBsb2NrVGltZUJ1ZiB9ID0gcHJlcGFyZWREYXRhO1xuXG4gIGlmIChzY3JpcHRUeXBlICE9PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIICYmIHNjcmlwdFR5cGUgIT09IHR5cGVzLlNjcmlwdFR5cGUuUDJTSCkge1xuICAgIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihjb21wb3NlRmluYWxUcmFuc2FjdGlvbi5uYW1lLCBgVW5zdXBwb3J0IFNjcmlwdFR5cGUgJyR7c2NyaXB0VHlwZX0nYCk7XG4gIH1cblxuICBjb25zdCBpbnB1dHNCdWYgPSBCdWZmZXIuY29uY2F0KFxuICAgIHByZXBhcmVkSW5wdXRzLm1hcCgoZGF0YSwgaSkgPT4ge1xuICAgICAgY29uc3QgeyBwdWJrZXlCdWYsIHByZU91dFBvaW50QnVmLCBzZXF1ZW5jZUJ1ZiB9ID0gZGF0YTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZXNbaV07XG4gICAgICBjb25zdCBpblNjcmlwdCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBCdWZmZXIuZnJvbSgoc2lnbmF0dXJlLmxlbmd0aCArIDEpLnRvU3RyaW5nKDE2KSwgJ2hleCcpLFxuICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgIEJ1ZmZlci5mcm9tKCc4MScsICdoZXgnKSxcbiAgICAgICAgQnVmZmVyLmZyb20ocHVia2V5QnVmLmxlbmd0aC50b1N0cmluZygxNiksICdoZXgnKSxcbiAgICAgICAgcHVia2V5QnVmLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbcHJlT3V0UG9pbnRCdWYsIGJ1ZmZlclV0aWwudG9WYXJVaW50QnVmZmVyKGluU2NyaXB0Lmxlbmd0aCksIGluU2NyaXB0LCBzZXF1ZW5jZUJ1Zl0pO1xuICAgIH0pXG4gICk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFt2ZXJzaW9uQnVmLCBpbnB1dHNDb3VudCwgaW5wdXRzQnVmLCBvdXRwdXRzQ291bnQsIG91dHB1dHNCdWYsIGxvY2tUaW1lQnVmXSk7XG59XG4iXX0=