UNPKG

@coolwallet/sol

Version:
136 lines (134 loc) 20 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.computeBudgetEncode = computeBudgetEncode; exports.numberToStringHex = exports.isBase58Format = exports.formHex = exports.encodeLength = void 0; exports.pubKeyToAddress = pubKeyToAddress; exports.splDataEncode = splDataEncode; exports.toBase58 = toBase58; exports.toBase58Buffer = toBase58Buffer; exports.toPublicKey = toPublicKey; exports.toReverseUintBuffer = toReverseUintBuffer; exports.toUintBuffer = toUintBuffer; var _bs = _interopRequireDefault(require("bs58")); var _bn = _interopRequireDefault(require("bn.js")); var _types = _interopRequireWildcard(require("../config/types")); var types = _types; function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } var HEX_REGEX = /[0-9A-Fa-f]{6}/g; var isBase58Format = exports.isBase58Format = function isBase58Format(value) { if (!value) return false; return /^[A-HJ-NP-Za-km-z1-9]*$/.test(value); }; function isHexFormat(value) { var match = value.match(HEX_REGEX); return !!match; } function toBase58(publicKey) { if (typeof publicKey === 'string') { if (isBase58Format(publicKey)) return publicKey; if (isHexFormat(publicKey)) return _bs["default"].encode(Buffer.from(publicKey, 'hex')); return publicKey; } return _bs["default"].encode(publicKey); } function toBase58Buffer(publicKey) { if (typeof publicKey === 'string') { if (isBase58Format(publicKey)) return _bs["default"].decode(publicKey); if (isHexFormat(publicKey)) return Buffer.from(publicKey, 'hex'); return Buffer.from(publicKey); } return publicKey; } function toPublicKey(publicKey) { if (typeof publicKey === 'string') return publicKey; return _bs["default"].encode(publicKey); } function pubKeyToAddress(publicKey) { var pubKeyBuf = Buffer.from(publicKey, 'hex'); return _bs["default"].encode(pubKeyBuf); } /** * CW-21334 Fixed user's publicKey just matches the base58 encoding, resulting in repeated decoding. * * The user's Solana address (base58 encoded) is: * 5XZiuCyozesbRJsSdoJQCTHQRnTGDfSms5bV1ybLn9yg * * After converting it to Hex: * fc238b62abd32cd576f1d5568d3b6b5cb2fbc57b419cc2b4cd8a2814973919a7 * This hex conform to the Base58 format (without 0, O, i, I, +, /), causing base58.decode to be executed again, resulting in an incorrect publicKey. * * How to fix it: * Adjust base58 verification method. A 32-byte public key can only be base58 encoded using 43 or 44 characters. */ var formHex = exports.formHex = function formHex(address) { if (!address) return ''; if (typeof address === 'string') { if (isBase58Format(address)) return _bs["default"].decode(address).toString('hex'); return address; } return address.toString('hex'); }; var numberToStringHex = exports.numberToStringHex = function numberToStringHex(value, pad) { return Buffer.from(typeof value === 'number' ? [value] : value).toString('hex').padStart(pad, '0'); }; var encodeLength = exports.encodeLength = function encodeLength(bytes, len) { var rem_len = len; for (;;) { var elem = rem_len & 0x7f; rem_len >>= 7; if (rem_len == 0) { bytes.push(elem); break; } else { elem |= 0x80; bytes.push(elem); } } }; function toReverseUintBuffer(numberOrString, byteSize) { var bn = new _bn["default"](numberOrString); var buf = Buffer.from(bn.toArray()).reverse(); return Buffer.alloc(byteSize).fill(buf, 0, buf.length); } function toUintBuffer(numberOrString, byteSize) { var bn = new _bn["default"](numberOrString); var buf = Buffer.from(bn.toArray()); return Buffer.alloc(byteSize).fill(buf, byteSize - buf.length, byteSize); } function computeBudgetEncode(type, amount) { var data; var length; switch (type) { case _types.ComputeBudgetInstruction.SetComputeUnitLimit: data = Buffer.alloc(5); length = 4; break; case _types.ComputeBudgetInstruction.SetComputeUnitPrice: data = Buffer.alloc(9); length = 8; break; default: throw new Error('Not supported ComputeBudgetInstruction type: ' + type); } var typeSpan = 1; data.writeUIntLE(type, 0, typeSpan); var valueBuf = toReverseUintBuffer(amount, length); data.write(valueBuf.toString('hex'), typeSpan, length, 'hex'); return data; } function splDataEncode(amount, tokenDecimals) { var data = Buffer.alloc(10); var programIdIndexSpan = 1; data.writeUIntLE(types.TokenInstruction.TransferChecked, 0, programIdIndexSpan); var valueHex = new _bn["default"](amount).toString(16, 8 * 2); var valueBuf = Buffer.from(valueHex, 'hex').reverse(); data.write(valueBuf.toString('hex'), programIdIndexSpan, 8, 'hex'); data.writeUInt8(+tokenDecimals, 9); return data; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9ibiIsIl90eXBlcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwidHlwZXMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJIRVhfUkVHRVgiLCJpc0Jhc2U1OEZvcm1hdCIsImV4cG9ydHMiLCJ2YWx1ZSIsInRlc3QiLCJpc0hleEZvcm1hdCIsIm1hdGNoIiwidG9CYXNlNTgiLCJwdWJsaWNLZXkiLCJiYXNlNTgiLCJlbmNvZGUiLCJCdWZmZXIiLCJmcm9tIiwidG9CYXNlNThCdWZmZXIiLCJkZWNvZGUiLCJ0b1B1YmxpY0tleSIsInB1YktleVRvQWRkcmVzcyIsInB1YktleUJ1ZiIsImZvcm1IZXgiLCJhZGRyZXNzIiwidG9TdHJpbmciLCJudW1iZXJUb1N0cmluZ0hleCIsInBhZCIsInBhZFN0YXJ0IiwiZW5jb2RlTGVuZ3RoIiwiYnl0ZXMiLCJsZW4iLCJyZW1fbGVuIiwiZWxlbSIsInB1c2giLCJ0b1JldmVyc2VVaW50QnVmZmVyIiwibnVtYmVyT3JTdHJpbmciLCJieXRlU2l6ZSIsImJuIiwiQk4iLCJidWYiLCJ0b0FycmF5IiwicmV2ZXJzZSIsImFsbG9jIiwiZmlsbCIsImxlbmd0aCIsInRvVWludEJ1ZmZlciIsImNvbXB1dGVCdWRnZXRFbmNvZGUiLCJ0eXBlIiwiYW1vdW50IiwiZGF0YSIsIkNvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbiIsIlNldENvbXB1dGVVbml0TGltaXQiLCJTZXRDb21wdXRlVW5pdFByaWNlIiwiRXJyb3IiLCJ0eXBlU3BhbiIsIndyaXRlVUludExFIiwidmFsdWVCdWYiLCJ3cml0ZSIsInNwbERhdGFFbmNvZGUiLCJ0b2tlbkRlY2ltYWxzIiwicHJvZ3JhbUlkSW5kZXhTcGFuIiwiVG9rZW5JbnN0cnVjdGlvbiIsIlRyYW5zZmVyQ2hlY2tlZCIsInZhbHVlSGV4Iiwid3JpdGVVSW50OCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zdHJpbmdVdGlsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiYXNlNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgQk4gZnJvbSAnYm4uanMnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbiB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5cbmNvbnN0IEhFWF9SRUdFWCA9IC9bMC05QS1GYS1mXXs2fS9nO1xuXG5leHBvcnQgY29uc3QgaXNCYXNlNThGb3JtYXQgPSAodmFsdWU/OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL15bQS1ISi1OUC1aYS1rbS16MS05XSokLy50ZXN0KHZhbHVlKTtcbn07XG5cbmZ1bmN0aW9uIGlzSGV4Rm9ybWF0KHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaChIRVhfUkVHRVgpO1xuICByZXR1cm4gISFtYXRjaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQmFzZTU4KHB1YmxpY0tleTogdHlwZXMuQWRkcmVzcyk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgcHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0Jhc2U1OEZvcm1hdChwdWJsaWNLZXkpKSByZXR1cm4gcHVibGljS2V5O1xuICAgIGlmIChpc0hleEZvcm1hdChwdWJsaWNLZXkpKSByZXR1cm4gYmFzZTU4LmVuY29kZShCdWZmZXIuZnJvbShwdWJsaWNLZXksICdoZXgnKSk7XG4gICAgcmV0dXJuIHB1YmxpY0tleTtcbiAgfVxuICByZXR1cm4gYmFzZTU4LmVuY29kZShwdWJsaWNLZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9CYXNlNThCdWZmZXIocHVibGljS2V5OiB0eXBlcy5BZGRyZXNzKTogQnVmZmVyIHtcbiAgaWYgKHR5cGVvZiBwdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGlzQmFzZTU4Rm9ybWF0KHB1YmxpY0tleSkpIHJldHVybiBiYXNlNTguZGVjb2RlKHB1YmxpY0tleSk7XG4gICAgaWYgKGlzSGV4Rm9ybWF0KHB1YmxpY0tleSkpIHJldHVybiBCdWZmZXIuZnJvbShwdWJsaWNLZXksICdoZXgnKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20ocHVibGljS2V5KTtcbiAgfVxuICByZXR1cm4gcHVibGljS2V5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcgfCBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHJldHVybiBwdWJsaWNLZXk7XG4gIHJldHVybiBiYXNlNTguZW5jb2RlKHB1YmxpY0tleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdWJLZXlUb0FkZHJlc3MocHVibGljS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwdWJLZXlCdWYgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXksICdoZXgnKTtcbiAgcmV0dXJuIGJhc2U1OC5lbmNvZGUocHViS2V5QnVmKTtcbn1cblxuLyoqXG4gKiBDVy0yMTMzNCBGaXhlZCB1c2VyJ3MgcHVibGljS2V5IGp1c3QgbWF0Y2hlcyB0aGUgYmFzZTU4IGVuY29kaW5nLCByZXN1bHRpbmcgaW4gcmVwZWF0ZWQgZGVjb2RpbmcuXG4gKlxuICogVGhlIHVzZXIncyBTb2xhbmEgYWRkcmVzcyAoYmFzZTU4IGVuY29kZWQpIGlzOlxuICogNVhaaXVDeW96ZXNiUkpzU2RvSlFDVEhRUm5UR0RmU21zNWJWMXliTG45eWdcbiAqXG4gKiBBZnRlciBjb252ZXJ0aW5nIGl0IHRvIEhleDpcbiAqIGZjMjM4YjYyYWJkMzJjZDU3NmYxZDU1NjhkM2I2YjVjYjJmYmM1N2I0MTljYzJiNGNkOGEyODE0OTczOTE5YTdcbiAqIFRoaXMgaGV4IGNvbmZvcm0gdG8gdGhlIEJhc2U1OCBmb3JtYXQgKHdpdGhvdXQgMCwgTywgaSwgSSwgKywgLyksIGNhdXNpbmcgYmFzZTU4LmRlY29kZSB0byBiZSBleGVjdXRlZCBhZ2FpbiwgcmVzdWx0aW5nIGluIGFuIGluY29ycmVjdCBwdWJsaWNLZXkuIFxuICpcbiAqIEhvdyB0byBmaXggaXQ6XG4gKiBBZGp1c3QgYmFzZTU4IHZlcmlmaWNhdGlvbiBtZXRob2QuIEEgMzItYnl0ZSBwdWJsaWMga2V5IGNhbiBvbmx5IGJlIGJhc2U1OCBlbmNvZGVkIHVzaW5nIDQzIG9yIDQ0IGNoYXJhY3RlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtSGV4ID0gKGFkZHJlc3M6IHN0cmluZyB8IEJ1ZmZlciB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGlmICghYWRkcmVzcykgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIGFkZHJlc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGlzQmFzZTU4Rm9ybWF0KGFkZHJlc3MpKSByZXR1cm4gYmFzZTU4LmRlY29kZShhZGRyZXNzKS50b1N0cmluZygnaGV4Jyk7XG4gICAgcmV0dXJuIGFkZHJlc3M7XG4gIH1cbiAgcmV0dXJuIGFkZHJlc3MudG9TdHJpbmcoJ2hleCcpO1xufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlclRvU3RyaW5nSGV4ID0gKHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSwgcGFkOiBudW1iZXIpOiBzdHJpbmcgPT5cbiAgQnVmZmVyLmZyb20odHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IFt2YWx1ZV0gOiB2YWx1ZSlcbiAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgLnBhZFN0YXJ0KHBhZCwgJzAnKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZUxlbmd0aCA9IChieXRlczogbnVtYmVyW10sIGxlbjogbnVtYmVyKTogdm9pZCA9PiB7XG4gIGxldCByZW1fbGVuID0gbGVuO1xuICBmb3IgKDs7KSB7XG4gICAgbGV0IGVsZW0gPSByZW1fbGVuICYgMHg3ZjtcbiAgICByZW1fbGVuID4+PSA3O1xuICAgIGlmIChyZW1fbGVuID09IDApIHtcbiAgICAgIGJ5dGVzLnB1c2goZWxlbSk7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbSB8PSAweDgwO1xuICAgICAgYnl0ZXMucHVzaChlbGVtKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JldmVyc2VVaW50QnVmZmVyKG51bWJlck9yU3RyaW5nOiBudW1iZXIgfCBzdHJpbmcsIGJ5dGVTaXplOiBudW1iZXIpOiBCdWZmZXIge1xuICBjb25zdCBibiA9IG5ldyBCTihudW1iZXJPclN0cmluZyk7XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKGJuLnRvQXJyYXkoKSkucmV2ZXJzZSgpO1xuICByZXR1cm4gQnVmZmVyLmFsbG9jKGJ5dGVTaXplKS5maWxsKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1VpbnRCdWZmZXIobnVtYmVyT3JTdHJpbmc6IG51bWJlciB8IHN0cmluZywgYnl0ZVNpemU6IG51bWJlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGJuID0gbmV3IEJOKG51bWJlck9yU3RyaW5nKTtcbiAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oYm4udG9BcnJheSgpKTtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhieXRlU2l6ZSkuZmlsbChidWYsIGJ5dGVTaXplIC0gYnVmLmxlbmd0aCwgYnl0ZVNpemUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUJ1ZGdldEVuY29kZSh0eXBlOiBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24sIGFtb3VudDogbnVtYmVyIHwgc3RyaW5nKTogQnVmZmVyIHtcbiAgbGV0IGRhdGE7XG4gIGxldCBsZW5ndGg7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLlNldENvbXB1dGVVbml0TGltaXQ6XG4gICAgICBkYXRhID0gQnVmZmVyLmFsbG9jKDUpO1xuICAgICAgbGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLlNldENvbXB1dGVVbml0UHJpY2U6XG4gICAgICBkYXRhID0gQnVmZmVyLmFsbG9jKDkpO1xuICAgICAgbGVuZ3RoID0gODtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uIHR5cGU6ICcgKyB0eXBlKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVTcGFuID0gMTtcbiAgZGF0YS53cml0ZVVJbnRMRSh0eXBlLCAwLCB0eXBlU3Bhbik7XG4gIGNvbnN0IHZhbHVlQnVmID0gdG9SZXZlcnNlVWludEJ1ZmZlcihhbW91bnQsIGxlbmd0aCk7XG4gIGRhdGEud3JpdGUodmFsdWVCdWYudG9TdHJpbmcoJ2hleCcpLCB0eXBlU3BhbiwgbGVuZ3RoLCAnaGV4Jyk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxEYXRhRW5jb2RlKGFtb3VudDogbnVtYmVyIHwgc3RyaW5nLCB0b2tlbkRlY2ltYWxzOiBudW1iZXIgfCBzdHJpbmcpOiBCdWZmZXIge1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEwKTtcbiAgY29uc3QgcHJvZ3JhbUlkSW5kZXhTcGFuID0gMTtcbiAgZGF0YS53cml0ZVVJbnRMRSh0eXBlcy5Ub2tlbkluc3RydWN0aW9uLlRyYW5zZmVyQ2hlY2tlZCwgMCwgcHJvZ3JhbUlkSW5kZXhTcGFuKTtcblxuICBjb25zdCB2YWx1ZUhleCA9IG5ldyBCTihhbW91bnQpLnRvU3RyaW5nKDE2LCA4ICogMik7XG4gIGNvbnN0IHZhbHVlQnVmID0gQnVmZmVyLmZyb20odmFsdWVIZXgsICdoZXgnKS5yZXZlcnNlKCk7XG5cbiAgZGF0YS53cml0ZSh2YWx1ZUJ1Zi50b1N0cmluZygnaGV4JyksIHByb2dyYW1JZEluZGV4U3BhbiwgOCwgJ2hleCcpO1xuICBkYXRhLndyaXRlVUludDgoK3Rva2VuRGVjaW1hbHMsIDkpO1xuICByZXR1cm4gZGF0YTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLEdBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUgsT0FBQTtBQUF5QyxJQUFBSSxLQUFBLEdBQUFGLE1BQUE7QUFBQSxTQUFBRyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUgsd0JBQUFHLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsY0FBQVIsQ0FBQSxFQUFBRyxDQUFBLElBQUFBLENBQUEsQ0FBQWUsR0FBQSxDQUFBbEIsQ0FBQSxFQUFBUSxDQUFBLEdBQUFBLENBQUE7QUFHekMsSUFBTVcsU0FBUyxHQUFHLGlCQUFpQjtBQUU1QixJQUFNQyxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHLFNBQWpCQSxjQUFjQSxDQUFJRSxLQUFjLEVBQWM7RUFDekQsSUFBSSxDQUFDQSxLQUFLLEVBQUUsT0FBTyxLQUFLO0VBQ3hCLE9BQU8seUJBQXlCLENBQUNDLElBQUksQ0FBQ0QsS0FBSyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTRSxXQUFXQSxDQUFDRixLQUFhLEVBQVc7RUFDM0MsSUFBTUcsS0FBSyxHQUFHSCxLQUFLLENBQUNHLEtBQUssQ0FBQ04sU0FBUyxDQUFDO0VBQ3BDLE9BQU8sQ0FBQyxDQUFDTSxLQUFLO0FBQ2hCO0FBRU8sU0FBU0MsUUFBUUEsQ0FBQ0MsU0FBd0IsRUFBVTtFQUN6RCxJQUFJLE9BQU9BLFNBQVMsS0FBSyxRQUFRLEVBQUU7SUFDakMsSUFBSVAsY0FBYyxDQUFDTyxTQUFTLENBQUMsRUFBRSxPQUFPQSxTQUFTO0lBQy9DLElBQUlILFdBQVcsQ0FBQ0csU0FBUyxDQUFDLEVBQUUsT0FBT0MsY0FBTSxDQUFDQyxNQUFNLENBQUNDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0UsT0FBT0EsU0FBUztFQUNsQjtFQUNBLE9BQU9DLGNBQU0sQ0FBQ0MsTUFBTSxDQUFDRixTQUFTLENBQUM7QUFDakM7QUFFTyxTQUFTSyxjQUFjQSxDQUFDTCxTQUF3QixFQUFVO0VBQy9ELElBQUksT0FBT0EsU0FBUyxLQUFLLFFBQVEsRUFBRTtJQUNqQyxJQUFJUCxjQUFjLENBQUNPLFNBQVMsQ0FBQyxFQUFFLE9BQU9DLGNBQU0sQ0FBQ0ssTUFBTSxDQUFDTixTQUFTLENBQUM7SUFDOUQsSUFBSUgsV0FBVyxDQUFDRyxTQUFTLENBQUMsRUFBRSxPQUFPRyxNQUFNLENBQUNDLElBQUksQ0FBQ0osU0FBUyxFQUFFLEtBQUssQ0FBQztJQUNoRSxPQUFPRyxNQUFNLENBQUNDLElBQUksQ0FBQ0osU0FBUyxDQUFDO0VBQy9CO0VBQ0EsT0FBT0EsU0FBUztBQUNsQjtBQUVPLFNBQVNPLFdBQVdBLENBQUNQLFNBQTBCLEVBQVU7RUFDOUQsSUFBSSxPQUFPQSxTQUFTLEtBQUssUUFBUSxFQUFFLE9BQU9BLFNBQVM7RUFDbkQsT0FBT0MsY0FBTSxDQUFDQyxNQUFNLENBQUNGLFNBQVMsQ0FBQztBQUNqQztBQUVPLFNBQVNRLGVBQWVBLENBQUNSLFNBQWlCLEVBQVU7RUFDekQsSUFBTVMsU0FBUyxHQUFHTixNQUFNLENBQUNDLElBQUksQ0FBQ0osU0FBUyxFQUFFLEtBQUssQ0FBQztFQUMvQyxPQUFPQyxjQUFNLENBQUNDLE1BQU0sQ0FBQ08sU0FBUyxDQUFDO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTUMsT0FBTyxHQUFBaEIsT0FBQSxDQUFBZ0IsT0FBQSxHQUFHLFNBQVZBLE9BQU9BLENBQUlDLE9BQW9DLEVBQWE7RUFDdkUsSUFBSSxDQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFO0VBQ3ZCLElBQUksT0FBT0EsT0FBTyxLQUFLLFFBQVEsRUFBRTtJQUMvQixJQUFJbEIsY0FBYyxDQUFDa0IsT0FBTyxDQUFDLEVBQUUsT0FBT1YsY0FBTSxDQUFDSyxNQUFNLENBQUNLLE9BQU8sQ0FBQyxDQUFDQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzFFLE9BQU9ELE9BQU87RUFDaEI7RUFDQSxPQUFPQSxPQUFPLENBQUNDLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDaEMsQ0FBQztBQUVNLElBQU1DLGlCQUFpQixHQUFBbkIsT0FBQSxDQUFBbUIsaUJBQUEsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFJbEIsS0FBd0IsRUFBRW1CLEdBQVc7RUFBQSxPQUNyRVgsTUFBTSxDQUFDQyxJQUFJLENBQUMsT0FBT1QsS0FBSyxLQUFLLFFBQVEsR0FBRyxDQUFDQSxLQUFLLENBQUMsR0FBR0EsS0FBSyxDQUFDLENBQ3JEaUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNmRyxRQUFRLENBQUNELEdBQUcsRUFBRSxHQUFHLENBQUM7QUFBQTtBQUVoQixJQUFNRSxZQUFZLEdBQUF0QixPQUFBLENBQUFzQixZQUFBLEdBQUcsU0FBZkEsWUFBWUEsQ0FBSUMsS0FBZSxFQUFFQyxHQUFXLEVBQVc7RUFDbEUsSUFBSUMsT0FBTyxHQUFHRCxHQUFHO0VBQ2pCLFNBQVM7SUFDUCxJQUFJRSxJQUFJLEdBQUdELE9BQU8sR0FBRyxJQUFJO0lBQ3pCQSxPQUFPLEtBQUssQ0FBQztJQUNiLElBQUlBLE9BQU8sSUFBSSxDQUFDLEVBQUU7TUFDaEJGLEtBQUssQ0FBQ0ksSUFBSSxDQUFDRCxJQUFJLENBQUM7TUFDaEI7SUFDRixDQUFDLE1BQU07TUFDTEEsSUFBSSxJQUFJLElBQUk7TUFDWkgsS0FBSyxDQUFDSSxJQUFJLENBQUNELElBQUksQ0FBQztJQUNsQjtFQUNGO0FBQ0YsQ0FBQztBQUVNLFNBQVNFLG1CQUFtQkEsQ0FBQ0MsY0FBK0IsRUFBRUMsUUFBZ0IsRUFBVTtFQUM3RixJQUFNQyxFQUFFLEdBQUcsSUFBSUMsY0FBRSxDQUFDSCxjQUFjLENBQUM7RUFDakMsSUFBTUksR0FBRyxHQUFHeEIsTUFBTSxDQUFDQyxJQUFJLENBQUNxQixFQUFFLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLENBQUM7RUFDL0MsT0FBTzFCLE1BQU0sQ0FBQzJCLEtBQUssQ0FBQ04sUUFBUSxDQUFDLENBQUNPLElBQUksQ0FBQ0osR0FBRyxFQUFFLENBQUMsRUFBRUEsR0FBRyxDQUFDSyxNQUFNLENBQUM7QUFDeEQ7QUFFTyxTQUFTQyxZQUFZQSxDQUFDVixjQUErQixFQUFFQyxRQUFnQixFQUFVO0VBQ3RGLElBQU1DLEVBQUUsR0FBRyxJQUFJQyxjQUFFLENBQUNILGNBQWMsQ0FBQztFQUNqQyxJQUFNSSxHQUFHLEdBQUd4QixNQUFNLENBQUNDLElBQUksQ0FBQ3FCLEVBQUUsQ0FBQ0csT0FBTyxDQUFDLENBQUMsQ0FBQztFQUNyQyxPQUFPekIsTUFBTSxDQUFDMkIsS0FBSyxDQUFDTixRQUFRLENBQUMsQ0FBQ08sSUFBSSxDQUFDSixHQUFHLEVBQUVILFFBQVEsR0FBR0csR0FBRyxDQUFDSyxNQUFNLEVBQUVSLFFBQVEsQ0FBQztBQUMxRTtBQUVPLFNBQVNVLG1CQUFtQkEsQ0FBQ0MsSUFBOEIsRUFBRUMsTUFBdUIsRUFBVTtFQUNuRyxJQUFJQyxJQUFJO0VBQ1IsSUFBSUwsTUFBTTtFQUNWLFFBQVFHLElBQUk7SUFDVixLQUFLRywrQkFBd0IsQ0FBQ0MsbUJBQW1CO01BQy9DRixJQUFJLEdBQUdsQyxNQUFNLENBQUMyQixLQUFLLENBQUMsQ0FBQyxDQUFDO01BQ3RCRSxNQUFNLEdBQUcsQ0FBQztNQUNWO0lBQ0YsS0FBS00sK0JBQXdCLENBQUNFLG1CQUFtQjtNQUMvQ0gsSUFBSSxHQUFHbEMsTUFBTSxDQUFDMkIsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUN0QkUsTUFBTSxHQUFHLENBQUM7TUFDVjtJQUNGO01BQ0UsTUFBTSxJQUFJUyxLQUFLLENBQUMsK0NBQStDLEdBQUdOLElBQUksQ0FBQztFQUMzRTtFQUVBLElBQU1PLFFBQVEsR0FBRyxDQUFDO0VBQ2xCTCxJQUFJLENBQUNNLFdBQVcsQ0FBQ1IsSUFBSSxFQUFFLENBQUMsRUFBRU8sUUFBUSxDQUFDO0VBQ25DLElBQU1FLFFBQVEsR0FBR3RCLG1CQUFtQixDQUFDYyxNQUFNLEVBQUVKLE1BQU0sQ0FBQztFQUNwREssSUFBSSxDQUFDUSxLQUFLLENBQUNELFFBQVEsQ0FBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRThCLFFBQVEsRUFBRVYsTUFBTSxFQUFFLEtBQUssQ0FBQztFQUU3RCxPQUFPSyxJQUFJO0FBQ2I7QUFFTyxTQUFTUyxhQUFhQSxDQUFDVixNQUF1QixFQUFFVyxhQUE4QixFQUFVO0VBQzdGLElBQU1WLElBQUksR0FBR2xDLE1BQU0sQ0FBQzJCLEtBQUssQ0FBQyxFQUFFLENBQUM7RUFDN0IsSUFBTWtCLGtCQUFrQixHQUFHLENBQUM7RUFDNUJYLElBQUksQ0FBQ00sV0FBVyxDQUFDeEUsS0FBSyxDQUFDOEUsZ0JBQWdCLENBQUNDLGVBQWUsRUFBRSxDQUFDLEVBQUVGLGtCQUFrQixDQUFDO0VBRS9FLElBQU1HLFFBQVEsR0FBRyxJQUFJekIsY0FBRSxDQUFDVSxNQUFNLENBQUMsQ0FBQ3hCLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuRCxJQUFNZ0MsUUFBUSxHQUFHekMsTUFBTSxDQUFDQyxJQUFJLENBQUMrQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUN0QixPQUFPLENBQUMsQ0FBQztFQUV2RFEsSUFBSSxDQUFDUSxLQUFLLENBQUNELFFBQVEsQ0FBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRW9DLGtCQUFrQixFQUFFLENBQUMsRUFBRSxLQUFLLENBQUM7RUFDbEVYLElBQUksQ0FBQ2UsVUFBVSxDQUFDLENBQUNMLGFBQWEsRUFBRSxDQUFDLENBQUM7RUFDbEMsT0FBT1YsSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119