@cetusprotocol/dlmm-sdk 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../src/index.ts","../src/sdk.ts","../src/config/mainnet.ts","../src/modules/poolModule.ts","../src/errors/errors.ts","../src/utils/parseData.ts","../../../node_modules/.pnpm/decimal.js@10.6.0/node_modules/decimal.js/decimal.mjs","../src/types/dlmm.ts","../src/utils/binUtils.ts","../src/types/constants.ts","../src/utils/weightUtils.ts","../src/utils/strategyUtils.ts","../src/utils/feeUtils.ts","../src/utils/ilmUtils.ts","../src/config/testnet.ts","../src/modules/positionModule.ts","../src/modules/swapModule.ts","../src/modules/partnerModule.ts","../src/modules/rewardModule.ts","../src/modules/configModule.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","import { CetusDlmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport { CetusDlmmSDK, SdkOptions }\nexport default CetusDlmmSDK\n","import type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport type { DlmmConfigs } from './types/dlmm'\nimport { dlmmMainnet } from './config/mainnet'\nimport { PoolModule } from './modules/poolModule'\nimport { dlmmTestnet } from './config/testnet'\nimport { PositionModule } from './modules/positionModule'\nimport { SwapModule } from './modules/swapModule'\nimport { PartnerModule } from './modules/partnerModule'\nimport { RewardModule } from './modules/rewardModule'\nimport { ConfigModule } from './modules/configModule'\n\n/**\n * Represents options and configurations for an SDK.\n */\nexport interface SdkOptions extends BaseSdkOptions {\n dlmm_pool: Package<DlmmConfigs>\n dlmm_router: Package\n faucet?: Package\n}\n\n/**\n * The entry class of CetusDcaSDK, which is almost responsible for all interactions with dca.\n */\nexport class CetusDlmmSDK extends SdkWrapper<SdkOptions> {\n protected _pool: PoolModule\n protected _position: PositionModule\n protected _swap: SwapModule\n protected _partner: PartnerModule\n protected _reward: RewardModule\n protected _config: ConfigModule\n\n constructor(options: SdkOptions) {\n super(options)\n\n this._pool = new PoolModule(this)\n this._position = new PositionModule(this)\n this._swap = new SwapModule(this)\n this._partner = new PartnerModule(this)\n this._reward = new RewardModule(this)\n this._config = new ConfigModule(this)\n }\n\n get Pool(): PoolModule {\n return this._pool\n }\n\n get Position(): PositionModule {\n return this._position\n }\n\n get Swap(): SwapModule {\n return this._swap\n }\n\n get Partner(): PartnerModule {\n return this._partner\n }\n\n get Reward(): RewardModule {\n return this._reward\n }\n\n get Config(): ConfigModule {\n return this._config\n }\n\n /**\n * Static factory method to initialize the SDK\n * @param options SDK initialization options\n * @returns An instance of CetusBurnDK\n */\n static createSDK(options: BaseSdkOptions): CetusDlmmSDK {\n const { env = 'mainnet' } = options\n return env === 'mainnet'\n ? CetusDlmmSDK.createCustomSDK({ ...dlmmMainnet, ...options })\n : CetusDlmmSDK.createCustomSDK({ ...dlmmTestnet, ...options })\n }\n\n /**\n * Create a custom SDK instance with the given options\n * @param options The options for the SDK\n * @returns An instance of CetusBurnSDK\n */\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusDlmmSDK {\n return new CetusDlmmSDK(options)\n }\n}\n","import type { SdkOptions } from '../sdk'\nimport { FullRpcUrlMainnet, GraphRpcUrlMainnet } from '@cetusprotocol/common-sdk'\n// mainnet\nexport const dlmmMainnet: SdkOptions = {\n env: 'mainnet',\n full_rpc_url: FullRpcUrlMainnet,\n graph_rpc_url: GraphRpcUrlMainnet,\n dlmm_pool: {\n package_id: '0x5664f9d3fd82c84023870cfbda8ea84e14c8dd56ce557ad2116e0668581a682b',\n published_at: '0x44d0fb760f9f7ce532a4a97abddf2e7982c9b9b50ac94cf62de8f4d11356d306',\n version: 5,\n config: {\n registry_id: '0xb1d55e7d895823c65f98d99b81a69436cf7d1638629c9ccb921326039cda1f1b',\n pools_id: '0xc3683b2356cac6423e9ecaea20955c7cc193998b016e5b884730ed1192174991',\n global_config_id: '0xf31b605d117f959b9730e8c07b08b856cb05143c5e81d5751c90d2979e82f599',\n versioned_id: '0x05370b2d656612dd5759cbe80463de301e3b94a921dfc72dd9daa2ecdeb2d0a8',\n admin_cap_id: '0xc4c42bc31cb54beb679dccd547f8bdb970cb6dc989bd1f85a4fed4812ed95d6e',\n partners_id: '0x5c0affc8d363b6abb1f32790c229165215f4edead89a9bc7cd95dad717b4296a',\n },\n },\n dlmm_router: {\n package_id: '0x8d389fa25cb08ebc5e520bc520ed394eed9e62b56b7868acb398bf298b8a76f3',\n published_at: '0xdb974d2654a62bb0668f58ee7919b5e41566a6c3336c3a006a412d5137487c67',\n version: 3,\n },\n}\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport {\n asUintN,\n CLOCK_ADDRESS,\n CoinAssist,\n createFullClient,\n d,\n DataPage,\n deriveDynamicFieldIdByType,\n DETAILS_KEYS,\n fixCoinType,\n getObjectFields,\n getPackagerConfigs,\n IModule,\n isSortedSymbols,\n PageQuery,\n PaginationArgs,\n printTransaction,\n} from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport {\n BinUtils,\n buildPoolKey,\n parseBinInfo,\n parseBinInfoList,\n parseDlmmBasePool,\n parseDlmmPool,\n parsePoolTransactionInfo,\n} from '../utils'\nimport { CetusDlmmSDK } from '../sdk'\nimport {\n BinAmount,\n BinLiquidityInfo,\n CalculateAddLiquidityOption,\n CreatePoolAndAddOption,\n CreatePoolAndAddWithPriceOption,\n CreatePoolOption,\n DlmmBasePool,\n DlmmConfigs,\n DlmmPool,\n FeeRate,\n GetBinInfoOption,\n GetBinInfoResult,\n GetPoolBinInfoOption,\n GetTotalFeeRateOption,\n OpenAndAddLiquidityOption,\n PoolTransactionInfo,\n} from '../types/dlmm'\nimport { MAX_BIN_PER_POSITION } from '../types/constants'\nimport { SuiClient } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { bcs } from '@mysten/sui/bcs'\n\nexport class PoolModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async getPoolAddress(coin_type_a: string, coin_type_b: string, bin_step: number, base_factor: number): Promise<string | undefined> {\n try {\n const poolKey = buildPoolKey(coin_type_a, coin_type_b, bin_step, base_factor)\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pools_id } = getPackagerConfigs(dlmm_pool)\n const res = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: pools_id,\n name: {\n type: '0x2::object::ID',\n value: poolKey,\n },\n })\n const fields = getObjectFields(res)\n return fields.value.fields.value.fields.pool_id\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolAddress',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n coin_type_a,\n coin_type_b,\n bin_step,\n base_factor,\n },\n })\n }\n\n return undefined\n }\n\n /**\n * Get the list of DLMM base pools\n * @param pagination_args - The pagination arguments\n * @returns The list of DLMM base pools\n */\n async getBasePoolList(pagination_args: PaginationArgs = 'all', force_refresh = false): Promise<DataPage<DlmmBasePool>> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const dataPage: DataPage<DlmmBasePool> = {\n data: [],\n has_next_page: false,\n }\n\n const queryAll = pagination_args === 'all'\n const cacheAllKey = `${dlmm_pool.package_id}_getBasePoolList`\n if (queryAll) {\n const cacheDate = this._sdk.getCache<DlmmBasePool[]>(cacheAllKey, force_refresh)\n if (cacheDate && cacheDate.length > 0) {\n dataPage.data.push(...cacheDate)\n return dataPage\n }\n }\n\n try {\n const moveEventType = `${dlmm_pool.package_id}::registry::CreatePoolEvent`\n const res = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: moveEventType }, pagination_args)\n dataPage.has_next_page = res.has_next_page\n dataPage.next_cursor = res.next_cursor\n res.data.forEach((object) => {\n const pool = parseDlmmBasePool(object)\n dataPage.data.push(pool)\n })\n\n if (queryAll) {\n this._sdk.updateCache(`${dlmm_pool.package_id}_getPoolImmutables`, dataPage.data)\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getBasePoolList',\n })\n }\n\n return dataPage\n }\n\n /**\n * Get the list of DLMM pools\n * @param pagination_args - The pagination arguments\n * @returns The list of DLMM pools\n */\n async getPools(pagination_args: PaginationArgs = 'all', force_refresh = false): Promise<DataPage<DlmmPool>> {\n const dataPage: DataPage<DlmmPool> = {\n data: [],\n has_next_page: false,\n }\n\n const basePoolPage = await this.getBasePoolList(pagination_args, force_refresh)\n if (basePoolPage.data.length === 0) {\n return dataPage\n }\n\n try {\n const res = await this._sdk.FullClient.batchGetObjects(\n basePoolPage.data.map((item) => item.id),\n {\n showContent: true,\n showType: true,\n }\n )\n dataPage.has_next_page = basePoolPage.has_next_page\n dataPage.next_cursor = basePoolPage.next_cursor\n for (const suiObj of res) {\n const pool = parseDlmmPool(suiObj)\n const cacheKey = `${pool.id}_getDlmmPool`\n this._sdk.updateCache(cacheKey, pool)\n dataPage.data.push(pool)\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPools',\n })\n }\n\n return dataPage\n }\n\n /**\n * Get the bin info by bin id\n * @param bin_manager_handle - The bin manager handle\n * @param bin_id - The bin id\n * @param bin_step - The bin step\n * @param force_refresh - Whether to force a refresh of the cache\n * @returns The bin info\n */\n async getBinInfo(bin_manager_handle: string, bin_id: number, bin_step: number, force_refresh = true): Promise<BinAmount> {\n try {\n const cacheKey = `${bin_manager_handle}_getBinInfo_${bin_id}`\n const cacheData = this._sdk.getCache<BinAmount>(cacheKey, force_refresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const score = BinUtils.binScore(bin_id)\n const [groupIndex, offsetInGroup] = BinUtils.resolveBinPosition(score)\n\n const res: any = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: bin_manager_handle,\n name: { type: 'u64', value: groupIndex },\n })\n const fields = res.data.content.fields.value.fields.value.fields.group.fields.bins[offsetInGroup].fields\n const bin_info = parseBinInfo(fields)\n this._sdk.updateCache(cacheKey, bin_info)\n return bin_info\n } catch (error) {\n return {\n bin_id,\n amount_a: '0',\n amount_b: '0',\n liquidity: '0',\n price_per_lamport: BinUtils.getPricePerLamportFromBinId(bin_id, bin_step),\n }\n }\n }\n\n async getBinInfoList(options: GetBinInfoOption[]): Promise<GetBinInfoResult[]> {\n const bin_info_list: GetBinInfoResult[] = []\n const warpOptions = options.map((option) => {\n const { bin_manager_handle, bin_id, bin_step } = option\n const score = BinUtils.binScore(bin_id)\n const [groupIndex, offsetInGroup] = BinUtils.resolveBinPosition(score)\n const dynamic_field_id = deriveDynamicFieldIdByType(bin_manager_handle, groupIndex, 'u64', 'u64')\n return {\n groupIndex,\n offsetInGroup,\n bin_id,\n bin_step,\n bin_manager_handle,\n dynamic_field_id,\n }\n })\n\n const res = await this._sdk.FullClient.batchGetObjects(\n warpOptions.map((option) => option.dynamic_field_id),\n {\n showContent: true,\n showType: true,\n }\n )\n\n res.forEach((item, index) => {\n const { offsetInGroup, bin_manager_handle, bin_step, bin_id } = warpOptions[index]\n try {\n const fields = getObjectFields(item)\n const binFields = fields.value.fields.value.fields.group.fields.bins[offsetInGroup].fields\n const bin_info = parseBinInfo(binFields)\n bin_info_list.push({\n ...bin_info,\n bin_manager_handle: bin_manager_handle,\n bin_step: bin_step,\n })\n } catch (error) {\n bin_info_list.push({\n bin_id,\n amount_a: '0',\n amount_b: '0',\n liquidity: '0',\n price_per_lamport: BinUtils.getPricePerLamportFromBinId(bin_id, bin_step),\n bin_manager_handle: bin_manager_handle,\n bin_step: bin_step,\n })\n }\n })\n\n return bin_info_list\n }\n\n async getTotalFeeRate(option: GetTotalFeeRateOption): Promise<FeeRate> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pool_id, coin_type_a, coin_type_b } = option\n const tx: Transaction = new Transaction()\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::get_total_fee_rate`,\n arguments: [tx.object(pool_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const res = await this._sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n const bcsFeeRate = bcs.struct('FeeRate', {\n base_fee_rate: bcs.u64(),\n var_fee_rate: bcs.u64(),\n total_fee_rate: bcs.u64(),\n })\n\n const feeRate = bcsFeeRate.parse(Uint8Array.from(res.results![0].returnValues![0][0]))\n\n return feeRate\n }\n\n async getPoolBinInfo(option: GetPoolBinInfoOption): Promise<BinAmount[]> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pool_id, coin_type_a, coin_type_b } = option\n const limit = 1000\n const bin_infos: BinAmount[] = []\n let start_bin_id: number | undefined = undefined\n let hasNext = true\n while (hasNext) {\n const tx: Transaction = new Transaction()\n let start_bin\n if (start_bin_id !== undefined) {\n start_bin = tx.moveCall({\n target: `0x1::option::some`,\n arguments: [tx.pure.u32(Number(asUintN(BigInt(start_bin_id))))],\n typeArguments: ['u32'],\n })\n } else {\n start_bin = tx.moveCall({\n target: `0x1::option::none`,\n typeArguments: ['u32'],\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::fetch_bins`,\n arguments: [tx.object(pool_id), start_bin, tx.pure.u64(limit)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n const res = await this._sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n const list = parseBinInfoList(res)\n bin_infos.push(...list)\n start_bin_id = list.length > 0 ? list[list.length - 1].bin_id + 1 : undefined\n hasNext = list.length === limit\n }\n\n return bin_infos.sort((a, b) => a.bin_id - b.bin_id)\n }\n\n async getPoolTransactionList({\n pool_id,\n pagination_args,\n order = 'descending',\n full_rpc_url,\n }: {\n pool_id: string\n full_rpc_url?: string\n pagination_args: PageQuery\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PoolTransactionInfo>> {\n const { FullClient: fullClient, sdkOptions } = this._sdk\n let client\n if (full_rpc_url) {\n client = createFullClient(new SuiClient({ url: full_rpc_url }))\n } else {\n client = fullClient\n }\n const data: DataPage<PoolTransactionInfo> = {\n data: [],\n has_next_page: false,\n }\n\n const limit = 50\n const query = pagination_args\n const user_limit = pagination_args.limit || 10\n do {\n const res = await client.queryTransactionBlocksByPage({ ChangedObject: pool_id }, { ...query, limit: 50 }, order)\n res.data.forEach((item, index) => {\n const dataList = parsePoolTransactionInfo(item, index, sdkOptions.dlmm_pool.package_id, pool_id)\n data.data = [...data.data, ...dataList]\n })\n data.has_next_page = res.has_next_page\n data.next_cursor = res.next_cursor\n query.cursor = res.next_cursor\n } while (data.data.length < user_limit && data.has_next_page)\n\n if (data.data.length > user_limit) {\n data.data = data.data.slice(0, user_limit)\n data.has_next_page = true\n }\n if (data.data.length > 0) {\n data.next_cursor = data.data[data.data.length - 1].tx\n }\n\n return data\n }\n\n /**\n * Get the bin info by range (TODO: need to optimize this method)\n * @param bin_manager_handle - The bin manager handle\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @param bin_step - The bin step\n * @returns The bin info by range\n */\n async getRangeBinInfo(bin_manager_handle: string, lower_bin_id: number, upper_bin_id: number, bin_step: number): Promise<BinAmount[]> {\n const bin_infos: BinAmount[] = []\n for (let bin_id = lower_bin_id; bin_id <= upper_bin_id; bin_id++) {\n const bin_info = await Promise.all([this.getBinInfo(bin_manager_handle, bin_id, bin_step)])\n bin_infos.push(...bin_info)\n }\n return bin_infos\n }\n\n /**\n * Get the list of DLMM pools by assign pool ids\n * @param assign_pool_ids - The assign pool ids\n * @returns The list of DLMM pools\n */\n async getAssignPoolList(assign_pool_ids: string[]): Promise<DlmmPool[]> {\n if (assign_pool_ids.length === 0) {\n return []\n }\n\n const allPool: DlmmPool[] = []\n\n try {\n const res = await this._sdk.FullClient.batchGetObjects(assign_pool_ids, {\n showContent: true,\n showType: true,\n })\n for (const suiObj of res) {\n const pool = parseDlmmPool(suiObj)\n const cacheKey = `${pool.id}_getDlmmPool`\n this._sdk.updateCache(cacheKey, pool)\n allPool.push(pool)\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getAssignPoolList',\n })\n }\n\n return allPool\n }\n\n /**\n * Get a DLMM pool by its object ID.\n * @param {string} pool_id The object ID of the pool to get.\n * @param {true} force_refresh Whether to force a refresh of the cache.\n * @returns {Promise<DlmmPool>} A promise that resolves to a DlmmPool object.\n */\n async getPool(pool_id: string, force_refresh = true): Promise<DlmmPool> {\n try {\n const cacheKey = `${pool_id}_getDlmmPool`\n const cacheData = this._sdk.getCache<DlmmPool>(cacheKey, force_refresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const suiObj = await this._sdk.FullClient.getObject({\n id: pool_id,\n options: {\n showType: true,\n showContent: true,\n },\n })\n const pool = parseDlmmPool(suiObj)\n this._sdk.updateCache(cacheKey, pool)\n return pool\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPool',\n [DETAILS_KEYS.REQUEST_PARAMS]: pool_id,\n })\n }\n }\n\n /**\n * Create a pool and add liquidity with a given price\n * @param option - The option for creating a pool and adding liquidity with a given price\n * @returns The transaction for creating a pool and adding liquidity with a given price\n */\n async createPoolAndAddWithPricePayload(option: CreatePoolAndAddWithPriceOption): Promise<Transaction> {\n const {\n bin_step,\n url,\n coin_type_a,\n coin_type_b,\n bin_infos,\n price_base_coin,\n price,\n lower_price,\n upper_price,\n decimals_a,\n decimals_b,\n strategy_type,\n use_bin_infos,\n base_factor,\n pool_id,\n } = option\n\n let lower_bin_id\n let upper_bin_id\n let active_id\n let new_bin_infos: BinLiquidityInfo = bin_infos\n\n const is_coin_a_base = price_base_coin === 'coin_a'\n\n if (is_coin_a_base) {\n lower_bin_id = BinUtils.getBinIdFromPrice(lower_price, bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(upper_price, bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(price, bin_step, true, decimals_a, decimals_b)\n } else {\n lower_bin_id = BinUtils.getBinIdFromPrice(d(1).div(upper_price).toString(), bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(d(1).div(lower_price).toString(), bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(d(1).div(price).toString(), bin_step, false, decimals_a, decimals_b)\n\n const calculateOption: CalculateAddLiquidityOption = {\n pool_id,\n amount_a: bin_infos.amount_b,\n amount_b: bin_infos.amount_a,\n active_id,\n bin_step,\n lower_bin_id,\n upper_bin_id,\n active_bin_of_pool: undefined,\n strategy_type: option.strategy_type,\n }\n\n new_bin_infos = await this.sdk.Position.calculateAddLiquidityInfo(calculateOption)\n }\n\n const createPoolAndAddOption: CreatePoolAndAddOption = {\n bin_step,\n url,\n coin_type_a,\n coin_type_b,\n bin_infos: new_bin_infos,\n lower_bin_id,\n upper_bin_id,\n active_id,\n strategy_type,\n use_bin_infos,\n base_factor,\n }\n\n return this.createPoolAndAddLiquidityPayload(createPoolAndAddOption)\n }\n\n /**\n * Create a pool\n * @param option - The option for creating a pool\n * @param tx - The transaction object\n * @returns The transaction object\n */\n createPoolPayload(option: CreatePoolOption, tx: Transaction): TransactionObjectArgument {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { bin_step, base_factor, url, coin_type_a, coin_type_b, active_id } = option\n tx = tx || new Transaction()\n\n const { registry_id, global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const [cert, pool_id] = tx.moveCall({\n target: `${dlmm_pool.published_at}::registry::create_pool_v2`,\n arguments: [\n tx.object(registry_id),\n tx.pure.u16(bin_step),\n tx.pure.u16(base_factor),\n tx.pure.u32(Number(asUintN(BigInt(active_id)))),\n tx.pure.string(url || ''),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::registry::destroy_receipt`,\n arguments: [tx.object(cert), pool_id, tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return pool_id\n }\n\n /**\n * Create a pool and add liquidity\n * @param option - The option for creating a pool and adding liquidity\n * @returns The transaction for creating a pool and adding liquidity\n */\n createPoolAndAddLiquidityPayload(option: CreatePoolAndAddOption): Transaction {\n const {\n bin_step,\n base_factor,\n url,\n active_id,\n coin_type_a,\n coin_type_b,\n bin_infos,\n lower_bin_id,\n upper_bin_id,\n strategy_type,\n use_bin_infos,\n } = option\n\n const tx = new Transaction()\n\n if (isSortedSymbols(fixCoinType(coin_type_a, false), fixCoinType(coin_type_b, false))) {\n handleError(DlmmErrorCode.InvalidCoinTypeSequence, new Error('invalid coin type sequence'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPoolAndAddLiquidityPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const width = upper_bin_id - lower_bin_id + 1\n if (width > MAX_BIN_PER_POSITION) {\n handleError(DlmmErrorCode.InvalidBinWidth, new Error('Width is too large'), {\n [DETAILS_KEYS.METHOD_NAME]: 'openPosition',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n console.log('🚀 ~ createPoolAndAddLiquidityPayload ~ option:', {\n ...option,\n width,\n })\n\n // create pool\n const pool_id = this.createPoolPayload(\n {\n active_id,\n bin_step,\n base_factor,\n coin_type_a,\n coin_type_b,\n },\n tx\n )\n\n // add liquidity\n const addOption: OpenAndAddLiquidityOption = {\n pool_id,\n bin_infos,\n coin_type_a,\n coin_type_b,\n lower_bin_id,\n upper_bin_id,\n active_id,\n strategy_type,\n use_bin_infos,\n max_price_slippage: 0,\n bin_step,\n }\n this.sdk.Position.addLiquidityPayload(addOption, tx)\n\n return tx\n }\n}\n","import { BaseError } from '@cetusprotocol/common-sdk'\n\nexport enum DlmmErrorCode {\n FetchError = 'FetchError',\n ParseError = 'ParseError',\n InvalidStrategyParams = 'InvalidStrategyParams',\n InvalidBinWidth = 'InvalidBinWidth',\n GetObjectError = 'GetObjectError',\n InvalidBinId = 'InvalidBinId',\n InsufficientLiquidity = 'InsufficientLiquidity',\n InvalidParams = 'InvalidParams',\n InvalidCoinTypeSequence = 'InvalidCoinTypeSequence',\n NotFound = 'NotFound',\n AmountTooSmall = 'AmountTooSmall',\n LiquiditySupplyIsZero = 'LiquiditySupplyIsZero',\n InvalidDeltaLiquidity = 'InvalidDeltaLiquidity',\n}\n\nexport class DlmmError extends BaseError {\n constructor(message: string, error_code?: DlmmErrorCode, details?: Record<string, any>) {\n super(message, error_code || 'UnknownError', details)\n }\n\n static isDlmmErrorCode(e: any, code: DlmmErrorCode): boolean {\n return this.isErrorCode<DlmmError>(e, code)\n }\n}\n\nexport const handleError = (code: DlmmErrorCode, error: Error | string, details?: Record<string, any>) => {\n const errorDetails = {\n ...details,\n stack: error instanceof Error ? error.stack : undefined,\n }\n\n if (error instanceof Error) {\n throw new DlmmError(error.message, code, errorDetails)\n } else {\n throw new DlmmError(error, code, errorDetails)\n }\n}\n","import {\n asIntN,\n d,\n DETAILS_KEYS,\n extractStructTagFromType,\n fixCoinType,\n getObjectFields,\n getObjectType,\n MathUtil,\n} from '@cetusprotocol/common-sdk'\nimport { DevInspectResults, SuiEvent, SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { DlmmErrorCode, handleError, DlmmError } from '../errors/errors'\nimport {\n BinAmount,\n BinLiquidityInfo,\n BinManager,\n BinSwap,\n DlmmBasePool,\n DlmmPool,\n DlmmPosition,\n Partner,\n PoolTransactionInfo,\n PositionFee,\n PositionManager,\n PositionReward,\n PreSwapQuote,\n Reward,\n RewardInfo,\n RewardManager,\n RewardPeriodEmission,\n RewardPeriodEmissionFormat,\n StrategyType,\n VariableParameters,\n} from '../types/dlmm'\nimport { BinUtils } from './binUtils'\nimport { BASIS_POINT } from '../types/constants'\nimport { bcs } from '@mysten/sui/bcs'\nimport { blake2b } from 'blakejs'\n\n/**\n * Parse the DLMM base pool data\n * @param data - The DLMM base pool data\n * @returns The DLMM base pool\n */\nexport function parseDlmmBasePool(data: SuiEvent): DlmmBasePool {\n try {\n const fields = data.parsedJson as any\n const pool: DlmmBasePool = {\n id: fields.pool_id,\n bin_step: Number(fields.bin_step),\n coin_type_a: fixCoinType(fields.coin_type_a, false),\n coin_type_b: fixCoinType(fields.coin_type_b, false),\n }\n\n return pool\n } catch (error) {\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseDlmmBasePool',\n [DETAILS_KEYS.REQUEST_PARAMS]: data,\n })\n }\n}\n\n/**\n * Parse the DLMM pool data\n * @param data - The DLMM pool data\n * @returns The DLMM pool\n */\nexport function parseDlmmPool(data: SuiObjectResponse): DlmmPool {\n try {\n const fields = getObjectFields(data)\n const type = getObjectType(data) as string\n const formatType = extractStructTagFromType(type)\n\n const bin_manager: BinManager = {\n bin_step: fields.bin_manager.fields.bin_step,\n bin_manager_handle: fields.bin_manager.fields.bins.fields.id.id,\n size: fields.bin_manager.fields.bins.fields.size,\n }\n\n const position_manager: PositionManager = {\n bin_step: fields.position_manager.fields.bin_step,\n position_index: fields.position_manager.fields.position_index,\n position_handle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n }\n\n const reward_manager_fields = fields.reward_manager.fields\n\n const rewards = reward_manager_fields.rewards.map((reward: any) => {\n const current_reward_rate = reward.fields.current_emission_rate\n const emissions_per_second = MathUtil.fromX64(new BN(current_reward_rate))\n const emissions_per_day = Math.floor(emissions_per_second.toNumber() * 60 * 60 * 24).toString()\n\n const info: Reward = {\n reward_coin: fixCoinType(reward.fields.reward_coin.fields.name, false),\n emissions_per_second: emissions_per_second.toString(),\n emissions_per_day,\n period_emission_rates: {\n id: reward.fields.period_emission_rates.fields.id.id,\n size: reward.fields.period_emission_rates.fields.size,\n },\n }\n return info\n })\n const reward_manager: RewardManager = {\n is_public: reward_manager_fields.is_public,\n emergency_reward_pause: reward_manager_fields.emergency_reward_pause,\n vault: {\n id: reward_manager_fields.vault.fields.id.id,\n size: reward_manager_fields.vault.fields.size,\n },\n rewards,\n last_updated_time: reward_manager_fields.last_updated_time,\n }\n\n const variable_parameters: VariableParameters = {\n volatility_accumulator: fields.v_parameters.fields.volatility_accumulator,\n volatility_reference: fields.v_parameters.fields.volatility_reference,\n index_reference: asIntN(BigInt(fields.v_parameters.fields.index_reference.fields.bits)),\n last_update_timestamp: fields.v_parameters.fields.last_update_timestamp,\n bin_step_config: fields.v_parameters.fields.bin_step_config.fields,\n }\n\n const pool: DlmmPool = {\n id: fields.id.id,\n bin_step: Number(fields.bin_step),\n coin_type_a: fixCoinType(formatType.type_arguments[0], false),\n coin_type_b: fixCoinType(formatType.type_arguments[1], false),\n pool_type: type,\n index: Number(fields.index),\n bin_manager,\n variable_parameters,\n active_id: asIntN(BigInt(fields.active_id.fields.bits)),\n permissions: fields.permissions.fields,\n balance_a: fields.balance_a,\n balance_b: fields.balance_b,\n base_fee_rate: fields.base_fee_rate,\n protocol_fee_a: fields.protocol_fee_a,\n protocol_fee_b: fields.protocol_fee_b,\n url: fields.url,\n reward_manager,\n position_manager,\n }\n pool.bin_step = pool.bin_manager.bin_step\n return pool\n } catch (error) {\n console.log('🚀 ~ parseDlmmPool ~ error:', error)\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseDlmmPool',\n [DETAILS_KEYS.REQUEST_PARAMS]: data,\n })\n }\n}\n\nexport function parsePartner(data: SuiObjectResponse): Partner {\n const fields = getObjectFields(data)\n const type = getObjectType(data) as string\n const formatType = extractStructTagFromType(type)\n\n const partner: Partner = {\n id: fields.id.id,\n name: fields.name,\n ref_fee_rate: d(fields.ref_fee_rate).div(BASIS_POINT).toNumber(),\n start_time: Number(fields.start_time),\n end_time: Number(fields.end_time),\n balances: {\n id: fields.balances.fields.id.id,\n size: fields.balances.fields.size,\n },\n type: formatType.full_address,\n }\n\n return partner\n}\n\nexport function parseDlmmPosition(data: SuiObjectResponse): DlmmPosition {\n try {\n const fields = getObjectFields(data)\n const position: DlmmPosition = {\n uri: fields.uri,\n index: fields.index,\n id: fields.id.id,\n name: fields.name,\n pool_id: fields.pool_id,\n lower_bin_id: asIntN(BigInt(fields.lower_bin_id.fields.bits)),\n upper_bin_id: asIntN(BigInt(fields.upper_bin_id.fields.bits)),\n liquidity_shares: fields.liquidity_shares,\n description: fields.description,\n coin_type_a: fixCoinType(fields.coin_type_a, false),\n coin_type_b: fixCoinType(fields.coin_type_b, false),\n }\n\n return position\n } catch (error) {\n console.log('🚀 ~ parseDlmmPosition ~ error:', error)\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseDlmmPosition',\n [DETAILS_KEYS.REQUEST_PARAMS]: data,\n })\n }\n}\n\nexport function parseLiquidityShares(\n liquidity_shares: string[],\n bin_step: number,\n lower_bin_id: number,\n active_bin: BinAmount\n): BinLiquidityInfo {\n const bins = liquidity_shares.map((liquidity, index) => {\n const bin_id = lower_bin_id + index\n const price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin_id, bin_step)\n if (bin_id === active_bin.bin_id) {\n const { amount_a, amount_b } = BinUtils.calculateOutByShare(active_bin, liquidity)\n return {\n bin_id,\n amount_a,\n amount_b,\n liquidity,\n price_per_lamport,\n }\n }\n\n if (bin_id < active_bin.bin_id) {\n const amount_b = BinUtils.getAmountBFromLiquidity(liquidity)\n return {\n bin_id,\n amount_a: '0',\n amount_b,\n liquidity,\n price_per_lamport,\n }\n }\n\n const q_price = BinUtils.getQPriceFromId(bin_id, bin_step)\n const amount_a = BinUtils.getAmountAFromLiquidity(liquidity, q_price)\n return {\n bin_id,\n amount_a,\n amount_b: '0',\n liquidity,\n price_per_lamport,\n }\n })\n\n const amount_a = bins\n .reduce((acc, bin) => {\n return acc.add(new Decimal(bin.amount_a))\n }, new Decimal(0))\n .toFixed(0)\n\n const amount_b = bins\n .reduce((acc, bin) => {\n return acc.add(new Decimal(bin.amount_b))\n }, new Decimal(0))\n .toFixed(0)\n\n return {\n bins,\n amount_a,\n amount_b,\n }\n}\n\nexport function parseBinInfoList(res: DevInspectResults): BinAmount[] {\n try {\n const bcsCoinAmount = bcs.struct('BinAmount', {\n id: bcs.struct('I32', {\n bits: bcs.u32(),\n }),\n amount_a: bcs.u64(),\n amount_b: bcs.u64(),\n price: bcs.u128(),\n liquidity_supply: bcs.u128(),\n rewards_growth_global: bcs.vector(bcs.u128()),\n fee_a_growth_global: bcs.u128(),\n fee_b_growth_global: bcs.u128(),\n })\n\n const bin_amounts = bcs.vector(bcsCoinAmount).parse(Uint8Array.from(res.results![1].returnValues![0][0]))\n\n return bin_amounts.map((bin_amount) => {\n const bin_id = asIntN(BigInt(bin_amount.id.bits))\n return {\n bin_id,\n amount_a: bin_amount.amount_a,\n amount_b: bin_amount.amount_b,\n liquidity: bin_amount.liquidity_supply,\n price_per_lamport: BinUtils.getPricePerLamportFromQPrice(bin_amount.price),\n }\n })\n } catch (error) {\n console.log('🚀 ~ parseBinInfo ~ error:', error)\n return []\n }\n}\n\nexport function parseBinInfo(fields: any): BinAmount {\n try {\n const bin_id = asIntN(BigInt(fields.id.fields.bits))\n const bin_amount: BinAmount = {\n bin_id,\n amount_a: fields.amount_a,\n amount_b: fields.amount_b,\n liquidity: fields.liquidity_share,\n price_per_lamport: BinUtils.getPricePerLamportFromQPrice(fields.price),\n }\n\n return bin_amount\n } catch (error) {\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseBinInfo',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n fields,\n },\n })\n }\n}\n\nexport function parsedDlmmPosFeeData(simulate_res: DevInspectResults) {\n const feeData: Record<string, PositionFee> = {}\n const feeValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('pool::CollectFeeEvent')\n })\n\n for (let i = 0; i < feeValueData.length; i += 1) {\n const { parsedJson } = feeValueData[i]\n const posObj = {\n position_id: parsedJson.position,\n fee_owned_a: parsedJson.fee_a,\n fee_owned_b: parsedJson.fee_b,\n }\n feeData[parsedJson.position] = posObj\n }\n\n return feeData\n}\n\nexport function parsedDlmmPosRewardData(simulate_res: DevInspectResults) {\n const rewarderData: Record<string, PositionReward> = {}\n const rewarderValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('pool::CollectRewardEvent')\n })\n\n for (let i = 0; i < rewarderValueData.length; i += 1) {\n const { parsedJson } = rewarderValueData[i]\n const position_id = parsedJson.position\n const reward_coin = parsedJson.reward\n const reward_amount = parsedJson.amount\n const rewardInfo: RewardInfo = {\n coin_type: fixCoinType(reward_coin.name, false),\n reward_owned: reward_amount,\n }\n let rewarder = rewarderData[position_id]\n if (rewarder) {\n rewarder.rewards.push(rewardInfo)\n } else {\n rewarder = {\n position_id,\n rewards: [rewardInfo],\n }\n }\n rewarderData[position_id] = rewarder\n }\n\n return rewarderData\n}\n\nexport function parsedSwapQuoteData(simulate_res: DevInspectResults, a2b: boolean): PreSwapQuote | undefined {\n const rewarderValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('pool::SwapEvent')\n })\n\n for (let i = 0; i < rewarderValueData.length; i += 1) {\n const { parsedJson } = rewarderValueData[i]\n const { partner, pool, amount_in, amount_out, fee, ref_fee, bin_swaps, from, target } = parsedJson\n const bin_swaps_info: BinSwap[] = bin_swaps.map((bin_swap: any) => {\n return {\n bin_id: bin_swap.bin_id.bits,\n in_amount: bin_swap.amount_in,\n out_amount: bin_swap.amount_out,\n fee: bin_swap.fee,\n var_fee_rate: bin_swap.var_fee_rate,\n }\n })\n const info: PreSwapQuote = {\n pool_id: pool,\n a2b,\n in_amount: amount_in,\n out_amount: amount_out,\n ref_fee_amount: ref_fee,\n fee_amount: fee,\n bin_swaps: bin_swaps_info,\n partner,\n from_coin_type: fixCoinType(from.name, false),\n to_coin_type: fixCoinType(target.name, false),\n }\n\n return info\n }\n return undefined\n}\n\nexport function parseStrategyType(strategy_type: StrategyType): number {\n switch (strategy_type) {\n case StrategyType.Spot:\n return 0\n case StrategyType.Curve:\n return 1\n case StrategyType.BidAsk:\n return 2\n }\n}\nexport const poolFilterEvenTypes = ['RemoveLiquidityEvent', 'SwapEvent', 'AddLiquidityEvent', 'ClosePositionEvent']\nexport function parsePoolTransactionInfo(data: SuiTransactionBlockResponse, txIndex: number, package_id: string, pool_id: string) {\n const list: PoolTransactionInfo[] = []\n const { timestampMs, events } = data\n\n events?.forEach((event: any, index) => {\n const { name: type, address: package_address } = extractStructTagFromType(event.type)\n if (poolFilterEvenTypes.includes(type) && package_address === package_id && pool_id === event.parsedJson.pool) {\n const info: PoolTransactionInfo = {\n tx: event.id.txDigest,\n sender: event.sender,\n type: event.type,\n block_time: timestampMs || '0',\n index: `${txIndex}_${index}`,\n parsed_json: event.parsedJson,\n }\n list.push(info)\n }\n })\n\n return list\n}\n\nexport function generateRewardSchedule(baseTime: number, maxIntervals: number, timeInterval: number): number[] {\n const result: number[] = []\n\n let intervals = 0 // Start from 0 to include base time if needed\n const baseDateTime = new Date(baseTime * 1000).getTime() // Convert seconds to milliseconds\n const nowTime = new Date().getTime()\n while (true) {\n const rewardTime = baseDateTime + intervals * timeInterval\n\n if (rewardTime >= nowTime) {\n result.push(rewardTime)\n }\n\n if (intervals >= maxIntervals) {\n break\n }\n\n intervals += 1\n }\n\n return result\n}\n\nexport function parseRewardPeriodEmission(\n periodEmissionList: RewardPeriodEmission[],\n startTimeInSeconds: number,\n endTimeInSeconds: number,\n durationSeconds: number\n) {\n const result: RewardPeriodEmissionFormat[] = []\n for (let time = startTimeInSeconds; time <= endTimeInSeconds; time += durationSeconds) {\n const findRewardPeriodEmission = periodEmissionList.findLast((period) => d(time).gte(period.time))\n if (findRewardPeriodEmission) {\n result.push({\n time: time.toString(),\n emissions_per_second: findRewardPeriodEmission.emissions_per_second,\n emissions_per_day: findRewardPeriodEmission.emissions_per_day,\n visualized_time: new Date(time * 1000).toLocaleString(),\n })\n } else {\n result.push({\n emissions_per_day: '0',\n time: time.toString(),\n emissions_per_second: '0',\n visualized_time: new Date(time * 1000).toLocaleString(),\n })\n }\n }\n return result\n}\n\nexport function parseCurrentRewardPeriodEmission(periodEmissionList: RewardPeriodEmission[]): RewardPeriodEmission | undefined {\n if (periodEmissionList.length === 0) {\n return undefined\n }\n const currentTime = new Date().getTime() / 1000\n const findRewardPeriodEmission = periodEmissionList.findLast((period) => d(currentTime).gte(period.time))\n if (findRewardPeriodEmission) {\n return findRewardPeriodEmission\n }\n return periodEmissionList[periodEmissionList.length - 1]\n}\n\nexport function safeMulAmount(amount: Decimal, rate: Decimal): Decimal {\n const result = amount.mul(rate)\n if (result.gt(0) && result.lt(1)) {\n throw new DlmmError(`Multiplication ${result} is less than 1`, DlmmErrorCode.AmountTooSmall)\n }\n return result.floor()\n}\n\nexport function safeAmount(amount: Decimal): Decimal {\n if (amount.gt(0) && amount.lt(1)) {\n throw new DlmmError(`Multiplication ${amount.toString()} is less than 1`, DlmmErrorCode.AmountTooSmall)\n }\n return amount.floor()\n}\n\nexport function getRouterModule(strategy_type: StrategyType) {\n switch (strategy_type) {\n case StrategyType.Spot:\n return 'spot'\n case StrategyType.Curve:\n return 'curve'\n case StrategyType.BidAsk:\n return 'bid_ask'\n }\n}\n\nexport function buildPoolKey(coin_type_a: string, coin_type_b: string, bin_step: number, base_factor: number) {\n // Convert coin types to bytes\n let coinABytes = Buffer.from(coin_type_a, 'utf8')\n const coinBBytes = Buffer.from(coin_type_b, 'utf8')\n\n const lenB = coinBBytes.length\n\n let i = 0\n\n // Append coinB bytes to coinA (without validation)\n while (i < lenB) {\n const byteB = coinBBytes[i]\n coinABytes = Buffer.concat([coinABytes, Buffer.from([byteB])])\n i++\n }\n\n // Serialize bin_step and base_factor using BCS\n const binStepBytes = bcs.u16().serialize(bin_step).toBytes()\n const baseFactorBytes = bcs.u16().serialize(base_factor).toBytes()\n\n // Concatenate all bytes\n const combinedBytes = Buffer.concat([coinABytes, binStepBytes, baseFactorBytes])\n\n // Hash with blake2b256\n const hash = blake2b(combinedBytes, undefined, 32)\n\n return `0x${Buffer.from(hash).toString('hex')}`\n}\n","/*!\r\n * decimal.js v10.6.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licence\r\n */\r\n\r\n\r\n// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The maximum exponent magnitude.\r\n // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15, // 0 to 9e15\r\n\r\n // The limit on the value of `precision`, and on the value of the first argument to\r\n // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n // Base conversion alphabet.\r\n NUMERALS = '0123456789abcdef',\r\n\r\n // The natural logarithm of 10 (1025 digits).\r\n LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n // Pi (1025 digits).\r\n PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n DEFAULTS = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `Decimal.config({ precision: 20 });`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used when rounding to `precision`.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `Decimal.rounding = 4;`\r\n // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n rounding: 4, // 0 to 8\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend (JavaScript %).\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 The IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n //\r\n // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n // be used, but they may not give useful results.\r\n modulo: 1, // 0 to 9\r\n\r\n // The exponent value at and beneath which `toString` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -EXP_LIMIT\r\n\r\n // The exponent value at and above which `toString` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to EXP_LIMIT\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // JavaScript numbers: -324 (5e-324)\r\n minE: -EXP_LIMIT, // -1 to -EXP_LIMIT\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // JavaScript numbers: 308 (1.7976931348623157e+308)\r\n maxE: EXP_LIMIT, // 1 to EXP_LIMIT\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n crypto: false // true/false\r\n },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n inexact, quadrant,\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n cryptoUnavailable = decimalError + 'crypto unavailable',\r\n tag = '[object Decimal]',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n LN10_PRECISION = LN10.length - 1,\r\n PI_PRECISION = PI.length - 1,\r\n\r\n // Decimal.prototype object\r\n P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n * absoluteValue abs\r\n * ceil\r\n * clampedTo clamp\r\n * comparedTo cmp\r\n * cosine cos\r\n * cubeRoot cbrt\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy divToInt\r\n * equals eq\r\n * floor\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * hyperbolicCosine cosh\r\n * hyperbolicSine sinh\r\n * hyperbolicTangent tanh\r\n * inverseCosine acos\r\n * inverseHyperbolicCosine acosh\r\n * inverseHyperbolicSine asinh\r\n * inverseHyperbolicTangent atanh\r\n * inverseSine asin\r\n * inverseTangent atan\r\n * isFinite\r\n * isInteger isInt\r\n * isNaN\r\n * isNegative isNeg\r\n * isPositive isPos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * [maximum] [max]\r\n * [minimum] [min]\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * round\r\n * sine sin\r\n * squareRoot sqrt\r\n * tangent tan\r\n * times mul\r\n * toBinary\r\n * toDecimalPlaces toDP\r\n * toExponential\r\n * toFixed\r\n * toFraction\r\n * toHexadecimal toHex\r\n * toNearest\r\n * toNumber\r\n * toOctal\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits toSD\r\n * toString\r\n * truncated trunc\r\n * valueOf toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s < 0) x.s = 1;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n var k,\r\n x = this,\r\n Ctor = x.constructor;\r\n min = new Ctor(min);\r\n max = new Ctor(max);\r\n if (!min.s || !max.s) return new Ctor(NaN);\r\n if (min.gt(max)) throw Error(invalidArgument + max);\r\n k = x.cmp(min);\r\n return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `y`,\r\n * -1 if the value of this Decimal is less than the value of `y`,\r\n * 0 if they have the same value,\r\n * NaN if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this,\r\n xd = x.d,\r\n yd = (y = new x.constructor(y)).d,\r\n xs = x.s,\r\n ys = y.s;\r\n\r\n // Either NaN or ±Infinity?\r\n if (!xd || !yd) {\r\n return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Either zero?\r\n if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n // Signs differ?\r\n if (xs !== ys) return xs;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0) = 1\r\n * cos(-0) = 1\r\n * cos(Infinity) = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN) = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.d) return new Ctor(NaN);\r\n\r\n // cos(0) = cos(-0) = 1\r\n if (!x.d[0]) return new Ctor(1);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * cbrt(0) = 0\r\n * cbrt(-0) = -0\r\n * cbrt(1) = 1\r\n * cbrt(-1) = -1\r\n * cbrt(N) = N\r\n * cbrt(-I) = -I\r\n * cbrt(I) = I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n // Math.cbrt underflow/overflow?\r\n // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n if (!s || Math.abs(s) == 1 / 0) {\r\n n = digitsToString(x.d);\r\n e = x.e;\r\n\r\n // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n s = mathpow(n, 1 / 3);\r\n\r\n // Rarely, e may be one less than the result exponent value.\r\n e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n r.s = x.s;\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Halley's method.\r\n // TODO? Compare Newton's method.\r\n for (;;) {\r\n t = r;\r\n t3 = t.times(t).times(t);\r\n t3plusx = t3.plus(x);\r\n r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n // , i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n var w,\r\n d = this.d,\r\n n = NaN;\r\n\r\n if (d) {\r\n w = d.length - 1;\r\n n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) n--;\r\n if (n < 0) n = 0;\r\n }\r\n\r\n return n;\r\n};\r\n\r\n\r\n/*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n var k = this.cmp(y);\r\n return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0) = 1\r\n * cosh(-0) = 1\r\n * cosh(Infinity) = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN) = NaN\r\n *\r\n * x time taken (ms) result\r\n * 1000 9 9.8503555700852349694e+433\r\n * 10000 25 4.4034091128314607936e+4342\r\n * 100000 171 1.4033316802130615897e+43429\r\n * 1000000 3817 1.5166076984010437725e+434294\r\n * 10000000 abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n var k, n, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor,\r\n one = new Ctor(1);\r\n\r\n if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n if (x.isZero()) return one;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n // TODO? Estimation reused from cosine() and may not be optimal here.\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n n = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n n = '2.3283064365386962890625e-10';\r\n }\r\n\r\n x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n // Reverse argument reduction\r\n var cosh2_x,\r\n i = k,\r\n d8 = new Ctor(8);\r\n for (; i--;) {\r\n cosh2_x = x.times(x);\r\n x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n }\r\n\r\n return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0) = 0\r\n * sinh(-0) = -0\r\n * sinh(Infinity) = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN) = NaN\r\n *\r\n * x time taken (ms)\r\n * 10 2 ms\r\n * 100 5 ms\r\n * 1000 14 ms\r\n * 10000 82 ms\r\n * 100000 886 ms 1.4033316802130615897e+43429\r\n * 200000 2613 ms\r\n * 300000 5407 ms\r\n * 400000 8824 ms\r\n * 500000 13026 ms 8.7080643612718084129e+217146\r\n * 1000000 48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n var k, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n } else {\r\n\r\n // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n // 3 multiplications and 1 addition\r\n\r\n // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n // 4 multiplications and 2 additions\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n // Reverse argument reduction\r\n var sinh2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sinh2_x = x.times(x);\r\n x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n }\r\n }\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0) = 0\r\n * tanh(-0) = -0\r\n * tanh(Infinity) = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN) = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(x.s);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 7;\r\n Ctor.rounding = 1;\r\n\r\n return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0) = pi/2\r\n * acos(-0) = pi/2\r\n * acos(1) = 0\r\n * acos(-1) = pi\r\n * acos(1/2) = pi/3\r\n * acos(-1/2) = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN) = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n k = x.abs().cmp(1),\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n return k === 0\r\n // |x| is 1\r\n ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n // |x| > 1 or x is NaN\r\n : new Ctor(NaN);\r\n }\r\n\r\n if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n // See https://github.com/MikeMcl/decimal.js/pull/217\r\n x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1) = NaN\r\n * acosh(NaN) = NaN\r\n * acosh(Infinity) = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0) = NaN\r\n * acosh(-0) = NaN\r\n * acosh(1) = 0\r\n * acosh(-1) = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n if (!x.isFinite()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN) = NaN\r\n * asinh(Infinity) = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0) = 0\r\n * asinh(-0) = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1) = NaN\r\n * atanh(NaN) = NaN\r\n * atanh(Infinity) = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0) = 0\r\n * atanh(-0) = -0\r\n * atanh(1) = Infinity\r\n * atanh(-1) = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n var pr, rm, wpr, xsd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n xsd = x.sd();\r\n\r\n if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n Ctor.precision = wpr = xsd - x.e;\r\n\r\n x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n Ctor.precision = pr + 4;\r\n Ctor.rounding = 1;\r\n\r\n x = x.ln();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0) = 0\r\n * asin(-0) = -0\r\n * asin(1/2) = pi/6\r\n * asin(-1/2) = -pi/6\r\n * asin(1) = pi/2\r\n * asin(-1) = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN) = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n var halfPi, k,\r\n pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n k = x.abs().cmp(1);\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n\r\n // |x| is 1\r\n if (k === 0) {\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n halfPi.s = x.s;\r\n return halfPi;\r\n }\r\n\r\n // |x| > 1 or x is NaN\r\n return new Ctor(NaN);\r\n }\r\n\r\n // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0) = 0\r\n * atan(-0) = -0\r\n * atan(1) = pi/4\r\n * atan(-1) = -pi/4\r\n * atan(Infinity) = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN) = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n var i, j, k, n, px, t, r, wpr, x2,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (!x.isFinite()) {\r\n if (!x.s) return new Ctor(NaN);\r\n if (pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n r.s = x.s;\r\n return r;\r\n }\r\n } else if (x.isZero()) {\r\n return new Ctor(x);\r\n } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n r.s = x.s;\r\n return r;\r\n }\r\n\r\n Ctor.precision = wpr = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n // Argument reduction\r\n // Ensure |x| < 0.42\r\n // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n external = false;\r\n\r\n j = Math.ceil(wpr / LOG_BASE);\r\n n = 1;\r\n x2 = x.times(x);\r\n r = new Ctor(x);\r\n px = x;\r\n\r\n // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n for (; i !== -1;) {\r\n px = px.times(x2);\r\n t = r.minus(px.div(n += 2));\r\n\r\n px = px.times(x2);\r\n r = t.plus(px.div(n += 2));\r\n\r\n if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n }\r\n\r\n if (k) r = r.times(2 << (k - 1));\r\n\r\n external = true;\r\n\r\n return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a) = NaN\r\n * log[0](a) = NaN\r\n * log[1](a) = NaN\r\n * log[NaN](a) = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0) = -Infinity\r\n * log[b](-0) = -Infinity\r\n * log[b](-a) = NaN\r\n * log[b](1) = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN) = NaN\r\n *\r\n * [base] {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n var isBase10, d, denominator, k, inf, num, sd, r,\r\n arg = this,\r\n Ctor = arg.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding,\r\n guard = 5;\r\n\r\n // Default base is 10.\r\n if (base == null) {\r\n base = new Ctor(10);\r\n isBase10 = true;\r\n } else {\r\n base = new Ctor(base);\r\n d = base.d;\r\n\r\n // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n isBase10 = base.eq(10);\r\n }\r\n\r\n d = arg.d;\r\n\r\n // Is arg negative, non-finite, 0 or 1?\r\n if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n }\r\n\r\n // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n // integer power of 10.\r\n if (isBase10) {\r\n if (d.length > 1) {\r\n inf = true;\r\n } else {\r\n for (k = d[0]; k % 10 === 0;) k /= 10;\r\n inf = k !== 1;\r\n }\r\n }\r\n\r\n external = false;\r\n sd = pr + guard;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n // The result will have 5 rounding digits.\r\n r = divide(num, denominator, sd, 1);\r\n\r\n // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n // calculate 10 further digits.\r\n //\r\n // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n // further digits, the last 14 are nines, round up and assume the result is exact.\r\n // Also assume the result is exact if the last 14 are zero.\r\n //\r\n // Example of a result that will be incorrectly rounded:\r\n // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n // place is still 2.6.\r\n if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n do {\r\n sd += 10;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n r = divide(num, denominator, sd, 1);\r\n\r\n if (!inf) {\r\n\r\n // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n\r\n break;\r\n }\r\n } while (checkRoundingDigits(r.d, k += 10, rm));\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, -1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return y negated if x is finite and y is ±Infinity.\r\n else if (x.d) y.s = -y.s;\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with different signs.\r\n // Return NaN if both are ±Infinity with the same sign.\r\n else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.plus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return y negated if x is zero and y is non-zero.\r\n if (yd[0]) y.s = -y.s;\r\n\r\n // Return x if y is zero and x is non-zero.\r\n else if (xd[0]) y = new Ctor(x);\r\n\r\n // Return zero if both are zero.\r\n // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n e = mathfloor(y.e / LOG_BASE);\r\n xe = mathfloor(x.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of\r\n // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to `xd` if shorter.\r\n // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n // Return x if y is ±Infinity or x is ±0.\r\n if (!y.d || x.d && !x.d[0]) {\r\n return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n }\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n\r\n if (Ctor.modulo == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // result = x - q * y where 0 <= result < abs(y)\r\n q = divide(x, y.abs(), 0, 3, 1);\r\n q.s *= y.s;\r\n } else {\r\n q = divide(x, y, 0, Ctor.modulo, 1);\r\n }\r\n\r\n q = q.times(y);\r\n\r\n external = true;\r\n\r\n return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with the same sign.\r\n // Return NaN if both are ±Infinity with different signs.\r\n // Return y if x is finite and y is ±Infinity.\r\n else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.minus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!yd[0]) y = new Ctor(x);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n k = mathfloor(x.e / LOG_BASE);\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n var k,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n if (x.d) {\r\n k = getPrecision(x.d);\r\n if (z && x.e + 1 > k) k = x.e + 1;\r\n } else {\r\n k = NaN;\r\n }\r\n\r\n return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0) = 0\r\n * sin(-0) = -0\r\n * sin(Infinity) = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN) = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n var m, n, sd, r, rep, t,\r\n x = this,\r\n d = x.d,\r\n e = x.e,\r\n s = x.s,\r\n Ctor = x.constructor;\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !d || !d[0]) {\r\n return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n }\r\n\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(d);\r\n\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0) = 0\r\n * tan(-0) = -0\r\n * tan(Infinity) = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN) = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n x = x.sin();\r\n x.s = 1;\r\n x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n y.s *= x.s;\r\n\r\n // If either is NaN, ±Infinity or ±0...\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n // Return NaN if either is NaN.\r\n // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n ? NaN\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n // Return ±0 if either is ±0.\r\n : !xd || !yd ? y.s / 0 : y.s * 0);\r\n }\r\n\r\n e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = getBase10Exponent(r, e);\r\n\r\n return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), dp + 1, rm);\r\n str = finiteToString(x, true, dp + 1);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n str = finiteToString(y, false, dp + y.e + 1);\r\n }\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `x` rather than `y`.\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|bigint|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n x = this,\r\n xd = x.d,\r\n Ctor = x.constructor;\r\n\r\n if (!xd) return new Ctor(x);\r\n\r\n n1 = d0 = new Ctor(1);\r\n d1 = n0 = new Ctor(0);\r\n\r\n d = new Ctor(d1);\r\n e = d.e = getPrecision(xd) - x.e - 1;\r\n k = e % LOG_BASE;\r\n d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n if (maxD == null) {\r\n\r\n // d is 10**e, the minimum max-denominator needed.\r\n maxD = e > 0 ? d : n1;\r\n } else {\r\n n = new Ctor(maxD);\r\n if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n }\r\n\r\n external = false;\r\n n = new Ctor(digitsToString(xd));\r\n pr = Ctor.precision;\r\n Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n for (;;) {\r\n q = divide(n, d, 0, 1, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.cmp(maxD) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n d2 = n1;\r\n n1 = n0.plus(q.times(d2));\r\n n0 = d2;\r\n d2 = d;\r\n d = n.minus(q.times(d2));\r\n n = d2;\r\n }\r\n\r\n d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n ? [n1, d1] : [n0, d0];\r\n\r\n Ctor.precision = pr;\r\n external = true;\r\n\r\n return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|bigint|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n\r\n if (y == null) {\r\n\r\n // If x is not finite, return x.\r\n if (!x.d) return x;\r\n\r\n y = new Ctor(1);\r\n rm = Ctor.rounding;\r\n } else {\r\n y = new Ctor(y);\r\n if (rm === void 0) {\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(rm, 0, 8);\r\n }\r\n\r\n // If x is not finite, return x if y is not NaN, else NaN.\r\n if (!x.d) return y.s ? x : y;\r\n\r\n // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n if (!y.d) {\r\n if (y.s) y.s = x.s;\r\n return y;\r\n }\r\n }\r\n\r\n // If y is not zero, calculate the nearest multiple of y to x.\r\n if (y.d[0]) {\r\n external = false;\r\n x = divide(x, y, 0, rm, 1).times(y);\r\n external = true;\r\n finalise(x);\r\n\r\n // If y is zero, return zero with the sign of x.\r\n } else {\r\n y.s = x.s;\r\n x = y;\r\n }\r\n\r\n return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n * pow(x, NaN) = NaN\r\n * pow(x, ±0) = 1\r\n\r\n * pow(NaN, non-zero) = NaN\r\n * pow(abs(x) > 1, +Infinity) = +Infinity\r\n * pow(abs(x) > 1, -Infinity) = +0\r\n * pow(abs(x) == 1, ±Infinity) = NaN\r\n * pow(abs(x) < 1, +Infinity) = +0\r\n * pow(abs(x) < 1, -Infinity) = +Infinity\r\n * pow(+Infinity, y > 0) = +Infinity\r\n * pow(+Infinity, y < 0) = +0\r\n * pow(-Infinity, odd integer > 0) = -Infinity\r\n * pow(-Infinity, even integer > 0) = +Infinity\r\n * pow(-Infinity, odd integer < 0) = -0\r\n * pow(-Infinity, even integer < 0) = +0\r\n * pow(+0, y > 0) = +0\r\n * pow(+0, y < 0) = +Infinity\r\n * pow(-0, odd integer > 0) = -0\r\n * pow(-0, even integer > 0) = +0\r\n * pow(-0, odd integer < 0) = -Infinity\r\n * pow(-0, even integer < 0) = +Infinity\r\n * pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|bigint|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n var e, k, pr, r, rm, s,\r\n x = this,\r\n Ctor = x.constructor,\r\n yn = +(y = new Ctor(y));\r\n\r\n // Either ±Infinity, NaN or ±0?\r\n if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n x = new Ctor(x);\r\n\r\n if (x.eq(1)) return x;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n // y exponent\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = intPow(Ctor, x, k, pr);\r\n return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n }\r\n\r\n s = x.s;\r\n\r\n // if x is negative\r\n if (s < 0) {\r\n\r\n // if y is not an integer\r\n if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n // Result is positive if x is negative and the last digit of integer y is even.\r\n if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n // if x.eq(-1)\r\n if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n x.s = s;\r\n return x;\r\n }\r\n }\r\n\r\n // Estimate result exponent.\r\n // x^y = 10^e, where e = y * log10(x)\r\n // log10(x) = log10(x_significand) + x_exponent\r\n // log10(x_significand) = ln(x_significand) / ln(10)\r\n k = mathpow(+x, yn);\r\n e = k == 0 || !isFinite(k)\r\n ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n : new Ctor(k + '').e;\r\n\r\n // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n // Overflow/underflow?\r\n if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n external = false;\r\n Ctor.rounding = x.s = 1;\r\n\r\n // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n // new Decimal(2.32456).pow('2087987436534566.46411')\r\n // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n k = Math.min(12, (e + '').length);\r\n\r\n // r = x^y = exp(y*ln(x))\r\n r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n if (r.d) {\r\n\r\n // Truncate to the required precision plus five rounding digits.\r\n r = finalise(r, pr + 5, 1);\r\n\r\n // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n // the result.\r\n if (checkRoundingDigits(r.d, pr, rm)) {\r\n e = pr + 10;\r\n\r\n // Truncate to the increased precision plus five rounding digits.\r\n r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n }\r\n }\r\n\r\n r.s = s;\r\n external = true;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), sd, rm);\r\n str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n * finiteToString, naturalExponential, naturalLogarithm\r\n * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n * P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n * convertBase toStringBinary, parseOther\r\n * cos P.cos\r\n * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n * taylorSeries, atan2, parseOther\r\n * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n * P.truncated, divide, getLn10, getPi, naturalExponential,\r\n * naturalLogarithm, ceil, floor, round, trunc\r\n * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n * toStringBinary\r\n * getBase10Exponent P.minus, P.plus, P.times, parseOther\r\n * getLn10 P.logarithm, naturalLogarithm\r\n * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n * getPrecision P.precision, P.toFraction\r\n * getZeroString digitsToString, finiteToString\r\n * intPow P.toPower, parseOther\r\n * isOdd toLessThanHalfPi\r\n * maxOrMin max, min\r\n * naturalExponential P.naturalExponential, P.toPower\r\n * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n * P.toPower, naturalExponential\r\n * nonFiniteToString finiteToString, toStringBinary\r\n * parseDecimal Decimal\r\n * parseOther Decimal\r\n * sin P.sin\r\n * taylorSeries P.cosh, P.sinh, cos, sin\r\n * toLessThanHalfPi P.cos, P.sin\r\n * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal\r\n * truncate intPow\r\n *\r\n * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n * naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n var di, k, r, rd;\r\n\r\n // Get the length of the first word of the array d.\r\n for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n // Is the rounding digit in the first word of d?\r\n if (--i < 0) {\r\n i += LOG_BASE;\r\n di = 0;\r\n } else {\r\n di = Math.ceil((i + 1) / LOG_BASE);\r\n i %= LOG_BASE;\r\n }\r\n\r\n // i is the index (0 - 6) of the rounding digit.\r\n // E.g. if within the word 3487563 the first rounding digit is 5,\r\n // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n k = mathpow(10, LOG_BASE - i);\r\n rd = d[di] % k | 0;\r\n\r\n if (repeating == null) {\r\n if (i < 3) {\r\n if (i == 0) rd = rd / 100 | 0;\r\n else if (i == 1) rd = rd / 10 | 0;\r\n r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n } else {\r\n r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n }\r\n } else {\r\n if (i < 4) {\r\n if (i == 0) rd = rd / 1000 | 0;\r\n else if (i == 1) rd = rd / 100 | 0;\r\n else if (i == 2) rd = rd / 10 | 0;\r\n r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n } else {\r\n r = ((repeating || rm < 4) && rd + 1 == k ||\r\n (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n }\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n strL = str.length;\r\n\r\n for (; i < strL;) {\r\n for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n for (j = 0; j < arr.length; j++) {\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n var k, len, y;\r\n\r\n if (x.isZero()) return x;\r\n\r\n // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n len = x.d.length;\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n y = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n y = '2.3283064365386962890625e-10';\r\n }\r\n\r\n Ctor.precision += k;\r\n\r\n x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n // Reverse argument reduction\r\n for (var i = k; i--;) {\r\n var cos2x = x.times(x);\r\n x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n }\r\n\r\n Ctor.precision -= k;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k, base) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % base | 0;\r\n carry = temp / base | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, rm, dp, base) {\r\n var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n }\r\n\r\n if (base) {\r\n logBase = 1;\r\n e = x.e - y.e;\r\n } else {\r\n base = BASE;\r\n logBase = LOG_BASE;\r\n e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n }\r\n\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else if (dp) {\r\n sd = pr + (x.e - y.e) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) {\r\n qd.push(1);\r\n more = true;\r\n } else {\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / logBase + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * base + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n more = k || i < xL;\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= base/2\r\n k = base / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k, base);\r\n xd = multiplyInteger(xd, k, base);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= base / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= base) k = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL, base);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n more = rem[0] !== void 0;\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n }\r\n\r\n // logBase is 1 when divide is being used for base conversion.\r\n if (logBase == 1) {\r\n q.e = e;\r\n inexact = more;\r\n } else {\r\n\r\n // To calculate q.e, first get the number of digits of qd[0].\r\n for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n q.e = i + e * logBase - 1;\r\n\r\n finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n }\r\n\r\n return q;\r\n };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n Ctor = x.constructor;\r\n\r\n // Don't round if sd is null or undefined.\r\n out: if (sd != null) {\r\n xd = x.d;\r\n\r\n // Infinity/NaN.\r\n if (!xd) return x;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd containing rd, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // digits: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n i = sd - digits;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) {\r\n if (isTruncated) {\r\n\r\n // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n for (; k++ <= xdi;) xd.push(0);\r\n w = rd = 0;\r\n digits = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - digits.\r\n j = i - LOG_BASE + digits;\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n }\r\n }\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n isTruncated = isTruncated || sd < 0 ||\r\n xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n // will give 714.\r\n\r\n roundUp = rm < 4\r\n ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xd[0]) {\r\n xd.length = 0;\r\n if (roundUp) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xd[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (roundUp) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n\r\n // i will be the length of xd[0] before k is added.\r\n for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n j = xd[0] += k;\r\n for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xd[0] == BASE) xd[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n }\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > Ctor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < Ctor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // Ctor.underflow = true;\r\n } // else Ctor.underflow = false;\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n if (!x.isFinite()) return nonFiniteToString(x);\r\n var k,\r\n e = x.e,\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n var w = digits[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n if (sd > LN10_PRECISION) {\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(precisionLimitExceeded);\r\n }\r\n return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n var w = digits.length - 1,\r\n len = w * LOG_BASE + 1;\r\n\r\n w = digits[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) len--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = digits[0]; w >= 10; w /= 10) len++;\r\n }\r\n\r\n return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n var isTruncated,\r\n r = new Ctor(1),\r\n\r\n // Max n of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (n % 2) {\r\n r = r.times(x);\r\n if (truncate(r.d, k)) isTruncated = true;\r\n }\r\n\r\n n = mathfloor(n / 2);\r\n if (n === 0) {\r\n\r\n // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n n = r.d.length - 1;\r\n if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n break;\r\n }\r\n\r\n x = x.times(x);\r\n truncate(x.d, k);\r\n }\r\n\r\n external = true;\r\n\r\n return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n var k, y,\r\n x = new Ctor(args[0]),\r\n i = 0;\r\n\r\n for (; ++i < args.length;) {\r\n y = new Ctor(args[i]);\r\n\r\n // NaN?\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n }\r\n\r\n k = x.cmp(y);\r\n\r\n if (k === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(Infinity) = Infinity\r\n * exp(-Infinity) = 0\r\n * exp(NaN) = NaN\r\n * exp(±0) = 1\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n * The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n var denominator, guard, j, pow, sum, t, wpr,\r\n rep = 0,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // 0/NaN/Infinity?\r\n if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n return new Ctor(x.d\r\n ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n // while abs(x) >= 0.1\r\n while (x.e > -2) {\r\n\r\n // x = x / 2^5\r\n x = x.times(t);\r\n k += 5;\r\n }\r\n\r\n // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n // necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(1);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = finalise(pow.times(x), wpr, 1);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n j = k;\r\n while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n // Check to see if the first 4 rounding digits are [49]999.\r\n // If so, repeat the summation with a higher precision, otherwise\r\n // e.g. with precision: 18, rounding: 1\r\n // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n\r\n if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += 10;\r\n denominator = pow = t = new Ctor(1);\r\n i = 0;\r\n rep++;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * ln(-n) = NaN\r\n * ln(0) = -Infinity\r\n * ln(-0) = -Infinity\r\n * ln(1) = 0\r\n * ln(Infinity) = Infinity\r\n * ln(-Infinity) = NaN\r\n * ln(NaN) = NaN\r\n *\r\n * ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // Is x negative or Infinity, NaN, 0 or 1?\r\n if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n Ctor.precision = wpr += guard;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n\r\n if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = x.e;\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n Ctor.precision = pr;\r\n\r\n return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n }\r\n\r\n // x1 is x reduced to a value near 1.\r\n x1 = x;\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = finalise(numerator.times(x2), wpr, 1);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n // been repeated previously) and the first 4 rounding digits 9999?\r\n // If so, restart the summation with a higher precision, otherwise\r\n // e.g. with precision: 12, rounding: 1\r\n // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += guard;\r\n t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = rep = 1;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n // Unsigned.\r\n return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n x.e = e = e - i - 1;\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > x.constructor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < x.constructor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // x.constructor.underflow = true;\r\n } // else x.constructor.underflow = false;\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n if (str.indexOf('_') > -1) {\r\n str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n if (isDecimal.test(str)) return parseDecimal(x, str);\r\n } else if (str === 'Infinity' || str === 'NaN') {\r\n if (!+str) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return x;\r\n }\r\n\r\n if (isHex.test(str)) {\r\n base = 16;\r\n str = str.toLowerCase();\r\n } else if (isBinary.test(str)) {\r\n base = 2;\r\n } else if (isOctal.test(str)) {\r\n base = 8;\r\n } else {\r\n throw Error(invalidArgument + str);\r\n }\r\n\r\n // Is there a binary exponent part?\r\n i = str.search(/p/i);\r\n\r\n if (i > 0) {\r\n p = +str.slice(i + 1);\r\n str = str.substring(2, i);\r\n } else {\r\n str = str.slice(2);\r\n }\r\n\r\n // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n // fraction part will be restored.\r\n i = str.indexOf('.');\r\n isFloat = i >= 0;\r\n Ctor = x.constructor;\r\n\r\n if (isFloat) {\r\n str = str.replace('.', '');\r\n len = str.length;\r\n i = len - i;\r\n\r\n // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n }\r\n\r\n xd = convertBase(str, base, BASE);\r\n xe = xd.length - 1;\r\n\r\n // Remove trailing zeros.\r\n for (i = xe; xd[i] === 0; --i) xd.pop();\r\n if (i < 0) return new Ctor(x.s * 0);\r\n x.e = getBase10Exponent(xd, xe);\r\n x.d = xd;\r\n external = false;\r\n\r\n // At what precision to perform the division to ensure exact conversion?\r\n // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n // Therefore using 4 * the number of digits of str will always be enough.\r\n if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n // Multiply by the binary exponent part if present.\r\n if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n external = true;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n var k,\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n }\r\n\r\n // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x);\r\n\r\n // Reverse argument reduction\r\n var sin2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sin2_x = x.times(x);\r\n x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n var j, t, u, x2,\r\n i = 1,\r\n pr = Ctor.precision,\r\n k = Math.ceil(pr / LOG_BASE);\r\n\r\n external = false;\r\n x2 = x.times(x);\r\n u = new Ctor(y);\r\n\r\n for (;;) {\r\n t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n t = u.plus(y);\r\n\r\n if (t.d[k] !== void 0) {\r\n for (j = k; t.d[j] === u.d[j] && j--;);\r\n if (j == -1) break;\r\n }\r\n\r\n j = u;\r\n u = y;\r\n y = t;\r\n t = j;\r\n i++;\r\n }\r\n\r\n external = true;\r\n t.d.length = k + 1;\r\n\r\n return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n var n = b;\r\n while (--e) n *= b;\r\n return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n var t,\r\n isNeg = x.s < 0,\r\n pi = getPi(Ctor, Ctor.precision, 1),\r\n halfPi = pi.times(0.5);\r\n\r\n x = x.abs();\r\n\r\n if (x.lte(halfPi)) {\r\n quadrant = isNeg ? 4 : 1;\r\n return x;\r\n }\r\n\r\n t = x.divToInt(pi);\r\n\r\n if (t.isZero()) {\r\n quadrant = isNeg ? 3 : 2;\r\n } else {\r\n x = x.minus(t.times(pi));\r\n\r\n // 0 <= x < pi\r\n if (x.lte(halfPi)) {\r\n quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n return x;\r\n }\r\n\r\n quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n }\r\n\r\n return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n var base, e, i, k, len, roundUp, str, xd, y,\r\n Ctor = x.constructor,\r\n isExp = sd !== void 0;\r\n\r\n if (isExp) {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n } else {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n }\r\n\r\n if (!x.isFinite()) {\r\n str = nonFiniteToString(x);\r\n } else {\r\n str = finiteToString(x);\r\n i = str.indexOf('.');\r\n\r\n // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n if (isExp) {\r\n base = 2;\r\n if (baseOut == 16) {\r\n sd = sd * 4 - 3;\r\n } else if (baseOut == 8) {\r\n sd = sd * 3 - 2;\r\n }\r\n } else {\r\n base = baseOut;\r\n }\r\n\r\n // Convert the number as an integer then divide the result by its base raised to a power such\r\n // that the fraction part will be restored.\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n str = str.replace('.', '');\r\n y = new Ctor(1);\r\n y.e = str.length - i;\r\n y.d = convertBase(finiteToString(y), 10, base);\r\n y.e = y.d.length;\r\n }\r\n\r\n xd = convertBase(str, 10, base);\r\n e = len = xd.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] == 0;) xd.pop();\r\n\r\n if (!xd[0]) {\r\n str = isExp ? '0p+0' : '0';\r\n } else {\r\n if (i < 0) {\r\n e--;\r\n } else {\r\n x = new Ctor(x);\r\n x.d = xd;\r\n x.e = e;\r\n x = divide(x, y, sd, rm, 0, base);\r\n xd = x.d;\r\n e = x.e;\r\n roundUp = inexact;\r\n }\r\n\r\n // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n i = xd[sd];\r\n k = base / 2;\r\n roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n roundUp = rm < 4\r\n ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n rm === (x.s < 0 ? 8 : 7));\r\n\r\n xd.length = sd;\r\n\r\n if (roundUp) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (; ++xd[--sd] > base - 1;) {\r\n xd[sd] = 0;\r\n if (!sd) {\r\n ++e;\r\n xd.unshift(1);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n // Add binary exponent suffix?\r\n if (isExp) {\r\n if (len > 1) {\r\n if (baseOut == 16 || baseOut == 8) {\r\n i = baseOut == 16 ? 4 : 3;\r\n for (--len; len % i; len++) str += '0';\r\n xd = convertBase(str, base, baseOut);\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // xd[0] will always be be 1\r\n for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n } else {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n }\r\n\r\n str = str + (e < 0 ? 'p' : 'p+') + e;\r\n } else if (e < 0) {\r\n for (; ++e;) str = '0' + str;\r\n str = '0.' + str;\r\n } else {\r\n if (++e > len) for (e -= len; e-- ;) str += '0';\r\n else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n * abs\r\n * acos\r\n * acosh\r\n * add\r\n * asin\r\n * asinh\r\n * atan\r\n * atanh\r\n * atan2\r\n * cbrt\r\n * ceil\r\n * clamp\r\n * clone\r\n * config\r\n * cos\r\n * cosh\r\n * div\r\n * exp\r\n * floor\r\n * hypot\r\n * ln\r\n * log\r\n * log2\r\n * log10\r\n * max\r\n * min\r\n * mod\r\n * mul\r\n * pow\r\n * random\r\n * round\r\n * set\r\n * sign\r\n * sin\r\n * sinh\r\n * sqrt\r\n * sub\r\n * sum\r\n * tan\r\n * tanh\r\n * trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0) = ±pi\r\n * atan2(±0, +0) = ±0\r\n * atan2(±0, -x) = ±pi for x > 0\r\n * atan2(±0, x) = ±0 for x > 0\r\n * atan2(-y, ±0) = -pi/2 for y > 0\r\n * atan2(y, ±0) = pi/2 for y > 0\r\n * atan2(±y, -Infinity) = ±pi for finite y > 0\r\n * atan2(±y, +Infinity) = ±0 for finite y > 0\r\n * atan2(±Infinity, x) = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n y = new this(y);\r\n x = new this(x);\r\n var r,\r\n pr = this.precision,\r\n rm = this.rounding,\r\n wpr = pr + 4;\r\n\r\n // Either NaN\r\n if (!y.s || !x.s) {\r\n r = new this(NaN);\r\n\r\n // Both ±Infinity\r\n } else if (!y.d && !x.d) {\r\n r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n r.s = y.s;\r\n\r\n // x is ±Infinity or y is ±0\r\n } else if (!x.d || y.isZero()) {\r\n r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n r.s = y.s;\r\n\r\n // y is ±Infinity or x is ±0\r\n } else if (!y.d || x.isZero()) {\r\n r = getPi(this, wpr, 1).times(0.5);\r\n r.s = y.s;\r\n\r\n // Both non-zero and finite\r\n } else if (x.s < 0) {\r\n this.precision = wpr;\r\n this.rounding = 1;\r\n r = this.atan(divide(y, x, wpr, 1));\r\n x = getPi(this, wpr, 1);\r\n this.precision = pr;\r\n this.rounding = rm;\r\n r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n } else {\r\n r = this.atan(divide(y, x, wpr, 1));\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n * maxE {number}\r\n * minE {number}\r\n * modulo {number}\r\n * crypto {boolean|number}\r\n * defaults {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n var i, p, v,\r\n useDefaults = obj.defaults === true,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -EXP_LIMIT, 0,\r\n 'toExpPos', 0, EXP_LIMIT,\r\n 'maxE', 0, EXP_LIMIT,\r\n 'minE', -EXP_LIMIT, 0,\r\n 'modulo', 0, 9\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (v === true || v === false || v === 0 || v === 1) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n this[p] = true;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n } else {\r\n this[p] = false;\r\n }\r\n } else {\r\n throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * v {number|string|bigint|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(v) {\r\n var e, i, t,\r\n x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n if (isDecimalInstance(v)) {\r\n x.s = v.s;\r\n\r\n if (external) {\r\n if (!v.d || v.e > Decimal.maxE) {\r\n\r\n // Infinity.\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (v.e < Decimal.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d.slice();\r\n }\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d ? v.d.slice() : v.d;\r\n }\r\n\r\n return;\r\n }\r\n\r\n t = typeof v;\r\n\r\n if (t === 'number') {\r\n if (v === 0) {\r\n x.s = 1 / v < 0 ? -1 : 1;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (v === ~~v && v < 1e7) {\r\n for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n if (external) {\r\n if (e > Decimal.maxE) {\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (e < Decimal.minE) {\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Infinity or NaN?\r\n if (v * 0 !== 0) {\r\n if (!v) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n if (t === 'string') {\r\n if ((i = v.charCodeAt(0)) === 45) { // minus sign\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n if (i === 43) v = v.slice(1); // plus sign\r\n x.s = 1;\r\n }\r\n\r\n return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n }\r\n\r\n if (t === 'bigint') {\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n throw Error(invalidArgument + v);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n Decimal.EUCLID = 9;\r\n\r\n Decimal.config = Decimal.set = config;\r\n Decimal.clone = clone;\r\n Decimal.isDecimal = isDecimalInstance;\r\n\r\n Decimal.abs = abs;\r\n Decimal.acos = acos;\r\n Decimal.acosh = acosh; // ES6\r\n Decimal.add = add;\r\n Decimal.asin = asin;\r\n Decimal.asinh = asinh; // ES6\r\n Decimal.atan = atan;\r\n Decimal.atanh = atanh; // ES6\r\n Decimal.atan2 = atan2;\r\n Decimal.cbrt = cbrt; // ES6\r\n Decimal.ceil = ceil;\r\n Decimal.clamp = clamp;\r\n Decimal.cos = cos;\r\n Decimal.cosh = cosh; // ES6\r\n Decimal.div = div;\r\n Decimal.exp = exp;\r\n Decimal.floor = floor;\r\n Decimal.hypot = hypot; // ES6\r\n Decimal.ln = ln;\r\n Decimal.log = log;\r\n Decimal.log10 = log10; // ES6\r\n Decimal.log2 = log2; // ES6\r\n Decimal.max = max;\r\n Decimal.min = min;\r\n Decimal.mod = mod;\r\n Decimal.mul = mul;\r\n Decimal.pow = pow;\r\n Decimal.random = random;\r\n Decimal.round = round;\r\n Decimal.sign = sign; // ES6\r\n Decimal.sin = sin;\r\n Decimal.sinh = sinh; // ES6\r\n Decimal.sqrt = sqrt;\r\n Decimal.sub = sub;\r\n Decimal.sum = sum;\r\n Decimal.tan = tan;\r\n Decimal.tanh = tanh; // ES6\r\n Decimal.trunc = trunc; // ES6\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n if (obj.defaults !== true) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n var i, n,\r\n t = new this(0);\r\n\r\n external = false;\r\n\r\n for (i = 0; i < arguments.length;) {\r\n n = new this(arguments[i++]);\r\n if (!n.d) {\r\n if (n.s) {\r\n external = true;\r\n return new this(1 / 0);\r\n }\r\n t = n;\r\n } else if (t.d) {\r\n t = t.plus(n.times(n));\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, -1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The base.\r\n * y {number|string|bigint|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n var d, e, k, n,\r\n i = 0,\r\n r = new this(1),\r\n rd = [];\r\n\r\n if (sd === void 0) sd = this.precision;\r\n else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n k = Math.ceil(sd / LOG_BASE);\r\n\r\n if (!this.crypto) {\r\n for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n } else if (crypto.getRandomValues) {\r\n d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n for (; i < k;) {\r\n n = d[i];\r\n\r\n // 0 <= n < 4294967296\r\n // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n if (n >= 4.29e9) {\r\n d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n } else {\r\n\r\n // 0 <= n <= 4289999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd[i++] = n % 1e7;\r\n }\r\n }\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n d = crypto.randomBytes(k *= 4);\r\n\r\n for (; i < k;) {\r\n\r\n // 0 <= n < 2147483648\r\n n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n if (n >= 2.14e9) {\r\n crypto.randomBytes(4).copy(d, i);\r\n } else {\r\n\r\n // 0 <= n <= 2139999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd.push(n % 1e7);\r\n i += 4;\r\n }\r\n }\r\n\r\n i = k / 4;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n\r\n k = rd[--i];\r\n sd %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to sd.\r\n if (k && sd) {\r\n n = mathpow(10, LOG_BASE - sd);\r\n rd[i] = (k / n | 0) * n;\r\n }\r\n\r\n // Remove trailing words which are zero.\r\n for (; rd[i] === 0; i--) rd.pop();\r\n\r\n // Zero?\r\n if (i < 0) {\r\n e = 0;\r\n rd = [0];\r\n } else {\r\n e = -1;\r\n\r\n // Remove leading words which are zero and adjust exponent accordingly.\r\n for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n // Count the digits of the first word of rd to determine leading zeros.\r\n for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n // Adjust the exponent for leading zeros of the first word of rd.\r\n if (k < LOG_BASE) e -= LOG_BASE - k;\r\n }\r\n\r\n r.e = e;\r\n r.d = rd;\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if x > 0,\r\n * -1 if x < 0,\r\n * 0 if x is 0,\r\n * -0 if x is -0,\r\n * NaN otherwise\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n x = new this(x);\r\n return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n var i = 0,\r\n args = arguments,\r\n x = new this(args[i]);\r\n\r\n external = false;\r\n for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n external = true;\r\n\r\n return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import type { CoinPairType, TableHandle } from '@cetusprotocol/common-sdk'\nimport { TransactionObjectArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nexport type DlmmConfigs = {\n registry_id: string\n pools_id: string\n partners_id: string\n global_config_id: string\n versioned_id: string\n admin_cap_id: string\n}\n\nexport type BinStepConfig = {\n bin_step: number\n base_factor: number\n filter_period: number\n decay_period: number\n reduction_factor: number\n variable_fee_control: string\n max_volatility_accumulator: string\n protocol_fee_rate: string\n}\n\nexport type BinManager = {\n bin_step: number\n bin_manager_handle: string\n size: string\n}\n\nexport type VariableParameters = {\n volatility_accumulator: string\n volatility_reference: string\n index_reference: number\n last_update_timestamp: string\n bin_step_config: BinStepConfig\n}\n\nexport type Reward = {\n reward_coin: string\n emissions_per_second: string\n emissions_per_day: string\n period_emission_rates: TableHandle\n}\nexport type RewardManager = {\n is_public: boolean\n vault: TableHandle\n rewards: Reward[]\n emergency_reward_pause: boolean\n last_updated_time: string\n}\n\nexport type PositionManager = {\n bin_step: number\n position_index: number\n position_handle: string\n size: number\n}\n\nexport type DlmmBasePool = {\n id: string\n bin_step: number\n} & CoinPairType\n\nexport type PoolPermissions = {\n disable_add: boolean\n disable_remove: boolean\n disable_swap: boolean\n disable_collect_fee: boolean\n disable_collect_reward: boolean\n disable_add_reward: boolean\n}\n\nexport type DlmmPool = {\n pool_type: string\n index: number\n bin_manager: BinManager\n variable_parameters: VariableParameters\n active_id: number\n permissions: PoolPermissions\n balance_a: string\n balance_b: string\n base_fee_rate: string\n protocol_fee_a: string\n protocol_fee_b: string\n url: string\n reward_manager: RewardManager\n position_manager: PositionManager\n} & DlmmBasePool\n\nexport type DlmmPosition = {\n id: string\n pool_id: string\n index: number\n description: string\n uri: string\n liquidity_shares: string[]\n lower_bin_id: number\n upper_bin_id: number\n name: string\n} & CoinPairType\n\nexport type BinWeight = {\n bin_id: number\n weight: number\n}\n\nexport type BinAmount = {\n bin_id: number\n amount_a: string\n amount_b: string\n liquidity?: string\n price_per_lamport: string\n}\n\nexport type BinLiquidityInfo = {\n bins: BinAmount[]\n amount_a: string\n amount_b: string\n}\n\nexport enum StrategyType {\n Spot,\n Curve,\n BidAsk,\n}\n\nexport type ClosePositionOption = {\n pool_id: string\n position_id: string\n reward_coins: string[]\n} & CoinPairType\n\nexport type BaseCreatePoolOption = {\n bin_step: number\n base_factor: number\n url?: string\n} & CoinPairType\n\nexport type BaseCreatePoolAndAddOption = {\n bin_infos: BinLiquidityInfo\n strategy_type: StrategyType\n use_bin_infos?: boolean\n} & BaseCreatePoolOption\n\nexport type CreatePoolAndAddOption = {\n active_id: number\n lower_bin_id: number\n upper_bin_id: number\n} & BaseCreatePoolAndAddOption\n\nexport type CreatePoolOption = {\n active_id: number\n} & BaseCreatePoolOption\n\nexport type CreatePoolAndAddWithPriceOption = {\n pool_id: string\n price_base_coin: 'coin_a' | 'coin_b'\n price: string\n lower_price: string\n upper_price: string\n strategy_type: StrategyType\n decimals_a: number\n decimals_b: number\n} & BaseCreatePoolAndAddOption\n\nexport type BaseAddLiquidityOption = {\n pool_id: string | TransactionObjectArgument\n bin_infos: BinLiquidityInfo\n strategy_type: StrategyType\n max_price_slippage: number\n active_id: number\n bin_step: number\n /**\n * Controls whether to use pre-calculated bin_infos or let the contract calculate based on strategy_type.\n * - true: Use bin_infos to add liquidity to each bin\n * - false: Pass strategy_type to contract for automatic liquidity distribution calculation\n */\n use_bin_infos?: boolean\n} & CoinPairType\n\nexport type BaseCalculateAddLiquidityOption = {\n pool_id?: string\n active_id: number\n bin_step: number\n lower_bin_id: number\n upper_bin_id: number\n active_bin_of_pool?: BinAmount\n strategy_type: StrategyType\n}\n\nexport type CalculateAddLiquidityOption = {\n amount_a: string\n amount_b: string\n} & BaseCalculateAddLiquidityOption\n\nexport type CalculateAddLiquidityAutoFillOption = {\n coin_amount: string\n fix_amount_a: boolean\n} & BaseCalculateAddLiquidityOption\n\nexport type AddLiquidityOption = BaseAddLiquidityOption & {\n position_id: string\n collect_fee: boolean\n reward_coins: string[]\n}\n\nexport type OpenAndAddLiquidityOption = BaseAddLiquidityOption & {\n lower_bin_id: number\n upper_bin_id: number\n}\n\nexport type OpenAndAddLiquidityWithPriceOption = BaseAddLiquidityOption & {\n price_base_coin: 'coin_a' | 'coin_b'\n price: string\n lower_price: string\n upper_price: string\n active_bin_of_pool?: BinAmount\n strategy_type: StrategyType\n decimals_a: number\n decimals_b: number\n max_price_slippage: number\n}\n\nexport type OpenPositionOption = {\n pool_id: string\n lower_bin_id: number\n upper_bin_id: number\n} & CoinPairType\n\nexport type CalculateRemoveLiquidityBothOption = {\n bins: BinAmount[]\n active_id: number\n fix_amount_a: boolean\n coin_amount: string\n}\n\nexport type CalculateRemoveLiquidityOnlyOption = {\n bins: BinAmount[]\n active_id: number\n is_only_a: boolean\n coin_amount: string\n}\n\nexport type RemoveLiquidityOption = {\n pool_id: string\n position_id: string\n active_id: number\n bin_step: number\n bin_infos: BinLiquidityInfo\n slippage: number\n reward_coins: string[]\n collect_fee: boolean\n remove_percent?: number\n} & CoinPairType\n\nexport type CollectRewardOption = {\n pool_id: string\n position_id: string\n reward_coins: string[]\n} & CoinPairType\n\nexport type CollectFeeOption = {\n pool_id: string\n position_id: string\n} & CoinPairType\n\nexport type CollectRewardAndFeeOption = {\n pool_id: string\n position_id: string\n reward_coins: string[]\n} & CoinPairType\n\nexport type BinSwap = {\n bin_id: number\n in_amount: string\n out_amount: string\n fee: string\n var_fee_rate: string\n}\n\nexport type PreSwapQuote = {\n pool_id: string\n a2b: boolean\n in_amount: string\n out_amount: string\n ref_fee_amount: string\n fee_amount: string\n partner: string\n from_coin_type: string\n to_coin_type: string\n bin_swaps: BinSwap[]\n}\n\nexport type PreSwapOption = {\n pool_id: string\n a2b: boolean\n by_amount_in: boolean\n in_amount: string\n} & CoinPairType\n\nexport type SwapOption = {\n quote_obj: PreSwapQuote\n by_amount_in: boolean\n partner?: string\n slippage: number\n} & CoinPairType\n\nexport type PositionFee = {\n position_id: string\n fee_owned_a: string\n fee_owned_b: string\n}\n\nexport type RewardInfo = {\n coin_type: string\n reward_owned: string\n}\n\nexport type PositionReward = {\n position_id: string\n rewards: RewardInfo[]\n}\n\nexport type CreatePartnerOption = {\n name: string\n ref_fee_rate: number\n start_time: number\n end_time: number\n recipient: string\n}\n\nexport type UpdateRefFeeRateOption = {\n partner_id: string\n ref_fee_rate: number\n}\n\nexport type UpdateTimeRangeOption = {\n partner_id: string\n start_time: number\n end_time: number\n}\n\nexport type ClaimRefFeeOption = {\n partner_id: string\n partner_cap_id?: string\n fee_coin_types: string[]\n}\n\nexport type Partner = {\n id: string\n name: string\n ref_fee_rate: number\n start_time: number\n end_time: number\n balances: TableHandle\n type: string\n}\n\nexport type PoolTransactionInfo = {\n index: string\n tx: string\n sender: string\n type: string\n block_time: string\n parsed_json: any\n}\n\nexport type AddRewardOption = {\n pool_id: string\n reward_coin_type: string\n reward_amount: string\n // Optional start time in seconds for the reward\n start_time_seconds?: number\n // Mandatory end time in seconds for the reward\n end_time_seconds: number\n} & CoinPairType\n\nexport type InitRewardOption = {\n pool_id: string\n reward_coin_types: string[]\n} & CoinPairType\n\nexport type RewardWhiteListOption = {\n reward_coin_types: string[]\n type: 'add' | 'remove'\n}\n\nexport type RewardAccessOption = {\n pool_id: string\n type: 'to_public' | 'to_private'\n} & CoinPairType\n\nexport type ValidateActiveIdSlippageOption = {\n pool_id: string | TransactionObjectArgument\n active_id: number\n bin_step: number\n max_price_slippage: number\n} & CoinPairType\n\nexport type DlmmGlobalConfig = {\n id: string\n acl: TableHandle\n allowed_list: TableHandle\n denied_list: TableHandle\n bin_steps: TableHandle\n reward_white_list: string[]\n blocked_position: TableHandle\n blocked_user: TableHandle\n min_reward_duration: number\n non_manager_initialize_reward_cap: number\n reward_public: boolean\n}\n\nexport type UpdatePositionFeeAndRewardsOption = {\n pool_id: string\n position_id: string\n} & CoinPairType\n\nexport type RewardPeriodEmission = {\n emissions_per_second: string\n emissions_per_day: string\n emissions_per: string\n time: string\n visualized_time: string\n}\n\nexport type RewardPeriodEmissionFormat = {\n emissions_per_second: string\n emissions_per_day: string\n time: string\n visualized_time: string\n}\n\nexport type GetPoolBinInfoOption = {\n pool_id: string\n} & CoinPairType\n\nexport type GetTotalFeeRateOption = {\n pool_id: string\n} & CoinPairType\n\nexport type FeeRate = {\n base_fee_rate: string\n var_fee_rate: string\n total_fee_rate: string\n}\n\nexport type WeightsOptions = {\n strategy_type: StrategyType\n active_id: number\n bin_step: number\n lower_bin_id: number\n upper_bin_id: number\n total_amount_a: string\n total_amount_b: string\n active_bin_of_pool?: BinAmount\n}\n\nexport type WeightsInfo = {\n total_weight_a: Decimal\n total_weight_b: Decimal\n weights: Decimal[]\n weight_per_prices: Decimal[]\n active_weight_a: Decimal\n active_weight_b: Decimal\n} & WeightsOptions\n\nexport type GetBinInfoOption = {\n bin_manager_handle: string\n bin_id: number\n bin_step: number\n}\n\nexport type GetBinInfoResult = {\n bin_manager_handle: string\n bin_id: number\n bin_step: number\n} & BinAmount\n","import { d, DETAILS_KEYS, MathUtil } from '@cetusprotocol/common-sdk'\nimport { BIN_BOUND, MAX_BIN_PER_POSITION } from '../types/constants'\nimport Decimal from 'decimal.js'\nimport { BASIS_POINT_MAX } from '../types/constants'\nimport BN from 'bn.js'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { BinAmount, BinLiquidityInfo } from '../types/dlmm'\n\nconst MAX_EXPONENTIAL = new BN(0x80000)\nexport const SCALE_OFFSET = 64\nexport const ONE = new BN(1).shln(SCALE_OFFSET)\nconst MAX = new BN(2).pow(new BN(128)).sub(new BN(1))\n\nexport class BinUtils {\n /**\n * Split bins into multiple smaller positions based on MAX_BIN_PER_POSITION\n * @param bins - The bins to split\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @returns Array of bin info objects for each position\n */\n static splitBinLiquidityInfo(liquidity_bins: BinLiquidityInfo, lower_bin_id: number, upper_bin_id: number): BinLiquidityInfo[] {\n const position_count = BinUtils.getPositionCount(lower_bin_id, upper_bin_id)\n if (position_count <= 1) {\n return [liquidity_bins]\n }\n\n const positions: BinLiquidityInfo[] = []\n let current_lower = lower_bin_id\n\n for (let i = 0; i < position_count; i++) {\n const current_upper = Math.min(current_lower + MAX_BIN_PER_POSITION - 2, upper_bin_id)\n const position_bins = liquidity_bins.bins.filter((bin) => bin.bin_id >= current_lower && bin.bin_id <= current_upper)\n\n positions.push({\n bins: position_bins,\n amount_a: position_bins.reduce((acc, bin) => d(acc).plus(bin.amount_a), d(0)).toFixed(0),\n amount_b: position_bins.reduce((acc, bin) => d(acc).plus(bin.amount_b), d(0)).toFixed(0),\n })\n\n current_lower = current_upper + 1\n }\n\n return positions\n }\n\n /**\n * Process bins by rate\n * @param bins - The bins to be processed\n * @param rate - The rate to be applied\n * @returns The processed bins\n */\n static processBinsByRate(bins: BinAmount[], rate: string): { bins: BinLiquidityInfo; has_invalid_amount: boolean } {\n const used_bins: BinAmount[] = []\n let used_total_amount_a = d(0)\n let used_total_amount_b = d(0)\n\n let has_invalid_amount = false\n\n bins.forEach((bin) => {\n const { amount_a, amount_b, liquidity = '0' } = bin\n const used_liquidity = d(rate).mul(liquidity).toFixed(0)\n const used_amount_a = d(amount_a).mul(rate)\n const used_amount_b = d(amount_b).mul(rate)\n\n used_total_amount_a = d(used_total_amount_a).plus(used_amount_a)\n used_total_amount_b = d(used_total_amount_b).plus(used_amount_b)\n\n if ((d(used_amount_a).lt(1) && d(used_amount_a).gt(0)) || (d(used_amount_b).lt(1) && d(used_amount_b).gt(0))) {\n has_invalid_amount = true\n }\n\n used_bins.push({\n bin_id: bin.bin_id,\n amount_a: used_amount_a.toFixed(0),\n amount_b: used_amount_b.toFixed(0),\n price_per_lamport: bin.price_per_lamport,\n liquidity: used_liquidity,\n })\n })\n\n return {\n bins: {\n bins: used_bins,\n amount_a: used_total_amount_a.toFixed(0),\n amount_b: used_total_amount_b.toFixed(0),\n },\n has_invalid_amount,\n }\n }\n\n /**\n * Calculate the amount of token A and token B to be removed from a bin\n * @param bin - The bin information\n * @param remove_liquidity - The amount of liquidity to be removed\n * @returns The amount of token A and token B to be removed\n */\n static calculateOutByShare(bin: BinAmount, remove_liquidity: string) {\n const { amount_a, amount_b, liquidity = '0' } = bin\n\n if (liquidity === '0') {\n return {\n amount_a: '0',\n amount_b: '0',\n }\n }\n\n if (d(remove_liquidity).gte(d(liquidity))) {\n return {\n amount_a: amount_a,\n amount_b: amount_b,\n }\n }\n\n const amount_a_out = d(remove_liquidity).div(liquidity).mul(amount_a).toFixed(0, Decimal.ROUND_FLOOR)\n const amount_b_out = d(remove_liquidity).div(liquidity).mul(amount_b).toFixed(0, Decimal.ROUND_FLOOR)\n\n return {\n amount_a: amount_a_out,\n amount_b: amount_b_out,\n }\n }\n\n /**\n * Get the number of positions in a range of bin ids\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @returns The number of positions\n */\n static getPositionCount(lower_bin_id: number, upper_bin_id: number) {\n const binDelta = d(upper_bin_id).sub(lower_bin_id).add(1)\n const positionCount = binDelta.div(MAX_BIN_PER_POSITION)\n return Number(positionCount.toFixed(0, Decimal.ROUND_UP))\n }\n\n /**\n * Calculate the amount of liquidity following the constant sum formula `L = price * x + y`\n * @param amount_a\n * @param amount_b\n * @param qPrice Price is in Q64x64\n * @returns\n */\n static getLiquidity(amount_a: string, amount_b: string, qPrice: string): string {\n const px = d(qPrice).mul(amount_a)\n const liquidity = px.add(d(amount_b).mul(d(2).pow(SCALE_OFFSET)))\n return liquidity.toFixed(0)\n }\n\n /**\n * Calculate amount_a from liquidity when all liquidity is in token A\n * @param liquidity - The liquidity amount\n * @param qPrice - Price in Q64x64 format\n * @returns The amount of token A\n */\n static getAmountAFromLiquidity(liquidity: string, qPrice: string): string {\n return d(liquidity).div(d(qPrice)).toFixed(0)\n }\n\n /**\n * Calculate amount_b from liquidity when all liquidity is in token B\n * @param liquidity - The liquidity amount\n * @returns The amount of token B\n */\n static getAmountBFromLiquidity(liquidity: string): string {\n return d(liquidity).div(d(2).pow(SCALE_OFFSET)).toFixed(0)\n }\n\n /**\n * Calculate amounts from liquidity using the same logic as Move code\n * @param amount_a - Current amount of token A in the bin\n * @param amount_b - Current amount of token B in the bin\n * @param delta_liquidity - The liquidity delta to calculate amounts for\n * @param liquidity_supply - Total liquidity supply in the bin\n * @returns [amount_a_out, amount_b_out]\n */\n static getAmountsFromLiquidity(amount_a: string, amount_b: string, delta_liquidity: string, liquidity_supply: string): [string, string] {\n if (d(liquidity_supply).isZero()) {\n handleError(DlmmErrorCode.LiquiditySupplyIsZero, 'Liquidity supply is zero')\n }\n\n if (d(delta_liquidity).gt(d(liquidity_supply))) {\n handleError(DlmmErrorCode.InvalidDeltaLiquidity, 'Invalid delta liquidity')\n }\n\n if (d(delta_liquidity).isZero()) {\n return ['0', '0']\n }\n\n let out_amount_a: string\n if (d(amount_a).isZero()) {\n out_amount_a = '0'\n } else {\n out_amount_a = d(amount_a).mul(d(delta_liquidity)).div(d(liquidity_supply)).toFixed(0, Decimal.ROUND_FLOOR)\n }\n\n let out_amount_b: string\n if (d(amount_b).isZero()) {\n out_amount_b = '0'\n } else {\n out_amount_b = d(amount_b).mul(d(delta_liquidity)).div(d(liquidity_supply)).toFixed(0, Decimal.ROUND_FLOOR)\n }\n\n return [out_amount_a, out_amount_b]\n }\n\n /**\n * Get the price of a bin by bin id\n * @param bin_id - The bin id\n * @param bin_step - The bin step\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @returns The price of the bin\n */\n static getPriceFromBinId(bin_id: number, bin_step: number, decimal_a: number, decimal_b: number): string {\n const pricePerLamport = BinUtils.getPricePerLamportFromBinId(bin_id, bin_step)\n return BinUtils.getPriceFromLamport(decimal_a, decimal_b, pricePerLamport).toString()\n }\n\n /**\n * Get the price per lamport of a bin by bin id\n * @param bin_id - The bin id\n * @param bin_step - The bin step\n * @returns The price per lamport of the bin\n */\n static getPricePerLamportFromBinId(bin_id: number, bin_step: number): string {\n const binStepNum = new Decimal(bin_step).div(new Decimal(BASIS_POINT_MAX))\n return new Decimal(1).add(new Decimal(binStepNum)).pow(new Decimal(bin_id)).toString()\n }\n\n /**\n * Get the bin id from a price\n * @param price - The price\n * @param binStep - The bin step\n * @param min - Whether to use the minimum or maximum bin id\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @returns The bin id\n */\n public static getBinIdFromPrice(price: string, binStep: number, min: boolean, decimal_a: number, decimal_b: number): number {\n const pricePerLamport = BinUtils.getPricePerLamport(decimal_a, decimal_b, price)\n return BinUtils.getBinIdFromLamportPrice(pricePerLamport, binStep, min)\n }\n\n /**\n * Get the bin id from a price per lamport\n * @param pricePerLamport - The price per lamport\n * @param binStep - The bin step\n * @param min - Whether to use the minimum or maximum bin id\n * @returns The bin id\n */\n public static getBinIdFromLamportPrice(pricePerLamport: string, binStep: number, min: boolean): number {\n const binStepNum = new Decimal(binStep).div(new Decimal(BASIS_POINT_MAX))\n const binId = new Decimal(pricePerLamport).log().dividedBy(new Decimal(1).add(binStepNum).log())\n return (min ? binId.floor() : binId.ceil()).toNumber()\n }\n\n /**\n * Get the price per lamport\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @param price - The price\n * @returns The price per lamport\n */\n public static getPricePerLamport(decimal_a: number, decimal_b: number, price: string): string {\n return new Decimal(price).mul(new Decimal(10 ** (decimal_b - decimal_a))).toString()\n }\n\n /**\n * Convert price per lamport back to original price\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @param pricePerLamport - The price per lamport\n * @returns The original price\n */\n public static getPriceFromLamport(decimal_a: number, decimal_b: number, pricePerLamport: string): string {\n return new Decimal(pricePerLamport).div(new Decimal(10 ** (decimal_b - decimal_a))).toString()\n }\n\n /**\n * Get the reverse price\n * @param price - The price\n * @returns The reverse price\n */\n public static getReversePrice(price: string): string {\n return new Decimal(1).div(price).toString()\n }\n\n /**\n * Get the price of a bin by bin id\n * @param binId - The bin id\n * @param binStep - The bin step\n * @returns The price of the bin\n */\n static getQPriceFromId(binId: number, binStep: number): string {\n const bps = new BN(binStep).shln(SCALE_OFFSET).div(new BN(BASIS_POINT_MAX))\n const base = ONE.add(bps)\n return BinUtils.pow(base, new BN(binId)).toString()\n }\n\n /**\n * Convert QPrice (Q64x64 format) to actual price\n * @param qPrice - The price in Q64x64 format\n * @returns The actual price\n */\n static getPricePerLamportFromQPrice(qPrice: string): string {\n return MathUtil.fromX64(new BN(qPrice)).toString()\n }\n\n static pow(base: BN, exp: BN): BN {\n let invert = exp.isNeg()\n\n if (exp.isZero()) {\n return ONE\n }\n\n exp = invert ? exp.abs() : exp\n\n if (exp.gt(MAX_EXPONENTIAL)) {\n return new BN(0)\n }\n\n let squaredBase = base\n let result = ONE\n\n if (squaredBase.gte(result)) {\n squaredBase = MAX.div(squaredBase)\n invert = !invert\n }\n\n if (!exp.and(new BN(0x1)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x2)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x4)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x8)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x10)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x20)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x40)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x80)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x100)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x200)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x400)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x800)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x1000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x2000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x4000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x8000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x10000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x20000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x40000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n if (result.isZero()) {\n return new BN(0)\n }\n\n if (invert) {\n result = MAX.div(result)\n }\n\n return result\n }\n\n /**\n * Converts a bin ID to a score by adding the bin bound and validating the range\n * @param binId - The bin ID to convert\n * @returns The calculated bin score\n * @throws Error if the bin ID is invalid\n */\n static binScore(binId: number): string {\n const score = BigInt(binId) + BIN_BOUND\n if (score < 0n || score > BIN_BOUND * 2n) {\n handleError(DlmmErrorCode.InvalidBinId, new Error('Invalid bin ID'), {\n [DETAILS_KEYS.METHOD_NAME]: 'binScore',\n [DETAILS_KEYS.REQUEST_PARAMS]: { binId },\n })\n }\n\n return score.toString()\n }\n\n /**\n * Converts a score back to bin ID by subtracting the bin bound\n * @param score - The score to convert\n * @returns The calculated bin ID\n * @throws Error if the score is invalid\n */\n static scoreToBinId(score: string): number {\n const binId = BigInt(score) - BIN_BOUND\n if (binId < -BIN_BOUND || binId > BIN_BOUND) {\n handleError(DlmmErrorCode.InvalidBinId, new Error('Invalid score'), {\n [DETAILS_KEYS.METHOD_NAME]: 'scoreToBinId',\n [DETAILS_KEYS.REQUEST_PARAMS]: { score },\n })\n }\n\n return Number(binId)\n }\n\n /**\n * Resolves the bin position from a score.\n *\n * @param score - The score to resolve\n * @returns Tuple of [group index, offset in group]\n */\n static resolveBinPosition(score: string): [string, number] {\n const scoreBigInt = BigInt(score)\n const groupIndex = scoreBigInt >> 4n\n const offsetInGroup = Number(scoreBigInt & 0xfn)\n\n return [groupIndex.toString(), offsetInGroup]\n }\n\n static findMinMaxBinId(binStep: number) {\n const base = 1 + binStep / BASIS_POINT_MAX\n const maxQPriceSupported = new Decimal('18446744073709551615')\n const n = maxQPriceSupported.log(10).div(new Decimal(base).log(10)).floor()\n\n let minBinId = n.neg()\n let maxBinId = n\n\n let minQPrice = d(1)\n let maxQPrice = d('340282366920938463463374607431768211455')\n\n while (true) {\n const qPrice = d(BinUtils.getQPriceFromId(minBinId.toNumber(), binStep))\n if (qPrice.gt(minQPrice) && !qPrice.isZero()) {\n break\n } else {\n minBinId = minBinId.add(1)\n }\n }\n\n while (true) {\n const qPrice = d(BinUtils.getQPriceFromId(maxBinId.toNumber(), binStep))\n if (qPrice.lt(maxQPrice) && !qPrice.isZero()) {\n break\n } else {\n maxBinId = maxBinId.sub(1)\n }\n }\n\n return {\n minBinId: minBinId.toNumber(),\n maxBinId: maxBinId.toNumber(),\n }\n }\n\n static getBinShift(active_id: number, bin_step: number, max_price_slippage: number): number {\n const price = BinUtils.getPricePerLamportFromBinId(active_id, bin_step)\n const price_limit = d(price)\n .mul(1 + max_price_slippage)\n .toString()\n const slippage_active_id = BinUtils.getBinIdFromLamportPrice(price_limit, bin_step, true)\n const bin_shift = d(slippage_active_id).sub(active_id).abs().toFixed(0, Decimal.ROUND_UP)\n\n console.log('getBinShift Options:', {\n active_id,\n bin_shift,\n })\n return Number(bin_shift)\n }\n}\n","export const MAX_BIN_PER_POSITION = 1000\n\nexport const MIN_BIN_ID = -443636\n\nexport const MAX_BIN_ID = 443636\n\nexport const BASIS_POINT_MAX = 10000\n\nexport const DEFAULT_MAX_WEIGHT = 2000\n\nexport const DEFAULT_MIN_WEIGHT = 200\n\nexport const BIN_BOUND = 443636n\n\nexport const MAX_FEE_RATE = 100_000_000\n\nexport const FEE_PRECISION = 1_000_000_000\n\nexport const BASIS_POINT = 10000\n\nexport const REWARD_PERIOD = 7 * 24 * 60 * 60\n\nexport const REWARD_PERIOD_START_AT = 1747627200\n","import { d } from '@cetusprotocol/common-sdk'\nimport { BinLiquidityInfo, BinWeight, StrategyType, WeightsInfo, WeightsOptions } from '../types/dlmm'\nimport Decimal from 'decimal.js'\nimport { DEFAULT_MAX_WEIGHT, DEFAULT_MIN_WEIGHT } from '../types/constants'\nimport { BinUtils, SCALE_OFFSET } from './binUtils'\nimport { safeMulAmount } from './parseData'\n\nexport class WeightUtils {\n static toWeight(options: WeightsOptions): WeightsInfo {\n console.log('🚀 ~ WeightUtils ~ toWeight ~ options:', options)\n\n const { strategy_type, active_id, bin_step, lower_bin_id, upper_bin_id, total_amount_a, total_amount_b, active_bin_of_pool } = options\n const single_side = active_id < lower_bin_id || active_id > upper_bin_id\n const active_bin_price = BinUtils.getQPriceFromId(active_id, bin_step)\n\n let active_weight_a = d(0)\n let active_weight_b = d(0)\n\n let base_weight = d(DEFAULT_MIN_WEIGHT)\n if (strategy_type === StrategyType.BidAsk) {\n base_weight = d(DEFAULT_MIN_WEIGHT)\n } else if (strategy_type === StrategyType.Curve) {\n base_weight = d(DEFAULT_MAX_WEIGHT)\n } else if (strategy_type === StrategyType.Spot) {\n base_weight = d(1)\n }\n\n if (!single_side && active_bin_of_pool) {\n const weights = this.calculateActiveWeights(active_bin_of_pool.amount_a, active_bin_of_pool.amount_b, active_bin_price, base_weight)\n active_weight_a = weights.active_weight_a\n active_weight_b = weights.active_weight_b\n }\n\n if (active_id === lower_bin_id && d(total_amount_b).isZero()) {\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(d(active_bin_price))\n .floor()\n active_weight_b = d(0)\n }\n if (active_id === upper_bin_id && d(total_amount_a).isZero()) {\n active_weight_b = d(base_weight).mul(d(2).pow(SCALE_OFFSET)).floor()\n active_weight_a = d(0)\n }\n\n if (active_id > lower_bin_id && active_id < upper_bin_id) {\n if (d(total_amount_a).isZero()) {\n active_weight_b = d(base_weight).mul(d(2).pow(SCALE_OFFSET)).floor()\n active_weight_a = d(0)\n }\n if (d(total_amount_b).isZero()) {\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(d(active_bin_price))\n .floor()\n active_weight_b = d(0)\n }\n }\n let total_weight_a = single_side ? d(0) : active_weight_a\n let total_weight_b = single_side ? d(0) : active_weight_b\n\n const diff_weight = d(DEFAULT_MAX_WEIGHT).sub(d(DEFAULT_MIN_WEIGHT)).floor()\n\n const left_end_bin_id = active_id > upper_bin_id ? upper_bin_id : active_id\n const right_start_bin_id = active_id < lower_bin_id ? lower_bin_id : active_id\n\n const diff_min_weight =\n active_id > lower_bin_id\n ? left_end_bin_id === lower_bin_id\n ? d(0)\n : diff_weight.div(d(left_end_bin_id - lower_bin_id)).floor()\n : d(0)\n\n const diff_max_weight =\n upper_bin_id > active_id\n ? right_start_bin_id === upper_bin_id\n ? d(0)\n : diff_weight.div(d(upper_bin_id - right_start_bin_id)).floor()\n : d(0)\n\n let bin_id = lower_bin_id\n let weights: Decimal[] = []\n let weight_per_prices: Decimal[] = []\n\n while (bin_id <= upper_bin_id) {\n let weight: Decimal = d(0)\n if (bin_id < active_id) {\n const delta_bin = left_end_bin_id - bin_id\n if (strategy_type === StrategyType.Spot) {\n weight = d(1)\n } else if (strategy_type === StrategyType.BidAsk) {\n weight = d(base_weight).add(diff_min_weight.mul(delta_bin)).floor()\n } else if (strategy_type === StrategyType.Curve) {\n weight = d(base_weight).sub(diff_min_weight.mul(delta_bin)).floor()\n }\n } else if (bin_id > active_id) {\n const delta_bin = bin_id - right_start_bin_id\n if (strategy_type === StrategyType.Spot) {\n weight = d(1)\n } else if (strategy_type === StrategyType.BidAsk) {\n weight = d(base_weight).add(diff_max_weight.mul(delta_bin)).floor()\n } else if (strategy_type === StrategyType.Curve) {\n weight = d(base_weight).sub(diff_max_weight.mul(delta_bin)).floor()\n }\n } else {\n weight = base_weight\n }\n weights.push(weight)\n\n if (bin_id < active_id) {\n total_weight_b = total_weight_b.add(weight.mul(d(2).pow(SCALE_OFFSET))).floor()\n weight_per_prices.push(d(0))\n } else if (bin_id > active_id) {\n const weight_per_price = weight\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(BinUtils.getQPriceFromId(bin_id, bin_step))\n .floor()\n weight_per_prices.push(weight_per_price)\n total_weight_a = total_weight_a.add(weight_per_price).floor()\n } else {\n weight_per_prices.push(d(0))\n }\n\n bin_id += 1\n }\n\n return {\n ...options,\n total_weight_a,\n total_weight_b,\n active_weight_a,\n active_weight_b,\n weights,\n weight_per_prices,\n }\n }\n\n static toWeightSpotBalanced(min_bin_id: number, max_bin_id: number): BinWeight[] {\n let distributions = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n distributions.push({\n bin_id: i,\n weight: 1,\n })\n }\n return distributions\n }\n\n static toWeightDescendingOrder(min_bin_id: number, max_bin_id: number): BinWeight[] {\n let distributions = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n distributions.push({\n bin_id: i,\n weight: max_bin_id - i + 1,\n })\n }\n return distributions\n }\n\n static toWeightAscendingOrder(min_bin_id: number, max_bin_id: number): BinWeight[] {\n let distributions = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n distributions.push({\n bin_id: i,\n weight: i - min_bin_id + 1,\n })\n }\n return distributions\n }\n\n static toWeightCurve(min_bin_id: number, max_bin_id: number, active_id: number): BinWeight[] {\n if (active_id < min_bin_id) {\n return WeightUtils.toWeightDescendingOrder(min_bin_id, max_bin_id)\n } else if (active_id > max_bin_id) {\n return WeightUtils.toWeightAscendingOrder(min_bin_id, max_bin_id)\n }\n\n let maxWeight = DEFAULT_MAX_WEIGHT\n let minWeight = DEFAULT_MIN_WEIGHT\n\n let diffWeight = maxWeight - minWeight\n let diffMinWeight = active_id > min_bin_id ? Math.floor(diffWeight / (active_id - min_bin_id)) : 0\n let diffMaxWeight = max_bin_id > active_id ? Math.floor(diffWeight / (max_bin_id - active_id)) : 0\n\n let distributions: BinWeight[] = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n if (i < active_id) {\n distributions.push({\n bin_id: i,\n weight: maxWeight - (active_id - i) * diffMinWeight,\n })\n } else if (i > active_id) {\n distributions.push({\n bin_id: i,\n weight: maxWeight - (i - active_id) * diffMaxWeight,\n })\n } else {\n distributions.push({\n bin_id: i,\n weight: maxWeight,\n })\n }\n }\n return distributions\n }\n\n static toWeightBidAsk(min_bin_id: number, max_bin_id: number, active_id: number): BinWeight[] {\n if (active_id > max_bin_id) {\n return WeightUtils.toWeightDescendingOrder(min_bin_id, max_bin_id)\n } else if (active_id < min_bin_id) {\n return WeightUtils.toWeightAscendingOrder(min_bin_id, max_bin_id)\n }\n\n let maxWeight = DEFAULT_MAX_WEIGHT\n let minWeight = DEFAULT_MIN_WEIGHT\n\n let diffWeight = maxWeight - minWeight\n let diffMinWeight = active_id > min_bin_id ? Math.floor(diffWeight / (active_id - min_bin_id)) : 0\n let diffMaxWeight = max_bin_id > active_id ? Math.floor(diffWeight / (max_bin_id - active_id)) : 0\n\n let distributions: BinWeight[] = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n if (i < active_id) {\n distributions.push({\n bin_id: i,\n weight: minWeight + (active_id - i) * diffMinWeight,\n })\n } else if (i > active_id) {\n distributions.push({\n bin_id: i,\n weight: minWeight + (i - active_id) * diffMaxWeight,\n })\n } else {\n distributions.push({\n bin_id: i,\n weight: minWeight,\n })\n }\n }\n return distributions\n }\n\n /**\n * Distribute totalAmount to all bid side bins according to given distributions.\n * @param active_id - active bin id\n * @param amount_b - total amount of coin b to be distributed\n * @param distributions - weight distribution of each bin\n * @returns array of {binId, amount} where amount is the amount of coin b in each bin\n */\n static toAmountBidSide(\n active_id: number,\n amount_b: string,\n bin_step: number,\n distributions: BinWeight[],\n contain_active_bin = false\n ): BinLiquidityInfo {\n // get sum of weight\n const totalWeight = distributions\n .filter((bin) => bin.bin_id <= active_id)\n .reduce(function (sum, el) {\n if (contain_active_bin) {\n return el.bin_id > active_id ? sum : sum.add(el.weight) // skip all ask side\n } else {\n return el.bin_id >= active_id ? sum : sum.add(el.weight) // skip all ask side\n }\n }, d(0))\n\n if (totalWeight.cmp(d(0)) != 1) {\n throw Error('Invalid parameters')\n }\n\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n\n const isValidBin = bin.bin_id <= active_id\n\n if (!isValidBin || (bin.bin_id >= active_id && !contain_active_bin)) {\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: '0',\n price_per_lamport,\n liquidity: '0',\n }\n } else {\n const rate = d(bin.weight).div(totalWeight)\n const amount_b_in_bin = safeMulAmount(d(amount_b), rate).toString()\n const amount_a = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a, amount_b_in_bin, qPrice)\n return {\n bin_id: bin.bin_id,\n amount_b: amount_b_in_bin,\n amount_a,\n price_per_lamport,\n liquidity,\n }\n }\n })\n\n return {\n bins: bin_amounts,\n amount_a: '0',\n amount_b,\n }\n }\n\n /**\n * Distribute totalAmount to all ask side bins according to given distributions.\n * @param active_id active bin id\n * @param amount_a total amount of coin a to be distributed\n * @param distributions weight distribution of each bin\n * @returns array of {binId, amount} where amount is the amount of coin a in each bin\n */\n static toAmountAskSide(\n active_id: number,\n bin_step: number,\n amount_a: string,\n distributions: BinWeight[],\n contain_active_bin = false\n ): BinLiquidityInfo {\n // get sum of weight\n const totalWeight: Decimal = distributions\n .filter((bin) => bin.bin_id >= active_id)\n .reduce(function (sum, el) {\n if (el.bin_id <= active_id && !contain_active_bin) {\n return sum\n } else {\n const price_per_lamport = BinUtils.getPricePerLamportFromBinId(el.bin_id, bin_step)\n const weightPerPrice = new Decimal(el.weight).div(price_per_lamport)\n return sum.add(weightPerPrice)\n }\n }, new Decimal(0))\n\n if (totalWeight.cmp(new Decimal(0)) != 1) {\n throw Error('Invalid parameters')\n }\n\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n const isValidBin = bin.bin_id >= active_id\n\n if (!isValidBin || (bin.bin_id <= active_id && !contain_active_bin)) {\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: '0',\n price_per_lamport,\n liquidity: '0',\n }\n } else {\n const weightPerPrice = new Decimal(bin.weight).div(price_per_lamport)\n const rate = weightPerPrice.div(totalWeight)\n const amount_a_in_bin = safeMulAmount(d(amount_a), rate).toString()\n const amount_b = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a_in_bin, amount_b, qPrice)\n return {\n bin_id: bin.bin_id,\n amount_a: amount_a_in_bin,\n amount_b,\n price_per_lamport,\n liquidity,\n }\n }\n })\n\n return {\n bins: bin_amounts,\n amount_a,\n amount_b: '0',\n }\n }\n\n /**\n * Distributes the given amounts of tokens X and Y to both bid and ask side bins\n * based on the provided weight distributions.\n *\n * @param activeId - The id of the active bin.\n * @param binStep - The step interval between bin ids.\n * @param amountX - Total amount of token X to distribute.\n * @param amountY - Total amount of token Y to distribute.\n * @param amountXInActiveBin - Amount of token X already in the active bin.\n * @param amountYInActiveBin - Amount of token Y already in the active bin.\n * @param distributions - Array of bins with their respective weight distributions.\n * @param mintX - Mint information for token X. Get from DLMM instance.\n * @param mintY - Mint information for token Y. Get from DLMM instance.\n * @param clock - Clock instance. Get from DLMM instance.\n * @returns An array of objects containing binId, amountX, and amountY for each bin.\n */\n static toAmountBothSide(\n active_id: number,\n bin_step: number,\n amount_a: string,\n amount_b: string,\n amount_a_in_active_bin: string,\n amount_b_in_active_bin: string,\n distributions: BinWeight[]\n ): BinLiquidityInfo {\n const isOnlyAmountA = !d(amount_a).isZero() && d(amount_b).isZero()\n const isOnlyAmountB = d(amount_a).isZero() && !d(amount_b).isZero()\n\n // only bid side\n if (active_id > distributions[distributions.length - 1].bin_id) {\n return WeightUtils.toAmountBidSide(active_id, amount_b, bin_step, distributions)\n }\n\n if (isOnlyAmountB && active_id !== distributions[distributions.length - 1].bin_id) {\n return WeightUtils.toAmountBidSide(active_id, amount_b, bin_step, distributions, true)\n }\n\n // only ask side\n if (active_id < distributions[0].bin_id) {\n return WeightUtils.toAmountAskSide(active_id, bin_step, amount_a, distributions)\n }\n\n if (isOnlyAmountA && active_id !== distributions[0].bin_id) {\n return WeightUtils.toAmountAskSide(active_id, bin_step, amount_a, distributions, true)\n }\n\n const activeBins = distributions.filter((element) => {\n return element.bin_id === active_id\n })\n\n if (activeBins.length === 1) {\n const { totalWeightA, totalWeightB, activeWeightA, activeWeightB } = WeightUtils.calculateTotalWeights(\n bin_step,\n distributions,\n active_id,\n activeBins[0],\n amount_a_in_active_bin,\n amount_b_in_active_bin,\n isOnlyAmountA ? 'a' : isOnlyAmountB ? 'b' : undefined\n )\n const kA = new Decimal(amount_a.toString()).div(totalWeightA)\n const kB = new Decimal(amount_b.toString()).div(totalWeightB)\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n if (bin.bin_id < active_id || (bin.bin_id === active_id && isOnlyAmountB)) {\n const amount_b = safeMulAmount(kB, new Decimal(bin.weight))\n const amount_a = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a, amount_b.toString(), qPrice)\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: amount_b.toString(),\n price_per_lamport,\n liquidity,\n }\n }\n if (bin.bin_id > active_id || (bin.bin_id === active_id && isOnlyAmountA)) {\n const weighPerPrice = new Decimal(bin.weight).div(price_per_lamport)\n const amount_a = safeMulAmount(kA, new Decimal(weighPerPrice))\n const amount_b = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a.toString(), amount_b, qPrice)\n\n return {\n bin_id: bin.bin_id,\n amount_a: amount_a.toString(),\n amount_b: '0',\n price_per_lamport,\n liquidity,\n }\n }\n\n const amountAActiveBin = safeMulAmount(kA, activeWeightA)\n const amountBActiveBin = safeMulAmount(kB, activeWeightB)\n let amount_a = amountAActiveBin.toString()\n let amount_b = amountBActiveBin.toString()\n\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a, amount_b, qPrice)\n return {\n bin_id: bin.bin_id,\n amount_a,\n amount_b,\n price_per_lamport,\n liquidity,\n }\n })\n\n const total_amount_a = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_a)), d(0)).toString()\n const total_amount_b = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_b)), d(0)).toString()\n\n return {\n bins: bin_amounts,\n amount_a: total_amount_a,\n amount_b: total_amount_b,\n }\n } else {\n const { totalWeightA, totalWeightB } = WeightUtils.calculateTotalWeights(bin_step, distributions, active_id)\n let kA = new Decimal(amount_a.toString()).div(totalWeightA)\n let kB = new Decimal(amount_b.toString()).div(totalWeightB)\n // let k = kA.lessThan(kB) ? kA : kB\n\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n if (bin.bin_id < active_id) {\n const amount = safeMulAmount(kB, new Decimal(bin.weight))\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: amount.toString(),\n price_per_lamport,\n }\n } else {\n let weighPerPrice = new Decimal(bin.weight).div(price_per_lamport)\n const amount = safeMulAmount(kA, weighPerPrice)\n return {\n bin_id: bin.bin_id,\n amount_a: amount.toString(),\n amount_b: '0',\n price_per_lamport,\n }\n }\n })\n\n const total_amount_a = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_a)), d(0)).toString()\n const total_amount_b = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_b)), d(0)).toString()\n\n return {\n bins: bin_amounts,\n amount_a: total_amount_a,\n amount_b: total_amount_b,\n }\n }\n }\n\n /**\n * Distributes the given amount of coin B to both bid and ask side bins\n * based on the provided weight distributions.\n *\n * @param active_id - The id of the active bin.\n * @param bin_step - The step interval between bin ids.\n * @param amount_a - Total amount of coin A to distribute.\n * @param amount_a_in_active_bin - Amount of coin A already in the active bin.\n * @param amount_b_in_active_bin - Amount of coin B already in the active bin.\n * @param distributions - Array of bins with their respective weight distributions.\n * @returns An array of objects containing binId, amountA, and amountB for each bin.\n */\n static autoFillCoinByWeight(\n active_id: number,\n bin_step: number,\n amount: string,\n fix_amount_a: boolean,\n amount_a_in_active_bin: string,\n amount_b_in_active_bin: string,\n distributions: BinWeight[]\n ): BinLiquidityInfo {\n // only bid side\n if (active_id > distributions[distributions.length - 1].bin_id) {\n return WeightUtils.toAmountBidSide(active_id, amount, bin_step, distributions)\n }\n // only ask side\n if (active_id < distributions[0].bin_id) {\n return WeightUtils.toAmountAskSide(active_id, bin_step, amount, distributions)\n }\n\n const activeBins = distributions.filter((element) => {\n return element.bin_id === active_id\n })\n\n const { totalWeightA, totalWeightB } = WeightUtils.calculateTotalWeights(\n bin_step,\n distributions,\n active_id,\n activeBins.length === 1 ? activeBins[0] : undefined,\n activeBins.length === 1 ? amount_a_in_active_bin : undefined,\n activeBins.length === 1 ? amount_b_in_active_bin : undefined\n )\n\n let k = d(0)\n\n if (fix_amount_a) {\n k = totalWeightA.isZero() ? new Decimal(0) : new Decimal(amount).div(totalWeightA)\n } else {\n k = totalWeightB.isZero() ? new Decimal(0) : new Decimal(amount).div(totalWeightB)\n }\n const other_amount = safeMulAmount(k, fix_amount_a ? totalWeightB : totalWeightA).toString()\n\n return WeightUtils.toAmountBothSide(\n active_id,\n bin_step,\n fix_amount_a ? amount : other_amount,\n fix_amount_a ? other_amount : amount,\n amount_a_in_active_bin,\n amount_b_in_active_bin,\n distributions\n )\n }\n\n static calculateActiveWeights(\n amount_a_in_active_id: string,\n amount_b_in_active_id: string,\n active_bin_price: string,\n base_weight: Decimal\n ): { active_weight_a: Decimal; active_weight_b: Decimal } {\n const p0 = d(active_bin_price)\n const amountA = d(amount_a_in_active_id)\n const amountB = d(amount_b_in_active_id)\n\n let active_weight_a: Decimal = d(0)\n let active_weight_b: Decimal = d(0)\n\n if (amountA.isZero() && amountB.isZero()) {\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(p0.mul(2))\n .floor()\n active_weight_b = d(base_weight).mul(d(2).pow(SCALE_OFFSET)).div(2).floor()\n } else {\n // Calculate wx0\n if (amountA.isZero()) {\n active_weight_a = d(0)\n } else {\n const m = amountB.mul(d(2).pow(SCALE_OFFSET)).div(amountA)\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(p0.add(m))\n .floor()\n }\n\n // Calculate wy0\n if (amountB.isZero()) {\n active_weight_b = d(0)\n } else {\n const m = d(2).pow(SCALE_OFFSET).add(p0.mul(amountA).div(amountB)).floor()\n active_weight_b = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(m)\n .floor()\n }\n }\n\n return { active_weight_a, active_weight_b }\n }\n\n static calculateTotalWeights(\n bin_step: number,\n distributions: BinWeight[],\n active_id: number,\n activeBin?: BinWeight,\n amount_a_in_active_bin?: string,\n amount_b_in_active_bin?: string,\n is_only_amount?: 'a' | 'b'\n ): { totalWeightA: Decimal; totalWeightB: Decimal; activeWeightA: Decimal; activeWeightB: Decimal } {\n const p0 = d(BinUtils.getPricePerLamportFromBinId(active_id, bin_step))\n let activeWeightA = d(0)\n let activeWeightB = d(0)\n\n if (amount_a_in_active_bin && amount_b_in_active_bin && activeBin && !is_only_amount) {\n if (d(amount_a_in_active_bin).isZero() && d(amount_b_in_active_bin).isZero()) {\n activeWeightA = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n activeWeightB = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n let amountAInActiveBinDec = new Decimal(amount_a_in_active_bin.toString())\n let amountBInActiveBinDec = new Decimal(amount_b_in_active_bin.toString())\n\n if (!d(amount_a_in_active_bin).isZero()) {\n activeWeightA = new Decimal(activeBin.weight).div(p0.add(amountBInActiveBinDec.div(amountAInActiveBinDec)))\n }\n if (!d(amount_b_in_active_bin).isZero()) {\n activeWeightB = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountAInActiveBinDec).div(amountBInActiveBinDec)))\n }\n }\n }\n\n let totalWeightA = activeWeightA\n let totalWeightB = activeWeightB\n distributions.forEach((element) => {\n if (element.bin_id < active_id || is_only_amount === 'b') {\n totalWeightB = totalWeightB.add(new Decimal(element.weight))\n }\n if (element.bin_id > active_id || is_only_amount === 'a') {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(element.bin_id, bin_step)\n let weighPerPrice = new Decimal(element.weight).div(price_per_lamport)\n totalWeightA = totalWeightA.add(weighPerPrice)\n }\n })\n return { totalWeightA, totalWeightB, activeWeightA, activeWeightB }\n }\n}\n","import { d } from '@cetusprotocol/common-sdk'\nimport { BinAmount, BinLiquidityInfo, StrategyType, WeightsInfo } from '../types/dlmm'\nimport { WeightUtils } from './weightUtils'\nimport { BinUtils, SCALE_OFFSET } from './binUtils'\nimport { safeAmount, safeMulAmount } from './parseData'\nimport Decimal from 'decimal.js'\n\nexport class StrategyUtils {\n static toAmountsByWeights(weights_info: WeightsInfo): BinLiquidityInfo {\n const {\n total_weight_a,\n total_weight_b,\n weights,\n weight_per_prices,\n total_amount_a,\n total_amount_b,\n active_weight_a,\n active_weight_b,\n lower_bin_id,\n upper_bin_id,\n active_id,\n bin_step,\n } = weights_info\n\n const ky = total_weight_b.isZero()\n ? d(0)\n : d(total_amount_b)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(total_weight_b)\n .floor()\n\n const kx = total_weight_a.isZero()\n ? d(0)\n : d(total_amount_a)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(total_weight_a)\n .floor()\n\n const amount_a_in_active_id = safeAmount(kx.mul(active_weight_a).div(d(2).pow(SCALE_OFFSET * 2)))\n const amount_b_in_active_id = safeAmount(ky.mul(active_weight_b).div(d(2).pow(SCALE_OFFSET * 2)))\n\n const bin_count = upper_bin_id - lower_bin_id + 1\n let bin_id = lower_bin_id\n let idx = 0\n const bin_amounts: BinAmount[] = []\n while (idx < bin_count) {\n let amount_a_in_bin = d(0)\n let amount_b_in_bin = d(0)\n\n const qPrice = BinUtils.getQPriceFromId(bin_id, bin_step)\n\n if (bin_id < active_id) {\n amount_b_in_bin = safeAmount(ky.mul(weights[idx]).div(d(2).pow(SCALE_OFFSET)))\n } else if (bin_id > active_id) {\n amount_a_in_bin = safeAmount(kx.mul(weight_per_prices[idx]).div(d(2).pow(SCALE_OFFSET * 2)))\n } else {\n amount_a_in_bin = amount_a_in_active_id\n amount_b_in_bin = amount_b_in_active_id\n }\n const liquidity = BinUtils.getLiquidity(amount_a_in_bin.toString(), amount_b_in_bin.toString(), qPrice)\n\n bin_amounts.push({\n bin_id,\n amount_a: amount_a_in_bin.toString(),\n amount_b: amount_b_in_bin.toString(),\n price_per_lamport: BinUtils.getPricePerLamportFromBinId(bin_id, bin_step),\n liquidity,\n })\n bin_id += 1\n idx += 1\n }\n\n const info: BinLiquidityInfo = {\n bins: bin_amounts,\n amount_a: total_amount_a.toString(),\n amount_b: total_amount_b.toString(),\n }\n return info\n }\n\n /**\n * Given a strategy type and amounts of X and Y, returns the distribution of liquidity.\n * @param active_id The bin id of the active bin.\n * @param bin_step The step size of each bin.\n * @param min_bin_id The min bin id.\n * @param max_bin_id The max bin id.\n * @param amount_a The amount of X token to deposit.\n * @param amount_b The amount of Y token to deposit.\n * @param amount_a_in_active_bin The amount of X token in the active bin.\n * @param amount_b_in_active_bin The amount of Y token in the active bin.\n * @param strategy_type The strategy type.\n * @returns The distribution of liquidity.\n */\n static toAmountsBothSideByStrategy(\n active_id: number,\n bin_step: number,\n min_bin_id: number,\n max_bin_id: number,\n amount_a: string,\n amount_b: string,\n strategy_type: StrategyType,\n active_bin_of_pool?: BinAmount\n ): BinLiquidityInfo {\n const weights = WeightUtils.toWeight({\n strategy_type,\n active_id,\n bin_step,\n lower_bin_id: min_bin_id,\n upper_bin_id: max_bin_id,\n total_amount_a: amount_a,\n total_amount_b: amount_b,\n active_bin_of_pool,\n })\n\n return this.toAmountsByWeights(weights)\n }\n\n static autoFillCoinByStrategy(\n active_id: number,\n bin_step: number,\n amount: string,\n fix_amount_a: boolean,\n min_bin_id: number,\n max_bin_id: number,\n strategy_type: StrategyType,\n active_bin_of_pool?: BinAmount\n ): BinLiquidityInfo {\n switch (strategy_type) {\n case StrategyType.Spot: {\n let weights = WeightUtils.toWeightSpotBalanced(min_bin_id, max_bin_id)\n return WeightUtils.autoFillCoinByWeight(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n active_bin_of_pool?.amount_a || '0',\n active_bin_of_pool?.amount_b || '0',\n weights\n )\n }\n case StrategyType.Curve: {\n let weights = WeightUtils.toWeightCurve(min_bin_id, max_bin_id, active_id)\n return WeightUtils.autoFillCoinByWeight(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n active_bin_of_pool?.amount_a || '0',\n active_bin_of_pool?.amount_b || '0',\n weights\n )\n }\n case StrategyType.BidAsk: {\n let weights = WeightUtils.toWeightBidAsk(min_bin_id, max_bin_id, active_id)\n return WeightUtils.autoFillCoinByWeight(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n active_bin_of_pool?.amount_a || '0',\n active_bin_of_pool?.amount_b || '0',\n weights\n )\n }\n }\n }\n\n // only apply for\n static autoFillCoinByStrategyV2(\n active_id: number,\n bin_step: number,\n amount: string,\n fix_amount_a: boolean,\n min_bin_id: number,\n max_bin_id: number,\n strategy_type: StrategyType,\n active_bin_of_pool?: BinAmount\n ): BinLiquidityInfo {\n const info = this.autoFillCoinByStrategy(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n min_bin_id,\n max_bin_id,\n strategy_type,\n active_bin_of_pool\n )\n const weights = WeightUtils.toWeight({\n strategy_type,\n active_id,\n bin_step,\n lower_bin_id: min_bin_id,\n upper_bin_id: max_bin_id,\n total_amount_a: info.amount_a,\n total_amount_b: info.amount_b,\n active_bin_of_pool,\n })\n\n return this.toAmountsByWeights(weights)\n }\n}\n","import { d } from '@cetusprotocol/common-sdk'\nimport { BinAmount, BinStepConfig, VariableParameters } from '../types/dlmm'\nimport { BinUtils } from './binUtils'\nimport { BASIS_POINT, FEE_PRECISION, MAX_FEE_RATE } from '../types/constants'\n\nexport class FeeUtils {\n static getVariableFee(variableParameters: VariableParameters): string {\n const { volatility_accumulator, bin_step_config } = variableParameters\n const { variable_fee_control, bin_step } = bin_step_config\n\n if (d(variable_fee_control).gt(0)) {\n const square_vfa_bin = d(volatility_accumulator).mul(bin_step).pow(2)\n const v_fee = square_vfa_bin.mul(variable_fee_control)\n const scaled_v_fee = v_fee.add(99_999_999_999).div(100_000_000_000)\n return scaled_v_fee.toFixed(0)\n }\n return '0'\n }\n\n static calculateCompositionFee(amount: string, total_fee_rate: string) {\n const fee_amount = d(amount).mul(total_fee_rate)\n const composition_fee = d(fee_amount).mul(d(FEE_PRECISION).add(total_fee_rate))\n return composition_fee.div(1000000000000000000).toFixed(0)\n }\n\n static calculateProtocolFee(fee_amount: string, protocol_fee_rate: string) {\n const protocol_fee = d(fee_amount).mul(protocol_fee_rate).div(BASIS_POINT).ceil().toFixed(0)\n return protocol_fee\n }\n\n static getProtocolFees(fee_a: string, fee_b: string, protocol_fee_rate: string) {\n const protocol_fee_a = FeeUtils.calculateProtocolFee(fee_a, protocol_fee_rate)\n const protocol_fee_b = FeeUtils.calculateProtocolFee(fee_b, protocol_fee_rate)\n return {\n protocol_fee_a,\n protocol_fee_b,\n }\n }\n\n static getCompositionFees(\n active_bin: BinAmount,\n used_bin: BinAmount,\n variableParameters: VariableParameters\n ): { fees_a: string; fees_b: string } {\n const { bin_step_config } = variableParameters\n if (d(active_bin.liquidity || '0').eq(d(0))) {\n return {\n fees_a: '0',\n fees_b: '0',\n }\n }\n const { bin_step, base_factor } = bin_step_config\n const qPrice = BinUtils.getQPriceFromId(active_bin.bin_id, bin_step)\n const bin_liquidity = BinUtils.getLiquidity(active_bin.amount_a, active_bin.amount_b, qPrice)\n const delta_liquidity = BinUtils.getLiquidity(used_bin.amount_a, used_bin.amount_b, qPrice)\n const delta_liquidity_share = d(active_bin.liquidity).mul(delta_liquidity).div(bin_liquidity).toFixed(0)\n\n const { amount_a: amount_a_out, amount_b: amount_b_out } = BinUtils.calculateOutByShare(\n {\n bin_id: active_bin.bin_id,\n liquidity: d(active_bin.liquidity).add(delta_liquidity_share).toFixed(0),\n amount_a: d(active_bin.amount_a).add(used_bin.amount_a).toFixed(0),\n amount_b: d(active_bin.amount_b).add(used_bin.amount_b).toFixed(0),\n price_per_lamport: active_bin.price_per_lamport,\n },\n delta_liquidity_share\n )\n\n const base_fee = d(bin_step).mul(base_factor).mul(10)\n const variable_fee = FeeUtils.getVariableFee(variableParameters)\n\n let total_fee_rate = d(base_fee).add(variable_fee).toFixed(0)\n\n if (d(total_fee_rate).gt(MAX_FEE_RATE)) {\n total_fee_rate = MAX_FEE_RATE.toString()\n }\n\n let fees_a = '0'\n let fees_b = '0'\n\n if (d(amount_a_out).gt(used_bin.amount_a) && d(used_bin.amount_b).gt(amount_b_out)) {\n fees_b = FeeUtils.calculateCompositionFee(d(used_bin.amount_b).sub(amount_b_out).toFixed(0), total_fee_rate)\n } else if (d(amount_b_out).gt(used_bin.amount_b) && d(used_bin.amount_a).gt(amount_a_out)) {\n fees_a = FeeUtils.calculateCompositionFee(d(used_bin.amount_a).sub(amount_a_out).toFixed(0), total_fee_rate)\n }\n\n return {\n fees_a,\n fees_b,\n }\n }\n}\n","import { BASIS_POINT_MAX } from '../types/constants'\nimport { Axis, IlmInputOptions, IlmInputResult, TokenTable } from '../types/ilm'\nimport { BinUtils } from './binUtils'\n\nexport class IlmUtils {\n static calculateIlm(options: IlmInputOptions): IlmInputResult {\n const { curvature, initial_price, max_price, bin_step, total_supply, pool_share_percentage, config } = options\n const { price_curve_points_num, liquidity_distribution_num, tokens_table_num, price_table_num } = config\n if (pool_share_percentage < 0 || pool_share_percentage > 100) {\n throw new Error('Pool Share Percentage must be greater than 0 and less than 100.')\n }\n\n let flat = false\n\n if (max_price < initial_price) {\n throw new Error('Maximum Price must be greater or equal to Initial Price.')\n } else if (max_price === initial_price && curvature !== 0) {\n throw new Error('Curvature must be 0 when Maximum and Initial Price are equal.')\n } else if (max_price !== initial_price && curvature === 0) {\n throw new Error('Maximum and Initial Price must be equal when Curvature is 0.')\n } else if (max_price === initial_price && curvature === 0) {\n flat = true\n }\n\n const myFormula = (c: number) => {\n // f * Math.pow((c / A), k) + i;\n return price_diff * Math.pow(c / pool_supply, curvature) + initial_price\n }\n\n const integrate = (upper: number, lower: number) => {\n let u = (price_diff * Math.pow(pool_supply, -curvature) * Math.pow(upper, curvature + 1)) / (curvature + 1) + initial_price * upper\n let l = (price_diff * Math.pow(pool_supply, -curvature) * Math.pow(lower, curvature + 1)) / (curvature + 1) + initial_price * lower\n return u - l\n }\n\n const reverse_formula = (price: number) => {\n // A * Math.pow(((p- i) / f), 1 / k);\n return pool_supply * Math.pow((price - initial_price) / price_diff, 1 / curvature)\n }\n\n const liquidity = (price: number) => {\n // A * Math.pow((p - i), (1 / k) - 1) / (k * Math.pow(f, 1 / k));\n return (pool_supply * Math.pow(price - initial_price, 1 / curvature - 1)) / (curvature * Math.pow(price_diff, 1 / curvature))\n }\n\n const binTokens = (price: number) => {\n return Math.pow((price - initial_price) / price_diff, 1 / curvature) * pool_supply\n }\n\n const getBinIdFromLamportPrice = (pricePerLamport: number, binStep: number, min: boolean): number => {\n const binStepNum = binStep / BASIS_POINT_MAX\n const binId = Math.log(pricePerLamport) / Math.log(1 + binStepNum)\n return min ? Math.floor(binId) : Math.ceil(binId)\n }\n\n const getPricePerLamportFromBinId = (binId: number, binStep: number): number => {\n const binStepNum = binStep / BASIS_POINT_MAX\n return Math.pow(1 + binStepNum, binId)\n }\n\n const pool_supply = (total_supply * pool_share_percentage) / 100 // A\n const price_diff = max_price - initial_price // f\n\n const prices: number[] = []\n const heights: number[] = []\n\n let minBinId = getBinIdFromLamportPrice(initial_price, bin_step, false)\n let maxBinId = getBinIdFromLamportPrice(max_price, bin_step, false)\n let total = 0\n\n let binFlag = minBinId\n if (flat) {\n prices.push(initial_price)\n heights.push(initial_price * pool_supply)\n } else {\n while (binFlag <= maxBinId) {\n const price = getPricePerLamportFromBinId(binFlag, bin_step)\n const nextPrice = getPricePerLamportFromBinId(binFlag + 1, bin_step)\n const tokenDiff = binTokens(nextPrice) - binTokens(price)\n total = total + tokenDiff\n heights.push(tokenDiff * price)\n prices.push(price)\n binFlag++\n }\n }\n const result: IlmInputResult = {\n price_curve: {\n data: [],\n min_y: 0,\n max_y: 0,\n },\n liquidity_curve: {\n data: [],\n min_y: 0,\n max_y: 0,\n },\n dlmm_bins: {\n data: [],\n min_y: 0,\n max_y: 0,\n },\n tokens_table: [],\n price_table: [],\n initial_fdv: initial_price * total_supply,\n final_fdv: max_price * total_supply,\n usdc_in_pool: 0,\n }\n var LDstep = price_diff / 100\n\n // price curve\n const pricePoints: Axis[] = []\n let priceMin = 0\n let priceMax = 0\n for (let index = 0; index < price_curve_points_num; index++) {\n const x = (index * pool_supply) / (price_curve_points_num - 1)\n const y = flat ? max_price : myFormula(x)\n priceMin = priceMin < y ? priceMin : y\n priceMax = priceMax > y ? priceMax : y\n pricePoints.push({ x, y })\n }\n result.price_curve = {\n data: pricePoints,\n min_y: priceMin,\n max_y: priceMax,\n }\n\n // liquidity curve\n let liquidityPoints: Axis[] = []\n let liquidityMin = 0\n let liquidityMax = 0\n if (flat) {\n liquidityMin = 0\n liquidityMax = pool_supply\n liquidityPoints = [\n { x: initial_price, y: 0 },\n { x: initial_price, y: pool_supply / 2 },\n { x: initial_price, y: pool_supply },\n ]\n } else {\n for (let index = 0; index < liquidity_distribution_num; index++) {\n const x = initial_price + index * LDstep\n const y = liquidity(x)\n liquidityPoints.push({ x, y })\n liquidityMin = liquidityMin < y ? liquidityMin : y\n liquidityMax = liquidityMax > y ? liquidityMax : y\n }\n }\n result.liquidity_curve = {\n data: liquidityPoints,\n min_y: liquidityMin,\n max_y: liquidityMax,\n }\n\n // dlmm bins\n const dlmmBins: Axis[] = []\n let dlmmBinsMin = 0\n let dlmmBinsMax = 0\n prices.forEach((price, index) => {\n const x = price\n const y = heights[index]\n dlmmBins.push({ x, y })\n dlmmBinsMin = dlmmBinsMin < y ? dlmmBinsMin : y\n dlmmBinsMax = dlmmBinsMax > y ? dlmmBinsMax : y\n })\n result.dlmm_bins = {\n data: dlmmBins,\n min_y: dlmmBinsMin,\n max_y: dlmmBinsMax,\n }\n\n // Tokens Table\n const tokensTable: TokenTable[] = []\n let tokensWithdrawn = 0\n let step = pool_supply / tokens_table_num\n while (tokensWithdrawn <= pool_supply) {\n const price = myFormula(tokensWithdrawn)\n const n = tokensWithdrawn\n const amountUsd = integrate(n, 0)\n tokensTable.push({ withdrawn: n, price, usdc_in_pool: amountUsd })\n tokensWithdrawn = tokensWithdrawn + step\n }\n result.tokens_table = tokensTable\n\n // Price Table\n const step2 = Math.floor(price_diff * 10000000000) / 100000000000\n const priceTable: TokenTable[] = []\n if (flat) {\n priceTable.push({\n withdrawn: pool_supply,\n price: initial_price,\n usdc_in_pool: pool_supply * initial_price,\n })\n } else {\n let r = 0\n let price = initial_price\n while (r <= price_table_num) {\n const tokensWithdrawn = reverse_formula(price)\n const amountUsd = integrate(tokensWithdrawn, 0)\n priceTable.push({ withdrawn: tokensWithdrawn, price: price, usdc_in_pool: amountUsd })\n price = price + step2\n r = r + 1\n }\n }\n result.price_table = priceTable\n result.usdc_in_pool = priceTable[priceTable.length - 1].usdc_in_pool\n return result\n }\n}\n","import { FullRpcUrlTestnet, GraphRpcUrlTestnet } from '@cetusprotocol/common-sdk'\nimport type { SdkOptions } from '../sdk'\n\nexport const dlmmTestnet: SdkOptions = {\n env: 'testnet',\n full_rpc_url: FullRpcUrlTestnet,\n graph_rpc_url: GraphRpcUrlTestnet,\n dlmm_pool: {\n package_id: '0xb382224d12558da5f87624765065a8c7e8f5c899d0ee890610e2bb4e8c686be9',\n published_at: '0x1cdac9c678c5ec89c80409db8865c9c3f8e6207dfd988fb4ddd11e2806db0bf9',\n version: 1,\n config: {\n registry_id: '0xdc91c4f094557b9d2a35fc6159ef32649a54c4aa9350860bf0d4b52b5f0a3990',\n pools_id: '0xb518b1de84a1ba1ab6c9a2d71fcdf382ef36045a4660497b3d77fb0a6df7709e',\n global_config_id: '0xe84ebca8d61cdd9312cec3787204d0ee1063d424a81dcda62cfb8b1887041a9f',\n versioned_id: '0xf8478d6dc081bc266229f25ac9c31a96b5e99ecbd82222e883368dda95829065',\n admin_cap_id: '0x273dbda2a1d62460a01a07831aec0fa8191a41341d634fb43f15acdb627edbce',\n partners_id: '0xd7ac594ed2e7756f0d4a98503dd970f314f2619a10c3613c705253a155cc9fea',\n },\n },\n dlmm_router: {\n package_id: '0xbc76d04e910452518efd5fd63d5fffe77c24855063c9cdb5501e06896bc34908',\n published_at: '0xe122ffbcfe5091398ba15a60e654e6589fd586b3865d5b4118292754f8cde301',\n version: 1,\n },\n faucet: {\n package_id: '0x14a71d857b34677a7d57e0feb303df1adb515a37780645ab763d42ce8d1a5e48',\n published_at: '0x14a71d857b34677a7d57e0feb303df1adb515a37780645ab763d42ce8d1a5e48',\n version: 1,\n },\n}\n","import { asUintN, CLOCK_ADDRESS, CoinAssist, d, DETAILS_KEYS, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { Transaction, TransactionObjectArgument, TransactionResult } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { CetusDlmmSDK } from '../sdk'\nimport { BASIS_POINT, MAX_BIN_PER_POSITION } from '../types/constants'\nimport {\n AddLiquidityOption,\n BinAmount,\n BinLiquidityInfo,\n CalculateAddLiquidityAutoFillOption,\n CalculateAddLiquidityOption,\n CalculateRemoveLiquidityBothOption,\n CalculateRemoveLiquidityOnlyOption,\n ClosePositionOption,\n CollectFeeOption,\n CollectRewardAndFeeOption,\n CollectRewardOption,\n DlmmPosition,\n OpenAndAddLiquidityOption,\n OpenAndAddLiquidityWithPriceOption,\n PositionFee,\n PositionReward,\n RemoveLiquidityOption,\n StrategyType,\n UpdatePositionFeeAndRewardsOption,\n ValidateActiveIdSlippageOption,\n} from '../types/dlmm'\nimport {\n BinUtils,\n FeeUtils,\n getRouterModule,\n parsedDlmmPosFeeData,\n parsedDlmmPosRewardData,\n parseDlmmPosition,\n parseStrategyType,\n StrategyUtils,\n} from '../utils'\nimport Decimal from 'decimal.js'\n\nexport class PositionModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n buildPositionType(): string {\n const package_id = this._sdk.sdkOptions.dlmm_pool.package_id\n return `${package_id}::position::Position`\n }\n\n async getOwnerPositionList(owner: string): Promise<DlmmPosition[]> {\n const list: DlmmPosition[] = []\n try {\n const res = await this._sdk.FullClient.getOwnedObjectsByPage(owner, {\n options: { showType: true, showContent: true, showOwner: true },\n filter: {\n StructType: this.buildPositionType(),\n },\n })\n\n res.data.forEach((obj) => {\n list.push(parseDlmmPosition(obj))\n })\n } catch (error) {\n console.log('🚀 ~ PositionModule ~ getOwnerPositionList ~ error:', error)\n handleError(DlmmErrorCode.GetObjectError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getOwnerPositionList',\n [DETAILS_KEYS.REQUEST_PARAMS]: owner,\n })\n }\n\n return list\n }\n\n async getPosition(position_id: string): Promise<DlmmPosition> {\n try {\n const res = await this._sdk.FullClient.getObject({ id: position_id, options: { showType: true, showContent: true, showOwner: true } })\n return parseDlmmPosition(res)\n } catch (error) {\n console.log('🚀 ~ PositionModule ~ getPosition ~ error:', error)\n return handleError(DlmmErrorCode.GetObjectError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPosition',\n [DETAILS_KEYS.REQUEST_PARAMS]: position_id,\n })\n }\n }\n\n /**\n * Collect fee\n * @param option - The option for collecting fee\n * @param tx - The transaction object\n * @returns The transaction object\n */\n collectFeePayload(option: CollectFeeOption, tx?: Transaction): Transaction {\n const { pool_id, position_id, coin_type_a, coin_type_b } = option\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n const [fee_a_balance, fee_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::collect_position_fee`,\n arguments: [tx.object(pool_id), tx.object(position_id), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const fee_a_obj = CoinAssist.fromBalance(fee_a_balance, coin_type_a, tx)\n const fee_b_obj = CoinAssist.fromBalance(fee_b_balance, coin_type_b, tx)\n tx.transferObjects([fee_a_obj, fee_b_obj], this.sdk.getSenderAddress())\n\n return tx\n }\n\n /**\n * Update the fee and rewards of the position\n * @param option - The option for updating the fee and rewards of the position\n * @param tx - The transaction object\n * @returns The transaction object\n */\n updatePositionFeeAndRewards(option: UpdatePositionFeeAndRewardsOption, tx: Transaction) {\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id } = getPackagerConfigs(dlmm_pool)\n const { pool_id, position_id, coin_type_a, coin_type_b } = option\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::update_position_fee_and_rewards`,\n arguments: [tx.object(pool_id), tx.pure.id(position_id), tx.object(versioned_id), tx.object(CLOCK_ADDRESS)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return tx\n }\n\n /**\n * Collect reward\n * @param options - The option for collecting reward\n * @param tx - The transaction object\n * @returns The transaction object\n */\n collectRewardPayload(options: CollectRewardOption[], tx?: Transaction): Transaction {\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n options.forEach((option) => {\n const { pool_id, position_id, reward_coins, coin_type_a, coin_type_b } = option\n\n reward_coins.forEach((reward_coin) => {\n const reward_coin_balance = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::collect_position_reward`,\n arguments: [tx.object(pool_id), tx.object(position_id), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b, reward_coin],\n })\n\n const reward_coin_obj = CoinAssist.fromBalance(reward_coin_balance, reward_coin, tx)\n tx.transferObjects([reward_coin_obj], this.sdk.getSenderAddress())\n })\n })\n\n return tx\n }\n\n collectRewardAndFeePayload(options: CollectRewardAndFeeOption[], tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n\n options.forEach((option) => {\n const { pool_id, position_id, reward_coins, coin_type_a, coin_type_b } = option\n\n this.updatePositionFeeAndRewards({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n\n this.collectFeePayload({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n this.collectRewardPayload([{ pool_id, position_id, reward_coins, coin_type_a, coin_type_b }], tx)\n })\n\n return tx\n }\n\n /**\n * Validate the active id slippage\n * @param options - The option for validating the active id slippage\n * @param tx - The transaction object\n * @returns The transaction object\n */\n validateActiveIdSlippage(options: ValidateActiveIdSlippageOption, tx: Transaction): Transaction {\n const { pool_id, active_id, max_price_slippage, bin_step, coin_type_a, coin_type_b } = options\n const { dlmm_router } = this.sdk.sdkOptions\n\n const bin_shift = BinUtils.getBinShift(active_id, bin_step, max_price_slippage)\n const active_id_u32 = Number(asUintN(BigInt(active_id)))\n\n tx.moveCall({\n target: `${dlmm_router.published_at}::utils::validate_active_id_slippage`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n tx.pure.u32(Number(active_id_u32)),\n tx.pure.u32(Number(bin_shift)),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return tx\n }\n\n /**\n * Close a position\n * @param option - The option for closing a position\n * @returns The transaction object\n */\n closePositionPayload(option: ClosePositionOption, tx?: Transaction): Transaction {\n const { pool_id, position_id, reward_coins, coin_type_a, coin_type_b } = option\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n this.updatePositionFeeAndRewards({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n\n this.collectRewardPayload([{ pool_id, position_id, reward_coins, coin_type_a, coin_type_b }], tx)\n\n const [close_position_cert, coin_a_balance, coin_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::close_position`,\n arguments: [\n tx.object(pool_id),\n tx.object(position_id),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const coin_a_obj = CoinAssist.fromBalance(coin_a_balance, coin_type_a, tx)\n const coin_b_obj = CoinAssist.fromBalance(coin_b_balance, coin_type_b, tx)\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::destroy_close_position_cert`,\n arguments: [close_position_cert, tx.object(versioned_id)],\n typeArguments: [],\n })\n\n tx.transferObjects([coin_a_obj, coin_b_obj], this.sdk.getSenderAddress())\n\n return tx\n }\n\n /**\n * Get the amounts in the active bin if in range\n * @param bin_manager_handle - The bin manager handle\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @param active_id - The active id\n * @returns The amounts in the active bin if in range\n */\n async getActiveBinIfInRange(\n bin_manager_handle: string,\n lower_bin_id: number,\n upper_bin_id: number,\n active_id: number,\n bin_step: number,\n force_refresh = false\n ): Promise<BinAmount | undefined> {\n if (active_id <= upper_bin_id && active_id >= lower_bin_id) {\n const bin_info = await this._sdk.Pool.getBinInfo(bin_manager_handle, active_id, bin_step, force_refresh)\n return bin_info\n }\n return undefined\n }\n\n /**\n * Calculate the result of removing liquidity\n * @param option - The option for calculating the result of removing liquidity\n * @returns The result of removing liquidity\n */\n calculateRemoveLiquidityInfo(option: CalculateRemoveLiquidityBothOption | CalculateRemoveLiquidityOnlyOption): BinLiquidityInfo {\n const { bins, active_id, coin_amount } = option\n const isBothSide = 'fix_amount_a' in option\n\n const bins_b = bins.filter((bin) => bin.bin_id < active_id)\n const bins_a = bins.filter((bin) => bin.bin_id > active_id)\n\n let total_amount = d(0)\n let amount_rate = d(0)\n let used_bins: BinAmount[] = []\n\n if (isBothSide) {\n used_bins = [...bins]\n const { fix_amount_a } = option\n const active_bin = bins.find((bin) => bin.bin_id === active_id)\n const total_amount_a = bins_a.reduce((acc, bin) => d(acc).plus(bin.amount_a), d(0)).add(active_bin?.amount_a || '0')\n const total_amount_b = bins_b.reduce((acc, bin) => d(acc).plus(bin.amount_b), d(0)).add(active_bin?.amount_b || '0')\n total_amount = fix_amount_a ? total_amount_a : total_amount_b\n\n amount_rate = d(coin_amount).gte(total_amount) ? d(1) : d(coin_amount).div(total_amount)\n } else {\n const { is_only_a } = option\n used_bins = is_only_a ? bins_a : bins_b\n total_amount = used_bins.reduce((acc, bin) => d(acc).plus(is_only_a ? bin.amount_a : bin.amount_b), d(0))\n\n amount_rate = d(coin_amount).gte(total_amount) ? d(1) : d(coin_amount).div(total_amount)\n }\n\n if (d(total_amount).isZero()) {\n return handleError(DlmmErrorCode.InsufficientLiquidity, new Error('Insufficient liquidity'), {\n [DETAILS_KEYS.METHOD_NAME]: 'calculateRemoveLiquidityResult',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const info = BinUtils.processBinsByRate([...used_bins], amount_rate.toFixed())\n // If the proportional allocation results in an invalid amount, iterate through the bins and remove them one by one\n if (info.has_invalid_amount) {\n let remaining_amount = d(coin_amount)\n const processed_bins: BinAmount[] = []\n const is_amount_a = isBothSide ? option.fix_amount_a : option.is_only_a\n for (const bin of used_bins) {\n if (remaining_amount.lte(0)) break\n\n const bin_amount = is_amount_a ? bin.amount_a : bin.amount_b\n const bin_amount_other = is_amount_a ? bin.amount_b : bin.amount_a\n\n let rate = d(d(remaining_amount).div(bin_amount).toFixed(9, Decimal.ROUND_UP))\n rate = rate.gt(1) ? d(1) : rate\n let amount_to_remove = d(bin_amount).mul(rate)\n remaining_amount = remaining_amount.minus(amount_to_remove)\n\n const amount_to_remove_other = d(bin_amount_other).mul(rate)\n const liquidity_to_remove = d(bin.liquidity!).mul(rate)\n\n processed_bins.push({\n ...bin,\n amount_a: is_amount_a ? amount_to_remove.toFixed(0) : amount_to_remove_other.toFixed(0),\n amount_b: is_amount_a ? amount_to_remove_other.toFixed(0) : amount_to_remove.toFixed(0),\n liquidity: liquidity_to_remove.toFixed(0),\n })\n }\n\n return {\n bins: processed_bins,\n amount_a: processed_bins.reduce((acc, bin) => d(acc).plus(bin.amount_a), d(0)).toFixed(0),\n amount_b: processed_bins.reduce((acc, bin) => d(acc).plus(bin.amount_b), d(0)).toFixed(0),\n }\n }\n\n return info.bins\n }\n\n /**\n * Calculate the result of adding liquidity\n * @param option - The option for calculating the result of adding liquidity\n * @returns The result of adding liquidity\n */\n async calculateAddLiquidityInfo(option: CalculateAddLiquidityOption | CalculateAddLiquidityAutoFillOption): Promise<BinLiquidityInfo> {\n const isAutoFill = 'fix_amount_a' in option\n const { active_id, bin_step, lower_bin_id, upper_bin_id, active_bin_of_pool, strategy_type, pool_id } = option\n\n let bin_infos\n if (isAutoFill) {\n const { coin_amount, fix_amount_a } = option\n bin_infos = StrategyUtils.autoFillCoinByStrategyV2(\n active_id,\n bin_step,\n coin_amount,\n fix_amount_a,\n lower_bin_id,\n upper_bin_id,\n strategy_type,\n active_bin_of_pool\n )\n } else {\n bin_infos = StrategyUtils.toAmountsBothSideByStrategy(\n active_id,\n bin_step,\n lower_bin_id,\n upper_bin_id,\n option.amount_a,\n option.amount_b,\n strategy_type,\n active_bin_of_pool\n )\n }\n if (active_bin_of_pool && pool_id) {\n const active_bin_index = bin_infos.bins.findIndex((bin) => bin.bin_id === active_id)\n if (active_bin_index !== -1) {\n const pool = await this._sdk.Pool.getPool(pool_id, false)\n if (pool) {\n const { fees_a, fees_b } = FeeUtils.getCompositionFees(\n active_bin_of_pool,\n bin_infos.bins[active_bin_index],\n pool.variable_parameters\n )\n const active_bin = bin_infos.bins[active_bin_index]\n active_bin.amount_a = d(active_bin.amount_a).sub(fees_a).toFixed(0)\n active_bin.amount_b = d(active_bin.amount_b).sub(fees_b).toFixed(0)\n bin_infos.bins[active_bin_index] = active_bin\n console.log('🚀 ~ PositionModule ~ calculateAddLiquidityInfo ~ fees_a:', fees_a)\n console.log('🚀 ~ PositionModule ~ calculateAddLiquidityInfo ~ fees_b:', fees_b)\n }\n }\n }\n\n return bin_infos\n }\n\n /**\n * Remove liquidity\n * @param option - The option for removing liquidity\n * @returns The transaction\n */\n removeLiquidityPayload(option: RemoveLiquidityOption): Transaction {\n const {\n pool_id,\n position_id,\n bin_infos,\n reward_coins,\n slippage,\n coin_type_a,\n coin_type_b,\n active_id,\n collect_fee,\n bin_step,\n remove_percent,\n } = option\n const { dlmm_pool } = this.sdk.sdkOptions\n const { bins } = bin_infos\n const tx = new Transaction()\n\n if (collect_fee || reward_coins.length > 0) {\n this.updatePositionFeeAndRewards({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n }\n if (collect_fee) {\n this.collectFeePayload({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n }\n\n this.collectRewardPayload([{ pool_id, position_id, reward_coins, coin_type_a, coin_type_b }], tx)\n\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n if (remove_percent) {\n const min_bin_id_u32 = asUintN(BigInt(bins[0].bin_id))\n const max_bin_id_u32 = asUintN(BigInt(bins[bins.length - 1].bin_id))\n const remove_percent_fixed = Number(d(remove_percent).mul(BASIS_POINT).toFixed(0))\n const [coin_a_balance, coin_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::remove_liquidity_by_percent`,\n arguments: [\n tx.object(pool_id),\n tx.object(position_id),\n tx.pure.u32(Number(min_bin_id_u32)),\n tx.pure.u32(Number(max_bin_id_u32)),\n tx.pure.u16(remove_percent_fixed),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n const coin_a_obj = CoinAssist.fromBalance(coin_a_balance, coin_type_a, tx)\n const coin_b_obj = CoinAssist.fromBalance(coin_b_balance, coin_type_b, tx)\n tx.transferObjects([coin_a_obj, coin_b_obj], this.sdk.getSenderAddress())\n } else {\n const bin_amounts = tx.pure.vector(\n 'u32',\n bins.map((bin) => Number(asUintN(BigInt(bin.bin_id))))\n )\n const remove_liquiditys = tx.pure.vector(\n 'u128',\n bins.map((bin) => bin.liquidity!)\n )\n\n const [coin_a_balance, coin_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::remove_liquidity`,\n arguments: [\n tx.object(pool_id),\n tx.object(position_id),\n bin_amounts,\n remove_liquiditys,\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n const coin_a_obj = CoinAssist.fromBalance(coin_a_balance, coin_type_a, tx)\n const coin_b_obj = CoinAssist.fromBalance(coin_b_balance, coin_type_b, tx)\n tx.transferObjects([coin_a_obj, coin_b_obj], this.sdk.getSenderAddress())\n }\n\n // validate the active id slippage\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage: slippage, bin_step, coin_type_a, coin_type_b }, tx)\n\n return tx\n }\n\n /**\n * Add liquidity with price\n * @param option - The option for adding liquidity with price\n * @returns The transaction\n */\n async addLiquidityWithPricePayload(option: OpenAndAddLiquidityWithPriceOption): Promise<Transaction> {\n const {\n pool_id,\n bin_infos,\n coin_type_a,\n coin_type_b,\n price_base_coin,\n price,\n lower_price,\n upper_price,\n bin_step,\n strategy_type,\n active_bin_of_pool,\n decimals_a,\n decimals_b,\n use_bin_infos,\n max_price_slippage,\n } = option\n let lower_bin_id\n let upper_bin_id\n let active_id\n let new_bin_infos: BinLiquidityInfo = bin_infos\n\n const is_coin_a_base = price_base_coin === 'coin_a'\n\n if (is_coin_a_base) {\n lower_bin_id = BinUtils.getBinIdFromPrice(lower_price, bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(upper_price, bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(price, bin_step, true, decimals_a, decimals_b)\n } else {\n lower_bin_id = BinUtils.getBinIdFromPrice(d(1).div(upper_price).toString(), bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(d(1).div(lower_price).toString(), bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(d(1).div(price).toString(), bin_step, false, decimals_a, decimals_b)\n\n const calculateOption: CalculateAddLiquidityOption = {\n amount_a: bin_infos.amount_b,\n amount_b: bin_infos.amount_a,\n active_id,\n bin_step,\n lower_bin_id,\n upper_bin_id,\n active_bin_of_pool,\n strategy_type: strategy_type,\n }\n\n new_bin_infos = await this.sdk.Position.calculateAddLiquidityInfo(calculateOption)\n }\n\n const openAndAddLiquidityOption: OpenAndAddLiquidityOption = {\n pool_id,\n active_id,\n bin_infos: new_bin_infos,\n coin_type_a,\n coin_type_b,\n lower_bin_id,\n upper_bin_id,\n strategy_type,\n use_bin_infos,\n max_price_slippage,\n bin_step,\n }\n\n return this.addLiquidityPayload(openAndAddLiquidityOption)\n }\n\n /**\n * Add liquidity\n * @param option - The option for adding liquidity\n * @returns The transaction object\n */\n addLiquidityPayload(option: AddLiquidityOption | OpenAndAddLiquidityOption, tx?: Transaction): Transaction {\n const {\n pool_id,\n bin_infos,\n coin_type_a,\n coin_type_b,\n active_id,\n strategy_type,\n max_price_slippage,\n bin_step,\n use_bin_infos = false,\n } = option\n tx = tx || new Transaction()\n\n const isOpenPosition = 'lower_bin_id' in option\n\n const liquidity_bins: BinLiquidityInfo[] = []\n\n if (isOpenPosition) {\n const position_bins = BinUtils.splitBinLiquidityInfo(bin_infos, option.lower_bin_id, option.upper_bin_id)\n liquidity_bins.push(...position_bins)\n } else {\n const position_id = option.position_id\n liquidity_bins.push(bin_infos)\n\n if (option.collect_fee || option.reward_coins.length > 0) {\n this.updatePositionFeeAndRewards({ pool_id: pool_id as string, position_id, coin_type_a, coin_type_b }, tx)\n }\n\n if (option.collect_fee) {\n this.collectFeePayload({ pool_id: pool_id as string, position_id, coin_type_a, coin_type_b }, tx)\n }\n\n if (option.reward_coins.length > 0) {\n this.collectRewardPayload(\n [{ pool_id: pool_id as string, position_id, reward_coins: option.reward_coins, coin_type_a, coin_type_b }],\n tx\n )\n }\n }\n\n liquidity_bins.forEach((liquidity_bin, index) => {\n console.log('🚀 ~ PositionModule ~ addLiquidityPayload ~ liquidity_bin:', index, liquidity_bin)\n const { amount_a, amount_b, bins } = liquidity_bin\n\n const coin_a_obj_id = CoinAssist.buildCoinWithBalance(BigInt(amount_a), coin_type_a, tx)\n const coin_b_obj_id = CoinAssist.buildCoinWithBalance(BigInt(amount_b), coin_type_b, tx)\n\n if (use_bin_infos) {\n this.addLiquidityInternal({\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n coin_a_obj_id,\n coin_b_obj_id,\n position_id: isOpenPosition ? undefined : option.position_id,\n max_price_slippage,\n bin_step,\n })\n } else {\n this.addLiquidityStrategyInternal({\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n max_price_slippage,\n bin_step,\n coin_a_obj_id,\n coin_b_obj_id,\n strategy_type,\n position_id: isOpenPosition ? undefined : option.position_id,\n })\n }\n })\n\n return tx\n }\n\n private addLiquidityStrategyInternal(option: {\n pool_id: string | TransactionObjectArgument\n coin_type_a: string\n coin_type_b: string\n active_id: number\n liquidity_bin: BinLiquidityInfo\n tx: Transaction\n coin_a_obj_id: TransactionObjectArgument\n coin_b_obj_id: TransactionObjectArgument\n position_id?: string\n strategy_type: StrategyType\n max_price_slippage: number\n bin_step: number\n }): Transaction {\n const {\n max_price_slippage,\n bin_step,\n position_id,\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n coin_a_obj_id,\n coin_b_obj_id,\n strategy_type,\n } = option\n\n const { dlmm_pool, dlmm_router } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n const { bins, amount_a, amount_b } = liquidity_bin\n\n let position: string | undefined | TransactionObjectArgument = position_id\n\n const lower_bin_id = bins[0].bin_id\n const upper_bin_id = bins[bins.length - 1].bin_id\n const lower_bin_id_u32 = asUintN(BigInt(lower_bin_id))\n\n const active_id_u32 = Number(asUintN(BigInt(active_id)))\n const bin_shift = BinUtils.getBinShift(active_id, bin_step, max_price_slippage)\n const routerModule = getRouterModule(strategy_type)\n\n if (position_id === undefined) {\n const width = upper_bin_id - lower_bin_id + 1\n if (width > MAX_BIN_PER_POSITION) {\n handleError(DlmmErrorCode.InvalidBinWidth, new Error('Width is too large'), {\n [DETAILS_KEYS.METHOD_NAME]: 'openPosition',\n })\n }\n\n position = tx.moveCall({\n target: `${dlmm_router.published_at}::${routerModule}::open_position`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n coin_a_obj_id,\n coin_b_obj_id,\n tx.pure.u64(amount_a),\n tx.pure.u64(amount_b),\n tx.pure.u32(Number(lower_bin_id_u32)),\n tx.pure.u16(Number(width)),\n tx.pure.u32(Number(active_id_u32)),\n tx.pure.u32(Number(bin_shift)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n } else {\n const valid_bins = bins.filter((bin) => bin.amount_a !== '0' || bin.amount_b !== '0')\n if (valid_bins.length === 0) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('No bins to add liquidity'), {\n [DETAILS_KEYS.METHOD_NAME]: 'addLiquidityStrategyInternal',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n const valid_lower_bin_id_u32 = asUintN(BigInt(valid_bins[0].bin_id))\n const valid_upper_bin_id_u32 = asUintN(BigInt(valid_bins[valid_bins.length - 1].bin_id))\n\n tx.moveCall({\n target: `${dlmm_router.published_at}::${routerModule}::add_liquidity`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n tx.object(position_id!),\n coin_a_obj_id,\n coin_b_obj_id,\n tx.pure.u64(amount_a),\n tx.pure.u64(amount_b),\n tx.pure.u32(Number(valid_lower_bin_id_u32)),\n tx.pure.u32(Number(valid_upper_bin_id_u32)),\n tx.pure.u32(Number(active_id_u32)),\n tx.pure.u32(Number(bin_shift)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n }\n\n if (position) {\n tx.transferObjects([position, coin_a_obj_id, coin_b_obj_id], this.sdk.getSenderAddress())\n } else {\n tx.transferObjects([coin_a_obj_id, coin_b_obj_id], this.sdk.getSenderAddress())\n }\n\n return tx\n }\n\n private addLiquidityInternal(option: {\n pool_id: string | TransactionObjectArgument\n coin_type_a: string\n coin_type_b: string\n active_id: number\n liquidity_bin: BinLiquidityInfo\n tx: Transaction\n coin_a_obj_id: TransactionObjectArgument\n coin_b_obj_id: TransactionObjectArgument\n position_id?: string\n max_price_slippage: number\n bin_step: number\n }): Transaction {\n const {\n position_id,\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n coin_a_obj_id,\n coin_b_obj_id,\n max_price_slippage,\n bin_step,\n } = option\n const { bins } = liquidity_bin\n\n const { dlmm_pool, dlmm_router } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n const amounts_a = tx.pure.vector(\n 'u64',\n bins.map((bin) => bin.amount_a)\n )\n const amounts_b = tx.pure.vector(\n 'u64',\n bins.map((bin) => bin.amount_b)\n )\n\n const bin_ids = tx.makeMoveVec({\n elements: bins.map((bin) => tx.pure.u32(Number(asUintN(BigInt(bin.bin_id))))),\n type: 'u32',\n })\n const lower_bin_id = liquidity_bin.bins[0].bin_id\n const upper_bin_id = liquidity_bin.bins[liquidity_bin.bins.length - 1].bin_id\n if (position_id === undefined) {\n const width = upper_bin_id - lower_bin_id + 1\n if (width > MAX_BIN_PER_POSITION) {\n handleError(DlmmErrorCode.InvalidBinWidth, new Error('Width is too large'), {\n [DETAILS_KEYS.METHOD_NAME]: 'openPosition',\n })\n }\n const open_position_id = tx.moveCall({\n target: `${dlmm_router.published_at}::add_liquidity::open_position`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n coin_a_obj_id,\n coin_b_obj_id,\n bin_ids,\n amounts_a,\n amounts_b,\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n // validate the active id slippage\n if (active_id >= lower_bin_id && active_id <= upper_bin_id) {\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage, bin_step, coin_type_a, coin_type_b }, tx)\n }\n tx.transferObjects([coin_a_obj_id, coin_b_obj_id, open_position_id], this.sdk.getSenderAddress())\n } else {\n tx.moveCall({\n target: `${dlmm_router.published_at}::add_liquidity::add_liquidity`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n tx.object(position_id!),\n coin_a_obj_id,\n coin_b_obj_id,\n bin_ids,\n amounts_a,\n amounts_b,\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n // validate the active id slippage\n if (active_id >= lower_bin_id && active_id <= upper_bin_id) {\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage, bin_step, coin_type_a, coin_type_b }, tx)\n }\n tx.transferObjects([coin_a_obj_id, coin_b_obj_id], this.sdk.getSenderAddress())\n }\n\n return tx\n }\n\n /**\n * Fetch the fee and reward of the position\n * @param options - The option for fetching the fee and reward of the position\n * @returns The fee and reward of the position\n */\n async fetchPositionFeeAndReward(\n options: CollectRewardAndFeeOption[]\n ): Promise<{ feeData: Record<string, PositionFee>; rewardData: Record<string, PositionReward> }> {\n const tx = new Transaction()\n this.collectRewardAndFeePayload(options, tx)\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n return handleError(DlmmErrorCode.FetchError, new Error(simulateRes.error), {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchPositionFeeAndReward',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n options,\n totalOptions: options.length,\n },\n })\n }\n\n const feeData = parsedDlmmPosFeeData(simulateRes)\n const rewardData = parsedDlmmPosRewardData(simulateRes)\n\n return {\n feeData,\n rewardData,\n }\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { CLOCK_ADDRESS, CoinAssist, d, DETAILS_KEYS, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { CetusDlmmSDK } from '../sdk'\nimport { PreSwapOption, PreSwapQuote, SwapOption } from '../types/dlmm'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { parsedSwapQuoteData } from '../utils/parseData'\n\nexport class SwapModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async preSwapQuote(option: PreSwapOption): Promise<PreSwapQuote> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pool_id, coin_type_a, coin_type_b, a2b, by_amount_in, in_amount } = option\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n const tx = new Transaction()\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::flash_swap`,\n arguments: [\n tx.object(pool_id),\n tx.pure.bool(a2b),\n tx.pure.bool(by_amount_in),\n tx.pure.u64(in_amount),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n return handleError(DlmmErrorCode.FetchError, new Error(simulateRes.error), {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchSwapQuote',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const quoteInfo = parsedSwapQuoteData(simulateRes, a2b)\n if (quoteInfo == null) {\n return handleError(DlmmErrorCode.FetchError, new Error('No quote info'), {\n [DETAILS_KEYS.METHOD_NAME]: 'preSwapQuote',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n quoteInfo.a2b = a2b\n return quoteInfo\n }\n\n swapPayload(option: SwapOption): Transaction {\n const { dlmm_pool, dlmm_router } = this._sdk.sdkOptions\n const { quote_obj, coin_type_a, coin_type_b, by_amount_in, slippage, partner } = option\n const { pool_id, in_amount, out_amount, a2b } = quote_obj\n\n const tx = new Transaction()\n\n const in_amount_limit = by_amount_in\n ? in_amount\n : d(in_amount)\n .mul(1 + slippage)\n .toFixed(0)\n\n const out_amount_limit = by_amount_in\n ? d(out_amount)\n .mul(1 - slippage)\n .toFixed(0)\n : out_amount\n\n const in_coin = CoinAssist.buildCoinWithBalance(BigInt(in_amount_limit), a2b ? coin_type_a : coin_type_b, tx)\n\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n console.log('🚀 ~ SwapModule ~ option:', {\n ...option,\n in_amount_limit,\n out_amount_limit,\n })\n\n if (partner) {\n tx.moveCall({\n target: `${dlmm_router.published_at}::swap::${a2b ? 'swap_a2b_with_partner' : 'swap_b2a_with_partner'}`,\n arguments: [\n tx.object(pool_id),\n tx.object(partner),\n in_coin,\n tx.pure.bool(by_amount_in),\n tx.pure.u64(BigInt(by_amount_in ? in_amount : out_amount)),\n tx.pure.u64(BigInt(by_amount_in ? out_amount_limit : in_amount_limit)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n } else {\n tx.moveCall({\n target: `${dlmm_router.published_at}::swap::${a2b ? 'swap_a2b' : 'swap_b2a'}`,\n arguments: [\n tx.object(pool_id),\n in_coin,\n tx.pure.bool(by_amount_in),\n tx.pure.u64(BigInt(by_amount_in ? in_amount : out_amount)),\n tx.pure.u64(BigInt(by_amount_in ? out_amount_limit : in_amount_limit)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n }\n\n tx.transferObjects([in_coin], this.sdk.getSenderAddress())\n\n return tx\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { CLOCK_ADDRESS, d, DETAILS_KEYS, fixCoinType, getObjectFields, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { parsePartner } from '../utils'\nimport { CetusDlmmSDK } from '../sdk'\nimport { ClaimRefFeeOption, CreatePartnerOption, Partner, UpdateRefFeeRateOption, UpdateTimeRangeOption } from '../types/dlmm'\nimport { BASIS_POINT } from '../types/constants'\n\nexport class PartnerModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get a list of partners.\n * @returns {Promise<Partner[]>} A promise that resolves to an array of Partner objects.\n */\n async getPartnerList(): Promise<Partner[]> {\n const allPartner: Partner[] = []\n const { dlmm_pool } = this._sdk.sdkOptions\n const { partners_id } = getPackagerConfigs(dlmm_pool)\n try {\n const res = await this._sdk.FullClient.getObject({ id: partners_id, options: { showContent: true } })\n const fields = getObjectFields(res)\n const warpIds = fields.partners.fields.contents.map((item: any) => {\n return item.fields.value\n })\n\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n showType: true,\n })\n res.forEach((item) => {\n const partner = parsePartner(item)\n allPartner.push(partner)\n })\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerList',\n [DETAILS_KEYS.REQUEST_PARAMS]: partners_id,\n })\n }\n\n return allPartner\n }\n\n /**\n * Get the partner cap ID for a given owner and partner ID.\n * @param owner - The owner of the partner.\n * @param partner_id - The ID of the partner.\n * @returns A promise that resolves to the partner cap ID or undefined if not found.\n */\n async getPartnerCapId(owner: string, partner_id: string): Promise<string> {\n const { dlmm_pool } = this._sdk.sdkOptions\n try {\n const cacheKey = `partner_cap_id_${owner}_${partner_id}`\n const cached = this._sdk.getCache<string>(cacheKey)\n if (cached) {\n return cached\n }\n const res = await this._sdk.FullClient.getOwnedObjects({\n owner,\n options: {\n showContent: true,\n showType: true,\n },\n filter: {\n StructType: `${dlmm_pool.package_id}::partner::PartnerCap`,\n },\n })\n let partnerCapId = undefined\n res.data.forEach((item) => {\n const fields = getObjectFields(item)\n if (fields.partner_id === partner_id) {\n partnerCapId = fields.id.id\n this._sdk.updateCache(cacheKey, partnerCapId)\n }\n })\n if (!partnerCapId) {\n return handleError(DlmmErrorCode.NotFound, new Error('Partner cap not found'), {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerCapId',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n owner,\n partner_id,\n },\n })\n }\n return partnerCapId\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerCapId',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n owner,\n partner_id,\n },\n })\n }\n }\n\n /**\n * Get the balance of a partner\n * @param partner_balance_handle - The handle of the partner balance\n * @returns A promise that resolves to an array of { coin_type: string; balance: string } objects.\n */\n async getPartnerBalance(partner_balance_handle: string) {\n try {\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(partner_balance_handle)\n\n const balanceList: { coin_type: string; balance: string }[] = []\n\n const warpIds = res.data.map((item) => item.objectId)\n\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n showType: true,\n })\n res.forEach((item) => {\n const fields = getObjectFields(item)\n console.log(fields)\n balanceList.push({\n coin_type: fixCoinType(fields.name, false),\n balance: fields.value,\n })\n })\n }\n return balanceList\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerBalance',\n [DETAILS_KEYS.REQUEST_PARAMS]: partner_balance_handle,\n })\n }\n }\n\n /**\n * Get a partner by its object ID.\n * @param {string} partner_id The object ID of the partner to get.\n * @returns {Promise<Partner>} A promise that resolves to a Partner object.\n */\n async getPartner(partner_id: string): Promise<Partner> {\n try {\n const res = await this._sdk.FullClient.getObject({ id: partner_id, options: { showContent: true } })\n const partner = parsePartner(res)\n return partner\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartner',\n [DETAILS_KEYS.REQUEST_PARAMS]: partner_id,\n })\n }\n }\n\n /**\n * Update the ref fee rate of a partner\n * @param option - The option for updating the ref fee rate\n * @returns The transaction for updating the ref fee rate\n */\n updateRefFeeRatePayload(option: UpdateRefFeeRateOption, tx?: Transaction): Transaction {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { partner_id, ref_fee_rate } = option\n\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n const ref_fee_rate_raw = d(ref_fee_rate).mul(BASIS_POINT)\n if (ref_fee_rate_raw.gt(BASIS_POINT)) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('ref_fee_rate is cannot be greater than 1'), {\n [DETAILS_KEYS.METHOD_NAME]: 'updateRefFeeRatePayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::update_ref_fee_rate`,\n arguments: [tx.object(partner_id), tx.pure.u64(ref_fee_rate_raw.toNumber()), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [],\n })\n\n return tx\n }\n\n /**\n * Create a claim ref fee payload\n * @param option - The option for claiming ref fee\n * @returns The transaction for claiming ref fee\n */\n async claimRefFeePayload(option: ClaimRefFeeOption) {\n const { partner_id, partner_cap_id, fee_coin_types } = option\n const { dlmm_pool } = this._sdk.sdkOptions\n const { versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const tx = new Transaction()\n\n let partnerCapId = partner_cap_id\n if (!partnerCapId) {\n partnerCapId = await this.getPartnerCapId(this._sdk.getSenderAddress(), partner_id)\n }\n\n fee_coin_types.forEach((coin_type) => {\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::claim_ref_fee`,\n arguments: [tx.object(partner_id), tx.object(partnerCapId), tx.object(versioned_id)],\n typeArguments: [coin_type],\n })\n })\n\n return tx\n }\n\n updateTimeRangePayload(option: UpdateTimeRangeOption, tx?: Transaction): Transaction {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { partner_id, start_time, end_time } = option\n\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n const startTimeInSeconds = start_time > 1e12 ? Math.floor(start_time / 1000) : start_time\n const endTimeInSeconds = end_time > 1e12 ? Math.floor(end_time / 1000) : end_time\n\n if (endTimeInSeconds <= startTimeInSeconds) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('end_time must be greater than start_time'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPartnerPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::update_time_range`,\n arguments: [\n tx.object(partner_id),\n tx.pure.u64(startTimeInSeconds),\n tx.pure.u64(endTimeInSeconds),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [],\n })\n\n return tx\n }\n\n /**\n * Create a partner\n * @param option - The option for creating a partner\n * @returns The transaction for creating a partner\n */\n createPartnerPayload(option: CreatePartnerOption): Transaction {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { name, ref_fee_rate, start_time, end_time, recipient } = option\n\n const { partners_id, global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const tx = new Transaction()\n\n const ref_fee_rate_raw = d(ref_fee_rate).mul(BASIS_POINT)\n if (ref_fee_rate_raw.gt(BASIS_POINT)) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('ref_fee_rate is cannot be greater than 1'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPartnerPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const startTimeInSeconds = start_time > 1e12 ? Math.floor(start_time / 1000) : start_time\n const endTimeInSeconds = end_time > 1e12 ? Math.floor(end_time / 1000) : end_time\n\n if (endTimeInSeconds <= startTimeInSeconds) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('end_time must be greater than start_time'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPartnerPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::create_partner`,\n arguments: [\n tx.object(partners_id),\n tx.pure.string(name),\n tx.pure.u64(ref_fee_rate_raw.toNumber()),\n tx.pure.u64(startTimeInSeconds),\n tx.pure.u64(endTimeInSeconds),\n tx.pure.address(recipient),\n tx.object(global_config_id),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n\n return tx\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport {\n asIntN,\n asUintN,\n CLOCK_ADDRESS,\n CoinAssist,\n d,\n getObjectFields,\n getPackagerConfigs,\n IModule,\n MathUtil,\n} from '@cetusprotocol/common-sdk'\nimport { CetusDlmmSDK } from '../sdk'\nimport { AddRewardOption, InitRewardOption, RewardAccessOption, RewardPeriodEmission, RewardWhiteListOption } from '../types/dlmm'\nimport BN from 'bn.js'\n\nexport class RewardModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async getRewardPeriodEmission(\n period_emission_handle: string,\n curr_emission_per_second: string,\n last_updated_time: number\n ): Promise<RewardPeriodEmission[]> {\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(period_emission_handle)\n const result: RewardPeriodEmission[] = []\n const warpIds = res.data.map((item) => item.objectId)\n if (warpIds.length > 0) {\n const warRes = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n })\n\n warRes.forEach((item) => {\n const fields = getObjectFields(item)\n const emission_rate = MathUtil.u128ToI128(new BN(fields.value.fields.value.fields.bits)).toString()\n const time = fields.name\n const visualizedTime = new Date(Number(time) * 1000).toLocaleString()\n const emissions_per = MathUtil.fromX64(new BN(emission_rate)).toString()\n const rewardPeriodEmission: RewardPeriodEmission = {\n emissions_per_second: '0',\n emissions_per_day: '0',\n emissions_per,\n time,\n visualized_time: visualizedTime,\n }\n result.push(rewardPeriodEmission)\n })\n }\n const sortedList = result.sort((a, b) => Number(a.time) - Number(b.time))\n const newNodeList: RewardPeriodEmission[] = []\n\n newNodeList.push({\n emissions_per_second: curr_emission_per_second,\n emissions_per_day: d(curr_emission_per_second)\n .mul(60 * 60 * 24)\n .toString(),\n emissions_per: '0',\n time: last_updated_time.toString(),\n visualized_time: new Date(last_updated_time * 1000).toLocaleString(),\n })\n\n let last_emission_rate = curr_emission_per_second\n for (let i = 0; i < sortedList.length; i++) {\n const item = sortedList[i]\n if (d(item.time).lte(last_updated_time)) {\n continue\n }\n last_emission_rate = d(last_emission_rate).add(d(item.emissions_per)).toString()\n const emissions_per_day = d(last_emission_rate)\n .mul(60 * 60 * 24)\n .toString()\n if (d(last_emission_rate).lt(0)) {\n item.emissions_per_second = '0'\n item.emissions_per_day = '0'\n } else {\n item.emissions_per_second = last_emission_rate\n item.emissions_per_day = emissions_per_day\n }\n newNodeList.push(item)\n }\n\n return newNodeList\n }\n\n /**\n * Add reward to a pool\n * @param options - The options for adding reward\n * @returns The transaction for adding reward\n */\n addRewardPayload(option: AddRewardOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { pool_id, reward_coin_type, reward_amount, start_time_seconds, end_time_seconds, coin_type_a, coin_type_b } = option\n const reward_coin = CoinAssist.buildCoinWithBalance(BigInt(reward_amount), reward_coin_type, tx)\n\n // const start_time_vec = tx.makeMoveVec({\n // elements: start_time_seconds ? [tx.pure.u64(start_time_seconds)] : [],\n // type: 'u64',\n // })\n tx.pure.option('u64', start_time_seconds)\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::add_reward`,\n arguments: [\n tx.object(pool_id),\n reward_coin,\n tx.pure.option('u64', start_time_seconds),\n tx.pure.u64(end_time_seconds),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b, reward_coin_type],\n })\n\n return tx\n }\n\n /**\n * Initialize reward for a pool\n * @param option - The option for initializing reward\n * @param tx - The transaction to add the reward to\n * @returns The transaction for initializing reward\n */\n initRewardPayload(option: InitRewardOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { pool_id, reward_coin_types, coin_type_a, coin_type_b } = option\n\n reward_coin_types.forEach((reward_coin_type) => {\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::initialize_reward`,\n arguments: [tx.object(pool_id), tx.object(global_config_id), tx.object(versioned_id), tx.object(CLOCK_ADDRESS)],\n typeArguments: [coin_type_a, coin_type_b, reward_coin_type],\n })\n })\n\n return tx\n }\n\n /**\n * Build the payload for making reward public or private\n * @param option - The option for making reward public or private\n * @param tx - The transaction to make the reward public or private\n * @returns The transaction for making reward public or private\n */\n buildRewardAccessPayload(option: RewardAccessOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { pool_id, type, coin_type_a, coin_type_b } = option\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::${type === 'to_public' ? 'make_reward_public' : 'make_reward_private'}`,\n arguments: [tx.object(pool_id), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return tx\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { CLOCK_ADDRESS, DETAILS_KEYS, fixCoinType, getObjectFields, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { CetusDlmmSDK } from '../sdk'\nimport { BinStepConfig, DlmmConfigs, DlmmGlobalConfig, RewardWhiteListOption } from '../types/dlmm'\nimport { log } from 'console'\n\nexport class ConfigModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Build the payload for adding or removing reward white list\n * @param option - The option for adding or removing reward white list\n * @param tx - The transaction to add the reward white list to\n * @returns The transaction for adding or removing reward white list\n */\n buildRewardWhiteListPayload(option: RewardWhiteListOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { reward_coin_types, type } = option\n\n reward_coin_types.forEach((reward_coin_type) => {\n tx.moveCall({\n target: `${dlmm_pool.published_at}::config::${type === 'add' ? 'add_reward_whitelist' : 'remove_reward_whitelist'}`,\n arguments: [tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [reward_coin_type],\n })\n })\n\n return tx\n }\n\n async getBinStepConfigList(bin_steps_handle: string): Promise<BinStepConfig[]> {\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(bin_steps_handle)\n\n const list: BinStepConfig[] = []\n\n const bin_step_ids = res.data.map((item) => item.objectId)\n\n if (bin_step_ids.length > 0) {\n const bin_step_configs = await this._sdk.FullClient.batchGetObjects(bin_step_ids, {\n showContent: true,\n })\n\n bin_step_configs.forEach((item) => {\n const fields = getObjectFields(item)\n const bin_step_config: BinStepConfig = {\n ...fields.value.fields,\n }\n list.push(bin_step_config)\n })\n }\n\n return list\n }\n\n /**\n * Get the list of bin step configs\n * @returns The list of bin step configs\n */\n async getDlmmGlobalConfig(): Promise<DlmmGlobalConfig> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(dlmm_pool)\n try {\n const res = await this._sdk.FullClient.getObject({\n id: global_config_id,\n options: { showContent: true },\n })\n\n const fields = getObjectFields(res)\n\n const reward_config = fields.reward_config.fields\n\n const white_list: string[] =\n reward_config.reward_white_list?.fields?.contents?.map((item: any) => {\n return fixCoinType(item.fields.key.fields.name, false) as string\n }) || []\n\n const globalConfig: DlmmGlobalConfig = {\n id: fields.id.id,\n acl: {\n id: fields.acl.fields.permissions.fields.id.id,\n size: fields.acl.fields.permissions.fields.size,\n },\n allowed_list: {\n id: fields.allowed_list.fields.id.id,\n size: fields.allowed_list.fields.size,\n },\n denied_list: {\n id: fields.denied_list.fields.id.id,\n size: fields.denied_list.fields.size,\n },\n bin_steps: {\n id: fields.bin_steps.fields.id.id,\n size: fields.bin_steps.fields.size,\n },\n reward_white_list: white_list,\n blocked_position: {\n id: fields.restriction.fields.blocked_position.fields.permissions.fields.id.id,\n size: fields.restriction.fields.blocked_position.fields.permissions.fields.size,\n },\n blocked_user: {\n id: fields.restriction.fields.blocked_user.fields.permissions.fields.id.id,\n size: fields.restriction.fields.blocked_user.fields.permissions.fields.size,\n },\n min_reward_duration: Number(reward_config.min_reward_duration),\n non_manager_initialize_reward_cap: Number(reward_config.manager_reserved_reward_init_slots),\n reward_public: reward_config.reward_public,\n }\n\n return globalConfig\n } catch (error) {\n console.log('fetchGlobalConfig error: ', error)\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getBinStepConfigs',\n [DETAILS_KEYS.REQUEST_PARAMS]: global_config_id,\n })\n }\n }\n\n /**\n * Fetch the configs of the dlmm SDK\n * @returns The configs of the dlmm\n */\n async fetchDlmmSdkConfigs(): Promise<DlmmConfigs> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const configs: DlmmConfigs = {\n registry_id: '',\n pools_id: '',\n global_config_id: '',\n versioned_id: '',\n admin_cap_id: '',\n partners_id: '',\n }\n\n const res = await this._sdk.FullClient.getObject({\n id: dlmm_pool.package_id,\n options: { showContent: true, showPreviousTransaction: true },\n })\n const tx_digest = res.data?.previousTransaction!\n const txRes = await this._sdk.FullClient.getTransactionBlock({ digest: tx_digest, options: { showEvents: true } })\n txRes.events?.forEach((event) => {\n const type = event.type\n const parsedJson = event.parsedJson as any\n\n if (type.includes('versioned::InitEvent')) {\n configs.versioned_id = parsedJson.versioned\n }\n\n if (type.includes('partner::InitPartnerEvent')) {\n configs.partners_id = parsedJson.partners_id\n }\n\n if (type.includes('config::InitEvent')) {\n configs.global_config_id = parsedJson.config_id\n }\n\n if (type.includes('admin_cap::InitEvent')) {\n configs.admin_cap_id = parsedJson.admin_cap_id\n }\n\n if (type.includes('registry::RegistryEvent')) {\n configs.registry_id = parsedJson.pools_id\n }\n })\n const registerRes = await this._sdk.FullClient.getObject({ id: configs.registry_id, options: { showContent: true } })\n const registerFields = getObjectFields(registerRes)\n configs.pools_id = registerFields.pools.fields.id.id\n\n return configs\n }\n}\n"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","b","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","index_exports","__export","BASIS_POINT","BASIS_POINT_MAX","BIN_BOUND","BinUtils","CetusDlmmSDK","DEFAULT_MAX_WEIGHT","DEFAULT_MIN_WEIGHT","FEE_PRECISION","FeeUtils","IlmUtils","MAX_BIN_ID","MAX_BIN_PER_POSITION","MAX_FEE_RATE","MIN_BIN_ID","ONE","PoolModule","REWARD_PERIOD","REWARD_PERIOD_START_AT","SCALE_OFFSET","StrategyType","StrategyUtils","WeightUtils","buildPoolKey","index_default","dlmmMainnet","dlmmTestnet","generateRewardSchedule","getRouterModule","parseBinInfo","parseBinInfoList","parseCurrentRewardPeriodEmission","parseDlmmBasePool","parseDlmmPool","parseDlmmPosition","parseLiquidityShares","parsePartner","parsePoolTransactionInfo","parseRewardPeriodEmission","parseStrategyType","parsedDlmmPosFeeData","parsedDlmmPosRewardData","parsedSwapQuoteData","poolFilterEvenTypes","safeAmount","safeMulAmount","__toCommonJS","import_common_sdk","import_common_sdk","dlmmMainnet","import_transactions","import_common_sdk","import_common_sdk","DlmmError","message","error_code","details","e","code","handleError","error","errorDetails","import_common_sdk","import_bn","EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","e","m","n","rep","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","i","d8","sinh2_x","d5","d16","d20","getPi","wpr","xsd","halfPi","px","r","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","s","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","p","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","decimal_default","StrategyType","import_common_sdk","MAX_BIN_PER_POSITION","MIN_BIN_ID","MAX_BIN_ID","BASIS_POINT_MAX","DEFAULT_MAX_WEIGHT","DEFAULT_MIN_WEIGHT","BIN_BOUND","MAX_FEE_RATE","FEE_PRECISION","BASIS_POINT","REWARD_PERIOD","REWARD_PERIOD_START_AT","import_bn","MAX_EXPONENTIAL","BN","SCALE_OFFSET","ONE","MAX","BinUtils","_BinUtils","liquidity_bins","lower_bin_id","upper_bin_id","position_count","positions","current_lower","i","current_upper","position_bins","bin","acc","bins","rate","used_bins","used_total_amount_a","used_total_amount_b","has_invalid_amount","amount_a","amount_b","liquidity","used_liquidity","used_amount_a","used_amount_b","remove_liquidity","amount_a_out","decimal_default","amount_b_out","positionCount","qPrice","delta_liquidity","liquidity_supply","handleError","out_amount_a","out_amount_b","bin_id","bin_step","decimal_a","decimal_b","pricePerLamport","binStepNum","price","binStep","min","binId","bps","base","exp","invert","squaredBase","result","score","BIN_BOUND","scoreBigInt","groupIndex","offsetInGroup","n","minBinId","maxBinId","minQPrice","maxQPrice","active_id","max_price_slippage","price_limit","slippage_active_id","bin_shift","import_bcs","import_blakejs","parseDlmmBasePool","data","fields","error","handleError","parseDlmmPool","type","formatType","bin_manager","position_manager","reward_manager_fields","rewards","reward","current_reward_rate","emissions_per_second","BN","emissions_per_day","reward_manager","variable_parameters","pool","parsePartner","parseDlmmPosition","parseLiquidityShares","liquidity_shares","bin_step","lower_bin_id","active_bin","bins","liquidity","index","bin_id","price_per_lamport","BinUtils","amount_a","amount_b","q_price","acc","bin","decimal_default","parseBinInfoList","res","bcsCoinAmount","bin_amount","parseBinInfo","parsedDlmmPosFeeData","simulate_res","feeData","feeValueData","item","i","parsedJson","posObj","parsedDlmmPosRewardData","rewarderData","rewarderValueData","position_id","reward_coin","reward_amount","rewardInfo","rewarder","parsedSwapQuoteData","a2b","partner","amount_in","amount_out","fee","ref_fee","bin_swaps","from","target","bin_swaps_info","bin_swap","parseStrategyType","strategy_type","poolFilterEvenTypes","parsePoolTransactionInfo","txIndex","package_id","pool_id","list","timestampMs","events","event","package_address","info","generateRewardSchedule","baseTime","maxIntervals","timeInterval","result","intervals","baseDateTime","nowTime","rewardTime","parseRewardPeriodEmission","periodEmissionList","startTimeInSeconds","endTimeInSeconds","durationSeconds","time","findRewardPeriodEmission","period","parseCurrentRewardPeriodEmission","currentTime","safeMulAmount","amount","rate","DlmmError","safeAmount","getRouterModule","buildPoolKey","coin_type_a","coin_type_b","base_factor","coinABytes","coinBBytes","lenB","byteB","binStepBytes","baseFactorBytes","combinedBytes","hash","import_common_sdk","WeightUtils","_WeightUtils","options","strategy_type","active_id","bin_step","lower_bin_id","upper_bin_id","total_amount_a","total_amount_b","active_bin_of_pool","single_side","active_bin_price","BinUtils","active_weight_a","active_weight_b","base_weight","weights","SCALE_OFFSET","total_weight_a","total_weight_b","diff_weight","left_end_bin_id","right_start_bin_id","diff_min_weight","diff_max_weight","bin_id","weight_per_prices","weight","delta_bin","weight_per_price","min_bin_id","max_bin_id","distributions","i","maxWeight","diffWeight","diffMinWeight","diffMaxWeight","minWeight","amount_b","contain_active_bin","totalWeight","bin","sum","el","price_per_lamport","rate","amount_b_in_bin","safeMulAmount","amount_a","qPrice","liquidity","weightPerPrice","decimal_default","amount_a_in_bin","amount_a_in_active_bin","amount_b_in_active_bin","isOnlyAmountA","isOnlyAmountB","activeBins","element","totalWeightA","totalWeightB","activeWeightA","activeWeightB","kA","kB","bin_amounts","weighPerPrice","amountAActiveBin","amountBActiveBin","amount","fix_amount_a","k","other_amount","amount_a_in_active_id","amount_b_in_active_id","p0","amountA","amountB","m","activeBin","is_only_amount","amountAInActiveBinDec","amountBInActiveBinDec","import_common_sdk","StrategyUtils","weights_info","total_weight_a","total_weight_b","weights","weight_per_prices","total_amount_a","total_amount_b","active_weight_a","active_weight_b","lower_bin_id","upper_bin_id","active_id","bin_step","ky","SCALE_OFFSET","kx","amount_a_in_active_id","safeAmount","amount_b_in_active_id","bin_count","bin_id","idx","bin_amounts","amount_a_in_bin","amount_b_in_bin","qPrice","BinUtils","liquidity","min_bin_id","max_bin_id","amount_a","amount_b","strategy_type","active_bin_of_pool","WeightUtils","amount","fix_amount_a","info","import_common_sdk","FeeUtils","_FeeUtils","variableParameters","volatility_accumulator","bin_step_config","variable_fee_control","bin_step","amount","total_fee_rate","fee_amount","protocol_fee_rate","fee_a","fee_b","protocol_fee_a","protocol_fee_b","active_bin","used_bin","base_factor","qPrice","BinUtils","bin_liquidity","delta_liquidity","delta_liquidity_share","amount_a_out","amount_b_out","base_fee","variable_fee","fees_a","fees_b","IlmUtils","options","curvature","initial_price","max_price","bin_step","total_supply","pool_share_percentage","config","price_curve_points_num","liquidity_distribution_num","tokens_table_num","price_table_num","flat","myFormula","c","price_diff","pool_supply","integrate","upper","lower","u","l","reverse_formula","price","liquidity","binTokens","getBinIdFromLamportPrice","pricePerLamport","binStep","min","binStepNum","binId","getPricePerLamportFromBinId","prices","heights","minBinId","maxBinId","total","binFlag","nextPrice","tokenDiff","result","LDstep","pricePoints","priceMin","priceMax","index","x","y","liquidityPoints","liquidityMin","liquidityMax","dlmmBins","dlmmBinsMin","dlmmBinsMax","tokensTable","tokensWithdrawn","step","n","amountUsd","step2","priceTable","r","import_client","import_utils","import_bcs","PoolModule","sdk","coin_type_a","coin_type_b","bin_step","base_factor","poolKey","buildPoolKey","dlmm_pool","pools_id","res","error","handleError","pagination_args","force_refresh","dataPage","queryAll","cacheAllKey","cacheDate","moveEventType","object","pool","parseDlmmBasePool","basePoolPage","item","suiObj","parseDlmmPool","cacheKey","bin_manager_handle","bin_id","cacheData","score","BinUtils","groupIndex","offsetInGroup","fields","bin_info","parseBinInfo","options","bin_info_list","warpOptions","option","dynamic_field_id","index","binFields","pool_id","tx","limit","bin_infos","start_bin_id","hasNext","start_bin","list","parseBinInfoList","a","b","order","full_rpc_url","fullClient","sdkOptions","client","data","query","user_limit","dataList","parsePoolTransactionInfo","lower_bin_id","upper_bin_id","assign_pool_ids","allPool","url","price_base_coin","price","lower_price","upper_price","decimals_a","decimals_b","strategy_type","use_bin_infos","active_id","new_bin_infos","calculateOption","createPoolAndAddOption","registry_id","global_config_id","versioned_id","cert","width","addOption","import_common_sdk","dlmmTestnet","import_common_sdk","import_transactions","import_utils","PositionModule","sdk","owner","list","obj","parseDlmmPosition","error","handleError","position_id","res","option","tx","pool_id","coin_type_a","coin_type_b","dlmm_pool","versioned_id","global_config_id","fee_a_balance","fee_b_balance","fee_a_obj","fee_b_obj","options","reward_coins","reward_coin","reward_coin_balance","reward_coin_obj","active_id","max_price_slippage","bin_step","dlmm_router","bin_shift","BinUtils","active_id_u32","close_position_cert","coin_a_balance","coin_b_balance","coin_a_obj","coin_b_obj","bin_manager_handle","lower_bin_id","upper_bin_id","force_refresh","bins","coin_amount","isBothSide","bins_b","bin","bins_a","total_amount","amount_rate","used_bins","fix_amount_a","active_bin","total_amount_a","acc","total_amount_b","is_only_a","info","remaining_amount","processed_bins","is_amount_a","bin_amount","bin_amount_other","rate","decimal_default","amount_to_remove","amount_to_remove_other","liquidity_to_remove","isAutoFill","active_bin_of_pool","strategy_type","bin_infos","StrategyUtils","active_bin_index","pool","fees_a","fees_b","FeeUtils","slippage","collect_fee","remove_percent","min_bin_id_u32","max_bin_id_u32","remove_percent_fixed","bin_amounts","remove_liquiditys","price_base_coin","price","lower_price","upper_price","decimals_a","decimals_b","use_bin_infos","new_bin_infos","calculateOption","openAndAddLiquidityOption","isOpenPosition","liquidity_bins","position_bins","liquidity_bin","index","amount_a","amount_b","coin_a_obj_id","coin_b_obj_id","position","lower_bin_id_u32","routerModule","getRouterModule","width","valid_bins","valid_lower_bin_id_u32","valid_upper_bin_id_u32","amounts_a","amounts_b","bin_ids","open_position_id","simulateRes","feeData","parsedDlmmPosFeeData","rewardData","parsedDlmmPosRewardData","import_transactions","import_common_sdk","import_utils","SwapModule","sdk","option","dlmm_pool","pool_id","coin_type_a","coin_type_b","a2b","by_amount_in","in_amount","versioned_id","global_config_id","tx","simulateRes","handleError","quoteInfo","parsedSwapQuoteData","dlmm_router","quote_obj","slippage","partner","out_amount","in_amount_limit","out_amount_limit","in_coin","import_transactions","import_common_sdk","PartnerModule","sdk","allPartner","dlmm_pool","partners_id","res","warpIds","item","partner","parsePartner","error","handleError","owner","partner_id","cacheKey","cached","partnerCapId","fields","partner_balance_handle","balanceList","option","tx","ref_fee_rate","global_config_id","versioned_id","ref_fee_rate_raw","partner_cap_id","fee_coin_types","coin_type","start_time","end_time","startTimeInSeconds","endTimeInSeconds","name","recipient","import_transactions","import_common_sdk","import_bn","RewardModule","sdk","period_emission_handle","curr_emission_per_second","last_updated_time","res","result","warpIds","item","fields","emission_rate","BN","time","visualizedTime","rewardPeriodEmission","sortedList","a","b","newNodeList","last_emission_rate","i","emissions_per_day","option","tx","dlmm_pool","global_config_id","versioned_id","pool_id","reward_coin_type","reward_amount","start_time_seconds","end_time_seconds","coin_type_a","coin_type_b","reward_coin","reward_coin_types","type","import_transactions","import_common_sdk","ConfigModule","sdk","option","tx","dlmm_pool","global_config_id","versioned_id","reward_coin_types","type","reward_coin_type","bin_steps_handle","res","list","bin_step_ids","item","bin_step_config","fields","reward_config","white_list","error","handleError","configs","tx_digest","event","parsedJson","registerRes","registerFields","CetusDlmmSDK","_CetusDlmmSDK","options","PoolModule","PositionModule","SwapModule","PartnerModule","RewardModule","ConfigModule","env","dlmmMainnet","dlmmTestnet","index_default","CetusDlmmSDK"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../src/index.ts","../src/sdk.ts","../src/config/mainnet.ts","../src/modules/poolModule.ts","../src/errors/errors.ts","../src/utils/parseData.ts","../../../node_modules/.pnpm/decimal.js@10.6.0/node_modules/decimal.js/decimal.mjs","../src/types/dlmm.ts","../src/utils/binUtils.ts","../src/types/constants.ts","../src/utils/weightUtils.ts","../src/utils/strategyUtils.ts","../src/utils/feeUtils.ts","../src/utils/ilmUtils.ts","../src/config/testnet.ts","../src/modules/positionModule.ts","../src/modules/swapModule.ts","../src/modules/partnerModule.ts","../src/modules/rewardModule.ts","../src/modules/configModule.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","import { CetusDlmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport { CetusDlmmSDK, SdkOptions }\nexport default CetusDlmmSDK\n","import type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport type { DlmmConfigs } from './types/dlmm'\nimport { dlmmMainnet } from './config/mainnet'\nimport { PoolModule } from './modules/poolModule'\nimport { dlmmTestnet } from './config/testnet'\nimport { PositionModule } from './modules/positionModule'\nimport { SwapModule } from './modules/swapModule'\nimport { PartnerModule } from './modules/partnerModule'\nimport { RewardModule } from './modules/rewardModule'\nimport { ConfigModule } from './modules/configModule'\n\n/**\n * Represents options and configurations for an SDK.\n */\nexport interface SdkOptions extends BaseSdkOptions {\n dlmm_pool: Package<DlmmConfigs>\n dlmm_router: Package\n faucet?: Package\n}\n\n/**\n * The entry class of CetusDcaSDK, which is almost responsible for all interactions with dca.\n */\nexport class CetusDlmmSDK extends SdkWrapper<SdkOptions> {\n protected _pool: PoolModule\n protected _position: PositionModule\n protected _swap: SwapModule\n protected _partner: PartnerModule\n protected _reward: RewardModule\n protected _config: ConfigModule\n\n constructor(options: SdkOptions) {\n super(options)\n\n this._pool = new PoolModule(this)\n this._position = new PositionModule(this)\n this._swap = new SwapModule(this)\n this._partner = new PartnerModule(this)\n this._reward = new RewardModule(this)\n this._config = new ConfigModule(this)\n }\n\n get Pool(): PoolModule {\n return this._pool\n }\n\n get Position(): PositionModule {\n return this._position\n }\n\n get Swap(): SwapModule {\n return this._swap\n }\n\n get Partner(): PartnerModule {\n return this._partner\n }\n\n get Reward(): RewardModule {\n return this._reward\n }\n\n get Config(): ConfigModule {\n return this._config\n }\n\n /**\n * Static factory method to initialize the SDK\n * @param options SDK initialization options\n * @returns An instance of CetusBurnDK\n */\n static createSDK(options: BaseSdkOptions): CetusDlmmSDK {\n const { env = 'mainnet' } = options\n return env === 'mainnet'\n ? CetusDlmmSDK.createCustomSDK({ ...dlmmMainnet, ...options })\n : CetusDlmmSDK.createCustomSDK({ ...dlmmTestnet, ...options })\n }\n\n /**\n * Create a custom SDK instance with the given options\n * @param options The options for the SDK\n * @returns An instance of CetusBurnSDK\n */\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusDlmmSDK {\n return new CetusDlmmSDK(options)\n }\n}\n","import type { SdkOptions } from '../sdk'\nimport { FullRpcUrlMainnet, GraphRpcUrlMainnet } from '@cetusprotocol/common-sdk'\n// mainnet\nexport const dlmmMainnet: SdkOptions = {\n env: 'mainnet',\n full_rpc_url: FullRpcUrlMainnet,\n graph_rpc_url: GraphRpcUrlMainnet,\n dlmm_pool: {\n package_id: '0x5664f9d3fd82c84023870cfbda8ea84e14c8dd56ce557ad2116e0668581a682b',\n published_at: '0x44d0fb760f9f7ce532a4a97abddf2e7982c9b9b50ac94cf62de8f4d11356d306',\n version: 5,\n config: {\n registry_id: '0xb1d55e7d895823c65f98d99b81a69436cf7d1638629c9ccb921326039cda1f1b',\n pools_id: '0xc3683b2356cac6423e9ecaea20955c7cc193998b016e5b884730ed1192174991',\n global_config_id: '0xf31b605d117f959b9730e8c07b08b856cb05143c5e81d5751c90d2979e82f599',\n versioned_id: '0x05370b2d656612dd5759cbe80463de301e3b94a921dfc72dd9daa2ecdeb2d0a8',\n admin_cap_id: '0xc4c42bc31cb54beb679dccd547f8bdb970cb6dc989bd1f85a4fed4812ed95d6e',\n partners_id: '0x5c0affc8d363b6abb1f32790c229165215f4edead89a9bc7cd95dad717b4296a',\n },\n },\n dlmm_router: {\n package_id: '0x8d389fa25cb08ebc5e520bc520ed394eed9e62b56b7868acb398bf298b8a76f3',\n published_at: '0xdb974d2654a62bb0668f58ee7919b5e41566a6c3336c3a006a412d5137487c67',\n version: 3,\n },\n}\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport {\n asUintN,\n CLOCK_ADDRESS,\n CoinAssist,\n createFullClient,\n d,\n DataPage,\n deriveDynamicFieldIdByType,\n DETAILS_KEYS,\n fixCoinType,\n getObjectFields,\n getPackagerConfigs,\n IModule,\n isSortedSymbols,\n PageQuery,\n PaginationArgs,\n printTransaction,\n} from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport {\n BinUtils,\n buildPoolKey,\n parseBinInfo,\n parseBinInfoList,\n parseDlmmBasePool,\n parseDlmmPool,\n parsePoolTransactionInfo,\n} from '../utils'\nimport { CetusDlmmSDK } from '../sdk'\nimport {\n BinAmount,\n BinLiquidityInfo,\n CalculateAddLiquidityOption,\n CreatePoolAndAddOption,\n CreatePoolAndAddWithPriceOption,\n CreatePoolOption,\n DlmmBasePool,\n DlmmConfigs,\n DlmmPool,\n FeeRate,\n GetBinInfoOption,\n GetBinInfoResult,\n GetPoolBinInfoOption,\n GetTotalFeeRateOption,\n OpenAndAddLiquidityOption,\n PoolTransactionInfo,\n} from '../types/dlmm'\nimport { MAX_BIN_PER_POSITION } from '../types/constants'\nimport { SuiClient } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { bcs } from '@mysten/sui/bcs'\n\nexport class PoolModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async getPoolAddress(coin_type_a: string, coin_type_b: string, bin_step: number, base_factor: number): Promise<string | undefined> {\n try {\n const poolKey = buildPoolKey(coin_type_a, coin_type_b, bin_step, base_factor)\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pools_id } = getPackagerConfigs(dlmm_pool)\n const res = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: pools_id,\n name: {\n type: '0x2::object::ID',\n value: poolKey,\n },\n })\n const fields = getObjectFields(res)\n return fields.value.fields.value.fields.pool_id\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolAddress',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n coin_type_a,\n coin_type_b,\n bin_step,\n base_factor,\n },\n })\n }\n\n return undefined\n }\n\n /**\n * Get the list of DLMM base pools\n * @param pagination_args - The pagination arguments\n * @returns The list of DLMM base pools\n */\n async getBasePoolList(pagination_args: PaginationArgs = 'all', force_refresh = false): Promise<DataPage<DlmmBasePool>> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const dataPage: DataPage<DlmmBasePool> = {\n data: [],\n has_next_page: false,\n }\n\n const queryAll = pagination_args === 'all'\n const cacheAllKey = `${dlmm_pool.package_id}_getBasePoolList`\n if (queryAll) {\n const cacheDate = this._sdk.getCache<DlmmBasePool[]>(cacheAllKey, force_refresh)\n if (cacheDate && cacheDate.length > 0) {\n dataPage.data.push(...cacheDate)\n return dataPage\n }\n }\n\n try {\n const moveEventType = `${dlmm_pool.package_id}::registry::CreatePoolEvent`\n const res = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: moveEventType }, pagination_args)\n dataPage.has_next_page = res.has_next_page\n dataPage.next_cursor = res.next_cursor\n res.data.forEach((object) => {\n const pool = parseDlmmBasePool(object)\n dataPage.data.push(pool)\n })\n\n if (queryAll) {\n this._sdk.updateCache(`${dlmm_pool.package_id}_getPoolImmutables`, dataPage.data)\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getBasePoolList',\n })\n }\n\n return dataPage\n }\n\n /**\n * Get the list of DLMM pools\n * @param pagination_args - The pagination arguments\n * @returns The list of DLMM pools\n */\n async getPools(pagination_args: PaginationArgs = 'all', force_refresh = false): Promise<DataPage<DlmmPool>> {\n const dataPage: DataPage<DlmmPool> = {\n data: [],\n has_next_page: false,\n }\n\n const basePoolPage = await this.getBasePoolList(pagination_args, force_refresh)\n if (basePoolPage.data.length === 0) {\n return dataPage\n }\n\n try {\n const res = await this._sdk.FullClient.batchGetObjects(\n basePoolPage.data.map((item) => item.id),\n {\n showContent: true,\n showType: true,\n }\n )\n dataPage.has_next_page = basePoolPage.has_next_page\n dataPage.next_cursor = basePoolPage.next_cursor\n for (const suiObj of res) {\n const pool = parseDlmmPool(suiObj)\n const cacheKey = `${pool.id}_getDlmmPool`\n this._sdk.updateCache(cacheKey, pool)\n dataPage.data.push(pool)\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPools',\n })\n }\n\n return dataPage\n }\n\n /**\n * Get the bin info by bin id\n * @param bin_manager_handle - The bin manager handle\n * @param bin_id - The bin id\n * @param bin_step - The bin step\n * @param force_refresh - Whether to force a refresh of the cache\n * @returns The bin info\n */\n async getBinInfo(bin_manager_handle: string, bin_id: number, bin_step: number, force_refresh = true): Promise<BinAmount> {\n try {\n const cacheKey = `${bin_manager_handle}_getBinInfo_${bin_id}`\n const cacheData = this._sdk.getCache<BinAmount>(cacheKey, force_refresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const score = BinUtils.binScore(bin_id)\n const [groupIndex, offsetInGroup] = BinUtils.resolveBinPosition(score)\n\n const res: any = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: bin_manager_handle,\n name: { type: 'u64', value: groupIndex },\n })\n const fields = res.data.content.fields.value.fields.value.fields.group.fields.bins[offsetInGroup].fields\n const bin_info = parseBinInfo(fields)\n this._sdk.updateCache(cacheKey, bin_info)\n return bin_info\n } catch (error) {\n return {\n bin_id,\n amount_a: '0',\n amount_b: '0',\n liquidity: '0',\n price_per_lamport: BinUtils.getPricePerLamportFromBinId(bin_id, bin_step),\n }\n }\n }\n\n async getBinInfoList(options: GetBinInfoOption[]): Promise<GetBinInfoResult[]> {\n const bin_info_list: GetBinInfoResult[] = []\n const warpOptions = options.map((option) => {\n const { bin_manager_handle, bin_id, bin_step } = option\n const score = BinUtils.binScore(bin_id)\n const [groupIndex, offsetInGroup] = BinUtils.resolveBinPosition(score)\n const dynamic_field_id = deriveDynamicFieldIdByType(bin_manager_handle, groupIndex, 'u64', 'u64')\n return {\n groupIndex,\n offsetInGroup,\n bin_id,\n bin_step,\n bin_manager_handle,\n dynamic_field_id,\n }\n })\n\n const res = await this._sdk.FullClient.batchGetObjects(\n warpOptions.map((option) => option.dynamic_field_id),\n {\n showContent: true,\n showType: true,\n }\n )\n\n res.forEach((item, index) => {\n const { offsetInGroup, bin_manager_handle, bin_step, bin_id } = warpOptions[index]\n try {\n const fields = getObjectFields(item)\n const binFields = fields.value.fields.value.fields.group.fields.bins[offsetInGroup].fields\n const bin_info = parseBinInfo(binFields)\n bin_info_list.push({\n ...bin_info,\n bin_manager_handle: bin_manager_handle,\n bin_step: bin_step,\n })\n } catch (error) {\n bin_info_list.push({\n bin_id,\n amount_a: '0',\n amount_b: '0',\n liquidity: '0',\n price_per_lamport: BinUtils.getPricePerLamportFromBinId(bin_id, bin_step),\n bin_manager_handle: bin_manager_handle,\n bin_step: bin_step,\n })\n }\n })\n\n return bin_info_list\n }\n\n async getTotalFeeRate(option: GetTotalFeeRateOption): Promise<FeeRate> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pool_id, coin_type_a, coin_type_b } = option\n const tx: Transaction = new Transaction()\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::get_total_fee_rate`,\n arguments: [tx.object(pool_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const res = await this._sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n const bcsFeeRate = bcs.struct('FeeRate', {\n base_fee_rate: bcs.u64(),\n var_fee_rate: bcs.u64(),\n total_fee_rate: bcs.u64(),\n })\n\n const feeRate = bcsFeeRate.parse(Uint8Array.from(res.results![0].returnValues![0][0]))\n\n return feeRate\n }\n\n async getPoolBinInfo(option: GetPoolBinInfoOption): Promise<BinAmount[]> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pool_id, coin_type_a, coin_type_b } = option\n const limit = 1000\n const bin_infos: BinAmount[] = []\n let start_bin_id: number | undefined = undefined\n let hasNext = true\n while (hasNext) {\n const tx: Transaction = new Transaction()\n let start_bin\n if (start_bin_id !== undefined) {\n start_bin = tx.moveCall({\n target: `0x1::option::some`,\n arguments: [tx.pure.u32(Number(asUintN(BigInt(start_bin_id))))],\n typeArguments: ['u32'],\n })\n } else {\n start_bin = tx.moveCall({\n target: `0x1::option::none`,\n typeArguments: ['u32'],\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::fetch_bins`,\n arguments: [tx.object(pool_id), start_bin, tx.pure.u64(limit)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n const res = await this._sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n const list = parseBinInfoList(res)\n bin_infos.push(...list)\n start_bin_id = list.length > 0 ? list[list.length - 1].bin_id + 1 : undefined\n hasNext = list.length === limit\n }\n\n return bin_infos.sort((a, b) => a.bin_id - b.bin_id)\n }\n\n async getPoolTransactionList({\n pool_id,\n pagination_args,\n order = 'descending',\n full_rpc_url,\n }: {\n pool_id: string\n full_rpc_url?: string\n pagination_args: PageQuery\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PoolTransactionInfo>> {\n const { FullClient: fullClient, sdkOptions } = this._sdk\n let client\n if (full_rpc_url) {\n client = createFullClient(new SuiClient({ url: full_rpc_url }))\n } else {\n client = fullClient\n }\n const data: DataPage<PoolTransactionInfo> = {\n data: [],\n has_next_page: false,\n }\n\n const limit = 50\n const query = pagination_args\n const user_limit = pagination_args.limit || 10\n do {\n const res = await client.queryTransactionBlocksByPage({ ChangedObject: pool_id }, { ...query, limit: 50 }, order)\n res.data.forEach((item, index) => {\n const dataList = parsePoolTransactionInfo(item, index, sdkOptions.dlmm_pool.package_id, pool_id)\n data.data = [...data.data, ...dataList]\n })\n data.has_next_page = res.has_next_page\n data.next_cursor = res.next_cursor\n query.cursor = res.next_cursor\n } while (data.data.length < user_limit && data.has_next_page)\n\n if (data.data.length > user_limit) {\n data.data = data.data.slice(0, user_limit)\n data.has_next_page = true\n }\n if (data.data.length > 0) {\n data.next_cursor = data.data[data.data.length - 1].tx\n }\n\n return data\n }\n\n /**\n * Get the bin info by range (TODO: need to optimize this method)\n * @param bin_manager_handle - The bin manager handle\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @param bin_step - The bin step\n * @returns The bin info by range\n */\n async getRangeBinInfo(bin_manager_handle: string, lower_bin_id: number, upper_bin_id: number, bin_step: number): Promise<BinAmount[]> {\n const bin_infos: BinAmount[] = []\n for (let bin_id = lower_bin_id; bin_id <= upper_bin_id; bin_id++) {\n const bin_info = await Promise.all([this.getBinInfo(bin_manager_handle, bin_id, bin_step)])\n bin_infos.push(...bin_info)\n }\n return bin_infos\n }\n\n /**\n * Get the list of DLMM pools by assign pool ids\n * @param assign_pool_ids - The assign pool ids\n * @returns The list of DLMM pools\n */\n async getAssignPoolList(assign_pool_ids: string[]): Promise<DlmmPool[]> {\n if (assign_pool_ids.length === 0) {\n return []\n }\n\n const allPool: DlmmPool[] = []\n\n try {\n const res = await this._sdk.FullClient.batchGetObjects(assign_pool_ids, {\n showContent: true,\n showType: true,\n })\n for (const suiObj of res) {\n const pool = parseDlmmPool(suiObj)\n const cacheKey = `${pool.id}_getDlmmPool`\n this._sdk.updateCache(cacheKey, pool)\n allPool.push(pool)\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getAssignPoolList',\n })\n }\n\n return allPool\n }\n\n /**\n * Get a DLMM pool by its object ID.\n * @param {string} pool_id The object ID of the pool to get.\n * @param {true} force_refresh Whether to force a refresh of the cache.\n * @returns {Promise<DlmmPool>} A promise that resolves to a DlmmPool object.\n */\n async getPool(pool_id: string, force_refresh = true): Promise<DlmmPool> {\n try {\n const cacheKey = `${pool_id}_getDlmmPool`\n const cacheData = this._sdk.getCache<DlmmPool>(cacheKey, force_refresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const suiObj = await this._sdk.FullClient.getObject({\n id: pool_id,\n options: {\n showType: true,\n showContent: true,\n },\n })\n const pool = parseDlmmPool(suiObj)\n this._sdk.updateCache(cacheKey, pool)\n return pool\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPool',\n [DETAILS_KEYS.REQUEST_PARAMS]: pool_id,\n })\n }\n }\n\n /**\n * Create a pool and add liquidity with a given price\n * @param option - The option for creating a pool and adding liquidity with a given price\n * @returns The transaction for creating a pool and adding liquidity with a given price\n */\n async createPoolAndAddWithPricePayload(option: CreatePoolAndAddWithPriceOption): Promise<Transaction> {\n const {\n bin_step,\n url,\n coin_type_a,\n coin_type_b,\n bin_infos,\n price_base_coin,\n price,\n lower_price,\n upper_price,\n decimals_a,\n decimals_b,\n strategy_type,\n use_bin_infos,\n base_factor,\n pool_id,\n } = option\n\n let lower_bin_id\n let upper_bin_id\n let active_id\n let new_bin_infos: BinLiquidityInfo = bin_infos\n\n const is_coin_a_base = price_base_coin === 'coin_a'\n\n if (is_coin_a_base) {\n lower_bin_id = BinUtils.getBinIdFromPrice(lower_price, bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(upper_price, bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(price, bin_step, true, decimals_a, decimals_b)\n } else {\n lower_bin_id = BinUtils.getBinIdFromPrice(d(1).div(upper_price).toString(), bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(d(1).div(lower_price).toString(), bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(d(1).div(price).toString(), bin_step, false, decimals_a, decimals_b)\n\n const calculateOption: CalculateAddLiquidityOption = {\n pool_id,\n amount_a: bin_infos.amount_b,\n amount_b: bin_infos.amount_a,\n active_id,\n bin_step,\n lower_bin_id,\n upper_bin_id,\n active_bin_of_pool: undefined,\n strategy_type: option.strategy_type,\n }\n\n new_bin_infos = await this.sdk.Position.calculateAddLiquidityInfo(calculateOption)\n }\n\n const createPoolAndAddOption: CreatePoolAndAddOption = {\n bin_step,\n url,\n coin_type_a,\n coin_type_b,\n bin_infos: new_bin_infos,\n lower_bin_id,\n upper_bin_id,\n active_id,\n strategy_type,\n use_bin_infos,\n base_factor,\n }\n\n return this.createPoolAndAddLiquidityPayload(createPoolAndAddOption)\n }\n\n /**\n * Create a pool\n * @param option - The option for creating a pool\n * @param tx - The transaction object\n * @returns The transaction object\n */\n createPoolPayload(option: CreatePoolOption, tx: Transaction): TransactionObjectArgument {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { bin_step, base_factor, url, coin_type_a, coin_type_b, active_id } = option\n tx = tx || new Transaction()\n\n const { registry_id, global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const [cert, pool_id] = tx.moveCall({\n target: `${dlmm_pool.published_at}::registry::create_pool_v2`,\n arguments: [\n tx.object(registry_id),\n tx.pure.u16(bin_step),\n tx.pure.u16(base_factor),\n tx.pure.u32(Number(asUintN(BigInt(active_id)))),\n tx.pure.string(url || ''),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::registry::destroy_receipt`,\n arguments: [tx.object(cert), pool_id, tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return pool_id\n }\n\n /**\n * Create a pool and add liquidity\n * @param option - The option for creating a pool and adding liquidity\n * @returns The transaction for creating a pool and adding liquidity\n */\n createPoolAndAddLiquidityPayload(option: CreatePoolAndAddOption): Transaction {\n const {\n bin_step,\n base_factor,\n url,\n active_id,\n coin_type_a,\n coin_type_b,\n bin_infos,\n lower_bin_id,\n upper_bin_id,\n strategy_type,\n use_bin_infos,\n } = option\n\n const tx = new Transaction()\n\n if (isSortedSymbols(fixCoinType(coin_type_a, false), fixCoinType(coin_type_b, false))) {\n handleError(DlmmErrorCode.InvalidCoinTypeSequence, new Error('invalid coin type sequence'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPoolAndAddLiquidityPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const width = upper_bin_id - lower_bin_id + 1\n if (width > MAX_BIN_PER_POSITION) {\n handleError(DlmmErrorCode.InvalidBinWidth, new Error('Width is too large'), {\n [DETAILS_KEYS.METHOD_NAME]: 'openPosition',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n console.log('🚀 ~ createPoolAndAddLiquidityPayload ~ option:', {\n ...option,\n width,\n })\n\n // create pool\n const pool_id = this.createPoolPayload(\n {\n active_id,\n bin_step,\n base_factor,\n coin_type_a,\n coin_type_b,\n },\n tx\n )\n\n // add liquidity\n const addOption: OpenAndAddLiquidityOption = {\n pool_id,\n bin_infos,\n coin_type_a,\n coin_type_b,\n lower_bin_id,\n upper_bin_id,\n active_id,\n strategy_type,\n use_bin_infos,\n max_price_slippage: 0,\n bin_step,\n }\n this.sdk.Position.addLiquidityPayload(addOption, tx)\n\n return tx\n }\n}\n","import { BaseError } from '@cetusprotocol/common-sdk'\n\nexport enum DlmmErrorCode {\n FetchError = 'FetchError',\n ParseError = 'ParseError',\n InvalidStrategyParams = 'InvalidStrategyParams',\n InvalidBinWidth = 'InvalidBinWidth',\n GetObjectError = 'GetObjectError',\n InvalidBinId = 'InvalidBinId',\n InsufficientLiquidity = 'InsufficientLiquidity',\n InvalidParams = 'InvalidParams',\n InvalidCoinTypeSequence = 'InvalidCoinTypeSequence',\n NotFound = 'NotFound',\n AmountTooSmall = 'AmountTooSmall',\n LiquiditySupplyIsZero = 'LiquiditySupplyIsZero',\n InvalidDeltaLiquidity = 'InvalidDeltaLiquidity',\n}\n\nexport class DlmmError extends BaseError {\n constructor(message: string, error_code?: DlmmErrorCode, details?: Record<string, any>) {\n super(message, error_code || 'UnknownError', details)\n }\n\n static isDlmmErrorCode(e: any, code: DlmmErrorCode): boolean {\n return this.isErrorCode<DlmmError>(e, code)\n }\n}\n\nexport const handleError = (code: DlmmErrorCode, error: Error | string, details?: Record<string, any>) => {\n const errorDetails = {\n ...details,\n stack: error instanceof Error ? error.stack : undefined,\n }\n\n if (error instanceof Error) {\n throw new DlmmError(error.message, code, errorDetails)\n } else {\n throw new DlmmError(error, code, errorDetails)\n }\n}\n","import {\n asIntN,\n d,\n DETAILS_KEYS,\n extractStructTagFromType,\n fixCoinType,\n getObjectFields,\n getObjectType,\n MathUtil,\n} from '@cetusprotocol/common-sdk'\nimport { DevInspectResults, SuiEvent, SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { DlmmErrorCode, handleError, DlmmError } from '../errors/errors'\nimport {\n BinAmount,\n BinLiquidityInfo,\n BinManager,\n BinSwap,\n DlmmBasePool,\n DlmmPool,\n DlmmPosition,\n Partner,\n PoolTransactionInfo,\n PositionFee,\n PositionManager,\n PositionReward,\n PreSwapQuote,\n Reward,\n RewardInfo,\n RewardManager,\n RewardPeriodEmission,\n RewardPeriodEmissionFormat,\n StrategyType,\n VariableParameters,\n} from '../types/dlmm'\nimport { BinUtils } from './binUtils'\nimport { BASIS_POINT } from '../types/constants'\nimport { bcs } from '@mysten/sui/bcs'\nimport { blake2b } from 'blakejs'\n\n/**\n * Parse the DLMM base pool data\n * @param data - The DLMM base pool data\n * @returns The DLMM base pool\n */\nexport function parseDlmmBasePool(data: SuiEvent): DlmmBasePool {\n try {\n const fields = data.parsedJson as any\n const pool: DlmmBasePool = {\n id: fields.pool_id,\n bin_step: Number(fields.bin_step),\n coin_type_a: fixCoinType(fields.coin_type_a, false),\n coin_type_b: fixCoinType(fields.coin_type_b, false),\n }\n\n return pool\n } catch (error) {\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseDlmmBasePool',\n [DETAILS_KEYS.REQUEST_PARAMS]: data,\n })\n }\n}\n\n/**\n * Parse the DLMM pool data\n * @param data - The DLMM pool data\n * @returns The DLMM pool\n */\nexport function parseDlmmPool(data: SuiObjectResponse): DlmmPool {\n try {\n const fields = getObjectFields(data)\n const type = getObjectType(data) as string\n const formatType = extractStructTagFromType(type)\n\n const bin_manager: BinManager = {\n bin_step: fields.bin_manager.fields.bin_step,\n bin_manager_handle: fields.bin_manager.fields.bins.fields.id.id,\n size: fields.bin_manager.fields.bins.fields.size,\n }\n\n const position_manager: PositionManager = {\n bin_step: fields.position_manager.fields.bin_step,\n position_index: fields.position_manager.fields.position_index,\n position_handle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n }\n\n const reward_manager_fields = fields.reward_manager.fields\n\n const rewards = reward_manager_fields.rewards.map((reward: any) => {\n const current_reward_rate = reward.fields.current_emission_rate\n const emissions_per_second = MathUtil.fromX64(new BN(current_reward_rate))\n const emissions_per_day = Math.floor(emissions_per_second.toNumber() * 60 * 60 * 24).toString()\n\n const info: Reward = {\n reward_coin: fixCoinType(reward.fields.reward_coin.fields.name, false),\n emissions_per_second: emissions_per_second.toString(),\n emissions_per_day,\n period_emission_rates: {\n id: reward.fields.period_emission_rates.fields.id.id,\n size: reward.fields.period_emission_rates.fields.size,\n },\n }\n return info\n })\n const reward_manager: RewardManager = {\n is_public: reward_manager_fields.is_public,\n emergency_reward_pause: reward_manager_fields.emergency_reward_pause,\n vault: {\n id: reward_manager_fields.vault.fields.id.id,\n size: reward_manager_fields.vault.fields.size,\n },\n rewards,\n last_updated_time: reward_manager_fields.last_updated_time,\n }\n\n const variable_parameters: VariableParameters = {\n volatility_accumulator: fields.v_parameters.fields.volatility_accumulator,\n volatility_reference: fields.v_parameters.fields.volatility_reference,\n index_reference: asIntN(BigInt(fields.v_parameters.fields.index_reference.fields.bits)),\n last_update_timestamp: fields.v_parameters.fields.last_update_timestamp,\n bin_step_config: fields.v_parameters.fields.bin_step_config.fields,\n }\n\n const pool: DlmmPool = {\n id: fields.id.id,\n bin_step: Number(fields.bin_step),\n coin_type_a: fixCoinType(formatType.type_arguments[0], false),\n coin_type_b: fixCoinType(formatType.type_arguments[1], false),\n pool_type: type,\n index: Number(fields.index),\n bin_manager,\n variable_parameters,\n active_id: asIntN(BigInt(fields.active_id.fields.bits)),\n permissions: fields.permissions.fields,\n balance_a: fields.balance_a,\n balance_b: fields.balance_b,\n base_fee_rate: fields.base_fee_rate,\n protocol_fee_a: fields.protocol_fee_a,\n protocol_fee_b: fields.protocol_fee_b,\n url: fields.url,\n reward_manager,\n position_manager,\n }\n pool.bin_step = pool.bin_manager.bin_step\n return pool\n } catch (error) {\n console.log('🚀 ~ parseDlmmPool ~ error:', error)\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseDlmmPool',\n [DETAILS_KEYS.REQUEST_PARAMS]: data,\n })\n }\n}\n\nexport function parsePartner(data: SuiObjectResponse): Partner {\n const fields = getObjectFields(data)\n const type = getObjectType(data) as string\n const formatType = extractStructTagFromType(type)\n\n const partner: Partner = {\n id: fields.id.id,\n name: fields.name,\n ref_fee_rate: d(fields.ref_fee_rate).div(BASIS_POINT).toNumber(),\n start_time: Number(fields.start_time),\n end_time: Number(fields.end_time),\n balances: {\n id: fields.balances.fields.id.id,\n size: fields.balances.fields.size,\n },\n type: formatType.full_address,\n }\n\n return partner\n}\n\nexport function parseDlmmPosition(data: SuiObjectResponse): DlmmPosition {\n try {\n const fields = getObjectFields(data)\n const position: DlmmPosition = {\n uri: fields.uri,\n index: fields.index,\n id: fields.id.id,\n name: fields.name,\n pool_id: fields.pool_id,\n lower_bin_id: asIntN(BigInt(fields.lower_bin_id.fields.bits)),\n upper_bin_id: asIntN(BigInt(fields.upper_bin_id.fields.bits)),\n liquidity_shares: fields.liquidity_shares,\n description: fields.description,\n coin_type_a: fixCoinType(fields.coin_type_a, false),\n coin_type_b: fixCoinType(fields.coin_type_b, false),\n }\n\n return position\n } catch (error) {\n console.log('🚀 ~ parseDlmmPosition ~ error:', error)\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseDlmmPosition',\n [DETAILS_KEYS.REQUEST_PARAMS]: data,\n })\n }\n}\n\nexport function parseLiquidityShares(\n liquidity_shares: string[],\n bin_step: number,\n lower_bin_id: number,\n active_bin: BinAmount\n): BinLiquidityInfo {\n const bins = liquidity_shares.map((liquidity, index) => {\n const bin_id = lower_bin_id + index\n const price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin_id, bin_step)\n if (bin_id === active_bin.bin_id) {\n const { amount_a, amount_b } = BinUtils.calculateOutByShare(active_bin, liquidity)\n return {\n bin_id,\n amount_a,\n amount_b,\n liquidity,\n price_per_lamport,\n }\n }\n\n if (bin_id < active_bin.bin_id) {\n const amount_b = BinUtils.getAmountBFromLiquidity(liquidity)\n return {\n bin_id,\n amount_a: '0',\n amount_b,\n liquidity,\n price_per_lamport,\n }\n }\n\n const q_price = BinUtils.getQPriceFromId(bin_id, bin_step)\n const amount_a = BinUtils.getAmountAFromLiquidity(liquidity, q_price)\n return {\n bin_id,\n amount_a,\n amount_b: '0',\n liquidity,\n price_per_lamport,\n }\n })\n\n const amount_a = bins\n .reduce((acc, bin) => {\n return acc.add(new Decimal(bin.amount_a))\n }, new Decimal(0))\n .toFixed(0)\n\n const amount_b = bins\n .reduce((acc, bin) => {\n return acc.add(new Decimal(bin.amount_b))\n }, new Decimal(0))\n .toFixed(0)\n\n return {\n bins,\n amount_a,\n amount_b,\n }\n}\n\nexport function parseBinInfoList(res: DevInspectResults): BinAmount[] {\n try {\n const bcsCoinAmount = bcs.struct('BinAmount', {\n id: bcs.struct('I32', {\n bits: bcs.u32(),\n }),\n amount_a: bcs.u64(),\n amount_b: bcs.u64(),\n price: bcs.u128(),\n liquidity_supply: bcs.u128(),\n rewards_growth_global: bcs.vector(bcs.u128()),\n fee_a_growth_global: bcs.u128(),\n fee_b_growth_global: bcs.u128(),\n })\n\n const bin_amounts = bcs.vector(bcsCoinAmount).parse(Uint8Array.from(res.results![1].returnValues![0][0]))\n\n return bin_amounts.map((bin_amount) => {\n const bin_id = asIntN(BigInt(bin_amount.id.bits))\n return {\n bin_id,\n amount_a: bin_amount.amount_a,\n amount_b: bin_amount.amount_b,\n liquidity: bin_amount.liquidity_supply,\n price_per_lamport: BinUtils.getPricePerLamportFromQPrice(bin_amount.price),\n }\n })\n } catch (error) {\n console.log('🚀 ~ parseBinInfo ~ error:', error)\n return []\n }\n}\n\nexport function parseBinInfo(fields: any): BinAmount {\n try {\n const bin_id = asIntN(BigInt(fields.id.fields.bits))\n const bin_amount: BinAmount = {\n bin_id,\n amount_a: fields.amount_a,\n amount_b: fields.amount_b,\n liquidity: fields.liquidity_share,\n price_per_lamport: BinUtils.getPricePerLamportFromQPrice(fields.price),\n }\n\n return bin_amount\n } catch (error) {\n return handleError(DlmmErrorCode.ParseError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'parseBinInfo',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n fields,\n },\n })\n }\n}\n\nexport function parsedDlmmPosFeeData(simulate_res: DevInspectResults) {\n const feeData: Record<string, PositionFee> = {}\n const feeValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('pool::CollectFeeEvent')\n })\n\n for (let i = 0; i < feeValueData.length; i += 1) {\n const { parsedJson } = feeValueData[i]\n const posObj = {\n position_id: parsedJson.position,\n fee_owned_a: parsedJson.fee_a,\n fee_owned_b: parsedJson.fee_b,\n }\n feeData[parsedJson.position] = posObj\n }\n\n return feeData\n}\n\nexport function parsedDlmmPosRewardData(simulate_res: DevInspectResults) {\n const rewarderData: Record<string, PositionReward> = {}\n const rewarderValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('pool::CollectRewardEvent')\n })\n\n for (let i = 0; i < rewarderValueData.length; i += 1) {\n const { parsedJson } = rewarderValueData[i]\n const position_id = parsedJson.position\n const reward_coin = parsedJson.reward\n const reward_amount = parsedJson.amount\n const rewardInfo: RewardInfo = {\n coin_type: fixCoinType(reward_coin.name, false),\n reward_owned: reward_amount,\n }\n let rewarder = rewarderData[position_id]\n if (rewarder) {\n rewarder.rewards.push(rewardInfo)\n } else {\n rewarder = {\n position_id,\n rewards: [rewardInfo],\n }\n }\n rewarderData[position_id] = rewarder\n }\n\n return rewarderData\n}\n\nexport function parsedSwapQuoteData(simulate_res: DevInspectResults, a2b: boolean): PreSwapQuote | undefined {\n const rewarderValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('pool::SwapEvent')\n })\n\n for (let i = 0; i < rewarderValueData.length; i += 1) {\n const { parsedJson } = rewarderValueData[i]\n const { partner, pool, amount_in, amount_out, fee, ref_fee, bin_swaps, from, target } = parsedJson\n const bin_swaps_info: BinSwap[] = bin_swaps.map((bin_swap: any) => {\n return {\n bin_id: bin_swap.bin_id.bits,\n in_amount: bin_swap.amount_in,\n out_amount: bin_swap.amount_out,\n fee: bin_swap.fee,\n var_fee_rate: bin_swap.var_fee_rate,\n }\n })\n const info: PreSwapQuote = {\n pool_id: pool,\n a2b,\n in_amount: amount_in,\n out_amount: amount_out,\n ref_fee_amount: ref_fee,\n fee_amount: fee,\n bin_swaps: bin_swaps_info,\n partner,\n from_coin_type: fixCoinType(from.name, false),\n to_coin_type: fixCoinType(target.name, false),\n }\n\n return info\n }\n return undefined\n}\n\nexport function parseStrategyType(strategy_type: StrategyType): number {\n switch (strategy_type) {\n case StrategyType.Spot:\n return 0\n case StrategyType.Curve:\n return 1\n case StrategyType.BidAsk:\n return 2\n }\n}\nexport const poolFilterEvenTypes = ['RemoveLiquidityEvent', 'SwapEvent', 'AddLiquidityEvent', 'ClosePositionEvent']\nexport function parsePoolTransactionInfo(data: SuiTransactionBlockResponse, txIndex: number, package_id: string, pool_id: string) {\n const list: PoolTransactionInfo[] = []\n const { timestampMs, events } = data\n\n events?.forEach((event: any, index) => {\n const { name: type, address: package_address } = extractStructTagFromType(event.type)\n if (poolFilterEvenTypes.includes(type) && package_address === package_id && pool_id === event.parsedJson.pool) {\n const info: PoolTransactionInfo = {\n tx: event.id.txDigest,\n sender: event.sender,\n type: event.type,\n block_time: timestampMs || '0',\n index: `${txIndex}_${index}`,\n parsed_json: event.parsedJson,\n }\n list.push(info)\n }\n })\n\n return list\n}\n\nexport function generateRewardSchedule(baseTime: number, maxIntervals: number, timeInterval: number): number[] {\n const result: number[] = []\n\n let intervals = 0 // Start from 0 to include base time if needed\n const baseDateTime = new Date(baseTime * 1000).getTime() // Convert seconds to milliseconds\n const nowTime = new Date().getTime()\n while (true) {\n const rewardTime = baseDateTime + intervals * timeInterval\n\n if (rewardTime >= nowTime) {\n result.push(rewardTime)\n }\n\n if (intervals >= maxIntervals) {\n break\n }\n\n intervals += 1\n }\n\n return result\n}\n\nexport function parseRewardPeriodEmission(\n periodEmissionList: RewardPeriodEmission[],\n startTimeInSeconds: number,\n endTimeInSeconds: number,\n durationSeconds: number\n) {\n const result: RewardPeriodEmissionFormat[] = []\n for (let time = startTimeInSeconds; time <= endTimeInSeconds; time += durationSeconds) {\n const findRewardPeriodEmission = periodEmissionList.findLast((period) => d(time).gte(period.time))\n if (findRewardPeriodEmission) {\n result.push({\n time: time.toString(),\n emissions_per_second: findRewardPeriodEmission.emissions_per_second,\n emissions_per_day: findRewardPeriodEmission.emissions_per_day,\n visualized_time: new Date(time * 1000).toLocaleString(),\n })\n } else {\n result.push({\n emissions_per_day: '0',\n time: time.toString(),\n emissions_per_second: '0',\n visualized_time: new Date(time * 1000).toLocaleString(),\n })\n }\n }\n return result\n}\n\nexport function parseCurrentRewardPeriodEmission(periodEmissionList: RewardPeriodEmission[]): RewardPeriodEmission | undefined {\n if (periodEmissionList.length === 0) {\n return undefined\n }\n const currentTime = new Date().getTime() / 1000\n const findRewardPeriodEmission = periodEmissionList.findLast((period) => d(currentTime).gte(period.time))\n if (findRewardPeriodEmission) {\n return findRewardPeriodEmission\n }\n return periodEmissionList[periodEmissionList.length - 1]\n}\n\nexport function safeMulAmount(amount: Decimal, rate: Decimal): Decimal {\n const result = amount.mul(rate)\n if (result.gt(0) && result.lt(1)) {\n throw new DlmmError(`Multiplication ${result} is less than 1`, DlmmErrorCode.AmountTooSmall)\n }\n return result.floor()\n}\n\nexport function safeAmount(amount: Decimal): Decimal {\n if (amount.gt(0) && amount.lt(1)) {\n throw new DlmmError(`Multiplication ${amount.toString()} is less than 1`, DlmmErrorCode.AmountTooSmall)\n }\n return amount.floor()\n}\n\nexport function getRouterModule(strategy_type: StrategyType) {\n switch (strategy_type) {\n case StrategyType.Spot:\n return 'spot'\n case StrategyType.Curve:\n return 'curve'\n case StrategyType.BidAsk:\n return 'bid_ask'\n }\n}\n\nexport function buildPoolKey(coin_type_a: string, coin_type_b: string, bin_step: number, base_factor: number) {\n // Convert coin types to bytes\n let coinABytes = Buffer.from(coin_type_a, 'utf8')\n const coinBBytes = Buffer.from(coin_type_b, 'utf8')\n\n const lenB = coinBBytes.length\n\n let i = 0\n\n // Append coinB bytes to coinA (without validation)\n while (i < lenB) {\n const byteB = coinBBytes[i]\n coinABytes = Buffer.concat([coinABytes, Buffer.from([byteB])])\n i++\n }\n\n // Serialize bin_step and base_factor using BCS\n const binStepBytes = bcs.u16().serialize(bin_step).toBytes()\n const baseFactorBytes = bcs.u16().serialize(base_factor).toBytes()\n\n // Concatenate all bytes\n const combinedBytes = Buffer.concat([coinABytes, binStepBytes, baseFactorBytes])\n\n // Hash with blake2b256\n const hash = blake2b(combinedBytes, undefined, 32)\n\n return `0x${Buffer.from(hash).toString('hex')}`\n}\n","/*!\r\n * decimal.js v10.6.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licence\r\n */\r\n\r\n\r\n// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The maximum exponent magnitude.\r\n // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15, // 0 to 9e15\r\n\r\n // The limit on the value of `precision`, and on the value of the first argument to\r\n // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n // Base conversion alphabet.\r\n NUMERALS = '0123456789abcdef',\r\n\r\n // The natural logarithm of 10 (1025 digits).\r\n LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n // Pi (1025 digits).\r\n PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n DEFAULTS = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `Decimal.config({ precision: 20 });`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used when rounding to `precision`.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `Decimal.rounding = 4;`\r\n // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n rounding: 4, // 0 to 8\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend (JavaScript %).\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 The IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n //\r\n // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n // be used, but they may not give useful results.\r\n modulo: 1, // 0 to 9\r\n\r\n // The exponent value at and beneath which `toString` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -EXP_LIMIT\r\n\r\n // The exponent value at and above which `toString` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to EXP_LIMIT\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // JavaScript numbers: -324 (5e-324)\r\n minE: -EXP_LIMIT, // -1 to -EXP_LIMIT\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // JavaScript numbers: 308 (1.7976931348623157e+308)\r\n maxE: EXP_LIMIT, // 1 to EXP_LIMIT\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n crypto: false // true/false\r\n },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n inexact, quadrant,\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n cryptoUnavailable = decimalError + 'crypto unavailable',\r\n tag = '[object Decimal]',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n LN10_PRECISION = LN10.length - 1,\r\n PI_PRECISION = PI.length - 1,\r\n\r\n // Decimal.prototype object\r\n P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n * absoluteValue abs\r\n * ceil\r\n * clampedTo clamp\r\n * comparedTo cmp\r\n * cosine cos\r\n * cubeRoot cbrt\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy divToInt\r\n * equals eq\r\n * floor\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * hyperbolicCosine cosh\r\n * hyperbolicSine sinh\r\n * hyperbolicTangent tanh\r\n * inverseCosine acos\r\n * inverseHyperbolicCosine acosh\r\n * inverseHyperbolicSine asinh\r\n * inverseHyperbolicTangent atanh\r\n * inverseSine asin\r\n * inverseTangent atan\r\n * isFinite\r\n * isInteger isInt\r\n * isNaN\r\n * isNegative isNeg\r\n * isPositive isPos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * [maximum] [max]\r\n * [minimum] [min]\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * round\r\n * sine sin\r\n * squareRoot sqrt\r\n * tangent tan\r\n * times mul\r\n * toBinary\r\n * toDecimalPlaces toDP\r\n * toExponential\r\n * toFixed\r\n * toFraction\r\n * toHexadecimal toHex\r\n * toNearest\r\n * toNumber\r\n * toOctal\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits toSD\r\n * toString\r\n * truncated trunc\r\n * valueOf toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s < 0) x.s = 1;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n var k,\r\n x = this,\r\n Ctor = x.constructor;\r\n min = new Ctor(min);\r\n max = new Ctor(max);\r\n if (!min.s || !max.s) return new Ctor(NaN);\r\n if (min.gt(max)) throw Error(invalidArgument + max);\r\n k = x.cmp(min);\r\n return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `y`,\r\n * -1 if the value of this Decimal is less than the value of `y`,\r\n * 0 if they have the same value,\r\n * NaN if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this,\r\n xd = x.d,\r\n yd = (y = new x.constructor(y)).d,\r\n xs = x.s,\r\n ys = y.s;\r\n\r\n // Either NaN or ±Infinity?\r\n if (!xd || !yd) {\r\n return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Either zero?\r\n if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n // Signs differ?\r\n if (xs !== ys) return xs;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0) = 1\r\n * cos(-0) = 1\r\n * cos(Infinity) = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN) = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.d) return new Ctor(NaN);\r\n\r\n // cos(0) = cos(-0) = 1\r\n if (!x.d[0]) return new Ctor(1);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * cbrt(0) = 0\r\n * cbrt(-0) = -0\r\n * cbrt(1) = 1\r\n * cbrt(-1) = -1\r\n * cbrt(N) = N\r\n * cbrt(-I) = -I\r\n * cbrt(I) = I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n // Math.cbrt underflow/overflow?\r\n // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n if (!s || Math.abs(s) == 1 / 0) {\r\n n = digitsToString(x.d);\r\n e = x.e;\r\n\r\n // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n s = mathpow(n, 1 / 3);\r\n\r\n // Rarely, e may be one less than the result exponent value.\r\n e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n r.s = x.s;\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Halley's method.\r\n // TODO? Compare Newton's method.\r\n for (;;) {\r\n t = r;\r\n t3 = t.times(t).times(t);\r\n t3plusx = t3.plus(x);\r\n r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n // , i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n var w,\r\n d = this.d,\r\n n = NaN;\r\n\r\n if (d) {\r\n w = d.length - 1;\r\n n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) n--;\r\n if (n < 0) n = 0;\r\n }\r\n\r\n return n;\r\n};\r\n\r\n\r\n/*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n var k = this.cmp(y);\r\n return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0) = 1\r\n * cosh(-0) = 1\r\n * cosh(Infinity) = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN) = NaN\r\n *\r\n * x time taken (ms) result\r\n * 1000 9 9.8503555700852349694e+433\r\n * 10000 25 4.4034091128314607936e+4342\r\n * 100000 171 1.4033316802130615897e+43429\r\n * 1000000 3817 1.5166076984010437725e+434294\r\n * 10000000 abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n var k, n, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor,\r\n one = new Ctor(1);\r\n\r\n if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n if (x.isZero()) return one;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n // TODO? Estimation reused from cosine() and may not be optimal here.\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n n = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n n = '2.3283064365386962890625e-10';\r\n }\r\n\r\n x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n // Reverse argument reduction\r\n var cosh2_x,\r\n i = k,\r\n d8 = new Ctor(8);\r\n for (; i--;) {\r\n cosh2_x = x.times(x);\r\n x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n }\r\n\r\n return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0) = 0\r\n * sinh(-0) = -0\r\n * sinh(Infinity) = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN) = NaN\r\n *\r\n * x time taken (ms)\r\n * 10 2 ms\r\n * 100 5 ms\r\n * 1000 14 ms\r\n * 10000 82 ms\r\n * 100000 886 ms 1.4033316802130615897e+43429\r\n * 200000 2613 ms\r\n * 300000 5407 ms\r\n * 400000 8824 ms\r\n * 500000 13026 ms 8.7080643612718084129e+217146\r\n * 1000000 48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n var k, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n } else {\r\n\r\n // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n // 3 multiplications and 1 addition\r\n\r\n // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n // 4 multiplications and 2 additions\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n // Reverse argument reduction\r\n var sinh2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sinh2_x = x.times(x);\r\n x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n }\r\n }\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0) = 0\r\n * tanh(-0) = -0\r\n * tanh(Infinity) = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN) = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(x.s);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 7;\r\n Ctor.rounding = 1;\r\n\r\n return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0) = pi/2\r\n * acos(-0) = pi/2\r\n * acos(1) = 0\r\n * acos(-1) = pi\r\n * acos(1/2) = pi/3\r\n * acos(-1/2) = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN) = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n k = x.abs().cmp(1),\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n return k === 0\r\n // |x| is 1\r\n ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n // |x| > 1 or x is NaN\r\n : new Ctor(NaN);\r\n }\r\n\r\n if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n // See https://github.com/MikeMcl/decimal.js/pull/217\r\n x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1) = NaN\r\n * acosh(NaN) = NaN\r\n * acosh(Infinity) = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0) = NaN\r\n * acosh(-0) = NaN\r\n * acosh(1) = 0\r\n * acosh(-1) = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n if (!x.isFinite()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN) = NaN\r\n * asinh(Infinity) = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0) = 0\r\n * asinh(-0) = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1) = NaN\r\n * atanh(NaN) = NaN\r\n * atanh(Infinity) = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0) = 0\r\n * atanh(-0) = -0\r\n * atanh(1) = Infinity\r\n * atanh(-1) = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n var pr, rm, wpr, xsd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n xsd = x.sd();\r\n\r\n if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n Ctor.precision = wpr = xsd - x.e;\r\n\r\n x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n Ctor.precision = pr + 4;\r\n Ctor.rounding = 1;\r\n\r\n x = x.ln();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0) = 0\r\n * asin(-0) = -0\r\n * asin(1/2) = pi/6\r\n * asin(-1/2) = -pi/6\r\n * asin(1) = pi/2\r\n * asin(-1) = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN) = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n var halfPi, k,\r\n pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n k = x.abs().cmp(1);\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n\r\n // |x| is 1\r\n if (k === 0) {\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n halfPi.s = x.s;\r\n return halfPi;\r\n }\r\n\r\n // |x| > 1 or x is NaN\r\n return new Ctor(NaN);\r\n }\r\n\r\n // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0) = 0\r\n * atan(-0) = -0\r\n * atan(1) = pi/4\r\n * atan(-1) = -pi/4\r\n * atan(Infinity) = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN) = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n var i, j, k, n, px, t, r, wpr, x2,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (!x.isFinite()) {\r\n if (!x.s) return new Ctor(NaN);\r\n if (pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n r.s = x.s;\r\n return r;\r\n }\r\n } else if (x.isZero()) {\r\n return new Ctor(x);\r\n } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n r.s = x.s;\r\n return r;\r\n }\r\n\r\n Ctor.precision = wpr = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n // Argument reduction\r\n // Ensure |x| < 0.42\r\n // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n external = false;\r\n\r\n j = Math.ceil(wpr / LOG_BASE);\r\n n = 1;\r\n x2 = x.times(x);\r\n r = new Ctor(x);\r\n px = x;\r\n\r\n // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n for (; i !== -1;) {\r\n px = px.times(x2);\r\n t = r.minus(px.div(n += 2));\r\n\r\n px = px.times(x2);\r\n r = t.plus(px.div(n += 2));\r\n\r\n if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n }\r\n\r\n if (k) r = r.times(2 << (k - 1));\r\n\r\n external = true;\r\n\r\n return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a) = NaN\r\n * log[0](a) = NaN\r\n * log[1](a) = NaN\r\n * log[NaN](a) = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0) = -Infinity\r\n * log[b](-0) = -Infinity\r\n * log[b](-a) = NaN\r\n * log[b](1) = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN) = NaN\r\n *\r\n * [base] {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n var isBase10, d, denominator, k, inf, num, sd, r,\r\n arg = this,\r\n Ctor = arg.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding,\r\n guard = 5;\r\n\r\n // Default base is 10.\r\n if (base == null) {\r\n base = new Ctor(10);\r\n isBase10 = true;\r\n } else {\r\n base = new Ctor(base);\r\n d = base.d;\r\n\r\n // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n isBase10 = base.eq(10);\r\n }\r\n\r\n d = arg.d;\r\n\r\n // Is arg negative, non-finite, 0 or 1?\r\n if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n }\r\n\r\n // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n // integer power of 10.\r\n if (isBase10) {\r\n if (d.length > 1) {\r\n inf = true;\r\n } else {\r\n for (k = d[0]; k % 10 === 0;) k /= 10;\r\n inf = k !== 1;\r\n }\r\n }\r\n\r\n external = false;\r\n sd = pr + guard;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n // The result will have 5 rounding digits.\r\n r = divide(num, denominator, sd, 1);\r\n\r\n // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n // calculate 10 further digits.\r\n //\r\n // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n // further digits, the last 14 are nines, round up and assume the result is exact.\r\n // Also assume the result is exact if the last 14 are zero.\r\n //\r\n // Example of a result that will be incorrectly rounded:\r\n // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n // place is still 2.6.\r\n if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n do {\r\n sd += 10;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n r = divide(num, denominator, sd, 1);\r\n\r\n if (!inf) {\r\n\r\n // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n\r\n break;\r\n }\r\n } while (checkRoundingDigits(r.d, k += 10, rm));\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, -1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return y negated if x is finite and y is ±Infinity.\r\n else if (x.d) y.s = -y.s;\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with different signs.\r\n // Return NaN if both are ±Infinity with the same sign.\r\n else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.plus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return y negated if x is zero and y is non-zero.\r\n if (yd[0]) y.s = -y.s;\r\n\r\n // Return x if y is zero and x is non-zero.\r\n else if (xd[0]) y = new Ctor(x);\r\n\r\n // Return zero if both are zero.\r\n // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n e = mathfloor(y.e / LOG_BASE);\r\n xe = mathfloor(x.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of\r\n // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to `xd` if shorter.\r\n // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n // Return x if y is ±Infinity or x is ±0.\r\n if (!y.d || x.d && !x.d[0]) {\r\n return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n }\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n\r\n if (Ctor.modulo == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // result = x - q * y where 0 <= result < abs(y)\r\n q = divide(x, y.abs(), 0, 3, 1);\r\n q.s *= y.s;\r\n } else {\r\n q = divide(x, y, 0, Ctor.modulo, 1);\r\n }\r\n\r\n q = q.times(y);\r\n\r\n external = true;\r\n\r\n return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with the same sign.\r\n // Return NaN if both are ±Infinity with different signs.\r\n // Return y if x is finite and y is ±Infinity.\r\n else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.minus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!yd[0]) y = new Ctor(x);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n k = mathfloor(x.e / LOG_BASE);\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n var k,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n if (x.d) {\r\n k = getPrecision(x.d);\r\n if (z && x.e + 1 > k) k = x.e + 1;\r\n } else {\r\n k = NaN;\r\n }\r\n\r\n return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0) = 0\r\n * sin(-0) = -0\r\n * sin(Infinity) = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN) = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n var m, n, sd, r, rep, t,\r\n x = this,\r\n d = x.d,\r\n e = x.e,\r\n s = x.s,\r\n Ctor = x.constructor;\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !d || !d[0]) {\r\n return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n }\r\n\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(d);\r\n\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0) = 0\r\n * tan(-0) = -0\r\n * tan(Infinity) = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN) = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n x = x.sin();\r\n x.s = 1;\r\n x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n y.s *= x.s;\r\n\r\n // If either is NaN, ±Infinity or ±0...\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n // Return NaN if either is NaN.\r\n // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n ? NaN\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n // Return ±0 if either is ±0.\r\n : !xd || !yd ? y.s / 0 : y.s * 0);\r\n }\r\n\r\n e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = getBase10Exponent(r, e);\r\n\r\n return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), dp + 1, rm);\r\n str = finiteToString(x, true, dp + 1);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n str = finiteToString(y, false, dp + y.e + 1);\r\n }\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `x` rather than `y`.\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|bigint|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n x = this,\r\n xd = x.d,\r\n Ctor = x.constructor;\r\n\r\n if (!xd) return new Ctor(x);\r\n\r\n n1 = d0 = new Ctor(1);\r\n d1 = n0 = new Ctor(0);\r\n\r\n d = new Ctor(d1);\r\n e = d.e = getPrecision(xd) - x.e - 1;\r\n k = e % LOG_BASE;\r\n d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n if (maxD == null) {\r\n\r\n // d is 10**e, the minimum max-denominator needed.\r\n maxD = e > 0 ? d : n1;\r\n } else {\r\n n = new Ctor(maxD);\r\n if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n }\r\n\r\n external = false;\r\n n = new Ctor(digitsToString(xd));\r\n pr = Ctor.precision;\r\n Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n for (;;) {\r\n q = divide(n, d, 0, 1, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.cmp(maxD) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n d2 = n1;\r\n n1 = n0.plus(q.times(d2));\r\n n0 = d2;\r\n d2 = d;\r\n d = n.minus(q.times(d2));\r\n n = d2;\r\n }\r\n\r\n d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n ? [n1, d1] : [n0, d0];\r\n\r\n Ctor.precision = pr;\r\n external = true;\r\n\r\n return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|bigint|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n\r\n if (y == null) {\r\n\r\n // If x is not finite, return x.\r\n if (!x.d) return x;\r\n\r\n y = new Ctor(1);\r\n rm = Ctor.rounding;\r\n } else {\r\n y = new Ctor(y);\r\n if (rm === void 0) {\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(rm, 0, 8);\r\n }\r\n\r\n // If x is not finite, return x if y is not NaN, else NaN.\r\n if (!x.d) return y.s ? x : y;\r\n\r\n // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n if (!y.d) {\r\n if (y.s) y.s = x.s;\r\n return y;\r\n }\r\n }\r\n\r\n // If y is not zero, calculate the nearest multiple of y to x.\r\n if (y.d[0]) {\r\n external = false;\r\n x = divide(x, y, 0, rm, 1).times(y);\r\n external = true;\r\n finalise(x);\r\n\r\n // If y is zero, return zero with the sign of x.\r\n } else {\r\n y.s = x.s;\r\n x = y;\r\n }\r\n\r\n return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n * pow(x, NaN) = NaN\r\n * pow(x, ±0) = 1\r\n\r\n * pow(NaN, non-zero) = NaN\r\n * pow(abs(x) > 1, +Infinity) = +Infinity\r\n * pow(abs(x) > 1, -Infinity) = +0\r\n * pow(abs(x) == 1, ±Infinity) = NaN\r\n * pow(abs(x) < 1, +Infinity) = +0\r\n * pow(abs(x) < 1, -Infinity) = +Infinity\r\n * pow(+Infinity, y > 0) = +Infinity\r\n * pow(+Infinity, y < 0) = +0\r\n * pow(-Infinity, odd integer > 0) = -Infinity\r\n * pow(-Infinity, even integer > 0) = +Infinity\r\n * pow(-Infinity, odd integer < 0) = -0\r\n * pow(-Infinity, even integer < 0) = +0\r\n * pow(+0, y > 0) = +0\r\n * pow(+0, y < 0) = +Infinity\r\n * pow(-0, odd integer > 0) = -0\r\n * pow(-0, even integer > 0) = +0\r\n * pow(-0, odd integer < 0) = -Infinity\r\n * pow(-0, even integer < 0) = +Infinity\r\n * pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|bigint|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n var e, k, pr, r, rm, s,\r\n x = this,\r\n Ctor = x.constructor,\r\n yn = +(y = new Ctor(y));\r\n\r\n // Either ±Infinity, NaN or ±0?\r\n if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n x = new Ctor(x);\r\n\r\n if (x.eq(1)) return x;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n // y exponent\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = intPow(Ctor, x, k, pr);\r\n return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n }\r\n\r\n s = x.s;\r\n\r\n // if x is negative\r\n if (s < 0) {\r\n\r\n // if y is not an integer\r\n if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n // Result is positive if x is negative and the last digit of integer y is even.\r\n if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n // if x.eq(-1)\r\n if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n x.s = s;\r\n return x;\r\n }\r\n }\r\n\r\n // Estimate result exponent.\r\n // x^y = 10^e, where e = y * log10(x)\r\n // log10(x) = log10(x_significand) + x_exponent\r\n // log10(x_significand) = ln(x_significand) / ln(10)\r\n k = mathpow(+x, yn);\r\n e = k == 0 || !isFinite(k)\r\n ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n : new Ctor(k + '').e;\r\n\r\n // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n // Overflow/underflow?\r\n if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n external = false;\r\n Ctor.rounding = x.s = 1;\r\n\r\n // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n // new Decimal(2.32456).pow('2087987436534566.46411')\r\n // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n k = Math.min(12, (e + '').length);\r\n\r\n // r = x^y = exp(y*ln(x))\r\n r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n if (r.d) {\r\n\r\n // Truncate to the required precision plus five rounding digits.\r\n r = finalise(r, pr + 5, 1);\r\n\r\n // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n // the result.\r\n if (checkRoundingDigits(r.d, pr, rm)) {\r\n e = pr + 10;\r\n\r\n // Truncate to the increased precision plus five rounding digits.\r\n r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n }\r\n }\r\n\r\n r.s = s;\r\n external = true;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), sd, rm);\r\n str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n * finiteToString, naturalExponential, naturalLogarithm\r\n * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n * P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n * convertBase toStringBinary, parseOther\r\n * cos P.cos\r\n * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n * taylorSeries, atan2, parseOther\r\n * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n * P.truncated, divide, getLn10, getPi, naturalExponential,\r\n * naturalLogarithm, ceil, floor, round, trunc\r\n * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n * toStringBinary\r\n * getBase10Exponent P.minus, P.plus, P.times, parseOther\r\n * getLn10 P.logarithm, naturalLogarithm\r\n * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n * getPrecision P.precision, P.toFraction\r\n * getZeroString digitsToString, finiteToString\r\n * intPow P.toPower, parseOther\r\n * isOdd toLessThanHalfPi\r\n * maxOrMin max, min\r\n * naturalExponential P.naturalExponential, P.toPower\r\n * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n * P.toPower, naturalExponential\r\n * nonFiniteToString finiteToString, toStringBinary\r\n * parseDecimal Decimal\r\n * parseOther Decimal\r\n * sin P.sin\r\n * taylorSeries P.cosh, P.sinh, cos, sin\r\n * toLessThanHalfPi P.cos, P.sin\r\n * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal\r\n * truncate intPow\r\n *\r\n * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n * naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n var di, k, r, rd;\r\n\r\n // Get the length of the first word of the array d.\r\n for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n // Is the rounding digit in the first word of d?\r\n if (--i < 0) {\r\n i += LOG_BASE;\r\n di = 0;\r\n } else {\r\n di = Math.ceil((i + 1) / LOG_BASE);\r\n i %= LOG_BASE;\r\n }\r\n\r\n // i is the index (0 - 6) of the rounding digit.\r\n // E.g. if within the word 3487563 the first rounding digit is 5,\r\n // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n k = mathpow(10, LOG_BASE - i);\r\n rd = d[di] % k | 0;\r\n\r\n if (repeating == null) {\r\n if (i < 3) {\r\n if (i == 0) rd = rd / 100 | 0;\r\n else if (i == 1) rd = rd / 10 | 0;\r\n r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n } else {\r\n r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n }\r\n } else {\r\n if (i < 4) {\r\n if (i == 0) rd = rd / 1000 | 0;\r\n else if (i == 1) rd = rd / 100 | 0;\r\n else if (i == 2) rd = rd / 10 | 0;\r\n r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n } else {\r\n r = ((repeating || rm < 4) && rd + 1 == k ||\r\n (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n }\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n strL = str.length;\r\n\r\n for (; i < strL;) {\r\n for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n for (j = 0; j < arr.length; j++) {\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n var k, len, y;\r\n\r\n if (x.isZero()) return x;\r\n\r\n // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n len = x.d.length;\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n y = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n y = '2.3283064365386962890625e-10';\r\n }\r\n\r\n Ctor.precision += k;\r\n\r\n x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n // Reverse argument reduction\r\n for (var i = k; i--;) {\r\n var cos2x = x.times(x);\r\n x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n }\r\n\r\n Ctor.precision -= k;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k, base) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % base | 0;\r\n carry = temp / base | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, rm, dp, base) {\r\n var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n }\r\n\r\n if (base) {\r\n logBase = 1;\r\n e = x.e - y.e;\r\n } else {\r\n base = BASE;\r\n logBase = LOG_BASE;\r\n e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n }\r\n\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else if (dp) {\r\n sd = pr + (x.e - y.e) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) {\r\n qd.push(1);\r\n more = true;\r\n } else {\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / logBase + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * base + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n more = k || i < xL;\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= base/2\r\n k = base / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k, base);\r\n xd = multiplyInteger(xd, k, base);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= base / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= base) k = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL, base);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n more = rem[0] !== void 0;\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n }\r\n\r\n // logBase is 1 when divide is being used for base conversion.\r\n if (logBase == 1) {\r\n q.e = e;\r\n inexact = more;\r\n } else {\r\n\r\n // To calculate q.e, first get the number of digits of qd[0].\r\n for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n q.e = i + e * logBase - 1;\r\n\r\n finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n }\r\n\r\n return q;\r\n };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n Ctor = x.constructor;\r\n\r\n // Don't round if sd is null or undefined.\r\n out: if (sd != null) {\r\n xd = x.d;\r\n\r\n // Infinity/NaN.\r\n if (!xd) return x;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd containing rd, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // digits: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n i = sd - digits;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) {\r\n if (isTruncated) {\r\n\r\n // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n for (; k++ <= xdi;) xd.push(0);\r\n w = rd = 0;\r\n digits = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - digits.\r\n j = i - LOG_BASE + digits;\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n }\r\n }\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n isTruncated = isTruncated || sd < 0 ||\r\n xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n // will give 714.\r\n\r\n roundUp = rm < 4\r\n ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xd[0]) {\r\n xd.length = 0;\r\n if (roundUp) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xd[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (roundUp) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n\r\n // i will be the length of xd[0] before k is added.\r\n for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n j = xd[0] += k;\r\n for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xd[0] == BASE) xd[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n }\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > Ctor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < Ctor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // Ctor.underflow = true;\r\n } // else Ctor.underflow = false;\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n if (!x.isFinite()) return nonFiniteToString(x);\r\n var k,\r\n e = x.e,\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n var w = digits[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n if (sd > LN10_PRECISION) {\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(precisionLimitExceeded);\r\n }\r\n return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n var w = digits.length - 1,\r\n len = w * LOG_BASE + 1;\r\n\r\n w = digits[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) len--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = digits[0]; w >= 10; w /= 10) len++;\r\n }\r\n\r\n return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n var isTruncated,\r\n r = new Ctor(1),\r\n\r\n // Max n of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (n % 2) {\r\n r = r.times(x);\r\n if (truncate(r.d, k)) isTruncated = true;\r\n }\r\n\r\n n = mathfloor(n / 2);\r\n if (n === 0) {\r\n\r\n // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n n = r.d.length - 1;\r\n if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n break;\r\n }\r\n\r\n x = x.times(x);\r\n truncate(x.d, k);\r\n }\r\n\r\n external = true;\r\n\r\n return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n var k, y,\r\n x = new Ctor(args[0]),\r\n i = 0;\r\n\r\n for (; ++i < args.length;) {\r\n y = new Ctor(args[i]);\r\n\r\n // NaN?\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n }\r\n\r\n k = x.cmp(y);\r\n\r\n if (k === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(Infinity) = Infinity\r\n * exp(-Infinity) = 0\r\n * exp(NaN) = NaN\r\n * exp(±0) = 1\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n * The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n var denominator, guard, j, pow, sum, t, wpr,\r\n rep = 0,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // 0/NaN/Infinity?\r\n if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n return new Ctor(x.d\r\n ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n // while abs(x) >= 0.1\r\n while (x.e > -2) {\r\n\r\n // x = x / 2^5\r\n x = x.times(t);\r\n k += 5;\r\n }\r\n\r\n // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n // necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(1);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = finalise(pow.times(x), wpr, 1);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n j = k;\r\n while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n // Check to see if the first 4 rounding digits are [49]999.\r\n // If so, repeat the summation with a higher precision, otherwise\r\n // e.g. with precision: 18, rounding: 1\r\n // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n\r\n if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += 10;\r\n denominator = pow = t = new Ctor(1);\r\n i = 0;\r\n rep++;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * ln(-n) = NaN\r\n * ln(0) = -Infinity\r\n * ln(-0) = -Infinity\r\n * ln(1) = 0\r\n * ln(Infinity) = Infinity\r\n * ln(-Infinity) = NaN\r\n * ln(NaN) = NaN\r\n *\r\n * ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // Is x negative or Infinity, NaN, 0 or 1?\r\n if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n Ctor.precision = wpr += guard;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n\r\n if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = x.e;\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n Ctor.precision = pr;\r\n\r\n return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n }\r\n\r\n // x1 is x reduced to a value near 1.\r\n x1 = x;\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = finalise(numerator.times(x2), wpr, 1);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n // been repeated previously) and the first 4 rounding digits 9999?\r\n // If so, restart the summation with a higher precision, otherwise\r\n // e.g. with precision: 12, rounding: 1\r\n // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += guard;\r\n t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = rep = 1;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n // Unsigned.\r\n return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n x.e = e = e - i - 1;\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > x.constructor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < x.constructor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // x.constructor.underflow = true;\r\n } // else x.constructor.underflow = false;\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n if (str.indexOf('_') > -1) {\r\n str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n if (isDecimal.test(str)) return parseDecimal(x, str);\r\n } else if (str === 'Infinity' || str === 'NaN') {\r\n if (!+str) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return x;\r\n }\r\n\r\n if (isHex.test(str)) {\r\n base = 16;\r\n str = str.toLowerCase();\r\n } else if (isBinary.test(str)) {\r\n base = 2;\r\n } else if (isOctal.test(str)) {\r\n base = 8;\r\n } else {\r\n throw Error(invalidArgument + str);\r\n }\r\n\r\n // Is there a binary exponent part?\r\n i = str.search(/p/i);\r\n\r\n if (i > 0) {\r\n p = +str.slice(i + 1);\r\n str = str.substring(2, i);\r\n } else {\r\n str = str.slice(2);\r\n }\r\n\r\n // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n // fraction part will be restored.\r\n i = str.indexOf('.');\r\n isFloat = i >= 0;\r\n Ctor = x.constructor;\r\n\r\n if (isFloat) {\r\n str = str.replace('.', '');\r\n len = str.length;\r\n i = len - i;\r\n\r\n // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n }\r\n\r\n xd = convertBase(str, base, BASE);\r\n xe = xd.length - 1;\r\n\r\n // Remove trailing zeros.\r\n for (i = xe; xd[i] === 0; --i) xd.pop();\r\n if (i < 0) return new Ctor(x.s * 0);\r\n x.e = getBase10Exponent(xd, xe);\r\n x.d = xd;\r\n external = false;\r\n\r\n // At what precision to perform the division to ensure exact conversion?\r\n // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n // Therefore using 4 * the number of digits of str will always be enough.\r\n if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n // Multiply by the binary exponent part if present.\r\n if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n external = true;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n var k,\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n }\r\n\r\n // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x);\r\n\r\n // Reverse argument reduction\r\n var sin2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sin2_x = x.times(x);\r\n x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n var j, t, u, x2,\r\n i = 1,\r\n pr = Ctor.precision,\r\n k = Math.ceil(pr / LOG_BASE);\r\n\r\n external = false;\r\n x2 = x.times(x);\r\n u = new Ctor(y);\r\n\r\n for (;;) {\r\n t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n t = u.plus(y);\r\n\r\n if (t.d[k] !== void 0) {\r\n for (j = k; t.d[j] === u.d[j] && j--;);\r\n if (j == -1) break;\r\n }\r\n\r\n j = u;\r\n u = y;\r\n y = t;\r\n t = j;\r\n i++;\r\n }\r\n\r\n external = true;\r\n t.d.length = k + 1;\r\n\r\n return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n var n = b;\r\n while (--e) n *= b;\r\n return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n var t,\r\n isNeg = x.s < 0,\r\n pi = getPi(Ctor, Ctor.precision, 1),\r\n halfPi = pi.times(0.5);\r\n\r\n x = x.abs();\r\n\r\n if (x.lte(halfPi)) {\r\n quadrant = isNeg ? 4 : 1;\r\n return x;\r\n }\r\n\r\n t = x.divToInt(pi);\r\n\r\n if (t.isZero()) {\r\n quadrant = isNeg ? 3 : 2;\r\n } else {\r\n x = x.minus(t.times(pi));\r\n\r\n // 0 <= x < pi\r\n if (x.lte(halfPi)) {\r\n quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n return x;\r\n }\r\n\r\n quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n }\r\n\r\n return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n var base, e, i, k, len, roundUp, str, xd, y,\r\n Ctor = x.constructor,\r\n isExp = sd !== void 0;\r\n\r\n if (isExp) {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n } else {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n }\r\n\r\n if (!x.isFinite()) {\r\n str = nonFiniteToString(x);\r\n } else {\r\n str = finiteToString(x);\r\n i = str.indexOf('.');\r\n\r\n // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n if (isExp) {\r\n base = 2;\r\n if (baseOut == 16) {\r\n sd = sd * 4 - 3;\r\n } else if (baseOut == 8) {\r\n sd = sd * 3 - 2;\r\n }\r\n } else {\r\n base = baseOut;\r\n }\r\n\r\n // Convert the number as an integer then divide the result by its base raised to a power such\r\n // that the fraction part will be restored.\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n str = str.replace('.', '');\r\n y = new Ctor(1);\r\n y.e = str.length - i;\r\n y.d = convertBase(finiteToString(y), 10, base);\r\n y.e = y.d.length;\r\n }\r\n\r\n xd = convertBase(str, 10, base);\r\n e = len = xd.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] == 0;) xd.pop();\r\n\r\n if (!xd[0]) {\r\n str = isExp ? '0p+0' : '0';\r\n } else {\r\n if (i < 0) {\r\n e--;\r\n } else {\r\n x = new Ctor(x);\r\n x.d = xd;\r\n x.e = e;\r\n x = divide(x, y, sd, rm, 0, base);\r\n xd = x.d;\r\n e = x.e;\r\n roundUp = inexact;\r\n }\r\n\r\n // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n i = xd[sd];\r\n k = base / 2;\r\n roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n roundUp = rm < 4\r\n ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n rm === (x.s < 0 ? 8 : 7));\r\n\r\n xd.length = sd;\r\n\r\n if (roundUp) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (; ++xd[--sd] > base - 1;) {\r\n xd[sd] = 0;\r\n if (!sd) {\r\n ++e;\r\n xd.unshift(1);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n // Add binary exponent suffix?\r\n if (isExp) {\r\n if (len > 1) {\r\n if (baseOut == 16 || baseOut == 8) {\r\n i = baseOut == 16 ? 4 : 3;\r\n for (--len; len % i; len++) str += '0';\r\n xd = convertBase(str, base, baseOut);\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // xd[0] will always be be 1\r\n for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n } else {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n }\r\n\r\n str = str + (e < 0 ? 'p' : 'p+') + e;\r\n } else if (e < 0) {\r\n for (; ++e;) str = '0' + str;\r\n str = '0.' + str;\r\n } else {\r\n if (++e > len) for (e -= len; e-- ;) str += '0';\r\n else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n * abs\r\n * acos\r\n * acosh\r\n * add\r\n * asin\r\n * asinh\r\n * atan\r\n * atanh\r\n * atan2\r\n * cbrt\r\n * ceil\r\n * clamp\r\n * clone\r\n * config\r\n * cos\r\n * cosh\r\n * div\r\n * exp\r\n * floor\r\n * hypot\r\n * ln\r\n * log\r\n * log2\r\n * log10\r\n * max\r\n * min\r\n * mod\r\n * mul\r\n * pow\r\n * random\r\n * round\r\n * set\r\n * sign\r\n * sin\r\n * sinh\r\n * sqrt\r\n * sub\r\n * sum\r\n * tan\r\n * tanh\r\n * trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0) = ±pi\r\n * atan2(±0, +0) = ±0\r\n * atan2(±0, -x) = ±pi for x > 0\r\n * atan2(±0, x) = ±0 for x > 0\r\n * atan2(-y, ±0) = -pi/2 for y > 0\r\n * atan2(y, ±0) = pi/2 for y > 0\r\n * atan2(±y, -Infinity) = ±pi for finite y > 0\r\n * atan2(±y, +Infinity) = ±0 for finite y > 0\r\n * atan2(±Infinity, x) = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n y = new this(y);\r\n x = new this(x);\r\n var r,\r\n pr = this.precision,\r\n rm = this.rounding,\r\n wpr = pr + 4;\r\n\r\n // Either NaN\r\n if (!y.s || !x.s) {\r\n r = new this(NaN);\r\n\r\n // Both ±Infinity\r\n } else if (!y.d && !x.d) {\r\n r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n r.s = y.s;\r\n\r\n // x is ±Infinity or y is ±0\r\n } else if (!x.d || y.isZero()) {\r\n r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n r.s = y.s;\r\n\r\n // y is ±Infinity or x is ±0\r\n } else if (!y.d || x.isZero()) {\r\n r = getPi(this, wpr, 1).times(0.5);\r\n r.s = y.s;\r\n\r\n // Both non-zero and finite\r\n } else if (x.s < 0) {\r\n this.precision = wpr;\r\n this.rounding = 1;\r\n r = this.atan(divide(y, x, wpr, 1));\r\n x = getPi(this, wpr, 1);\r\n this.precision = pr;\r\n this.rounding = rm;\r\n r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n } else {\r\n r = this.atan(divide(y, x, wpr, 1));\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n * maxE {number}\r\n * minE {number}\r\n * modulo {number}\r\n * crypto {boolean|number}\r\n * defaults {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n var i, p, v,\r\n useDefaults = obj.defaults === true,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -EXP_LIMIT, 0,\r\n 'toExpPos', 0, EXP_LIMIT,\r\n 'maxE', 0, EXP_LIMIT,\r\n 'minE', -EXP_LIMIT, 0,\r\n 'modulo', 0, 9\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (v === true || v === false || v === 0 || v === 1) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n this[p] = true;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n } else {\r\n this[p] = false;\r\n }\r\n } else {\r\n throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * v {number|string|bigint|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(v) {\r\n var e, i, t,\r\n x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n if (isDecimalInstance(v)) {\r\n x.s = v.s;\r\n\r\n if (external) {\r\n if (!v.d || v.e > Decimal.maxE) {\r\n\r\n // Infinity.\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (v.e < Decimal.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d.slice();\r\n }\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d ? v.d.slice() : v.d;\r\n }\r\n\r\n return;\r\n }\r\n\r\n t = typeof v;\r\n\r\n if (t === 'number') {\r\n if (v === 0) {\r\n x.s = 1 / v < 0 ? -1 : 1;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (v === ~~v && v < 1e7) {\r\n for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n if (external) {\r\n if (e > Decimal.maxE) {\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (e < Decimal.minE) {\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Infinity or NaN?\r\n if (v * 0 !== 0) {\r\n if (!v) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n if (t === 'string') {\r\n if ((i = v.charCodeAt(0)) === 45) { // minus sign\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n if (i === 43) v = v.slice(1); // plus sign\r\n x.s = 1;\r\n }\r\n\r\n return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n }\r\n\r\n if (t === 'bigint') {\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n throw Error(invalidArgument + v);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n Decimal.EUCLID = 9;\r\n\r\n Decimal.config = Decimal.set = config;\r\n Decimal.clone = clone;\r\n Decimal.isDecimal = isDecimalInstance;\r\n\r\n Decimal.abs = abs;\r\n Decimal.acos = acos;\r\n Decimal.acosh = acosh; // ES6\r\n Decimal.add = add;\r\n Decimal.asin = asin;\r\n Decimal.asinh = asinh; // ES6\r\n Decimal.atan = atan;\r\n Decimal.atanh = atanh; // ES6\r\n Decimal.atan2 = atan2;\r\n Decimal.cbrt = cbrt; // ES6\r\n Decimal.ceil = ceil;\r\n Decimal.clamp = clamp;\r\n Decimal.cos = cos;\r\n Decimal.cosh = cosh; // ES6\r\n Decimal.div = div;\r\n Decimal.exp = exp;\r\n Decimal.floor = floor;\r\n Decimal.hypot = hypot; // ES6\r\n Decimal.ln = ln;\r\n Decimal.log = log;\r\n Decimal.log10 = log10; // ES6\r\n Decimal.log2 = log2; // ES6\r\n Decimal.max = max;\r\n Decimal.min = min;\r\n Decimal.mod = mod;\r\n Decimal.mul = mul;\r\n Decimal.pow = pow;\r\n Decimal.random = random;\r\n Decimal.round = round;\r\n Decimal.sign = sign; // ES6\r\n Decimal.sin = sin;\r\n Decimal.sinh = sinh; // ES6\r\n Decimal.sqrt = sqrt;\r\n Decimal.sub = sub;\r\n Decimal.sum = sum;\r\n Decimal.tan = tan;\r\n Decimal.tanh = tanh; // ES6\r\n Decimal.trunc = trunc; // ES6\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n if (obj.defaults !== true) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n var i, n,\r\n t = new this(0);\r\n\r\n external = false;\r\n\r\n for (i = 0; i < arguments.length;) {\r\n n = new this(arguments[i++]);\r\n if (!n.d) {\r\n if (n.s) {\r\n external = true;\r\n return new this(1 / 0);\r\n }\r\n t = n;\r\n } else if (t.d) {\r\n t = t.plus(n.times(n));\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, -1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The base.\r\n * y {number|string|bigint|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n var d, e, k, n,\r\n i = 0,\r\n r = new this(1),\r\n rd = [];\r\n\r\n if (sd === void 0) sd = this.precision;\r\n else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n k = Math.ceil(sd / LOG_BASE);\r\n\r\n if (!this.crypto) {\r\n for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n } else if (crypto.getRandomValues) {\r\n d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n for (; i < k;) {\r\n n = d[i];\r\n\r\n // 0 <= n < 4294967296\r\n // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n if (n >= 4.29e9) {\r\n d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n } else {\r\n\r\n // 0 <= n <= 4289999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd[i++] = n % 1e7;\r\n }\r\n }\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n d = crypto.randomBytes(k *= 4);\r\n\r\n for (; i < k;) {\r\n\r\n // 0 <= n < 2147483648\r\n n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n if (n >= 2.14e9) {\r\n crypto.randomBytes(4).copy(d, i);\r\n } else {\r\n\r\n // 0 <= n <= 2139999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd.push(n % 1e7);\r\n i += 4;\r\n }\r\n }\r\n\r\n i = k / 4;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n\r\n k = rd[--i];\r\n sd %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to sd.\r\n if (k && sd) {\r\n n = mathpow(10, LOG_BASE - sd);\r\n rd[i] = (k / n | 0) * n;\r\n }\r\n\r\n // Remove trailing words which are zero.\r\n for (; rd[i] === 0; i--) rd.pop();\r\n\r\n // Zero?\r\n if (i < 0) {\r\n e = 0;\r\n rd = [0];\r\n } else {\r\n e = -1;\r\n\r\n // Remove leading words which are zero and adjust exponent accordingly.\r\n for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n // Count the digits of the first word of rd to determine leading zeros.\r\n for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n // Adjust the exponent for leading zeros of the first word of rd.\r\n if (k < LOG_BASE) e -= LOG_BASE - k;\r\n }\r\n\r\n r.e = e;\r\n r.d = rd;\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if x > 0,\r\n * -1 if x < 0,\r\n * 0 if x is 0,\r\n * -0 if x is -0,\r\n * NaN otherwise\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n x = new this(x);\r\n return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n var i = 0,\r\n args = arguments,\r\n x = new this(args[i]);\r\n\r\n external = false;\r\n for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n external = true;\r\n\r\n return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import type { CoinPairType, TableHandle } from '@cetusprotocol/common-sdk'\nimport { TransactionObjectArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nexport type DlmmConfigs = {\n registry_id: string\n pools_id: string\n partners_id: string\n global_config_id: string\n versioned_id: string\n admin_cap_id: string\n}\n\nexport type BinStepConfig = {\n bin_step: number\n base_factor: number\n filter_period: number\n decay_period: number\n reduction_factor: number\n variable_fee_control: string\n max_volatility_accumulator: string\n protocol_fee_rate: string\n}\n\nexport type BinManager = {\n bin_step: number\n bin_manager_handle: string\n size: string\n}\n\nexport type VariableParameters = {\n volatility_accumulator: string\n volatility_reference: string\n index_reference: number\n last_update_timestamp: string\n bin_step_config: BinStepConfig\n}\n\nexport type Reward = {\n reward_coin: string\n emissions_per_second: string\n emissions_per_day: string\n period_emission_rates: TableHandle\n}\nexport type RewardManager = {\n is_public: boolean\n vault: TableHandle\n rewards: Reward[]\n emergency_reward_pause: boolean\n last_updated_time: string\n}\n\nexport type PositionManager = {\n bin_step: number\n position_index: number\n position_handle: string\n size: number\n}\n\nexport type DlmmBasePool = {\n id: string\n bin_step: number\n} & CoinPairType\n\nexport type PoolPermissions = {\n disable_add: boolean\n disable_remove: boolean\n disable_swap: boolean\n disable_collect_fee: boolean\n disable_collect_reward: boolean\n disable_add_reward: boolean\n}\n\nexport type DlmmPool = {\n pool_type: string\n index: number\n bin_manager: BinManager\n variable_parameters: VariableParameters\n active_id: number\n permissions: PoolPermissions\n balance_a: string\n balance_b: string\n base_fee_rate: string\n protocol_fee_a: string\n protocol_fee_b: string\n url: string\n reward_manager: RewardManager\n position_manager: PositionManager\n} & DlmmBasePool\n\nexport type DlmmPosition = {\n id: string\n pool_id: string\n index: number\n description: string\n uri: string\n liquidity_shares: string[]\n lower_bin_id: number\n upper_bin_id: number\n name: string\n} & CoinPairType\n\nexport type BinWeight = {\n bin_id: number\n weight: number\n}\n\nexport type BinAmount = {\n bin_id: number\n amount_a: string\n amount_b: string\n liquidity?: string\n price_per_lamport: string\n}\n\nexport type BinLiquidityInfo = {\n bins: BinAmount[]\n amount_a: string\n amount_b: string\n}\n\nexport enum StrategyType {\n Spot,\n Curve,\n BidAsk,\n}\n\nexport type ClosePositionOption = {\n pool_id: string\n position_id: string\n reward_coins: string[]\n} & CoinPairType\n\nexport type BaseCreatePoolOption = {\n bin_step: number\n base_factor: number\n url?: string\n} & CoinPairType\n\nexport type BaseCreatePoolAndAddOption = {\n bin_infos: BinLiquidityInfo\n strategy_type: StrategyType\n use_bin_infos?: boolean\n} & BaseCreatePoolOption\n\nexport type CreatePoolAndAddOption = {\n active_id: number\n lower_bin_id: number\n upper_bin_id: number\n} & BaseCreatePoolAndAddOption\n\nexport type CreatePoolOption = {\n active_id: number\n} & BaseCreatePoolOption\n\nexport type CreatePoolAndAddWithPriceOption = {\n pool_id: string\n price_base_coin: 'coin_a' | 'coin_b'\n price: string\n lower_price: string\n upper_price: string\n strategy_type: StrategyType\n decimals_a: number\n decimals_b: number\n} & BaseCreatePoolAndAddOption\n\nexport type BaseAddLiquidityOption = {\n pool_id: string | TransactionObjectArgument\n bin_infos: BinLiquidityInfo\n strategy_type: StrategyType\n max_price_slippage: number\n active_id: number\n bin_step: number\n /**\n * Controls whether to use pre-calculated bin_infos or let the contract calculate based on strategy_type.\n * - true: Use bin_infos to add liquidity to each bin\n * - false: Pass strategy_type to contract for automatic liquidity distribution calculation\n */\n use_bin_infos?: boolean\n coin_object_id_a?: TransactionObjectArgument\n coin_object_id_b?: TransactionObjectArgument\n} & CoinPairType\n\nexport type BaseCalculateAddLiquidityOption = {\n pool_id?: string\n active_id: number\n bin_step: number\n lower_bin_id: number\n upper_bin_id: number\n active_bin_of_pool?: BinAmount\n strategy_type: StrategyType\n}\n\nexport type CalculateAddLiquidityOption = {\n amount_a: string\n amount_b: string\n} & BaseCalculateAddLiquidityOption\n\nexport type CalculateAddLiquidityAutoFillOption = {\n coin_amount: string\n fix_amount_a: boolean\n} & BaseCalculateAddLiquidityOption\n\nexport type AddLiquidityOption = BaseAddLiquidityOption & {\n position_id: string\n collect_fee: boolean\n reward_coins: string[]\n}\n\nexport type OpenAndAddLiquidityOption = BaseAddLiquidityOption & {\n lower_bin_id: number\n upper_bin_id: number\n}\n\nexport type OpenAndAddLiquidityWithPriceOption = BaseAddLiquidityOption & {\n price_base_coin: 'coin_a' | 'coin_b'\n price: string\n lower_price: string\n upper_price: string\n active_bin_of_pool?: BinAmount\n strategy_type: StrategyType\n decimals_a: number\n decimals_b: number\n max_price_slippage: number\n}\n\nexport type OpenPositionOption = {\n pool_id: string\n lower_bin_id: number\n upper_bin_id: number\n} & CoinPairType\n\nexport type CalculateRemoveLiquidityBothOption = {\n bins: BinAmount[]\n active_id: number\n fix_amount_a: boolean\n coin_amount: string\n}\n\nexport type CalculateRemoveLiquidityOnlyOption = {\n bins: BinAmount[]\n active_id: number\n is_only_a: boolean\n coin_amount: string\n}\n\nexport type RemoveLiquidityOption = {\n pool_id: string\n position_id: string\n active_id: number\n bin_step: number\n bin_infos: BinLiquidityInfo\n slippage: number\n reward_coins: string[]\n collect_fee: boolean\n remove_percent?: number\n} & CoinPairType\n\nexport type CollectRewardOption = {\n pool_id: string\n position_id: string\n reward_coins: string[]\n} & CoinPairType\n\nexport type CollectFeeOption = {\n pool_id: string\n position_id: string\n} & CoinPairType\n\nexport type CollectRewardAndFeeOption = {\n pool_id: string\n position_id: string\n reward_coins: string[]\n} & CoinPairType\n\nexport type BinSwap = {\n bin_id: number\n in_amount: string\n out_amount: string\n fee: string\n var_fee_rate: string\n}\n\nexport type PreSwapQuote = {\n pool_id: string\n a2b: boolean\n in_amount: string\n out_amount: string\n ref_fee_amount: string\n fee_amount: string\n partner: string\n from_coin_type: string\n to_coin_type: string\n bin_swaps: BinSwap[]\n}\n\nexport type PreSwapOption = {\n pool_id: string\n a2b: boolean\n by_amount_in: boolean\n in_amount: string\n} & CoinPairType\n\nexport type SwapOption = {\n quote_obj: PreSwapQuote\n by_amount_in: boolean\n partner?: string\n slippage: number\n} & CoinPairType\n\nexport type PositionFee = {\n position_id: string\n fee_owned_a: string\n fee_owned_b: string\n}\n\nexport type RewardInfo = {\n coin_type: string\n reward_owned: string\n}\n\nexport type PositionReward = {\n position_id: string\n rewards: RewardInfo[]\n}\n\nexport type CreatePartnerOption = {\n name: string\n ref_fee_rate: number\n start_time: number\n end_time: number\n recipient: string\n}\n\nexport type UpdateRefFeeRateOption = {\n partner_id: string\n ref_fee_rate: number\n}\n\nexport type UpdateTimeRangeOption = {\n partner_id: string\n start_time: number\n end_time: number\n}\n\nexport type ClaimRefFeeOption = {\n partner_id: string\n partner_cap_id?: string\n fee_coin_types: string[]\n}\n\nexport type Partner = {\n id: string\n name: string\n ref_fee_rate: number\n start_time: number\n end_time: number\n balances: TableHandle\n type: string\n}\n\nexport type PoolTransactionInfo = {\n index: string\n tx: string\n sender: string\n type: string\n block_time: string\n parsed_json: any\n}\n\nexport type AddRewardOption = {\n pool_id: string\n reward_coin_type: string\n reward_amount: string\n // Optional start time in seconds for the reward\n start_time_seconds?: number\n // Mandatory end time in seconds for the reward\n end_time_seconds: number\n} & CoinPairType\n\nexport type InitRewardOption = {\n pool_id: string\n reward_coin_types: string[]\n} & CoinPairType\n\nexport type RewardWhiteListOption = {\n reward_coin_types: string[]\n type: 'add' | 'remove'\n}\n\nexport type RewardAccessOption = {\n pool_id: string\n type: 'to_public' | 'to_private'\n} & CoinPairType\n\nexport type ValidateActiveIdSlippageOption = {\n pool_id: string | TransactionObjectArgument\n active_id: number\n bin_step: number\n max_price_slippage: number\n} & CoinPairType\n\nexport type DlmmGlobalConfig = {\n id: string\n acl: TableHandle\n allowed_list: TableHandle\n denied_list: TableHandle\n bin_steps: TableHandle\n reward_white_list: string[]\n blocked_position: TableHandle\n blocked_user: TableHandle\n min_reward_duration: number\n non_manager_initialize_reward_cap: number\n reward_public: boolean\n}\n\nexport type UpdatePositionFeeAndRewardsOption = {\n pool_id: string\n position_id: string\n} & CoinPairType\n\nexport type RewardPeriodEmission = {\n emissions_per_second: string\n emissions_per_day: string\n emissions_per: string\n time: string\n visualized_time: string\n}\n\nexport type RewardPeriodEmissionFormat = {\n emissions_per_second: string\n emissions_per_day: string\n time: string\n visualized_time: string\n}\n\nexport type GetPoolBinInfoOption = {\n pool_id: string\n} & CoinPairType\n\nexport type GetTotalFeeRateOption = {\n pool_id: string\n} & CoinPairType\n\nexport type FeeRate = {\n base_fee_rate: string\n var_fee_rate: string\n total_fee_rate: string\n}\n\nexport type WeightsOptions = {\n strategy_type: StrategyType\n active_id: number\n bin_step: number\n lower_bin_id: number\n upper_bin_id: number\n total_amount_a: string\n total_amount_b: string\n active_bin_of_pool?: BinAmount\n}\n\nexport type WeightsInfo = {\n total_weight_a: Decimal\n total_weight_b: Decimal\n weights: Decimal[]\n weight_per_prices: Decimal[]\n active_weight_a: Decimal\n active_weight_b: Decimal\n} & WeightsOptions\n\nexport type GetBinInfoOption = {\n bin_manager_handle: string\n bin_id: number\n bin_step: number\n}\n\nexport type GetBinInfoResult = {\n bin_manager_handle: string\n bin_id: number\n bin_step: number\n} & BinAmount\n","import { d, DETAILS_KEYS, MathUtil } from '@cetusprotocol/common-sdk'\nimport { BIN_BOUND, MAX_BIN_PER_POSITION } from '../types/constants'\nimport Decimal from 'decimal.js'\nimport { BASIS_POINT_MAX } from '../types/constants'\nimport BN from 'bn.js'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { BinAmount, BinLiquidityInfo } from '../types/dlmm'\n\nconst MAX_EXPONENTIAL = new BN(0x80000)\nexport const SCALE_OFFSET = 64\nexport const ONE = new BN(1).shln(SCALE_OFFSET)\nconst MAX = new BN(2).pow(new BN(128)).sub(new BN(1))\n\nexport class BinUtils {\n /**\n * Split bins into multiple smaller positions based on MAX_BIN_PER_POSITION\n * @param bins - The bins to split\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @returns Array of bin info objects for each position\n */\n static splitBinLiquidityInfo(liquidity_bins: BinLiquidityInfo, lower_bin_id: number, upper_bin_id: number): BinLiquidityInfo[] {\n const position_count = BinUtils.getPositionCount(lower_bin_id, upper_bin_id)\n if (position_count <= 1) {\n return [liquidity_bins]\n }\n\n const positions: BinLiquidityInfo[] = []\n let current_lower = lower_bin_id\n\n for (let i = 0; i < position_count; i++) {\n const current_upper = Math.min(current_lower + MAX_BIN_PER_POSITION - 2, upper_bin_id)\n const position_bins = liquidity_bins.bins.filter((bin) => bin.bin_id >= current_lower && bin.bin_id <= current_upper)\n\n positions.push({\n bins: position_bins,\n amount_a: position_bins.reduce((acc, bin) => d(acc).plus(bin.amount_a), d(0)).toFixed(0),\n amount_b: position_bins.reduce((acc, bin) => d(acc).plus(bin.amount_b), d(0)).toFixed(0),\n })\n\n current_lower = current_upper + 1\n }\n\n return positions\n }\n\n /**\n * Process bins by rate\n * @param bins - The bins to be processed\n * @param rate - The rate to be applied\n * @returns The processed bins\n */\n static processBinsByRate(bins: BinAmount[], rate: string): BinLiquidityInfo {\n const used_bins: BinAmount[] = []\n let used_total_amount_a = d(0)\n let used_total_amount_b = d(0)\n\n bins.forEach((bin) => {\n const { amount_a, amount_b, liquidity = '0' } = bin\n const used_liquidity = d(rate).mul(liquidity).toFixed(0)\n let used_amount_a = d(amount_a).mul(rate)\n let used_amount_b = d(amount_b).mul(rate)\n\n if (d(used_amount_a).lt(1) && d(used_amount_a).gt(0)) {\n used_amount_a = d(1)\n }\n if (d(used_amount_b).lt(1) && d(used_amount_b).gt(0)) {\n used_amount_b = d(1)\n }\n\n used_total_amount_a = d(used_total_amount_a).plus(used_amount_a)\n used_total_amount_b = d(used_total_amount_b).plus(used_amount_b)\n\n used_bins.push({\n bin_id: bin.bin_id,\n amount_a: used_amount_a.toFixed(0),\n amount_b: used_amount_b.toFixed(0),\n price_per_lamport: bin.price_per_lamport,\n liquidity: used_liquidity,\n })\n })\n\n return {\n bins: used_bins,\n amount_a: used_total_amount_a.toFixed(0),\n amount_b: used_total_amount_b.toFixed(0),\n }\n }\n\n /**\n * Calculate the amount of token A and token B to be removed from a bin\n * @param bin - The bin information\n * @param remove_liquidity - The amount of liquidity to be removed\n * @returns The amount of token A and token B to be removed\n */\n static calculateOutByShare(bin: BinAmount, remove_liquidity: string) {\n const { amount_a, amount_b, liquidity = '0' } = bin\n\n if (liquidity === '0') {\n return {\n amount_a: '0',\n amount_b: '0',\n }\n }\n\n if (d(remove_liquidity).gte(d(liquidity))) {\n return {\n amount_a: amount_a,\n amount_b: amount_b,\n }\n }\n\n const amount_a_out = d(remove_liquidity).div(liquidity).mul(amount_a).toFixed(0, Decimal.ROUND_FLOOR)\n const amount_b_out = d(remove_liquidity).div(liquidity).mul(amount_b).toFixed(0, Decimal.ROUND_FLOOR)\n\n return {\n amount_a: amount_a_out,\n amount_b: amount_b_out,\n }\n }\n\n /**\n * Get the number of positions in a range of bin ids\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @returns The number of positions\n */\n static getPositionCount(lower_bin_id: number, upper_bin_id: number) {\n const binDelta = d(upper_bin_id).sub(lower_bin_id).add(1)\n const positionCount = binDelta.div(MAX_BIN_PER_POSITION)\n return Number(positionCount.toFixed(0, Decimal.ROUND_UP))\n }\n\n /**\n * Calculate the amount of liquidity following the constant sum formula `L = price * x + y`\n * @param amount_a\n * @param amount_b\n * @param qPrice Price is in Q64x64\n * @returns\n */\n static getLiquidity(amount_a: string, amount_b: string, qPrice: string): string {\n const px = d(qPrice).mul(amount_a)\n const liquidity = px.add(d(amount_b).mul(d(2).pow(SCALE_OFFSET)))\n return liquidity.toFixed(0)\n }\n\n /**\n * Calculate amount_a from liquidity when all liquidity is in token A\n * @param liquidity - The liquidity amount\n * @param qPrice - Price in Q64x64 format\n * @returns The amount of token A\n */\n static getAmountAFromLiquidity(liquidity: string, qPrice: string): string {\n return d(liquidity).div(d(qPrice)).toFixed(0)\n }\n\n /**\n * Calculate amount_b from liquidity when all liquidity is in token B\n * @param liquidity - The liquidity amount\n * @returns The amount of token B\n */\n static getAmountBFromLiquidity(liquidity: string): string {\n return d(liquidity).div(d(2).pow(SCALE_OFFSET)).toFixed(0)\n }\n\n /**\n * Calculate amounts from liquidity using the same logic as Move code\n * @param amount_a - Current amount of token A in the bin\n * @param amount_b - Current amount of token B in the bin\n * @param delta_liquidity - The liquidity delta to calculate amounts for\n * @param liquidity_supply - Total liquidity supply in the bin\n * @returns [amount_a_out, amount_b_out]\n */\n static getAmountsFromLiquidity(amount_a: string, amount_b: string, delta_liquidity: string, liquidity_supply: string): [string, string] {\n if (d(liquidity_supply).isZero()) {\n handleError(DlmmErrorCode.LiquiditySupplyIsZero, 'Liquidity supply is zero')\n }\n\n if (d(delta_liquidity).gt(d(liquidity_supply))) {\n handleError(DlmmErrorCode.InvalidDeltaLiquidity, 'Invalid delta liquidity')\n }\n\n if (d(delta_liquidity).isZero()) {\n return ['0', '0']\n }\n\n let out_amount_a: string\n if (d(amount_a).isZero()) {\n out_amount_a = '0'\n } else {\n out_amount_a = d(amount_a).mul(d(delta_liquidity)).div(d(liquidity_supply)).toFixed(0, Decimal.ROUND_FLOOR)\n }\n\n let out_amount_b: string\n if (d(amount_b).isZero()) {\n out_amount_b = '0'\n } else {\n out_amount_b = d(amount_b).mul(d(delta_liquidity)).div(d(liquidity_supply)).toFixed(0, Decimal.ROUND_FLOOR)\n }\n\n return [out_amount_a, out_amount_b]\n }\n\n /**\n * Get the price of a bin by bin id\n * @param bin_id - The bin id\n * @param bin_step - The bin step\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @returns The price of the bin\n */\n static getPriceFromBinId(bin_id: number, bin_step: number, decimal_a: number, decimal_b: number): string {\n const pricePerLamport = BinUtils.getPricePerLamportFromBinId(bin_id, bin_step)\n return BinUtils.getPriceFromLamport(decimal_a, decimal_b, pricePerLamport).toString()\n }\n\n /**\n * Get the price per lamport of a bin by bin id\n * @param bin_id - The bin id\n * @param bin_step - The bin step\n * @returns The price per lamport of the bin\n */\n static getPricePerLamportFromBinId(bin_id: number, bin_step: number): string {\n const binStepNum = new Decimal(bin_step).div(new Decimal(BASIS_POINT_MAX))\n return new Decimal(1).add(new Decimal(binStepNum)).pow(new Decimal(bin_id)).toString()\n }\n\n /**\n * Get the bin id from a price\n * @param price - The price\n * @param binStep - The bin step\n * @param min - Whether to use the minimum or maximum bin id\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @returns The bin id\n */\n public static getBinIdFromPrice(price: string, binStep: number, min: boolean, decimal_a: number, decimal_b: number): number {\n const pricePerLamport = BinUtils.getPricePerLamport(decimal_a, decimal_b, price)\n return BinUtils.getBinIdFromLamportPrice(pricePerLamport, binStep, min)\n }\n\n /**\n * Get the bin id from a price per lamport\n * @param pricePerLamport - The price per lamport\n * @param binStep - The bin step\n * @param min - Whether to use the minimum or maximum bin id\n * @returns The bin id\n */\n public static getBinIdFromLamportPrice(pricePerLamport: string, binStep: number, min: boolean): number {\n const binStepNum = new Decimal(binStep).div(new Decimal(BASIS_POINT_MAX))\n const binId = new Decimal(pricePerLamport).log().dividedBy(new Decimal(1).add(binStepNum).log())\n return (min ? binId.floor() : binId.ceil()).toNumber()\n }\n\n /**\n * Get the price per lamport\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @param price - The price\n * @returns The price per lamport\n */\n public static getPricePerLamport(decimal_a: number, decimal_b: number, price: string): string {\n return new Decimal(price).mul(new Decimal(10 ** (decimal_b - decimal_a))).toString()\n }\n\n /**\n * Convert price per lamport back to original price\n * @param decimal_a - The decimal of the token a\n * @param decimal_b - The decimal of the token b\n * @param pricePerLamport - The price per lamport\n * @returns The original price\n */\n public static getPriceFromLamport(decimal_a: number, decimal_b: number, pricePerLamport: string): string {\n return new Decimal(pricePerLamport).div(new Decimal(10 ** (decimal_b - decimal_a))).toString()\n }\n\n /**\n * Get the reverse price\n * @param price - The price\n * @returns The reverse price\n */\n public static getReversePrice(price: string): string {\n return new Decimal(1).div(price).toString()\n }\n\n /**\n * Get the price of a bin by bin id\n * @param binId - The bin id\n * @param binStep - The bin step\n * @returns The price of the bin\n */\n static getQPriceFromId(binId: number, binStep: number): string {\n const bps = new BN(binStep).shln(SCALE_OFFSET).div(new BN(BASIS_POINT_MAX))\n const base = ONE.add(bps)\n return BinUtils.pow(base, new BN(binId)).toString()\n }\n\n /**\n * Convert QPrice (Q64x64 format) to actual price\n * @param qPrice - The price in Q64x64 format\n * @returns The actual price\n */\n static getPricePerLamportFromQPrice(qPrice: string): string {\n return MathUtil.fromX64(new BN(qPrice)).toString()\n }\n\n static pow(base: BN, exp: BN): BN {\n let invert = exp.isNeg()\n\n if (exp.isZero()) {\n return ONE\n }\n\n exp = invert ? exp.abs() : exp\n\n if (exp.gt(MAX_EXPONENTIAL)) {\n return new BN(0)\n }\n\n let squaredBase = base\n let result = ONE\n\n if (squaredBase.gte(result)) {\n squaredBase = MAX.div(squaredBase)\n invert = !invert\n }\n\n if (!exp.and(new BN(0x1)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x2)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x4)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x8)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x10)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x20)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x40)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x80)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x100)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x200)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x400)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x800)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x1000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x2000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x4000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x8000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x10000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x20000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET)\n\n if (!exp.and(new BN(0x40000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET)\n }\n\n if (result.isZero()) {\n return new BN(0)\n }\n\n if (invert) {\n result = MAX.div(result)\n }\n\n return result\n }\n\n /**\n * Converts a bin ID to a score by adding the bin bound and validating the range\n * @param binId - The bin ID to convert\n * @returns The calculated bin score\n * @throws Error if the bin ID is invalid\n */\n static binScore(binId: number): string {\n const score = BigInt(binId) + BIN_BOUND\n if (score < 0n || score > BIN_BOUND * 2n) {\n handleError(DlmmErrorCode.InvalidBinId, new Error('Invalid bin ID'), {\n [DETAILS_KEYS.METHOD_NAME]: 'binScore',\n [DETAILS_KEYS.REQUEST_PARAMS]: { binId },\n })\n }\n\n return score.toString()\n }\n\n /**\n * Converts a score back to bin ID by subtracting the bin bound\n * @param score - The score to convert\n * @returns The calculated bin ID\n * @throws Error if the score is invalid\n */\n static scoreToBinId(score: string): number {\n const binId = BigInt(score) - BIN_BOUND\n if (binId < -BIN_BOUND || binId > BIN_BOUND) {\n handleError(DlmmErrorCode.InvalidBinId, new Error('Invalid score'), {\n [DETAILS_KEYS.METHOD_NAME]: 'scoreToBinId',\n [DETAILS_KEYS.REQUEST_PARAMS]: { score },\n })\n }\n\n return Number(binId)\n }\n\n /**\n * Resolves the bin position from a score.\n *\n * @param score - The score to resolve\n * @returns Tuple of [group index, offset in group]\n */\n static resolveBinPosition(score: string): [string, number] {\n const scoreBigInt = BigInt(score)\n const groupIndex = scoreBigInt >> 4n\n const offsetInGroup = Number(scoreBigInt & 0xfn)\n\n return [groupIndex.toString(), offsetInGroup]\n }\n\n static findMinMaxBinId(binStep: number) {\n const base = 1 + binStep / BASIS_POINT_MAX\n const maxQPriceSupported = new Decimal('18446744073709551615')\n const n = maxQPriceSupported.log(10).div(new Decimal(base).log(10)).floor()\n\n let minBinId = n.neg()\n let maxBinId = n\n\n let minQPrice = d(1)\n let maxQPrice = d('340282366920938463463374607431768211455')\n\n while (true) {\n const qPrice = d(BinUtils.getQPriceFromId(minBinId.toNumber(), binStep))\n if (qPrice.gt(minQPrice) && !qPrice.isZero()) {\n break\n } else {\n minBinId = minBinId.add(1)\n }\n }\n\n while (true) {\n const qPrice = d(BinUtils.getQPriceFromId(maxBinId.toNumber(), binStep))\n if (qPrice.lt(maxQPrice) && !qPrice.isZero()) {\n break\n } else {\n maxBinId = maxBinId.sub(1)\n }\n }\n\n return {\n minBinId: minBinId.toNumber(),\n maxBinId: maxBinId.toNumber(),\n }\n }\n\n static getBinShift(active_id: number, bin_step: number, max_price_slippage: number): number {\n const price = BinUtils.getPricePerLamportFromBinId(active_id, bin_step)\n const price_limit = d(price)\n .mul(1 + max_price_slippage)\n .toString()\n const slippage_active_id = BinUtils.getBinIdFromLamportPrice(price_limit, bin_step, true)\n const bin_shift = d(slippage_active_id).sub(active_id).abs().toFixed(0, Decimal.ROUND_UP)\n\n console.log('getBinShift Options:', {\n active_id,\n bin_shift,\n })\n return Number(bin_shift)\n }\n}\n","export const MAX_BIN_PER_POSITION = 1000\n\nexport const MIN_BIN_ID = -443636\n\nexport const MAX_BIN_ID = 443636\n\nexport const BASIS_POINT_MAX = 10000\n\nexport const DEFAULT_MAX_WEIGHT = 2000\n\nexport const DEFAULT_MIN_WEIGHT = 200\n\nexport const BIN_BOUND = 443636n\n\nexport const MAX_FEE_RATE = 100_000_000\n\nexport const FEE_PRECISION = 1_000_000_000\n\nexport const BASIS_POINT = 10000\n\nexport const REWARD_PERIOD = 7 * 24 * 60 * 60\n\nexport const REWARD_PERIOD_START_AT = 1747627200\n","import { d } from '@cetusprotocol/common-sdk'\nimport { BinLiquidityInfo, BinWeight, StrategyType, WeightsInfo, WeightsOptions } from '../types/dlmm'\nimport Decimal from 'decimal.js'\nimport { DEFAULT_MAX_WEIGHT, DEFAULT_MIN_WEIGHT } from '../types/constants'\nimport { BinUtils, SCALE_OFFSET } from './binUtils'\nimport { safeMulAmount } from './parseData'\n\nexport class WeightUtils {\n static toWeight(options: WeightsOptions): WeightsInfo {\n console.log('🚀 ~ WeightUtils ~ toWeight ~ options:', options)\n\n const { strategy_type, active_id, bin_step, lower_bin_id, upper_bin_id, total_amount_a, total_amount_b, active_bin_of_pool } = options\n const single_side = active_id < lower_bin_id || active_id > upper_bin_id\n const active_bin_price = BinUtils.getQPriceFromId(active_id, bin_step)\n\n let active_weight_a = d(0)\n let active_weight_b = d(0)\n\n let base_weight = d(DEFAULT_MIN_WEIGHT)\n if (strategy_type === StrategyType.BidAsk) {\n base_weight = d(DEFAULT_MIN_WEIGHT)\n } else if (strategy_type === StrategyType.Curve) {\n base_weight = d(DEFAULT_MAX_WEIGHT)\n } else if (strategy_type === StrategyType.Spot) {\n base_weight = d(1)\n }\n\n if (!single_side && active_bin_of_pool) {\n const weights = this.calculateActiveWeights(active_bin_of_pool.amount_a, active_bin_of_pool.amount_b, active_bin_price, base_weight)\n active_weight_a = weights.active_weight_a\n active_weight_b = weights.active_weight_b\n }\n\n if (active_id === lower_bin_id && d(total_amount_b).isZero()) {\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(d(active_bin_price))\n .floor()\n active_weight_b = d(0)\n }\n if (active_id === upper_bin_id && d(total_amount_a).isZero()) {\n active_weight_b = d(base_weight).mul(d(2).pow(SCALE_OFFSET)).floor()\n active_weight_a = d(0)\n }\n\n if (active_id > lower_bin_id && active_id < upper_bin_id) {\n if (d(total_amount_a).isZero()) {\n active_weight_b = d(base_weight).mul(d(2).pow(SCALE_OFFSET)).floor()\n active_weight_a = d(0)\n }\n if (d(total_amount_b).isZero()) {\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(d(active_bin_price))\n .floor()\n active_weight_b = d(0)\n }\n }\n let total_weight_a = single_side ? d(0) : active_weight_a\n let total_weight_b = single_side ? d(0) : active_weight_b\n\n const diff_weight = d(DEFAULT_MAX_WEIGHT).sub(d(DEFAULT_MIN_WEIGHT)).floor()\n\n const left_end_bin_id = active_id > upper_bin_id ? upper_bin_id : active_id\n const right_start_bin_id = active_id < lower_bin_id ? lower_bin_id : active_id\n\n const diff_min_weight =\n active_id > lower_bin_id\n ? left_end_bin_id === lower_bin_id\n ? d(0)\n : diff_weight.div(d(left_end_bin_id - lower_bin_id)).floor()\n : d(0)\n\n const diff_max_weight =\n upper_bin_id > active_id\n ? right_start_bin_id === upper_bin_id\n ? d(0)\n : diff_weight.div(d(upper_bin_id - right_start_bin_id)).floor()\n : d(0)\n\n let bin_id = lower_bin_id\n let weights: Decimal[] = []\n let weight_per_prices: Decimal[] = []\n\n while (bin_id <= upper_bin_id) {\n let weight: Decimal = d(0)\n if (bin_id < active_id) {\n const delta_bin = left_end_bin_id - bin_id\n if (strategy_type === StrategyType.Spot) {\n weight = d(1)\n } else if (strategy_type === StrategyType.BidAsk) {\n weight = d(base_weight).add(diff_min_weight.mul(delta_bin)).floor()\n } else if (strategy_type === StrategyType.Curve) {\n weight = d(base_weight).sub(diff_min_weight.mul(delta_bin)).floor()\n }\n } else if (bin_id > active_id) {\n const delta_bin = bin_id - right_start_bin_id\n if (strategy_type === StrategyType.Spot) {\n weight = d(1)\n } else if (strategy_type === StrategyType.BidAsk) {\n weight = d(base_weight).add(diff_max_weight.mul(delta_bin)).floor()\n } else if (strategy_type === StrategyType.Curve) {\n weight = d(base_weight).sub(diff_max_weight.mul(delta_bin)).floor()\n }\n } else {\n weight = base_weight\n }\n weights.push(weight)\n\n if (bin_id < active_id) {\n total_weight_b = total_weight_b.add(weight.mul(d(2).pow(SCALE_OFFSET))).floor()\n weight_per_prices.push(d(0))\n } else if (bin_id > active_id) {\n const weight_per_price = weight\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(BinUtils.getQPriceFromId(bin_id, bin_step))\n .floor()\n weight_per_prices.push(weight_per_price)\n total_weight_a = total_weight_a.add(weight_per_price).floor()\n } else {\n weight_per_prices.push(d(0))\n }\n\n bin_id += 1\n }\n\n return {\n ...options,\n total_weight_a,\n total_weight_b,\n active_weight_a,\n active_weight_b,\n weights,\n weight_per_prices,\n }\n }\n\n static toWeightSpotBalanced(min_bin_id: number, max_bin_id: number): BinWeight[] {\n let distributions = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n distributions.push({\n bin_id: i,\n weight: 1,\n })\n }\n return distributions\n }\n\n static toWeightDescendingOrder(min_bin_id: number, max_bin_id: number): BinWeight[] {\n let distributions = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n distributions.push({\n bin_id: i,\n weight: max_bin_id - i + 1,\n })\n }\n return distributions\n }\n\n static toWeightAscendingOrder(min_bin_id: number, max_bin_id: number): BinWeight[] {\n let distributions = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n distributions.push({\n bin_id: i,\n weight: i - min_bin_id + 1,\n })\n }\n return distributions\n }\n\n static toWeightCurve(min_bin_id: number, max_bin_id: number, active_id: number): BinWeight[] {\n if (active_id < min_bin_id) {\n return WeightUtils.toWeightDescendingOrder(min_bin_id, max_bin_id)\n } else if (active_id > max_bin_id) {\n return WeightUtils.toWeightAscendingOrder(min_bin_id, max_bin_id)\n }\n\n let maxWeight = DEFAULT_MAX_WEIGHT\n let minWeight = DEFAULT_MIN_WEIGHT\n\n let diffWeight = maxWeight - minWeight\n let diffMinWeight = active_id > min_bin_id ? Math.floor(diffWeight / (active_id - min_bin_id)) : 0\n let diffMaxWeight = max_bin_id > active_id ? Math.floor(diffWeight / (max_bin_id - active_id)) : 0\n\n let distributions: BinWeight[] = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n if (i < active_id) {\n distributions.push({\n bin_id: i,\n weight: maxWeight - (active_id - i) * diffMinWeight,\n })\n } else if (i > active_id) {\n distributions.push({\n bin_id: i,\n weight: maxWeight - (i - active_id) * diffMaxWeight,\n })\n } else {\n distributions.push({\n bin_id: i,\n weight: maxWeight,\n })\n }\n }\n return distributions\n }\n\n static toWeightBidAsk(min_bin_id: number, max_bin_id: number, active_id: number): BinWeight[] {\n if (active_id > max_bin_id) {\n return WeightUtils.toWeightDescendingOrder(min_bin_id, max_bin_id)\n } else if (active_id < min_bin_id) {\n return WeightUtils.toWeightAscendingOrder(min_bin_id, max_bin_id)\n }\n\n let maxWeight = DEFAULT_MAX_WEIGHT\n let minWeight = DEFAULT_MIN_WEIGHT\n\n let diffWeight = maxWeight - minWeight\n let diffMinWeight = active_id > min_bin_id ? Math.floor(diffWeight / (active_id - min_bin_id)) : 0\n let diffMaxWeight = max_bin_id > active_id ? Math.floor(diffWeight / (max_bin_id - active_id)) : 0\n\n let distributions: BinWeight[] = []\n for (let i = min_bin_id; i <= max_bin_id; i++) {\n if (i < active_id) {\n distributions.push({\n bin_id: i,\n weight: minWeight + (active_id - i) * diffMinWeight,\n })\n } else if (i > active_id) {\n distributions.push({\n bin_id: i,\n weight: minWeight + (i - active_id) * diffMaxWeight,\n })\n } else {\n distributions.push({\n bin_id: i,\n weight: minWeight,\n })\n }\n }\n return distributions\n }\n\n /**\n * Distribute totalAmount to all bid side bins according to given distributions.\n * @param active_id - active bin id\n * @param amount_b - total amount of coin b to be distributed\n * @param distributions - weight distribution of each bin\n * @returns array of {binId, amount} where amount is the amount of coin b in each bin\n */\n static toAmountBidSide(\n active_id: number,\n amount_b: string,\n bin_step: number,\n distributions: BinWeight[],\n contain_active_bin = false\n ): BinLiquidityInfo {\n // get sum of weight\n const totalWeight = distributions\n .filter((bin) => bin.bin_id <= active_id)\n .reduce(function (sum, el) {\n if (contain_active_bin) {\n return el.bin_id > active_id ? sum : sum.add(el.weight) // skip all ask side\n } else {\n return el.bin_id >= active_id ? sum : sum.add(el.weight) // skip all ask side\n }\n }, d(0))\n\n if (totalWeight.cmp(d(0)) != 1) {\n throw Error('Invalid parameters')\n }\n\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n\n const isValidBin = bin.bin_id <= active_id\n\n if (!isValidBin || (bin.bin_id >= active_id && !contain_active_bin)) {\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: '0',\n price_per_lamport,\n liquidity: '0',\n }\n } else {\n const rate = d(bin.weight).div(totalWeight)\n const amount_b_in_bin = safeMulAmount(d(amount_b), rate).toString()\n const amount_a = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a, amount_b_in_bin, qPrice)\n return {\n bin_id: bin.bin_id,\n amount_b: amount_b_in_bin,\n amount_a,\n price_per_lamport,\n liquidity,\n }\n }\n })\n\n return {\n bins: bin_amounts,\n amount_a: '0',\n amount_b,\n }\n }\n\n /**\n * Distribute totalAmount to all ask side bins according to given distributions.\n * @param active_id active bin id\n * @param amount_a total amount of coin a to be distributed\n * @param distributions weight distribution of each bin\n * @returns array of {binId, amount} where amount is the amount of coin a in each bin\n */\n static toAmountAskSide(\n active_id: number,\n bin_step: number,\n amount_a: string,\n distributions: BinWeight[],\n contain_active_bin = false\n ): BinLiquidityInfo {\n // get sum of weight\n const totalWeight: Decimal = distributions\n .filter((bin) => bin.bin_id >= active_id)\n .reduce(function (sum, el) {\n if (el.bin_id <= active_id && !contain_active_bin) {\n return sum\n } else {\n const price_per_lamport = BinUtils.getPricePerLamportFromBinId(el.bin_id, bin_step)\n const weightPerPrice = new Decimal(el.weight).div(price_per_lamport)\n return sum.add(weightPerPrice)\n }\n }, new Decimal(0))\n\n if (totalWeight.cmp(new Decimal(0)) != 1) {\n throw Error('Invalid parameters')\n }\n\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n const isValidBin = bin.bin_id >= active_id\n\n if (!isValidBin || (bin.bin_id <= active_id && !contain_active_bin)) {\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: '0',\n price_per_lamport,\n liquidity: '0',\n }\n } else {\n const weightPerPrice = new Decimal(bin.weight).div(price_per_lamport)\n const rate = weightPerPrice.div(totalWeight)\n const amount_a_in_bin = safeMulAmount(d(amount_a), rate).toString()\n const amount_b = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a_in_bin, amount_b, qPrice)\n return {\n bin_id: bin.bin_id,\n amount_a: amount_a_in_bin,\n amount_b,\n price_per_lamport,\n liquidity,\n }\n }\n })\n\n return {\n bins: bin_amounts,\n amount_a,\n amount_b: '0',\n }\n }\n\n /**\n * Distributes the given amounts of tokens X and Y to both bid and ask side bins\n * based on the provided weight distributions.\n *\n * @param activeId - The id of the active bin.\n * @param binStep - The step interval between bin ids.\n * @param amountX - Total amount of token X to distribute.\n * @param amountY - Total amount of token Y to distribute.\n * @param amountXInActiveBin - Amount of token X already in the active bin.\n * @param amountYInActiveBin - Amount of token Y already in the active bin.\n * @param distributions - Array of bins with their respective weight distributions.\n * @param mintX - Mint information for token X. Get from DLMM instance.\n * @param mintY - Mint information for token Y. Get from DLMM instance.\n * @param clock - Clock instance. Get from DLMM instance.\n * @returns An array of objects containing binId, amountX, and amountY for each bin.\n */\n static toAmountBothSide(\n active_id: number,\n bin_step: number,\n amount_a: string,\n amount_b: string,\n amount_a_in_active_bin: string,\n amount_b_in_active_bin: string,\n distributions: BinWeight[]\n ): BinLiquidityInfo {\n const isOnlyAmountA = !d(amount_a).isZero() && d(amount_b).isZero()\n const isOnlyAmountB = d(amount_a).isZero() && !d(amount_b).isZero()\n\n // only bid side\n if (active_id > distributions[distributions.length - 1].bin_id) {\n return WeightUtils.toAmountBidSide(active_id, amount_b, bin_step, distributions)\n }\n\n if (isOnlyAmountB && active_id !== distributions[distributions.length - 1].bin_id) {\n return WeightUtils.toAmountBidSide(active_id, amount_b, bin_step, distributions, true)\n }\n\n // only ask side\n if (active_id < distributions[0].bin_id) {\n return WeightUtils.toAmountAskSide(active_id, bin_step, amount_a, distributions)\n }\n\n if (isOnlyAmountA && active_id !== distributions[0].bin_id) {\n return WeightUtils.toAmountAskSide(active_id, bin_step, amount_a, distributions, true)\n }\n\n const activeBins = distributions.filter((element) => {\n return element.bin_id === active_id\n })\n\n if (activeBins.length === 1) {\n const { totalWeightA, totalWeightB, activeWeightA, activeWeightB } = WeightUtils.calculateTotalWeights(\n bin_step,\n distributions,\n active_id,\n activeBins[0],\n amount_a_in_active_bin,\n amount_b_in_active_bin,\n isOnlyAmountA ? 'a' : isOnlyAmountB ? 'b' : undefined\n )\n const kA = new Decimal(amount_a.toString()).div(totalWeightA)\n const kB = new Decimal(amount_b.toString()).div(totalWeightB)\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n if (bin.bin_id < active_id || (bin.bin_id === active_id && isOnlyAmountB)) {\n const amount_b = safeMulAmount(kB, new Decimal(bin.weight))\n const amount_a = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a, amount_b.toString(), qPrice)\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: amount_b.toString(),\n price_per_lamport,\n liquidity,\n }\n }\n if (bin.bin_id > active_id || (bin.bin_id === active_id && isOnlyAmountA)) {\n const weighPerPrice = new Decimal(bin.weight).div(price_per_lamport)\n const amount_a = safeMulAmount(kA, new Decimal(weighPerPrice))\n const amount_b = '0'\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a.toString(), amount_b, qPrice)\n\n return {\n bin_id: bin.bin_id,\n amount_a: amount_a.toString(),\n amount_b: '0',\n price_per_lamport,\n liquidity,\n }\n }\n\n const amountAActiveBin = safeMulAmount(kA, activeWeightA)\n const amountBActiveBin = safeMulAmount(kB, activeWeightB)\n let amount_a = amountAActiveBin.toString()\n let amount_b = amountBActiveBin.toString()\n\n const qPrice = BinUtils.getQPriceFromId(bin.bin_id, bin_step)\n const liquidity = BinUtils.getLiquidity(amount_a, amount_b, qPrice)\n return {\n bin_id: bin.bin_id,\n amount_a,\n amount_b,\n price_per_lamport,\n liquidity,\n }\n })\n\n const total_amount_a = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_a)), d(0)).toString()\n const total_amount_b = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_b)), d(0)).toString()\n\n return {\n bins: bin_amounts,\n amount_a: total_amount_a,\n amount_b: total_amount_b,\n }\n } else {\n const { totalWeightA, totalWeightB } = WeightUtils.calculateTotalWeights(bin_step, distributions, active_id)\n let kA = new Decimal(amount_a.toString()).div(totalWeightA)\n let kB = new Decimal(amount_b.toString()).div(totalWeightB)\n // let k = kA.lessThan(kB) ? kA : kB\n\n const bin_amounts = distributions.map((bin) => {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(bin.bin_id, bin_step)\n if (bin.bin_id < active_id) {\n const amount = safeMulAmount(kB, new Decimal(bin.weight))\n return {\n bin_id: bin.bin_id,\n amount_a: '0',\n amount_b: amount.toString(),\n price_per_lamport,\n }\n } else {\n let weighPerPrice = new Decimal(bin.weight).div(price_per_lamport)\n const amount = safeMulAmount(kA, weighPerPrice)\n return {\n bin_id: bin.bin_id,\n amount_a: amount.toString(),\n amount_b: '0',\n price_per_lamport,\n }\n }\n })\n\n const total_amount_a = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_a)), d(0)).toString()\n const total_amount_b = bin_amounts.reduce((sum, bin) => d(sum).add(d(bin.amount_b)), d(0)).toString()\n\n return {\n bins: bin_amounts,\n amount_a: total_amount_a,\n amount_b: total_amount_b,\n }\n }\n }\n\n /**\n * Distributes the given amount of coin B to both bid and ask side bins\n * based on the provided weight distributions.\n *\n * @param active_id - The id of the active bin.\n * @param bin_step - The step interval between bin ids.\n * @param amount_a - Total amount of coin A to distribute.\n * @param amount_a_in_active_bin - Amount of coin A already in the active bin.\n * @param amount_b_in_active_bin - Amount of coin B already in the active bin.\n * @param distributions - Array of bins with their respective weight distributions.\n * @returns An array of objects containing binId, amountA, and amountB for each bin.\n */\n static autoFillCoinByWeight(\n active_id: number,\n bin_step: number,\n amount: string,\n fix_amount_a: boolean,\n amount_a_in_active_bin: string,\n amount_b_in_active_bin: string,\n distributions: BinWeight[]\n ): BinLiquidityInfo {\n // only bid side\n if (active_id > distributions[distributions.length - 1].bin_id) {\n return WeightUtils.toAmountBidSide(active_id, amount, bin_step, distributions)\n }\n // only ask side\n if (active_id < distributions[0].bin_id) {\n return WeightUtils.toAmountAskSide(active_id, bin_step, amount, distributions)\n }\n\n const activeBins = distributions.filter((element) => {\n return element.bin_id === active_id\n })\n\n const { totalWeightA, totalWeightB } = WeightUtils.calculateTotalWeights(\n bin_step,\n distributions,\n active_id,\n activeBins.length === 1 ? activeBins[0] : undefined,\n activeBins.length === 1 ? amount_a_in_active_bin : undefined,\n activeBins.length === 1 ? amount_b_in_active_bin : undefined\n )\n\n let k = d(0)\n\n if (fix_amount_a) {\n k = totalWeightA.isZero() ? new Decimal(0) : new Decimal(amount).div(totalWeightA)\n } else {\n k = totalWeightB.isZero() ? new Decimal(0) : new Decimal(amount).div(totalWeightB)\n }\n const other_amount = safeMulAmount(k, fix_amount_a ? totalWeightB : totalWeightA).toString()\n\n return WeightUtils.toAmountBothSide(\n active_id,\n bin_step,\n fix_amount_a ? amount : other_amount,\n fix_amount_a ? other_amount : amount,\n amount_a_in_active_bin,\n amount_b_in_active_bin,\n distributions\n )\n }\n\n static calculateActiveWeights(\n amount_a_in_active_id: string,\n amount_b_in_active_id: string,\n active_bin_price: string,\n base_weight: Decimal\n ): { active_weight_a: Decimal; active_weight_b: Decimal } {\n const p0 = d(active_bin_price)\n const amountA = d(amount_a_in_active_id)\n const amountB = d(amount_b_in_active_id)\n\n let active_weight_a: Decimal = d(0)\n let active_weight_b: Decimal = d(0)\n\n if (amountA.isZero() && amountB.isZero()) {\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(p0.mul(2))\n .floor()\n active_weight_b = d(base_weight).mul(d(2).pow(SCALE_OFFSET)).div(2).floor()\n } else {\n // Calculate wx0\n if (amountA.isZero()) {\n active_weight_a = d(0)\n } else {\n const m = amountB.mul(d(2).pow(SCALE_OFFSET)).div(amountA)\n active_weight_a = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(p0.add(m))\n .floor()\n }\n\n // Calculate wy0\n if (amountB.isZero()) {\n active_weight_b = d(0)\n } else {\n const m = d(2).pow(SCALE_OFFSET).add(p0.mul(amountA).div(amountB)).floor()\n active_weight_b = d(base_weight)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(m)\n .floor()\n }\n }\n\n return { active_weight_a, active_weight_b }\n }\n\n static calculateTotalWeights(\n bin_step: number,\n distributions: BinWeight[],\n active_id: number,\n activeBin?: BinWeight,\n amount_a_in_active_bin?: string,\n amount_b_in_active_bin?: string,\n is_only_amount?: 'a' | 'b'\n ): { totalWeightA: Decimal; totalWeightB: Decimal; activeWeightA: Decimal; activeWeightB: Decimal } {\n const p0 = d(BinUtils.getPricePerLamportFromBinId(active_id, bin_step))\n let activeWeightA = d(0)\n let activeWeightB = d(0)\n\n if (amount_a_in_active_bin && amount_b_in_active_bin && activeBin && !is_only_amount) {\n if (d(amount_a_in_active_bin).isZero() && d(amount_b_in_active_bin).isZero()) {\n activeWeightA = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n activeWeightB = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n let amountAInActiveBinDec = new Decimal(amount_a_in_active_bin.toString())\n let amountBInActiveBinDec = new Decimal(amount_b_in_active_bin.toString())\n\n if (!d(amount_a_in_active_bin).isZero()) {\n activeWeightA = new Decimal(activeBin.weight).div(p0.add(amountBInActiveBinDec.div(amountAInActiveBinDec)))\n }\n if (!d(amount_b_in_active_bin).isZero()) {\n activeWeightB = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountAInActiveBinDec).div(amountBInActiveBinDec)))\n }\n }\n }\n\n let totalWeightA = activeWeightA\n let totalWeightB = activeWeightB\n distributions.forEach((element) => {\n if (element.bin_id < active_id || is_only_amount === 'b') {\n totalWeightB = totalWeightB.add(new Decimal(element.weight))\n }\n if (element.bin_id > active_id || is_only_amount === 'a') {\n let price_per_lamport = BinUtils.getPricePerLamportFromBinId(element.bin_id, bin_step)\n let weighPerPrice = new Decimal(element.weight).div(price_per_lamport)\n totalWeightA = totalWeightA.add(weighPerPrice)\n }\n })\n return { totalWeightA, totalWeightB, activeWeightA, activeWeightB }\n }\n}\n","import { d } from '@cetusprotocol/common-sdk'\nimport { BinAmount, BinLiquidityInfo, StrategyType, WeightsInfo } from '../types/dlmm'\nimport { WeightUtils } from './weightUtils'\nimport { BinUtils, SCALE_OFFSET } from './binUtils'\nimport { safeAmount, safeMulAmount } from './parseData'\nimport Decimal from 'decimal.js'\n\nexport class StrategyUtils {\n static toAmountsByWeights(weights_info: WeightsInfo): BinLiquidityInfo {\n const {\n total_weight_a,\n total_weight_b,\n weights,\n weight_per_prices,\n total_amount_a,\n total_amount_b,\n active_weight_a,\n active_weight_b,\n lower_bin_id,\n upper_bin_id,\n active_id,\n bin_step,\n } = weights_info\n\n const ky = total_weight_b.isZero()\n ? d(0)\n : d(total_amount_b)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(total_weight_b)\n .floor()\n\n const kx = total_weight_a.isZero()\n ? d(0)\n : d(total_amount_a)\n .mul(d(2).pow(SCALE_OFFSET * 2))\n .div(total_weight_a)\n .floor()\n\n const amount_a_in_active_id = safeAmount(kx.mul(active_weight_a).div(d(2).pow(SCALE_OFFSET * 2)))\n const amount_b_in_active_id = safeAmount(ky.mul(active_weight_b).div(d(2).pow(SCALE_OFFSET * 2)))\n\n const bin_count = upper_bin_id - lower_bin_id + 1\n let bin_id = lower_bin_id\n let idx = 0\n const bin_amounts: BinAmount[] = []\n while (idx < bin_count) {\n let amount_a_in_bin = d(0)\n let amount_b_in_bin = d(0)\n\n const qPrice = BinUtils.getQPriceFromId(bin_id, bin_step)\n\n if (bin_id < active_id) {\n amount_b_in_bin = safeAmount(ky.mul(weights[idx]).div(d(2).pow(SCALE_OFFSET)))\n } else if (bin_id > active_id) {\n amount_a_in_bin = safeAmount(kx.mul(weight_per_prices[idx]).div(d(2).pow(SCALE_OFFSET * 2)))\n } else {\n amount_a_in_bin = amount_a_in_active_id\n amount_b_in_bin = amount_b_in_active_id\n }\n const liquidity = BinUtils.getLiquidity(amount_a_in_bin.toString(), amount_b_in_bin.toString(), qPrice)\n\n bin_amounts.push({\n bin_id,\n amount_a: amount_a_in_bin.toString(),\n amount_b: amount_b_in_bin.toString(),\n price_per_lamport: BinUtils.getPricePerLamportFromBinId(bin_id, bin_step),\n liquidity,\n })\n bin_id += 1\n idx += 1\n }\n\n const info: BinLiquidityInfo = {\n bins: bin_amounts,\n amount_a: total_amount_a.toString(),\n amount_b: total_amount_b.toString(),\n }\n return info\n }\n\n /**\n * Given a strategy type and amounts of X and Y, returns the distribution of liquidity.\n * @param active_id The bin id of the active bin.\n * @param bin_step The step size of each bin.\n * @param min_bin_id The min bin id.\n * @param max_bin_id The max bin id.\n * @param amount_a The amount of X token to deposit.\n * @param amount_b The amount of Y token to deposit.\n * @param amount_a_in_active_bin The amount of X token in the active bin.\n * @param amount_b_in_active_bin The amount of Y token in the active bin.\n * @param strategy_type The strategy type.\n * @returns The distribution of liquidity.\n */\n static toAmountsBothSideByStrategy(\n active_id: number,\n bin_step: number,\n min_bin_id: number,\n max_bin_id: number,\n amount_a: string,\n amount_b: string,\n strategy_type: StrategyType,\n active_bin_of_pool?: BinAmount\n ): BinLiquidityInfo {\n const weights = WeightUtils.toWeight({\n strategy_type,\n active_id,\n bin_step,\n lower_bin_id: min_bin_id,\n upper_bin_id: max_bin_id,\n total_amount_a: amount_a,\n total_amount_b: amount_b,\n active_bin_of_pool,\n })\n\n return this.toAmountsByWeights(weights)\n }\n\n static autoFillCoinByStrategy(\n active_id: number,\n bin_step: number,\n amount: string,\n fix_amount_a: boolean,\n min_bin_id: number,\n max_bin_id: number,\n strategy_type: StrategyType,\n active_bin_of_pool?: BinAmount\n ): BinLiquidityInfo {\n switch (strategy_type) {\n case StrategyType.Spot: {\n let weights = WeightUtils.toWeightSpotBalanced(min_bin_id, max_bin_id)\n return WeightUtils.autoFillCoinByWeight(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n active_bin_of_pool?.amount_a || '0',\n active_bin_of_pool?.amount_b || '0',\n weights\n )\n }\n case StrategyType.Curve: {\n let weights = WeightUtils.toWeightCurve(min_bin_id, max_bin_id, active_id)\n return WeightUtils.autoFillCoinByWeight(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n active_bin_of_pool?.amount_a || '0',\n active_bin_of_pool?.amount_b || '0',\n weights\n )\n }\n case StrategyType.BidAsk: {\n let weights = WeightUtils.toWeightBidAsk(min_bin_id, max_bin_id, active_id)\n return WeightUtils.autoFillCoinByWeight(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n active_bin_of_pool?.amount_a || '0',\n active_bin_of_pool?.amount_b || '0',\n weights\n )\n }\n }\n }\n\n // only apply for\n static autoFillCoinByStrategyV2(\n active_id: number,\n bin_step: number,\n amount: string,\n fix_amount_a: boolean,\n min_bin_id: number,\n max_bin_id: number,\n strategy_type: StrategyType,\n active_bin_of_pool?: BinAmount\n ): BinLiquidityInfo {\n const info = this.autoFillCoinByStrategy(\n active_id,\n bin_step,\n amount,\n fix_amount_a,\n min_bin_id,\n max_bin_id,\n strategy_type,\n active_bin_of_pool\n )\n const weights = WeightUtils.toWeight({\n strategy_type,\n active_id,\n bin_step,\n lower_bin_id: min_bin_id,\n upper_bin_id: max_bin_id,\n total_amount_a: info.amount_a,\n total_amount_b: info.amount_b,\n active_bin_of_pool,\n })\n\n return this.toAmountsByWeights(weights)\n }\n}\n","import { d } from '@cetusprotocol/common-sdk'\nimport { BinAmount, BinStepConfig, VariableParameters } from '../types/dlmm'\nimport { BinUtils } from './binUtils'\nimport { BASIS_POINT, FEE_PRECISION, MAX_FEE_RATE } from '../types/constants'\n\nexport class FeeUtils {\n static getVariableFee(variableParameters: VariableParameters): string {\n const { volatility_accumulator, bin_step_config } = variableParameters\n const { variable_fee_control, bin_step } = bin_step_config\n\n if (d(variable_fee_control).gt(0)) {\n const square_vfa_bin = d(volatility_accumulator).mul(bin_step).pow(2)\n const v_fee = square_vfa_bin.mul(variable_fee_control)\n const scaled_v_fee = v_fee.add(99_999_999_999).div(100_000_000_000)\n return scaled_v_fee.toFixed(0)\n }\n return '0'\n }\n\n static calculateCompositionFee(amount: string, total_fee_rate: string) {\n const fee_amount = d(amount).mul(total_fee_rate)\n const composition_fee = d(fee_amount).mul(d(FEE_PRECISION).add(total_fee_rate))\n return composition_fee.div(1000000000000000000).toFixed(0)\n }\n\n static calculateProtocolFee(fee_amount: string, protocol_fee_rate: string) {\n const protocol_fee = d(fee_amount).mul(protocol_fee_rate).div(BASIS_POINT).ceil().toFixed(0)\n return protocol_fee\n }\n\n static getProtocolFees(fee_a: string, fee_b: string, protocol_fee_rate: string) {\n const protocol_fee_a = FeeUtils.calculateProtocolFee(fee_a, protocol_fee_rate)\n const protocol_fee_b = FeeUtils.calculateProtocolFee(fee_b, protocol_fee_rate)\n return {\n protocol_fee_a,\n protocol_fee_b,\n }\n }\n\n static getCompositionFees(\n active_bin: BinAmount,\n used_bin: BinAmount,\n variableParameters: VariableParameters\n ): { fees_a: string; fees_b: string } {\n const { bin_step_config } = variableParameters\n if (d(active_bin.liquidity || '0').eq(d(0))) {\n return {\n fees_a: '0',\n fees_b: '0',\n }\n }\n const { bin_step, base_factor } = bin_step_config\n const qPrice = BinUtils.getQPriceFromId(active_bin.bin_id, bin_step)\n const bin_liquidity = BinUtils.getLiquidity(active_bin.amount_a, active_bin.amount_b, qPrice)\n const delta_liquidity = BinUtils.getLiquidity(used_bin.amount_a, used_bin.amount_b, qPrice)\n const delta_liquidity_share = d(active_bin.liquidity).mul(delta_liquidity).div(bin_liquidity).toFixed(0)\n\n const { amount_a: amount_a_out, amount_b: amount_b_out } = BinUtils.calculateOutByShare(\n {\n bin_id: active_bin.bin_id,\n liquidity: d(active_bin.liquidity).add(delta_liquidity_share).toFixed(0),\n amount_a: d(active_bin.amount_a).add(used_bin.amount_a).toFixed(0),\n amount_b: d(active_bin.amount_b).add(used_bin.amount_b).toFixed(0),\n price_per_lamport: active_bin.price_per_lamport,\n },\n delta_liquidity_share\n )\n\n const base_fee = d(bin_step).mul(base_factor).mul(10)\n const variable_fee = FeeUtils.getVariableFee(variableParameters)\n\n let total_fee_rate = d(base_fee).add(variable_fee).toFixed(0)\n\n if (d(total_fee_rate).gt(MAX_FEE_RATE)) {\n total_fee_rate = MAX_FEE_RATE.toString()\n }\n\n let fees_a = '0'\n let fees_b = '0'\n\n if (d(amount_a_out).gt(used_bin.amount_a) && d(used_bin.amount_b).gt(amount_b_out)) {\n fees_b = FeeUtils.calculateCompositionFee(d(used_bin.amount_b).sub(amount_b_out).toFixed(0), total_fee_rate)\n } else if (d(amount_b_out).gt(used_bin.amount_b) && d(used_bin.amount_a).gt(amount_a_out)) {\n fees_a = FeeUtils.calculateCompositionFee(d(used_bin.amount_a).sub(amount_a_out).toFixed(0), total_fee_rate)\n }\n\n return {\n fees_a,\n fees_b,\n }\n }\n}\n","import { BASIS_POINT_MAX } from '../types/constants'\nimport { Axis, IlmInputOptions, IlmInputResult, TokenTable } from '../types/ilm'\nimport { BinUtils } from './binUtils'\n\nexport class IlmUtils {\n static calculateIlm(options: IlmInputOptions): IlmInputResult {\n const { curvature, initial_price, max_price, bin_step, total_supply, pool_share_percentage, config } = options\n const { price_curve_points_num, liquidity_distribution_num, tokens_table_num, price_table_num } = config\n if (pool_share_percentage < 0 || pool_share_percentage > 100) {\n throw new Error('Pool Share Percentage must be greater than 0 and less than 100.')\n }\n\n let flat = false\n\n if (max_price < initial_price) {\n throw new Error('Maximum Price must be greater or equal to Initial Price.')\n } else if (max_price === initial_price && curvature !== 0) {\n throw new Error('Curvature must be 0 when Maximum and Initial Price are equal.')\n } else if (max_price !== initial_price && curvature === 0) {\n throw new Error('Maximum and Initial Price must be equal when Curvature is 0.')\n } else if (max_price === initial_price && curvature === 0) {\n flat = true\n }\n\n const myFormula = (c: number) => {\n // f * Math.pow((c / A), k) + i;\n return price_diff * Math.pow(c / pool_supply, curvature) + initial_price\n }\n\n const integrate = (upper: number, lower: number) => {\n let u = (price_diff * Math.pow(pool_supply, -curvature) * Math.pow(upper, curvature + 1)) / (curvature + 1) + initial_price * upper\n let l = (price_diff * Math.pow(pool_supply, -curvature) * Math.pow(lower, curvature + 1)) / (curvature + 1) + initial_price * lower\n return u - l\n }\n\n const reverse_formula = (price: number) => {\n // A * Math.pow(((p- i) / f), 1 / k);\n return pool_supply * Math.pow((price - initial_price) / price_diff, 1 / curvature)\n }\n\n const liquidity = (price: number) => {\n // A * Math.pow((p - i), (1 / k) - 1) / (k * Math.pow(f, 1 / k));\n return (pool_supply * Math.pow(price - initial_price, 1 / curvature - 1)) / (curvature * Math.pow(price_diff, 1 / curvature))\n }\n\n const binTokens = (price: number) => {\n return Math.pow((price - initial_price) / price_diff, 1 / curvature) * pool_supply\n }\n\n const getBinIdFromLamportPrice = (pricePerLamport: number, binStep: number, min: boolean): number => {\n const binStepNum = binStep / BASIS_POINT_MAX\n const binId = Math.log(pricePerLamport) / Math.log(1 + binStepNum)\n return min ? Math.floor(binId) : Math.ceil(binId)\n }\n\n const getPricePerLamportFromBinId = (binId: number, binStep: number): number => {\n const binStepNum = binStep / BASIS_POINT_MAX\n return Math.pow(1 + binStepNum, binId)\n }\n\n const pool_supply = (total_supply * pool_share_percentage) / 100 // A\n const price_diff = max_price - initial_price // f\n\n const prices: number[] = []\n const heights: number[] = []\n\n let minBinId = getBinIdFromLamportPrice(initial_price, bin_step, false)\n let maxBinId = getBinIdFromLamportPrice(max_price, bin_step, false)\n let total = 0\n\n let binFlag = minBinId\n if (flat) {\n prices.push(initial_price)\n heights.push(initial_price * pool_supply)\n } else {\n while (binFlag <= maxBinId) {\n const price = getPricePerLamportFromBinId(binFlag, bin_step)\n const nextPrice = getPricePerLamportFromBinId(binFlag + 1, bin_step)\n const tokenDiff = binTokens(nextPrice) - binTokens(price)\n total = total + tokenDiff\n heights.push(tokenDiff * price)\n prices.push(price)\n binFlag++\n }\n }\n const result: IlmInputResult = {\n price_curve: {\n data: [],\n min_y: 0,\n max_y: 0,\n },\n liquidity_curve: {\n data: [],\n min_y: 0,\n max_y: 0,\n },\n dlmm_bins: {\n data: [],\n min_y: 0,\n max_y: 0,\n },\n tokens_table: [],\n price_table: [],\n initial_fdv: initial_price * total_supply,\n final_fdv: max_price * total_supply,\n usdc_in_pool: 0,\n }\n var LDstep = price_diff / 100\n\n // price curve\n const pricePoints: Axis[] = []\n let priceMin = 0\n let priceMax = 0\n for (let index = 0; index < price_curve_points_num; index++) {\n const x = (index * pool_supply) / (price_curve_points_num - 1)\n const y = flat ? max_price : myFormula(x)\n priceMin = priceMin < y ? priceMin : y\n priceMax = priceMax > y ? priceMax : y\n pricePoints.push({ x, y })\n }\n result.price_curve = {\n data: pricePoints,\n min_y: priceMin,\n max_y: priceMax,\n }\n\n // liquidity curve\n let liquidityPoints: Axis[] = []\n let liquidityMin = 0\n let liquidityMax = 0\n if (flat) {\n liquidityMin = 0\n liquidityMax = pool_supply\n liquidityPoints = [\n { x: initial_price, y: 0 },\n { x: initial_price, y: pool_supply / 2 },\n { x: initial_price, y: pool_supply },\n ]\n } else {\n for (let index = 0; index < liquidity_distribution_num; index++) {\n const x = initial_price + index * LDstep\n const y = liquidity(x)\n liquidityPoints.push({ x, y })\n liquidityMin = liquidityMin < y ? liquidityMin : y\n liquidityMax = liquidityMax > y ? liquidityMax : y\n }\n }\n result.liquidity_curve = {\n data: liquidityPoints,\n min_y: liquidityMin,\n max_y: liquidityMax,\n }\n\n // dlmm bins\n const dlmmBins: Axis[] = []\n let dlmmBinsMin = 0\n let dlmmBinsMax = 0\n prices.forEach((price, index) => {\n const x = price\n const y = heights[index]\n dlmmBins.push({ x, y })\n dlmmBinsMin = dlmmBinsMin < y ? dlmmBinsMin : y\n dlmmBinsMax = dlmmBinsMax > y ? dlmmBinsMax : y\n })\n result.dlmm_bins = {\n data: dlmmBins,\n min_y: dlmmBinsMin,\n max_y: dlmmBinsMax,\n }\n\n // Tokens Table\n const tokensTable: TokenTable[] = []\n let tokensWithdrawn = 0\n let step = pool_supply / tokens_table_num\n while (tokensWithdrawn <= pool_supply) {\n const price = myFormula(tokensWithdrawn)\n const n = tokensWithdrawn\n const amountUsd = integrate(n, 0)\n tokensTable.push({ withdrawn: n, price, usdc_in_pool: amountUsd })\n tokensWithdrawn = tokensWithdrawn + step\n }\n result.tokens_table = tokensTable\n\n // Price Table\n const step2 = Math.floor(price_diff * 10000000000) / 100000000000\n const priceTable: TokenTable[] = []\n if (flat) {\n priceTable.push({\n withdrawn: pool_supply,\n price: initial_price,\n usdc_in_pool: pool_supply * initial_price,\n })\n } else {\n let r = 0\n let price = initial_price\n while (r <= price_table_num) {\n const tokensWithdrawn = reverse_formula(price)\n const amountUsd = integrate(tokensWithdrawn, 0)\n priceTable.push({ withdrawn: tokensWithdrawn, price: price, usdc_in_pool: amountUsd })\n price = price + step2\n r = r + 1\n }\n }\n result.price_table = priceTable\n result.usdc_in_pool = priceTable[priceTable.length - 1].usdc_in_pool\n return result\n }\n}\n","import { FullRpcUrlTestnet, GraphRpcUrlTestnet } from '@cetusprotocol/common-sdk'\nimport type { SdkOptions } from '../sdk'\n\nexport const dlmmTestnet: SdkOptions = {\n env: 'testnet',\n full_rpc_url: FullRpcUrlTestnet,\n graph_rpc_url: GraphRpcUrlTestnet,\n dlmm_pool: {\n package_id: '0xb382224d12558da5f87624765065a8c7e8f5c899d0ee890610e2bb4e8c686be9',\n published_at: '0x1cdac9c678c5ec89c80409db8865c9c3f8e6207dfd988fb4ddd11e2806db0bf9',\n version: 1,\n config: {\n registry_id: '0xdc91c4f094557b9d2a35fc6159ef32649a54c4aa9350860bf0d4b52b5f0a3990',\n pools_id: '0xb518b1de84a1ba1ab6c9a2d71fcdf382ef36045a4660497b3d77fb0a6df7709e',\n global_config_id: '0xe84ebca8d61cdd9312cec3787204d0ee1063d424a81dcda62cfb8b1887041a9f',\n versioned_id: '0xf8478d6dc081bc266229f25ac9c31a96b5e99ecbd82222e883368dda95829065',\n admin_cap_id: '0x273dbda2a1d62460a01a07831aec0fa8191a41341d634fb43f15acdb627edbce',\n partners_id: '0xd7ac594ed2e7756f0d4a98503dd970f314f2619a10c3613c705253a155cc9fea',\n },\n },\n dlmm_router: {\n package_id: '0xbc76d04e910452518efd5fd63d5fffe77c24855063c9cdb5501e06896bc34908',\n published_at: '0xe122ffbcfe5091398ba15a60e654e6589fd586b3865d5b4118292754f8cde301',\n version: 1,\n },\n faucet: {\n package_id: '0x14a71d857b34677a7d57e0feb303df1adb515a37780645ab763d42ce8d1a5e48',\n published_at: '0x14a71d857b34677a7d57e0feb303df1adb515a37780645ab763d42ce8d1a5e48',\n version: 1,\n },\n}\n","import { asUintN, CLOCK_ADDRESS, CoinAssist, d, DETAILS_KEYS, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { Transaction, TransactionObjectArgument, TransactionResult } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { CetusDlmmSDK } from '../sdk'\nimport { BASIS_POINT, MAX_BIN_PER_POSITION } from '../types/constants'\nimport {\n AddLiquidityOption,\n BinAmount,\n BinLiquidityInfo,\n CalculateAddLiquidityAutoFillOption,\n CalculateAddLiquidityOption,\n CalculateRemoveLiquidityBothOption,\n CalculateRemoveLiquidityOnlyOption,\n ClosePositionOption,\n CollectFeeOption,\n CollectRewardAndFeeOption,\n CollectRewardOption,\n DlmmPosition,\n OpenAndAddLiquidityOption,\n OpenAndAddLiquidityWithPriceOption,\n PositionFee,\n PositionReward,\n RemoveLiquidityOption,\n StrategyType,\n UpdatePositionFeeAndRewardsOption,\n ValidateActiveIdSlippageOption,\n} from '../types/dlmm'\nimport {\n BinUtils,\n FeeUtils,\n getRouterModule,\n parsedDlmmPosFeeData,\n parsedDlmmPosRewardData,\n parseDlmmPosition,\n parseStrategyType,\n StrategyUtils,\n} from '../utils'\nimport Decimal from 'decimal.js'\n\nexport class PositionModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n buildPositionType(): string {\n const package_id = this._sdk.sdkOptions.dlmm_pool.package_id\n return `${package_id}::position::Position`\n }\n\n async getOwnerPositionList(owner: string): Promise<DlmmPosition[]> {\n const list: DlmmPosition[] = []\n try {\n const res = await this._sdk.FullClient.getOwnedObjectsByPage(owner, {\n options: { showType: true, showContent: true, showOwner: true },\n filter: {\n StructType: this.buildPositionType(),\n },\n })\n\n res.data.forEach((obj) => {\n list.push(parseDlmmPosition(obj))\n })\n } catch (error) {\n console.log('🚀 ~ PositionModule ~ getOwnerPositionList ~ error:', error)\n handleError(DlmmErrorCode.GetObjectError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getOwnerPositionList',\n [DETAILS_KEYS.REQUEST_PARAMS]: owner,\n })\n }\n\n return list\n }\n\n async getPosition(position_id: string): Promise<DlmmPosition> {\n try {\n const res = await this._sdk.FullClient.getObject({ id: position_id, options: { showType: true, showContent: true, showOwner: true } })\n return parseDlmmPosition(res)\n } catch (error) {\n console.log('🚀 ~ PositionModule ~ getPosition ~ error:', error)\n return handleError(DlmmErrorCode.GetObjectError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPosition',\n [DETAILS_KEYS.REQUEST_PARAMS]: position_id,\n })\n }\n }\n\n /**\n * Collect fee\n * @param option - The option for collecting fee\n * @param tx - The transaction object\n * @returns The transaction object\n */\n collectFeePayload(option: CollectFeeOption, tx?: Transaction): Transaction {\n const { pool_id, position_id, coin_type_a, coin_type_b } = option\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n const [fee_a_balance, fee_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::collect_position_fee`,\n arguments: [tx.object(pool_id), tx.object(position_id), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const fee_a_obj = CoinAssist.fromBalance(fee_a_balance, coin_type_a, tx)\n const fee_b_obj = CoinAssist.fromBalance(fee_b_balance, coin_type_b, tx)\n tx.transferObjects([fee_a_obj, fee_b_obj], this.sdk.getSenderAddress())\n\n return tx\n }\n\n /**\n * Update the fee and rewards of the position\n * @param option - The option for updating the fee and rewards of the position\n * @param tx - The transaction object\n * @returns The transaction object\n */\n updatePositionFeeAndRewards(option: UpdatePositionFeeAndRewardsOption, tx: Transaction) {\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id } = getPackagerConfigs(dlmm_pool)\n const { pool_id, position_id, coin_type_a, coin_type_b } = option\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::update_position_fee_and_rewards`,\n arguments: [tx.object(pool_id), tx.pure.id(position_id), tx.object(versioned_id), tx.object(CLOCK_ADDRESS)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return tx\n }\n\n /**\n * Collect reward\n * @param options - The option for collecting reward\n * @param tx - The transaction object\n * @returns The transaction object\n */\n collectRewardPayload(options: CollectRewardOption[], tx?: Transaction): Transaction {\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n options.forEach((option) => {\n const { pool_id, position_id, reward_coins, coin_type_a, coin_type_b } = option\n\n reward_coins.forEach((reward_coin) => {\n const reward_coin_balance = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::collect_position_reward`,\n arguments: [tx.object(pool_id), tx.object(position_id), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b, reward_coin],\n })\n\n const reward_coin_obj = CoinAssist.fromBalance(reward_coin_balance, reward_coin, tx)\n tx.transferObjects([reward_coin_obj], this.sdk.getSenderAddress())\n })\n })\n\n return tx\n }\n\n collectRewardAndFeePayload(options: CollectRewardAndFeeOption[], tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n\n options.forEach((option) => {\n const { pool_id, position_id, reward_coins, coin_type_a, coin_type_b } = option\n\n this.updatePositionFeeAndRewards({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n\n this.collectFeePayload({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n this.collectRewardPayload([{ pool_id, position_id, reward_coins, coin_type_a, coin_type_b }], tx)\n })\n\n return tx\n }\n\n /**\n * Validate the active id slippage\n * @param options - The option for validating the active id slippage\n * @param tx - The transaction object\n * @returns The transaction object\n */\n validateActiveIdSlippage(options: ValidateActiveIdSlippageOption, tx: Transaction): Transaction {\n const { pool_id, active_id, max_price_slippage, bin_step, coin_type_a, coin_type_b } = options\n const { dlmm_router } = this.sdk.sdkOptions\n\n const bin_shift = BinUtils.getBinShift(active_id, bin_step, max_price_slippage)\n const active_id_u32 = Number(asUintN(BigInt(active_id)))\n\n tx.moveCall({\n target: `${dlmm_router.published_at}::utils::validate_active_id_slippage`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n tx.pure.u32(Number(active_id_u32)),\n tx.pure.u32(Number(bin_shift)),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return tx\n }\n\n /**\n * Close a position\n * @param option - The option for closing a position\n * @returns The transaction object\n */\n closePositionPayload(option: ClosePositionOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { coin_a_obj, coin_b_obj } = this.closePositionNoTransferPayload(option, tx)\n tx.transferObjects([coin_a_obj, coin_b_obj], this.sdk.getSenderAddress())\n return tx\n }\n\n /**\n * Close a position without transferring the coins to the sender\n * @param option - The option for closing a position\n * @param tx\n * @returns The transaction object\n */\n closePositionNoTransferPayload(\n option: ClosePositionOption,\n tx: Transaction\n ): { coin_a_obj: TransactionObjectArgument; coin_b_obj: TransactionObjectArgument } {\n const { pool_id, position_id, reward_coins, coin_type_a, coin_type_b } = option\n const { dlmm_pool } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n this.updatePositionFeeAndRewards({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n\n this.collectRewardPayload([{ pool_id, position_id, reward_coins, coin_type_a, coin_type_b }], tx)\n\n const [close_position_cert, coin_a_balance, coin_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::close_position`,\n arguments: [\n tx.object(pool_id),\n tx.object(position_id),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const coin_a_obj = CoinAssist.fromBalance(coin_a_balance, coin_type_a, tx)\n const coin_b_obj = CoinAssist.fromBalance(coin_b_balance, coin_type_b, tx)\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::destroy_close_position_cert`,\n arguments: [close_position_cert, tx.object(versioned_id)],\n typeArguments: [],\n })\n\n return {\n coin_a_obj,\n coin_b_obj,\n }\n }\n\n /**\n * Get the amounts in the active bin if in range\n * @param bin_manager_handle - The bin manager handle\n * @param lower_bin_id - The lower bin id\n * @param upper_bin_id - The upper bin id\n * @param active_id - The active id\n * @returns The amounts in the active bin if in range\n */\n async getActiveBinIfInRange(\n bin_manager_handle: string,\n lower_bin_id: number,\n upper_bin_id: number,\n active_id: number,\n bin_step: number,\n force_refresh = false\n ): Promise<BinAmount | undefined> {\n if (active_id <= upper_bin_id && active_id >= lower_bin_id) {\n const bin_info = await this._sdk.Pool.getBinInfo(bin_manager_handle, active_id, bin_step, force_refresh)\n return bin_info\n }\n return undefined\n }\n\n /**\n * Calculate the result of removing liquidity\n * @param option - The option for calculating the result of removing liquidity\n * @returns The result of removing liquidity\n */\n calculateRemoveLiquidityInfo(option: CalculateRemoveLiquidityBothOption | CalculateRemoveLiquidityOnlyOption): BinLiquidityInfo {\n const { bins, active_id, coin_amount } = option\n const isBothSide = 'fix_amount_a' in option\n\n const bins_b = bins.filter((bin) => bin.bin_id < active_id)\n const bins_a = bins.filter((bin) => bin.bin_id > active_id)\n\n let total_amount = d(0)\n let amount_rate = d(0)\n let used_bins: BinAmount[] = []\n\n if (isBothSide) {\n used_bins = [...bins]\n const { fix_amount_a } = option\n const active_bin = bins.find((bin) => bin.bin_id === active_id)\n const total_amount_a = bins_a.reduce((acc, bin) => d(acc).plus(bin.amount_a), d(0)).add(active_bin?.amount_a || '0')\n const total_amount_b = bins_b.reduce((acc, bin) => d(acc).plus(bin.amount_b), d(0)).add(active_bin?.amount_b || '0')\n total_amount = fix_amount_a ? total_amount_a : total_amount_b\n\n amount_rate = d(coin_amount).gte(total_amount) ? d(1) : d(coin_amount).div(total_amount)\n } else {\n const { is_only_a } = option\n used_bins = is_only_a ? bins_a : bins_b\n total_amount = used_bins.reduce((acc, bin) => d(acc).plus(is_only_a ? bin.amount_a : bin.amount_b), d(0))\n\n amount_rate = d(coin_amount).gte(total_amount) ? d(1) : d(coin_amount).div(total_amount)\n }\n\n if (d(total_amount).isZero()) {\n return handleError(DlmmErrorCode.InsufficientLiquidity, new Error('Insufficient liquidity'), {\n [DETAILS_KEYS.METHOD_NAME]: 'calculateRemoveLiquidityResult',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const result_bins = BinUtils.processBinsByRate([...used_bins], amount_rate.toFixed())\n\n return result_bins\n }\n\n /**\n * Calculate the result of adding liquidity\n * @param option - The option for calculating the result of adding liquidity\n * @returns The result of adding liquidity\n */\n async calculateAddLiquidityInfo(option: CalculateAddLiquidityOption | CalculateAddLiquidityAutoFillOption): Promise<BinLiquidityInfo> {\n const isAutoFill = 'fix_amount_a' in option\n const { active_id, bin_step, lower_bin_id, upper_bin_id, active_bin_of_pool, strategy_type, pool_id } = option\n\n let bin_infos\n if (isAutoFill) {\n const { coin_amount, fix_amount_a } = option\n bin_infos = StrategyUtils.autoFillCoinByStrategyV2(\n active_id,\n bin_step,\n coin_amount,\n fix_amount_a,\n lower_bin_id,\n upper_bin_id,\n strategy_type,\n active_bin_of_pool\n )\n } else {\n bin_infos = StrategyUtils.toAmountsBothSideByStrategy(\n active_id,\n bin_step,\n lower_bin_id,\n upper_bin_id,\n option.amount_a,\n option.amount_b,\n strategy_type,\n active_bin_of_pool\n )\n }\n if (active_bin_of_pool && pool_id) {\n const active_bin_index = bin_infos.bins.findIndex((bin) => bin.bin_id === active_id)\n if (active_bin_index !== -1) {\n const pool = await this._sdk.Pool.getPool(pool_id, false)\n if (pool) {\n const { fees_a, fees_b } = FeeUtils.getCompositionFees(\n active_bin_of_pool,\n bin_infos.bins[active_bin_index],\n pool.variable_parameters\n )\n const active_bin = bin_infos.bins[active_bin_index]\n active_bin.amount_a = d(active_bin.amount_a).sub(fees_a).toFixed(0)\n active_bin.amount_b = d(active_bin.amount_b).sub(fees_b).toFixed(0)\n bin_infos.bins[active_bin_index] = active_bin\n }\n }\n }\n\n return bin_infos\n }\n\n /**\n * Remove liquidity\n * @param option - The option for removing liquidity\n * @returns The transaction\n */\n removeLiquidityPayload(option: RemoveLiquidityOption): Transaction {\n const tx = new Transaction()\n const { coin_a_obj, coin_b_obj } = this.removeLiquidityNoTransferPayload(option, tx)\n tx.transferObjects([coin_a_obj, coin_b_obj], this.sdk.getSenderAddress())\n return tx\n }\n\n removeLiquidityNoTransferPayload(\n option: RemoveLiquidityOption,\n tx: Transaction\n ): {\n coin_a_obj: TransactionObjectArgument\n coin_b_obj: TransactionObjectArgument\n } {\n const {\n pool_id,\n position_id,\n bin_infos,\n reward_coins,\n slippage,\n coin_type_a,\n coin_type_b,\n active_id,\n collect_fee,\n bin_step,\n remove_percent,\n } = option\n const { dlmm_pool } = this.sdk.sdkOptions\n const { bins } = bin_infos\n\n if (collect_fee || reward_coins.length > 0) {\n this.updatePositionFeeAndRewards({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n }\n if (collect_fee) {\n this.collectFeePayload({ pool_id, position_id, coin_type_a, coin_type_b }, tx)\n }\n\n this.collectRewardPayload([{ pool_id, position_id, reward_coins, coin_type_a, coin_type_b }], tx)\n\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n if (remove_percent) {\n const min_bin_id_u32 = asUintN(BigInt(bins[0].bin_id))\n const max_bin_id_u32 = asUintN(BigInt(bins[bins.length - 1].bin_id))\n const remove_percent_fixed = Number(d(remove_percent).mul(BASIS_POINT).toFixed(0))\n const [coin_a_balance, coin_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::remove_liquidity_by_percent`,\n arguments: [\n tx.object(pool_id),\n tx.object(position_id),\n tx.pure.u32(Number(min_bin_id_u32)),\n tx.pure.u32(Number(max_bin_id_u32)),\n tx.pure.u16(remove_percent_fixed),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n const coin_a_obj = CoinAssist.fromBalance(coin_a_balance, coin_type_a, tx)\n const coin_b_obj = CoinAssist.fromBalance(coin_b_balance, coin_type_b, tx)\n\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage: slippage, bin_step, coin_type_a, coin_type_b }, tx)\n\n return {\n coin_a_obj,\n coin_b_obj,\n }\n } else {\n const bin_amounts = tx.pure.vector(\n 'u32',\n bins.map((bin) => Number(asUintN(BigInt(bin.bin_id))))\n )\n const remove_liquiditys = tx.pure.vector(\n 'u128',\n bins.map((bin) => bin.liquidity!)\n )\n\n const [coin_a_balance, coin_b_balance] = tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::remove_liquidity`,\n arguments: [\n tx.object(pool_id),\n tx.object(position_id),\n bin_amounts,\n remove_liquiditys,\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage: slippage, bin_step, coin_type_a, coin_type_b }, tx)\n\n const coin_a_obj = CoinAssist.fromBalance(coin_a_balance, coin_type_a, tx)\n const coin_b_obj = CoinAssist.fromBalance(coin_b_balance, coin_type_b, tx)\n\n return {\n coin_a_obj,\n coin_b_obj,\n }\n }\n }\n\n /**\n * Add liquidity with price\n * @param option - The option for adding liquidity with price\n * @returns The transaction\n */\n async addLiquidityWithPricePayload(option: OpenAndAddLiquidityWithPriceOption): Promise<Transaction> {\n const {\n pool_id,\n bin_infos,\n coin_type_a,\n coin_type_b,\n price_base_coin,\n price,\n lower_price,\n upper_price,\n bin_step,\n strategy_type,\n active_bin_of_pool,\n decimals_a,\n decimals_b,\n use_bin_infos,\n max_price_slippage,\n } = option\n let lower_bin_id\n let upper_bin_id\n let active_id\n let new_bin_infos: BinLiquidityInfo = bin_infos\n\n const is_coin_a_base = price_base_coin === 'coin_a'\n\n if (is_coin_a_base) {\n lower_bin_id = BinUtils.getBinIdFromPrice(lower_price, bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(upper_price, bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(price, bin_step, true, decimals_a, decimals_b)\n } else {\n lower_bin_id = BinUtils.getBinIdFromPrice(d(1).div(upper_price).toString(), bin_step, false, decimals_a, decimals_b)\n upper_bin_id = BinUtils.getBinIdFromPrice(d(1).div(lower_price).toString(), bin_step, true, decimals_a, decimals_b)\n active_id = BinUtils.getBinIdFromPrice(d(1).div(price).toString(), bin_step, false, decimals_a, decimals_b)\n\n const calculateOption: CalculateAddLiquidityOption = {\n amount_a: bin_infos.amount_b,\n amount_b: bin_infos.amount_a,\n active_id,\n bin_step,\n lower_bin_id,\n upper_bin_id,\n active_bin_of_pool,\n strategy_type: strategy_type,\n }\n\n new_bin_infos = await this.sdk.Position.calculateAddLiquidityInfo(calculateOption)\n }\n\n const openAndAddLiquidityOption: OpenAndAddLiquidityOption = {\n pool_id,\n active_id,\n bin_infos: new_bin_infos,\n coin_type_a,\n coin_type_b,\n lower_bin_id,\n upper_bin_id,\n strategy_type,\n use_bin_infos,\n max_price_slippage,\n bin_step,\n }\n\n return this.addLiquidityPayload(openAndAddLiquidityOption)\n }\n\n /**\n * Add liquidity\n * @param option - The option for adding liquidity\n * @returns The transaction object\n */\n addLiquidityPayload(option: AddLiquidityOption | OpenAndAddLiquidityOption, tx?: Transaction): Transaction {\n const {\n pool_id,\n bin_infos,\n coin_type_a,\n coin_type_b,\n active_id,\n strategy_type,\n max_price_slippage,\n bin_step,\n use_bin_infos = false,\n coin_object_id_a,\n coin_object_id_b,\n } = option\n tx = tx || new Transaction()\n\n const isOpenPosition = 'lower_bin_id' in option\n\n const liquidity_bins: BinLiquidityInfo[] = []\n\n if (isOpenPosition) {\n const position_bins = BinUtils.splitBinLiquidityInfo(bin_infos, option.lower_bin_id, option.upper_bin_id)\n liquidity_bins.push(...position_bins)\n } else {\n const position_id = option.position_id\n liquidity_bins.push(bin_infos)\n\n if (option.collect_fee || option.reward_coins.length > 0) {\n this.updatePositionFeeAndRewards({ pool_id: pool_id as string, position_id, coin_type_a, coin_type_b }, tx)\n }\n\n if (option.collect_fee) {\n this.collectFeePayload({ pool_id: pool_id as string, position_id, coin_type_a, coin_type_b }, tx)\n }\n\n if (option.reward_coins.length > 0) {\n this.collectRewardPayload(\n [{ pool_id: pool_id as string, position_id, reward_coins: option.reward_coins, coin_type_a, coin_type_b }],\n tx\n )\n }\n }\n\n liquidity_bins.forEach((liquidity_bin, index) => {\n console.log('🚀 ~ PositionModule ~ addLiquidityPayload ~ liquidity_bin:', index, liquidity_bin)\n const { amount_a, amount_b, bins } = liquidity_bin\n\n const coin_a_obj_id = coin_object_id_a ? coin_object_id_a : CoinAssist.buildCoinWithBalance(BigInt(amount_a), coin_type_a, tx)\n const coin_b_obj_id = coin_object_id_b ? coin_object_id_b : CoinAssist.buildCoinWithBalance(BigInt(amount_b), coin_type_b, tx)\n\n if (use_bin_infos) {\n this.addLiquidityInternal({\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n coin_a_obj_id,\n coin_b_obj_id,\n position_id: isOpenPosition ? undefined : option.position_id,\n max_price_slippage,\n bin_step,\n })\n } else {\n this.addLiquidityStrategyInternal({\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n max_price_slippage,\n bin_step,\n coin_a_obj_id,\n coin_b_obj_id,\n strategy_type,\n position_id: isOpenPosition ? undefined : option.position_id,\n })\n }\n })\n\n return tx\n }\n\n private addLiquidityStrategyInternal(option: {\n pool_id: string | TransactionObjectArgument\n coin_type_a: string\n coin_type_b: string\n active_id: number\n liquidity_bin: BinLiquidityInfo\n tx: Transaction\n coin_a_obj_id: TransactionObjectArgument\n coin_b_obj_id: TransactionObjectArgument\n position_id?: string\n strategy_type: StrategyType\n max_price_slippage: number\n bin_step: number\n }): Transaction {\n const {\n max_price_slippage,\n bin_step,\n position_id,\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n coin_a_obj_id,\n coin_b_obj_id,\n strategy_type,\n } = option\n\n const { dlmm_pool, dlmm_router } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n const { bins, amount_a, amount_b } = liquidity_bin\n\n let position: string | undefined | TransactionObjectArgument = position_id\n\n const lower_bin_id = bins[0].bin_id\n const upper_bin_id = bins[bins.length - 1].bin_id\n const lower_bin_id_u32 = asUintN(BigInt(lower_bin_id))\n\n const active_id_u32 = Number(asUintN(BigInt(active_id)))\n const bin_shift = BinUtils.getBinShift(active_id, bin_step, max_price_slippage)\n const routerModule = getRouterModule(strategy_type)\n\n if (position_id === undefined) {\n const width = upper_bin_id - lower_bin_id + 1\n if (width > MAX_BIN_PER_POSITION) {\n handleError(DlmmErrorCode.InvalidBinWidth, new Error('Width is too large'), {\n [DETAILS_KEYS.METHOD_NAME]: 'openPosition',\n })\n }\n\n position = tx.moveCall({\n target: `${dlmm_router.published_at}::${routerModule}::open_position`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n coin_a_obj_id,\n coin_b_obj_id,\n tx.pure.u64(amount_a),\n tx.pure.u64(amount_b),\n tx.pure.u32(Number(lower_bin_id_u32)),\n tx.pure.u16(Number(width)),\n tx.pure.u32(Number(active_id_u32)),\n tx.pure.u32(Number(bin_shift)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n } else {\n const valid_bins = bins.filter((bin) => bin.amount_a !== '0' || bin.amount_b !== '0')\n if (valid_bins.length === 0) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('No bins to add liquidity'), {\n [DETAILS_KEYS.METHOD_NAME]: 'addLiquidityStrategyInternal',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n const valid_lower_bin_id_u32 = asUintN(BigInt(valid_bins[0].bin_id))\n const valid_upper_bin_id_u32 = asUintN(BigInt(valid_bins[valid_bins.length - 1].bin_id))\n\n tx.moveCall({\n target: `${dlmm_router.published_at}::${routerModule}::add_liquidity`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n tx.object(position_id!),\n coin_a_obj_id,\n coin_b_obj_id,\n tx.pure.u64(amount_a),\n tx.pure.u64(amount_b),\n tx.pure.u32(Number(valid_lower_bin_id_u32)),\n tx.pure.u32(Number(valid_upper_bin_id_u32)),\n tx.pure.u32(Number(active_id_u32)),\n tx.pure.u32(Number(bin_shift)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n }\n\n if (position) {\n tx.transferObjects([position, coin_a_obj_id, coin_b_obj_id], this.sdk.getSenderAddress())\n } else {\n tx.transferObjects([coin_a_obj_id, coin_b_obj_id], this.sdk.getSenderAddress())\n }\n\n return tx\n }\n\n private addLiquidityInternal(option: {\n pool_id: string | TransactionObjectArgument\n coin_type_a: string\n coin_type_b: string\n active_id: number\n liquidity_bin: BinLiquidityInfo\n tx: Transaction\n coin_a_obj_id: TransactionObjectArgument\n coin_b_obj_id: TransactionObjectArgument\n position_id?: string\n max_price_slippage: number\n bin_step: number\n }): Transaction {\n const {\n position_id,\n pool_id,\n coin_type_a,\n coin_type_b,\n active_id,\n liquidity_bin,\n tx,\n coin_a_obj_id,\n coin_b_obj_id,\n max_price_slippage,\n bin_step,\n } = option\n const { bins } = liquidity_bin\n\n const { dlmm_pool, dlmm_router } = this.sdk.sdkOptions\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n const amounts_a = tx.pure.vector(\n 'u64',\n bins.map((bin) => bin.amount_a)\n )\n const amounts_b = tx.pure.vector(\n 'u64',\n bins.map((bin) => bin.amount_b)\n )\n\n const bin_ids = tx.makeMoveVec({\n elements: bins.map((bin) => tx.pure.u32(Number(asUintN(BigInt(bin.bin_id))))),\n type: 'u32',\n })\n const lower_bin_id = liquidity_bin.bins[0].bin_id\n const upper_bin_id = liquidity_bin.bins[liquidity_bin.bins.length - 1].bin_id\n if (position_id === undefined) {\n const width = upper_bin_id - lower_bin_id + 1\n if (width > MAX_BIN_PER_POSITION) {\n handleError(DlmmErrorCode.InvalidBinWidth, new Error('Width is too large'), {\n [DETAILS_KEYS.METHOD_NAME]: 'openPosition',\n })\n }\n const open_position_id = tx.moveCall({\n target: `${dlmm_router.published_at}::add_liquidity::open_position`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n coin_a_obj_id,\n coin_b_obj_id,\n bin_ids,\n amounts_a,\n amounts_b,\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n // validate the active id slippage\n if (active_id >= lower_bin_id && active_id <= upper_bin_id) {\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage, bin_step, coin_type_a, coin_type_b }, tx)\n }\n tx.transferObjects([coin_a_obj_id, coin_b_obj_id, open_position_id], this.sdk.getSenderAddress())\n } else {\n tx.moveCall({\n target: `${dlmm_router.published_at}::add_liquidity::add_liquidity`,\n arguments: [\n typeof pool_id === 'string' ? tx.object(pool_id) : pool_id,\n tx.object(position_id!),\n coin_a_obj_id,\n coin_b_obj_id,\n bin_ids,\n amounts_a,\n amounts_b,\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n // validate the active id slippage\n if (active_id >= lower_bin_id && active_id <= upper_bin_id) {\n this.validateActiveIdSlippage({ pool_id, active_id, max_price_slippage, bin_step, coin_type_a, coin_type_b }, tx)\n }\n tx.transferObjects([coin_a_obj_id, coin_b_obj_id], this.sdk.getSenderAddress())\n }\n\n return tx\n }\n\n /**\n * Fetch the fee and reward of the position\n * @param options - The option for fetching the fee and reward of the position\n * @returns The fee and reward of the position\n */\n async fetchPositionFeeAndReward(\n options: CollectRewardAndFeeOption[]\n ): Promise<{ feeData: Record<string, PositionFee>; rewardData: Record<string, PositionReward> }> {\n const tx = new Transaction()\n this.collectRewardAndFeePayload(options, tx)\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n return handleError(DlmmErrorCode.FetchError, new Error(simulateRes.error), {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchPositionFeeAndReward',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n options,\n totalOptions: options.length,\n },\n })\n }\n\n const feeData = parsedDlmmPosFeeData(simulateRes)\n const rewardData = parsedDlmmPosRewardData(simulateRes)\n\n return {\n feeData,\n rewardData,\n }\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { CLOCK_ADDRESS, CoinAssist, d, DETAILS_KEYS, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { CetusDlmmSDK } from '../sdk'\nimport { PreSwapOption, PreSwapQuote, SwapOption } from '../types/dlmm'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { parsedSwapQuoteData } from '../utils/parseData'\n\nexport class SwapModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async preSwapQuote(option: PreSwapOption): Promise<PreSwapQuote> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { pool_id, coin_type_a, coin_type_b, a2b, by_amount_in, in_amount } = option\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n const tx = new Transaction()\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::flash_swap`,\n arguments: [\n tx.object(pool_id),\n tx.pure.bool(a2b),\n tx.pure.bool(by_amount_in),\n tx.pure.u64(in_amount),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n return handleError(DlmmErrorCode.FetchError, new Error(simulateRes.error), {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchSwapQuote',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const quoteInfo = parsedSwapQuoteData(simulateRes, a2b)\n if (quoteInfo == null) {\n return handleError(DlmmErrorCode.FetchError, new Error('No quote info'), {\n [DETAILS_KEYS.METHOD_NAME]: 'preSwapQuote',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n quoteInfo.a2b = a2b\n return quoteInfo\n }\n\n swapPayload(option: SwapOption): Transaction {\n const { dlmm_pool, dlmm_router } = this._sdk.sdkOptions\n const { quote_obj, coin_type_a, coin_type_b, by_amount_in, slippage, partner } = option\n const { pool_id, in_amount, out_amount, a2b } = quote_obj\n\n const tx = new Transaction()\n\n const in_amount_limit = by_amount_in\n ? in_amount\n : d(in_amount)\n .mul(1 + slippage)\n .toFixed(0)\n\n const out_amount_limit = by_amount_in\n ? d(out_amount)\n .mul(1 - slippage)\n .toFixed(0)\n : out_amount\n\n const in_coin = CoinAssist.buildCoinWithBalance(BigInt(in_amount_limit), a2b ? coin_type_a : coin_type_b, tx)\n\n const { versioned_id, global_config_id } = getPackagerConfigs(dlmm_pool)\n\n console.log('🚀 ~ SwapModule ~ option:', {\n ...option,\n in_amount_limit,\n out_amount_limit,\n })\n\n if (partner) {\n tx.moveCall({\n target: `${dlmm_router.published_at}::swap::${a2b ? 'swap_a2b_with_partner' : 'swap_b2a_with_partner'}`,\n arguments: [\n tx.object(pool_id),\n tx.object(partner),\n in_coin,\n tx.pure.bool(by_amount_in),\n tx.pure.u64(BigInt(by_amount_in ? in_amount : out_amount)),\n tx.pure.u64(BigInt(by_amount_in ? out_amount_limit : in_amount_limit)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n } else {\n tx.moveCall({\n target: `${dlmm_router.published_at}::swap::${a2b ? 'swap_a2b' : 'swap_b2a'}`,\n arguments: [\n tx.object(pool_id),\n in_coin,\n tx.pure.bool(by_amount_in),\n tx.pure.u64(BigInt(by_amount_in ? in_amount : out_amount)),\n tx.pure.u64(BigInt(by_amount_in ? out_amount_limit : in_amount_limit)),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n }\n\n tx.transferObjects([in_coin], this.sdk.getSenderAddress())\n\n return tx\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { CLOCK_ADDRESS, d, DETAILS_KEYS, fixCoinType, getObjectFields, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { parsePartner } from '../utils'\nimport { CetusDlmmSDK } from '../sdk'\nimport { ClaimRefFeeOption, CreatePartnerOption, Partner, UpdateRefFeeRateOption, UpdateTimeRangeOption } from '../types/dlmm'\nimport { BASIS_POINT } from '../types/constants'\n\nexport class PartnerModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get a list of partners.\n * @returns {Promise<Partner[]>} A promise that resolves to an array of Partner objects.\n */\n async getPartnerList(): Promise<Partner[]> {\n const allPartner: Partner[] = []\n const { dlmm_pool } = this._sdk.sdkOptions\n const { partners_id } = getPackagerConfigs(dlmm_pool)\n try {\n const res = await this._sdk.FullClient.getObject({ id: partners_id, options: { showContent: true } })\n const fields = getObjectFields(res)\n const warpIds = fields.partners.fields.contents.map((item: any) => {\n return item.fields.value\n })\n\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n showType: true,\n })\n res.forEach((item) => {\n const partner = parsePartner(item)\n allPartner.push(partner)\n })\n }\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerList',\n [DETAILS_KEYS.REQUEST_PARAMS]: partners_id,\n })\n }\n\n return allPartner\n }\n\n /**\n * Get the partner cap ID for a given owner and partner ID.\n * @param owner - The owner of the partner.\n * @param partner_id - The ID of the partner.\n * @returns A promise that resolves to the partner cap ID or undefined if not found.\n */\n async getPartnerCapId(owner: string, partner_id: string): Promise<string> {\n const { dlmm_pool } = this._sdk.sdkOptions\n try {\n const cacheKey = `partner_cap_id_${owner}_${partner_id}`\n const cached = this._sdk.getCache<string>(cacheKey)\n if (cached) {\n return cached\n }\n const res = await this._sdk.FullClient.getOwnedObjects({\n owner,\n options: {\n showContent: true,\n showType: true,\n },\n filter: {\n StructType: `${dlmm_pool.package_id}::partner::PartnerCap`,\n },\n })\n let partnerCapId = undefined\n res.data.forEach((item) => {\n const fields = getObjectFields(item)\n if (fields.partner_id === partner_id) {\n partnerCapId = fields.id.id\n this._sdk.updateCache(cacheKey, partnerCapId)\n }\n })\n if (!partnerCapId) {\n return handleError(DlmmErrorCode.NotFound, new Error('Partner cap not found'), {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerCapId',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n owner,\n partner_id,\n },\n })\n }\n return partnerCapId\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerCapId',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n owner,\n partner_id,\n },\n })\n }\n }\n\n /**\n * Get the balance of a partner\n * @param partner_balance_handle - The handle of the partner balance\n * @returns A promise that resolves to an array of { coin_type: string; balance: string } objects.\n */\n async getPartnerBalance(partner_balance_handle: string) {\n try {\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(partner_balance_handle)\n\n const balanceList: { coin_type: string; balance: string }[] = []\n\n const warpIds = res.data.map((item) => item.objectId)\n\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n showType: true,\n })\n res.forEach((item) => {\n const fields = getObjectFields(item)\n console.log(fields)\n balanceList.push({\n coin_type: fixCoinType(fields.name, false),\n balance: fields.value,\n })\n })\n }\n return balanceList\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerBalance',\n [DETAILS_KEYS.REQUEST_PARAMS]: partner_balance_handle,\n })\n }\n }\n\n /**\n * Get a partner by its object ID.\n * @param {string} partner_id The object ID of the partner to get.\n * @returns {Promise<Partner>} A promise that resolves to a Partner object.\n */\n async getPartner(partner_id: string): Promise<Partner> {\n try {\n const res = await this._sdk.FullClient.getObject({ id: partner_id, options: { showContent: true } })\n const partner = parsePartner(res)\n return partner\n } catch (error) {\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartner',\n [DETAILS_KEYS.REQUEST_PARAMS]: partner_id,\n })\n }\n }\n\n /**\n * Update the ref fee rate of a partner\n * @param option - The option for updating the ref fee rate\n * @returns The transaction for updating the ref fee rate\n */\n updateRefFeeRatePayload(option: UpdateRefFeeRateOption, tx?: Transaction): Transaction {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { partner_id, ref_fee_rate } = option\n\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n const ref_fee_rate_raw = d(ref_fee_rate).mul(BASIS_POINT)\n if (ref_fee_rate_raw.gt(BASIS_POINT)) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('ref_fee_rate is cannot be greater than 1'), {\n [DETAILS_KEYS.METHOD_NAME]: 'updateRefFeeRatePayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::update_ref_fee_rate`,\n arguments: [tx.object(partner_id), tx.pure.u64(ref_fee_rate_raw.toNumber()), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [],\n })\n\n return tx\n }\n\n /**\n * Create a claim ref fee payload\n * @param option - The option for claiming ref fee\n * @returns The transaction for claiming ref fee\n */\n async claimRefFeePayload(option: ClaimRefFeeOption) {\n const { partner_id, partner_cap_id, fee_coin_types } = option\n const { dlmm_pool } = this._sdk.sdkOptions\n const { versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const tx = new Transaction()\n\n let partnerCapId = partner_cap_id\n if (!partnerCapId) {\n partnerCapId = await this.getPartnerCapId(this._sdk.getSenderAddress(), partner_id)\n }\n\n fee_coin_types.forEach((coin_type) => {\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::claim_ref_fee`,\n arguments: [tx.object(partner_id), tx.object(partnerCapId), tx.object(versioned_id)],\n typeArguments: [coin_type],\n })\n })\n\n return tx\n }\n\n updateTimeRangePayload(option: UpdateTimeRangeOption, tx?: Transaction): Transaction {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { partner_id, start_time, end_time } = option\n\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n tx = tx || new Transaction()\n\n const startTimeInSeconds = start_time > 1e12 ? Math.floor(start_time / 1000) : start_time\n const endTimeInSeconds = end_time > 1e12 ? Math.floor(end_time / 1000) : end_time\n\n if (endTimeInSeconds <= startTimeInSeconds) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('end_time must be greater than start_time'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPartnerPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::update_time_range`,\n arguments: [\n tx.object(partner_id),\n tx.pure.u64(startTimeInSeconds),\n tx.pure.u64(endTimeInSeconds),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [],\n })\n\n return tx\n }\n\n /**\n * Create a partner\n * @param option - The option for creating a partner\n * @returns The transaction for creating a partner\n */\n createPartnerPayload(option: CreatePartnerOption): Transaction {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { name, ref_fee_rate, start_time, end_time, recipient } = option\n\n const { partners_id, global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const tx = new Transaction()\n\n const ref_fee_rate_raw = d(ref_fee_rate).mul(BASIS_POINT)\n if (ref_fee_rate_raw.gt(BASIS_POINT)) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('ref_fee_rate is cannot be greater than 1'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPartnerPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n const startTimeInSeconds = start_time > 1e12 ? Math.floor(start_time / 1000) : start_time\n const endTimeInSeconds = end_time > 1e12 ? Math.floor(end_time / 1000) : end_time\n\n if (endTimeInSeconds <= startTimeInSeconds) {\n return handleError(DlmmErrorCode.InvalidParams, new Error('end_time must be greater than start_time'), {\n [DETAILS_KEYS.METHOD_NAME]: 'createPartnerPayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: option,\n })\n }\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::partner::create_partner`,\n arguments: [\n tx.object(partners_id),\n tx.pure.string(name),\n tx.pure.u64(ref_fee_rate_raw.toNumber()),\n tx.pure.u64(startTimeInSeconds),\n tx.pure.u64(endTimeInSeconds),\n tx.pure.address(recipient),\n tx.object(global_config_id),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n\n return tx\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport {\n asIntN,\n asUintN,\n CLOCK_ADDRESS,\n CoinAssist,\n d,\n getObjectFields,\n getPackagerConfigs,\n IModule,\n MathUtil,\n} from '@cetusprotocol/common-sdk'\nimport { CetusDlmmSDK } from '../sdk'\nimport { AddRewardOption, InitRewardOption, RewardAccessOption, RewardPeriodEmission, RewardWhiteListOption } from '../types/dlmm'\nimport BN from 'bn.js'\n\nexport class RewardModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async getRewardPeriodEmission(\n period_emission_handle: string,\n curr_emission_per_second: string,\n last_updated_time: number\n ): Promise<RewardPeriodEmission[]> {\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(period_emission_handle)\n const result: RewardPeriodEmission[] = []\n const warpIds = res.data.map((item) => item.objectId)\n if (warpIds.length > 0) {\n const warRes = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n })\n\n warRes.forEach((item) => {\n const fields = getObjectFields(item)\n const emission_rate = MathUtil.u128ToI128(new BN(fields.value.fields.value.fields.bits)).toString()\n const time = fields.name\n const visualizedTime = new Date(Number(time) * 1000).toLocaleString()\n const emissions_per = MathUtil.fromX64(new BN(emission_rate)).toString()\n const rewardPeriodEmission: RewardPeriodEmission = {\n emissions_per_second: '0',\n emissions_per_day: '0',\n emissions_per,\n time,\n visualized_time: visualizedTime,\n }\n result.push(rewardPeriodEmission)\n })\n }\n const sortedList = result.sort((a, b) => Number(a.time) - Number(b.time))\n const newNodeList: RewardPeriodEmission[] = []\n\n newNodeList.push({\n emissions_per_second: curr_emission_per_second,\n emissions_per_day: d(curr_emission_per_second)\n .mul(60 * 60 * 24)\n .toString(),\n emissions_per: '0',\n time: last_updated_time.toString(),\n visualized_time: new Date(last_updated_time * 1000).toLocaleString(),\n })\n\n let last_emission_rate = curr_emission_per_second\n for (let i = 0; i < sortedList.length; i++) {\n const item = sortedList[i]\n if (d(item.time).lte(last_updated_time)) {\n continue\n }\n last_emission_rate = d(last_emission_rate).add(d(item.emissions_per)).toString()\n const emissions_per_day = d(last_emission_rate)\n .mul(60 * 60 * 24)\n .toString()\n if (d(last_emission_rate).lt(0)) {\n item.emissions_per_second = '0'\n item.emissions_per_day = '0'\n } else {\n item.emissions_per_second = last_emission_rate\n item.emissions_per_day = emissions_per_day\n }\n newNodeList.push(item)\n }\n\n return newNodeList\n }\n\n /**\n * Add reward to a pool\n * @param options - The options for adding reward\n * @returns The transaction for adding reward\n */\n addRewardPayload(option: AddRewardOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { pool_id, reward_coin_type, reward_amount, start_time_seconds, end_time_seconds, coin_type_a, coin_type_b } = option\n const reward_coin = CoinAssist.buildCoinWithBalance(BigInt(reward_amount), reward_coin_type, tx)\n\n // const start_time_vec = tx.makeMoveVec({\n // elements: start_time_seconds ? [tx.pure.u64(start_time_seconds)] : [],\n // type: 'u64',\n // })\n tx.pure.option('u64', start_time_seconds)\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::add_reward`,\n arguments: [\n tx.object(pool_id),\n reward_coin,\n tx.pure.option('u64', start_time_seconds),\n tx.pure.u64(end_time_seconds),\n tx.object(global_config_id),\n tx.object(versioned_id),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b, reward_coin_type],\n })\n\n return tx\n }\n\n /**\n * Initialize reward for a pool\n * @param option - The option for initializing reward\n * @param tx - The transaction to add the reward to\n * @returns The transaction for initializing reward\n */\n initRewardPayload(option: InitRewardOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { pool_id, reward_coin_types, coin_type_a, coin_type_b } = option\n\n reward_coin_types.forEach((reward_coin_type) => {\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::initialize_reward`,\n arguments: [tx.object(pool_id), tx.object(global_config_id), tx.object(versioned_id), tx.object(CLOCK_ADDRESS)],\n typeArguments: [coin_type_a, coin_type_b, reward_coin_type],\n })\n })\n\n return tx\n }\n\n /**\n * Build the payload for making reward public or private\n * @param option - The option for making reward public or private\n * @param tx - The transaction to make the reward public or private\n * @returns The transaction for making reward public or private\n */\n buildRewardAccessPayload(option: RewardAccessOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { pool_id, type, coin_type_a, coin_type_b } = option\n\n tx.moveCall({\n target: `${dlmm_pool.published_at}::pool::${type === 'to_public' ? 'make_reward_public' : 'make_reward_private'}`,\n arguments: [tx.object(pool_id), tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [coin_type_a, coin_type_b],\n })\n\n return tx\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { CLOCK_ADDRESS, DETAILS_KEYS, fixCoinType, getObjectFields, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { DlmmErrorCode, handleError } from '../errors/errors'\nimport { CetusDlmmSDK } from '../sdk'\nimport { BinStepConfig, DlmmConfigs, DlmmGlobalConfig, RewardWhiteListOption } from '../types/dlmm'\nimport { log } from 'console'\n\nexport class ConfigModule implements IModule<CetusDlmmSDK> {\n protected _sdk: CetusDlmmSDK\n\n constructor(sdk: CetusDlmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Build the payload for adding or removing reward white list\n * @param option - The option for adding or removing reward white list\n * @param tx - The transaction to add the reward white list to\n * @returns The transaction for adding or removing reward white list\n */\n buildRewardWhiteListPayload(option: RewardWhiteListOption, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(dlmm_pool)\n\n const { reward_coin_types, type } = option\n\n reward_coin_types.forEach((reward_coin_type) => {\n tx.moveCall({\n target: `${dlmm_pool.published_at}::config::${type === 'add' ? 'add_reward_whitelist' : 'remove_reward_whitelist'}`,\n arguments: [tx.object(global_config_id), tx.object(versioned_id)],\n typeArguments: [reward_coin_type],\n })\n })\n\n return tx\n }\n\n async getBinStepConfigList(bin_steps_handle: string): Promise<BinStepConfig[]> {\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(bin_steps_handle)\n\n const list: BinStepConfig[] = []\n\n const bin_step_ids = res.data.map((item) => item.objectId)\n\n if (bin_step_ids.length > 0) {\n const bin_step_configs = await this._sdk.FullClient.batchGetObjects(bin_step_ids, {\n showContent: true,\n })\n\n bin_step_configs.forEach((item) => {\n const fields = getObjectFields(item)\n const bin_step_config: BinStepConfig = {\n ...fields.value.fields,\n }\n list.push(bin_step_config)\n })\n }\n\n return list\n }\n\n /**\n * Get the list of bin step configs\n * @returns The list of bin step configs\n */\n async getDlmmGlobalConfig(): Promise<DlmmGlobalConfig> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(dlmm_pool)\n try {\n const res = await this._sdk.FullClient.getObject({\n id: global_config_id,\n options: { showContent: true },\n })\n\n const fields = getObjectFields(res)\n\n const reward_config = fields.reward_config.fields\n\n const white_list: string[] =\n reward_config.reward_white_list?.fields?.contents?.map((item: any) => {\n return fixCoinType(item.fields.key.fields.name, false) as string\n }) || []\n\n const globalConfig: DlmmGlobalConfig = {\n id: fields.id.id,\n acl: {\n id: fields.acl.fields.permissions.fields.id.id,\n size: fields.acl.fields.permissions.fields.size,\n },\n allowed_list: {\n id: fields.allowed_list.fields.id.id,\n size: fields.allowed_list.fields.size,\n },\n denied_list: {\n id: fields.denied_list.fields.id.id,\n size: fields.denied_list.fields.size,\n },\n bin_steps: {\n id: fields.bin_steps.fields.id.id,\n size: fields.bin_steps.fields.size,\n },\n reward_white_list: white_list,\n blocked_position: {\n id: fields.restriction.fields.blocked_position.fields.permissions.fields.id.id,\n size: fields.restriction.fields.blocked_position.fields.permissions.fields.size,\n },\n blocked_user: {\n id: fields.restriction.fields.blocked_user.fields.permissions.fields.id.id,\n size: fields.restriction.fields.blocked_user.fields.permissions.fields.size,\n },\n min_reward_duration: Number(reward_config.min_reward_duration),\n non_manager_initialize_reward_cap: Number(reward_config.manager_reserved_reward_init_slots),\n reward_public: reward_config.reward_public,\n }\n\n return globalConfig\n } catch (error) {\n console.log('fetchGlobalConfig error: ', error)\n return handleError(DlmmErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getBinStepConfigs',\n [DETAILS_KEYS.REQUEST_PARAMS]: global_config_id,\n })\n }\n }\n\n /**\n * Fetch the configs of the dlmm SDK\n * @returns The configs of the dlmm\n */\n async fetchDlmmSdkConfigs(): Promise<DlmmConfigs> {\n const { dlmm_pool } = this._sdk.sdkOptions\n const configs: DlmmConfigs = {\n registry_id: '',\n pools_id: '',\n global_config_id: '',\n versioned_id: '',\n admin_cap_id: '',\n partners_id: '',\n }\n\n const res = await this._sdk.FullClient.getObject({\n id: dlmm_pool.package_id,\n options: { showContent: true, showPreviousTransaction: true },\n })\n const tx_digest = res.data?.previousTransaction!\n const txRes = await this._sdk.FullClient.getTransactionBlock({ digest: tx_digest, options: { showEvents: true } })\n txRes.events?.forEach((event) => {\n const type = event.type\n const parsedJson = event.parsedJson as any\n\n if (type.includes('versioned::InitEvent')) {\n configs.versioned_id = parsedJson.versioned\n }\n\n if (type.includes('partner::InitPartnerEvent')) {\n configs.partners_id = parsedJson.partners_id\n }\n\n if (type.includes('config::InitEvent')) {\n configs.global_config_id = parsedJson.config_id\n }\n\n if (type.includes('admin_cap::InitEvent')) {\n configs.admin_cap_id = parsedJson.admin_cap_id\n }\n\n if (type.includes('registry::RegistryEvent')) {\n configs.registry_id = parsedJson.pools_id\n }\n })\n const registerRes = await this._sdk.FullClient.getObject({ id: configs.registry_id, options: { showContent: true } })\n const registerFields = getObjectFields(registerRes)\n configs.pools_id = registerFields.pools.fields.id.id\n\n return configs\n }\n}\n"],"mappings":"0oBAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,eAAC,SAAUA,EAAQD,EAAS,CAC1B,aAGA,SAASE,EAAQC,EAAKC,EAAK,CACzB,GAAI,CAACD,EAAK,MAAM,IAAI,MAAMC,GAAO,kBAAkB,CACrD,CAIA,SAASC,EAAUC,EAAMC,EAAW,CAClCD,EAAK,OAASC,EACd,IAAIC,EAAW,UAAY,CAAC,EAC5BA,EAAS,UAAYD,EAAU,UAC/BD,EAAK,UAAY,IAAIE,EACrBF,EAAK,UAAU,YAAcA,CAC/B,CAIA,SAASG,EAAIC,EAAQC,EAAMC,EAAQ,CACjC,GAAIH,EAAG,KAAKC,CAAM,EAChB,OAAOA,EAGT,KAAK,SAAW,EAChB,KAAK,MAAQ,KACb,KAAK,OAAS,EAGd,KAAK,IAAM,KAEPA,IAAW,QACTC,IAAS,MAAQA,IAAS,QAC5BC,EAASD,EACTA,EAAO,IAGT,KAAK,MAAMD,GAAU,EAAGC,GAAQ,GAAIC,GAAU,IAAI,EAEtD,CACI,OAAOX,GAAW,SACpBA,EAAO,QAAUQ,EAEjBT,EAAQ,GAAKS,EAGfA,EAAG,GAAKA,EACRA,EAAG,SAAW,GAEd,IAAII,EACJ,GAAI,CACE,OAAO,OAAW,KAAe,OAAO,OAAO,OAAW,IAC5DA,EAAS,OAAO,OAEhBA,EAAS,QAAQ,QAAQ,EAAE,MAE/B,MAAY,CACZ,CAEAJ,EAAG,KAAO,SAAeK,EAAK,CAC5B,OAAIA,aAAeL,EACV,GAGFK,IAAQ,MAAQ,OAAOA,GAAQ,UACpCA,EAAI,YAAY,WAAaL,EAAG,UAAY,MAAM,QAAQK,EAAI,KAAK,CACvE,EAEAL,EAAG,IAAM,SAAcM,EAAMC,EAAO,CAClC,OAAID,EAAK,IAAIC,CAAK,EAAI,EAAUD,EACzBC,CACT,EAEAP,EAAG,IAAM,SAAcM,EAAMC,EAAO,CAClC,OAAID,EAAK,IAAIC,CAAK,EAAI,EAAUD,EACzBC,CACT,EAEAP,EAAG,UAAU,MAAQ,SAAeC,EAAQC,EAAMC,EAAQ,CACxD,GAAI,OAAOF,GAAW,SACpB,OAAO,KAAK,YAAYA,EAAQC,EAAMC,CAAM,EAG9C,GAAI,OAAOF,GAAW,SACpB,OAAO,KAAK,WAAWA,EAAQC,EAAMC,CAAM,EAGzCD,IAAS,QACXA,EAAO,IAETT,EAAOS,KAAUA,EAAO,IAAMA,GAAQ,GAAKA,GAAQ,EAAE,EAErDD,EAASA,EAAO,SAAS,EAAE,QAAQ,OAAQ,EAAE,EAC7C,IAAIO,EAAQ,EACRP,EAAO,CAAC,IAAM,MAChBO,IACA,KAAK,SAAW,GAGdA,EAAQP,EAAO,SACbC,IAAS,GACX,KAAK,UAAUD,EAAQO,EAAOL,CAAM,GAEpC,KAAK,WAAWF,EAAQC,EAAMM,CAAK,EAC/BL,IAAW,MACb,KAAK,WAAW,KAAK,QAAQ,EAAGD,EAAMC,CAAM,GAIpD,EAEAH,EAAG,UAAU,YAAc,SAAsBC,EAAQC,EAAMC,EAAQ,CACjEF,EAAS,IACX,KAAK,SAAW,EAChBA,EAAS,CAACA,GAERA,EAAS,UACX,KAAK,MAAQ,CAACA,EAAS,QAAS,EAChC,KAAK,OAAS,GACLA,EAAS,kBAClB,KAAK,MAAQ,CACXA,EAAS,SACRA,EAAS,SAAa,QACzB,EACA,KAAK,OAAS,IAEdR,EAAOQ,EAAS,gBAAgB,EAChC,KAAK,MAAQ,CACXA,EAAS,SACRA,EAAS,SAAa,SACvB,CACF,EACA,KAAK,OAAS,GAGZE,IAAW,MAGf,KAAK,WAAW,KAAK,QAAQ,EAAGD,EAAMC,CAAM,CAC9C,EAEAH,EAAG,UAAU,WAAa,SAAqBC,EAAQC,EAAMC,EAAQ,CAGnE,GADAV,EAAO,OAAOQ,EAAO,QAAW,QAAQ,EACpCA,EAAO,QAAU,EACnB,YAAK,MAAQ,CAAC,CAAC,EACf,KAAK,OAAS,EACP,KAGT,KAAK,OAAS,KAAK,KAAKA,EAAO,OAAS,CAAC,EACzC,KAAK,MAAQ,IAAI,MAAM,KAAK,MAAM,EAClC,QAASQ,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/B,KAAK,MAAMA,CAAC,EAAI,EAGlB,IAAIC,EAAGC,EACHC,EAAM,EACV,GAAIT,IAAW,KACb,IAAKM,EAAIR,EAAO,OAAS,EAAGS,EAAI,EAAGD,GAAK,EAAGA,GAAK,EAC9CE,EAAIV,EAAOQ,CAAC,EAAKR,EAAOQ,EAAI,CAAC,GAAK,EAAMR,EAAOQ,EAAI,CAAC,GAAK,GACzD,KAAK,MAAMC,CAAC,GAAMC,GAAKC,EAAO,SAC9B,KAAK,MAAMF,EAAI,CAAC,EAAKC,IAAO,GAAKC,EAAQ,SACzCA,GAAO,GACHA,GAAO,KACTA,GAAO,GACPF,aAGKP,IAAW,KACpB,IAAKM,EAAI,EAAGC,EAAI,EAAGD,EAAIR,EAAO,OAAQQ,GAAK,EACzCE,EAAIV,EAAOQ,CAAC,EAAKR,EAAOQ,EAAI,CAAC,GAAK,EAAMR,EAAOQ,EAAI,CAAC,GAAK,GACzD,KAAK,MAAMC,CAAC,GAAMC,GAAKC,EAAO,SAC9B,KAAK,MAAMF,EAAI,CAAC,EAAKC,IAAO,GAAKC,EAAQ,SACzCA,GAAO,GACHA,GAAO,KACTA,GAAO,GACPF,KAIN,OAAO,KAAK,OAAO,CACrB,EAEA,SAASG,EAAeC,EAAQC,EAAO,CACrC,IAAIC,EAAIF,EAAO,WAAWC,CAAK,EAE/B,GAAIC,GAAK,IAAMA,GAAK,GAClB,OAAOA,EAAI,GAEN,GAAIA,GAAK,IAAMA,GAAK,GACzB,OAAOA,EAAI,GAEN,GAAIA,GAAK,IAAMA,GAAK,IACzB,OAAOA,EAAI,GAEXvB,EAAO,GAAO,wBAA0BqB,CAAM,CAElD,CAEA,SAASG,EAAcH,EAAQI,EAAYH,EAAO,CAChD,IAAII,EAAIN,EAAcC,EAAQC,CAAK,EACnC,OAAIA,EAAQ,GAAKG,IACfC,GAAKN,EAAcC,EAAQC,EAAQ,CAAC,GAAK,GAEpCI,CACT,CAEAnB,EAAG,UAAU,UAAY,SAAoBC,EAAQO,EAAOL,EAAQ,CAElE,KAAK,OAAS,KAAK,MAAMF,EAAO,OAASO,GAAS,CAAC,EACnD,KAAK,MAAQ,IAAI,MAAM,KAAK,MAAM,EAClC,QAASC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/B,KAAK,MAAMA,CAAC,EAAI,EAIlB,IAAIG,EAAM,EACNF,EAAI,EAEJC,EACJ,GAAIR,IAAW,KACb,IAAKM,EAAIR,EAAO,OAAS,EAAGQ,GAAKD,EAAOC,GAAK,EAC3CE,EAAIM,EAAahB,EAAQO,EAAOC,CAAC,GAAKG,EACtC,KAAK,MAAMF,CAAC,GAAKC,EAAI,SACjBC,GAAO,IACTA,GAAO,GACPF,GAAK,EACL,KAAK,MAAMA,CAAC,GAAKC,IAAM,IAEvBC,GAAO,MAGN,CACL,IAAIQ,EAAcnB,EAAO,OAASO,EAClC,IAAKC,EAAIW,EAAc,IAAM,EAAIZ,EAAQ,EAAIA,EAAOC,EAAIR,EAAO,OAAQQ,GAAK,EAC1EE,EAAIM,EAAahB,EAAQO,EAAOC,CAAC,GAAKG,EACtC,KAAK,MAAMF,CAAC,GAAKC,EAAI,SACjBC,GAAO,IACTA,GAAO,GACPF,GAAK,EACL,KAAK,MAAMA,CAAC,GAAKC,IAAM,IAEvBC,GAAO,CAGb,CAEA,KAAK,OAAO,CACd,EAEA,SAASS,EAAWC,EAAKd,EAAOe,EAAKC,EAAK,CAIxC,QAHIL,EAAI,EACJ,EAAI,EACJM,EAAM,KAAK,IAAIH,EAAI,OAAQC,CAAG,EACzBd,EAAID,EAAOC,EAAIgB,EAAKhB,IAAK,CAChC,IAAIO,EAAIM,EAAI,WAAWb,CAAC,EAAI,GAE5BU,GAAKK,EAGDR,GAAK,GACP,EAAIA,EAAI,GAAK,GAGJA,GAAK,GACd,EAAIA,EAAI,GAAK,GAIb,EAAIA,EAENvB,EAAOuB,GAAK,GAAK,EAAIQ,EAAK,mBAAmB,EAC7CL,GAAK,CACP,CACA,OAAOA,CACT,CAEAnB,EAAG,UAAU,WAAa,SAAqBC,EAAQC,EAAMM,EAAO,CAElE,KAAK,MAAQ,CAAC,CAAC,EACf,KAAK,OAAS,EAGd,QAASkB,EAAU,EAAGC,EAAU,EAAGA,GAAW,SAAWA,GAAWzB,EAClEwB,IAEFA,IACAC,EAAWA,EAAUzB,EAAQ,EAO7B,QALI0B,EAAQ3B,EAAO,OAASO,EACxBqB,EAAMD,EAAQF,EACdH,EAAM,KAAK,IAAIK,EAAOA,EAAQC,CAAG,EAAIrB,EAErCsB,EAAO,EACFrB,EAAID,EAAOC,EAAIc,EAAKd,GAAKiB,EAChCI,EAAOT,EAAUpB,EAAQQ,EAAGA,EAAIiB,EAASxB,CAAI,EAE7C,KAAK,MAAMyB,CAAO,EACd,KAAK,MAAM,CAAC,EAAIG,EAAO,SACzB,KAAK,MAAM,CAAC,GAAKA,EAEjB,KAAK,OAAOA,CAAI,EAIpB,GAAID,IAAQ,EAAG,CACb,IAAIE,EAAM,EAGV,IAFAD,EAAOT,EAAUpB,EAAQQ,EAAGR,EAAO,OAAQC,CAAI,EAE1CO,EAAI,EAAGA,EAAIoB,EAAKpB,IACnBsB,GAAO7B,EAGT,KAAK,MAAM6B,CAAG,EACV,KAAK,MAAM,CAAC,EAAID,EAAO,SACzB,KAAK,MAAM,CAAC,GAAKA,EAEjB,KAAK,OAAOA,CAAI,CAEpB,CAEA,KAAK,OAAO,CACd,EAEA9B,EAAG,UAAU,KAAO,SAAegC,EAAM,CACvCA,EAAK,MAAQ,IAAI,MAAM,KAAK,MAAM,EAClC,QAASvB,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/BuB,EAAK,MAAMvB,CAAC,EAAI,KAAK,MAAMA,CAAC,EAE9BuB,EAAK,OAAS,KAAK,OACnBA,EAAK,SAAW,KAAK,SACrBA,EAAK,IAAM,KAAK,GAClB,EAEA,SAASC,EAAMD,EAAME,EAAK,CACxBF,EAAK,MAAQE,EAAI,MACjBF,EAAK,OAASE,EAAI,OAClBF,EAAK,SAAWE,EAAI,SACpBF,EAAK,IAAME,EAAI,GACjB,CAqCA,GAnCAlC,EAAG,UAAU,MAAQ,SAAgBgC,EAAM,CACzCC,EAAKD,EAAM,IAAI,CACjB,EAEAhC,EAAG,UAAU,MAAQ,UAAkB,CACrC,IAAImB,EAAI,IAAInB,EAAG,IAAI,EACnB,YAAK,KAAKmB,CAAC,EACJA,CACT,EAEAnB,EAAG,UAAU,QAAU,SAAkBmC,EAAM,CAC7C,KAAO,KAAK,OAASA,GACnB,KAAK,MAAM,KAAK,QAAQ,EAAI,EAE9B,OAAO,IACT,EAGAnC,EAAG,UAAU,OAAS,UAAkB,CACtC,KAAO,KAAK,OAAS,GAAK,KAAK,MAAM,KAAK,OAAS,CAAC,IAAM,GACxD,KAAK,SAEP,OAAO,KAAK,UAAU,CACxB,EAEAA,EAAG,UAAU,UAAY,UAAsB,CAE7C,OAAI,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,IAAM,IACzC,KAAK,SAAW,GAEX,IACT,EAII,OAAO,OAAW,KAAe,OAAO,OAAO,KAAQ,WACzD,GAAI,CACFA,EAAG,UAAU,OAAO,IAAI,4BAA4B,CAAC,EAAIoC,CAC3D,MAAY,CACVpC,EAAG,UAAU,QAAUoC,CACzB,MAEApC,EAAG,UAAU,QAAUoC,EAGzB,SAASA,GAAW,CAClB,OAAQ,KAAK,IAAM,UAAY,SAAW,KAAK,SAAS,EAAE,EAAI,GAChE,CAgCA,IAAIC,EAAQ,CACV,GACA,IACA,KACA,MACA,OACA,QACA,SACA,UACA,WACA,YACA,aACA,cACA,eACA,gBACA,iBACA,kBACA,mBACA,oBACA,qBACA,sBACA,uBACA,wBACA,yBACA,0BACA,2BACA,2BACF,EAEIC,EAAa,CACf,EAAG,EACH,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EACvB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACpB,EAEIC,EAAa,CACf,EAAG,EACH,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAC5D,SAAU,IAAU,SAAU,SAAU,SAAU,QAAS,SAC3D,SAAU,SAAU,SAAU,SAAU,KAAU,QAAS,QAC3D,QAAS,QAAS,QAAS,SAAU,SAAU,SAAU,SACzD,MAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAC9D,EAEAvC,EAAG,UAAU,SAAW,SAAmBE,EAAMsC,EAAS,CACxDtC,EAAOA,GAAQ,GACfsC,EAAUA,EAAU,GAAK,EAEzB,IAAIC,EACJ,GAAIvC,IAAS,IAAMA,IAAS,MAAO,CACjCuC,EAAM,GAGN,QAFI7B,EAAM,EACN8B,EAAQ,EACHjC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CACpC,IAAIE,EAAI,KAAK,MAAMF,CAAC,EAChBqB,IAAUnB,GAAKC,EAAO8B,GAAS,UAAU,SAAS,EAAE,EACxDA,EAAS/B,IAAO,GAAKC,EAAQ,SAC7BA,GAAO,EACHA,GAAO,KACTA,GAAO,GACPH,KAEEiC,IAAU,GAAKjC,IAAM,KAAK,OAAS,EACrCgC,EAAMJ,EAAM,EAAIP,EAAK,MAAM,EAAIA,EAAOW,EAEtCA,EAAMX,EAAOW,CAEjB,CAIA,IAHIC,IAAU,IACZD,EAAMC,EAAM,SAAS,EAAE,EAAID,GAEtBA,EAAI,OAASD,IAAY,GAC9BC,EAAM,IAAMA,EAEd,OAAI,KAAK,WAAa,IACpBA,EAAM,IAAMA,GAEPA,CACT,CAEA,GAAIvC,KAAUA,EAAO,IAAMA,GAAQ,GAAKA,GAAQ,GAAI,CAElD,IAAIyC,EAAYL,EAAWpC,CAAI,EAE3B0C,EAAYL,EAAWrC,CAAI,EAC/BuC,EAAM,GACN,IAAIzB,EAAI,KAAK,MAAM,EAEnB,IADAA,EAAE,SAAW,EACN,CAACA,EAAE,OAAO,GAAG,CAClB,IAAIG,EAAIH,EAAE,MAAM4B,CAAS,EAAE,SAAS1C,CAAI,EACxCc,EAAIA,EAAE,MAAM4B,CAAS,EAEhB5B,EAAE,OAAO,EAGZyB,EAAMtB,EAAIsB,EAFVA,EAAMJ,EAAMM,EAAYxB,EAAE,MAAM,EAAIA,EAAIsB,CAI5C,CAIA,IAHI,KAAK,OAAO,IACdA,EAAM,IAAMA,GAEPA,EAAI,OAASD,IAAY,GAC9BC,EAAM,IAAMA,EAEd,OAAI,KAAK,WAAa,IACpBA,EAAM,IAAMA,GAEPA,CACT,CAEAhD,EAAO,GAAO,iCAAiC,CACjD,EAEAO,EAAG,UAAU,SAAW,UAAqB,CAC3C,IAAI6C,EAAM,KAAK,MAAM,CAAC,EACtB,OAAI,KAAK,SAAW,EAClBA,GAAO,KAAK,MAAM,CAAC,EAAI,SACd,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,IAAM,EAEhDA,GAAO,iBAAoB,KAAK,MAAM,CAAC,EAAI,SAClC,KAAK,OAAS,GACvBpD,EAAO,GAAO,4CAA4C,EAEpD,KAAK,WAAa,EAAK,CAACoD,EAAMA,CACxC,EAEA7C,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAO,KAAK,SAAS,GAAI,CAAC,CAC5B,EAEII,IACFJ,EAAG,UAAU,SAAW,SAAmBG,EAAQ2C,EAAQ,CACzD,OAAO,KAAK,YAAY1C,EAAQD,EAAQ2C,CAAM,CAChD,GAGF9C,EAAG,UAAU,QAAU,SAAkBG,EAAQ2C,EAAQ,CACvD,OAAO,KAAK,YAAY,MAAO3C,EAAQ2C,CAAM,CAC/C,EAEA,IAAIC,EAAW,SAAmBC,EAAWb,EAAM,CACjD,OAAIa,EAAU,YACLA,EAAU,YAAYb,CAAI,EAE5B,IAAIa,EAAUb,CAAI,CAC3B,EAEAnC,EAAG,UAAU,YAAc,SAAsBgD,EAAW7C,EAAQ2C,EAAQ,CAC1E,KAAK,OAAO,EAEZ,IAAIG,EAAa,KAAK,WAAW,EAC7BC,EAAYJ,GAAU,KAAK,IAAI,EAAGG,CAAU,EAChDxD,EAAOwD,GAAcC,EAAW,uCAAuC,EACvEzD,EAAOyD,EAAY,EAAG,6BAA6B,EAEnD,IAAIC,EAAMJ,EAASC,EAAWE,CAAS,EACnCE,EAAUjD,IAAW,KAAO,KAAO,KACvC,YAAK,eAAiBiD,CAAO,EAAED,EAAKF,CAAU,EACvCE,CACT,EAEAnD,EAAG,UAAU,eAAiB,SAAyBmD,EAAKF,EAAY,CAItE,QAHII,EAAW,EACXX,EAAQ,EAEHjC,EAAI,EAAG6C,EAAQ,EAAG7C,EAAI,KAAK,OAAQA,IAAK,CAC/C,IAAIqB,EAAQ,KAAK,MAAMrB,CAAC,GAAK6C,EAASZ,EAEtCS,EAAIE,GAAU,EAAIvB,EAAO,IACrBuB,EAAWF,EAAI,SACjBA,EAAIE,GAAU,EAAKvB,GAAQ,EAAK,KAE9BuB,EAAWF,EAAI,SACjBA,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAG/BwB,IAAU,GACRD,EAAWF,EAAI,SACjBA,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAEnCY,EAAQ,EACRY,EAAQ,IAERZ,EAAQZ,IAAS,GACjBwB,GAAS,EAEb,CAEA,GAAID,EAAWF,EAAI,OAGjB,IAFAA,EAAIE,GAAU,EAAIX,EAEXW,EAAWF,EAAI,QACpBA,EAAIE,GAAU,EAAI,CAGxB,EAEArD,EAAG,UAAU,eAAiB,SAAyBmD,EAAKF,EAAY,CAItE,QAHII,EAAWF,EAAI,OAAS,EACxBT,EAAQ,EAEHjC,EAAI,EAAG6C,EAAQ,EAAG7C,EAAI,KAAK,OAAQA,IAAK,CAC/C,IAAIqB,EAAQ,KAAK,MAAMrB,CAAC,GAAK6C,EAASZ,EAEtCS,EAAIE,GAAU,EAAIvB,EAAO,IACrBuB,GAAY,IACdF,EAAIE,GAAU,EAAKvB,GAAQ,EAAK,KAE9BuB,GAAY,IACdF,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAG/BwB,IAAU,GACRD,GAAY,IACdF,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAEnCY,EAAQ,EACRY,EAAQ,IAERZ,EAAQZ,IAAS,GACjBwB,GAAS,EAEb,CAEA,GAAID,GAAY,EAGd,IAFAF,EAAIE,GAAU,EAAIX,EAEXW,GAAY,GACjBF,EAAIE,GAAU,EAAI,CAGxB,EAEI,KAAK,MACPrD,EAAG,UAAU,WAAa,SAAqBW,EAAG,CAChD,MAAO,IAAK,KAAK,MAAMA,CAAC,CAC1B,EAEAX,EAAG,UAAU,WAAa,SAAqBW,EAAG,CAChD,IAAI4C,EAAI5C,EACJQ,EAAI,EACR,OAAIoC,GAAK,OACPpC,GAAK,GACLoC,KAAO,IAELA,GAAK,KACPpC,GAAK,EACLoC,KAAO,GAELA,GAAK,IACPpC,GAAK,EACLoC,KAAO,GAELA,GAAK,IACPpC,GAAK,EACLoC,KAAO,GAEFpC,EAAIoC,CACb,EAGFvD,EAAG,UAAU,UAAY,SAAoBW,EAAG,CAE9C,GAAIA,IAAM,EAAG,MAAO,IAEpB,IAAI4C,EAAI5C,EACJQ,EAAI,EACR,OAAKoC,EAAI,QAAY,IACnBpC,GAAK,GACLoC,KAAO,KAEJA,EAAI,OAAU,IACjBpC,GAAK,EACLoC,KAAO,IAEJA,EAAI,MAAS,IAChBpC,GAAK,EACLoC,KAAO,IAEJA,EAAI,KAAS,IAChBpC,GAAK,EACLoC,KAAO,IAEJA,EAAI,KAAS,GAChBpC,IAEKA,CACT,EAGAnB,EAAG,UAAU,UAAY,UAAsB,CAC7C,IAAIW,EAAI,KAAK,MAAM,KAAK,OAAS,CAAC,EAC9B6C,EAAK,KAAK,WAAW7C,CAAC,EAC1B,OAAQ,KAAK,OAAS,GAAK,GAAK6C,CAClC,EAEA,SAASC,EAAYpD,EAAK,CAGxB,QAFIM,EAAI,IAAI,MAAMN,EAAI,UAAU,CAAC,EAExBqD,EAAM,EAAGA,EAAM/C,EAAE,OAAQ+C,IAAO,CACvC,IAAI9C,EAAO8C,EAAM,GAAM,EACnBC,EAAOD,EAAM,GAEjB/C,EAAE+C,CAAG,EAAKrD,EAAI,MAAMO,CAAG,IAAM+C,EAAQ,CACvC,CAEA,OAAOhD,CACT,CAGAX,EAAG,UAAU,SAAW,UAAqB,CAC3C,GAAI,KAAK,OAAO,EAAG,MAAO,GAG1B,QADImB,EAAI,EACCV,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CACpC,IAAImD,EAAI,KAAK,UAAU,KAAK,MAAMnD,CAAC,CAAC,EAEpC,GADAU,GAAKyC,EACDA,IAAM,GAAI,KAChB,CACA,OAAOzC,CACT,EAEAnB,EAAG,UAAU,WAAa,UAAuB,CAC/C,OAAO,KAAK,KAAK,KAAK,UAAU,EAAI,CAAC,CACvC,EAEAA,EAAG,UAAU,OAAS,SAAiB6D,EAAO,CAC5C,OAAI,KAAK,WAAa,EACb,KAAK,IAAI,EAAE,MAAMA,CAAK,EAAE,MAAM,CAAC,EAEjC,KAAK,MAAM,CACpB,EAEA7D,EAAG,UAAU,SAAW,SAAmB6D,EAAO,CAChD,OAAI,KAAK,MAAMA,EAAQ,CAAC,EACf,KAAK,KAAKA,CAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAEjC,KAAK,MAAM,CACpB,EAEA7D,EAAG,UAAU,MAAQ,UAAkB,CACrC,OAAO,KAAK,WAAa,CAC3B,EAGAA,EAAG,UAAU,IAAM,UAAgB,CACjC,OAAO,KAAK,MAAM,EAAE,KAAK,CAC3B,EAEAA,EAAG,UAAU,KAAO,UAAiB,CACnC,OAAK,KAAK,OAAO,IACf,KAAK,UAAY,GAGZ,IACT,EAGAA,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,KAAO,KAAK,OAASA,EAAI,QACvB,KAAK,MAAM,KAAK,QAAQ,EAAI,EAG9B,QAASI,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAC9B,KAAK,MAAMA,CAAC,EAAI,KAAK,MAAMA,CAAC,EAAIJ,EAAI,MAAMI,CAAC,EAG7C,OAAO,KAAK,OAAO,CACrB,EAEAT,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAAZ,GAAQ,KAAK,SAAWY,EAAI,YAAc,CAAC,EACpC,KAAK,KAAKA,CAAG,CACtB,EAGAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,IAAIA,CAAG,EAClDA,EAAI,MAAM,EAAE,IAAI,IAAI,CAC7B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EACnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAGAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAExC,IAAIuD,EACA,KAAK,OAASvD,EAAI,OACpBuD,EAAIvD,EAEJuD,EAAI,KAGN,QAASnD,EAAI,EAAGA,EAAImD,EAAE,OAAQnD,IAC5B,KAAK,MAAMA,CAAC,EAAI,KAAK,MAAMA,CAAC,EAAIJ,EAAI,MAAMI,CAAC,EAG7C,YAAK,OAASmD,EAAE,OAET,KAAK,OAAO,CACrB,EAEA5D,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAAZ,GAAQ,KAAK,SAAWY,EAAI,YAAc,CAAC,EACpC,KAAK,MAAMA,CAAG,CACvB,EAGAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EACnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,MAAMA,CAAG,EACpDA,EAAI,MAAM,EAAE,MAAM,IAAI,CAC/B,EAGAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAExC,IAAIyD,EACAF,EACA,KAAK,OAASvD,EAAI,QACpByD,EAAI,KACJF,EAAIvD,IAEJyD,EAAIzD,EACJuD,EAAI,MAGN,QAASnD,EAAI,EAAGA,EAAImD,EAAE,OAAQnD,IAC5B,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAAImD,EAAE,MAAMnD,CAAC,EAGxC,GAAI,OAASqD,EACX,KAAOrD,EAAIqD,EAAE,OAAQrD,IACnB,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAI7B,YAAK,OAASqD,EAAE,OAET,KAAK,OAAO,CACrB,EAEA9D,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAAZ,GAAQ,KAAK,SAAWY,EAAI,YAAc,CAAC,EACpC,KAAK,MAAMA,CAAG,CACvB,EAGAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EACnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,MAAMA,CAAG,EACpDA,EAAI,MAAM,EAAE,MAAM,IAAI,CAC/B,EAGAL,EAAG,UAAU,MAAQ,SAAgB6D,EAAO,CAC1CpE,EAAO,OAAOoE,GAAU,UAAYA,GAAS,CAAC,EAE9C,IAAIE,EAAc,KAAK,KAAKF,EAAQ,EAAE,EAAI,EACtCG,EAAWH,EAAQ,GAGvB,KAAK,QAAQE,CAAW,EAEpBC,EAAW,GACbD,IAIF,QAAStD,EAAI,EAAGA,EAAIsD,EAAatD,IAC/B,KAAK,MAAMA,CAAC,EAAI,CAAC,KAAK,MAAMA,CAAC,EAAI,SAInC,OAAIuD,EAAW,IACb,KAAK,MAAMvD,CAAC,EAAI,CAAC,KAAK,MAAMA,CAAC,EAAK,UAAc,GAAKuD,GAIhD,KAAK,OAAO,CACrB,EAEAhE,EAAG,UAAU,KAAO,SAAe6D,EAAO,CACxC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAK,CACjC,EAGA7D,EAAG,UAAU,KAAO,SAAe0D,EAAKhE,EAAK,CAC3CD,EAAO,OAAOiE,GAAQ,UAAYA,GAAO,CAAC,EAE1C,IAAI9C,EAAO8C,EAAM,GAAM,EACnBC,EAAOD,EAAM,GAEjB,YAAK,QAAQ9C,EAAM,CAAC,EAEhBlB,EACF,KAAK,MAAMkB,CAAG,EAAI,KAAK,MAAMA,CAAG,EAAK,GAAK+C,EAE1C,KAAK,MAAM/C,CAAG,EAAI,KAAK,MAAMA,CAAG,EAAI,EAAE,GAAK+C,GAGtC,KAAK,OAAO,CACrB,EAGA3D,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,IAAIc,EAGJ,GAAI,KAAK,WAAa,GAAKd,EAAI,WAAa,EAC1C,YAAK,SAAW,EAChBc,EAAI,KAAK,KAAKd,CAAG,EACjB,KAAK,UAAY,EACV,KAAK,UAAU,EAGjB,GAAI,KAAK,WAAa,GAAKA,EAAI,WAAa,EACjD,OAAAA,EAAI,SAAW,EACfc,EAAI,KAAK,KAAKd,CAAG,EACjBA,EAAI,SAAW,EACRc,EAAE,UAAU,EAIrB,IAAI2C,EAAGF,EACH,KAAK,OAASvD,EAAI,QACpByD,EAAI,KACJF,EAAIvD,IAEJyD,EAAIzD,EACJuD,EAAI,MAIN,QADIlB,EAAQ,EACHjC,EAAI,EAAGA,EAAImD,EAAE,OAAQnD,IAC5BU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,IAAMmD,EAAE,MAAMnD,CAAC,EAAI,GAAKiC,EAC1C,KAAK,MAAMjC,CAAC,EAAIU,EAAI,SACpBuB,EAAQvB,IAAM,GAEhB,KAAOuB,IAAU,GAAKjC,EAAIqD,EAAE,OAAQrD,IAClCU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,GAAKiC,EACvB,KAAK,MAAMjC,CAAC,EAAIU,EAAI,SACpBuB,EAAQvB,IAAM,GAIhB,GADA,KAAK,OAAS2C,EAAE,OACZpB,IAAU,EACZ,KAAK,MAAM,KAAK,MAAM,EAAIA,EAC1B,KAAK,iBAEIoB,IAAM,KACf,KAAOrD,EAAIqD,EAAE,OAAQrD,IACnB,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAI7B,OAAO,IACT,EAGAT,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,IAAI8C,EACJ,OAAI9C,EAAI,WAAa,GAAK,KAAK,WAAa,GAC1CA,EAAI,SAAW,EACf8C,EAAM,KAAK,IAAI9C,CAAG,EAClBA,EAAI,UAAY,EACT8C,GACE9C,EAAI,WAAa,GAAK,KAAK,WAAa,GACjD,KAAK,SAAW,EAChB8C,EAAM9C,EAAI,IAAI,IAAI,EAClB,KAAK,SAAW,EACT8C,GAGL,KAAK,OAAS9C,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EAEnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAGAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CAEtC,GAAIA,EAAI,WAAa,EAAG,CACtBA,EAAI,SAAW,EACf,IAAIc,EAAI,KAAK,KAAKd,CAAG,EACrB,OAAAA,EAAI,SAAW,EACRc,EAAE,UAAU,CAGrB,SAAW,KAAK,WAAa,EAC3B,YAAK,SAAW,EAChB,KAAK,KAAKd,CAAG,EACb,KAAK,SAAW,EACT,KAAK,UAAU,EAIxB,IAAI4D,EAAM,KAAK,IAAI5D,CAAG,EAGtB,GAAI4D,IAAQ,EACV,YAAK,SAAW,EAChB,KAAK,OAAS,EACd,KAAK,MAAM,CAAC,EAAI,EACT,KAIT,IAAIH,EAAG,EACHG,EAAM,GACRH,EAAI,KACJ,EAAIzD,IAEJyD,EAAIzD,EACJ,EAAI,MAIN,QADIqC,EAAQ,EACHjC,EAAI,EAAGA,EAAI,EAAE,OAAQA,IAC5BU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,IAAM,EAAE,MAAMA,CAAC,EAAI,GAAKiC,EAC1CA,EAAQvB,GAAK,GACb,KAAK,MAAMV,CAAC,EAAIU,EAAI,SAEtB,KAAOuB,IAAU,GAAKjC,EAAIqD,EAAE,OAAQrD,IAClCU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,GAAKiC,EACvBA,EAAQvB,GAAK,GACb,KAAK,MAAMV,CAAC,EAAIU,EAAI,SAItB,GAAIuB,IAAU,GAAKjC,EAAIqD,EAAE,QAAUA,IAAM,KACvC,KAAOrD,EAAIqD,EAAE,OAAQrD,IACnB,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAI7B,YAAK,OAAS,KAAK,IAAI,KAAK,OAAQA,CAAC,EAEjCqD,IAAM,OACR,KAAK,SAAW,GAGX,KAAK,OAAO,CACrB,EAGA9D,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,MAAM,EAAE,KAAKA,CAAG,CAC9B,EAEA,SAAS6D,EAAYC,EAAM9D,EAAKoC,EAAK,CACnCA,EAAI,SAAWpC,EAAI,SAAW8D,EAAK,SACnC,IAAI1C,EAAO0C,EAAK,OAAS9D,EAAI,OAAU,EACvCoC,EAAI,OAAShB,EACbA,EAAOA,EAAM,EAAK,EAGlB,IAAIqC,EAAIK,EAAK,MAAM,CAAC,EAAI,EACpB,EAAI9D,EAAI,MAAM,CAAC,EAAI,EACnBc,EAAI2C,EAAI,EAERM,EAAKjD,EAAI,SACTuB,EAASvB,EAAI,SAAa,EAC9BsB,EAAI,MAAM,CAAC,EAAI2B,EAEf,QAASC,EAAI,EAAGA,EAAI5C,EAAK4C,IAAK,CAM5B,QAHIC,EAAS5B,IAAU,GACnB6B,EAAQ7B,EAAQ,SAChB8B,EAAO,KAAK,IAAIH,EAAGhE,EAAI,OAAS,CAAC,EAC5BK,EAAI,KAAK,IAAI,EAAG2D,EAAIF,EAAK,OAAS,CAAC,EAAGzD,GAAK8D,EAAM9D,IAAK,CAC7D,IAAID,EAAK4D,EAAI3D,EAAK,EAClBoD,EAAIK,EAAK,MAAM1D,CAAC,EAAI,EACpB,EAAIJ,EAAI,MAAMK,CAAC,EAAI,EACnBS,EAAI2C,EAAI,EAAIS,EACZD,GAAWnD,EAAI,SAAa,EAC5BoD,EAAQpD,EAAI,QACd,CACAsB,EAAI,MAAM4B,CAAC,EAAIE,EAAQ,EACvB7B,EAAQ4B,EAAS,CACnB,CACA,OAAI5B,IAAU,EACZD,EAAI,MAAM4B,CAAC,EAAI3B,EAAQ,EAEvBD,EAAI,SAGCA,EAAI,OAAO,CACpB,CAKA,IAAIgC,EAAc,SAAsBN,EAAM9D,EAAKoC,EAAK,CACtD,IAAIqB,EAAIK,EAAK,MACT,EAAI9D,EAAI,MACRqE,EAAIjC,EAAI,MACRzB,EAAI,EACJoD,EACAO,EACAnB,EACAoB,EAAKd,EAAE,CAAC,EAAI,EACZe,EAAMD,EAAK,KACXE,EAAMF,IAAO,GACbG,EAAKjB,EAAE,CAAC,EAAI,EACZkB,GAAMD,EAAK,KACXE,EAAMF,IAAO,GACbG,GAAKpB,EAAE,CAAC,EAAI,EACZqB,EAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKvB,EAAE,CAAC,EAAI,EACZwB,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK1B,EAAE,CAAC,EAAI,EACZ2B,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK7B,EAAE,CAAC,EAAI,EACZ8B,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKhC,EAAE,CAAC,EAAI,EACZiC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKnC,EAAE,CAAC,EAAI,EACZoC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKtC,EAAE,CAAC,EAAI,EACZuC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKzC,EAAE,CAAC,EAAI,EACZ0C,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK,EAAE,CAAC,EAAI,EACZC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GAEjB5F,EAAI,SAAW0B,EAAK,SAAW9D,EAAI,SACnCoC,EAAI,OAAS,GAEb2B,EAAK,KAAK,KAAKS,EAAK8B,EAAG,EACvBhC,EAAM,KAAK,KAAKE,EAAK+B,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKG,EAAK6B,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAKsB,EAAK8B,EAAG,EACvB,IAAI4B,IAAQxH,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM6D,KAAO,IAAO,EAChDA,IAAM,SAENpE,EAAK,KAAK,KAAKY,GAAK2B,EAAG,EACvBhC,EAAM,KAAK,KAAKK,GAAK4B,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKM,EAAK0B,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAKyB,EAAK2B,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKS,EAAKiC,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKE,EAAKkC,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKG,EAAKgC,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAKsB,EAAKiC,EAAG,EAAK,EAClC,IAAI0B,IAAQzH,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM8D,KAAO,IAAO,EAChDA,IAAM,SAENrE,EAAK,KAAK,KAAKe,EAAKwB,EAAG,EACvBhC,EAAM,KAAK,KAAKQ,EAAKyB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKS,GAAKuB,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAK4B,GAAKwB,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKY,GAAK8B,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKK,GAAK+B,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKM,EAAK6B,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAKyB,EAAK8B,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKS,EAAKoC,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKE,EAAKqC,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKG,EAAKmC,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAKsB,EAAKoC,EAAG,EAAK,EAClC,IAAIwB,IAAQ1H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM+D,KAAO,IAAO,EAChDA,IAAM,SAENtE,EAAK,KAAK,KAAKkB,GAAKqB,EAAG,EACvBhC,EAAM,KAAK,KAAKW,GAAKsB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKY,GAAKoB,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAK+B,GAAKqB,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKe,EAAK2B,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKQ,EAAK4B,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKS,GAAK0B,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAK4B,GAAK2B,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKY,GAAKiC,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKK,GAAKkC,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKM,EAAKgC,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAKyB,EAAKiC,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKS,EAAKuC,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKE,EAAKwC,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKG,EAAKsC,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAKsB,EAAKuC,EAAG,EAAK,EAClC,IAAIsB,IAAQ3H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMgE,KAAO,IAAO,EAChDA,IAAM,SAENvE,EAAK,KAAK,KAAKqB,GAAKkB,EAAG,EACvBhC,EAAM,KAAK,KAAKc,GAAKmB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKe,GAAKiB,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAKkC,GAAKkB,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKkB,GAAKwB,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKW,GAAKyB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKY,GAAKuB,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAK+B,GAAKwB,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKe,EAAK8B,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKQ,EAAK+B,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKS,GAAK6B,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAK4B,GAAK8B,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKY,GAAKoC,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKK,GAAKqC,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKM,EAAKmC,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAKyB,EAAKoC,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKS,EAAK0C,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKE,EAAK2C,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKG,EAAKyC,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAKsB,EAAK0C,EAAG,EAAK,EAClC,IAAIoB,IAAQ5H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMiE,KAAO,IAAO,EAChDA,IAAM,SAENxE,EAAK,KAAK,KAAKwB,GAAKe,EAAG,EACvBhC,EAAM,KAAK,KAAKiB,GAAKgB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKkB,GAAKc,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAKqC,GAAKe,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKqB,GAAKqB,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKc,GAAKsB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKe,GAAKoB,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAKkC,GAAKqB,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKkB,GAAK2B,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKW,GAAK4B,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKY,GAAK0B,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAK+B,GAAK2B,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKe,EAAKiC,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKQ,EAAKkC,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKS,GAAKgC,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAK4B,GAAKiC,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKY,GAAKuC,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKK,GAAKwC,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKM,EAAKsC,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAKyB,EAAKuC,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKS,EAAK6C,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKE,EAAK8C,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKG,EAAK4C,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAKsB,EAAK6C,EAAG,EAAK,EAClC,IAAIkB,IAAQ7H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMkE,KAAO,IAAO,EAChDA,IAAM,SAENzE,EAAK,KAAK,KAAK2B,GAAKY,EAAG,EACvBhC,EAAM,KAAK,KAAKoB,GAAKa,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKqB,GAAKW,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAKwC,GAAKY,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKwB,GAAKkB,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKiB,GAAKmB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKkB,GAAKiB,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAKqC,GAAKkB,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKqB,GAAKwB,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKc,GAAKyB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKe,GAAKuB,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAKkC,GAAKwB,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKkB,GAAK8B,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKW,GAAK+B,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKY,GAAK6B,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAK+B,GAAK8B,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKe,EAAKoC,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKQ,EAAKqC,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKS,GAAKmC,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAK4B,GAAKoC,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKY,GAAK0C,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKK,GAAK2C,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKM,EAAKyC,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAKyB,EAAK0C,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKS,EAAKgD,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKE,EAAKiD,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKG,EAAK+C,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAKsB,EAAKgD,EAAG,EAAK,EAClC,IAAIgB,IAAQ9H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMmE,KAAO,IAAO,EAChDA,IAAM,SAEN1E,EAAK,KAAK,KAAK8B,GAAKS,EAAG,EACvBhC,EAAM,KAAK,KAAKuB,GAAKU,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKwB,GAAKQ,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAK2C,GAAKS,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAK2B,GAAKe,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKoB,GAAKgB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKqB,GAAKc,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAKwC,GAAKe,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKwB,GAAKqB,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKiB,GAAKsB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKkB,GAAKoB,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAKqC,GAAKqB,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKqB,GAAK2B,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKc,GAAK4B,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKe,GAAK0B,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAKkC,GAAK2B,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKkB,GAAKiC,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKW,GAAKkC,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKY,GAAKgC,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAK+B,GAAKiC,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKe,EAAKuC,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKQ,EAAKwC,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKS,GAAKsC,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAK4B,GAAKuC,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKY,GAAK6C,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKK,GAAK8C,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKM,EAAK4C,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAKyB,EAAK6C,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKS,EAAKmD,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKE,EAAKoD,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKG,EAAKkD,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAKsB,EAAKmD,EAAG,EAAK,EAClC,IAAIc,IAAQ/H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMoE,KAAO,IAAO,EAChDA,IAAM,SAEN3E,EAAK,KAAK,KAAKiC,GAAKM,EAAG,EACvBhC,EAAM,KAAK,KAAK0B,GAAKO,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAK2B,GAAKK,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAK8C,GAAKM,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAK8B,GAAKY,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKuB,GAAKa,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKwB,GAAKW,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAK2C,GAAKY,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAK2B,GAAKkB,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKoB,GAAKmB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKqB,GAAKiB,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAKwC,GAAKkB,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKwB,GAAKwB,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKiB,GAAKyB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKkB,GAAKuB,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAKqC,GAAKwB,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKqB,GAAK8B,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKc,GAAK+B,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKe,GAAK6B,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAKkC,GAAK8B,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKkB,GAAKoC,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKW,GAAKqC,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKY,GAAKmC,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAK+B,GAAKoC,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKe,EAAK0C,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKQ,EAAK2C,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKS,GAAKyC,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAK4B,GAAK0C,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKY,GAAKgD,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKK,GAAKiD,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKM,EAAK+C,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAKyB,EAAKgD,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKS,EAAKsD,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKE,EAAKuD,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKG,EAAKqD,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAKsB,EAAKsD,EAAG,EAAK,EAClC,IAAIY,IAAQhI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMqE,KAAO,IAAO,EAChDA,IAAM,SAEN5E,EAAK,KAAK,KAAKoC,GAAKG,EAAG,EACvBhC,EAAM,KAAK,KAAK6B,GAAKI,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAK8B,GAAKE,EAAG,EAAK,EACpCnD,EAAK,KAAK,KAAKiD,GAAKG,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKiC,GAAKS,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAK0B,GAAKU,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAK2B,GAAKQ,EAAG,EAAK,EACpCtD,EAAMA,EAAK,KAAK,KAAK8C,GAAKS,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAK8B,GAAKe,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKuB,GAAKgB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKwB,GAAKc,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAK2C,GAAKe,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAK2B,GAAKqB,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKoB,GAAKsB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKqB,GAAKoB,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAKwC,GAAKqB,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKwB,GAAK2B,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKiB,GAAK4B,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKkB,GAAK0B,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAKqC,GAAK2B,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKqB,GAAKiC,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKc,GAAKkC,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKe,GAAKgC,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAKkC,GAAKiC,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKkB,GAAKuC,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKW,GAAKwC,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKY,GAAKsC,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAK+B,GAAKuC,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKe,EAAK6C,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKQ,EAAK8C,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKS,GAAK4C,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAK4B,GAAK6C,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKY,GAAKmD,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKK,GAAKoD,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKM,EAAKkD,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAKyB,EAAKmD,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKS,EAAKyD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKE,EAAK0D,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKG,EAAKwD,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAKsB,EAAKyD,EAAG,EAAK,EAClC,IAAIU,IAAQjI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMsE,KAAO,IAAO,EAChDA,IAAM,SAEN7E,EAAK,KAAK,KAAKoC,GAAKM,EAAG,EACvBnC,EAAM,KAAK,KAAK6B,GAAKO,EAAG,EACxBpC,EAAOA,EAAM,KAAK,KAAK8B,GAAKK,EAAG,EAAK,EACpCtD,EAAK,KAAK,KAAKiD,GAAKM,EAAG,EACvB3C,EAAMA,EAAK,KAAK,KAAKiC,GAAKY,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAK0B,GAAKa,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAK2B,GAAKW,EAAG,EAAK,EACpCzD,EAAMA,EAAK,KAAK,KAAK8C,GAAKY,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAK8B,GAAKkB,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKuB,GAAKmB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKwB,GAAKiB,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAK2C,GAAKkB,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAK2B,GAAKwB,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKoB,GAAKyB,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKqB,GAAKuB,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAKwC,GAAKwB,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKwB,GAAK8B,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKiB,GAAK+B,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKkB,GAAK6B,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAKqC,GAAK8B,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKqB,GAAKoC,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKc,GAAKqC,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKe,GAAKmC,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAKkC,GAAKoC,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKkB,GAAK0C,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKW,GAAK2C,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKY,GAAKyC,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAK+B,GAAK0C,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKe,EAAKgD,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKQ,EAAKiD,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKS,GAAK+C,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAK4B,GAAKgD,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKY,GAAKsD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKK,GAAKuD,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKM,EAAKqD,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAKyB,EAAKsD,EAAG,EAAK,EAClC,IAAIW,IAASlI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMuE,KAAQ,IAAO,EACjDA,IAAO,SAEP9E,EAAK,KAAK,KAAKoC,GAAKS,EAAG,EACvBtC,EAAM,KAAK,KAAK6B,GAAKU,EAAG,EACxBvC,EAAOA,EAAM,KAAK,KAAK8B,GAAKQ,EAAG,EAAK,EACpCzD,EAAK,KAAK,KAAKiD,GAAKS,EAAG,EACvB9C,EAAMA,EAAK,KAAK,KAAKiC,GAAKe,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAK0B,GAAKgB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAK2B,GAAKc,EAAG,EAAK,EACpC5D,EAAMA,EAAK,KAAK,KAAK8C,GAAKe,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAK8B,GAAKqB,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKuB,GAAKsB,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKwB,GAAKoB,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAK2C,GAAKqB,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAK2B,GAAK2B,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKoB,GAAK4B,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKqB,GAAK0B,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAKwC,GAAK2B,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKwB,GAAKiC,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKiB,GAAKkC,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKkB,GAAKgC,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAKqC,GAAKiC,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKqB,GAAKuC,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKc,GAAKwC,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKe,GAAKsC,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAKkC,GAAKuC,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKkB,GAAK6C,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKW,GAAK8C,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKY,GAAK4C,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAK+B,GAAK6C,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKe,EAAKmD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKQ,EAAKoD,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKS,GAAKkD,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAK4B,GAAKmD,EAAG,EAAK,EAClC,IAAIY,IAASnI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMwE,KAAQ,IAAO,EACjDA,IAAO,SAEP/E,EAAK,KAAK,KAAKoC,GAAKY,EAAG,EACvBzC,EAAM,KAAK,KAAK6B,GAAKa,EAAG,EACxB1C,EAAOA,EAAM,KAAK,KAAK8B,GAAKW,EAAG,EAAK,EACpC5D,EAAK,KAAK,KAAKiD,GAAKY,EAAG,EACvBjD,EAAMA,EAAK,KAAK,KAAKiC,GAAKkB,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAK0B,GAAKmB,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAK2B,GAAKiB,EAAG,EAAK,EACpC/D,EAAMA,EAAK,KAAK,KAAK8C,GAAKkB,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAK8B,GAAKwB,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKuB,GAAKyB,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKwB,GAAKuB,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAK2C,GAAKwB,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAK2B,GAAK8B,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKoB,GAAK+B,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKqB,GAAK6B,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAKwC,GAAK8B,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKwB,GAAKoC,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKiB,GAAKqC,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKkB,GAAKmC,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAKqC,GAAKoC,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKqB,GAAK0C,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKc,GAAK2C,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKe,GAAKyC,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAKkC,GAAK0C,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKkB,GAAKgD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKW,GAAKiD,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKY,GAAK+C,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAK+B,GAAKgD,EAAG,EAAK,EAClC,IAAIa,IAASpI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAMyE,KAAQ,IAAO,EACjDA,IAAO,SAEPhF,EAAK,KAAK,KAAKoC,GAAKe,EAAG,EACvB5C,EAAM,KAAK,KAAK6B,GAAKgB,EAAG,EACxB7C,EAAOA,EAAM,KAAK,KAAK8B,GAAKc,EAAG,EAAK,EACpC/D,EAAK,KAAK,KAAKiD,GAAKe,EAAG,EACvBpD,EAAMA,EAAK,KAAK,KAAKiC,GAAKqB,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAK0B,GAAKsB,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAK2B,GAAKoB,EAAG,EAAK,EACpClE,EAAMA,EAAK,KAAK,KAAK8C,GAAKqB,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAK8B,GAAK2B,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKuB,GAAK4B,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKwB,GAAK0B,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAK2C,GAAK2B,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAK2B,GAAKiC,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKoB,GAAKkC,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKqB,GAAKgC,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAKwC,GAAKiC,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKwB,GAAKuC,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKiB,GAAKwC,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKkB,GAAKsC,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAKqC,GAAKuC,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKqB,GAAK6C,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKc,GAAK8C,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKe,GAAK4C,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAKkC,GAAK6C,EAAG,EAAK,EAClC,IAAIc,IAASrI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM0E,KAAQ,IAAO,EACjDA,IAAO,SAEPjF,EAAK,KAAK,KAAKoC,GAAKkB,EAAG,EACvB/C,EAAM,KAAK,KAAK6B,GAAKmB,EAAG,EACxBhD,EAAOA,EAAM,KAAK,KAAK8B,GAAKiB,EAAG,EAAK,EACpClE,EAAK,KAAK,KAAKiD,GAAKkB,EAAG,EACvBvD,EAAMA,EAAK,KAAK,KAAKiC,GAAKwB,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAK0B,GAAKyB,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAK2B,GAAKuB,EAAG,EAAK,EACpCrE,EAAMA,EAAK,KAAK,KAAK8C,GAAKwB,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAK8B,GAAK8B,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKuB,GAAK+B,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKwB,GAAK6B,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAK2C,GAAK8B,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAK2B,GAAKoC,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKoB,GAAKqC,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKqB,GAAKmC,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAKwC,GAAKoC,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKwB,GAAK0C,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKiB,GAAK2C,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKkB,GAAKyC,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAKqC,GAAK0C,EAAG,EAAK,EAClC,IAAIe,IAAStI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM2E,KAAQ,IAAO,EACjDA,IAAO,SAEPlF,EAAK,KAAK,KAAKoC,GAAKqB,EAAG,EACvBlD,EAAM,KAAK,KAAK6B,GAAKsB,EAAG,EACxBnD,EAAOA,EAAM,KAAK,KAAK8B,GAAKoB,EAAG,EAAK,EACpCrE,EAAK,KAAK,KAAKiD,GAAKqB,EAAG,EACvB1D,EAAMA,EAAK,KAAK,KAAKiC,GAAK2B,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAK0B,GAAK4B,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAK2B,GAAK0B,EAAG,EAAK,EACpCxE,EAAMA,EAAK,KAAK,KAAK8C,GAAK2B,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAK8B,GAAKiC,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKuB,GAAKkC,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKwB,GAAKgC,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAK2C,GAAKiC,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAK2B,GAAKuC,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKoB,GAAKwC,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKqB,GAAKsC,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAKwC,GAAKuC,EAAG,EAAK,EAClC,IAAIgB,IAASvI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM4E,KAAQ,IAAO,EACjDA,IAAO,SAEPnF,EAAK,KAAK,KAAKoC,GAAKwB,EAAG,EACvBrD,EAAM,KAAK,KAAK6B,GAAKyB,EAAG,EACxBtD,EAAOA,EAAM,KAAK,KAAK8B,GAAKuB,EAAG,EAAK,EACpCxE,EAAK,KAAK,KAAKiD,GAAKwB,EAAG,EACvB7D,EAAMA,EAAK,KAAK,KAAKiC,GAAK8B,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAK0B,GAAK+B,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAK2B,GAAK6B,EAAG,EAAK,EACpC3E,EAAMA,EAAK,KAAK,KAAK8C,GAAK8B,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAK8B,GAAKoC,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKuB,GAAKqC,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKwB,GAAKmC,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAK2C,GAAKoC,EAAG,EAAK,EAClC,IAAIiB,IAASxI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM6E,KAAQ,IAAO,EACjDA,IAAO,SAEPpF,EAAK,KAAK,KAAKoC,GAAK2B,EAAG,EACvBxD,EAAM,KAAK,KAAK6B,GAAK4B,EAAG,EACxBzD,EAAOA,EAAM,KAAK,KAAK8B,GAAK0B,EAAG,EAAK,EACpC3E,EAAK,KAAK,KAAKiD,GAAK2B,EAAG,EACvBhE,EAAMA,EAAK,KAAK,KAAKiC,GAAKiC,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAK0B,GAAKkC,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAK2B,GAAKgC,EAAG,EAAK,EACpC9E,EAAMA,EAAK,KAAK,KAAK8C,GAAKiC,EAAG,EAAK,EAClC,IAAIkB,IAASzI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM8E,KAAQ,IAAO,EACjDA,IAAO,SAEPrF,EAAK,KAAK,KAAKoC,GAAK8B,EAAG,EACvB3D,EAAM,KAAK,KAAK6B,GAAK+B,EAAG,EACxB5D,EAAOA,EAAM,KAAK,KAAK8B,GAAK6B,EAAG,EAAK,EACpC9E,EAAK,KAAK,KAAKiD,GAAK8B,EAAG,EACvB,IAAImB,IAAS1I,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD,OAAA3D,GAAOwC,GAAMmB,IAAQ,IAAO,IAAM+E,KAAQ,IAAO,EACjDA,IAAO,SACPhF,EAAE,CAAC,EAAI8D,GACP9D,EAAE,CAAC,EAAI+D,GACP/D,EAAE,CAAC,EAAIgE,GACPhE,EAAE,CAAC,EAAIiE,GACPjE,EAAE,CAAC,EAAIkE,GACPlE,EAAE,CAAC,EAAImE,GACPnE,EAAE,CAAC,EAAIoE,GACPpE,EAAE,CAAC,EAAIqE,GACPrE,EAAE,CAAC,EAAIsE,GACPtE,EAAE,CAAC,EAAIuE,GACPvE,EAAE,EAAE,EAAIwE,GACRxE,EAAE,EAAE,EAAIyE,GACRzE,EAAE,EAAE,EAAI0E,GACR1E,EAAE,EAAE,EAAI2E,GACR3E,EAAE,EAAE,EAAI4E,GACR5E,EAAE,EAAE,EAAI6E,GACR7E,EAAE,EAAE,EAAI8E,GACR9E,EAAE,EAAE,EAAI+E,GACR/E,EAAE,EAAE,EAAIgF,GACJ1I,IAAM,IACR0D,EAAE,EAAE,EAAI1D,EACRyB,EAAI,UAECA,CACT,EAGK,KAAK,OACRgC,EAAcP,GAGhB,SAASyF,EAAUxF,EAAM9D,EAAKoC,EAAK,CACjCA,EAAI,SAAWpC,EAAI,SAAW8D,EAAK,SACnC1B,EAAI,OAAS0B,EAAK,OAAS9D,EAAI,OAI/B,QAFIqC,EAAQ,EACRkH,EAAU,EACLvF,EAAI,EAAGA,EAAI5B,EAAI,OAAS,EAAG4B,IAAK,CAGvC,IAAIC,EAASsF,EACbA,EAAU,EAGV,QAFIrF,EAAQ7B,EAAQ,SAChB8B,EAAO,KAAK,IAAIH,EAAGhE,EAAI,OAAS,CAAC,EAC5BK,EAAI,KAAK,IAAI,EAAG2D,EAAIF,EAAK,OAAS,CAAC,EAAGzD,GAAK8D,EAAM9D,IAAK,CAC7D,IAAID,EAAI4D,EAAI3D,EACRoD,EAAIK,EAAK,MAAM1D,CAAC,EAAI,EACpBmD,EAAIvD,EAAI,MAAMK,CAAC,EAAI,EACnBS,EAAI2C,EAAIF,EAERQ,EAAKjD,EAAI,SACbmD,EAAUA,GAAWnD,EAAI,SAAa,GAAM,EAC5CiD,EAAMA,EAAKG,EAAS,EACpBA,EAAQH,EAAK,SACbE,EAAUA,GAAUF,IAAO,IAAO,EAElCwF,GAAWtF,IAAW,GACtBA,GAAU,QACZ,CACA7B,EAAI,MAAM4B,CAAC,EAAIE,EACf7B,EAAQ4B,EACRA,EAASsF,CACX,CACA,OAAIlH,IAAU,EACZD,EAAI,MAAM4B,CAAC,EAAI3B,EAEfD,EAAI,SAGCA,EAAI,OAAO,CACpB,CAEA,SAASoH,EAAY1F,EAAM9D,EAAKoC,EAAK,CAInC,OAAOkH,EAASxF,EAAM9D,EAAKoC,CAAG,CAChC,CAEAzC,EAAG,UAAU,MAAQ,SAAgBK,EAAKoC,EAAK,CAC7C,IAAIU,EACA1B,EAAM,KAAK,OAASpB,EAAI,OAC5B,OAAI,KAAK,SAAW,IAAMA,EAAI,SAAW,GACvC8C,EAAMsB,EAAY,KAAMpE,EAAKoC,CAAG,EACvBhB,EAAM,GACf0B,EAAMe,EAAW,KAAM7D,EAAKoC,CAAG,EACtBhB,EAAM,KACf0B,EAAMwG,EAAS,KAAMtJ,EAAKoC,CAAG,EAE7BU,EAAM0G,EAAW,KAAMxJ,EAAKoC,CAAG,EAG1BU,CACT,EAKA,SAAS2G,EAAMC,EAAGC,EAAG,CACnB,KAAK,EAAID,EACT,KAAK,EAAIC,CACX,CAEAF,EAAK,UAAU,QAAU,SAAkBG,EAAG,CAG5C,QAFI1G,EAAI,IAAI,MAAM0G,CAAC,EACfC,EAAIlK,EAAG,UAAU,WAAWiK,CAAC,EAAI,EAC5BxJ,EAAI,EAAGA,EAAIwJ,EAAGxJ,IACrB8C,EAAE9C,CAAC,EAAI,KAAK,OAAOA,EAAGyJ,EAAGD,CAAC,EAG5B,OAAO1G,CACT,EAGAuG,EAAK,UAAU,OAAS,SAAiBC,EAAGG,EAAGD,EAAG,CAChD,GAAIF,IAAM,GAAKA,IAAME,EAAI,EAAG,OAAOF,EAGnC,QADII,EAAK,EACA1J,EAAI,EAAGA,EAAIyJ,EAAGzJ,IACrB0J,IAAOJ,EAAI,IAAOG,EAAIzJ,EAAI,EAC1BsJ,IAAM,EAGR,OAAOI,CACT,EAIAL,EAAK,UAAU,QAAU,SAAkBM,EAAKC,EAAKC,EAAKC,EAAMC,EAAMP,EAAG,CACvE,QAASxJ,EAAI,EAAGA,EAAIwJ,EAAGxJ,IACrB8J,EAAK9J,CAAC,EAAI4J,EAAID,EAAI3J,CAAC,CAAC,EACpB+J,EAAK/J,CAAC,EAAI6J,EAAIF,EAAI3J,CAAC,CAAC,CAExB,EAEAqJ,EAAK,UAAU,UAAY,SAAoBO,EAAKC,EAAKC,EAAMC,EAAMP,EAAGG,EAAK,CAC3E,KAAK,QAAQA,EAAKC,EAAKC,EAAKC,EAAMC,EAAMP,CAAC,EAEzC,QAASQ,EAAI,EAAGA,EAAIR,EAAGQ,IAAM,EAM3B,QALIP,EAAIO,GAAK,EAETC,EAAQ,KAAK,IAAI,EAAI,KAAK,GAAKR,CAAC,EAChCS,EAAQ,KAAK,IAAI,EAAI,KAAK,GAAKT,CAAC,EAE3BU,EAAI,EAAGA,EAAIX,EAAGW,GAAKV,EAI1B,QAHIW,EAASH,EACTI,EAASH,EAEJjK,EAAI,EAAGA,EAAI+J,EAAG/J,IAAK,CAC1B,IAAIqK,GAAKR,EAAKK,EAAIlK,CAAC,EACfsK,EAAKR,EAAKI,EAAIlK,CAAC,EAEfuK,GAAKV,EAAKK,EAAIlK,EAAI+J,CAAC,EACnBS,EAAKV,EAAKI,EAAIlK,EAAI+J,CAAC,EAEnBU,GAAKN,EAASI,GAAKH,EAASI,EAEhCA,EAAKL,EAASK,EAAKJ,EAASG,GAC5BA,GAAKE,GAELZ,EAAKK,EAAIlK,CAAC,EAAIqK,GAAKE,GACnBT,EAAKI,EAAIlK,CAAC,EAAIsK,EAAKE,EAEnBX,EAAKK,EAAIlK,EAAI+J,CAAC,EAAIM,GAAKE,GACvBT,EAAKI,EAAIlK,EAAI+J,CAAC,EAAIO,EAAKE,EAGnBxK,IAAMwJ,IACRiB,GAAKT,EAAQG,EAASF,EAAQG,EAE9BA,EAASJ,EAAQI,EAASH,EAAQE,EAClCA,EAASM,GAEb,CAGN,EAEArB,EAAK,UAAU,YAAc,SAAsBsB,EAAGC,EAAG,CACvD,IAAIpB,EAAI,KAAK,IAAIoB,EAAGD,CAAC,EAAI,EACrBE,EAAMrB,EAAI,EACVxJ,EAAI,EACR,IAAKwJ,EAAIA,EAAI,EAAI,EAAGA,EAAGA,EAAIA,IAAM,EAC/BxJ,IAGF,MAAO,IAAKA,EAAI,EAAI6K,CACtB,EAEAxB,EAAK,UAAU,UAAY,SAAoBO,EAAKC,EAAKL,EAAG,CAC1D,GAAI,EAAAA,GAAK,GAET,QAASxJ,EAAI,EAAGA,EAAIwJ,EAAI,EAAGxJ,IAAK,CAC9B,IAAI8C,EAAI8G,EAAI5J,CAAC,EAEb4J,EAAI5J,CAAC,EAAI4J,EAAIJ,EAAIxJ,EAAI,CAAC,EACtB4J,EAAIJ,EAAIxJ,EAAI,CAAC,EAAI8C,EAEjBA,EAAI+G,EAAI7J,CAAC,EAET6J,EAAI7J,CAAC,EAAI,CAAC6J,EAAIL,EAAIxJ,EAAI,CAAC,EACvB6J,EAAIL,EAAIxJ,EAAI,CAAC,EAAI,CAAC8C,CACpB,CACF,EAEAuG,EAAK,UAAU,aAAe,SAAuByB,EAAItB,EAAG,CAE1D,QADIvH,EAAQ,EACHjC,EAAI,EAAGA,EAAIwJ,EAAI,EAAGxJ,IAAK,CAC9B,IAAIE,EAAI,KAAK,MAAM4K,EAAG,EAAI9K,EAAI,CAAC,EAAIwJ,CAAC,EAAI,KACtC,KAAK,MAAMsB,EAAG,EAAI9K,CAAC,EAAIwJ,CAAC,EACxBvH,EAEF6I,EAAG9K,CAAC,EAAIE,EAAI,SAERA,EAAI,SACN+B,EAAQ,EAERA,EAAQ/B,EAAI,SAAY,CAE5B,CAEA,OAAO4K,CACT,EAEAzB,EAAK,UAAU,WAAa,SAAqByB,EAAI9J,EAAK4I,EAAKJ,EAAG,CAEhE,QADIvH,EAAQ,EACHjC,EAAI,EAAGA,EAAIgB,EAAKhB,IACvBiC,EAAQA,GAAS6I,EAAG9K,CAAC,EAAI,GAEzB4J,EAAI,EAAI5J,CAAC,EAAIiC,EAAQ,KAAQA,EAAQA,IAAU,GAC/C2H,EAAI,EAAI5J,EAAI,CAAC,EAAIiC,EAAQ,KAAQA,EAAQA,IAAU,GAIrD,IAAKjC,EAAI,EAAIgB,EAAKhB,EAAIwJ,EAAG,EAAExJ,EACzB4J,EAAI5J,CAAC,EAAI,EAGXhB,EAAOiD,IAAU,CAAC,EAClBjD,GAAQiD,EAAQ,SAAa,CAAC,CAChC,EAEAoH,EAAK,UAAU,KAAO,SAAeG,EAAG,CAEtC,QADIuB,EAAK,IAAI,MAAMvB,CAAC,EACXxJ,EAAI,EAAGA,EAAIwJ,EAAGxJ,IACrB+K,EAAG/K,CAAC,EAAI,EAGV,OAAO+K,CACT,EAEA1B,EAAK,UAAU,KAAO,SAAeC,EAAGC,EAAGvH,EAAK,CAC9C,IAAIwH,EAAI,EAAI,KAAK,YAAYF,EAAE,OAAQC,EAAE,MAAM,EAE3CI,EAAM,KAAK,QAAQH,CAAC,EAEpBwB,EAAI,KAAK,KAAKxB,CAAC,EAEfI,EAAM,IAAI,MAAMJ,CAAC,EACjByB,EAAO,IAAI,MAAMzB,CAAC,EAClB0B,EAAO,IAAI,MAAM1B,CAAC,EAElB2B,EAAO,IAAI,MAAM3B,CAAC,EAClB4B,EAAQ,IAAI,MAAM5B,CAAC,EACnB6B,EAAQ,IAAI,MAAM7B,CAAC,EAEnB8B,EAAOtJ,EAAI,MACfsJ,EAAK,OAAS9B,EAEd,KAAK,WAAWF,EAAE,MAAOA,EAAE,OAAQM,EAAKJ,CAAC,EACzC,KAAK,WAAWD,EAAE,MAAOA,EAAE,OAAQ4B,EAAM3B,CAAC,EAE1C,KAAK,UAAUI,EAAKoB,EAAGC,EAAMC,EAAM1B,EAAGG,CAAG,EACzC,KAAK,UAAUwB,EAAMH,EAAGI,EAAOC,EAAO7B,EAAGG,CAAG,EAE5C,QAAS3J,EAAI,EAAGA,EAAIwJ,EAAGxJ,IAAK,CAC1B,IAAI0K,GAAKO,EAAKjL,CAAC,EAAIoL,EAAMpL,CAAC,EAAIkL,EAAKlL,CAAC,EAAIqL,EAAMrL,CAAC,EAC/CkL,EAAKlL,CAAC,EAAIiL,EAAKjL,CAAC,EAAIqL,EAAMrL,CAAC,EAAIkL,EAAKlL,CAAC,EAAIoL,EAAMpL,CAAC,EAChDiL,EAAKjL,CAAC,EAAI0K,EACZ,CAEA,YAAK,UAAUO,EAAMC,EAAM1B,CAAC,EAC5B,KAAK,UAAUyB,EAAMC,EAAMI,EAAMN,EAAGxB,EAAGG,CAAG,EAC1C,KAAK,UAAU2B,EAAMN,EAAGxB,CAAC,EACzB,KAAK,aAAa8B,EAAM9B,CAAC,EAEzBxH,EAAI,SAAWsH,EAAE,SAAWC,EAAE,SAC9BvH,EAAI,OAASsH,EAAE,OAASC,EAAE,OACnBvH,EAAI,OAAO,CACpB,EAGAzC,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,IAAIoC,EAAM,IAAIzC,EAAG,IAAI,EACrB,OAAAyC,EAAI,MAAQ,IAAI,MAAM,KAAK,OAASpC,EAAI,MAAM,EACvC,KAAK,MAAMA,EAAKoC,CAAG,CAC5B,EAGAzC,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,IAAIoC,EAAM,IAAIzC,EAAG,IAAI,EACrB,OAAAyC,EAAI,MAAQ,IAAI,MAAM,KAAK,OAASpC,EAAI,MAAM,EACvCwJ,EAAW,KAAMxJ,EAAKoC,CAAG,CAClC,EAGAzC,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,EAAK,IAAI,CACrC,EAEAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,IAAI2L,EAAW3L,EAAM,EACjB2L,IAAU3L,EAAM,CAACA,GAErBZ,EAAO,OAAOY,GAAQ,QAAQ,EAC9BZ,EAAOY,EAAM,QAAS,EAItB,QADIqC,EAAQ,EACHjC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CACpC,IAAIE,GAAK,KAAK,MAAMF,CAAC,EAAI,GAAKJ,EAC1B+D,GAAMzD,EAAI,WAAc+B,EAAQ,UACpCA,IAAU,GACVA,GAAU/B,EAAI,SAAa,EAE3B+B,GAAS0B,IAAO,GAChB,KAAK,MAAM3D,CAAC,EAAI2D,EAAK,QACvB,CAEA,OAAI1B,IAAU,IACZ,KAAK,MAAMjC,CAAC,EAAIiC,EAChB,KAAK,UAEP,KAAK,OAASrC,IAAQ,EAAI,EAAI,KAAK,OAE5B2L,EAAW,KAAK,KAAK,EAAI,IAClC,EAEAhM,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAGAL,EAAG,UAAU,IAAM,UAAgB,CACjC,OAAO,KAAK,IAAI,IAAI,CACtB,EAGAA,EAAG,UAAU,KAAO,UAAiB,CACnC,OAAO,KAAK,KAAK,KAAK,MAAM,CAAC,CAC/B,EAGAA,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,IAAIM,EAAI8C,EAAWpD,CAAG,EACtB,GAAIM,EAAE,SAAW,EAAG,OAAO,IAAIX,EAAG,CAAC,EAInC,QADImD,EAAM,KACD1C,EAAI,EAAGA,EAAIE,EAAE,QAChBA,EAAEF,CAAC,IAAM,EADeA,IAAK0C,EAAMA,EAAI,IAAI,EAC/C,CAGF,GAAI,EAAE1C,EAAIE,EAAE,OACV,QAASsL,EAAI9I,EAAI,IAAI,EAAG1C,EAAIE,EAAE,OAAQF,IAAKwL,EAAIA,EAAE,IAAI,EAC/CtL,EAAEF,CAAC,IAAM,IAEb0C,EAAMA,EAAI,IAAI8I,CAAC,GAInB,OAAO9I,CACT,EAGAnD,EAAG,UAAU,OAAS,SAAiBkM,EAAM,CAC3CzM,EAAO,OAAOyM,GAAS,UAAYA,GAAQ,CAAC,EAC5C,IAAI/K,EAAI+K,EAAO,GACXzB,GAAKyB,EAAO/K,GAAK,GACjBgL,EAAa,WAAe,GAAKhL,GAAQ,GAAKA,EAC9CV,EAEJ,GAAIU,IAAM,EAAG,CACX,IAAIuB,EAAQ,EAEZ,IAAKjC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CAChC,IAAI2L,EAAW,KAAK,MAAM3L,CAAC,EAAI0L,EAC3BnL,GAAM,KAAK,MAAMP,CAAC,EAAI,GAAK2L,GAAajL,EAC5C,KAAK,MAAMV,CAAC,EAAIO,EAAI0B,EACpBA,EAAQ0J,IAAc,GAAKjL,CAC7B,CAEIuB,IACF,KAAK,MAAMjC,CAAC,EAAIiC,EAChB,KAAK,SAET,CAEA,GAAI+H,IAAM,EAAG,CACX,IAAKhK,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IAChC,KAAK,MAAMA,EAAIgK,CAAC,EAAI,KAAK,MAAMhK,CAAC,EAGlC,IAAKA,EAAI,EAAGA,EAAIgK,EAAGhK,IACjB,KAAK,MAAMA,CAAC,EAAI,EAGlB,KAAK,QAAUgK,CACjB,CAEA,OAAO,KAAK,OAAO,CACrB,EAEAzK,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CAEzC,OAAAzM,EAAO,KAAK,WAAa,CAAC,EACnB,KAAK,OAAOyM,CAAI,CACzB,EAKAlM,EAAG,UAAU,OAAS,SAAiBkM,EAAMG,EAAMC,EAAU,CAC3D7M,EAAO,OAAOyM,GAAS,UAAYA,GAAQ,CAAC,EAC5C,IAAIK,EACAF,EACFE,GAAKF,EAAQA,EAAO,IAAO,GAE3BE,EAAI,EAGN,IAAIpL,EAAI+K,EAAO,GACXzB,EAAI,KAAK,KAAKyB,EAAO/K,GAAK,GAAI,KAAK,MAAM,EACzCqL,EAAO,SAAc,WAAcrL,GAAMA,EACzCsL,EAAcH,EAMlB,GAJAC,GAAK9B,EACL8B,EAAI,KAAK,IAAI,EAAGA,CAAC,EAGbE,EAAa,CACf,QAAShM,EAAI,EAAGA,EAAIgK,EAAGhK,IACrBgM,EAAY,MAAMhM,CAAC,EAAI,KAAK,MAAMA,CAAC,EAErCgM,EAAY,OAAShC,CACvB,CAEA,GAAIA,IAAM,EAEH,GAAI,KAAK,OAASA,EAEvB,IADA,KAAK,QAAUA,EACVhK,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC3B,KAAK,MAAMA,CAAC,EAAI,KAAK,MAAMA,EAAIgK,CAAC,OAGlC,KAAK,MAAM,CAAC,EAAI,EAChB,KAAK,OAAS,EAGhB,IAAI/H,EAAQ,EACZ,IAAKjC,EAAI,KAAK,OAAS,EAAGA,GAAK,IAAMiC,IAAU,GAAKjC,GAAK8L,GAAI9L,IAAK,CAChE,IAAIqB,EAAO,KAAK,MAAMrB,CAAC,EAAI,EAC3B,KAAK,MAAMA,CAAC,EAAKiC,GAAU,GAAKvB,EAAOW,IAASX,EAChDuB,EAAQZ,EAAO0K,CACjB,CAGA,OAAIC,GAAe/J,IAAU,IAC3B+J,EAAY,MAAMA,EAAY,QAAQ,EAAI/J,GAGxC,KAAK,SAAW,IAClB,KAAK,MAAM,CAAC,EAAI,EAChB,KAAK,OAAS,GAGT,KAAK,OAAO,CACrB,EAEA1C,EAAG,UAAU,MAAQ,SAAgBkM,EAAMG,EAAMC,EAAU,CAEzD,OAAA7M,EAAO,KAAK,WAAa,CAAC,EACnB,KAAK,OAAOyM,EAAMG,EAAMC,CAAQ,CACzC,EAGAtM,EAAG,UAAU,KAAO,SAAekM,EAAM,CACvC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAI,CAChC,EAEAlM,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CACzC,OAAO,KAAK,MAAM,EAAE,OAAOA,CAAI,CACjC,EAGAlM,EAAG,UAAU,KAAO,SAAekM,EAAM,CACvC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAI,CAChC,EAEAlM,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CACzC,OAAO,KAAK,MAAM,EAAE,OAAOA,CAAI,CACjC,EAGAlM,EAAG,UAAU,MAAQ,SAAgB0D,EAAK,CACxCjE,EAAO,OAAOiE,GAAQ,UAAYA,GAAO,CAAC,EAC1C,IAAIvC,EAAIuC,EAAM,GACV+G,GAAK/G,EAAMvC,GAAK,GAChB8K,EAAI,GAAK9K,EAGb,GAAI,KAAK,QAAUsJ,EAAG,MAAO,GAG7B,IAAI9J,EAAI,KAAK,MAAM8J,CAAC,EAEpB,MAAO,CAAC,EAAE9J,EAAIsL,EAChB,EAGAjM,EAAG,UAAU,OAAS,SAAiBkM,EAAM,CAC3CzM,EAAO,OAAOyM,GAAS,UAAYA,GAAQ,CAAC,EAC5C,IAAI/K,EAAI+K,EAAO,GACXzB,GAAKyB,EAAO/K,GAAK,GAIrB,GAFA1B,EAAO,KAAK,WAAa,EAAG,yCAAyC,EAEjE,KAAK,QAAUgL,EACjB,OAAO,KAQT,GALItJ,IAAM,GACRsJ,IAEF,KAAK,OAAS,KAAK,IAAIA,EAAG,KAAK,MAAM,EAEjCtJ,IAAM,EAAG,CACX,IAAIqL,EAAO,SAAc,WAAcrL,GAAMA,EAC7C,KAAK,MAAM,KAAK,OAAS,CAAC,GAAKqL,CACjC,CAEA,OAAO,KAAK,OAAO,CACrB,EAGAxM,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CACzC,OAAO,KAAK,MAAM,EAAE,OAAOA,CAAI,CACjC,EAGAlM,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAGxC,OAFAZ,EAAO,OAAOY,GAAQ,QAAQ,EAC9BZ,EAAOY,EAAM,QAAS,EAClBA,EAAM,EAAU,KAAK,MAAM,CAACA,CAAG,EAG/B,KAAK,WAAa,EAChB,KAAK,SAAW,IAAM,KAAK,MAAM,CAAC,EAAI,IAAMA,GAC9C,KAAK,MAAM,CAAC,EAAIA,GAAO,KAAK,MAAM,CAAC,EAAI,GACvC,KAAK,SAAW,EACT,OAGT,KAAK,SAAW,EAChB,KAAK,MAAMA,CAAG,EACd,KAAK,SAAW,EACT,MAIF,KAAK,OAAOA,CAAG,CACxB,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,KAAK,MAAM,CAAC,GAAKA,EAGjB,QAASI,EAAI,EAAGA,EAAI,KAAK,QAAU,KAAK,MAAMA,CAAC,GAAK,SAAWA,IAC7D,KAAK,MAAMA,CAAC,GAAK,SACbA,IAAM,KAAK,OAAS,EACtB,KAAK,MAAMA,EAAI,CAAC,EAAI,EAEpB,KAAK,MAAMA,EAAI,CAAC,IAGpB,YAAK,OAAS,KAAK,IAAI,KAAK,OAAQA,EAAI,CAAC,EAElC,IACT,EAGAT,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAGxC,GAFAZ,EAAO,OAAOY,GAAQ,QAAQ,EAC9BZ,EAAOY,EAAM,QAAS,EAClBA,EAAM,EAAG,OAAO,KAAK,MAAM,CAACA,CAAG,EAEnC,GAAI,KAAK,WAAa,EACpB,YAAK,SAAW,EAChB,KAAK,MAAMA,CAAG,EACd,KAAK,SAAW,EACT,KAKT,GAFA,KAAK,MAAM,CAAC,GAAKA,EAEb,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,EAAI,EACvC,KAAK,MAAM,CAAC,EAAI,CAAC,KAAK,MAAM,CAAC,EAC7B,KAAK,SAAW,MAGhB,SAASI,EAAI,EAAGA,EAAI,KAAK,QAAU,KAAK,MAAMA,CAAC,EAAI,EAAGA,IACpD,KAAK,MAAMA,CAAC,GAAK,SACjB,KAAK,MAAMA,EAAI,CAAC,GAAK,EAIzB,OAAO,KAAK,OAAO,CACrB,EAEAT,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,KAAO,UAAiB,CACnC,YAAK,SAAW,EAET,IACT,EAEAA,EAAG,UAAU,IAAM,UAAgB,CACjC,OAAO,KAAK,MAAM,EAAE,KAAK,CAC3B,EAEAA,EAAG,UAAU,aAAe,SAAuBK,EAAKmB,EAAK8B,EAAO,CAClE,IAAI7B,EAAMpB,EAAI,OAASiD,EACnB7C,EAEJ,KAAK,QAAQgB,CAAG,EAEhB,IAAId,EACA+B,EAAQ,EACZ,IAAKjC,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CAC/BE,GAAK,KAAK,MAAMF,EAAI6C,CAAK,EAAI,GAAKZ,EAClC,IAAInC,GAASF,EAAI,MAAMI,CAAC,EAAI,GAAKe,EACjCb,GAAKJ,EAAQ,SACbmC,GAAS/B,GAAK,KAAQJ,EAAQ,SAAa,GAC3C,KAAK,MAAME,EAAI6C,CAAK,EAAI3C,EAAI,QAC9B,CACA,KAAOF,EAAI,KAAK,OAAS6C,EAAO7C,IAC9BE,GAAK,KAAK,MAAMF,EAAI6C,CAAK,EAAI,GAAKZ,EAClCA,EAAQ/B,GAAK,GACb,KAAK,MAAMF,EAAI6C,CAAK,EAAI3C,EAAI,SAG9B,GAAI+B,IAAU,EAAG,OAAO,KAAK,OAAO,EAKpC,IAFAjD,EAAOiD,IAAU,EAAE,EACnBA,EAAQ,EACHjC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC3BE,EAAI,EAAE,KAAK,MAAMF,CAAC,EAAI,GAAKiC,EAC3BA,EAAQ/B,GAAK,GACb,KAAK,MAAMF,CAAC,EAAIE,EAAI,SAEtB,YAAK,SAAW,EAET,KAAK,OAAO,CACrB,EAEAX,EAAG,UAAU,SAAW,SAAmBK,EAAKqM,EAAM,CACpD,IAAIpJ,EAAQ,KAAK,OAASjD,EAAI,OAE1ByD,EAAI,KAAK,MAAM,EACf,EAAIzD,EAGJsM,EAAM,EAAE,MAAM,EAAE,OAAS,CAAC,EAAI,EAC9BC,EAAU,KAAK,WAAWD,CAAG,EACjCrJ,EAAQ,GAAKsJ,EACTtJ,IAAU,IACZ,EAAI,EAAE,MAAMA,CAAK,EACjBQ,EAAE,OAAOR,CAAK,EACdqJ,EAAM,EAAE,MAAM,EAAE,OAAS,CAAC,EAAI,GAIhC,IAAItB,EAAIvH,EAAE,OAAS,EAAE,OACjBmI,EAEJ,GAAIS,IAAS,MAAO,CAClBT,EAAI,IAAIjM,EAAG,IAAI,EACfiM,EAAE,OAASZ,EAAI,EACfY,EAAE,MAAQ,IAAI,MAAMA,EAAE,MAAM,EAC5B,QAASxL,EAAI,EAAGA,EAAIwL,EAAE,OAAQxL,IAC5BwL,EAAE,MAAMxL,CAAC,EAAI,CAEjB,CAEA,IAAIoM,EAAO/I,EAAE,MAAM,EAAE,aAAa,EAAG,EAAGuH,CAAC,EACrCwB,EAAK,WAAa,IACpB/I,EAAI+I,EACAZ,IACFA,EAAE,MAAMZ,CAAC,EAAI,IAIjB,QAAS3K,EAAI2K,EAAI,EAAG3K,GAAK,EAAGA,IAAK,CAC/B,IAAIoM,GAAMhJ,EAAE,MAAM,EAAE,OAASpD,CAAC,EAAI,GAAK,UACpCoD,EAAE,MAAM,EAAE,OAASpD,EAAI,CAAC,EAAI,GAO/B,IAHAoM,EAAK,KAAK,IAAKA,EAAKH,EAAO,EAAG,QAAS,EAEvC7I,EAAE,aAAa,EAAGgJ,EAAIpM,CAAC,EAChBoD,EAAE,WAAa,GACpBgJ,IACAhJ,EAAE,SAAW,EACbA,EAAE,aAAa,EAAG,EAAGpD,CAAC,EACjBoD,EAAE,OAAO,IACZA,EAAE,UAAY,GAGdmI,IACFA,EAAE,MAAMvL,CAAC,EAAIoM,EAEjB,CACA,OAAIb,GACFA,EAAE,OAAO,EAEXnI,EAAE,OAAO,EAGL4I,IAAS,OAASpJ,IAAU,GAC9BQ,EAAE,OAAOR,CAAK,EAGT,CACL,IAAK2I,GAAK,KACV,IAAKnI,CACP,CACF,EAMA9D,EAAG,UAAU,OAAS,SAAiBK,EAAKqM,EAAMK,EAAU,CAG1D,GAFAtN,EAAO,CAACY,EAAI,OAAO,CAAC,EAEhB,KAAK,OAAO,EACd,MAAO,CACL,IAAK,IAAIL,EAAG,CAAC,EACb,IAAK,IAAIA,EAAG,CAAC,CACf,EAGF,IAAIgN,EAAKnL,EAAKsB,EACd,OAAI,KAAK,WAAa,GAAK9C,EAAI,WAAa,GAC1C8C,EAAM,KAAK,IAAI,EAAE,OAAO9C,EAAKqM,CAAI,EAE7BA,IAAS,QACXM,EAAM7J,EAAI,IAAI,IAAI,GAGhBuJ,IAAS,QACX7K,EAAMsB,EAAI,IAAI,IAAI,EACd4J,GAAYlL,EAAI,WAAa,GAC/BA,EAAI,KAAKxB,CAAG,GAIT,CACL,IAAK2M,EACL,IAAKnL,CACP,GAGE,KAAK,WAAa,GAAKxB,EAAI,WAAa,GAC1C8C,EAAM,KAAK,OAAO9C,EAAI,IAAI,EAAGqM,CAAI,EAE7BA,IAAS,QACXM,EAAM7J,EAAI,IAAI,IAAI,GAGb,CACL,IAAK6J,EACL,IAAK7J,EAAI,GACX,IAGG,KAAK,SAAW9C,EAAI,YAAc,GACrC8C,EAAM,KAAK,IAAI,EAAE,OAAO9C,EAAI,IAAI,EAAGqM,CAAI,EAEnCA,IAAS,QACX7K,EAAMsB,EAAI,IAAI,IAAI,EACd4J,GAAYlL,EAAI,WAAa,GAC/BA,EAAI,KAAKxB,CAAG,GAIT,CACL,IAAK8C,EAAI,IACT,IAAKtB,CACP,GAMExB,EAAI,OAAS,KAAK,QAAU,KAAK,IAAIA,CAAG,EAAI,EACvC,CACL,IAAK,IAAIL,EAAG,CAAC,EACb,IAAK,IACP,EAIEK,EAAI,SAAW,EACbqM,IAAS,MACJ,CACL,IAAK,KAAK,KAAKrM,EAAI,MAAM,CAAC,CAAC,EAC3B,IAAK,IACP,EAGEqM,IAAS,MACJ,CACL,IAAK,KACL,IAAK,IAAI1M,EAAG,KAAK,MAAMK,EAAI,MAAM,CAAC,CAAC,CAAC,CACtC,EAGK,CACL,IAAK,KAAK,KAAKA,EAAI,MAAM,CAAC,CAAC,EAC3B,IAAK,IAAIL,EAAG,KAAK,MAAMK,EAAI,MAAM,CAAC,CAAC,CAAC,CACtC,EAGK,KAAK,SAASA,EAAKqM,CAAI,CAChC,EAGA1M,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,OAAOA,EAAK,MAAO,EAAK,EAAE,GACxC,EAGAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,OAAOA,EAAK,MAAO,EAAK,EAAE,GACxC,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,OAAOA,EAAK,MAAO,EAAI,EAAE,GACvC,EAGAL,EAAG,UAAU,SAAW,SAAmBK,EAAK,CAC9C,IAAI4M,EAAK,KAAK,OAAO5M,CAAG,EAGxB,GAAI4M,EAAG,IAAI,OAAO,EAAG,OAAOA,EAAG,IAE/B,IAAIpL,EAAMoL,EAAG,IAAI,WAAa,EAAIA,EAAG,IAAI,KAAK5M,CAAG,EAAI4M,EAAG,IAEpDC,EAAO7M,EAAI,MAAM,CAAC,EAClB8M,EAAK9M,EAAI,MAAM,CAAC,EAChB4D,EAAMpC,EAAI,IAAIqL,CAAI,EAGtB,OAAIjJ,EAAM,GAAMkJ,IAAO,GAAKlJ,IAAQ,EAAWgJ,EAAG,IAG3CA,EAAG,IAAI,WAAa,EAAIA,EAAG,IAAI,MAAM,CAAC,EAAIA,EAAG,IAAI,MAAM,CAAC,CACjE,EAEAjN,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,IAAI2L,EAAW3L,EAAM,EACjB2L,IAAU3L,EAAM,CAACA,GAErBZ,EAAOY,GAAO,QAAS,EAIvB,QAHIuK,GAAK,GAAK,IAAMvK,EAEhB+M,EAAM,EACD3M,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IACpC2M,GAAOxC,EAAIwC,GAAO,KAAK,MAAM3M,CAAC,EAAI,IAAMJ,EAG1C,OAAO2L,EAAW,CAACoB,EAAMA,CAC3B,EAGApN,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAMA,CAAG,CACvB,EAGAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,IAAI2L,EAAW3L,EAAM,EACjB2L,IAAU3L,EAAM,CAACA,GAErBZ,EAAOY,GAAO,QAAS,EAGvB,QADIqC,EAAQ,EACHjC,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IAAK,CACzC,IAAIE,GAAK,KAAK,MAAMF,CAAC,EAAI,GAAKiC,EAAQ,SACtC,KAAK,MAAMjC,CAAC,EAAKE,EAAIN,EAAO,EAC5BqC,EAAQ/B,EAAIN,CACd,CAEA,YAAK,OAAO,EACL2L,EAAW,KAAK,KAAK,EAAI,IAClC,EAEAhM,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,KAAO,SAAe4K,EAAG,CACpCnL,EAAOmL,EAAE,WAAa,CAAC,EACvBnL,EAAO,CAACmL,EAAE,OAAO,CAAC,EAElB,IAAIb,EAAI,KACJC,EAAIY,EAAE,MAAM,EAEZb,EAAE,WAAa,EACjBA,EAAIA,EAAE,KAAKa,CAAC,EAEZb,EAAIA,EAAE,MAAM,EAad,QATIsD,EAAI,IAAIrN,EAAG,CAAC,EACZsN,EAAI,IAAItN,EAAG,CAAC,EAGZuN,EAAI,IAAIvN,EAAG,CAAC,EACZwN,EAAI,IAAIxN,EAAG,CAAC,EAEZ,EAAI,EAED+J,EAAE,OAAO,GAAKC,EAAE,OAAO,GAC5BD,EAAE,OAAO,CAAC,EACVC,EAAE,OAAO,CAAC,EACV,EAAE,EAMJ,QAHIyD,EAAKzD,EAAE,MAAM,EACb0D,EAAK3D,EAAE,MAAM,EAEV,CAACA,EAAE,OAAO,GAAG,CAClB,QAAStJ,EAAI,EAAGkN,EAAK,GAAI5D,EAAE,MAAM,CAAC,EAAI4D,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAsJ,EAAE,OAAOtJ,CAAC,EACHA,KAAM,IACP4M,EAAE,MAAM,GAAKC,EAAE,MAAM,KACvBD,EAAE,KAAKI,CAAE,EACTH,EAAE,KAAKI,CAAE,GAGXL,EAAE,OAAO,CAAC,EACVC,EAAE,OAAO,CAAC,EAId,QAAS5M,EAAI,EAAGkN,EAAK,GAAI5D,EAAE,MAAM,CAAC,EAAI4D,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAsJ,EAAE,OAAOtJ,CAAC,EACHA,KAAM,IACP6M,EAAE,MAAM,GAAKC,EAAE,MAAM,KACvBD,EAAE,KAAKE,CAAE,EACTD,EAAE,KAAKE,CAAE,GAGXH,EAAE,OAAO,CAAC,EACVC,EAAE,OAAO,CAAC,EAIVzD,EAAE,IAAIC,CAAC,GAAK,GACdD,EAAE,KAAKC,CAAC,EACRqD,EAAE,KAAKE,CAAC,EACRD,EAAE,KAAKE,CAAC,IAERxD,EAAE,KAAKD,CAAC,EACRwD,EAAE,KAAKF,CAAC,EACRG,EAAE,KAAKF,CAAC,EAEZ,CAEA,MAAO,CACL,EAAGC,EACH,EAAGC,EACH,IAAKxD,EAAE,OAAO,CAAC,CACjB,CACF,EAKAhK,EAAG,UAAU,OAAS,SAAiB4K,EAAG,CACxCnL,EAAOmL,EAAE,WAAa,CAAC,EACvBnL,EAAO,CAACmL,EAAE,OAAO,CAAC,EAElB,IAAI9G,EAAI,KACJF,EAAIgH,EAAE,MAAM,EAEZ9G,EAAE,WAAa,EACjBA,EAAIA,EAAE,KAAK8G,CAAC,EAEZ9G,EAAIA,EAAE,MAAM,EAQd,QALI+J,EAAK,IAAI7N,EAAG,CAAC,EACb8N,EAAK,IAAI9N,EAAG,CAAC,EAEb+N,EAAQnK,EAAE,MAAM,EAEbE,EAAE,KAAK,CAAC,EAAI,GAAKF,EAAE,KAAK,CAAC,EAAI,GAAG,CACrC,QAASnD,EAAI,EAAGkN,EAAK,GAAI7J,EAAE,MAAM,CAAC,EAAI6J,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAqD,EAAE,OAAOrD,CAAC,EACHA,KAAM,GACPoN,EAAG,MAAM,GACXA,EAAG,KAAKE,CAAK,EAGfF,EAAG,OAAO,CAAC,EAIf,QAASnN,EAAI,EAAGkN,EAAK,GAAIhK,EAAE,MAAM,CAAC,EAAIgK,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAkD,EAAE,OAAOlD,CAAC,EACHA,KAAM,GACPoN,EAAG,MAAM,GACXA,EAAG,KAAKC,CAAK,EAGfD,EAAG,OAAO,CAAC,EAIXhK,EAAE,IAAIF,CAAC,GAAK,GACdE,EAAE,KAAKF,CAAC,EACRiK,EAAG,KAAKC,CAAE,IAEVlK,EAAE,KAAKE,CAAC,EACRgK,EAAG,KAAKD,CAAE,EAEd,CAEA,IAAI1K,EACJ,OAAIW,EAAE,KAAK,CAAC,IAAM,EAChBX,EAAM0K,EAEN1K,EAAM2K,EAGJ3K,EAAI,KAAK,CAAC,EAAI,GAChBA,EAAI,KAAKyH,CAAC,EAGLzH,CACT,EAEAnD,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,GAAI,KAAK,OAAO,EAAG,OAAOA,EAAI,IAAI,EAClC,GAAIA,EAAI,OAAO,EAAG,OAAO,KAAK,IAAI,EAElC,IAAIyD,EAAI,KAAK,MAAM,EACfF,EAAIvD,EAAI,MAAM,EAClByD,EAAE,SAAW,EACbF,EAAE,SAAW,EAGb,QAASN,EAAQ,EAAGQ,EAAE,OAAO,GAAKF,EAAE,OAAO,EAAGN,IAC5CQ,EAAE,OAAO,CAAC,EACVF,EAAE,OAAO,CAAC,EAGZ,EAAG,CACD,KAAOE,EAAE,OAAO,GACdA,EAAE,OAAO,CAAC,EAEZ,KAAOF,EAAE,OAAO,GACdA,EAAE,OAAO,CAAC,EAGZ,IAAIzC,EAAI2C,EAAE,IAAIF,CAAC,EACf,GAAIzC,EAAI,EAAG,CAET,IAAIoC,EAAIO,EACRA,EAAIF,EACJA,EAAIL,CACN,SAAWpC,IAAM,GAAKyC,EAAE,KAAK,CAAC,IAAM,EAClC,MAGFE,EAAE,KAAKF,CAAC,CACV,OAAS,IAET,OAAOA,EAAE,OAAON,CAAK,CACvB,EAGAtD,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,KAAKA,CAAG,EAAE,EAAE,KAAKA,CAAG,CAClC,EAEAL,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAQ,KAAK,MAAM,CAAC,EAAI,KAAO,CACjC,EAEAA,EAAG,UAAU,MAAQ,UAAkB,CACrC,OAAQ,KAAK,MAAM,CAAC,EAAI,KAAO,CACjC,EAGAA,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,OAAO,KAAK,MAAM,CAAC,EAAIA,CACzB,EAGAL,EAAG,UAAU,MAAQ,SAAgB0D,EAAK,CACxCjE,EAAO,OAAOiE,GAAQ,QAAQ,EAC9B,IAAIvC,EAAIuC,EAAM,GACV+G,GAAK/G,EAAMvC,GAAK,GAChB8K,EAAI,GAAK9K,EAGb,GAAI,KAAK,QAAUsJ,EACjB,YAAK,QAAQA,EAAI,CAAC,EAClB,KAAK,MAAMA,CAAC,GAAKwB,EACV,KAKT,QADIvJ,EAAQuJ,EACHxL,EAAIgK,EAAG/H,IAAU,GAAKjC,EAAI,KAAK,OAAQA,IAAK,CACnD,IAAIE,EAAI,KAAK,MAAMF,CAAC,EAAI,EACxBE,GAAK+B,EACLA,EAAQ/B,IAAM,GACdA,GAAK,SACL,KAAK,MAAMF,CAAC,EAAIE,CAClB,CACA,OAAI+B,IAAU,IACZ,KAAK,MAAMjC,CAAC,EAAIiC,EAChB,KAAK,UAEA,IACT,EAEA1C,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAO,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,IAAM,CAChD,EAEAA,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,IAAI2N,EAAW3N,EAAM,EAErB,GAAI,KAAK,WAAa,GAAK,CAAC2N,EAAU,MAAO,GAC7C,GAAI,KAAK,WAAa,GAAKA,EAAU,MAAO,GAE5C,KAAK,OAAO,EAEZ,IAAI7K,EACJ,GAAI,KAAK,OAAS,EAChBA,EAAM,MACD,CACD6K,IACF3N,EAAM,CAACA,GAGTZ,EAAOY,GAAO,SAAW,mBAAmB,EAE5C,IAAIM,EAAI,KAAK,MAAM,CAAC,EAAI,EACxBwC,EAAMxC,IAAMN,EAAM,EAAIM,EAAIN,EAAM,GAAK,CACvC,CACA,OAAI,KAAK,WAAa,EAAU,CAAC8C,EAAM,EAChCA,CACT,EAMAnD,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,GAAI,KAAK,WAAa,GAAKA,EAAI,WAAa,EAAG,MAAO,GACtD,GAAI,KAAK,WAAa,GAAKA,EAAI,WAAa,EAAG,MAAO,GAEtD,IAAI8C,EAAM,KAAK,KAAK9C,CAAG,EACvB,OAAI,KAAK,WAAa,EAAU,CAAC8C,EAAM,EAChCA,CACT,EAGAnD,EAAG,UAAU,KAAO,SAAeK,EAAK,CAEtC,GAAI,KAAK,OAASA,EAAI,OAAQ,MAAO,GACrC,GAAI,KAAK,OAASA,EAAI,OAAQ,MAAO,GAGrC,QADI8C,EAAM,EACD1C,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IAAK,CACzC,IAAIqD,EAAI,KAAK,MAAMrD,CAAC,EAAI,EACpB,EAAIJ,EAAI,MAAMI,CAAC,EAAI,EAEvB,GAAIqD,IAAM,EACV,CAAIA,EAAI,EACNX,EAAM,GACGW,EAAI,IACbX,EAAM,GAER,MACF,CACA,OAAOA,CACT,EAEAnD,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,KAAKA,CAAG,IAAM,CAC5B,EAEAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAO,KAAK,IAAIA,CAAG,IAAM,CAC3B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,KAAKA,CAAG,GAAK,CAC3B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,IAAIA,CAAG,GAAK,CAC1B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,KAAKA,CAAG,IAAM,EAC5B,EAEAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAO,KAAK,IAAIA,CAAG,IAAM,EAC3B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,KAAKA,CAAG,GAAK,CAC3B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,IAAIA,CAAG,GAAK,CAC1B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,KAAKA,CAAG,IAAM,CAC5B,EAEAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAO,KAAK,IAAIA,CAAG,IAAM,CAC3B,EAMAL,EAAG,IAAM,SAAcK,EAAK,CAC1B,OAAO,IAAI4N,EAAI5N,CAAG,CACpB,EAEAL,EAAG,UAAU,MAAQ,SAAgBkO,EAAK,CACxC,OAAAzO,EAAO,CAAC,KAAK,IAAK,uCAAuC,EACzDA,EAAO,KAAK,WAAa,EAAG,+BAA+B,EACpDyO,EAAI,UAAU,IAAI,EAAE,UAAUA,CAAG,CAC1C,EAEAlO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,sDAAsD,EAChE,KAAK,IAAI,YAAY,IAAI,CAClC,EAEAO,EAAG,UAAU,UAAY,SAAoBkO,EAAK,CAChD,YAAK,IAAMA,EACJ,IACT,EAEAlO,EAAG,UAAU,SAAW,SAAmBkO,EAAK,CAC9C,OAAAzO,EAAO,CAAC,KAAK,IAAK,uCAAuC,EAClD,KAAK,UAAUyO,CAAG,CAC3B,EAEAlO,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EAC9C,KAAK,IAAI,IAAI,KAAMY,CAAG,CAC/B,EAEAL,EAAG,UAAU,QAAU,SAAkBK,EAAK,CAC5C,OAAAZ,EAAO,KAAK,IAAK,qCAAqC,EAC/C,KAAK,IAAI,KAAK,KAAMY,CAAG,CAChC,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EAC9C,KAAK,IAAI,IAAI,KAAMY,CAAG,CAC/B,EAEAL,EAAG,UAAU,QAAU,SAAkBK,EAAK,CAC5C,OAAAZ,EAAO,KAAK,IAAK,qCAAqC,EAC/C,KAAK,IAAI,KAAK,KAAMY,CAAG,CAChC,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EAC9C,KAAK,IAAI,IAAI,KAAMY,CAAG,CAC/B,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,KAAMY,CAAG,EACpB,KAAK,IAAI,IAAI,KAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,QAAU,SAAkBK,EAAK,CAC5C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,KAAMY,CAAG,EACpB,KAAK,IAAI,KAAK,KAAMA,CAAG,CAChC,EAEAL,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAAP,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,IAAI,IAAI,CAC1B,EAEAO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,qCAAqC,EACtD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,KAAK,IAAI,CAC3B,EAGAO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,qCAAqC,EACtD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,KAAK,IAAI,CAC3B,EAEAO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,qCAAqC,EACtD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,KAAK,IAAI,CAC3B,EAGAO,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAAP,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,IAAI,IAAI,CAC1B,EAEAO,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,KAAO,CAACY,EAAI,IAAK,mBAAmB,EAChD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,IAAI,KAAMA,CAAG,CAC/B,EAGA,IAAI8N,EAAS,CACX,KAAM,KACN,KAAM,KACN,KAAM,KACN,OAAQ,IACV,EAGA,SAASC,EAAQC,EAAMzD,EAAG,CAExB,KAAK,KAAOyD,EACZ,KAAK,EAAI,IAAIrO,EAAG4K,EAAG,EAAE,EACrB,KAAK,EAAI,KAAK,EAAE,UAAU,EAC1B,KAAK,EAAI,IAAI5K,EAAG,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAE7C,KAAK,IAAM,KAAK,KAAK,CACvB,CAEAoO,EAAO,UAAU,KAAO,UAAiB,CACvC,IAAIE,EAAM,IAAItO,EAAG,IAAI,EACrB,OAAAsO,EAAI,MAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,EAAI,EAAE,CAAC,EACrCA,CACT,EAEAF,EAAO,UAAU,QAAU,SAAkB/N,EAAK,CAGhD,IAAIc,EAAId,EACJkO,EAEJ,GACE,KAAK,MAAMpN,EAAG,KAAK,GAAG,EACtBA,EAAI,KAAK,MAAMA,CAAC,EAChBA,EAAIA,EAAE,KAAK,KAAK,GAAG,EACnBoN,EAAOpN,EAAE,UAAU,QACZoN,EAAO,KAAK,GAErB,IAAItK,EAAMsK,EAAO,KAAK,EAAI,GAAKpN,EAAE,KAAK,KAAK,CAAC,EAC5C,OAAI8C,IAAQ,GACV9C,EAAE,MAAM,CAAC,EAAI,EACbA,EAAE,OAAS,GACF8C,EAAM,EACf9C,EAAE,KAAK,KAAK,CAAC,EAETA,EAAE,QAAU,OAEdA,EAAE,MAAM,EAGRA,EAAE,OAAO,EAINA,CACT,EAEAiN,EAAO,UAAU,MAAQ,SAAgBI,EAAO/L,EAAK,CACnD+L,EAAM,OAAO,KAAK,EAAG,EAAG/L,CAAG,CAC7B,EAEA2L,EAAO,UAAU,MAAQ,SAAgB/N,EAAK,CAC5C,OAAOA,EAAI,KAAK,KAAK,CAAC,CACxB,EAEA,SAASoO,GAAQ,CACfL,EAAO,KACL,KACA,OACA,yEAAyE,CAC7E,CACAxO,EAAS6O,EAAML,CAAM,EAErBK,EAAK,UAAU,MAAQ,SAAgBD,EAAOE,EAAQ,CAKpD,QAHIlC,EAAO,QAEPmC,EAAS,KAAK,IAAIH,EAAM,OAAQ,CAAC,EAC5B/N,EAAI,EAAGA,EAAIkO,EAAQlO,IAC1BiO,EAAO,MAAMjO,CAAC,EAAI+N,EAAM,MAAM/N,CAAC,EAIjC,GAFAiO,EAAO,OAASC,EAEZH,EAAM,QAAU,EAAG,CACrBA,EAAM,MAAM,CAAC,EAAI,EACjBA,EAAM,OAAS,EACf,MACF,CAGA,IAAII,EAAOJ,EAAM,MAAM,CAAC,EAGxB,IAFAE,EAAO,MAAMA,EAAO,QAAQ,EAAIE,EAAOpC,EAElC/L,EAAI,GAAIA,EAAI+N,EAAM,OAAQ/N,IAAK,CAClC,IAAIoO,EAAOL,EAAM,MAAM/N,CAAC,EAAI,EAC5B+N,EAAM,MAAM/N,EAAI,EAAE,GAAMoO,EAAOrC,IAAS,EAAMoC,IAAS,GACvDA,EAAOC,CACT,CACAD,KAAU,GACVJ,EAAM,MAAM/N,EAAI,EAAE,EAAImO,EAClBA,IAAS,GAAKJ,EAAM,OAAS,GAC/BA,EAAM,QAAU,GAEhBA,EAAM,QAAU,CAEpB,EAEAC,EAAK,UAAU,MAAQ,SAAgBpO,EAAK,CAE1CA,EAAI,MAAMA,EAAI,MAAM,EAAI,EACxBA,EAAI,MAAMA,EAAI,OAAS,CAAC,EAAI,EAC5BA,EAAI,QAAU,EAId,QADI+D,EAAK,EACA3D,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CACnC,IAAIE,EAAIN,EAAI,MAAMI,CAAC,EAAI,EACvB2D,GAAMzD,EAAI,IACVN,EAAI,MAAMI,CAAC,EAAI2D,EAAK,SACpBA,EAAKzD,EAAI,IAASyD,EAAK,SAAa,EACtC,CAGA,OAAI/D,EAAI,MAAMA,EAAI,OAAS,CAAC,IAAM,IAChCA,EAAI,SACAA,EAAI,MAAMA,EAAI,OAAS,CAAC,IAAM,GAChCA,EAAI,UAGDA,CACT,EAEA,SAASyO,IAAQ,CACfV,EAAO,KACL,KACA,OACA,gEAAgE,CACpE,CACAxO,EAASkP,GAAMV,CAAM,EAErB,SAASW,IAAQ,CACfX,EAAO,KACL,KACA,OACA,uDAAuD,CAC3D,CACAxO,EAASmP,GAAMX,CAAM,EAErB,SAASY,IAAU,CAEjBZ,EAAO,KACL,KACA,QACA,qEAAqE,CACzE,CACAxO,EAASoP,GAAQZ,CAAM,EAEvBY,GAAO,UAAU,MAAQ,SAAgB3O,EAAK,CAG5C,QADIqC,EAAQ,EACHjC,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CACnC,IAAI+C,GAAMnD,EAAI,MAAMI,CAAC,EAAI,GAAK,GAAOiC,EACjC0B,EAAKZ,EAAK,SACdA,KAAQ,GAERnD,EAAI,MAAMI,CAAC,EAAI2D,EACf1B,EAAQc,CACV,CACA,OAAId,IAAU,IACZrC,EAAI,MAAMA,EAAI,QAAQ,EAAIqC,GAErBrC,CACT,EAGAL,EAAG,OAAS,SAAgBqO,EAAM,CAEhC,GAAIF,EAAOE,CAAI,EAAG,OAAOF,EAAOE,CAAI,EAEpC,IAAIY,EACJ,GAAIZ,IAAS,OACXY,EAAQ,IAAIR,UACHJ,IAAS,OAClBY,EAAQ,IAAIH,WACHT,IAAS,OAClBY,EAAQ,IAAIF,WACHV,IAAS,SAClBY,EAAQ,IAAID,OAEZ,OAAM,IAAI,MAAM,iBAAmBX,CAAI,EAEzC,OAAAF,EAAOE,CAAI,EAAIY,EAERA,CACT,EAKA,SAAShB,EAAK5C,EAAG,CACf,GAAI,OAAOA,GAAM,SAAU,CACzB,IAAI4D,EAAQjP,EAAG,OAAOqL,CAAC,EACvB,KAAK,EAAI4D,EAAM,EACf,KAAK,MAAQA,CACf,MACExP,EAAO4L,EAAE,IAAI,CAAC,EAAG,gCAAgC,EACjD,KAAK,EAAIA,EACT,KAAK,MAAQ,IAEjB,CAEA4C,EAAI,UAAU,SAAW,SAAmBnK,EAAG,CAC7CrE,EAAOqE,EAAE,WAAa,EAAG,+BAA+B,EACxDrE,EAAOqE,EAAE,IAAK,iCAAiC,CACjD,EAEAmK,EAAI,UAAU,SAAW,SAAmBnK,EAAGF,EAAG,CAChDnE,GAAQqE,EAAE,SAAWF,EAAE,YAAc,EAAG,+BAA+B,EACvEnE,EAAOqE,EAAE,KAAOA,EAAE,MAAQF,EAAE,IAC1B,iCAAiC,CACrC,EAEAqK,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,OAAI,KAAK,MAAc,KAAK,MAAM,QAAQA,CAAC,EAAE,UAAU,IAAI,GAE3D7B,EAAK6B,EAAGA,EAAE,KAAK,KAAK,CAAC,EAAE,UAAU,IAAI,CAAC,EAC/BA,EACT,EAEAmK,EAAI,UAAU,IAAM,SAAcnK,EAAG,CACnC,OAAIA,EAAE,OAAO,EACJA,EAAE,MAAM,EAGV,KAAK,EAAE,IAAIA,CAAC,EAAE,UAAU,IAAI,CACrC,EAEAmK,EAAI,UAAU,IAAM,SAAcnK,EAAGF,EAAG,CACtC,KAAK,SAASE,EAAGF,CAAC,EAElB,IAAIT,EAAMW,EAAE,IAAIF,CAAC,EACjB,OAAIT,EAAI,IAAI,KAAK,CAAC,GAAK,GACrBA,EAAI,KAAK,KAAK,CAAC,EAEVA,EAAI,UAAU,IAAI,CAC3B,EAEA8K,EAAI,UAAU,KAAO,SAAenK,EAAGF,EAAG,CACxC,KAAK,SAASE,EAAGF,CAAC,EAElB,IAAIT,EAAMW,EAAE,KAAKF,CAAC,EAClB,OAAIT,EAAI,IAAI,KAAK,CAAC,GAAK,GACrBA,EAAI,KAAK,KAAK,CAAC,EAEVA,CACT,EAEA8K,EAAI,UAAU,IAAM,SAAcnK,EAAGF,EAAG,CACtC,KAAK,SAASE,EAAGF,CAAC,EAElB,IAAIT,EAAMW,EAAE,IAAIF,CAAC,EACjB,OAAIT,EAAI,KAAK,CAAC,EAAI,GAChBA,EAAI,KAAK,KAAK,CAAC,EAEVA,EAAI,UAAU,IAAI,CAC3B,EAEA8K,EAAI,UAAU,KAAO,SAAenK,EAAGF,EAAG,CACxC,KAAK,SAASE,EAAGF,CAAC,EAElB,IAAIT,EAAMW,EAAE,KAAKF,CAAC,EAClB,OAAIT,EAAI,KAAK,CAAC,EAAI,GAChBA,EAAI,KAAK,KAAK,CAAC,EAEVA,CACT,EAEA8K,EAAI,UAAU,IAAM,SAAcnK,EAAGzD,EAAK,CACxC,YAAK,SAASyD,CAAC,EACR,KAAK,KAAKA,EAAE,MAAMzD,CAAG,CAAC,CAC/B,EAEA4N,EAAI,UAAU,KAAO,SAAenK,EAAGF,EAAG,CACxC,YAAK,SAASE,EAAGF,CAAC,EACX,KAAK,KAAKE,EAAE,KAAKF,CAAC,CAAC,CAC5B,EAEAqK,EAAI,UAAU,IAAM,SAAcnK,EAAGF,EAAG,CACtC,YAAK,SAASE,EAAGF,CAAC,EACX,KAAK,KAAKE,EAAE,IAAIF,CAAC,CAAC,CAC3B,EAEAqK,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,OAAO,KAAK,KAAKA,EAAGA,EAAE,MAAM,CAAC,CAC/B,EAEAmK,EAAI,UAAU,IAAM,SAAcnK,EAAG,CACnC,OAAO,KAAK,IAAIA,EAAGA,CAAC,CACtB,EAEAmK,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,GAAIA,EAAE,OAAO,EAAG,OAAOA,EAAE,MAAM,EAE/B,IAAIoL,EAAO,KAAK,EAAE,MAAM,CAAC,EAIzB,GAHAzP,EAAOyP,EAAO,IAAM,CAAC,EAGjBA,IAAS,EAAG,CACd,IAAInN,EAAM,KAAK,EAAE,IAAI,IAAI/B,EAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EACxC,OAAO,KAAK,IAAI8D,EAAG/B,CAAG,CACxB,CAOA,QAFIkK,EAAI,KAAK,EAAE,KAAK,CAAC,EACjBxB,EAAI,EACD,CAACwB,EAAE,OAAO,GAAKA,EAAE,MAAM,CAAC,IAAM,GACnCxB,IACAwB,EAAE,OAAO,CAAC,EAEZxM,EAAO,CAACwM,EAAE,OAAO,CAAC,EAElB,IAAIkD,EAAM,IAAInP,EAAG,CAAC,EAAE,MAAM,IAAI,EAC1BoP,EAAOD,EAAI,OAAO,EAIlBE,EAAO,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,EAC9BC,EAAI,KAAK,EAAE,UAAU,EAGzB,IAFAA,EAAI,IAAItP,EAAG,EAAIsP,EAAIA,CAAC,EAAE,MAAM,IAAI,EAEzB,KAAK,IAAIA,EAAGD,CAAI,EAAE,IAAID,CAAI,IAAM,GACrCE,EAAE,QAAQF,CAAI,EAOhB,QAJIpO,EAAI,KAAK,IAAIsO,EAAGrD,CAAC,EACjB9K,EAAI,KAAK,IAAI2C,EAAGmI,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EACnC1I,EAAI,KAAK,IAAIO,EAAGmI,CAAC,EACjBZ,EAAIZ,EACDlH,EAAE,IAAI4L,CAAG,IAAM,GAAG,CAEvB,QADIb,EAAM/K,EACD9C,GAAI,EAAG6N,EAAI,IAAIa,CAAG,IAAM,EAAG1O,KAClC6N,EAAMA,EAAI,OAAO,EAEnB7O,EAAOgB,GAAI4K,CAAC,EACZ,IAAIzH,EAAI,KAAK,IAAI5C,EAAG,IAAIhB,EAAG,CAAC,EAAE,OAAOqL,EAAI5K,GAAI,CAAC,CAAC,EAE/CU,EAAIA,EAAE,OAAOyC,CAAC,EACd5C,EAAI4C,EAAE,OAAO,EACbL,EAAIA,EAAE,OAAOvC,CAAC,EACdqK,EAAI5K,EACN,CAEA,OAAOU,CACT,EAEA8M,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,IAAIyL,EAAMzL,EAAE,OAAO,KAAK,CAAC,EACzB,OAAIyL,EAAI,WAAa,GACnBA,EAAI,SAAW,EACR,KAAK,KAAKA,CAAG,EAAE,OAAO,GAEtB,KAAK,KAAKA,CAAG,CAExB,EAEAtB,EAAI,UAAU,IAAM,SAAcnK,EAAGzD,EAAK,CACxC,GAAIA,EAAI,OAAO,EAAG,OAAO,IAAIL,EAAG,CAAC,EAAE,MAAM,IAAI,EAC7C,GAAIK,EAAI,KAAK,CAAC,IAAM,EAAG,OAAOyD,EAAE,MAAM,EAEtC,IAAI0L,EAAa,EACbC,EAAM,IAAI,MAAM,GAAKD,CAAU,EACnCC,EAAI,CAAC,EAAI,IAAIzP,EAAG,CAAC,EAAE,MAAM,IAAI,EAC7ByP,EAAI,CAAC,EAAI3L,EACT,QAASrD,EAAI,EAAGA,EAAIgP,EAAI,OAAQhP,IAC9BgP,EAAIhP,CAAC,EAAI,KAAK,IAAIgP,EAAIhP,EAAI,CAAC,EAAGqD,CAAC,EAGjC,IAAIX,EAAMsM,EAAI,CAAC,EACXC,EAAU,EACVC,EAAa,EACbnP,EAAQH,EAAI,UAAU,EAAI,GAK9B,IAJIG,IAAU,IACZA,EAAQ,IAGLC,EAAIJ,EAAI,OAAS,EAAGI,GAAK,EAAGA,IAAK,CAEpC,QADIqB,EAAOzB,EAAI,MAAMI,CAAC,EACbC,EAAIF,EAAQ,EAAGE,GAAK,EAAGA,IAAK,CACnC,IAAIgD,EAAO5B,GAAQpB,EAAK,EAKxB,GAJIyC,IAAQsM,EAAI,CAAC,IACftM,EAAM,KAAK,IAAIA,CAAG,GAGhBO,IAAQ,GAAKgM,IAAY,EAAG,CAC9BC,EAAa,EACb,QACF,CAEAD,IAAY,EACZA,GAAWhM,EACXiM,IACI,EAAAA,IAAeH,IAAe/O,IAAM,GAAKC,IAAM,MAEnDyC,EAAM,KAAK,IAAIA,EAAKsM,EAAIC,CAAO,CAAC,EAChCC,EAAa,EACbD,EAAU,EACZ,CACAlP,EAAQ,EACV,CAEA,OAAO2C,CACT,EAEA8K,EAAI,UAAU,UAAY,SAAoB5N,EAAK,CACjD,IAAIc,EAAId,EAAI,KAAK,KAAK,CAAC,EAEvB,OAAOc,IAAMd,EAAMc,EAAE,MAAM,EAAIA,CACjC,EAEA8M,EAAI,UAAU,YAAc,SAAsB5N,EAAK,CACrD,IAAI8C,EAAM9C,EAAI,MAAM,EACpB,OAAA8C,EAAI,IAAM,KACHA,CACT,EAMAnD,EAAG,KAAO,SAAeK,EAAK,CAC5B,OAAO,IAAIuP,GAAKvP,CAAG,CACrB,EAEA,SAASuP,GAAMvE,EAAG,CAChB4C,EAAI,KAAK,KAAM5C,CAAC,EAEhB,KAAK,MAAQ,KAAK,EAAE,UAAU,EAC1B,KAAK,MAAQ,KAAO,IACtB,KAAK,OAAS,GAAM,KAAK,MAAQ,IAGnC,KAAK,EAAI,IAAIrL,EAAG,CAAC,EAAE,OAAO,KAAK,KAAK,EACpC,KAAK,GAAK,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC,EAChC,KAAK,KAAO,KAAK,EAAE,OAAO,KAAK,CAAC,EAEhC,KAAK,KAAO,KAAK,KAAK,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,EACrD,KAAK,KAAO,KAAK,KAAK,KAAK,KAAK,CAAC,EACjC,KAAK,KAAO,KAAK,EAAE,IAAI,KAAK,IAAI,CAClC,CACAJ,EAASgQ,GAAM3B,CAAG,EAElB2B,GAAK,UAAU,UAAY,SAAoBvP,EAAK,CAClD,OAAO,KAAK,KAAKA,EAAI,MAAM,KAAK,KAAK,CAAC,CACxC,EAEAuP,GAAK,UAAU,YAAc,SAAsBvP,EAAK,CACtD,IAAIc,EAAI,KAAK,KAAKd,EAAI,IAAI,KAAK,IAAI,CAAC,EACpC,OAAAc,EAAE,IAAM,KACDA,CACT,EAEAyO,GAAK,UAAU,KAAO,SAAe9L,EAAGF,EAAG,CACzC,GAAIE,EAAE,OAAO,GAAKF,EAAE,OAAO,EACzB,OAAAE,EAAE,MAAM,CAAC,EAAI,EACbA,EAAE,OAAS,EACJA,EAGT,IAAIP,EAAIO,EAAE,KAAKF,CAAC,EACZ5C,EAAIuC,EAAE,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,EACpEsM,EAAItM,EAAE,KAAKvC,CAAC,EAAE,OAAO,KAAK,KAAK,EAC/BmC,EAAM0M,EAEV,OAAIA,EAAE,IAAI,KAAK,CAAC,GAAK,EACnB1M,EAAM0M,EAAE,KAAK,KAAK,CAAC,EACVA,EAAE,KAAK,CAAC,EAAI,IACrB1M,EAAM0M,EAAE,KAAK,KAAK,CAAC,GAGd1M,EAAI,UAAU,IAAI,CAC3B,EAEAyM,GAAK,UAAU,IAAM,SAAc9L,EAAGF,EAAG,CACvC,GAAIE,EAAE,OAAO,GAAKF,EAAE,OAAO,EAAG,OAAO,IAAI5D,EAAG,CAAC,EAAE,UAAU,IAAI,EAE7D,IAAIuD,EAAIO,EAAE,IAAIF,CAAC,EACX5C,EAAIuC,EAAE,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,EACpEsM,EAAItM,EAAE,KAAKvC,CAAC,EAAE,OAAO,KAAK,KAAK,EAC/BmC,EAAM0M,EACV,OAAIA,EAAE,IAAI,KAAK,CAAC,GAAK,EACnB1M,EAAM0M,EAAE,KAAK,KAAK,CAAC,EACVA,EAAE,KAAK,CAAC,EAAI,IACrB1M,EAAM0M,EAAE,KAAK,KAAK,CAAC,GAGd1M,EAAI,UAAU,IAAI,CAC3B,EAEAyM,GAAK,UAAU,KAAO,SAAe9L,EAAG,CAEtC,IAAIX,EAAM,KAAK,KAAKW,EAAE,OAAO,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC,EACjD,OAAOX,EAAI,UAAU,IAAI,CAC3B,CACF,GAAG,OAAO3D,GAAW,KAAeA,GAAQD,EAAI,IC39GhD,IAAAuQ,GAAA,GAAAC,GAAAD,GAAA,iBAAAE,GAAA,oBAAAC,GAAA,cAAAC,GAAA,aAAAC,EAAA,iBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,kBAAAC,GAAA,aAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,yBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,QAAAC,GAAA,eAAAC,GAAA,kBAAAC,GAAA,2BAAAC,GAAA,iBAAAC,EAAA,iBAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,YAAAC,GAAA,gBAAAC,GAAA,gBAAAC,GAAA,2BAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,qCAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,iBAAAC,GAAA,6BAAAC,GAAA,8BAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,4BAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,eAAAC,GAAA,kBAAAC,KAAA,eAAAC,GAAA/C,ICCA,IAAAgD,GAA2B,qCCA3B,IAAAC,GAAsD,qCAEzCC,GAA0B,CACrC,IAAK,UACL,aAAc,qBACd,cAAe,sBACf,UAAW,CACT,WAAY,qEACZ,aAAc,qEACd,QAAS,EACT,OAAQ,CACN,YAAa,qEACb,SAAU,qEACV,iBAAkB,qEAClB,aAAc,qEACd,aAAc,qEACd,YAAa,oEACf,CACF,EACA,YAAa,CACX,WAAY,qEACZ,aAAc,qEACd,QAAS,CACX,CACF,ECzBA,IAAAC,GAAuD,oCACvDC,GAiBO,qCClBP,IAAAC,GAA0B,qCAkBnB,IAAMC,GAAN,cAAwB,YAAU,CACvC,YAAYC,EAAiBC,EAA4BC,EAA+B,CACtF,MAAMF,EAASC,GAAc,eAAgBC,CAAO,CACtD,CAEA,OAAO,gBAAgBC,EAAQC,EAA8B,CAC3D,OAAO,KAAK,YAAuBD,EAAGC,CAAI,CAC5C,CACF,EAEaC,EAAc,CAACD,EAAqBE,EAAuBJ,IAAkC,CACxG,IAAMK,EAAe,CACnB,GAAGL,EACH,MAAOI,aAAiB,MAAQA,EAAM,MAAQ,MAChD,EAEA,MAAIA,aAAiB,MACb,IAAIP,GAAUO,EAAM,QAASF,EAAMG,CAAY,EAE/C,IAAIR,GAAUO,EAAOF,EAAMG,CAAY,CAEjD,ECvCA,IAAAC,EASO,qCAEPC,GAAe,SCGf,IAAIC,GAAY,KAIdC,GAAa,IAGbC,GAAW,mBAGXC,GAAO,qgCAGPC,GAAK,qgCAILC,GAAW,CAOT,UAAW,GAiBX,SAAU,EAeV,OAAQ,EAIR,SAAU,GAIV,SAAW,GAIX,KAAM,CAACL,GAIP,KAAMA,GAGN,OAAQ,EACV,EAMAM,GAASC,GACTC,EAAW,GAEXC,GAAe,kBACfC,GAAkBD,GAAe,qBACjCE,GAAyBF,GAAe,2BACxCG,GAAoBH,GAAe,qBACnCI,GAAM,mBAENC,GAAY,KAAK,MACjBC,GAAU,KAAK,IAEfC,GAAW,6CACXC,GAAQ,yDACRC,GAAU,gDACVC,GAAY,qCAEZC,GAAO,IACPC,EAAW,EACXC,GAAmB,iBAEnBC,GAAiBpB,GAAK,OAAS,EAC/BqB,GAAepB,GAAG,OAAS,EAG3BqB,EAAI,CAAE,YAAaZ,EAAI,EA0EzBY,EAAE,cAAgBA,EAAE,IAAM,UAAY,CACpC,IAAIC,EAAI,IAAI,KAAK,YAAY,IAAI,EACjC,OAAIA,EAAE,EAAI,IAAGA,EAAE,EAAI,GACZC,EAASD,CAAC,CACnB,EAQAD,EAAE,KAAO,UAAY,CACnB,OAAOE,EAAS,IAAI,KAAK,YAAY,IAAI,EAAG,KAAK,EAAI,EAAG,CAAC,CAC3D,EAWAF,EAAE,UAAYA,EAAE,MAAQ,SAAUG,EAAKC,EAAK,CAC1C,IAAIC,EACFJ,EAAI,KACJK,EAAOL,EAAE,YAGX,GAFAE,EAAM,IAAIG,EAAKH,CAAG,EAClBC,EAAM,IAAIE,EAAKF,CAAG,EACd,CAACD,EAAI,GAAK,CAACC,EAAI,EAAG,OAAO,IAAIE,EAAK,GAAG,EACzC,GAAIH,EAAI,GAAGC,CAAG,EAAG,MAAM,MAAMnB,GAAkBmB,CAAG,EAClD,OAAAC,EAAIJ,EAAE,IAAIE,CAAG,EACNE,EAAI,EAAIF,EAAMF,EAAE,IAAIG,CAAG,EAAI,EAAIA,EAAM,IAAIE,EAAKL,CAAC,CACxD,EAWAD,EAAE,WAAaA,EAAE,IAAM,SAAUO,EAAG,CAClC,IAAI,EAAGC,EAAGC,EAAKC,EACbT,EAAI,KACJU,EAAKV,EAAE,EACPW,GAAML,EAAI,IAAIN,EAAE,YAAYM,CAAC,GAAG,EAChCM,EAAKZ,EAAE,EACPa,EAAKP,EAAE,EAGT,GAAI,CAACI,GAAM,CAACC,EACV,MAAO,CAACC,GAAM,CAACC,EAAK,IAAMD,IAAOC,EAAKD,EAAKF,IAAOC,EAAK,EAAI,CAACD,EAAKE,EAAK,EAAI,EAAI,GAIhF,GAAI,CAACF,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAAG,OAAOD,EAAG,CAAC,EAAIE,EAAKD,EAAG,CAAC,EAAI,CAACE,EAAK,EAGxD,GAAID,IAAOC,EAAI,OAAOD,EAGtB,GAAIZ,EAAE,IAAMM,EAAE,EAAG,OAAON,EAAE,EAAIM,EAAE,EAAIM,EAAK,EAAI,EAAI,GAMjD,IAJAJ,EAAME,EAAG,OACTD,EAAME,EAAG,OAGJ,EAAI,EAAGJ,EAAIC,EAAMC,EAAMD,EAAMC,EAAK,EAAIF,EAAG,EAAE,EAC9C,GAAIG,EAAG,CAAC,IAAMC,EAAG,CAAC,EAAG,OAAOD,EAAG,CAAC,EAAIC,EAAG,CAAC,EAAIC,EAAK,EAAI,EAAI,GAI3D,OAAOJ,IAAQC,EAAM,EAAID,EAAMC,EAAMG,EAAK,EAAI,EAAI,EACpD,EAgBAb,EAAE,OAASA,EAAE,IAAM,UAAY,CAC7B,IAAIe,EAAIC,EACNf,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,EAGFA,EAAE,EAAE,CAAC,GAEVc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,KAAK,IAAId,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAIL,EAC9CU,EAAK,SAAW,EAEhBL,EAAIgB,GAAOX,EAAMY,GAAiBZ,EAAML,CAAC,CAAC,EAE1CK,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETd,EAASpB,IAAY,GAAKA,IAAY,EAAImB,EAAE,IAAI,EAAIA,EAAGc,EAAIC,EAAI,EAAI,GAZtD,IAAIV,EAAK,CAAC,EAHb,IAAIA,EAAK,GAAG,CAgB/B,EAmBAN,EAAE,SAAWA,EAAE,KAAO,UAAY,CAChC,IAAImB,EAAGC,EAAGC,EAAG,EAAGC,EAAK,EAAGC,EAAIC,EAAGC,EAAIC,EACjCzB,EAAI,KACJK,EAAOL,EAAE,YAEX,GAAI,CAACA,EAAE,SAAS,GAAKA,EAAE,OAAO,EAAG,OAAO,IAAIK,EAAKL,CAAC,EAoClD,IAnCAlB,EAAW,GAGX,EAAIkB,EAAE,EAAIX,GAAQW,EAAE,EAAIA,EAAG,EAAI,CAAC,EAI5B,CAAC,GAAK,KAAK,IAAI,CAAC,GAAK,KACvBoB,EAAIM,GAAe1B,EAAE,CAAC,EACtBkB,EAAIlB,EAAE,GAGF,GAAKkB,EAAIE,EAAE,OAAS,GAAK,KAAGA,GAAM,GAAK,GAAK,GAAK,GAAK,IAAM,MAChE,EAAI/B,GAAQ+B,EAAG,EAAI,CAAC,EAGpBF,EAAI9B,IAAW8B,EAAI,GAAK,CAAC,GAAKA,EAAI,IAAMA,EAAI,EAAI,GAAK,IAEjD,GAAK,IACPE,EAAI,KAAOF,GAEXE,EAAI,EAAE,cAAc,EACpBA,EAAIA,EAAE,MAAM,EAAGA,EAAE,QAAQ,GAAG,EAAI,CAAC,EAAIF,GAGvC,EAAI,IAAIb,EAAKe,CAAC,EACd,EAAE,EAAIpB,EAAE,GAER,EAAI,IAAIK,EAAK,EAAE,SAAS,CAAC,EAG3BiB,GAAMJ,EAAIb,EAAK,WAAa,IAW1B,GANAkB,EAAI,EACJC,EAAKD,EAAE,MAAMA,CAAC,EAAE,MAAMA,CAAC,EACvBE,EAAUD,EAAG,KAAKxB,CAAC,EACnB,EAAI2B,GAAOF,EAAQ,KAAKzB,CAAC,EAAE,MAAMuB,CAAC,EAAGE,EAAQ,KAAKD,CAAE,EAAGF,EAAK,EAAG,CAAC,EAG5DI,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGD,CAAE,KAAOF,EAAIM,GAAe,EAAE,CAAC,GAAG,MAAM,EAAGJ,CAAE,EAK5E,GAJAF,EAAIA,EAAE,MAAME,EAAK,EAAGA,EAAK,CAAC,EAItBF,GAAK,QAAU,CAACC,GAAOD,GAAK,OAAQ,CAItC,GAAI,CAACC,IACHpB,EAASsB,EAAGL,EAAI,EAAG,CAAC,EAEhBK,EAAE,MAAMA,CAAC,EAAE,MAAMA,CAAC,EAAE,GAAGvB,CAAC,GAAG,CAC7B,EAAIuB,EACJ,KACF,CAGFD,GAAM,EACND,EAAM,CACR,KAAO,EAID,CAAC,CAACD,GAAK,CAAC,CAACA,EAAE,MAAM,CAAC,GAAKA,EAAE,OAAO,CAAC,GAAK,OAGxCnB,EAAS,EAAGiB,EAAI,EAAG,CAAC,EACpBC,EAAI,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,GAAGnB,CAAC,GAG/B,KACF,CAIJ,OAAAlB,EAAW,GAEJmB,EAAS,EAAGiB,EAAGb,EAAK,SAAUc,CAAC,CACxC,EAOApB,EAAE,cAAgBA,EAAE,GAAK,UAAY,CACnC,IAAI6B,EACFC,EAAI,KAAK,EACTT,EAAI,IAEN,GAAIS,EAAG,CAML,GALAD,EAAIC,EAAE,OAAS,EACfT,GAAKQ,EAAIxC,GAAU,KAAK,EAAIO,CAAQ,GAAKA,EAGzCiC,EAAIC,EAAED,CAAC,EACHA,EAAG,KAAOA,EAAI,IAAM,EAAGA,GAAK,GAAIR,IAChCA,EAAI,IAAGA,EAAI,EACjB,CAEA,OAAOA,CACT,EAwBArB,EAAE,UAAYA,EAAE,IAAM,SAAUO,EAAG,CACjC,OAAOqB,GAAO,KAAM,IAAI,KAAK,YAAYrB,CAAC,CAAC,CAC7C,EAQAP,EAAE,mBAAqBA,EAAE,SAAW,SAAUO,EAAG,CAC/C,IAAIN,EAAI,KACNK,EAAOL,EAAE,YACX,OAAOC,EAAS0B,GAAO3B,EAAG,IAAIK,EAAKC,CAAC,EAAG,EAAG,EAAG,CAAC,EAAGD,EAAK,UAAWA,EAAK,QAAQ,CAChF,EAOAN,EAAE,OAASA,EAAE,GAAK,SAAUO,EAAG,CAC7B,OAAO,KAAK,IAAIA,CAAC,IAAM,CACzB,EAQAP,EAAE,MAAQ,UAAY,CACpB,OAAOE,EAAS,IAAI,KAAK,YAAY,IAAI,EAAG,KAAK,EAAI,EAAG,CAAC,CAC3D,EAQAF,EAAE,YAAcA,EAAE,GAAK,SAAUO,EAAG,CAClC,OAAO,KAAK,IAAIA,CAAC,EAAI,CACvB,EAQAP,EAAE,qBAAuBA,EAAE,IAAM,SAAUO,EAAG,CAC5C,IAAIF,EAAI,KAAK,IAAIE,CAAC,EAClB,OAAOF,GAAK,GAAKA,IAAM,CACzB,EA4BAL,EAAE,iBAAmBA,EAAE,KAAO,UAAY,CACxC,IAAIK,EAAGgB,EAAGN,EAAIC,EAAIe,EAChB9B,EAAI,KACJK,EAAOL,EAAE,YACT+B,EAAM,IAAI1B,EAAK,CAAC,EAElB,GAAI,CAACL,EAAE,SAAS,EAAG,OAAO,IAAIK,EAAKL,EAAE,EAAI,IAAQ,GAAG,EACpD,GAAIA,EAAE,OAAO,EAAG,OAAO+B,EAEvBjB,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,KAAK,IAAId,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAI,EAC9CK,EAAK,SAAW,EAChByB,EAAM9B,EAAE,EAAE,OAON8B,EAAM,IACR1B,EAAI,KAAK,KAAK0B,EAAM,CAAC,EACrBV,GAAK,EAAIY,GAAQ,EAAG5B,CAAC,GAAG,SAAS,IAEjCA,EAAI,GACJgB,EAAI,gCAGNpB,EAAIiC,GAAa5B,EAAM,EAAGL,EAAE,MAAMoB,CAAC,EAAG,IAAIf,EAAK,CAAC,EAAG,EAAI,EAMvD,QAHI6B,EACFC,EAAI/B,EACJgC,EAAK,IAAI/B,EAAK,CAAC,EACV8B,KACLD,EAAUlC,EAAE,MAAMA,CAAC,EACnBA,EAAI+B,EAAI,MAAMG,EAAQ,MAAME,EAAG,MAAMF,EAAQ,MAAME,CAAE,CAAC,CAAC,CAAC,EAG1D,OAAOnC,EAASD,EAAGK,EAAK,UAAYS,EAAIT,EAAK,SAAWU,EAAI,EAAI,CAClE,EAiCAhB,EAAE,eAAiBA,EAAE,KAAO,UAAY,CACtC,IAAIK,EAAGU,EAAIC,EAAIe,EACb9B,EAAI,KACJK,EAAOL,EAAE,YAEX,GAAI,CAACA,EAAE,SAAS,GAAKA,EAAE,OAAO,EAAG,OAAO,IAAIK,EAAKL,CAAC,EAQlD,GANAc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,KAAK,IAAId,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAI,EAC9CK,EAAK,SAAW,EAChByB,EAAM9B,EAAE,EAAE,OAEN8B,EAAM,EACR9B,EAAIiC,GAAa5B,EAAM,EAAGL,EAAGA,EAAG,EAAI,MAC/B,CAWLI,EAAI,IAAM,KAAK,KAAK0B,CAAG,EACvB1B,EAAIA,EAAI,GAAK,GAAKA,EAAI,EAEtBJ,EAAIA,EAAE,MAAM,EAAIgC,GAAQ,EAAG5B,CAAC,CAAC,EAC7BJ,EAAIiC,GAAa5B,EAAM,EAAGL,EAAGA,EAAG,EAAI,EAOpC,QAJIqC,EACFC,EAAK,IAAIjC,EAAK,CAAC,EACfkC,EAAM,IAAIlC,EAAK,EAAE,EACjBmC,EAAM,IAAInC,EAAK,EAAE,EACZD,KACLiC,EAAUrC,EAAE,MAAMA,CAAC,EACnBA,EAAIA,EAAE,MAAMsC,EAAG,KAAKD,EAAQ,MAAME,EAAI,MAAMF,CAAO,EAAE,KAAKG,CAAG,CAAC,CAAC,CAAC,CAEpE,CAEA,OAAAnC,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETd,EAASD,EAAGc,EAAIC,EAAI,EAAI,CACjC,EAmBAhB,EAAE,kBAAoBA,EAAE,KAAO,UAAY,CACzC,IAAIe,EAAIC,EACNf,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,EACtBT,EAAK,SAAW,EAETsB,GAAO3B,EAAE,KAAK,EAAGA,EAAE,KAAK,EAAGK,EAAK,UAAYS,EAAIT,EAAK,SAAWU,CAAE,GAR/C,IAAIV,EAAKL,EAAE,CAAC,CASxC,EAsBAD,EAAE,cAAgBA,EAAE,KAAO,UAAY,CACrC,IAAIC,EAAI,KACNK,EAAOL,EAAE,YACTI,EAAIJ,EAAE,IAAI,EAAE,IAAI,CAAC,EACjBc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SAEZ,OAAID,IAAM,GACDA,IAAM,EAETJ,EAAE,MAAM,EAAIyC,GAAMpC,EAAMS,EAAIC,CAAE,EAAI,IAAIV,EAAK,CAAC,EAE5C,IAAIA,EAAK,GAAG,EAGdL,EAAE,OAAO,EAAUyC,GAAMpC,EAAMS,EAAK,EAAGC,CAAE,EAAE,MAAM,EAAG,GAIxDV,EAAK,UAAYS,EAAK,EACtBT,EAAK,SAAW,EAGhBL,EAAI,IAAIK,EAAK,CAAC,EAAE,MAAML,CAAC,EAAE,IAAIA,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAEpDK,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETf,EAAE,MAAM,CAAC,EAClB,EAsBAD,EAAE,wBAA0BA,EAAE,MAAQ,UAAY,CAChD,IAAIe,EAAIC,EACNf,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIA,EAAE,IAAI,CAAC,EAAU,IAAIK,EAAKL,EAAE,GAAG,CAAC,EAAI,EAAI,GAAG,EAC1CA,EAAE,SAAS,GAEhBc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,KAAK,IAAI,KAAK,IAAId,EAAE,CAAC,EAAGA,EAAE,GAAG,CAAC,EAAI,EACxDK,EAAK,SAAW,EAChBvB,EAAW,GAEXkB,EAAIA,EAAE,MAAMA,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAKA,CAAC,EAErClB,EAAW,GACXuB,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETf,EAAE,GAAG,GAdc,IAAIK,EAAKL,CAAC,CAetC,EAmBAD,EAAE,sBAAwBA,EAAE,MAAQ,UAAY,CAC9C,IAAIe,EAAIC,EACNf,EAAI,KACJK,EAAOL,EAAE,YAEX,MAAI,CAACA,EAAE,SAAS,GAAKA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAElDc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,EAAI,KAAK,IAAI,KAAK,IAAId,EAAE,CAAC,EAAGA,EAAE,GAAG,CAAC,EAAI,EAC5DK,EAAK,SAAW,EAChBvB,EAAW,GAEXkB,EAAIA,EAAE,MAAMA,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAKA,CAAC,EAEpClB,EAAW,GACXuB,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETf,EAAE,GAAG,EACd,EAsBAD,EAAE,yBAA2BA,EAAE,MAAQ,UAAY,CACjD,IAAIe,EAAIC,EAAI2B,EAAKC,EACf3C,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,GAAK,EAAU,IAAIK,EAAKL,EAAE,IAAI,EAAE,GAAG,CAAC,EAAIA,EAAE,EAAI,EAAIA,EAAE,OAAO,EAAIA,EAAI,GAAG,GAE5Ec,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVsC,EAAM3C,EAAE,GAAG,EAEP,KAAK,IAAI2C,EAAK7B,CAAE,EAAI,EAAI,CAACd,EAAE,EAAI,EAAUC,EAAS,IAAII,EAAKL,CAAC,EAAGc,EAAIC,EAAI,EAAI,GAE/EV,EAAK,UAAYqC,EAAMC,EAAM3C,EAAE,EAE/BA,EAAI2B,GAAO3B,EAAE,KAAK,CAAC,EAAG,IAAIK,EAAK,CAAC,EAAE,MAAML,CAAC,EAAG0C,EAAM5B,EAAI,CAAC,EAEvDT,EAAK,UAAYS,EAAK,EACtBT,EAAK,SAAW,EAEhBL,EAAIA,EAAE,GAAG,EAETK,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETf,EAAE,MAAM,EAAG,IArBQ,IAAIK,EAAK,GAAG,CAsBxC,EAwBAN,EAAE,YAAcA,EAAE,KAAO,UAAY,CACnC,IAAI6C,EAAQxC,EACVU,EAAIC,EACJf,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCI,EAAIJ,EAAE,IAAI,EAAE,IAAI,CAAC,EACjBc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SAEND,IAAM,GAGJA,IAAM,GACRwC,EAASH,GAAMpC,EAAMS,EAAK,EAAGC,CAAE,EAAE,MAAM,EAAG,EAC1C6B,EAAO,EAAI5C,EAAE,EACN4C,GAIF,IAAIvC,EAAK,GAAG,GAKrBA,EAAK,UAAYS,EAAK,EACtBT,EAAK,SAAW,EAEhBL,EAAIA,EAAE,IAAI,IAAIK,EAAK,CAAC,EAAE,MAAML,EAAE,MAAMA,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAE7DK,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETf,EAAE,MAAM,CAAC,GAClB,EAqBAD,EAAE,eAAiBA,EAAE,KAAO,UAAY,CACtC,IAAIoC,EAAG5B,EAAGH,EAAGgB,EAAGyB,EAAItB,EAAGuB,EAAGJ,EAAKK,EAC7B/C,EAAI,KACJK,EAAOL,EAAE,YACTc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SAEZ,GAAKL,EAAE,SAAS,EAOT,IAAIA,EAAE,OAAO,EAClB,OAAO,IAAIK,EAAKL,CAAC,EACZ,GAAIA,EAAE,IAAI,EAAE,GAAG,CAAC,GAAKc,EAAK,GAAKhB,GACpC,OAAAgD,EAAIL,GAAMpC,EAAMS,EAAK,EAAGC,CAAE,EAAE,MAAM,GAAI,EACtC+B,EAAE,EAAI9C,EAAE,EACD8C,MAZU,CACjB,GAAI,CAAC9C,EAAE,EAAG,OAAO,IAAIK,EAAK,GAAG,EAC7B,GAAIS,EAAK,GAAKhB,GACZ,OAAAgD,EAAIL,GAAMpC,EAAMS,EAAK,EAAGC,CAAE,EAAE,MAAM,EAAG,EACrC+B,EAAE,EAAI9C,EAAE,EACD8C,CAEX,CAmBA,IAXAzC,EAAK,UAAYqC,EAAM5B,EAAK,GAC5BT,EAAK,SAAW,EAQhBD,EAAI,KAAK,IAAI,GAAIsC,EAAM/C,EAAW,EAAI,CAAC,EAElCwC,EAAI/B,EAAG+B,EAAG,EAAEA,EAAGnC,EAAIA,EAAE,IAAIA,EAAE,MAAMA,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAW/D,IATAlB,EAAW,GAEXyB,EAAI,KAAK,KAAKmC,EAAM/C,CAAQ,EAC5ByB,EAAI,EACJ2B,EAAK/C,EAAE,MAAMA,CAAC,EACd8C,EAAI,IAAIzC,EAAKL,CAAC,EACd6C,EAAK7C,EAGEmC,IAAM,IAOX,GANAU,EAAKA,EAAG,MAAME,CAAE,EAChBxB,EAAIuB,EAAE,MAAMD,EAAG,IAAIzB,GAAK,CAAC,CAAC,EAE1ByB,EAAKA,EAAG,MAAME,CAAE,EAChBD,EAAIvB,EAAE,KAAKsB,EAAG,IAAIzB,GAAK,CAAC,CAAC,EAErB0B,EAAE,EAAEvC,CAAC,IAAM,OAAQ,IAAK4B,EAAI5B,EAAGuC,EAAE,EAAEX,CAAC,IAAMZ,EAAE,EAAEY,CAAC,GAAKA,KAAK,CAG/D,OAAI/B,IAAG0C,EAAIA,EAAE,MAAM,GAAM1C,EAAI,CAAE,GAE/BtB,EAAW,GAEJmB,EAAS6C,EAAGzC,EAAK,UAAYS,EAAIT,EAAK,SAAWU,EAAI,EAAI,CAClE,EAOAhB,EAAE,SAAW,UAAY,CACvB,MAAO,CAAC,CAAC,KAAK,CAChB,EAOAA,EAAE,UAAYA,EAAE,MAAQ,UAAY,CAClC,MAAO,CAAC,CAAC,KAAK,GAAKX,GAAU,KAAK,EAAIO,CAAQ,EAAI,KAAK,EAAE,OAAS,CACpE,EAOAI,EAAE,MAAQ,UAAY,CACpB,MAAO,CAAC,KAAK,CACf,EAOAA,EAAE,WAAaA,EAAE,MAAQ,UAAY,CACnC,OAAO,KAAK,EAAI,CAClB,EAOAA,EAAE,WAAaA,EAAE,MAAQ,UAAY,CACnC,OAAO,KAAK,EAAI,CAClB,EAOAA,EAAE,OAAS,UAAY,CACrB,MAAO,CAAC,CAAC,KAAK,GAAK,KAAK,EAAE,CAAC,IAAM,CACnC,EAOAA,EAAE,SAAWA,EAAE,GAAK,SAAUO,EAAG,CAC/B,OAAO,KAAK,IAAIA,CAAC,EAAI,CACvB,EAOAP,EAAE,kBAAoBA,EAAE,IAAM,SAAUO,EAAG,CACzC,OAAO,KAAK,IAAIA,CAAC,EAAI,CACvB,EAiCAP,EAAE,UAAYA,EAAE,IAAM,SAAUiD,EAAM,CACpC,IAAIC,EAAUpB,EAAGqB,EAAa9C,EAAG+C,EAAKC,EAAK9B,EAAIwB,EAC7CO,EAAM,KACNhD,EAAOgD,EAAI,YACXvC,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACViD,EAAQ,EAGV,GAAIN,GAAQ,KACVA,EAAO,IAAI3C,EAAK,EAAE,EAClB4C,EAAW,OACN,CAKL,GAJAD,EAAO,IAAI3C,EAAK2C,CAAI,EACpBnB,EAAImB,EAAK,EAGLA,EAAK,EAAI,GAAK,CAACnB,GAAK,CAACA,EAAE,CAAC,GAAKmB,EAAK,GAAG,CAAC,EAAG,OAAO,IAAI3C,EAAK,GAAG,EAEhE4C,EAAWD,EAAK,GAAG,EAAE,CACvB,CAKA,GAHAnB,EAAIwB,EAAI,EAGJA,EAAI,EAAI,GAAK,CAACxB,GAAK,CAACA,EAAE,CAAC,GAAKwB,EAAI,GAAG,CAAC,EACtC,OAAO,IAAIhD,EAAKwB,GAAK,CAACA,EAAE,CAAC,EAAI,KAASwB,EAAI,GAAK,EAAI,IAAMxB,EAAI,EAAI,GAAK,EAKxE,GAAIoB,EACF,GAAIpB,EAAE,OAAS,EACbsB,EAAM,OACD,CACL,IAAK/C,EAAIyB,EAAE,CAAC,EAAGzB,EAAI,KAAO,GAAIA,GAAK,GACnC+C,EAAM/C,IAAM,CACd,CAyBF,GAtBAtB,EAAW,GACXwC,EAAKR,EAAKwC,EACVF,EAAMG,GAAiBF,EAAK/B,CAAE,EAC9B4B,EAAcD,EAAWO,GAAQnD,EAAMiB,EAAK,EAAE,EAAIiC,GAAiBP,EAAM1B,CAAE,EAG3EwB,EAAInB,GAAOyB,EAAKF,EAAa5B,EAAI,CAAC,EAgB9BmC,GAAoBX,EAAE,EAAG1C,EAAIU,EAAIC,CAAE,EAErC,EAME,IALAO,GAAM,GACN8B,EAAMG,GAAiBF,EAAK/B,CAAE,EAC9B4B,EAAcD,EAAWO,GAAQnD,EAAMiB,EAAK,EAAE,EAAIiC,GAAiBP,EAAM1B,CAAE,EAC3EwB,EAAInB,GAAOyB,EAAKF,EAAa5B,EAAI,CAAC,EAE9B,CAAC6B,EAAK,CAGJ,CAACzB,GAAeoB,EAAE,CAAC,EAAE,MAAM1C,EAAI,EAAGA,EAAI,EAAE,EAAI,GAAK,OACnD0C,EAAI7C,EAAS6C,EAAGhC,EAAK,EAAG,CAAC,GAG3B,KACF,OACO2C,GAAoBX,EAAE,EAAG1C,GAAK,GAAIW,CAAE,GAG/C,OAAAjC,EAAW,GAEJmB,EAAS6C,EAAGhC,EAAIC,CAAE,CAC3B,EAgDAhB,EAAE,MAAQA,EAAE,IAAM,SAAUO,EAAG,CAC7B,IAAIuB,EAAGX,EAAGiB,EAAG5B,EAAGH,EAAG0B,EAAKhB,EAAIC,EAAIL,EAAIgD,EAAIC,EAAMhD,EAC5CX,EAAI,KACJK,EAAOL,EAAE,YAKX,GAHAM,EAAI,IAAID,EAAKC,CAAC,EAGV,CAACN,EAAE,GAAK,CAACM,EAAE,EAGb,MAAI,CAACN,EAAE,GAAK,CAACM,EAAE,EAAGA,EAAI,IAAID,EAAK,GAAG,EAGzBL,EAAE,EAAGM,EAAE,EAAI,CAACA,EAAE,EAKlBA,EAAI,IAAID,EAAKC,EAAE,GAAKN,EAAE,IAAMM,EAAE,EAAIN,EAAI,GAAG,EAEvCM,EAIT,GAAIN,EAAE,GAAKM,EAAE,EACX,OAAAA,EAAE,EAAI,CAACA,EAAE,EACFN,EAAE,KAAKM,CAAC,EASjB,GANAI,EAAKV,EAAE,EACPW,EAAKL,EAAE,EACPQ,EAAKT,EAAK,UACVU,EAAKV,EAAK,SAGN,CAACK,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAAG,CAGpB,GAAIA,EAAG,CAAC,EAAGL,EAAE,EAAI,CAACA,EAAE,UAGXI,EAAG,CAAC,EAAGJ,EAAI,IAAID,EAAKL,CAAC,MAIzB,QAAO,IAAIK,EAAKU,IAAO,EAAI,GAAK,CAAC,EAEtC,OAAOjC,EAAWmB,EAASK,EAAGQ,EAAIC,CAAE,EAAIT,CAC1C,CAYA,GAPAY,EAAI9B,GAAUkB,EAAE,EAAIX,CAAQ,EAC5B+D,EAAKtE,GAAUY,EAAE,EAAIL,CAAQ,EAE7Be,EAAKA,EAAG,MAAM,EACdN,EAAIsD,EAAKxC,EAGLd,EAAG,CAyBL,IAxBAuD,EAAOvD,EAAI,EAEPuD,GACF9B,EAAInB,EACJN,EAAI,CAACA,EACL0B,EAAMnB,EAAG,SAETkB,EAAIlB,EACJO,EAAIwC,EACJ5B,EAAMpB,EAAG,QAMXyB,EAAI,KAAK,IAAI,KAAK,KAAKrB,EAAKnB,CAAQ,EAAGmC,CAAG,EAAI,EAE1C1B,EAAI+B,IACN/B,EAAI+B,EACJN,EAAE,OAAS,GAIbA,EAAE,QAAQ,EACLM,EAAI/B,EAAG+B,KAAMN,EAAE,KAAK,CAAC,EAC1BA,EAAE,QAAQ,CAGZ,KAAO,CASL,IALAM,EAAIzB,EAAG,OACPoB,EAAMnB,EAAG,OACTgD,EAAOxB,EAAIL,EACP6B,IAAM7B,EAAMK,GAEXA,EAAI,EAAGA,EAAIL,EAAKK,IACnB,GAAIzB,EAAGyB,CAAC,GAAKxB,EAAGwB,CAAC,EAAG,CAClBwB,EAAOjD,EAAGyB,CAAC,EAAIxB,EAAGwB,CAAC,EACnB,KACF,CAGF/B,EAAI,CACN,CAaA,IAXIuD,IACF9B,EAAInB,EACJA,EAAKC,EACLA,EAAKkB,EACLvB,EAAE,EAAI,CAACA,EAAE,GAGXwB,EAAMpB,EAAG,OAIJyB,EAAIxB,EAAG,OAASmB,EAAKK,EAAI,EAAG,EAAEA,EAAGzB,EAAGoB,GAAK,EAAI,EAGlD,IAAKK,EAAIxB,EAAG,OAAQwB,EAAI/B,GAAI,CAE1B,GAAIM,EAAG,EAAEyB,CAAC,EAAIxB,EAAGwB,CAAC,EAAG,CACnB,IAAK5B,EAAI4B,EAAG5B,GAAKG,EAAG,EAAEH,CAAC,IAAM,GAAIG,EAAGH,CAAC,EAAIb,GAAO,EAChD,EAAEgB,EAAGH,CAAC,EACNG,EAAGyB,CAAC,GAAKzC,EACX,CAEAgB,EAAGyB,CAAC,GAAKxB,EAAGwB,CAAC,CACf,CAGA,KAAOzB,EAAG,EAAEoB,CAAG,IAAM,GAAIpB,EAAG,IAAI,EAGhC,KAAOA,EAAG,CAAC,IAAM,EAAGA,EAAG,MAAM,EAAG,EAAEQ,EAGlC,OAAKR,EAAG,CAAC,GAETJ,EAAE,EAAII,EACNJ,EAAE,EAAIsD,GAAkBlD,EAAIQ,CAAC,EAEtBpC,EAAWmB,EAASK,EAAGQ,EAAIC,CAAE,EAAIT,GALrB,IAAID,EAAKU,IAAO,EAAI,GAAK,CAAC,CAM/C,EA2BAhB,EAAE,OAASA,EAAE,IAAM,SAAUO,EAAG,CAC9B,IAAIuD,EACF7D,EAAI,KACJK,EAAOL,EAAE,YAKX,OAHAM,EAAI,IAAID,EAAKC,CAAC,EAGV,CAACN,EAAE,GAAK,CAACM,EAAE,GAAKA,EAAE,GAAK,CAACA,EAAE,EAAE,CAAC,EAAU,IAAID,EAAK,GAAG,EAGnD,CAACC,EAAE,GAAKN,EAAE,GAAK,CAACA,EAAE,EAAE,CAAC,EAChBC,EAAS,IAAII,EAAKL,CAAC,EAAGK,EAAK,UAAWA,EAAK,QAAQ,GAI5DvB,EAAW,GAEPuB,EAAK,QAAU,GAIjBwD,EAAIlC,GAAO3B,EAAGM,EAAE,IAAI,EAAG,EAAG,EAAG,CAAC,EAC9BuD,EAAE,GAAKvD,EAAE,GAETuD,EAAIlC,GAAO3B,EAAGM,EAAG,EAAGD,EAAK,OAAQ,CAAC,EAGpCwD,EAAIA,EAAE,MAAMvD,CAAC,EAEbxB,EAAW,GAEJkB,EAAE,MAAM6D,CAAC,EAClB,EASA9D,EAAE,mBAAqBA,EAAE,IAAM,UAAY,CACzC,OAAO+D,GAAmB,IAAI,CAChC,EAQA/D,EAAE,iBAAmBA,EAAE,GAAK,UAAY,CACtC,OAAOwD,GAAiB,IAAI,CAC9B,EAQAxD,EAAE,QAAUA,EAAE,IAAM,UAAY,CAC9B,IAAIC,EAAI,IAAI,KAAK,YAAY,IAAI,EACjC,OAAAA,EAAE,EAAI,CAACA,EAAE,EACFC,EAASD,CAAC,CACnB,EAwBAD,EAAE,KAAOA,EAAE,IAAM,SAAUO,EAAG,CAC5B,IAAIyD,EAAOlC,EAAGX,EAAGiB,EAAG/B,EAAG0B,EAAKhB,EAAIC,EAAIL,EAAIC,EACtCX,EAAI,KACJK,EAAOL,EAAE,YAKX,GAHAM,EAAI,IAAID,EAAKC,CAAC,EAGV,CAACN,EAAE,GAAK,CAACM,EAAE,EAGb,MAAI,CAACN,EAAE,GAAK,CAACM,EAAE,EAAGA,EAAI,IAAID,EAAK,GAAG,EAMxBL,EAAE,IAAGM,EAAI,IAAID,EAAKC,EAAE,GAAKN,EAAE,IAAMM,EAAE,EAAIN,EAAI,GAAG,GAEjDM,EAIT,GAAIN,EAAE,GAAKM,EAAE,EACX,OAAAA,EAAE,EAAI,CAACA,EAAE,EACFN,EAAE,MAAMM,CAAC,EASlB,GANAI,EAAKV,EAAE,EACPW,EAAKL,EAAE,EACPQ,EAAKT,EAAK,UACVU,EAAKV,EAAK,SAGN,CAACK,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAIjB,OAAKA,EAAG,CAAC,IAAGL,EAAI,IAAID,EAAKL,CAAC,GAEnBlB,EAAWmB,EAASK,EAAGQ,EAAIC,CAAE,EAAIT,EAa1C,GAPAF,EAAIhB,GAAUY,EAAE,EAAIL,CAAQ,EAC5BuB,EAAI9B,GAAUkB,EAAE,EAAIX,CAAQ,EAE5Be,EAAKA,EAAG,MAAM,EACdyB,EAAI/B,EAAIc,EAGJiB,EAAG,CAuBL,IArBIA,EAAI,GACNN,EAAInB,EACJyB,EAAI,CAACA,EACLL,EAAMnB,EAAG,SAETkB,EAAIlB,EACJO,EAAId,EACJ0B,EAAMpB,EAAG,QAIXN,EAAI,KAAK,KAAKU,EAAKnB,CAAQ,EAC3BmC,EAAM1B,EAAI0B,EAAM1B,EAAI,EAAI0B,EAAM,EAE1BK,EAAIL,IACNK,EAAIL,EACJD,EAAE,OAAS,GAIbA,EAAE,QAAQ,EACHM,KAAMN,EAAE,KAAK,CAAC,EACrBA,EAAE,QAAQ,CACZ,CAcA,IAZAC,EAAMpB,EAAG,OACTyB,EAAIxB,EAAG,OAGHmB,EAAMK,EAAI,IACZA,EAAIL,EACJD,EAAIlB,EACJA,EAAKD,EACLA,EAAKmB,GAIFkC,EAAQ,EAAG5B,GACd4B,GAASrD,EAAG,EAAEyB,CAAC,EAAIzB,EAAGyB,CAAC,EAAIxB,EAAGwB,CAAC,EAAI4B,GAASrE,GAAO,EACnDgB,EAAGyB,CAAC,GAAKzC,GAUX,IAPIqE,IACFrD,EAAG,QAAQqD,CAAK,EAChB,EAAE7C,GAKCY,EAAMpB,EAAG,OAAQA,EAAG,EAAEoB,CAAG,GAAK,GAAIpB,EAAG,IAAI,EAE9C,OAAAJ,EAAE,EAAII,EACNJ,EAAE,EAAIsD,GAAkBlD,EAAIQ,CAAC,EAEtBpC,EAAWmB,EAASK,EAAGQ,EAAIC,CAAE,EAAIT,CAC1C,EASAP,EAAE,UAAYA,EAAE,GAAK,SAAUiE,EAAG,CAChC,IAAI5D,EACFJ,EAAI,KAEN,GAAIgE,IAAM,QAAUA,IAAM,CAAC,CAACA,GAAKA,IAAM,GAAKA,IAAM,EAAG,MAAM,MAAMhF,GAAkBgF,CAAC,EAEpF,OAAIhE,EAAE,GACJI,EAAI6D,GAAajE,EAAE,CAAC,EAChBgE,GAAKhE,EAAE,EAAI,EAAII,IAAGA,EAAIJ,EAAE,EAAI,IAEhCI,EAAI,IAGCA,CACT,EAQAL,EAAE,MAAQ,UAAY,CACpB,IAAIC,EAAI,KACNK,EAAOL,EAAE,YAEX,OAAOC,EAAS,IAAII,EAAKL,CAAC,EAAGA,EAAE,EAAI,EAAGK,EAAK,QAAQ,CACrD,EAkBAN,EAAE,KAAOA,EAAE,IAAM,UAAY,CAC3B,IAAIe,EAAIC,EACNf,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,KAAK,IAAId,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAIL,EAC9CU,EAAK,SAAW,EAEhBL,EAAIkE,GAAK7D,EAAMY,GAAiBZ,EAAML,CAAC,CAAC,EAExCK,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETd,EAASpB,GAAW,EAAImB,EAAE,IAAI,EAAIA,EAAGc,EAAIC,EAAI,EAAI,GAb9B,IAAIV,EAAK,GAAG,CAcxC,EAeAN,EAAE,WAAaA,EAAE,KAAO,UAAY,CAClC,IAAIoB,EAAGC,EAAGE,EAAI,EAAGD,EAAKE,EACpBvB,EAAI,KACJ,EAAIA,EAAE,EACNkB,EAAIlB,EAAE,EACNmE,EAAInE,EAAE,EACNK,EAAOL,EAAE,YAGX,GAAImE,IAAM,GAAK,CAAC,GAAK,CAAC,EAAE,CAAC,EACvB,OAAO,IAAI9D,EAAK,CAAC8D,GAAKA,EAAI,IAAM,CAAC,GAAK,EAAE,CAAC,GAAK,IAAM,EAAInE,EAAI,GAAK,EAgCnE,IA7BAlB,EAAW,GAGXqF,EAAI,KAAK,KAAK,CAACnE,CAAC,EAIZmE,GAAK,GAAKA,GAAK,KACjB/C,EAAIM,GAAe,CAAC,GAEfN,EAAE,OAASF,GAAK,GAAK,IAAGE,GAAK,KAClC+C,EAAI,KAAK,KAAK/C,CAAC,EACfF,EAAI9B,IAAW8B,EAAI,GAAK,CAAC,GAAKA,EAAI,GAAKA,EAAI,GAEvCiD,GAAK,IACP/C,EAAI,KAAOF,GAEXE,EAAI+C,EAAE,cAAc,EACpB/C,EAAIA,EAAE,MAAM,EAAGA,EAAE,QAAQ,GAAG,EAAI,CAAC,EAAIF,GAGvC,EAAI,IAAIb,EAAKe,CAAC,GAEd,EAAI,IAAIf,EAAK8D,EAAE,SAAS,CAAC,EAG3B7C,GAAMJ,EAAIb,EAAK,WAAa,IAQ1B,GAJAkB,EAAI,EACJ,EAAIA,EAAE,KAAKI,GAAO3B,EAAGuB,EAAGD,EAAK,EAAG,CAAC,CAAC,EAAE,MAAM,EAAG,EAGzCI,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGD,CAAE,KAAOF,EAAIM,GAAe,EAAE,CAAC,GAAG,MAAM,EAAGJ,CAAE,EAK5E,GAJAF,EAAIA,EAAE,MAAME,EAAK,EAAGA,EAAK,CAAC,EAItBF,GAAK,QAAU,CAACC,GAAOD,GAAK,OAAQ,CAItC,GAAI,CAACC,IACHpB,EAASsB,EAAGL,EAAI,EAAG,CAAC,EAEhBK,EAAE,MAAMA,CAAC,EAAE,GAAGvB,CAAC,GAAG,CACpB,EAAIuB,EACJ,KACF,CAGFD,GAAM,EACND,EAAM,CACR,KAAO,EAID,CAAC,CAACD,GAAK,CAAC,CAACA,EAAE,MAAM,CAAC,GAAKA,EAAE,OAAO,CAAC,GAAK,OAGxCnB,EAAS,EAAGiB,EAAI,EAAG,CAAC,EACpBC,EAAI,CAAC,EAAE,MAAM,CAAC,EAAE,GAAGnB,CAAC,GAGtB,KACF,CAIJ,OAAAlB,EAAW,GAEJmB,EAAS,EAAGiB,EAAGb,EAAK,SAAUc,CAAC,CACxC,EAgBApB,EAAE,QAAUA,EAAE,IAAM,UAAY,CAC9B,IAAIe,EAAIC,EACNf,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SACVA,EAAK,UAAYS,EAAK,GACtBT,EAAK,SAAW,EAEhBL,EAAIA,EAAE,IAAI,EACVA,EAAE,EAAI,EACNA,EAAI2B,GAAO3B,EAAG,IAAIK,EAAK,CAAC,EAAE,MAAML,EAAE,MAAMA,CAAC,CAAC,EAAE,KAAK,EAAGc,EAAK,GAAI,CAAC,EAE9DT,EAAK,UAAYS,EACjBT,EAAK,SAAWU,EAETd,EAASpB,IAAY,GAAKA,IAAY,EAAImB,EAAE,IAAI,EAAIA,EAAGc,EAAIC,EAAI,EAAI,GAfhD,IAAIV,EAAK,GAAG,CAgBxC,EAwBAN,EAAE,MAAQA,EAAE,IAAM,SAAUO,EAAG,CAC7B,IAAIyD,EAAO7C,EAAGiB,EAAG/B,EAAG0C,EAAGsB,EAAI7C,EAAGf,EAAKC,EACjCT,EAAI,KACJK,EAAOL,EAAE,YACTU,EAAKV,EAAE,EACPW,GAAML,EAAI,IAAID,EAAKC,CAAC,GAAG,EAKzB,GAHAA,EAAE,GAAKN,EAAE,EAGL,CAACU,GAAM,CAACA,EAAG,CAAC,GAAK,CAACC,GAAM,CAACA,EAAG,CAAC,EAE/B,OAAO,IAAIN,EAAK,CAACC,EAAE,GAAKI,GAAM,CAACA,EAAG,CAAC,GAAK,CAACC,GAAMA,GAAM,CAACA,EAAG,CAAC,GAAK,CAACD,EAI5D,IAIA,CAACA,GAAM,CAACC,EAAKL,EAAE,EAAI,EAAIA,EAAE,EAAI,CAAC,EAoBpC,IAjBAY,EAAI9B,GAAUY,EAAE,EAAIL,CAAQ,EAAIP,GAAUkB,EAAE,EAAIX,CAAQ,EACxDa,EAAME,EAAG,OACTD,EAAME,EAAG,OAGLH,EAAMC,IACRqC,EAAIpC,EACJA,EAAKC,EACLA,EAAKmC,EACLsB,EAAK5D,EACLA,EAAMC,EACNA,EAAM2D,GAIRtB,EAAI,CAAC,EACLsB,EAAK5D,EAAMC,EACN0B,EAAIiC,EAAIjC,KAAMW,EAAE,KAAK,CAAC,EAG3B,IAAKX,EAAI1B,EAAK,EAAE0B,GAAK,GAAI,CAEvB,IADA4B,EAAQ,EACH3D,EAAII,EAAM2B,EAAG/B,EAAI+B,GACpBZ,EAAIuB,EAAE1C,CAAC,EAAIO,EAAGwB,CAAC,EAAIzB,EAAGN,EAAI+B,EAAI,CAAC,EAAI4B,EACnCjB,EAAE1C,GAAG,EAAImB,EAAI7B,GAAO,EACpBqE,EAAQxC,EAAI7B,GAAO,EAGrBoD,EAAE1C,CAAC,GAAK0C,EAAE1C,CAAC,EAAI2D,GAASrE,GAAO,CACjC,CAGA,KAAO,CAACoD,EAAE,EAAEsB,CAAE,GAAItB,EAAE,IAAI,EAExB,OAAIiB,EAAO,EAAE7C,EACR4B,EAAE,MAAM,EAEbxC,EAAE,EAAIwC,EACNxC,EAAE,EAAIsD,GAAkBd,EAAG5B,CAAC,EAErBpC,EAAWmB,EAASK,EAAGD,EAAK,UAAWA,EAAK,QAAQ,EAAIC,CACjE,EAaAP,EAAE,SAAW,SAAUuB,EAAIP,EAAI,CAC7B,OAAOsD,GAAe,KAAM,EAAG/C,EAAIP,CAAE,CACvC,EAaAhB,EAAE,gBAAkBA,EAAE,KAAO,SAAUuE,EAAIvD,EAAI,CAC7C,IAAIf,EAAI,KACNK,EAAOL,EAAE,YAGX,OADAA,EAAI,IAAIK,EAAKL,CAAC,EACVsE,IAAO,OAAetE,GAE1BuE,GAAWD,EAAI,EAAG/F,EAAU,EAExBwC,IAAO,OAAQA,EAAKV,EAAK,SACxBkE,GAAWxD,EAAI,EAAG,CAAC,EAEjBd,EAASD,EAAGsE,EAAKtE,EAAE,EAAI,EAAGe,CAAE,EACrC,EAWAhB,EAAE,cAAgB,SAAUuE,EAAIvD,EAAI,CAClC,IAAIyD,EACFxE,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIsE,IAAO,OACTE,EAAMC,GAAezE,EAAG,EAAI,GAE5BuE,GAAWD,EAAI,EAAG/F,EAAU,EAExBwC,IAAO,OAAQA,EAAKV,EAAK,SACxBkE,GAAWxD,EAAI,EAAG,CAAC,EAExBf,EAAIC,EAAS,IAAII,EAAKL,CAAC,EAAGsE,EAAK,EAAGvD,CAAE,EACpCyD,EAAMC,GAAezE,EAAG,GAAMsE,EAAK,CAAC,GAG/BtE,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAmBAzE,EAAE,QAAU,SAAUuE,EAAIvD,EAAI,CAC5B,IAAIyD,EAAKlE,EACPN,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIsE,IAAO,OACTE,EAAMC,GAAezE,CAAC,GAEtBuE,GAAWD,EAAI,EAAG/F,EAAU,EAExBwC,IAAO,OAAQA,EAAKV,EAAK,SACxBkE,GAAWxD,EAAI,EAAG,CAAC,EAExBT,EAAIL,EAAS,IAAII,EAAKL,CAAC,EAAGsE,EAAKtE,EAAE,EAAI,EAAGe,CAAE,EAC1CyD,EAAMC,GAAenE,EAAG,GAAOgE,EAAKhE,EAAE,EAAI,CAAC,GAKtCN,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAcAzE,EAAE,WAAa,SAAU2E,EAAM,CAC7B,IAAI7C,EAAG8C,EAAIC,EAAIC,EAAI3D,EAAGd,EAAGgB,EAAG0D,EAAIC,EAAIjE,EAAI+C,EAAGf,EACzC9C,EAAI,KACJU,EAAKV,EAAE,EACPK,EAAOL,EAAE,YAEX,GAAI,CAACU,EAAI,OAAO,IAAIL,EAAKL,CAAC,EAU1B,GARA+E,EAAKJ,EAAK,IAAItE,EAAK,CAAC,EACpBuE,EAAKE,EAAK,IAAIzE,EAAK,CAAC,EAEpBwB,EAAI,IAAIxB,EAAKuE,CAAE,EACf1D,EAAIW,EAAE,EAAIoC,GAAavD,CAAE,EAAIV,EAAE,EAAI,EACnCI,EAAIc,EAAIvB,EACRkC,EAAE,EAAE,CAAC,EAAIxC,GAAQ,GAAIe,EAAI,EAAIT,EAAWS,EAAIA,CAAC,EAEzCsE,GAAQ,KAGVA,EAAOxD,EAAI,EAAIW,EAAIkD,MACd,CAEL,GADA3D,EAAI,IAAIf,EAAKqE,CAAI,EACb,CAACtD,EAAE,MAAM,GAAKA,EAAE,GAAG2D,CAAE,EAAG,MAAM,MAAM/F,GAAkBoC,CAAC,EAC3DsD,EAAOtD,EAAE,GAAGS,CAAC,EAAKX,EAAI,EAAIW,EAAIkD,EAAM3D,CACtC,CAOA,IALAtC,EAAW,GACXsC,EAAI,IAAIf,EAAKqB,GAAehB,CAAE,CAAC,EAC/BI,EAAKT,EAAK,UACVA,EAAK,UAAYa,EAAIR,EAAG,OAASf,EAAW,EAG1CkE,EAAIlC,GAAOP,EAAGS,EAAG,EAAG,EAAG,CAAC,EACxBgD,EAAKF,EAAG,KAAKd,EAAE,MAAMe,CAAE,CAAC,EACpBC,EAAG,IAAIH,CAAI,GAAK,GACpBC,EAAKC,EACLA,EAAKC,EACLA,EAAKE,EACLA,EAAKD,EAAG,KAAKjB,EAAE,MAAMgB,CAAE,CAAC,EACxBC,EAAKD,EACLA,EAAKhD,EACLA,EAAIT,EAAE,MAAMyC,EAAE,MAAMgB,CAAE,CAAC,EACvBzD,EAAIyD,EAGN,OAAAA,EAAKlD,GAAO+C,EAAK,MAAMC,CAAE,EAAGC,EAAI,EAAG,EAAG,CAAC,EACvCE,EAAKA,EAAG,KAAKD,EAAG,MAAME,CAAE,CAAC,EACzBJ,EAAKA,EAAG,KAAKE,EAAG,MAAMD,CAAE,CAAC,EACzBE,EAAG,EAAIC,EAAG,EAAI/E,EAAE,EAGhB8C,EAAInB,GAAOoD,EAAIH,EAAI1D,EAAG,CAAC,EAAE,MAAMlB,CAAC,EAAE,IAAI,EAAE,IAAI2B,GAAOmD,EAAIH,EAAIzD,EAAG,CAAC,EAAE,MAAMlB,CAAC,EAAE,IAAI,CAAC,EAAI,EAC7E,CAAC+E,EAAIH,CAAE,EAAI,CAACE,EAAIH,CAAE,EAExBtE,EAAK,UAAYS,EACjBhC,EAAW,GAEJgE,CACT,EAaA/C,EAAE,cAAgBA,EAAE,MAAQ,SAAUuB,EAAIP,EAAI,CAC5C,OAAOsD,GAAe,KAAM,GAAI/C,EAAIP,CAAE,CACxC,EAmBAhB,EAAE,UAAY,SAAUO,EAAGS,EAAI,CAC7B,IAAIf,EAAI,KACNK,EAAOL,EAAE,YAIX,GAFAA,EAAI,IAAIK,EAAKL,CAAC,EAEVM,GAAK,KAAM,CAGb,GAAI,CAACN,EAAE,EAAG,OAAOA,EAEjBM,EAAI,IAAID,EAAK,CAAC,EACdU,EAAKV,EAAK,QACZ,KAAO,CASL,GARAC,EAAI,IAAID,EAAKC,CAAC,EACVS,IAAO,OACTA,EAAKV,EAAK,SAEVkE,GAAWxD,EAAI,EAAG,CAAC,EAIjB,CAACf,EAAE,EAAG,OAAOM,EAAE,EAAIN,EAAIM,EAG3B,GAAI,CAACA,EAAE,EACL,OAAIA,EAAE,IAAGA,EAAE,EAAIN,EAAE,GACVM,CAEX,CAGA,OAAIA,EAAE,EAAE,CAAC,GACPxB,EAAW,GACXkB,EAAI2B,GAAO3B,EAAGM,EAAG,EAAGS,EAAI,CAAC,EAAE,MAAMT,CAAC,EAClCxB,EAAW,GACXmB,EAASD,CAAC,IAIVM,EAAE,EAAIN,EAAE,EACRA,EAAIM,GAGCN,CACT,EAQAD,EAAE,SAAW,UAAY,CACvB,MAAO,CAAC,IACV,EAaAA,EAAE,QAAU,SAAUuB,EAAIP,EAAI,CAC5B,OAAOsD,GAAe,KAAM,EAAG/C,EAAIP,CAAE,CACvC,EA8CAhB,EAAE,QAAUA,EAAE,IAAM,SAAUO,EAAG,CAC/B,IAAIY,EAAGd,EAAGU,EAAIgC,EAAG/B,EAAIoD,EACnBnE,EAAI,KACJK,EAAOL,EAAE,YACTgF,EAAK,EAAE1E,EAAI,IAAID,EAAKC,CAAC,GAGvB,GAAI,CAACN,EAAE,GAAK,CAACM,EAAE,GAAK,CAACN,EAAE,EAAE,CAAC,GAAK,CAACM,EAAE,EAAE,CAAC,EAAG,OAAO,IAAID,EAAKhB,GAAQ,CAACW,EAAGgF,CAAE,CAAC,EAIvE,GAFAhF,EAAI,IAAIK,EAAKL,CAAC,EAEVA,EAAE,GAAG,CAAC,EAAG,OAAOA,EAKpB,GAHAc,EAAKT,EAAK,UACVU,EAAKV,EAAK,SAENC,EAAE,GAAG,CAAC,EAAG,OAAOL,EAASD,EAAGc,EAAIC,CAAE,EAMtC,GAHAG,EAAI9B,GAAUkB,EAAE,EAAIX,CAAQ,EAGxBuB,GAAKZ,EAAE,EAAE,OAAS,IAAMF,EAAI4E,EAAK,EAAI,CAACA,EAAKA,IAAOpF,GACpD,OAAAkD,EAAImC,GAAO5E,EAAML,EAAGI,EAAGU,CAAE,EAClBR,EAAE,EAAI,EAAI,IAAID,EAAK,CAAC,EAAE,IAAIyC,CAAC,EAAI7C,EAAS6C,EAAGhC,EAAIC,CAAE,EAM1D,GAHAoD,EAAInE,EAAE,EAGFmE,EAAI,EAAG,CAGT,GAAIjD,EAAIZ,EAAE,EAAE,OAAS,EAAG,OAAO,IAAID,EAAK,GAAG,EAM3C,IAHKC,EAAE,EAAEY,CAAC,EAAI,IAAM,IAAGiD,EAAI,GAGvBnE,EAAE,GAAK,GAAKA,EAAE,EAAE,CAAC,GAAK,GAAKA,EAAE,EAAE,QAAU,EAC3C,OAAAA,EAAE,EAAImE,EACCnE,CAEX,CAcA,OARAI,EAAIf,GAAQ,CAACW,EAAGgF,CAAE,EAClB9D,EAAId,GAAK,GAAK,CAAC,SAASA,CAAC,EACrBhB,GAAU4F,GAAM,KAAK,IAAI,KAAOtD,GAAe1B,EAAE,CAAC,CAAC,EAAI,KAAK,KAAOA,EAAE,EAAI,EAAE,EAC3E,IAAIK,EAAKD,EAAI,EAAE,EAAE,EAKjBc,EAAIb,EAAK,KAAO,GAAKa,EAAIb,EAAK,KAAO,EAAU,IAAIA,EAAKa,EAAI,EAAIiD,EAAI,EAAI,CAAC,GAE7ErF,EAAW,GACXuB,EAAK,SAAWL,EAAE,EAAI,EAMtBI,EAAI,KAAK,IAAI,IAAKc,EAAI,IAAI,MAAM,EAGhC4B,EAAIgB,GAAmBxD,EAAE,MAAMiD,GAAiBvD,EAAGc,EAAKV,CAAC,CAAC,EAAGU,CAAE,EAG3DgC,EAAE,IAGJA,EAAI7C,EAAS6C,EAAGhC,EAAK,EAAG,CAAC,EAIrB2C,GAAoBX,EAAE,EAAGhC,EAAIC,CAAE,IACjCG,EAAIJ,EAAK,GAGTgC,EAAI7C,EAAS6D,GAAmBxD,EAAE,MAAMiD,GAAiBvD,EAAGkB,EAAId,CAAC,CAAC,EAAGc,CAAC,EAAGA,EAAI,EAAG,CAAC,EAG7E,CAACQ,GAAeoB,EAAE,CAAC,EAAE,MAAMhC,EAAK,EAAGA,EAAK,EAAE,EAAI,GAAK,OACrDgC,EAAI7C,EAAS6C,EAAGhC,EAAK,EAAG,CAAC,KAK/BgC,EAAE,EAAIqB,EACNrF,EAAW,GACXuB,EAAK,SAAWU,EAETd,EAAS6C,EAAGhC,EAAIC,CAAE,EAC3B,EAcAhB,EAAE,YAAc,SAAUuB,EAAIP,EAAI,CAChC,IAAIyD,EACFxE,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIsB,IAAO,OACTkD,EAAMC,GAAezE,EAAGA,EAAE,GAAKK,EAAK,UAAYL,EAAE,GAAKK,EAAK,QAAQ,GAEpEkE,GAAWjD,EAAI,EAAG/C,EAAU,EAExBwC,IAAO,OAAQA,EAAKV,EAAK,SACxBkE,GAAWxD,EAAI,EAAG,CAAC,EAExBf,EAAIC,EAAS,IAAII,EAAKL,CAAC,EAAGsB,EAAIP,CAAE,EAChCyD,EAAMC,GAAezE,EAAGsB,GAAMtB,EAAE,GAAKA,EAAE,GAAKK,EAAK,SAAUiB,CAAE,GAGxDtB,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAiBAzE,EAAE,oBAAsBA,EAAE,KAAO,SAAUuB,EAAIP,EAAI,CACjD,IAAIf,EAAI,KACNK,EAAOL,EAAE,YAEX,OAAIsB,IAAO,QACTA,EAAKjB,EAAK,UACVU,EAAKV,EAAK,WAEVkE,GAAWjD,EAAI,EAAG/C,EAAU,EAExBwC,IAAO,OAAQA,EAAKV,EAAK,SACxBkE,GAAWxD,EAAI,EAAG,CAAC,GAGnBd,EAAS,IAAII,EAAKL,CAAC,EAAGsB,EAAIP,CAAE,CACrC,EAUAhB,EAAE,SAAW,UAAY,CACvB,IAAIC,EAAI,KACNK,EAAOL,EAAE,YACTwE,EAAMC,GAAezE,EAAGA,EAAE,GAAKK,EAAK,UAAYL,EAAE,GAAKK,EAAK,QAAQ,EAEtE,OAAOL,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAOAzE,EAAE,UAAYA,EAAE,MAAQ,UAAY,CAClC,OAAOE,EAAS,IAAI,KAAK,YAAY,IAAI,EAAG,KAAK,EAAI,EAAG,CAAC,CAC3D,EAQAF,EAAE,QAAUA,EAAE,OAAS,UAAY,CACjC,IAAIC,EAAI,KACNK,EAAOL,EAAE,YACTwE,EAAMC,GAAezE,EAAGA,EAAE,GAAKK,EAAK,UAAYL,EAAE,GAAKK,EAAK,QAAQ,EAEtE,OAAOL,EAAE,MAAM,EAAI,IAAMwE,EAAMA,CACjC,EAoDA,SAAS9C,GAAeG,EAAG,CACzB,IAAI,EAAGzB,EAAG8E,EACRC,EAAkBtD,EAAE,OAAS,EAC7B2C,EAAM,GACN5C,EAAIC,EAAE,CAAC,EAET,GAAIsD,EAAkB,EAAG,CAEvB,IADAX,GAAO5C,EACF,EAAI,EAAG,EAAIuD,EAAiB,IAC/BD,EAAKrD,EAAE,CAAC,EAAI,GACZzB,EAAIT,EAAWuF,EAAG,OACd9E,IAAGoE,GAAOY,GAAchF,CAAC,GAC7BoE,GAAOU,EAGTtD,EAAIC,EAAE,CAAC,EACPqD,EAAKtD,EAAI,GACTxB,EAAIT,EAAWuF,EAAG,OACd9E,IAAGoE,GAAOY,GAAchF,CAAC,EAC/B,SAAWwB,IAAM,EACf,MAAO,IAIT,KAAOA,EAAI,KAAO,GAAIA,GAAK,GAE3B,OAAO4C,EAAM5C,CACf,CAGA,SAAS2C,GAAWpC,EAAGjC,EAAKC,EAAK,CAC/B,GAAIgC,IAAM,CAAC,CAACA,GAAKA,EAAIjC,GAAOiC,EAAIhC,EAC9B,MAAM,MAAMnB,GAAkBmD,CAAC,CAEnC,CAQA,SAASsB,GAAoB5B,EAAG,EAAGd,EAAIsE,EAAW,CAChD,IAAIC,EAAIlF,EAAG0C,EAAGyC,EAGd,IAAKnF,EAAIyB,EAAE,CAAC,EAAGzB,GAAK,GAAIA,GAAK,GAAI,EAAE,EAGnC,MAAI,EAAE,EAAI,GACR,GAAKT,EACL2F,EAAK,IAELA,EAAK,KAAK,MAAM,EAAI,GAAK3F,CAAQ,EACjC,GAAKA,GAMPS,EAAIf,GAAQ,GAAIM,EAAW,CAAC,EAC5B4F,EAAK1D,EAAEyD,CAAE,EAAIlF,EAAI,EAEbiF,GAAa,KACX,EAAI,GACF,GAAK,EAAGE,EAAKA,EAAK,IAAM,EACnB,GAAK,IAAGA,EAAKA,EAAK,GAAK,GAChCzC,EAAI/B,EAAK,GAAKwE,GAAM,OAASxE,EAAK,GAAKwE,GAAM,OAASA,GAAM,KAASA,GAAM,GAE3EzC,GAAK/B,EAAK,GAAKwE,EAAK,GAAKnF,GAAKW,EAAK,GAAKwE,EAAK,GAAKnF,EAAI,KACnDyB,EAAEyD,EAAK,CAAC,EAAIlF,EAAI,IAAM,IAAMf,GAAQ,GAAI,EAAI,CAAC,EAAI,IAC/CkG,GAAMnF,EAAI,GAAKmF,GAAM,KAAO1D,EAAEyD,EAAK,CAAC,EAAIlF,EAAI,IAAM,IAAM,EAG3D,EAAI,GACF,GAAK,EAAGmF,EAAKA,EAAK,IAAO,EACpB,GAAK,EAAGA,EAAKA,EAAK,IAAM,EACxB,GAAK,IAAGA,EAAKA,EAAK,GAAK,GAChCzC,GAAKuC,GAAatE,EAAK,IAAMwE,GAAM,MAAQ,CAACF,GAAatE,EAAK,GAAKwE,GAAM,MAEzEzC,IAAMuC,GAAatE,EAAK,IAAMwE,EAAK,GAAKnF,GACvC,CAACiF,GAAatE,EAAK,GAAMwE,EAAK,GAAKnF,EAAI,KACrCyB,EAAEyD,EAAK,CAAC,EAAIlF,EAAI,IAAO,IAAMf,GAAQ,GAAI,EAAI,CAAC,EAAI,EAIlDyD,CACT,CAMA,SAAS0C,GAAYhB,EAAKiB,EAAQC,EAAS,CAOzC,QANInF,EACFoF,EAAM,CAAC,CAAC,EACRC,EACAzD,EAAI,EACJ0D,EAAOrB,EAAI,OAENrC,EAAI0D,GAAO,CAChB,IAAKD,EAAOD,EAAI,OAAQC,KAASD,EAAIC,CAAI,GAAKH,EAE9C,IADAE,EAAI,CAAC,GAAKnH,GAAS,QAAQgG,EAAI,OAAOrC,GAAG,CAAC,EACrC5B,EAAI,EAAGA,EAAIoF,EAAI,OAAQpF,IACtBoF,EAAIpF,CAAC,EAAImF,EAAU,IACjBC,EAAIpF,EAAI,CAAC,IAAM,SAAQoF,EAAIpF,EAAI,CAAC,EAAI,GACxCoF,EAAIpF,EAAI,CAAC,GAAKoF,EAAIpF,CAAC,EAAImF,EAAU,EACjCC,EAAIpF,CAAC,GAAKmF,EAGhB,CAEA,OAAOC,EAAI,QAAQ,CACrB,CAQA,SAAS3E,GAAOX,EAAML,EAAG,CACvB,IAAII,EAAG0B,EAAKxB,EAEZ,GAAIN,EAAE,OAAO,EAAG,OAAOA,EAMvB8B,EAAM9B,EAAE,EAAE,OACN8B,EAAM,IACR1B,EAAI,KAAK,KAAK0B,EAAM,CAAC,EACrBxB,GAAK,EAAI0B,GAAQ,EAAG5B,CAAC,GAAG,SAAS,IAEjCA,EAAI,GACJE,EAAI,gCAGND,EAAK,WAAaD,EAElBJ,EAAIiC,GAAa5B,EAAM,EAAGL,EAAE,MAAMM,CAAC,EAAG,IAAID,EAAK,CAAC,CAAC,EAGjD,QAAS8B,EAAI/B,EAAG+B,KAAM,CACpB,IAAI2D,EAAQ9F,EAAE,MAAMA,CAAC,EACrBA,EAAI8F,EAAM,MAAMA,CAAK,EAAE,MAAMA,CAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CACrD,CAEA,OAAAzF,EAAK,WAAaD,EAEXJ,CACT,CAMA,IAAI2B,IAAU,UAAY,CAGxB,SAASoE,EAAgB/F,EAAGI,EAAG4C,EAAM,CACnC,IAAIgD,EACFjC,EAAQ,EACR5B,EAAInC,EAAE,OAER,IAAKA,EAAIA,EAAE,MAAM,EAAGmC,KAClB6D,EAAOhG,EAAEmC,CAAC,EAAI/B,EAAI2D,EAClB/D,EAAEmC,CAAC,EAAI6D,EAAOhD,EAAO,EACrBe,EAAQiC,EAAOhD,EAAO,EAGxB,OAAIe,GAAO/D,EAAE,QAAQ+D,CAAK,EAEnB/D,CACT,CAEA,SAASiG,EAAQC,EAAGC,EAAGC,EAAIC,EAAI,CAC7B,IAAIlE,EAAGW,EAEP,GAAIsD,GAAMC,EACRvD,EAAIsD,EAAKC,EAAK,EAAI,OAElB,KAAKlE,EAAIW,EAAI,EAAGX,EAAIiE,EAAIjE,IACtB,GAAI+D,EAAE/D,CAAC,GAAKgE,EAAEhE,CAAC,EAAG,CAChBW,EAAIoD,EAAE/D,CAAC,EAAIgE,EAAEhE,CAAC,EAAI,EAAI,GACtB,KACF,CAIJ,OAAOW,CACT,CAEA,SAASwD,EAASJ,EAAGC,EAAGC,EAAIpD,EAAM,CAIhC,QAHIb,EAAI,EAGDiE,KACLF,EAAEE,CAAE,GAAKjE,EACTA,EAAI+D,EAAEE,CAAE,EAAID,EAAEC,CAAE,EAAI,EAAI,EACxBF,EAAEE,CAAE,EAAIjE,EAAIa,EAAOkD,EAAEE,CAAE,EAAID,EAAEC,CAAE,EAIjC,KAAO,CAACF,EAAE,CAAC,GAAKA,EAAE,OAAS,GAAIA,EAAE,MAAM,CACzC,CAEA,OAAO,SAAUlG,EAAGM,EAAGQ,EAAIC,EAAIuD,EAAItB,EAAM,CACvC,IAAIuD,EAAKrF,EAAGiB,EAAG/B,EAAGoG,EAASC,EAAMC,EAAMC,EAAO9C,EAAG+C,EAAIC,EAAKC,EAAMC,EAAMzF,EAAIC,EAAGyF,GAAIC,GAAIC,GACnFC,EAAIC,GACJ/G,EAAOL,EAAE,YACTqH,EAAOrH,EAAE,GAAKM,EAAE,EAAI,EAAI,GACxBI,EAAKV,EAAE,EACPW,EAAKL,EAAE,EAGT,GAAI,CAACI,GAAM,CAACA,EAAG,CAAC,GAAK,CAACC,GAAM,CAACA,EAAG,CAAC,EAE/B,OAAO,IAAIN,EACT,CAACL,EAAE,GAAK,CAACM,EAAE,IAAMI,EAAKC,GAAMD,EAAG,CAAC,GAAKC,EAAG,CAAC,EAAI,CAACA,GAAM,IAGpDD,GAAMA,EAAG,CAAC,GAAK,GAAK,CAACC,EAAK0G,EAAO,EAAIA,EAAO,CAAC,EAmBjD,IAhBIrE,GACFwD,EAAU,EACVtF,EAAIlB,EAAE,EAAIM,EAAE,IAEZ0C,EAAOtD,GACP8G,EAAU7G,EACVuB,EAAI9B,GAAUY,EAAE,EAAIwG,CAAO,EAAIpH,GAAUkB,EAAE,EAAIkG,CAAO,GAGxDW,EAAKxG,EAAG,OACRsG,GAAKvG,EAAG,OACRmD,EAAI,IAAIxD,EAAKgH,CAAI,EACjBT,EAAK/C,EAAE,EAAI,CAAC,EAIP1B,EAAI,EAAGxB,EAAGwB,CAAC,IAAMzB,EAAGyB,CAAC,GAAK,GAAIA,IAAI,CAavC,GAXIxB,EAAGwB,CAAC,GAAKzB,EAAGyB,CAAC,GAAK,IAAIjB,IAEtBJ,GAAM,MACRQ,EAAKR,EAAKT,EAAK,UACfU,EAAKV,EAAK,UACDiE,EACThD,EAAKR,GAAMd,EAAE,EAAIM,EAAE,GAAK,EAExBgB,EAAKR,EAGHQ,EAAK,EACPsF,EAAG,KAAK,CAAC,EACTH,EAAO,OACF,CAOL,GAJAnF,EAAKA,EAAKkF,EAAU,EAAI,EACxBrE,EAAI,EAGAgF,GAAM,EAAG,CAMX,IALA/G,EAAI,EACJO,EAAKA,EAAG,CAAC,EACTW,KAGQa,EAAI8E,IAAM7G,IAAMkB,IAAMa,IAC5BZ,EAAInB,EAAI4C,GAAQtC,EAAGyB,CAAC,GAAK,GACzByE,EAAGzE,CAAC,EAAIZ,EAAIZ,EAAK,EACjBP,EAAImB,EAAIZ,EAAK,EAGf8F,EAAOrG,GAAK+B,EAAI8E,EAGlB,KAAO,CAiBL,IAdA7G,EAAI4C,GAAQrC,EAAG,CAAC,EAAI,GAAK,EAErBP,EAAI,IACNO,EAAKoF,EAAgBpF,EAAIP,EAAG4C,CAAI,EAChCtC,EAAKqF,EAAgBrF,EAAIN,EAAG4C,CAAI,EAChCmE,EAAKxG,EAAG,OACRsG,GAAKvG,EAAG,QAGVsG,GAAKG,EACLN,EAAMnG,EAAG,MAAM,EAAGyG,CAAE,EACpBL,EAAOD,EAAI,OAGJC,EAAOK,GAAKN,EAAIC,GAAM,EAAI,EAEjCM,GAAKzG,EAAG,MAAM,EACdyG,GAAG,QAAQ,CAAC,EACZF,GAAMvG,EAAG,CAAC,EAENA,EAAG,CAAC,GAAKqC,EAAO,GAAG,EAAEkE,GAEzB,GACE9G,EAAI,EAGJmG,EAAMN,EAAQtF,EAAIkG,EAAKM,EAAIL,CAAI,EAG3BP,EAAM,GAGRQ,EAAOF,EAAI,CAAC,EACRM,GAAML,IAAMC,EAAOA,EAAO/D,GAAQ6D,EAAI,CAAC,GAAK,IAGhDzG,EAAI2G,EAAOG,GAAM,EAUb9G,EAAI,GACFA,GAAK4C,IAAM5C,EAAI4C,EAAO,GAG1B0D,EAAOX,EAAgBpF,EAAIP,EAAG4C,CAAI,EAClC2D,EAAQD,EAAK,OACbI,EAAOD,EAAI,OAGXN,EAAMN,EAAQS,EAAMG,EAAKF,EAAOG,CAAI,EAGhCP,GAAO,IACTnG,IAGAkG,EAASI,EAAMS,EAAKR,EAAQS,GAAKzG,EAAIgG,EAAO3D,CAAI,KAO9C5C,GAAK,IAAGmG,EAAMnG,EAAI,GACtBsG,EAAO/F,EAAG,MAAM,GAGlBgG,EAAQD,EAAK,OACTC,EAAQG,GAAMJ,EAAK,QAAQ,CAAC,EAGhCJ,EAASO,EAAKH,EAAMI,EAAM9D,CAAI,EAG1BuD,GAAO,KACTO,EAAOD,EAAI,OAGXN,EAAMN,EAAQtF,EAAIkG,EAAKM,EAAIL,CAAI,EAG3BP,EAAM,IACRnG,IAGAkG,EAASO,EAAKM,EAAKL,EAAOM,GAAKzG,EAAImG,EAAM9D,CAAI,IAIjD8D,EAAOD,EAAI,QACFN,IAAQ,IACjBnG,IACAyG,EAAM,CAAC,CAAC,GAIVD,EAAGzE,GAAG,EAAI/B,EAGNmG,GAAOM,EAAI,CAAC,EACdA,EAAIC,GAAM,EAAIpG,EAAGsG,EAAE,GAAK,GAExBH,EAAM,CAACnG,EAAGsG,EAAE,CAAC,EACbF,EAAO,UAGDE,KAAOC,IAAMJ,EAAI,CAAC,IAAM,SAAWvF,KAE7CmF,EAAOI,EAAI,CAAC,IAAM,MACpB,CAGKD,EAAG,CAAC,GAAGA,EAAG,MAAM,CACvB,CAGA,GAAIJ,GAAW,EACb3C,EAAE,EAAI3C,EACNtC,GAAU6H,MACL,CAGL,IAAKtE,EAAI,EAAG/B,EAAIwG,EAAG,CAAC,EAAGxG,GAAK,GAAIA,GAAK,GAAI+B,IACzC0B,EAAE,EAAI1B,EAAIjB,EAAIsF,EAAU,EAExBvG,EAAS4D,EAAGS,EAAKxD,EAAK+C,EAAE,EAAI,EAAI/C,EAAIC,EAAI0F,CAAI,CAC9C,CAEA,OAAO5C,CACT,CACF,GAAG,EAOF,SAAS5D,EAASD,EAAGsB,EAAIP,EAAIuG,EAAa,CACzC,IAAIC,EAAQpF,EAAG5B,EAAGH,EAAGmF,EAAIiC,EAAS5F,EAAGlB,EAAI+G,EACvCpH,EAAOL,EAAE,YAGX0H,EAAK,GAAIpG,GAAM,KAAM,CAInB,GAHAZ,EAAKV,EAAE,EAGH,CAACU,EAAI,OAAOV,EAWhB,IAAKuH,EAAS,EAAGnH,EAAIM,EAAG,CAAC,EAAGN,GAAK,GAAIA,GAAK,GAAImH,IAI9C,GAHApF,EAAIb,EAAKiG,EAGLpF,EAAI,EACNA,GAAKxC,EACLY,EAAIe,EACJM,EAAIlB,EAAG+G,EAAM,CAAC,EAGdlC,EAAK3D,EAAIvC,GAAQ,GAAIkI,EAAShH,EAAI,CAAC,EAAI,GAAK,UAE5CkH,EAAM,KAAK,MAAMtF,EAAI,GAAKxC,CAAQ,EAClCS,EAAIM,EAAG,OACH+G,GAAOrH,EACT,GAAIkH,EAAa,CAGf,KAAOlH,KAAOqH,GAAM/G,EAAG,KAAK,CAAC,EAC7BkB,EAAI2D,EAAK,EACTgC,EAAS,EACTpF,GAAKxC,EACLY,EAAI4B,EAAIxC,EAAW,CACrB,KACE,OAAM+H,MAEH,CAIL,IAHA9F,EAAIxB,EAAIM,EAAG+G,CAAG,EAGTF,EAAS,EAAGnH,GAAK,GAAIA,GAAK,GAAImH,IAGnCpF,GAAKxC,EAILY,EAAI4B,EAAIxC,EAAW4H,EAGnBhC,EAAKhF,EAAI,EAAI,EAAIqB,EAAIvC,GAAQ,GAAIkI,EAAShH,EAAI,CAAC,EAAI,GAAK,CAC1D,CAmBF,GAfA+G,EAAcA,GAAehG,EAAK,GAChCZ,EAAG+G,EAAM,CAAC,IAAM,SAAWlH,EAAI,EAAIqB,EAAIA,EAAIvC,GAAQ,GAAIkI,EAAShH,EAAI,CAAC,GAMvEiH,EAAUzG,EAAK,GACVwE,GAAM+B,KAAiBvG,GAAM,GAAKA,IAAOf,EAAE,EAAI,EAAI,EAAI,IACxDuF,EAAK,GAAKA,GAAM,IAAMxE,GAAM,GAAKuG,GAAevG,GAAM,IAGpDoB,EAAI,EAAI5B,EAAI,EAAIqB,EAAIvC,GAAQ,GAAIkI,EAAShH,CAAC,EAAI,EAAIG,EAAG+G,EAAM,CAAC,GAAK,GAAM,GACvE1G,IAAOf,EAAE,EAAI,EAAI,EAAI,IAEvBsB,EAAK,GAAK,CAACZ,EAAG,CAAC,EACjB,OAAAA,EAAG,OAAS,EACR8G,GAGFlG,GAAMtB,EAAE,EAAI,EAGZU,EAAG,CAAC,EAAIrB,GAAQ,IAAKM,EAAW2B,EAAK3B,GAAYA,CAAQ,EACzDK,EAAE,EAAI,CAACsB,GAAM,GAIbZ,EAAG,CAAC,EAAIV,EAAE,EAAI,EAGTA,EAiBT,GAbImC,GAAK,GACPzB,EAAG,OAAS+G,EACZrH,EAAI,EACJqH,MAEA/G,EAAG,OAAS+G,EAAM,EAClBrH,EAAIf,GAAQ,GAAIM,EAAWwC,CAAC,EAI5BzB,EAAG+G,CAAG,EAAIlH,EAAI,GAAKqB,EAAIvC,GAAQ,GAAIkI,EAAShH,CAAC,EAAIlB,GAAQ,GAAIkB,CAAC,EAAI,GAAKH,EAAI,GAGzEoH,EACF,OAGE,GAAIC,GAAO,EAAG,CAGZ,IAAKtF,EAAI,EAAG5B,EAAIG,EAAG,CAAC,EAAGH,GAAK,GAAIA,GAAK,GAAI4B,IAEzC,IADA5B,EAAIG,EAAG,CAAC,GAAKN,EACRA,EAAI,EAAGG,GAAK,GAAIA,GAAK,GAAIH,IAG1B+B,GAAK/B,IACPJ,EAAE,IACEU,EAAG,CAAC,GAAKhB,KAAMgB,EAAG,CAAC,EAAI,IAG7B,KACF,KAAO,CAEL,GADAA,EAAG+G,CAAG,GAAKrH,EACPM,EAAG+G,CAAG,GAAK/H,GAAM,MACrBgB,EAAG+G,GAAK,EAAI,EACZrH,EAAI,CACN,CAKJ,IAAK+B,EAAIzB,EAAG,OAAQA,EAAG,EAAEyB,CAAC,IAAM,GAAIzB,EAAG,IAAI,CAC7C,CAEA,OAAI5B,IAGEkB,EAAE,EAAIK,EAAK,MAGbL,EAAE,EAAI,KACNA,EAAE,EAAI,KAGGA,EAAE,EAAIK,EAAK,OAGpBL,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,IAKLA,CACT,CAGA,SAASyE,GAAezE,EAAG2H,EAAOrG,EAAI,CACpC,GAAI,CAACtB,EAAE,SAAS,EAAG,OAAO4H,GAAkB5H,CAAC,EAC7C,IAAII,EACF,EAAIJ,EAAE,EACNwE,EAAM9C,GAAe1B,EAAE,CAAC,EACxB8B,EAAM0C,EAAI,OAEZ,OAAImD,GACErG,IAAOlB,EAAIkB,EAAKQ,GAAO,EACzB0C,EAAMA,EAAI,OAAO,CAAC,EAAI,IAAMA,EAAI,MAAM,CAAC,EAAIY,GAAchF,CAAC,EACjD0B,EAAM,IACf0C,EAAMA,EAAI,OAAO,CAAC,EAAI,IAAMA,EAAI,MAAM,CAAC,GAGzCA,EAAMA,GAAOxE,EAAE,EAAI,EAAI,IAAM,MAAQA,EAAE,GAC9B,EAAI,GACbwE,EAAM,KAAOY,GAAc,CAAC,EAAI,CAAC,EAAIZ,EACjClD,IAAOlB,EAAIkB,EAAKQ,GAAO,IAAG0C,GAAOY,GAAchF,CAAC,IAC3C,GAAK0B,GACd0C,GAAOY,GAAc,EAAI,EAAItD,CAAG,EAC5BR,IAAOlB,EAAIkB,EAAK,EAAI,GAAK,IAAGkD,EAAMA,EAAM,IAAMY,GAAchF,CAAC,MAE5DA,EAAI,EAAI,GAAK0B,IAAK0C,EAAMA,EAAI,MAAM,EAAGpE,CAAC,EAAI,IAAMoE,EAAI,MAAMpE,CAAC,GAC5DkB,IAAOlB,EAAIkB,EAAKQ,GAAO,IACrB,EAAI,IAAMA,IAAK0C,GAAO,KAC1BA,GAAOY,GAAchF,CAAC,IAInBoE,CACT,CAIA,SAASZ,GAAkB2D,EAAQrG,EAAG,CACpC,IAAIU,EAAI2F,EAAO,CAAC,EAGhB,IAAMrG,GAAKvB,EAAUiC,GAAK,GAAIA,GAAK,GAAIV,IACvC,OAAOA,CACT,CAGA,SAASsC,GAAQnD,EAAMiB,EAAIR,EAAI,CAC7B,GAAIQ,EAAKzB,GAGP,MAAAf,EAAW,GACPgC,IAAIT,EAAK,UAAYS,GACnB,MAAM7B,EAAsB,EAEpC,OAAOgB,EAAS,IAAII,EAAK5B,EAAI,EAAG6C,EAAI,EAAG,EAAI,CAC7C,CAGA,SAASmB,GAAMpC,EAAMiB,EAAIP,EAAI,CAC3B,GAAIO,EAAKxB,GAAc,MAAM,MAAMb,EAAsB,EACzD,OAAOgB,EAAS,IAAII,EAAK3B,EAAE,EAAG4C,EAAIP,EAAI,EAAI,CAC5C,CAGA,SAASkD,GAAasD,EAAQ,CAC5B,IAAI3F,EAAI2F,EAAO,OAAS,EACtBzF,EAAMF,EAAIjC,EAAW,EAKvB,GAHAiC,EAAI2F,EAAO3F,CAAC,EAGRA,EAAG,CAGL,KAAOA,EAAI,IAAM,EAAGA,GAAK,GAAIE,IAG7B,IAAKF,EAAI2F,EAAO,CAAC,EAAG3F,GAAK,GAAIA,GAAK,GAAIE,GACxC,CAEA,OAAOA,CACT,CAGA,SAASsD,GAAchF,EAAG,CAExB,QADIyH,EAAK,GACFzH,KAAMyH,GAAM,IACnB,OAAOA,CACT,CAUA,SAAS5C,GAAO5E,EAAML,EAAGoB,EAAGN,EAAI,CAC9B,IAAIwG,EACFxE,EAAI,IAAIzC,EAAK,CAAC,EAIdD,EAAI,KAAK,KAAKU,EAAKnB,EAAW,CAAC,EAIjC,IAFAb,EAAW,KAEF,CAOP,GANIsC,EAAI,IACN0B,EAAIA,EAAE,MAAM9C,CAAC,EACT8H,GAAShF,EAAE,EAAG1C,CAAC,IAAGkH,EAAc,KAGtClG,EAAIhC,GAAUgC,EAAI,CAAC,EACfA,IAAM,EAAG,CAGXA,EAAI0B,EAAE,EAAE,OAAS,EACbwE,GAAexE,EAAE,EAAE1B,CAAC,IAAM,GAAG,EAAE0B,EAAE,EAAE1B,CAAC,EACxC,KACF,CAEApB,EAAIA,EAAE,MAAMA,CAAC,EACb8H,GAAS9H,EAAE,EAAGI,CAAC,CACjB,CAEA,OAAAtB,EAAW,GAEJgE,CACT,CAGA,SAASiF,GAAM,EAAG,CAChB,OAAO,EAAE,EAAE,EAAE,EAAE,OAAS,CAAC,EAAI,CAC/B,CAMA,SAASC,GAAS3H,EAAM4H,EAAM7G,EAAG,CAK/B,QAJIhB,EAAGE,EACLN,EAAI,IAAIK,EAAK4H,EAAK,CAAC,CAAC,EACpB9F,EAAI,EAEC,EAAEA,EAAI8F,EAAK,QAAS,CAIzB,GAHA3H,EAAI,IAAID,EAAK4H,EAAK9F,CAAC,CAAC,EAGhB,CAAC7B,EAAE,EAAG,CACRN,EAAIM,EACJ,KACF,CAEAF,EAAIJ,EAAE,IAAIM,CAAC,GAEPF,IAAMgB,GAAKhB,IAAM,GAAKJ,EAAE,IAAMoB,KAChCpB,EAAIM,EAER,CAEA,OAAON,CACT,CAkCA,SAAS8D,GAAmB9D,EAAGsB,EAAI,CACjC,IAAI4B,EAAaI,EAAO/C,EAAG2H,EAAKC,EAAK5G,EAAGmB,EACtCrB,EAAM,EACNc,EAAI,EACJ/B,EAAI,EACJC,EAAOL,EAAE,YACTe,EAAKV,EAAK,SACVS,EAAKT,EAAK,UAGZ,GAAI,CAACL,EAAE,GAAK,CAACA,EAAE,EAAE,CAAC,GAAKA,EAAE,EAAI,GAE3B,OAAO,IAAIK,EAAKL,EAAE,EACbA,EAAE,EAAE,CAAC,EAAQA,EAAE,EAAI,EAAI,EAAI,IAAlB,EACVA,EAAE,EAAIA,EAAE,EAAI,EAAI,EAAIA,EAAI,GAAK,EAanC,IAVIsB,GAAM,MACRxC,EAAW,GACX4D,EAAM5B,GAEN4B,EAAMpB,EAGRC,EAAI,IAAIlB,EAAK,MAAO,EAGbL,EAAE,EAAI,IAGXA,EAAIA,EAAE,MAAMuB,CAAC,EACbnB,GAAK,EAUP,IALAkD,EAAQ,KAAK,IAAIjE,GAAQ,EAAGe,CAAC,CAAC,EAAI,KAAK,KAAO,EAAI,EAAI,EACtDsC,GAAOY,EACPJ,EAAcgF,EAAMC,EAAM,IAAI9H,EAAK,CAAC,EACpCA,EAAK,UAAYqC,IAER,CAKP,GAJAwF,EAAMjI,EAASiI,EAAI,MAAMlI,CAAC,EAAG0C,EAAK,CAAC,EACnCQ,EAAcA,EAAY,MAAM,EAAEf,CAAC,EACnCZ,EAAI4G,EAAI,KAAKxG,GAAOuG,EAAKhF,EAAaR,EAAK,CAAC,CAAC,EAEzChB,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGmB,CAAG,IAAMhB,GAAeyG,EAAI,CAAC,EAAE,MAAM,EAAGzF,CAAG,EAAG,CAE7E,IADAnC,EAAIH,EACGG,KAAK4H,EAAMlI,EAASkI,EAAI,MAAMA,CAAG,EAAGzF,EAAK,CAAC,EAOjD,GAAIpB,GAAM,KAER,GAAID,EAAM,GAAKoC,GAAoB0E,EAAI,EAAGzF,EAAMY,EAAOvC,EAAIM,CAAG,EAC5DhB,EAAK,UAAYqC,GAAO,GACxBQ,EAAcgF,EAAM3G,EAAI,IAAIlB,EAAK,CAAC,EAClC8B,EAAI,EACJd,QAEA,QAAOpB,EAASkI,EAAK9H,EAAK,UAAYS,EAAIC,EAAIjC,EAAW,EAAI,MAG/D,QAAAuB,EAAK,UAAYS,EACVqH,CAEX,CAEAA,EAAM5G,CACR,CACF,CAkBA,SAASgC,GAAiBjD,EAAGgB,EAAI,CAC/B,IAAI8G,EAAGC,EAAInF,EAAahC,EAAGoH,EAAWjH,EAAK8G,EAAK5G,EAAGmB,EAAK6F,EAAIxF,EAC1D3B,EAAI,EACJkC,EAAQ,GACRtD,EAAIM,EACJI,EAAKV,EAAE,EACPK,EAAOL,EAAE,YACTe,EAAKV,EAAK,SACVS,EAAKT,EAAK,UAGZ,GAAIL,EAAE,EAAI,GAAK,CAACU,GAAM,CAACA,EAAG,CAAC,GAAK,CAACV,EAAE,GAAKU,EAAG,CAAC,GAAK,GAAKA,EAAG,QAAU,EACjE,OAAO,IAAIL,EAAKK,GAAM,CAACA,EAAG,CAAC,EAAI,KAASV,EAAE,GAAK,EAAI,IAAMU,EAAK,EAAIV,CAAC,EAcrE,GAXIsB,GAAM,MACRxC,EAAW,GACX4D,EAAM5B,GAEN4B,EAAMpB,EAGRjB,EAAK,UAAYqC,GAAOY,EACxB8E,EAAI1G,GAAehB,CAAE,EACrB2H,EAAKD,EAAE,OAAO,CAAC,EAEX,KAAK,IAAIlH,EAAIlB,EAAE,CAAC,EAAI,MAAQ,CAa9B,KAAOqI,EAAK,GAAKA,GAAM,GAAKA,GAAM,GAAKD,EAAE,OAAO,CAAC,EAAI,GACnDpI,EAAIA,EAAE,MAAMM,CAAC,EACb8H,EAAI1G,GAAe1B,EAAE,CAAC,EACtBqI,EAAKD,EAAE,OAAO,CAAC,EACfhH,IAGFF,EAAIlB,EAAE,EAEFqI,EAAK,GACPrI,EAAI,IAAIK,EAAK,KAAO+H,CAAC,EACrBlH,KAEAlB,EAAI,IAAIK,EAAKgI,EAAK,IAAMD,EAAE,MAAM,CAAC,CAAC,CAEtC,KAKE,QAAA7G,EAAIiC,GAAQnD,EAAMqC,EAAM,EAAG5B,CAAE,EAAE,MAAMI,EAAI,EAAE,EAC3ClB,EAAIuD,GAAiB,IAAIlD,EAAKgI,EAAK,IAAMD,EAAE,MAAM,CAAC,CAAC,EAAG1F,EAAMY,CAAK,EAAE,KAAK/B,CAAC,EACzElB,EAAK,UAAYS,EAEVQ,GAAM,KAAOrB,EAASD,EAAGc,EAAIC,EAAIjC,EAAW,EAAI,EAAIkB,EAa7D,IATAuI,EAAKvI,EAKLmI,EAAMG,EAAYtI,EAAI2B,GAAO3B,EAAE,MAAM,CAAC,EAAGA,EAAE,KAAK,CAAC,EAAG0C,EAAK,CAAC,EAC1DK,EAAK9C,EAASD,EAAE,MAAMA,CAAC,EAAG0C,EAAK,CAAC,EAChCQ,EAAc,IAEL,CAIP,GAHAoF,EAAYrI,EAASqI,EAAU,MAAMvF,CAAE,EAAGL,EAAK,CAAC,EAChDnB,EAAI4G,EAAI,KAAKxG,GAAO2G,EAAW,IAAIjI,EAAK6C,CAAW,EAAGR,EAAK,CAAC,CAAC,EAEzDhB,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGmB,CAAG,IAAMhB,GAAeyG,EAAI,CAAC,EAAE,MAAM,EAAGzF,CAAG,EAc1E,GAbAyF,EAAMA,EAAI,MAAM,CAAC,EAIbjH,IAAM,IAAGiH,EAAMA,EAAI,KAAK3E,GAAQnD,EAAMqC,EAAM,EAAG5B,CAAE,EAAE,MAAMI,EAAI,EAAE,CAAC,GACpEiH,EAAMxG,GAAOwG,EAAK,IAAI9H,EAAKe,CAAC,EAAGsB,EAAK,CAAC,EAQjCpB,GAAM,KACR,GAAImC,GAAoB0E,EAAI,EAAGzF,EAAMY,EAAOvC,EAAIM,CAAG,EACjDhB,EAAK,UAAYqC,GAAOY,EACxB/B,EAAI+G,EAAYtI,EAAI2B,GAAO4G,EAAG,MAAM,CAAC,EAAGA,EAAG,KAAK,CAAC,EAAG7F,EAAK,CAAC,EAC1DK,EAAK9C,EAASD,EAAE,MAAMA,CAAC,EAAG0C,EAAK,CAAC,EAChCQ,EAAc7B,EAAM,MAEpB,QAAOpB,EAASkI,EAAK9H,EAAK,UAAYS,EAAIC,EAAIjC,EAAW,EAAI,MAG/D,QAAAuB,EAAK,UAAYS,EACVqH,EAIXA,EAAM5G,EACN2B,GAAe,CACjB,CACF,CAIA,SAAS0E,GAAkB5H,EAAG,CAE5B,OAAO,OAAOA,EAAE,EAAIA,EAAE,EAAI,CAAC,CAC7B,CAMA,SAASwI,GAAaxI,EAAGwE,EAAK,CAC5B,IAAItD,EAAGiB,EAAGL,EAoBV,KAhBKZ,EAAIsD,EAAI,QAAQ,GAAG,GAAK,KAAIA,EAAMA,EAAI,QAAQ,IAAK,EAAE,IAGrDrC,EAAIqC,EAAI,OAAO,IAAI,GAAK,GAGvBtD,EAAI,IAAGA,EAAIiB,GACfjB,GAAK,CAACsD,EAAI,MAAMrC,EAAI,CAAC,EACrBqC,EAAMA,EAAI,UAAU,EAAGrC,CAAC,GACfjB,EAAI,IAGbA,EAAIsD,EAAI,QAILrC,EAAI,EAAGqC,EAAI,WAAWrC,CAAC,IAAM,GAAIA,IAAI,CAG1C,IAAKL,EAAM0C,EAAI,OAAQA,EAAI,WAAW1C,EAAM,CAAC,IAAM,GAAI,EAAEA,EAAI,CAG7D,GAFA0C,EAAMA,EAAI,MAAMrC,EAAGL,CAAG,EAElB0C,EAAK,CAYP,GAXA1C,GAAOK,EACPnC,EAAE,EAAIkB,EAAIA,EAAIiB,EAAI,EAClBnC,EAAE,EAAI,CAAC,EAMPmC,GAAKjB,EAAI,GAAKvB,EACVuB,EAAI,IAAGiB,GAAKxC,GAEZwC,EAAIL,EAAK,CAEX,IADIK,GAAGnC,EAAE,EAAE,KAAK,CAACwE,EAAI,MAAM,EAAGrC,CAAC,CAAC,EAC3BL,GAAOnC,EAAUwC,EAAIL,GAAM9B,EAAE,EAAE,KAAK,CAACwE,EAAI,MAAMrC,EAAGA,GAAKxC,CAAQ,CAAC,EACrE6E,EAAMA,EAAI,MAAMrC,CAAC,EACjBA,EAAIxC,EAAW6E,EAAI,MACrB,MACErC,GAAKL,EAGP,KAAOK,KAAMqC,GAAO,IACpBxE,EAAE,EAAE,KAAK,CAACwE,CAAG,EAET1F,IAGEkB,EAAE,EAAIA,EAAE,YAAY,MAGtBA,EAAE,EAAI,KACNA,EAAE,EAAI,KAGGA,EAAE,EAAIA,EAAE,YAAY,OAG7BA,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,GAId,MAGEA,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,EAGV,OAAOA,CACT,CAMA,SAASyI,GAAWzI,EAAGwE,EAAK,CAC1B,IAAIxB,EAAM3C,EAAMqI,EAASvG,EAAGwG,EAAS7G,EAAK8G,EAAGlI,EAAIgD,EAEjD,GAAIc,EAAI,QAAQ,GAAG,EAAI,IAErB,GADAA,EAAMA,EAAI,QAAQ,eAAgB,IAAI,EAClC/E,GAAU,KAAK+E,CAAG,EAAG,OAAOgE,GAAaxI,EAAGwE,CAAG,UAC1CA,IAAQ,YAAcA,IAAQ,MACvC,MAAK,CAACA,IAAKxE,EAAE,EAAI,KACjBA,EAAE,EAAI,IACNA,EAAE,EAAI,KACCA,EAGT,GAAIT,GAAM,KAAKiF,CAAG,EAChBxB,EAAO,GACPwB,EAAMA,EAAI,YAAY,UACblF,GAAS,KAAKkF,CAAG,EAC1BxB,EAAO,UACExD,GAAQ,KAAKgF,CAAG,EACzBxB,EAAO,MAEP,OAAM,MAAMhE,GAAkBwF,CAAG,EAgCnC,IA5BArC,EAAIqC,EAAI,OAAO,IAAI,EAEfrC,EAAI,GACNyG,EAAI,CAACpE,EAAI,MAAMrC,EAAI,CAAC,EACpBqC,EAAMA,EAAI,UAAU,EAAGrC,CAAC,GAExBqC,EAAMA,EAAI,MAAM,CAAC,EAKnBrC,EAAIqC,EAAI,QAAQ,GAAG,EACnBmE,EAAUxG,GAAK,EACf9B,EAAOL,EAAE,YAEL2I,IACFnE,EAAMA,EAAI,QAAQ,IAAK,EAAE,EACzB1C,EAAM0C,EAAI,OACVrC,EAAIL,EAAMK,EAGVuG,EAAUzD,GAAO5E,EAAM,IAAIA,EAAK2C,CAAI,EAAGb,EAAGA,EAAI,CAAC,GAGjDzB,EAAK8E,GAAYhB,EAAKxB,EAAMtD,EAAI,EAChCgE,EAAKhD,EAAG,OAAS,EAGZyB,EAAIuB,EAAIhD,EAAGyB,CAAC,IAAM,EAAG,EAAEA,EAAGzB,EAAG,IAAI,EACtC,OAAIyB,EAAI,EAAU,IAAI9B,EAAKL,EAAE,EAAI,CAAC,GAClCA,EAAE,EAAI4D,GAAkBlD,EAAIgD,CAAE,EAC9B1D,EAAE,EAAIU,EACN5B,EAAW,GAQP6J,IAAS3I,EAAI2B,GAAO3B,EAAG0I,EAAS5G,EAAM,CAAC,GAGvC8G,IAAG5I,EAAIA,EAAE,MAAM,KAAK,IAAI4I,CAAC,EAAI,GAAKvJ,GAAQ,EAAGuJ,CAAC,EAAIC,GAAQ,IAAI,EAAGD,CAAC,CAAC,GACvE9J,EAAW,GAEJkB,EACT,CAQA,SAASkE,GAAK7D,EAAML,EAAG,CACrB,IAAII,EACF0B,EAAM9B,EAAE,EAAE,OAEZ,GAAI8B,EAAM,EACR,OAAO9B,EAAE,OAAO,EAAIA,EAAIiC,GAAa5B,EAAM,EAAGL,EAAGA,CAAC,EAQpDI,EAAI,IAAM,KAAK,KAAK0B,CAAG,EACvB1B,EAAIA,EAAI,GAAK,GAAKA,EAAI,EAEtBJ,EAAIA,EAAE,MAAM,EAAIgC,GAAQ,EAAG5B,CAAC,CAAC,EAC7BJ,EAAIiC,GAAa5B,EAAM,EAAGL,EAAGA,CAAC,EAO9B,QAJI8I,EACFxG,EAAK,IAAIjC,EAAK,CAAC,EACfkC,EAAM,IAAIlC,EAAK,EAAE,EACjBmC,EAAM,IAAInC,EAAK,EAAE,EACZD,KACL0I,EAAS9I,EAAE,MAAMA,CAAC,EAClBA,EAAIA,EAAE,MAAMsC,EAAG,KAAKwG,EAAO,MAAMvG,EAAI,MAAMuG,CAAM,EAAE,MAAMtG,CAAG,CAAC,CAAC,CAAC,EAGjE,OAAOxC,CACT,CAIA,SAASiC,GAAa5B,EAAMe,EAAGpB,EAAGM,EAAGyI,EAAc,CACjD,IAAIxI,EAAGgB,EAAGyH,EAAGjG,EACXZ,EAAI,EACJrB,EAAKT,EAAK,UACVD,EAAI,KAAK,KAAKU,EAAKnB,CAAQ,EAM7B,IAJAb,EAAW,GACXiE,EAAK/C,EAAE,MAAMA,CAAC,EACdgJ,EAAI,IAAI3I,EAAKC,CAAC,IAEL,CAMP,GALAiB,EAAII,GAAOqH,EAAE,MAAMjG,CAAE,EAAG,IAAI1C,EAAKe,IAAMA,GAAG,EAAGN,EAAI,CAAC,EAClDkI,EAAID,EAAezI,EAAE,KAAKiB,CAAC,EAAIjB,EAAE,MAAMiB,CAAC,EACxCjB,EAAIqB,GAAOJ,EAAE,MAAMwB,CAAE,EAAG,IAAI1C,EAAKe,IAAMA,GAAG,EAAGN,EAAI,CAAC,EAClDS,EAAIyH,EAAE,KAAK1I,CAAC,EAERiB,EAAE,EAAEnB,CAAC,IAAM,OAAQ,CACrB,IAAKG,EAAIH,EAAGmB,EAAE,EAAEhB,CAAC,IAAMyI,EAAE,EAAEzI,CAAC,GAAKA,KAAK,CACtC,GAAIA,GAAK,GAAI,KACf,CAEAA,EAAIyI,EACJA,EAAI1I,EACJA,EAAIiB,EACJA,EAAIhB,EACJ4B,GACF,CAEA,OAAArD,EAAW,GACXyC,EAAE,EAAE,OAASnB,EAAI,EAEVmB,CACT,CAIA,SAASS,GAAQmE,EAAGjF,EAAG,CAErB,QADIE,EAAI+E,EACD,EAAEjF,GAAGE,GAAK+E,EACjB,OAAO/E,CACT,CAIA,SAASH,GAAiBZ,EAAML,EAAG,CACjC,IAAI,EACFiJ,EAAQjJ,EAAE,EAAI,EACdkJ,EAAKzG,GAAMpC,EAAMA,EAAK,UAAW,CAAC,EAClCuC,EAASsG,EAAG,MAAM,EAAG,EAIvB,GAFAlJ,EAAIA,EAAE,IAAI,EAENA,EAAE,IAAI4C,CAAM,EACd,OAAA/D,GAAWoK,EAAQ,EAAI,EAChBjJ,EAKT,GAFA,EAAIA,EAAE,SAASkJ,CAAE,EAEb,EAAE,OAAO,EACXrK,GAAWoK,EAAQ,EAAI,MAClB,CAIL,GAHAjJ,EAAIA,EAAE,MAAM,EAAE,MAAMkJ,CAAE,CAAC,EAGnBlJ,EAAE,IAAI4C,CAAM,EACd,OAAA/D,GAAWkJ,GAAM,CAAC,EAAKkB,EAAQ,EAAI,EAAMA,EAAQ,EAAI,EAC9CjJ,EAGTnB,GAAWkJ,GAAM,CAAC,EAAKkB,EAAQ,EAAI,EAAMA,EAAQ,EAAI,CACvD,CAEA,OAAOjJ,EAAE,MAAMkJ,CAAE,EAAE,IAAI,CACzB,CAQA,SAAS7E,GAAerE,EAAG0F,EAASpE,EAAIP,EAAI,CAC1C,IAAIiC,EAAM9B,EAAGiB,EAAG/B,EAAG0B,EAAK0F,EAAShD,EAAK9D,EAAI,EACxCL,EAAOL,EAAE,YACT2H,EAAQrG,IAAO,OAWjB,GATIqG,GACFpD,GAAWjD,EAAI,EAAG/C,EAAU,EACxBwC,IAAO,OAAQA,EAAKV,EAAK,SACxBkE,GAAWxD,EAAI,EAAG,CAAC,IAExBO,EAAKjB,EAAK,UACVU,EAAKV,EAAK,UAGR,CAACL,EAAE,SAAS,EACdwE,EAAMoD,GAAkB5H,CAAC,MACpB,CAoCL,IAnCAwE,EAAMC,GAAezE,CAAC,EACtBmC,EAAIqC,EAAI,QAAQ,GAAG,EAOfmD,GACF3E,EAAO,EACH0C,GAAW,GACbpE,EAAKA,EAAK,EAAI,EACLoE,GAAW,IACpBpE,EAAKA,EAAK,EAAI,IAGhB0B,EAAO0C,EAOLvD,GAAK,IACPqC,EAAMA,EAAI,QAAQ,IAAK,EAAE,EACzB,EAAI,IAAInE,EAAK,CAAC,EACd,EAAE,EAAImE,EAAI,OAASrC,EACnB,EAAE,EAAIqD,GAAYf,GAAe,CAAC,EAAG,GAAIzB,CAAI,EAC7C,EAAE,EAAI,EAAE,EAAE,QAGZtC,EAAK8E,GAAYhB,EAAK,GAAIxB,CAAI,EAC9B9B,EAAIY,EAAMpB,EAAG,OAGNA,EAAG,EAAEoB,CAAG,GAAK,GAAIpB,EAAG,IAAI,EAE/B,GAAI,CAACA,EAAG,CAAC,EACP8D,EAAMmD,EAAQ,OAAS,QAClB,CAyBL,GAxBIxF,EAAI,EACNjB,KAEAlB,EAAI,IAAIK,EAAKL,CAAC,EACdA,EAAE,EAAIU,EACNV,EAAE,EAAIkB,EACNlB,EAAI2B,GAAO3B,EAAG,EAAGsB,EAAIP,EAAI,EAAGiC,CAAI,EAChCtC,EAAKV,EAAE,EACPkB,EAAIlB,EAAE,EACNwH,EAAU5I,IAIZuD,EAAIzB,EAAGY,CAAE,EACTlB,EAAI4C,EAAO,EACXwE,EAAUA,GAAW9G,EAAGY,EAAK,CAAC,IAAM,OAEpCkG,EAAUzG,EAAK,GACVoB,IAAM,QAAUqF,KAAazG,IAAO,GAAKA,KAAQf,EAAE,EAAI,EAAI,EAAI,IAChEmC,EAAI/B,GAAK+B,IAAM/B,IAAMW,IAAO,GAAKyG,GAAWzG,IAAO,GAAKL,EAAGY,EAAK,CAAC,EAAI,GACrEP,KAAQf,EAAE,EAAI,EAAI,EAAI,IAE1BU,EAAG,OAASY,EAERkG,EAGF,KAAO,EAAE9G,EAAG,EAAEY,CAAE,EAAI0B,EAAO,GACzBtC,EAAGY,CAAE,EAAI,EACJA,IACH,EAAEJ,EACFR,EAAG,QAAQ,CAAC,GAMlB,IAAKoB,EAAMpB,EAAG,OAAQ,CAACA,EAAGoB,EAAM,CAAC,EAAG,EAAEA,EAAI,CAG1C,IAAKK,EAAI,EAAGqC,EAAM,GAAIrC,EAAIL,EAAKK,IAAKqC,GAAOhG,GAAS,OAAOkC,EAAGyB,CAAC,CAAC,EAGhE,GAAIwF,EAAO,CACT,GAAI7F,EAAM,EACR,GAAI4D,GAAW,IAAMA,GAAW,EAAG,CAEjC,IADAvD,EAAIuD,GAAW,GAAK,EAAI,EACnB,EAAE5D,EAAKA,EAAMK,EAAGL,IAAO0C,GAAO,IAEnC,IADA9D,EAAK8E,GAAYhB,EAAKxB,EAAM0C,CAAO,EAC9B5D,EAAMpB,EAAG,OAAQ,CAACA,EAAGoB,EAAM,CAAC,EAAG,EAAEA,EAAI,CAG1C,IAAKK,EAAI,EAAGqC,EAAM,KAAMrC,EAAIL,EAAKK,IAAKqC,GAAOhG,GAAS,OAAOkC,EAAGyB,CAAC,CAAC,CACpE,MACEqC,EAAMA,EAAI,OAAO,CAAC,EAAI,IAAMA,EAAI,MAAM,CAAC,EAI3CA,EAAOA,GAAOtD,EAAI,EAAI,IAAM,MAAQA,CACtC,SAAWA,EAAI,EAAG,CAChB,KAAO,EAAEA,GAAIsD,EAAM,IAAMA,EACzBA,EAAM,KAAOA,CACf,SACM,EAAEtD,EAAIY,EAAK,IAAKZ,GAAKY,EAAKZ,KAAOsD,GAAO,SACnCtD,EAAIY,IAAK0C,EAAMA,EAAI,MAAM,EAAGtD,CAAC,EAAI,IAAMsD,EAAI,MAAMtD,CAAC,EAE/D,CAEAsD,GAAOkB,GAAW,GAAK,KAAOA,GAAW,EAAI,KAAOA,GAAW,EAAI,KAAO,IAAMlB,CAClF,CAEA,OAAOxE,EAAE,EAAI,EAAI,IAAMwE,EAAMA,CAC/B,CAIA,SAASsD,GAASnC,EAAK7D,EAAK,CAC1B,GAAI6D,EAAI,OAAS7D,EACf,OAAA6D,EAAI,OAAS7D,EACN,EAEX,CAyDA,SAASqH,GAAInJ,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CASA,SAASoJ,GAAKpJ,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAASqJ,GAAMrJ,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,MAAM,CAC3B,CAWA,SAASsJ,GAAItJ,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,KAAKM,CAAC,CAC3B,CAUA,SAASiJ,GAAKvJ,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAASwJ,GAAMxJ,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,MAAM,CAC3B,CAUA,SAASyJ,GAAKzJ,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAAS0J,GAAM1J,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,MAAM,CAC3B,CA4BA,SAAS2J,GAAMrJ,EAAGN,EAAG,CACnBM,EAAI,IAAI,KAAKA,CAAC,EACdN,EAAI,IAAI,KAAKA,CAAC,EACd,IAAI8C,EACFhC,EAAK,KAAK,UACVC,EAAK,KAAK,SACV2B,EAAM5B,EAAK,EAGb,MAAI,CAACR,EAAE,GAAK,CAACN,EAAE,EACb8C,EAAI,IAAI,KAAK,GAAG,EAGP,CAACxC,EAAE,GAAK,CAACN,EAAE,GACpB8C,EAAIL,GAAM,KAAMC,EAAK,CAAC,EAAE,MAAM1C,EAAE,EAAI,EAAI,IAAO,GAAI,EACnD8C,EAAE,EAAIxC,EAAE,GAGC,CAACN,EAAE,GAAKM,EAAE,OAAO,GAC1BwC,EAAI9C,EAAE,EAAI,EAAIyC,GAAM,KAAM3B,EAAIC,CAAE,EAAI,IAAI,KAAK,CAAC,EAC9C+B,EAAE,EAAIxC,EAAE,GAGC,CAACA,EAAE,GAAKN,EAAE,OAAO,GAC1B8C,EAAIL,GAAM,KAAMC,EAAK,CAAC,EAAE,MAAM,EAAG,EACjCI,EAAE,EAAIxC,EAAE,GAGCN,EAAE,EAAI,GACf,KAAK,UAAY0C,EACjB,KAAK,SAAW,EAChBI,EAAI,KAAK,KAAKnB,GAAOrB,EAAGN,EAAG0C,EAAK,CAAC,CAAC,EAClC1C,EAAIyC,GAAM,KAAMC,EAAK,CAAC,EACtB,KAAK,UAAY5B,EACjB,KAAK,SAAWC,EAChB+B,EAAIxC,EAAE,EAAI,EAAIwC,EAAE,MAAM9C,CAAC,EAAI8C,EAAE,KAAK9C,CAAC,GAEnC8C,EAAI,KAAK,KAAKnB,GAAOrB,EAAGN,EAAG0C,EAAK,CAAC,CAAC,EAG7BI,CACT,CAUA,SAAS8G,GAAK5J,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CASA,SAAS6J,GAAK7J,EAAG,CACf,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,CAAC,CAC7C,CAWA,SAAS8J,GAAM9J,EAAGE,EAAKC,EAAK,CAC1B,OAAO,IAAI,KAAKH,CAAC,EAAE,MAAME,EAAKC,CAAG,CACnC,CAqBA,SAAS4J,GAAOC,EAAK,CACnB,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,MAAM,MAAMjL,GAAe,iBAAiB,EACjF,IAAI,EAAG6J,EAAGqB,EACRC,EAAcF,EAAI,WAAa,GAC/BG,EAAK,CACH,YAAa,EAAG5L,GAChB,WAAY,EAAG,EACf,WAAY,CAACD,GAAW,EACxB,WAAY,EAAGA,GACf,OAAQ,EAAGA,GACX,OAAQ,CAACA,GAAW,EACpB,SAAU,EAAG,CACf,EAEF,IAAK,EAAI,EAAG,EAAI6L,EAAG,OAAQ,GAAK,EAE9B,GADIvB,EAAIuB,EAAG,CAAC,EAAGD,IAAa,KAAKtB,CAAC,EAAIjK,GAASiK,CAAC,IAC3CqB,EAAID,EAAIpB,CAAC,KAAO,OACnB,GAAIxJ,GAAU6K,CAAC,IAAMA,GAAKA,GAAKE,EAAG,EAAI,CAAC,GAAKF,GAAKE,EAAG,EAAI,CAAC,EAAG,KAAKvB,CAAC,EAAIqB,MACjE,OAAM,MAAMjL,GAAkB4J,EAAI,KAAOqB,CAAC,EAKnD,GADIrB,EAAI,SAAUsB,IAAa,KAAKtB,CAAC,EAAIjK,GAASiK,CAAC,IAC9CqB,EAAID,EAAIpB,CAAC,KAAO,OACnB,GAAIqB,IAAM,IAAQA,IAAM,IAASA,IAAM,GAAKA,IAAM,EAChD,GAAIA,EACF,GAAI,OAAO,OAAU,KAAe,SACjC,OAAO,iBAAmB,OAAO,aAClC,KAAKrB,CAAC,EAAI,OAEV,OAAM,MAAM1J,EAAiB,OAG/B,KAAK0J,CAAC,EAAI,OAGZ,OAAM,MAAM5J,GAAkB4J,EAAI,KAAOqB,CAAC,EAI9C,OAAO,IACT,CAUA,SAASG,GAAIpK,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CAUA,SAASqK,GAAKrK,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAQA,SAASsK,GAAMN,EAAK,CAClB,IAAI,EAAGpB,EAAGuB,EASV,SAAStB,EAAQoB,EAAG,CAClB,IAAI/I,EAAGiB,EAAGZ,EACRvB,EAAI,KAGN,GAAI,EAAEA,aAAa6I,GAAU,OAAO,IAAIA,EAAQoB,CAAC,EAMjD,GAFAjK,EAAE,YAAc6I,EAEZ0B,GAAkBN,CAAC,EAAG,CACxBjK,EAAE,EAAIiK,EAAE,EAEJnL,EACE,CAACmL,EAAE,GAAKA,EAAE,EAAIpB,EAAQ,MAGxB7I,EAAE,EAAI,IACNA,EAAE,EAAI,MACGiK,EAAE,EAAIpB,EAAQ,MAGvB7I,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,IAERA,EAAE,EAAIiK,EAAE,EACRjK,EAAE,EAAIiK,EAAE,EAAE,MAAM,IAGlBjK,EAAE,EAAIiK,EAAE,EACRjK,EAAE,EAAIiK,EAAE,EAAIA,EAAE,EAAE,MAAM,EAAIA,EAAE,GAG9B,MACF,CAIA,GAFA1I,EAAI,OAAO0I,EAEP1I,IAAM,SAAU,CAClB,GAAI0I,IAAM,EAAG,CACXjK,EAAE,EAAI,EAAIiK,EAAI,EAAI,GAAK,EACvBjK,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,EACR,MACF,CAUA,GARIiK,EAAI,GACNA,EAAI,CAACA,EACLjK,EAAE,EAAI,IAENA,EAAE,EAAI,EAIJiK,IAAM,CAAC,CAACA,GAAKA,EAAI,IAAK,CACxB,IAAK/I,EAAI,EAAGiB,EAAI8H,EAAG9H,GAAK,GAAIA,GAAK,GAAIjB,IAEjCpC,EACEoC,EAAI2H,EAAQ,MACd7I,EAAE,EAAI,IACNA,EAAE,EAAI,MACGkB,EAAI2H,EAAQ,MACrB7I,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,IAERA,EAAE,EAAIkB,EACNlB,EAAE,EAAI,CAACiK,CAAC,IAGVjK,EAAE,EAAIkB,EACNlB,EAAE,EAAI,CAACiK,CAAC,GAGV,MACF,CAGA,GAAIA,EAAI,IAAM,EAAG,CACVA,IAAGjK,EAAE,EAAI,KACdA,EAAE,EAAI,IACNA,EAAE,EAAI,KACN,MACF,CAEA,OAAOwI,GAAaxI,EAAGiK,EAAE,SAAS,CAAC,CACrC,CAEA,GAAI1I,IAAM,SACR,OAAKY,EAAI8H,EAAE,WAAW,CAAC,KAAO,IAC5BA,EAAIA,EAAE,MAAM,CAAC,EACbjK,EAAE,EAAI,KAEFmC,IAAM,KAAI8H,EAAIA,EAAE,MAAM,CAAC,GAC3BjK,EAAE,EAAI,GAGDP,GAAU,KAAKwK,CAAC,EAAIzB,GAAaxI,EAAGiK,CAAC,EAAIxB,GAAWzI,EAAGiK,CAAC,EAGjE,GAAI1I,IAAM,SACR,OAAI0I,EAAI,GACNA,EAAI,CAACA,EACLjK,EAAE,EAAI,IAENA,EAAE,EAAI,EAGDwI,GAAaxI,EAAGiK,EAAE,SAAS,CAAC,EAGrC,MAAM,MAAMjL,GAAkBiL,CAAC,CACjC,CA2DA,GAzDApB,EAAQ,UAAY9I,EAEpB8I,EAAQ,SAAW,EACnBA,EAAQ,WAAa,EACrBA,EAAQ,WAAa,EACrBA,EAAQ,YAAc,EACtBA,EAAQ,cAAgB,EACxBA,EAAQ,gBAAkB,EAC1BA,EAAQ,gBAAkB,EAC1BA,EAAQ,gBAAkB,EAC1BA,EAAQ,iBAAmB,EAC3BA,EAAQ,OAAS,EAEjBA,EAAQ,OAASA,EAAQ,IAAMkB,GAC/BlB,EAAQ,MAAQyB,GAChBzB,EAAQ,UAAY0B,GAEpB1B,EAAQ,IAAMM,GACdN,EAAQ,KAAOO,GACfP,EAAQ,MAAQQ,GAChBR,EAAQ,IAAMS,GACdT,EAAQ,KAAOU,GACfV,EAAQ,MAAQW,GAChBX,EAAQ,KAAOY,GACfZ,EAAQ,MAAQa,GAChBb,EAAQ,MAAQc,GAChBd,EAAQ,KAAOe,GACff,EAAQ,KAAOgB,GACfhB,EAAQ,MAAQiB,GAChBjB,EAAQ,IAAMuB,GACdvB,EAAQ,KAAOwB,GACfxB,EAAQ,IAAM2B,GACd3B,EAAQ,IAAM4B,GACd5B,EAAQ,MAAQ6B,GAChB7B,EAAQ,MAAQ8B,GAChB9B,EAAQ,GAAK+B,GACb/B,EAAQ,IAAMgC,GACdhC,EAAQ,MAAQiC,GAChBjC,EAAQ,KAAOkC,GACflC,EAAQ,IAAM1I,GACd0I,EAAQ,IAAM3I,GACd2I,EAAQ,IAAMmC,GACdnC,EAAQ,IAAMoC,GACdpC,EAAQ,IAAMX,GACdW,EAAQ,OAASqC,GACjBrC,EAAQ,MAAQsC,GAChBtC,EAAQ,KAAOxB,GACfwB,EAAQ,IAAMuC,GACdvC,EAAQ,KAAOwC,GACfxC,EAAQ,KAAOyC,GACfzC,EAAQ,IAAM0C,GACd1C,EAAQ,IAAMV,GACdU,EAAQ,IAAM2C,GACd3C,EAAQ,KAAO4C,GACf5C,EAAQ,MAAQ6C,GAEZ1B,IAAQ,SAAQA,EAAM,CAAC,GACvBA,GACEA,EAAI,WAAa,GAEnB,IADAG,EAAK,CAAC,YAAa,WAAY,WAAY,WAAY,OAAQ,OAAQ,SAAU,QAAQ,EACpF,EAAI,EAAG,EAAIA,EAAG,QAAcH,EAAI,eAAepB,EAAIuB,EAAG,GAAG,CAAC,IAAGH,EAAIpB,CAAC,EAAI,KAAKA,CAAC,GAIrF,OAAAC,EAAQ,OAAOmB,CAAG,EAEXnB,CACT,CAWA,SAAS2B,GAAIxK,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAUA,SAASmK,GAAIzK,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CASA,SAAS0K,GAAM1K,EAAG,CAChB,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,CAAC,CAC7C,CAYA,SAAS2K,IAAQ,CACf,IAAIxI,EAAGf,EACL,EAAI,IAAI,KAAK,CAAC,EAIhB,IAFAtC,EAAW,GAENqD,EAAI,EAAGA,EAAI,UAAU,QAExB,GADAf,EAAI,IAAI,KAAK,UAAUe,GAAG,CAAC,EACtBf,EAAE,EAMI,EAAE,IACX,EAAI,EAAE,KAAKA,EAAE,MAAMA,CAAC,CAAC,OAPb,CACR,GAAIA,EAAE,EACJ,OAAAtC,EAAW,GACJ,IAAI,KAAK,GAAK,EAEvB,EAAIsC,CACN,CAKF,OAAAtC,EAAW,GAEJ,EAAE,KAAK,CAChB,CAQA,SAASyL,GAAkBP,EAAK,CAC9B,OAAOA,aAAenB,IAAWmB,GAAOA,EAAI,cAAgB7K,IAAO,EACrE,CAUA,SAASyL,GAAG5K,EAAG,CACb,OAAO,IAAI,KAAKA,CAAC,EAAE,GAAG,CACxB,CAaA,SAAS6K,GAAI7K,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAUA,SAASyK,GAAK/K,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CAAC,CAC1B,CAUA,SAAS8K,GAAM9K,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,EAAE,CAC3B,CASA,SAASG,IAAM,CACb,OAAO6H,GAAS,KAAM,UAAW,EAAE,CACrC,CASA,SAAS9H,IAAM,CACb,OAAO8H,GAAS,KAAM,UAAW,CAAC,CACpC,CAWA,SAASgD,GAAIhL,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAWA,SAAS2K,GAAIjL,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAWA,SAAS4H,GAAIlI,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAWA,SAAS4K,GAAO5J,EAAI,CAClB,IAAIO,EAAGX,EAAGd,EAAGgB,EACXe,EAAI,EACJW,EAAI,IAAI,KAAK,CAAC,EACdyC,EAAK,CAAC,EAOR,GALIjE,IAAO,OAAQA,EAAK,KAAK,UACxBiD,GAAWjD,EAAI,EAAG/C,EAAU,EAEjC6B,EAAI,KAAK,KAAKkB,EAAK3B,CAAQ,EAEtB,KAAK,OAIH,GAAI,OAAO,gBAGhB,IAFAkC,EAAI,OAAO,gBAAgB,IAAI,YAAYzB,CAAC,CAAC,EAEtC+B,EAAI/B,GACTgB,EAAIS,EAAEM,CAAC,EAIHf,GAAK,MACPS,EAAEM,CAAC,EAAI,OAAO,gBAAgB,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAKnDoD,EAAGpD,GAAG,EAAIf,EAAI,YAKT,OAAO,YAAa,CAK7B,IAFAS,EAAI,OAAO,YAAYzB,GAAK,CAAC,EAEtB+B,EAAI/B,GAGTgB,EAAIS,EAAEM,CAAC,GAAKN,EAAEM,EAAI,CAAC,GAAK,IAAMN,EAAEM,EAAI,CAAC,GAAK,MAAQN,EAAEM,EAAI,CAAC,EAAI,MAAS,IAGlEf,GAAK,MACP,OAAO,YAAY,CAAC,EAAE,KAAKS,EAAGM,CAAC,GAK/BoD,EAAG,KAAKnE,EAAI,GAAG,EACfe,GAAK,GAITA,EAAI/B,EAAI,CACV,KACE,OAAM,MAAMlB,EAAiB,MA9C7B,MAAOiD,EAAI/B,GAAImF,EAAGpD,GAAG,EAAI,KAAK,OAAO,EAAI,IAAM,EA2DjD,IAVA/B,EAAImF,EAAG,EAAEpD,CAAC,EACVb,GAAM3B,EAGFS,GAAKkB,IACPF,EAAI/B,GAAQ,GAAIM,EAAW2B,CAAE,EAC7BiE,EAAGpD,CAAC,GAAK/B,EAAIgB,EAAI,GAAKA,GAIjBmE,EAAGpD,CAAC,IAAM,EAAGA,IAAKoD,EAAG,IAAI,EAGhC,GAAIpD,EAAI,EACNjB,EAAI,EACJqE,EAAK,CAAC,CAAC,MACF,CAIL,IAHArE,EAAI,GAGGqE,EAAG,CAAC,IAAM,EAAGrE,GAAKvB,EAAU4F,EAAG,MAAM,EAG5C,IAAKnF,EAAI,EAAGgB,EAAImE,EAAG,CAAC,EAAGnE,GAAK,GAAIA,GAAK,GAAIhB,IAGrCA,EAAIT,IAAUuB,GAAKvB,EAAWS,EACpC,CAEA,OAAA0C,EAAE,EAAI5B,EACN4B,EAAE,EAAIyC,EAECzC,CACT,CAWA,SAASqI,GAAMnL,EAAG,CAChB,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,KAAK,QAAQ,CACzD,CAcA,SAASqH,GAAKrH,EAAG,CACf,OAAAA,EAAI,IAAI,KAAKA,CAAC,EACPA,EAAE,EAAKA,EAAE,EAAE,CAAC,EAAIA,EAAE,EAAI,EAAIA,EAAE,EAAKA,EAAE,GAAK,GACjD,CAUA,SAASoL,GAAIpL,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CAUA,SAASqL,GAAKrL,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAASsL,GAAKtL,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAWA,SAASuL,GAAIvL,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAYA,SAAS6H,IAAM,CACb,IAAIhG,EAAI,EACN8F,EAAO,UACPjI,EAAI,IAAI,KAAKiI,EAAK9F,CAAC,CAAC,EAGtB,IADArD,EAAW,GACJkB,EAAE,GAAK,EAAEmC,EAAI8F,EAAK,QAASjI,EAAIA,EAAE,KAAKiI,EAAK9F,CAAC,CAAC,EACpD,OAAArD,EAAW,GAEJmB,EAASD,EAAG,KAAK,UAAW,KAAK,QAAQ,CAClD,CAUA,SAASwL,GAAIxL,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CAUA,SAASyL,GAAKzL,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CASA,SAAS0L,GAAM1L,EAAG,CAChB,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,CAAC,CAC7C,CAGAD,EAAE,OAAO,IAAI,4BAA4B,CAAC,EAAIA,EAAE,SAChDA,EAAE,OAAO,WAAW,EAAI,UAGjB,IAAI8I,GAAU9I,EAAE,YAAcuK,GAAM3L,EAAQ,EAGnDF,GAAO,IAAIoK,GAAQpK,EAAI,EACvBC,GAAK,IAAImK,GAAQnK,EAAE,EAEnB,IAAOiN,EAAQ9C,GCzrJR,IAAK+C,QACVA,IAAA,eACAA,IAAA,iBACAA,IAAA,mBAHUA,QAAA,ICxHZ,IAAAC,EAA0C,qCCAnC,IAAMC,GAAuB,IAEvBC,GAAa,QAEbC,GAAa,OAEbC,GAAkB,IAElBC,GAAqB,IAErBC,GAAqB,IAErBC,GAAY,QAEZC,GAAe,IAEfC,GAAgB,IAEhBC,GAAc,IAEdC,GAAgB,OAEhBC,GAAyB,WDlBtC,IAAAC,GAAe,SAIf,IAAMC,GAAkB,IAAI,GAAAC,QAAG,MAAO,EACzBC,EAAe,GACfC,GAAM,IAAI,GAAAF,QAAG,CAAC,EAAE,KAAKC,CAAY,EACxCE,GAAM,IAAI,GAAAH,QAAG,CAAC,EAAE,IAAI,IAAI,GAAAA,QAAG,GAAG,CAAC,EAAE,IAAI,IAAI,GAAAA,QAAG,CAAC,CAAC,EAEvCI,EAAN,MAAMC,CAAS,CAQpB,OAAO,sBAAsBC,EAAkCC,EAAsBC,EAA0C,CAC7H,IAAMC,EAAiBJ,EAAS,iBAAiBE,EAAcC,CAAY,EAC3E,GAAIC,GAAkB,EACpB,MAAO,CAACH,CAAc,EAGxB,IAAMI,EAAgC,CAAC,EACnCC,EAAgBJ,EAEpB,QAASK,EAAI,EAAGA,EAAIH,EAAgBG,IAAK,CACvC,IAAMC,EAAgB,KAAK,IAAIF,EAAgB,IAAuB,EAAGH,CAAY,EAC/EM,EAAgBR,EAAe,KAAK,OAAQS,GAAQA,EAAI,QAAUJ,GAAiBI,EAAI,QAAUF,CAAa,EAEpHH,EAAU,KAAK,CACb,KAAMI,EACN,SAAUA,EAAc,OAAO,CAACE,EAAKD,OAAQ,KAAEC,CAAG,EAAE,KAAKD,EAAI,QAAQ,KAAG,KAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EACvF,SAAUD,EAAc,OAAO,CAACE,EAAKD,OAAQ,KAAEC,CAAG,EAAE,KAAKD,EAAI,QAAQ,KAAG,KAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CACzF,CAAC,EAEDJ,EAAgBE,EAAgB,CAClC,CAEA,OAAOH,CACT,CAQA,OAAO,kBAAkBO,EAAmBC,EAAgC,CAC1E,IAAMC,EAAyB,CAAC,EAC5BC,KAAsB,KAAE,CAAC,EACzBC,KAAsB,KAAE,CAAC,EAE7B,OAAAJ,EAAK,QAASF,GAAQ,CACpB,GAAM,CAAE,SAAAO,EAAU,SAAAC,EAAU,UAAAC,EAAY,GAAI,EAAIT,EAC1CU,KAAiB,KAAEP,CAAI,EAAE,IAAIM,CAAS,EAAE,QAAQ,CAAC,EACnDE,KAAgB,KAAEJ,CAAQ,EAAE,IAAIJ,CAAI,EACpCS,KAAgB,KAAEJ,CAAQ,EAAE,IAAIL,CAAI,KAEpC,KAAEQ,CAAa,EAAE,GAAG,CAAC,MAAK,KAAEA,CAAa,EAAE,GAAG,CAAC,IACjDA,KAAgB,KAAE,CAAC,MAEjB,KAAEC,CAAa,EAAE,GAAG,CAAC,MAAK,KAAEA,CAAa,EAAE,GAAG,CAAC,IACjDA,KAAgB,KAAE,CAAC,GAGrBP,KAAsB,KAAEA,CAAmB,EAAE,KAAKM,CAAa,EAC/DL,KAAsB,KAAEA,CAAmB,EAAE,KAAKM,CAAa,EAE/DR,EAAU,KAAK,CACb,OAAQJ,EAAI,OACZ,SAAUW,EAAc,QAAQ,CAAC,EACjC,SAAUC,EAAc,QAAQ,CAAC,EACjC,kBAAmBZ,EAAI,kBACvB,UAAWU,CACb,CAAC,CACH,CAAC,EAEM,CACL,KAAMN,EACN,SAAUC,EAAoB,QAAQ,CAAC,EACvC,SAAUC,EAAoB,QAAQ,CAAC,CACzC,CACF,CAQA,OAAO,oBAAoBN,EAAgBa,EAA0B,CACnE,GAAM,CAAE,SAAAN,EAAU,SAAAC,EAAU,UAAAC,EAAY,GAAI,EAAIT,EAEhD,GAAIS,IAAc,IAChB,MAAO,CACL,SAAU,IACV,SAAU,GACZ,EAGF,MAAI,KAAEI,CAAgB,EAAE,OAAI,KAAEJ,CAAS,CAAC,EACtC,MAAO,CACL,SAAUF,EACV,SAAUC,CACZ,EAGF,IAAMM,KAAe,KAAED,CAAgB,EAAE,IAAIJ,CAAS,EAAE,IAAIF,CAAQ,EAAE,QAAQ,EAAGQ,EAAQ,WAAW,EAC9FC,KAAe,KAAEH,CAAgB,EAAE,IAAIJ,CAAS,EAAE,IAAID,CAAQ,EAAE,QAAQ,EAAGO,EAAQ,WAAW,EAEpG,MAAO,CACL,SAAUD,EACV,SAAUE,CACZ,CACF,CAQA,OAAO,iBAAiBxB,EAAsBC,EAAsB,CAElE,IAAMwB,KADW,KAAExB,CAAY,EAAE,IAAID,CAAY,EAAE,IAAI,CAAC,EACzB,IAAI,GAAoB,EACvD,OAAO,OAAOyB,EAAc,QAAQ,EAAGF,EAAQ,QAAQ,CAAC,CAC1D,CASA,OAAO,aAAaR,EAAkBC,EAAkBU,EAAwB,CAG9E,SAFW,KAAEA,CAAM,EAAE,IAAIX,CAAQ,EACZ,OAAI,KAAEC,CAAQ,EAAE,OAAI,KAAE,CAAC,EAAE,IAAItB,CAAY,CAAC,CAAC,EAC/C,QAAQ,CAAC,CAC5B,CAQA,OAAO,wBAAwBuB,EAAmBS,EAAwB,CACxE,SAAO,KAAET,CAAS,EAAE,OAAI,KAAES,CAAM,CAAC,EAAE,QAAQ,CAAC,CAC9C,CAOA,OAAO,wBAAwBT,EAA2B,CACxD,SAAO,KAAEA,CAAS,EAAE,OAAI,KAAE,CAAC,EAAE,IAAIvB,CAAY,CAAC,EAAE,QAAQ,CAAC,CAC3D,CAUA,OAAO,wBAAwBqB,EAAkBC,EAAkBW,EAAyBC,EAA4C,CAStI,MARI,KAAEA,CAAgB,EAAE,OAAO,GAC7BC,0BAAiD,0BAA0B,KAGzE,KAAEF,CAAe,EAAE,MAAG,KAAEC,CAAgB,CAAC,GAC3CC,0BAAiD,yBAAyB,KAGxE,KAAEF,CAAe,EAAE,OAAO,EAC5B,MAAO,CAAC,IAAK,GAAG,EAGlB,IAAIG,KACA,KAAEf,CAAQ,EAAE,OAAO,EACrBe,EAAe,IAEfA,KAAe,KAAEf,CAAQ,EAAE,OAAI,KAAEY,CAAe,CAAC,EAAE,OAAI,KAAEC,CAAgB,CAAC,EAAE,QAAQ,EAAGL,EAAQ,WAAW,EAG5G,IAAIQ,EACJ,SAAI,KAAEf,CAAQ,EAAE,OAAO,EACrBe,EAAe,IAEfA,KAAe,KAAEf,CAAQ,EAAE,OAAI,KAAEW,CAAe,CAAC,EAAE,OAAI,KAAEC,CAAgB,CAAC,EAAE,QAAQ,EAAGL,EAAQ,WAAW,EAGrG,CAACO,EAAcC,CAAY,CACpC,CAUA,OAAO,kBAAkBC,EAAgBC,EAAkBC,EAAmBC,EAA2B,CACvG,IAAMC,EAAkBtC,EAAS,4BAA4BkC,EAAQC,CAAQ,EAC7E,OAAOnC,EAAS,oBAAoBoC,EAAWC,EAAWC,CAAe,EAAE,SAAS,CACtF,CAQA,OAAO,4BAA4BJ,EAAgBC,EAA0B,CAC3E,IAAMI,EAAa,IAAId,EAAQU,CAAQ,EAAE,IAAI,IAAIV,EAAQ,GAAe,CAAC,EACzE,OAAO,IAAIA,EAAQ,CAAC,EAAE,IAAI,IAAIA,EAAQc,CAAU,CAAC,EAAE,IAAI,IAAId,EAAQS,CAAM,CAAC,EAAE,SAAS,CACvF,CAWA,OAAc,kBAAkBM,EAAeC,EAAiBC,EAAcN,EAAmBC,EAA2B,CAC1H,IAAMC,EAAkBtC,EAAS,mBAAmBoC,EAAWC,EAAWG,CAAK,EAC/E,OAAOxC,EAAS,yBAAyBsC,EAAiBG,EAASC,CAAG,CACxE,CASA,OAAc,yBAAyBJ,EAAyBG,EAAiBC,EAAsB,CACrG,IAAMH,EAAa,IAAId,EAAQgB,CAAO,EAAE,IAAI,IAAIhB,EAAQ,GAAe,CAAC,EAClEkB,EAAQ,IAAIlB,EAAQa,CAAe,EAAE,IAAI,EAAE,UAAU,IAAIb,EAAQ,CAAC,EAAE,IAAIc,CAAU,EAAE,IAAI,CAAC,EAC/F,OAAQG,EAAMC,EAAM,MAAM,EAAIA,EAAM,KAAK,GAAG,SAAS,CACvD,CASA,OAAc,mBAAmBP,EAAmBC,EAAmBG,EAAuB,CAC5F,OAAO,IAAIf,EAAQe,CAAK,EAAE,IAAI,IAAIf,EAAQ,KAAOY,EAAYD,EAAU,CAAC,EAAE,SAAS,CACrF,CASA,OAAc,oBAAoBA,EAAmBC,EAAmBC,EAAiC,CACvG,OAAO,IAAIb,EAAQa,CAAe,EAAE,IAAI,IAAIb,EAAQ,KAAOY,EAAYD,EAAU,CAAC,EAAE,SAAS,CAC/F,CAOA,OAAc,gBAAgBI,EAAuB,CACnD,OAAO,IAAIf,EAAQ,CAAC,EAAE,IAAIe,CAAK,EAAE,SAAS,CAC5C,CAQA,OAAO,gBAAgBG,EAAeF,EAAyB,CAC7D,IAAMG,EAAM,IAAI,GAAAjD,QAAG8C,CAAO,EAAE,KAAK7C,CAAY,EAAE,IAAI,IAAI,GAAAD,QAAG,GAAe,CAAC,EACpEkD,EAAOhD,GAAI,IAAI+C,CAAG,EACxB,OAAO5C,EAAS,IAAI6C,EAAM,IAAI,GAAAlD,QAAGgD,CAAK,CAAC,EAAE,SAAS,CACpD,CAOA,OAAO,6BAA6Bf,EAAwB,CAC1D,OAAO,WAAS,QAAQ,IAAI,GAAAjC,QAAGiC,CAAM,CAAC,EAAE,SAAS,CACnD,CAEA,OAAO,IAAIiB,EAAUC,EAAa,CAChC,IAAIC,EAASD,EAAI,MAAM,EAEvB,GAAIA,EAAI,OAAO,EACb,OAAOjD,GAKT,GAFAiD,EAAMC,EAASD,EAAI,IAAI,EAAIA,EAEvBA,EAAI,GAAGpD,EAAe,EACxB,OAAO,IAAI,GAAAC,QAAG,CAAC,EAGjB,IAAIqD,EAAcH,EACdI,EAASpD,GAuHb,OArHImD,EAAY,IAAIC,CAAM,IACxBD,EAAclD,GAAI,IAAIkD,CAAW,EACjCD,EAAS,CAACA,GAGPD,EAAI,IAAI,IAAI,GAAAnD,QAAG,CAAG,CAAC,EAAE,OAAO,IAC/BsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,CAAG,CAAC,EAAE,OAAO,IAC/BsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,CAAG,CAAC,EAAE,OAAO,IAC/BsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,CAAG,CAAC,EAAE,OAAO,IAC/BsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,EAAI,CAAC,EAAE,OAAO,IAChCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,EAAI,CAAC,EAAE,OAAO,IAChCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,EAAI,CAAC,EAAE,OAAO,IAChCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,GAAI,CAAC,EAAE,OAAO,IAChCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,GAAK,CAAC,EAAE,OAAO,IACjCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,GAAK,CAAC,EAAE,OAAO,IACjCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,IAAK,CAAC,EAAE,OAAO,IACjCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,IAAK,CAAC,EAAE,OAAO,IACjCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,IAAM,CAAC,EAAE,OAAO,IAClCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,IAAM,CAAC,EAAE,OAAO,IAClCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,KAAM,CAAC,EAAE,OAAO,IAClCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,KAAM,CAAC,EAAE,OAAO,IAClCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,KAAO,CAAC,EAAE,OAAO,IACnCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,MAAO,CAAC,EAAE,OAAO,IACnCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGpDoD,EAAcA,EAAY,IAAIA,CAAW,EAAE,KAAKpD,CAAY,EAEvDkD,EAAI,IAAI,IAAI,GAAAnD,QAAG,MAAO,CAAC,EAAE,OAAO,IACnCsD,EAASA,EAAO,IAAID,CAAW,EAAE,KAAKpD,CAAY,GAGhDqD,EAAO,OAAO,EACT,IAAI,GAAAtD,QAAG,CAAC,GAGboD,IACFE,EAASnD,GAAI,IAAImD,CAAM,GAGlBA,EACT,CAQA,OAAO,SAASN,EAAuB,CACrC,IAAMO,EAAQ,OAAOP,CAAK,EAAIQ,GAC9B,OAAID,EAAQ,IAAMA,EAAQC,GAAY,KACpCpB,iBAAwC,IAAI,MAAM,gBAAgB,EAAG,CACnE,CAAC,eAAa,WAAW,EAAG,WAC5B,CAAC,eAAa,cAAc,EAAG,CAAE,MAAAY,CAAM,CACzC,CAAC,EAGIO,EAAM,SAAS,CACxB,CAQA,OAAO,aAAaA,EAAuB,CACzC,IAAMP,EAAQ,OAAOO,CAAK,EAAIC,GAC9B,OAAIR,EAAQ,CAACQ,IAAaR,EAAQQ,KAChCpB,iBAAwC,IAAI,MAAM,eAAe,EAAG,CAClE,CAAC,eAAa,WAAW,EAAG,eAC5B,CAAC,eAAa,cAAc,EAAG,CAAE,MAAAmB,CAAM,CACzC,CAAC,EAGI,OAAOP,CAAK,CACrB,CAQA,OAAO,mBAAmBO,EAAiC,CACzD,IAAME,EAAc,OAAOF,CAAK,EAC1BG,EAAaD,GAAe,GAC5BE,EAAgB,OAAOF,EAAc,IAAI,EAE/C,MAAO,CAACC,EAAW,SAAS,EAAGC,CAAa,CAC9C,CAEA,OAAO,gBAAgBb,EAAiB,CACtC,IAAMI,EAAO,EAAIJ,EAAU,IAErBc,EADqB,IAAI9B,EAAQ,sBAAsB,EAChC,IAAI,EAAE,EAAE,IAAI,IAAIA,EAAQoB,CAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAEtEW,EAAWD,EAAE,IAAI,EACjBE,EAAWF,EAEXG,KAAY,KAAE,CAAC,EACfC,KAAY,KAAE,yCAAyC,EAE3D,OAAa,CACX,IAAM/B,KAAS,KAAE5B,EAAS,gBAAgBwD,EAAS,SAAS,EAAGf,CAAO,CAAC,EACvE,GAAIb,EAAO,GAAG8B,CAAS,GAAK,CAAC9B,EAAO,OAAO,EACzC,MAEA4B,EAAWA,EAAS,IAAI,CAAC,CAE7B,CAEA,OAAa,CACX,IAAM5B,KAAS,KAAE5B,EAAS,gBAAgByD,EAAS,SAAS,EAAGhB,CAAO,CAAC,EACvE,GAAIb,EAAO,GAAG+B,CAAS,GAAK,CAAC/B,EAAO,OAAO,EACzC,MAEA6B,EAAWA,EAAS,IAAI,CAAC,CAE7B,CAEA,MAAO,CACL,SAAUD,EAAS,SAAS,EAC5B,SAAUC,EAAS,SAAS,CAC9B,CACF,CAEA,OAAO,YAAYG,EAAmBzB,EAAkB0B,EAAoC,CAC1F,IAAMrB,EAAQxC,EAAS,4BAA4B4D,EAAWzB,CAAQ,EAChE2B,KAAc,KAAEtB,CAAK,EACxB,IAAI,EAAIqB,CAAkB,EAC1B,SAAS,EACNE,EAAqB/D,EAAS,yBAAyB8D,EAAa3B,EAAU,EAAI,EAClF6B,KAAY,KAAED,CAAkB,EAAE,IAAIH,CAAS,EAAE,IAAI,EAAE,QAAQ,EAAGnC,EAAQ,QAAQ,EAExF,eAAQ,IAAI,uBAAwB,CAClC,UAAAmC,EACA,UAAAI,CACF,CAAC,EACM,OAAOA,CAAS,CACzB,CACF,EH/fA,IAAAC,GAAoB,2BACpBC,GAAwB,mBAOjB,SAASC,GAAkBC,EAA8B,CAC9D,GAAI,CACF,IAAMC,EAASD,EAAK,WAQpB,MAP2B,CACzB,GAAIC,EAAO,QACX,SAAU,OAAOA,EAAO,QAAQ,EAChC,eAAa,eAAYA,EAAO,YAAa,EAAK,EAClD,eAAa,eAAYA,EAAO,YAAa,EAAK,CACpD,CAGF,OAASC,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,eAAa,WAAW,EAAG,oBAC5B,CAAC,eAAa,cAAc,EAAGF,CACjC,CAAC,CACH,CACF,CAOO,SAASI,GAAcJ,EAAmC,CAC/D,GAAI,CACF,IAAMC,KAAS,mBAAgBD,CAAI,EAC7BK,KAAO,iBAAcL,CAAI,EACzBM,KAAa,4BAAyBD,CAAI,EAE1CE,EAA0B,CAC9B,SAAUN,EAAO,YAAY,OAAO,SACpC,mBAAoBA,EAAO,YAAY,OAAO,KAAK,OAAO,GAAG,GAC7D,KAAMA,EAAO,YAAY,OAAO,KAAK,OAAO,IAC9C,EAEMO,EAAoC,CACxC,SAAUP,EAAO,iBAAiB,OAAO,SACzC,eAAgBA,EAAO,iBAAiB,OAAO,eAC/C,gBAAiBA,EAAO,iBAAiB,OAAO,UAAU,OAAO,GAAG,GACpE,KAAMA,EAAO,iBAAiB,OAAO,UAAU,OAAO,IACxD,EAEMQ,EAAwBR,EAAO,eAAe,OAE9CS,EAAUD,EAAsB,QAAQ,IAAKE,GAAgB,CACjE,IAAMC,EAAsBD,EAAO,OAAO,sBACpCE,EAAuB,WAAS,QAAQ,IAAI,GAAAC,QAAGF,CAAmB,CAAC,EACnEG,EAAoB,KAAK,MAAMF,EAAqB,SAAS,EAAI,GAAK,GAAK,EAAE,EAAE,SAAS,EAW9F,MATqB,CACnB,eAAa,eAAYF,EAAO,OAAO,YAAY,OAAO,KAAM,EAAK,EACrE,qBAAsBE,EAAqB,SAAS,EACpD,kBAAAE,EACA,sBAAuB,CACrB,GAAIJ,EAAO,OAAO,sBAAsB,OAAO,GAAG,GAClD,KAAMA,EAAO,OAAO,sBAAsB,OAAO,IACnD,CACF,CAEF,CAAC,EACKK,EAAgC,CACpC,UAAWP,EAAsB,UACjC,uBAAwBA,EAAsB,uBAC9C,MAAO,CACL,GAAIA,EAAsB,MAAM,OAAO,GAAG,GAC1C,KAAMA,EAAsB,MAAM,OAAO,IAC3C,EACA,QAAAC,EACA,kBAAmBD,EAAsB,iBAC3C,EAEMQ,EAA0C,CAC9C,uBAAwBhB,EAAO,aAAa,OAAO,uBACnD,qBAAsBA,EAAO,aAAa,OAAO,qBACjD,mBAAiB,UAAO,OAAOA,EAAO,aAAa,OAAO,gBAAgB,OAAO,IAAI,CAAC,EACtF,sBAAuBA,EAAO,aAAa,OAAO,sBAClD,gBAAiBA,EAAO,aAAa,OAAO,gBAAgB,MAC9D,EAEMiB,EAAiB,CACrB,GAAIjB,EAAO,GAAG,GACd,SAAU,OAAOA,EAAO,QAAQ,EAChC,eAAa,eAAYK,EAAW,eAAe,CAAC,EAAG,EAAK,EAC5D,eAAa,eAAYA,EAAW,eAAe,CAAC,EAAG,EAAK,EAC5D,UAAWD,EACX,MAAO,OAAOJ,EAAO,KAAK,EAC1B,YAAAM,EACA,oBAAAU,EACA,aAAW,UAAO,OAAOhB,EAAO,UAAU,OAAO,IAAI,CAAC,EACtD,YAAaA,EAAO,YAAY,OAChC,UAAWA,EAAO,UAClB,UAAWA,EAAO,UAClB,cAAeA,EAAO,cACtB,eAAgBA,EAAO,eACvB,eAAgBA,EAAO,eACvB,IAAKA,EAAO,IACZ,eAAAe,EACA,iBAAAR,CACF,EACA,OAAAU,EAAK,SAAWA,EAAK,YAAY,SAC1BA,CACT,OAAShB,EAAO,CACd,eAAQ,IAAI,qCAA+BA,CAAK,EACzCC,eAAsCD,EAAgB,CAC3D,CAAC,eAAa,WAAW,EAAG,gBAC5B,CAAC,eAAa,cAAc,EAAGF,CACjC,CAAC,CACH,CACF,CAEO,SAASmB,GAAanB,EAAkC,CAC7D,IAAMC,KAAS,mBAAgBD,CAAI,EAC7BK,KAAO,iBAAcL,CAAI,EACzBM,KAAa,4BAAyBD,CAAI,EAehD,MAbyB,CACvB,GAAIJ,EAAO,GAAG,GACd,KAAMA,EAAO,KACb,gBAAc,KAAEA,EAAO,YAAY,EAAE,IAAI,GAAW,EAAE,SAAS,EAC/D,WAAY,OAAOA,EAAO,UAAU,EACpC,SAAU,OAAOA,EAAO,QAAQ,EAChC,SAAU,CACR,GAAIA,EAAO,SAAS,OAAO,GAAG,GAC9B,KAAMA,EAAO,SAAS,OAAO,IAC/B,EACA,KAAMK,EAAW,YACnB,CAGF,CAEO,SAASc,GAAkBpB,EAAuC,CACvE,GAAI,CACF,IAAMC,KAAS,mBAAgBD,CAAI,EAenC,MAd+B,CAC7B,IAAKC,EAAO,IACZ,MAAOA,EAAO,MACd,GAAIA,EAAO,GAAG,GACd,KAAMA,EAAO,KACb,QAASA,EAAO,QAChB,gBAAc,UAAO,OAAOA,EAAO,aAAa,OAAO,IAAI,CAAC,EAC5D,gBAAc,UAAO,OAAOA,EAAO,aAAa,OAAO,IAAI,CAAC,EAC5D,iBAAkBA,EAAO,iBACzB,YAAaA,EAAO,YACpB,eAAa,eAAYA,EAAO,YAAa,EAAK,EAClD,eAAa,eAAYA,EAAO,YAAa,EAAK,CACpD,CAGF,OAASC,EAAO,CACd,eAAQ,IAAI,yCAAmCA,CAAK,EAC7CC,eAAsCD,EAAgB,CAC3D,CAAC,eAAa,WAAW,EAAG,oBAC5B,CAAC,eAAa,cAAc,EAAGF,CACjC,CAAC,CACH,CACF,CAEO,SAASqB,GACdC,EACAC,EACAC,EACAC,EACkB,CAClB,IAAMC,EAAOJ,EAAiB,IAAI,CAACK,EAAWC,IAAU,CACtD,IAAMC,EAASL,EAAeI,EACxBE,EAAoBC,EAAS,4BAA4BF,EAAQN,CAAQ,EAC/E,GAAIM,IAAWJ,EAAW,OAAQ,CAChC,GAAM,CAAE,SAAAO,EAAU,SAAAC,CAAS,EAAIF,EAAS,oBAAoBN,EAAYE,CAAS,EACjF,MAAO,CACL,OAAAE,EACA,SAAAG,EACA,SAAAC,EACA,UAAAN,EACA,kBAAAG,CACF,CACF,CAEA,GAAID,EAASJ,EAAW,OAAQ,CAC9B,IAAMQ,EAAWF,EAAS,wBAAwBJ,CAAS,EAC3D,MAAO,CACL,OAAAE,EACA,SAAU,IACV,SAAAI,EACA,UAAAN,EACA,kBAAAG,CACF,CACF,CAEA,IAAMI,EAAUH,EAAS,gBAAgBF,EAAQN,CAAQ,EACnDS,EAAWD,EAAS,wBAAwBJ,EAAWO,CAAO,EACpE,MAAO,CACL,OAAAL,EACA,SAAAG,EACA,SAAU,IACV,UAAAL,EACA,kBAAAG,CACF,CACF,CAAC,EAEKE,EAAWN,EACd,OAAO,CAACS,EAAKC,IACLD,EAAI,IAAI,IAAIE,EAAQD,EAAI,QAAQ,CAAC,EACvC,IAAIC,EAAQ,CAAC,CAAC,EAChB,QAAQ,CAAC,EAENJ,EAAWP,EACd,OAAO,CAACS,EAAKC,IACLD,EAAI,IAAI,IAAIE,EAAQD,EAAI,QAAQ,CAAC,EACvC,IAAIC,EAAQ,CAAC,CAAC,EAChB,QAAQ,CAAC,EAEZ,MAAO,CACL,KAAAX,EACA,SAAAM,EACA,SAAAC,CACF,CACF,CAEO,SAASK,GAAiBC,EAAqC,CACpE,GAAI,CACF,IAAMC,EAAgB,OAAI,OAAO,YAAa,CAC5C,GAAI,OAAI,OAAO,MAAO,CACpB,KAAM,OAAI,IAAI,CAChB,CAAC,EACD,SAAU,OAAI,IAAI,EAClB,SAAU,OAAI,IAAI,EAClB,MAAO,OAAI,KAAK,EAChB,iBAAkB,OAAI,KAAK,EAC3B,sBAAuB,OAAI,OAAO,OAAI,KAAK,CAAC,EAC5C,oBAAqB,OAAI,KAAK,EAC9B,oBAAqB,OAAI,KAAK,CAChC,CAAC,EAID,OAFoB,OAAI,OAAOA,CAAa,EAAE,MAAM,WAAW,KAAKD,EAAI,QAAS,CAAC,EAAE,aAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAErF,IAAKE,IAEf,CACL,UAFa,UAAO,OAAOA,EAAW,GAAG,IAAI,CAAC,EAG9C,SAAUA,EAAW,SACrB,SAAUA,EAAW,SACrB,UAAWA,EAAW,iBACtB,kBAAmBV,EAAS,6BAA6BU,EAAW,KAAK,CAC3E,EACD,CACH,OAASvC,EAAO,CACd,eAAQ,IAAI,oCAA8BA,CAAK,EACxC,CAAC,CACV,CACF,CAEO,SAASwC,GAAazC,EAAwB,CACnD,GAAI,CAUF,MAR8B,CAC5B,UAFa,UAAO,OAAOA,EAAO,GAAG,OAAO,IAAI,CAAC,EAGjD,SAAUA,EAAO,SACjB,SAAUA,EAAO,SACjB,UAAWA,EAAO,gBAClB,kBAAmB8B,EAAS,6BAA6B9B,EAAO,KAAK,CACvE,CAGF,OAASC,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,eAAa,WAAW,EAAG,eAC5B,CAAC,eAAa,cAAc,EAAG,CAC7B,OAAAD,CACF,CACF,CAAC,CACH,CACF,CAEO,SAAS0C,GAAqBC,EAAiC,CACpE,IAAMC,EAAuC,CAAC,EACxCC,EAAsBF,EAAa,QAAQ,OAAQG,GAChDA,EAAK,KAAK,SAAS,uBAAuB,CAClD,EAED,QAASC,EAAI,EAAGA,EAAIF,EAAa,OAAQE,GAAK,EAAG,CAC/C,GAAM,CAAE,WAAAC,CAAW,EAAIH,EAAaE,CAAC,EAC/BE,EAAS,CACb,YAAaD,EAAW,SACxB,YAAaA,EAAW,MACxB,YAAaA,EAAW,KAC1B,EACAJ,EAAQI,EAAW,QAAQ,EAAIC,CACjC,CAEA,OAAOL,CACT,CAEO,SAASM,GAAwBP,EAAiC,CACvE,IAAMQ,EAA+C,CAAC,EAChDC,EAA2BT,EAAa,QAAQ,OAAQG,GACrDA,EAAK,KAAK,SAAS,0BAA0B,CACrD,EAED,QAASC,EAAI,EAAGA,EAAIK,EAAkB,OAAQL,GAAK,EAAG,CACpD,GAAM,CAAE,WAAAC,CAAW,EAAII,EAAkBL,CAAC,EACpCM,EAAcL,EAAW,SACzBM,EAAcN,EAAW,OACzBO,EAAgBP,EAAW,OAC3BQ,EAAyB,CAC7B,aAAW,eAAYF,EAAY,KAAM,EAAK,EAC9C,aAAcC,CAChB,EACIE,EAAWN,EAAaE,CAAW,EACnCI,EACFA,EAAS,QAAQ,KAAKD,CAAU,EAEhCC,EAAW,CACT,YAAAJ,EACA,QAAS,CAACG,CAAU,CACtB,EAEFL,EAAaE,CAAW,EAAII,CAC9B,CAEA,OAAON,CACT,CAEO,SAASO,GAAoBf,EAAiCgB,EAAwC,CAC3G,IAAMP,EAA2BT,EAAa,QAAQ,OAAQG,GACrDA,EAAK,KAAK,SAAS,iBAAiB,CAC5C,EAED,QAASC,EAAI,EAAGA,EAAIK,EAAkB,OAAQL,GAAK,EAAG,CACpD,GAAM,CAAE,WAAAC,CAAW,EAAII,EAAkBL,CAAC,EACpC,CAAE,QAAAa,EAAS,KAAA3C,EAAM,UAAA4C,EAAW,WAAAC,EAAY,IAAAC,EAAK,QAAAC,EAAS,UAAAC,EAAW,KAAAC,EAAM,OAAAC,CAAO,EAAInB,EAClFoB,EAA4BH,EAAU,IAAKI,IACxC,CACL,OAAQA,EAAS,OAAO,KACxB,UAAWA,EAAS,UACpB,WAAYA,EAAS,WACrB,IAAKA,EAAS,IACd,aAAcA,EAAS,YACzB,EACD,EAcD,MAb2B,CACzB,QAASpD,EACT,IAAA0C,EACA,UAAWE,EACX,WAAYC,EACZ,eAAgBE,EAChB,WAAYD,EACZ,UAAWK,EACX,QAAAR,EACA,kBAAgB,eAAYM,EAAK,KAAM,EAAK,EAC5C,gBAAc,eAAYC,EAAO,KAAM,EAAK,CAC9C,CAGF,CAEF,CAEO,SAASG,GAAkBC,EAAqC,CACrE,OAAQA,EAAe,CACrB,OACE,MAAO,GACT,OACE,MAAO,GACT,OACE,MAAO,EACX,CACF,CACO,IAAMC,GAAsB,CAAC,uBAAwB,YAAa,oBAAqB,oBAAoB,EAC3G,SAASC,GAAyB1E,EAAmC2E,EAAiBC,EAAoBC,EAAiB,CAChI,IAAMC,EAA8B,CAAC,EAC/B,CAAE,YAAAC,EAAa,OAAAC,CAAO,EAAIhF,EAEhC,OAAAgF,GAAQ,QAAQ,CAACC,EAAYrD,IAAU,CACrC,GAAM,CAAE,KAAMvB,EAAM,QAAS6E,CAAgB,KAAI,4BAAyBD,EAAM,IAAI,EACpF,GAAIR,GAAoB,SAASpE,CAAI,GAAK6E,IAAoBN,GAAcC,IAAYI,EAAM,WAAW,KAAM,CAC7G,IAAME,EAA4B,CAChC,GAAIF,EAAM,GAAG,SACb,OAAQA,EAAM,OACd,KAAMA,EAAM,KACZ,WAAYF,GAAe,IAC3B,MAAO,GAAGJ,CAAO,IAAI/C,CAAK,GAC1B,YAAaqD,EAAM,UACrB,EACAH,EAAK,KAAKK,CAAI,CAChB,CACF,CAAC,EAEML,CACT,CAEO,SAASM,GAAuBC,EAAkBC,EAAsBC,EAAgC,CAC7G,IAAMC,EAAmB,CAAC,EAEtBC,EAAY,EACVC,EAAe,IAAI,KAAKL,EAAW,GAAI,EAAE,QAAQ,EACjDM,EAAU,IAAI,KAAK,EAAE,QAAQ,EACnC,OAAa,CACX,IAAMC,EAAaF,EAAeD,EAAYF,EAM9C,GAJIK,GAAcD,GAChBH,EAAO,KAAKI,CAAU,EAGpBH,GAAaH,EACf,MAGFG,GAAa,CACf,CAEA,OAAOD,CACT,CAEO,SAASK,GACdC,EACAC,EACAC,EACAC,EACA,CACA,IAAMT,EAAuC,CAAC,EAC9C,QAASU,EAAOH,EAAoBG,GAAQF,EAAkBE,GAAQD,EAAiB,CACrF,IAAME,EAA2BL,EAAmB,SAAUM,MAAW,KAAEF,CAAI,EAAE,IAAIE,EAAO,IAAI,CAAC,EAC7FD,EACFX,EAAO,KAAK,CACV,KAAMU,EAAK,SAAS,EACpB,qBAAsBC,EAAyB,qBAC/C,kBAAmBA,EAAyB,kBAC5C,gBAAiB,IAAI,KAAKD,EAAO,GAAI,EAAE,eAAe,CACxD,CAAC,EAEDV,EAAO,KAAK,CACV,kBAAmB,IACnB,KAAMU,EAAK,SAAS,EACpB,qBAAsB,IACtB,gBAAiB,IAAI,KAAKA,EAAO,GAAI,EAAE,eAAe,CACxD,CAAC,CAEL,CACA,OAAOV,CACT,CAEO,SAASa,GAAiCP,EAA8E,CAC7H,GAAIA,EAAmB,SAAW,EAChC,OAEF,IAAMQ,EAAc,IAAI,KAAK,EAAE,QAAQ,EAAI,IACrCH,EAA2BL,EAAmB,SAAUM,MAAW,KAAEE,CAAW,EAAE,IAAIF,EAAO,IAAI,CAAC,EACxG,OAAID,GAGGL,EAAmBA,EAAmB,OAAS,CAAC,CACzD,CAEO,SAASS,GAAcC,EAAiBC,EAAwB,CACrE,IAAMjB,EAASgB,EAAO,IAAIC,CAAI,EAC9B,GAAIjB,EAAO,GAAG,CAAC,GAAKA,EAAO,GAAG,CAAC,EAC7B,MAAM,IAAIkB,GAAU,kBAAkBlB,CAAM,kCAA+C,EAE7F,OAAOA,EAAO,MAAM,CACtB,CAEO,SAASmB,GAAWH,EAA0B,CACnD,GAAIA,EAAO,GAAG,CAAC,GAAKA,EAAO,GAAG,CAAC,EAC7B,MAAM,IAAIE,GAAU,kBAAkBF,EAAO,SAAS,CAAC,kCAA+C,EAExG,OAAOA,EAAO,MAAM,CACtB,CAEO,SAASI,GAAgBpC,EAA6B,CAC3D,OAAQA,EAAe,CACrB,OACE,MAAO,OACT,OACE,MAAO,QACT,OACE,MAAO,SACX,CACF,CAEO,SAASqC,GAAaC,EAAqBC,EAAqBxF,EAAkByF,EAAqB,CAE5G,IAAIC,EAAa,OAAO,KAAKH,EAAa,MAAM,EAC1CI,EAAa,OAAO,KAAKH,EAAa,MAAM,EAE5CI,EAAOD,EAAW,OAEpBlE,EAAI,EAGR,KAAOA,EAAImE,GAAM,CACf,IAAMC,EAAQF,EAAWlE,CAAC,EAC1BiE,EAAa,OAAO,OAAO,CAACA,EAAY,OAAO,KAAK,CAACG,CAAK,CAAC,CAAC,CAAC,EAC7DpE,GACF,CAGA,IAAMqE,EAAe,OAAI,IAAI,EAAE,UAAU9F,CAAQ,EAAE,QAAQ,EACrD+F,EAAkB,OAAI,IAAI,EAAE,UAAUN,CAAW,EAAE,QAAQ,EAG3DO,EAAgB,OAAO,OAAO,CAACN,EAAYI,EAAcC,CAAe,CAAC,EAGzEE,KAAO,YAAQD,EAAe,OAAW,EAAE,EAEjD,MAAO,KAAK,OAAO,KAAKC,CAAI,EAAE,SAAS,KAAK,CAAC,EAC/C,CK1iBA,IAAAC,EAAkB,qCAOX,IAAMC,GAAN,MAAMC,CAAY,CACvB,OAAO,SAASC,EAAsC,CACpD,QAAQ,IAAI,gDAA0CA,CAAO,EAE7D,GAAM,CAAE,cAAAC,EAAe,UAAAC,EAAW,SAAAC,EAAU,aAAAC,EAAc,aAAAC,EAAc,eAAAC,EAAgB,eAAAC,EAAgB,mBAAAC,CAAmB,EAAIR,EACzHS,EAAcP,EAAYE,GAAgBF,EAAYG,EACtDK,EAAmBC,EAAS,gBAAgBT,EAAWC,CAAQ,EAEjES,KAAkB,KAAE,CAAC,EACrBC,KAAkB,KAAE,CAAC,EAErBC,KAAc,KAAE,GAAkB,EAStC,GARIb,IAAkB,EACpBa,KAAc,KAAE,GAAkB,EACzBb,IAAkB,EAC3Ba,KAAc,KAAE,GAAkB,EACzBb,IAAkB,IAC3Ba,KAAc,KAAE,CAAC,GAGf,CAACL,GAAeD,EAAoB,CACtC,IAAMO,GAAU,KAAK,uBAAuBP,EAAmB,SAAUA,EAAmB,SAAUE,EAAkBI,CAAW,EACnIF,EAAkBG,GAAQ,gBAC1BF,EAAkBE,GAAQ,eAC5B,CAEIb,IAAcE,MAAgB,KAAEG,CAAc,EAAE,OAAO,IACzDK,KAAkB,KAAEE,CAAW,EAC5B,OAAI,KAAE,CAAC,EAAE,IAAIE,EAAe,CAAC,CAAC,EAC9B,OAAI,KAAEN,CAAgB,CAAC,EACvB,MAAM,EACTG,KAAkB,KAAE,CAAC,GAEnBX,IAAcG,MAAgB,KAAEC,CAAc,EAAE,OAAO,IACzDO,KAAkB,KAAEC,CAAW,EAAE,OAAI,KAAE,CAAC,EAAE,IAAIE,CAAY,CAAC,EAAE,MAAM,EACnEJ,KAAkB,KAAE,CAAC,GAGnBV,EAAYE,GAAgBF,EAAYG,OACtC,KAAEC,CAAc,EAAE,OAAO,IAC3BO,KAAkB,KAAEC,CAAW,EAAE,OAAI,KAAE,CAAC,EAAE,IAAIE,CAAY,CAAC,EAAE,MAAM,EACnEJ,KAAkB,KAAE,CAAC,MAEnB,KAAEL,CAAc,EAAE,OAAO,IAC3BK,KAAkB,KAAEE,CAAW,EAC5B,OAAI,KAAE,CAAC,EAAE,IAAIE,EAAe,CAAC,CAAC,EAC9B,OAAI,KAAEN,CAAgB,CAAC,EACvB,MAAM,EACTG,KAAkB,KAAE,CAAC,IAGzB,IAAII,EAAiBR,KAAc,KAAE,CAAC,EAAIG,EACtCM,EAAiBT,KAAc,KAAE,CAAC,EAAII,EAEpCM,KAAc,KAAE,GAAkB,EAAE,OAAI,KAAE,GAAkB,CAAC,EAAE,MAAM,EAErEC,EAAkBlB,EAAYG,EAAeA,EAAeH,EAC5DmB,EAAqBnB,EAAYE,EAAeA,EAAeF,EAE/DoB,EACJpB,EAAYE,EACRgB,IAAoBhB,KAClB,KAAE,CAAC,EACHe,EAAY,OAAI,KAAEC,EAAkBhB,CAAY,CAAC,EAAE,MAAM,KAC3D,KAAE,CAAC,EAEHmB,EACJlB,EAAeH,EACXmB,IAAuBhB,KACrB,KAAE,CAAC,EACHc,EAAY,OAAI,KAAEd,EAAegB,CAAkB,CAAC,EAAE,MAAM,KAC9D,KAAE,CAAC,EAELG,EAASpB,EACTW,EAAqB,CAAC,EACtBU,GAA+B,CAAC,EAEpC,KAAOD,GAAUnB,GAAc,CAC7B,IAAIqB,MAAkB,KAAE,CAAC,EACzB,GAAIF,EAAStB,EAAW,CACtB,IAAMyB,GAAYP,EAAkBI,EAChCvB,IAAkB,EACpByB,MAAS,KAAE,CAAC,EACHzB,IAAkB,EAC3ByB,MAAS,KAAEZ,CAAW,EAAE,IAAIQ,EAAgB,IAAIK,EAAS,CAAC,EAAE,MAAM,EACzD1B,IAAkB,IAC3ByB,MAAS,KAAEZ,CAAW,EAAE,IAAIQ,EAAgB,IAAIK,EAAS,CAAC,EAAE,MAAM,EAEtE,SAAWH,EAAStB,EAAW,CAC7B,IAAMyB,GAAYH,EAASH,EACvBpB,IAAkB,EACpByB,MAAS,KAAE,CAAC,EACHzB,IAAkB,EAC3ByB,MAAS,KAAEZ,CAAW,EAAE,IAAIS,EAAgB,IAAII,EAAS,CAAC,EAAE,MAAM,EACzD1B,IAAkB,IAC3ByB,MAAS,KAAEZ,CAAW,EAAE,IAAIS,EAAgB,IAAII,EAAS,CAAC,EAAE,MAAM,EAEtE,MACED,GAASZ,EAIX,GAFAC,EAAQ,KAAKW,EAAM,EAEfF,EAAStB,EACXgB,EAAiBA,EAAe,IAAIQ,GAAO,OAAI,KAAE,CAAC,EAAE,IAAIV,CAAY,CAAC,CAAC,EAAE,MAAM,EAC9ES,GAAkB,QAAK,KAAE,CAAC,CAAC,UAClBD,EAAStB,EAAW,CAC7B,IAAM0B,GAAmBF,GACtB,OAAI,KAAE,CAAC,EAAE,IAAIV,EAAe,CAAC,CAAC,EAC9B,IAAIL,EAAS,gBAAgBa,EAAQrB,CAAQ,CAAC,EAC9C,MAAM,EACTsB,GAAkB,KAAKG,EAAgB,EACvCX,EAAiBA,EAAe,IAAIW,EAAgB,EAAE,MAAM,CAC9D,MACEH,GAAkB,QAAK,KAAE,CAAC,CAAC,EAG7BD,GAAU,CACZ,CAEA,MAAO,CACL,GAAGxB,EACH,eAAAiB,EACA,eAAAC,EACA,gBAAAN,EACA,gBAAAC,EACA,QAAAE,EACA,kBAAAU,EACF,CACF,CAEA,OAAO,qBAAqBI,EAAoBC,EAAiC,CAC/E,IAAIC,EAAgB,CAAC,EACrB,QAASC,EAAIH,EAAYG,GAAKF,EAAYE,IACxCD,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQ,CACV,CAAC,EAEH,OAAOD,CACT,CAEA,OAAO,wBAAwBF,EAAoBC,EAAiC,CAClF,IAAIC,EAAgB,CAAC,EACrB,QAASC,EAAIH,EAAYG,GAAKF,EAAYE,IACxCD,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQF,EAAaE,EAAI,CAC3B,CAAC,EAEH,OAAOD,CACT,CAEA,OAAO,uBAAuBF,EAAoBC,EAAiC,CACjF,IAAIC,EAAgB,CAAC,EACrB,QAASC,EAAIH,EAAYG,GAAKF,EAAYE,IACxCD,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQA,EAAIH,EAAa,CAC3B,CAAC,EAEH,OAAOE,CACT,CAEA,OAAO,cAAcF,EAAoBC,EAAoB5B,EAAgC,CAC3F,GAAIA,EAAY2B,EACd,OAAO9B,EAAY,wBAAwB8B,EAAYC,CAAU,EAC5D,GAAI5B,EAAY4B,EACrB,OAAO/B,EAAY,uBAAuB8B,EAAYC,CAAU,EAGlE,IAAIG,EAAY,IAGZC,EAAaD,EAFD,IAGZE,EAAgBjC,EAAY2B,EAAa,KAAK,MAAMK,GAAchC,EAAY2B,EAAW,EAAI,EAC7FO,EAAgBN,EAAa5B,EAAY,KAAK,MAAMgC,GAAcJ,EAAa5B,EAAU,EAAI,EAE7F6B,EAA6B,CAAC,EAClC,QAASC,EAAIH,EAAYG,GAAKF,EAAYE,IACpCA,EAAI9B,EACN6B,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQC,GAAa/B,EAAY8B,GAAKG,CACxC,CAAC,EACQH,EAAI9B,EACb6B,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQC,GAAaD,EAAI9B,GAAakC,CACxC,CAAC,EAEDL,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQC,CACV,CAAC,EAGL,OAAOF,CACT,CAEA,OAAO,eAAeF,EAAoBC,EAAoB5B,EAAgC,CAC5F,GAAIA,EAAY4B,EACd,OAAO/B,EAAY,wBAAwB8B,EAAYC,CAAU,EAC5D,GAAI5B,EAAY2B,EACrB,OAAO9B,EAAY,uBAAuB8B,EAAYC,CAAU,EAGlE,IAAIG,EAAY,IACZI,EAAY,IAEZH,EAAaD,EAAYI,EACzBF,EAAgBjC,EAAY2B,EAAa,KAAK,MAAMK,GAAchC,EAAY2B,EAAW,EAAI,EAC7FO,EAAgBN,EAAa5B,EAAY,KAAK,MAAMgC,GAAcJ,EAAa5B,EAAU,EAAI,EAE7F6B,EAA6B,CAAC,EAClC,QAASC,EAAIH,EAAYG,GAAKF,EAAYE,IACpCA,EAAI9B,EACN6B,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQK,GAAanC,EAAY8B,GAAKG,CACxC,CAAC,EACQH,EAAI9B,EACb6B,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQK,GAAaL,EAAI9B,GAAakC,CACxC,CAAC,EAEDL,EAAc,KAAK,CACjB,OAAQC,EACR,OAAQK,CACV,CAAC,EAGL,OAAON,CACT,CASA,OAAO,gBACL7B,EACAoC,EACAnC,EACA4B,EACAQ,EAAqB,GACH,CAElB,IAAMC,EAAcT,EACjB,OAAQU,GAAQA,EAAI,QAAUvC,CAAS,EACvC,OAAO,SAAUwC,EAAKC,EAAI,CACzB,OAAIJ,EACKI,EAAG,OAASzC,EAAYwC,EAAMA,EAAI,IAAIC,EAAG,MAAM,EAE/CA,EAAG,QAAUzC,EAAYwC,EAAMA,EAAI,IAAIC,EAAG,MAAM,CAE3D,KAAG,KAAE,CAAC,CAAC,EAET,GAAIH,EAAY,OAAI,KAAE,CAAC,CAAC,GAAK,EAC3B,MAAM,MAAM,oBAAoB,EAgClC,MAAO,CACL,KA9BkBT,EAAc,IAAKU,GAAQ,CAC7C,IAAIG,EAAoBjC,EAAS,4BAA4B8B,EAAI,OAAQtC,CAAQ,EAIjF,GAAI,EAFesC,EAAI,QAAUvC,IAEbuC,EAAI,QAAUvC,GAAa,CAACqC,EAC9C,MAAO,CACL,OAAQE,EAAI,OACZ,SAAU,IACV,SAAU,IACV,kBAAAG,EACA,UAAW,GACb,EACK,CACL,IAAMC,KAAO,KAAEJ,EAAI,MAAM,EAAE,IAAID,CAAW,EACpCM,EAAkBC,MAAc,KAAET,CAAQ,EAAGO,CAAI,EAAE,SAAS,EAC5DG,EAAW,IACXC,EAAStC,EAAS,gBAAgB8B,EAAI,OAAQtC,CAAQ,EACtD+C,EAAYvC,EAAS,aAAaqC,EAAUF,EAAiBG,CAAM,EACzE,MAAO,CACL,OAAQR,EAAI,OACZ,SAAUK,EACV,SAAAE,EACA,kBAAAJ,EACA,UAAAM,CACF,CACF,CACF,CAAC,EAIC,SAAU,IACV,SAAAZ,CACF,CACF,CASA,OAAO,gBACLpC,EACAC,EACA6C,EACAjB,EACAQ,EAAqB,GACH,CAElB,IAAMC,EAAuBT,EAC1B,OAAQU,GAAQA,EAAI,QAAUvC,CAAS,EACvC,OAAO,SAAUwC,EAAKC,EAAI,CACzB,GAAIA,EAAG,QAAUzC,GAAa,CAACqC,EAC7B,OAAOG,EACF,CACL,IAAME,EAAoBjC,EAAS,4BAA4BgC,EAAG,OAAQxC,CAAQ,EAC5EgD,EAAiB,IAAIC,EAAQT,EAAG,MAAM,EAAE,IAAIC,CAAiB,EACnE,OAAOF,EAAI,IAAIS,CAAc,CAC/B,CACF,EAAG,IAAIC,EAAQ,CAAC,CAAC,EAEnB,GAAIZ,EAAY,IAAI,IAAIY,EAAQ,CAAC,CAAC,GAAK,EACrC,MAAM,MAAM,oBAAoB,EAgClC,MAAO,CACL,KA9BkBrB,EAAc,IAAKU,GAAQ,CAC7C,IAAIG,EAAoBjC,EAAS,4BAA4B8B,EAAI,OAAQtC,CAAQ,EAGjF,GAAI,EAFesC,EAAI,QAAUvC,IAEbuC,EAAI,QAAUvC,GAAa,CAACqC,EAC9C,MAAO,CACL,OAAQE,EAAI,OACZ,SAAU,IACV,SAAU,IACV,kBAAAG,EACA,UAAW,GACb,EACK,CAEL,IAAMC,EADiB,IAAIO,EAAQX,EAAI,MAAM,EAAE,IAAIG,CAAiB,EACxC,IAAIJ,CAAW,EACrCa,EAAkBN,MAAc,KAAEC,CAAQ,EAAGH,CAAI,EAAE,SAAS,EAC5DP,EAAW,IACXW,EAAStC,EAAS,gBAAgB8B,EAAI,OAAQtC,CAAQ,EACtD+C,EAAYvC,EAAS,aAAa0C,EAAiBf,EAAUW,CAAM,EACzE,MAAO,CACL,OAAQR,EAAI,OACZ,SAAUY,EACV,SAAAf,EACA,kBAAAM,EACA,UAAAM,CACF,CACF,CACF,CAAC,EAIC,SAAAF,EACA,SAAU,GACZ,CACF,CAkBA,OAAO,iBACL9C,EACAC,EACA6C,EACAV,EACAgB,EACAC,EACAxB,EACkB,CAClB,IAAMyB,EAAgB,IAAC,KAAER,CAAQ,EAAE,OAAO,MAAK,KAAEV,CAAQ,EAAE,OAAO,EAC5DmB,KAAgB,KAAET,CAAQ,EAAE,OAAO,GAAK,IAAC,KAAEV,CAAQ,EAAE,OAAO,EAGlE,GAAIpC,EAAY6B,EAAcA,EAAc,OAAS,CAAC,EAAE,OACtD,OAAOhC,EAAY,gBAAgBG,EAAWoC,EAAUnC,EAAU4B,CAAa,EAGjF,GAAI0B,GAAiBvD,IAAc6B,EAAcA,EAAc,OAAS,CAAC,EAAE,OACzE,OAAOhC,EAAY,gBAAgBG,EAAWoC,EAAUnC,EAAU4B,EAAe,EAAI,EAIvF,GAAI7B,EAAY6B,EAAc,CAAC,EAAE,OAC/B,OAAOhC,EAAY,gBAAgBG,EAAWC,EAAU6C,EAAUjB,CAAa,EAGjF,GAAIyB,GAAiBtD,IAAc6B,EAAc,CAAC,EAAE,OAClD,OAAOhC,EAAY,gBAAgBG,EAAWC,EAAU6C,EAAUjB,EAAe,EAAI,EAGvF,IAAM2B,EAAa3B,EAAc,OAAQ4B,GAChCA,EAAQ,SAAWzD,CAC3B,EAED,GAAIwD,EAAW,SAAW,EAAG,CAC3B,GAAM,CAAE,aAAAE,EAAc,aAAAC,EAAc,cAAAC,EAAe,cAAAC,CAAc,EAAIhE,EAAY,sBAC/EI,EACA4B,EACA7B,EACAwD,EAAW,CAAC,EACZJ,EACAC,EACAC,EAAgB,IAAMC,EAAgB,IAAM,MAC9C,EACMO,EAAK,IAAIZ,EAAQJ,EAAS,SAAS,CAAC,EAAE,IAAIY,CAAY,EACtDK,EAAK,IAAIb,EAAQd,EAAS,SAAS,CAAC,EAAE,IAAIuB,CAAY,EACtDK,EAAcnC,EAAc,IAAKU,GAAQ,CAC7C,IAAIG,EAAoBjC,EAAS,4BAA4B8B,EAAI,OAAQtC,CAAQ,EACjF,GAAIsC,EAAI,OAASvC,GAAcuC,EAAI,SAAWvC,GAAauD,EAAgB,CACzE,IAAMnB,GAAWS,GAAckB,EAAI,IAAIb,EAAQX,EAAI,MAAM,CAAC,EACpDO,EAAW,IACXC,EAAStC,EAAS,gBAAgB8B,EAAI,OAAQtC,CAAQ,EACtD+C,EAAYvC,EAAS,aAAaqC,EAAUV,GAAS,SAAS,EAAGW,CAAM,EAC7E,MAAO,CACL,OAAQR,EAAI,OACZ,SAAU,IACV,SAAUH,GAAS,SAAS,EAC5B,kBAAAM,EACA,UAAAM,CACF,CACF,CACA,GAAIT,EAAI,OAASvC,GAAcuC,EAAI,SAAWvC,GAAasD,EAAgB,CACzE,IAAMW,GAAgB,IAAIf,EAAQX,EAAI,MAAM,EAAE,IAAIG,CAAiB,EAC7DI,EAAWD,GAAciB,EAAI,IAAIZ,EAAQe,EAAa,CAAC,EACvD7B,EAAW,IACXW,EAAStC,EAAS,gBAAgB8B,EAAI,OAAQtC,CAAQ,EACtD+C,EAAYvC,EAAS,aAAaqC,EAAS,SAAS,EAAGV,EAAUW,CAAM,EAE7E,MAAO,CACL,OAAQR,EAAI,OACZ,SAAUO,EAAS,SAAS,EAC5B,SAAU,IACV,kBAAAJ,EACA,UAAAM,CACF,CACF,CAEA,IAAMkB,EAAmBrB,GAAciB,EAAIF,CAAa,EAClDO,EAAmBtB,GAAckB,EAAIF,CAAa,EACpDf,GAAWoB,EAAiB,SAAS,EACrC9B,GAAW+B,EAAiB,SAAS,EAEnCpB,GAAStC,EAAS,gBAAgB8B,EAAI,OAAQtC,CAAQ,EACtD+C,EAAYvC,EAAS,aAAaqC,GAAUV,GAAUW,EAAM,EAClE,MAAO,CACL,OAAQR,EAAI,OACZ,SAAAO,GACA,SAAAV,GACA,kBAAAM,EACA,UAAAM,CACF,CACF,CAAC,EAEK5C,EAAiB4D,EAAY,OAAO,CAACxB,EAAKD,OAAQ,KAAEC,CAAG,EAAE,OAAI,KAAED,EAAI,QAAQ,CAAC,KAAG,KAAE,CAAC,CAAC,EAAE,SAAS,EAC9FlC,EAAiB2D,EAAY,OAAO,CAACxB,EAAKD,OAAQ,KAAEC,CAAG,EAAE,OAAI,KAAED,EAAI,QAAQ,CAAC,KAAG,KAAE,CAAC,CAAC,EAAE,SAAS,EAEpG,MAAO,CACL,KAAMyB,EACN,SAAU5D,EACV,SAAUC,CACZ,CACF,KAAO,CACL,GAAM,CAAE,aAAAqD,EAAc,aAAAC,CAAa,EAAI9D,EAAY,sBAAsBI,EAAU4B,EAAe7B,CAAS,EACvG8D,EAAK,IAAIZ,EAAQJ,EAAS,SAAS,CAAC,EAAE,IAAIY,CAAY,EACtDK,EAAK,IAAIb,EAAQd,EAAS,SAAS,CAAC,EAAE,IAAIuB,CAAY,EAGpDK,EAAcnC,EAAc,IAAKU,GAAQ,CAC7C,IAAIG,EAAoBjC,EAAS,4BAA4B8B,EAAI,OAAQtC,CAAQ,EACjF,GAAIsC,EAAI,OAASvC,EAAW,CAC1B,IAAMoE,EAASvB,GAAckB,EAAI,IAAIb,EAAQX,EAAI,MAAM,CAAC,EACxD,MAAO,CACL,OAAQA,EAAI,OACZ,SAAU,IACV,SAAU6B,EAAO,SAAS,EAC1B,kBAAA1B,CACF,CACF,KAAO,CACL,IAAIuB,EAAgB,IAAIf,EAAQX,EAAI,MAAM,EAAE,IAAIG,CAAiB,EAC3D0B,EAASvB,GAAciB,EAAIG,CAAa,EAC9C,MAAO,CACL,OAAQ1B,EAAI,OACZ,SAAU6B,EAAO,SAAS,EAC1B,SAAU,IACV,kBAAA1B,CACF,CACF,CACF,CAAC,EAEKtC,EAAiB4D,EAAY,OAAO,CAACxB,EAAKD,OAAQ,KAAEC,CAAG,EAAE,OAAI,KAAED,EAAI,QAAQ,CAAC,KAAG,KAAE,CAAC,CAAC,EAAE,SAAS,EAC9FlC,EAAiB2D,EAAY,OAAO,CAACxB,EAAKD,OAAQ,KAAEC,CAAG,EAAE,OAAI,KAAED,EAAI,QAAQ,CAAC,KAAG,KAAE,CAAC,CAAC,EAAE,SAAS,EAEpG,MAAO,CACL,KAAMyB,EACN,SAAU5D,EACV,SAAUC,CACZ,CACF,CACF,CAcA,OAAO,qBACLL,EACAC,EACAmE,EACAC,EACAjB,EACAC,EACAxB,EACkB,CAElB,GAAI7B,EAAY6B,EAAcA,EAAc,OAAS,CAAC,EAAE,OACtD,OAAOhC,EAAY,gBAAgBG,EAAWoE,EAAQnE,EAAU4B,CAAa,EAG/E,GAAI7B,EAAY6B,EAAc,CAAC,EAAE,OAC/B,OAAOhC,EAAY,gBAAgBG,EAAWC,EAAUmE,EAAQvC,CAAa,EAG/E,IAAM2B,EAAa3B,EAAc,OAAQ4B,GAChCA,EAAQ,SAAWzD,CAC3B,EAEK,CAAE,aAAA0D,EAAc,aAAAC,CAAa,EAAI9D,EAAY,sBACjDI,EACA4B,EACA7B,EACAwD,EAAW,SAAW,EAAIA,EAAW,CAAC,EAAI,OAC1CA,EAAW,SAAW,EAAIJ,EAAyB,OACnDI,EAAW,SAAW,EAAIH,EAAyB,MACrD,EAEIiB,KAAI,KAAE,CAAC,EAEPD,EACFC,EAAIZ,EAAa,OAAO,EAAI,IAAIR,EAAQ,CAAC,EAAI,IAAIA,EAAQkB,CAAM,EAAE,IAAIV,CAAY,EAEjFY,EAAIX,EAAa,OAAO,EAAI,IAAIT,EAAQ,CAAC,EAAI,IAAIA,EAAQkB,CAAM,EAAE,IAAIT,CAAY,EAEnF,IAAMY,EAAe1B,GAAcyB,EAAGD,EAAeV,EAAeD,CAAY,EAAE,SAAS,EAE3F,OAAO7D,EAAY,iBACjBG,EACAC,EACAoE,EAAeD,EAASG,EACxBF,EAAeE,EAAeH,EAC9BhB,EACAC,EACAxB,CACF,CACF,CAEA,OAAO,uBACL2C,EACAC,EACAjE,EACAI,EACwD,CACxD,IAAM8D,KAAK,KAAElE,CAAgB,EACvBmE,KAAU,KAAEH,CAAqB,EACjCI,KAAU,KAAEH,CAAqB,EAEnC/D,KAA2B,KAAE,CAAC,EAC9BC,KAA2B,KAAE,CAAC,EAElC,GAAIgE,EAAQ,OAAO,GAAKC,EAAQ,OAAO,EACrClE,KAAkB,KAAEE,CAAW,EAC5B,OAAI,KAAE,CAAC,EAAE,IAAIE,EAAe,CAAC,CAAC,EAC9B,IAAI4D,EAAG,IAAI,CAAC,CAAC,EACb,MAAM,EACT/D,KAAkB,KAAEC,CAAW,EAAE,OAAI,KAAE,CAAC,EAAE,IAAIE,CAAY,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,MACrE,CAEL,GAAI6D,EAAQ,OAAO,EACjBjE,KAAkB,KAAE,CAAC,MAChB,CACL,IAAMmE,EAAID,EAAQ,OAAI,KAAE,CAAC,EAAE,IAAI9D,CAAY,CAAC,EAAE,IAAI6D,CAAO,EACzDjE,KAAkB,KAAEE,CAAW,EAC5B,OAAI,KAAE,CAAC,EAAE,IAAIE,EAAe,CAAC,CAAC,EAC9B,IAAI4D,EAAG,IAAIG,CAAC,CAAC,EACb,MAAM,CACX,CAGA,GAAID,EAAQ,OAAO,EACjBjE,KAAkB,KAAE,CAAC,MAChB,CACL,IAAMkE,KAAI,KAAE,CAAC,EAAE,IAAI/D,CAAY,EAAE,IAAI4D,EAAG,IAAIC,CAAO,EAAE,IAAIC,CAAO,CAAC,EAAE,MAAM,EACzEjE,KAAkB,KAAEC,CAAW,EAC5B,OAAI,KAAE,CAAC,EAAE,IAAIE,EAAe,CAAC,CAAC,EAC9B,IAAI+D,CAAC,EACL,MAAM,CACX,CACF,CAEA,MAAO,CAAE,gBAAAnE,EAAiB,gBAAAC,CAAgB,CAC5C,CAEA,OAAO,sBACLV,EACA4B,EACA7B,EACA8E,EACA1B,EACAC,EACA0B,EACkG,CAClG,IAAML,KAAK,KAAEjE,EAAS,4BAA4BT,EAAWC,CAAQ,CAAC,EAClE2D,KAAgB,KAAE,CAAC,EACnBC,KAAgB,KAAE,CAAC,EAEvB,GAAIT,GAA0BC,GAA0ByB,GAAa,CAACC,EACpE,MAAI,KAAE3B,CAAsB,EAAE,OAAO,MAAK,KAAEC,CAAsB,EAAE,OAAO,EACzEO,EAAgB,IAAIV,EAAQ4B,EAAU,MAAM,EAAE,IAAIJ,EAAG,IAAI,IAAIxB,EAAQ,CAAC,CAAC,CAAC,EACxEW,EAAgB,IAAIX,EAAQ4B,EAAU,MAAM,EAAE,IAAI,IAAI5B,EAAQ,CAAC,CAAC,MAC3D,CACL,IAAI8B,EAAwB,IAAI9B,EAAQE,EAAuB,SAAS,CAAC,EACrE6B,EAAwB,IAAI/B,EAAQG,EAAuB,SAAS,CAAC,KAEpE,KAAED,CAAsB,EAAE,OAAO,IACpCQ,EAAgB,IAAIV,EAAQ4B,EAAU,MAAM,EAAE,IAAIJ,EAAG,IAAIO,EAAsB,IAAID,CAAqB,CAAC,CAAC,MAEvG,KAAE3B,CAAsB,EAAE,OAAO,IACpCQ,EAAgB,IAAIX,EAAQ4B,EAAU,MAAM,EAAE,IAAI,IAAI5B,EAAQ,CAAC,EAAE,IAAIwB,EAAG,IAAIM,CAAqB,EAAE,IAAIC,CAAqB,CAAC,CAAC,EAElI,CAGF,IAAIvB,EAAeE,EACfD,EAAeE,EACnB,OAAAhC,EAAc,QAAS4B,GAAY,CAIjC,IAHIA,EAAQ,OAASzD,GAAa+E,IAAmB,OACnDpB,EAAeA,EAAa,IAAI,IAAIT,EAAQO,EAAQ,MAAM,CAAC,GAEzDA,EAAQ,OAASzD,GAAa+E,IAAmB,IAAK,CACxD,IAAIrC,EAAoBjC,EAAS,4BAA4BgD,EAAQ,OAAQxD,CAAQ,EACjFgE,EAAgB,IAAIf,EAAQO,EAAQ,MAAM,EAAE,IAAIf,CAAiB,EACrEgB,EAAeA,EAAa,IAAIO,CAAa,CAC/C,CACF,CAAC,EACM,CAAE,aAAAP,EAAc,aAAAC,EAAc,cAAAC,EAAe,cAAAC,CAAc,CACpE,CACF,EC3qBA,IAAAqB,GAAkB,qCAOX,IAAMC,GAAN,KAAoB,CACzB,OAAO,mBAAmBC,EAA6C,CACrE,GAAM,CACJ,eAAAC,EACA,eAAAC,EACA,QAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EACA,SAAAC,CACF,EAAIZ,EAEEa,EAAKX,EAAe,OAAO,KAC7B,MAAE,CAAC,KACH,MAAEI,CAAc,EACb,OAAI,MAAE,CAAC,EAAE,IAAIQ,EAAe,CAAC,CAAC,EAC9B,IAAIZ,CAAc,EAClB,MAAM,EAEPa,EAAKd,EAAe,OAAO,KAC7B,MAAE,CAAC,KACH,MAAEI,CAAc,EACb,OAAI,MAAE,CAAC,EAAE,IAAIS,EAAe,CAAC,CAAC,EAC9B,IAAIb,CAAc,EAClB,MAAM,EAEPe,EAAwBC,GAAWF,EAAG,IAAIR,CAAe,EAAE,OAAI,MAAE,CAAC,EAAE,IAAIO,EAAe,CAAC,CAAC,CAAC,EAC1FI,EAAwBD,GAAWJ,EAAG,IAAIL,CAAe,EAAE,OAAI,MAAE,CAAC,EAAE,IAAIM,EAAe,CAAC,CAAC,CAAC,EAE1FK,EAAYT,EAAeD,EAAe,EAC5CW,EAASX,EACTY,EAAM,EACJC,EAA2B,CAAC,EAClC,KAAOD,EAAMF,GAAW,CACtB,IAAII,KAAkB,MAAE,CAAC,EACrBC,MAAkB,MAAE,CAAC,EAEnBC,GAASC,EAAS,gBAAgBN,EAAQR,CAAQ,EAEpDQ,EAAST,EACXa,GAAkBP,GAAWJ,EAAG,IAAIV,EAAQkB,CAAG,CAAC,EAAE,OAAI,MAAE,CAAC,EAAE,IAAIP,CAAY,CAAC,CAAC,EACpEM,EAAST,EAClBY,EAAkBN,GAAWF,EAAG,IAAIX,EAAkBiB,CAAG,CAAC,EAAE,OAAI,MAAE,CAAC,EAAE,IAAIP,EAAe,CAAC,CAAC,CAAC,GAE3FS,EAAkBP,EAClBQ,GAAkBN,GAEpB,IAAMS,GAAYD,EAAS,aAAaH,EAAgB,SAAS,EAAGC,GAAgB,SAAS,EAAGC,EAAM,EAEtGH,EAAY,KAAK,CACf,OAAAF,EACA,SAAUG,EAAgB,SAAS,EACnC,SAAUC,GAAgB,SAAS,EACnC,kBAAmBE,EAAS,4BAA4BN,EAAQR,CAAQ,EACxE,UAAAe,EACF,CAAC,EACDP,GAAU,EACVC,GAAO,CACT,CAOA,MAL+B,CAC7B,KAAMC,EACN,SAAUjB,EAAe,SAAS,EAClC,SAAUC,EAAe,SAAS,CACpC,CAEF,CAeA,OAAO,4BACLK,EACAC,EACAgB,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,IAAM9B,EAAU+B,GAAY,SAAS,CACnC,cAAAF,EACA,UAAArB,EACA,SAAAC,EACA,aAAcgB,EACd,aAAcC,EACd,eAAgBC,EAChB,eAAgBC,EAChB,mBAAAE,CACF,CAAC,EAED,OAAO,KAAK,mBAAmB9B,CAAO,CACxC,CAEA,OAAO,uBACLQ,EACAC,EACAuB,EACAC,EACAR,EACAC,EACAG,EACAC,EACkB,CAClB,OAAQD,EAAe,CACrB,OAAwB,CACtB,IAAI7B,EAAU+B,GAAY,qBAAqBN,EAAYC,CAAU,EACrE,OAAOK,GAAY,qBACjBvB,EACAC,EACAuB,EACAC,EACAH,GAAoB,UAAY,IAChCA,GAAoB,UAAY,IAChC9B,CACF,CACF,CACA,OAAyB,CACvB,IAAIA,EAAU+B,GAAY,cAAcN,EAAYC,EAAYlB,CAAS,EACzE,OAAOuB,GAAY,qBACjBvB,EACAC,EACAuB,EACAC,EACAH,GAAoB,UAAY,IAChCA,GAAoB,UAAY,IAChC9B,CACF,CACF,CACA,OAA0B,CACxB,IAAIA,EAAU+B,GAAY,eAAeN,EAAYC,EAAYlB,CAAS,EAC1E,OAAOuB,GAAY,qBACjBvB,EACAC,EACAuB,EACAC,EACAH,GAAoB,UAAY,IAChCA,GAAoB,UAAY,IAChC9B,CACF,CACF,CACF,CACF,CAGA,OAAO,yBACLQ,EACAC,EACAuB,EACAC,EACAR,EACAC,EACAG,EACAC,EACkB,CAClB,IAAMI,EAAO,KAAK,uBAChB1B,EACAC,EACAuB,EACAC,EACAR,EACAC,EACAG,EACAC,CACF,EACM9B,EAAU+B,GAAY,SAAS,CACnC,cAAAF,EACA,UAAArB,EACA,SAAAC,EACA,aAAcgB,EACd,aAAcC,EACd,eAAgBQ,EAAK,SACrB,eAAgBA,EAAK,SACrB,mBAAAJ,CACF,CAAC,EAED,OAAO,KAAK,mBAAmB9B,CAAO,CACxC,CACF,ECzMA,IAAAmC,GAAkB,qCAKX,IAAMC,GAAN,MAAMC,CAAS,CACpB,OAAO,eAAeC,EAAgD,CACpE,GAAM,CAAE,uBAAAC,EAAwB,gBAAAC,CAAgB,EAAIF,EAC9C,CAAE,qBAAAG,EAAsB,SAAAC,CAAS,EAAIF,EAE3C,SAAI,MAAEC,CAAoB,EAAE,GAAG,CAAC,KACP,MAAEF,CAAsB,EAAE,IAAIG,CAAQ,EAAE,IAAI,CAAC,EACvC,IAAID,CAAoB,EAC1B,IAAI,WAAc,EAAE,IAAI,IAAe,EAC9C,QAAQ,CAAC,EAExB,GACT,CAEA,OAAO,wBAAwBE,EAAgBC,EAAwB,CACrE,IAAMC,KAAa,MAAEF,CAAM,EAAE,IAAIC,CAAc,EAE/C,SADwB,MAAEC,CAAU,EAAE,OAAI,MAAE,GAAa,EAAE,IAAID,CAAc,CAAC,EACvD,IAAI,IAAmB,EAAE,QAAQ,CAAC,CAC3D,CAEA,OAAO,qBAAqBC,EAAoBC,EAA2B,CAEzE,SADqB,MAAED,CAAU,EAAE,IAAIC,CAAiB,EAAE,IAAI,GAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAE7F,CAEA,OAAO,gBAAgBC,EAAeC,EAAeF,EAA2B,CAC9E,IAAMG,EAAiBZ,EAAS,qBAAqBU,EAAOD,CAAiB,EACvEI,EAAiBb,EAAS,qBAAqBW,EAAOF,CAAiB,EAC7E,MAAO,CACL,eAAAG,EACA,eAAAC,CACF,CACF,CAEA,OAAO,mBACLC,EACAC,EACAd,EACoC,CACpC,GAAM,CAAE,gBAAAE,CAAgB,EAAIF,EAC5B,MAAI,MAAEa,EAAW,WAAa,GAAG,EAAE,MAAG,MAAE,CAAC,CAAC,EACxC,MAAO,CACL,OAAQ,IACR,OAAQ,GACV,EAEF,GAAM,CAAE,SAAAT,EAAU,YAAAW,CAAY,EAAIb,EAC5Bc,EAASC,EAAS,gBAAgBJ,EAAW,OAAQT,CAAQ,EAC7Dc,EAAgBD,EAAS,aAAaJ,EAAW,SAAUA,EAAW,SAAUG,CAAM,EACtFG,EAAkBF,EAAS,aAAaH,EAAS,SAAUA,EAAS,SAAUE,CAAM,EACpFI,KAAwB,MAAEP,EAAW,SAAS,EAAE,IAAIM,CAAe,EAAE,IAAID,CAAa,EAAE,QAAQ,CAAC,EAEjG,CAAE,SAAUG,EAAc,SAAUC,CAAa,EAAIL,EAAS,oBAClE,CACE,OAAQJ,EAAW,OACnB,aAAW,MAAEA,EAAW,SAAS,EAAE,IAAIO,CAAqB,EAAE,QAAQ,CAAC,EACvE,YAAU,MAAEP,EAAW,QAAQ,EAAE,IAAIC,EAAS,QAAQ,EAAE,QAAQ,CAAC,EACjE,YAAU,MAAED,EAAW,QAAQ,EAAE,IAAIC,EAAS,QAAQ,EAAE,QAAQ,CAAC,EACjE,kBAAmBD,EAAW,iBAChC,EACAO,CACF,EAEMG,KAAW,MAAEnB,CAAQ,EAAE,IAAIW,CAAW,EAAE,IAAI,EAAE,EAC9CS,EAAezB,EAAS,eAAeC,CAAkB,EAE3DM,KAAiB,MAAEiB,CAAQ,EAAE,IAAIC,CAAY,EAAE,QAAQ,CAAC,KAExD,MAAElB,CAAc,EAAE,GAAG,GAAY,IACnCA,EAAiB,IAAa,SAAS,GAGzC,IAAImB,EAAS,IACTC,EAAS,IAEb,SAAI,MAAEL,CAAY,EAAE,GAAGP,EAAS,QAAQ,MAAK,MAAEA,EAAS,QAAQ,EAAE,GAAGQ,CAAY,EAC/EI,EAAS3B,EAAS,2BAAwB,MAAEe,EAAS,QAAQ,EAAE,IAAIQ,CAAY,EAAE,QAAQ,CAAC,EAAGhB,CAAc,KAClG,MAAEgB,CAAY,EAAE,GAAGR,EAAS,QAAQ,MAAK,MAAEA,EAAS,QAAQ,EAAE,GAAGO,CAAY,IACtFI,EAAS1B,EAAS,2BAAwB,MAAEe,EAAS,QAAQ,EAAE,IAAIO,CAAY,EAAE,QAAQ,CAAC,EAAGf,CAAc,GAGtG,CACL,OAAAmB,EACA,OAAAC,CACF,CACF,CACF,ECvFO,IAAMC,GAAN,KAAe,CACpB,OAAO,aAAaC,EAA0C,CAC5D,GAAM,CAAE,UAAAC,EAAW,cAAAC,EAAe,UAAAC,EAAW,SAAAC,EAAU,aAAAC,EAAc,sBAAAC,EAAuB,OAAAC,CAAO,EAAIP,EACjG,CAAE,uBAAAQ,EAAwB,2BAAAC,EAA4B,iBAAAC,EAAkB,gBAAAC,CAAgB,EAAIJ,EAClG,GAAID,EAAwB,GAAKA,EAAwB,IACvD,MAAM,IAAI,MAAM,iEAAiE,EAGnF,IAAIM,EAAO,GAEX,GAAIT,EAAYD,EACd,MAAM,IAAI,MAAM,0DAA0D,EACrE,GAAIC,IAAcD,GAAiBD,IAAc,EACtD,MAAM,IAAI,MAAM,+DAA+D,EAC1E,GAAIE,IAAcD,GAAiBD,IAAc,EACtD,MAAM,IAAI,MAAM,8DAA8D,EACrEE,IAAcD,GAAiBD,IAAc,IACtDW,EAAO,IAGT,IAAMC,EAAaC,GAEVC,EAAa,KAAK,IAAID,EAAIE,EAAaf,CAAS,EAAIC,EAGvDe,EAAY,CAACC,EAAeC,KAAkB,CAClD,IAAIC,EAAKL,EAAa,KAAK,IAAIC,EAAa,CAACf,CAAS,EAAI,KAAK,IAAIiB,EAAOjB,EAAY,CAAC,GAAMA,EAAY,GAAKC,EAAgBgB,EAC1HG,GAAKN,EAAa,KAAK,IAAIC,EAAa,CAACf,CAAS,EAAI,KAAK,IAAIkB,GAAOlB,EAAY,CAAC,GAAMA,EAAY,GAAKC,EAAgBiB,GAC9H,OAAOC,EAAIC,EACb,EAEMC,EAAmBC,GAEhBP,EAAc,KAAK,KAAKO,EAAQrB,GAAiBa,EAAY,EAAId,CAAS,EAG7EuB,EAAaD,GAETP,EAAc,KAAK,IAAIO,EAAQrB,EAAe,EAAID,EAAY,CAAC,GAAMA,EAAY,KAAK,IAAIc,EAAY,EAAId,CAAS,GAGvHwB,EAAaF,GACV,KAAK,KAAKA,EAAQrB,GAAiBa,EAAY,EAAId,CAAS,EAAIe,EAGnEU,EAA2B,CAACC,EAAyBC,GAAiBC,IAAyB,CACnG,IAAMC,GAAaF,GAAU,IACvBG,GAAQ,KAAK,IAAIJ,CAAe,EAAI,KAAK,IAAI,EAAIG,EAAU,EACjE,OAAOD,EAAM,KAAK,MAAME,EAAK,EAAI,KAAK,KAAKA,EAAK,CAClD,EAEMC,EAA8B,CAACD,EAAeH,KAA4B,CAC9E,IAAME,EAAaF,GAAU,IAC7B,OAAO,KAAK,IAAI,EAAIE,EAAYC,CAAK,CACvC,EAEMf,EAAeX,EAAeC,EAAyB,IACvDS,EAAaZ,EAAYD,EAEzB+B,EAAmB,CAAC,EACpBC,GAAoB,CAAC,EAEvBC,GAAWT,EAAyBxB,EAAeE,EAAU,EAAK,EAClEgC,GAAWV,EAAyBvB,EAAWC,EAAU,EAAK,EAC9DiC,EAAQ,EAERC,GAAUH,GACd,GAAIvB,EACFqB,EAAO,KAAK/B,CAAa,EACzBgC,GAAQ,KAAKhC,EAAgBc,CAAW,MAExC,MAAOsB,IAAWF,IAAU,CAC1B,IAAMb,EAAQS,EAA4BM,GAASlC,CAAQ,EACrDmC,GAAYP,EAA4BM,GAAU,EAAGlC,CAAQ,EAC7DoC,EAAYf,EAAUc,EAAS,EAAId,EAAUF,CAAK,EACxDc,EAAQA,EAAQG,EAChBN,GAAQ,KAAKM,EAAYjB,CAAK,EAC9BU,EAAO,KAAKV,CAAK,EACjBe,IACF,CAEF,IAAMG,EAAyB,CAC7B,YAAa,CACX,KAAM,CAAC,EACP,MAAO,EACP,MAAO,CACT,EACA,gBAAiB,CACf,KAAM,CAAC,EACP,MAAO,EACP,MAAO,CACT,EACA,UAAW,CACT,KAAM,CAAC,EACP,MAAO,EACP,MAAO,CACT,EACA,aAAc,CAAC,EACf,YAAa,CAAC,EACd,YAAavC,EAAgBG,EAC7B,UAAWF,EAAYE,EACvB,aAAc,CAChB,EACA,IAAIqC,EAAS3B,EAAa,IAG1B,IAAM4B,EAAsB,CAAC,EACzBC,EAAW,EACXC,EAAW,EACf,QAASC,EAAQ,EAAGA,EAAQtC,EAAwBsC,IAAS,CAC3D,IAAMC,GAAKD,EAAQ9B,GAAgBR,EAAyB,GACtDwC,EAAIpC,EAAOT,EAAYU,EAAUkC,EAAC,EACxCH,EAAWA,EAAWI,EAAIJ,EAAWI,EACrCH,EAAWA,EAAWG,EAAIH,EAAWG,EACrCL,EAAY,KAAK,CAAE,EAAAI,GAAG,EAAAC,CAAE,CAAC,CAC3B,CACAP,EAAO,YAAc,CACnB,KAAME,EACN,MAAOC,EACP,MAAOC,CACT,EAGA,IAAII,EAA0B,CAAC,EAC3BC,EAAe,EACfC,EAAe,EACnB,GAAIvC,EACFsC,EAAe,EACfC,EAAenC,EACfiC,EAAkB,CAChB,CAAE,EAAG/C,EAAe,EAAG,CAAE,EACzB,CAAE,EAAGA,EAAe,EAAGc,EAAc,CAAE,EACvC,CAAE,EAAGd,EAAe,EAAGc,CAAY,CACrC,MAEA,SAAS8B,EAAQ,EAAGA,EAAQrC,EAA4BqC,IAAS,CAC/D,IAAMC,GAAI7C,EAAgB4C,EAAQJ,EAC5BM,EAAIxB,EAAUuB,EAAC,EACrBE,EAAgB,KAAK,CAAE,EAAAF,GAAG,EAAAC,CAAE,CAAC,EAC7BE,EAAeA,EAAeF,EAAIE,EAAeF,EACjDG,EAAeA,EAAeH,EAAIG,EAAeH,CACnD,CAEFP,EAAO,gBAAkB,CACvB,KAAMQ,EACN,MAAOC,EACP,MAAOC,CACT,EAGA,IAAMC,EAAmB,CAAC,EACtBC,EAAc,EACdC,EAAc,EAClBrB,EAAO,QAAQ,CAACV,EAAOuB,KAAU,CAC/B,IAAMC,EAAIxB,EACJyB,GAAId,GAAQY,EAAK,EACvBM,EAAS,KAAK,CAAE,EAAAL,EAAG,EAAAC,EAAE,CAAC,EACtBK,EAAcA,EAAcL,GAAIK,EAAcL,GAC9CM,EAAcA,EAAcN,GAAIM,EAAcN,EAChD,CAAC,EACDP,EAAO,UAAY,CACjB,KAAMW,EACN,MAAOC,EACP,MAAOC,CACT,EAGA,IAAMC,EAA4B,CAAC,EAC/BC,EAAkB,EAClBC,EAAOzC,EAAcN,EACzB,KAAO8C,GAAmBxC,GAAa,CACrC,IAAMO,EAAQV,EAAU2C,CAAe,EACjCE,GAAIF,EACJG,EAAY1C,EAAUyC,GAAG,CAAC,EAChCH,EAAY,KAAK,CAAE,UAAWG,GAAG,MAAAnC,EAAO,aAAcoC,CAAU,CAAC,EACjEH,EAAkBA,EAAkBC,CACtC,CACAhB,EAAO,aAAec,EAGtB,IAAMK,EAAQ,KAAK,MAAM7C,EAAa,IAAW,EAAI,KAC/C8C,GAA2B,CAAC,EAClC,GAAIjD,EACFiD,GAAW,KAAK,CACd,UAAW7C,EACX,MAAOd,EACP,aAAcc,EAAcd,CAC9B,CAAC,MACI,CACL,IAAI4D,EAAI,EACJvC,GAAQrB,EACZ,KAAO4D,GAAKnD,GAAiB,CAC3B,IAAM6C,EAAkBlC,EAAgBC,EAAK,EACvCoC,GAAY1C,EAAUuC,EAAiB,CAAC,EAC9CK,GAAW,KAAK,CAAE,UAAWL,EAAiB,MAAOjC,GAAO,aAAcoC,EAAU,CAAC,EACrFpC,GAAQA,GAAQqC,EAChBE,EAAIA,EAAI,CACV,CACF,CACA,OAAArB,EAAO,YAAcoB,GACrBpB,EAAO,aAAeoB,GAAWA,GAAW,OAAS,CAAC,EAAE,aACjDpB,CACT,CACF,EV9JA,IAAAsB,GAA0B,8BAC1BC,GAAoC,6BACpCC,GAAoB,2BAEPC,GAAN,KAAkD,CAGvD,YAAYC,EAAmB,CAC7B,KAAK,KAAOA,CACd,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CAEA,MAAM,eAAeC,EAAqBC,EAAqBC,EAAkBC,EAAkD,CACjI,GAAI,CACF,IAAMC,EAAUC,GAAaL,EAAaC,EAAaC,EAAUC,CAAW,EACtE,CAAE,UAAAG,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,SAAAC,CAAS,KAAI,uBAAmBD,CAAS,EAC3CE,EAAM,MAAM,KAAK,KAAK,WAAW,sBAAsB,CAC3D,SAAUD,EACV,KAAM,CACJ,KAAM,kBACN,MAAOH,CACT,CACF,CAAC,EAED,SADe,oBAAgBI,CAAG,EACpB,MAAM,OAAO,MAAM,OAAO,OAC1C,OAASC,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,iBAC5B,CAAC,gBAAa,cAAc,EAAG,CAC7B,YAAAT,EACA,YAAAC,EACA,SAAAC,EACA,YAAAC,CACF,CACF,CAAC,CACH,CAGF,CAOA,MAAM,gBAAgBQ,EAAkC,MAAOC,EAAgB,GAAwC,CACrH,GAAM,CAAE,UAAAN,CAAU,EAAI,KAAK,KAAK,WAC1BO,EAAmC,CACvC,KAAM,CAAC,EACP,cAAe,EACjB,EAEMC,EAAWH,IAAoB,MAC/BI,EAAc,GAAGT,EAAU,UAAU,mBAC3C,GAAIQ,EAAU,CACZ,IAAME,EAAY,KAAK,KAAK,SAAyBD,EAAaH,CAAa,EAC/E,GAAII,GAAaA,EAAU,OAAS,EAClC,OAAAH,EAAS,KAAK,KAAK,GAAGG,CAAS,EACxBH,CAEX,CAEA,GAAI,CACF,IAAMI,EAAgB,GAAGX,EAAU,UAAU,8BACvCE,EAAM,MAAM,KAAK,KAAK,WAAW,kBAAkB,CAAE,cAAeS,CAAc,EAAGN,CAAe,EAC1GE,EAAS,cAAgBL,EAAI,cAC7BK,EAAS,YAAcL,EAAI,YAC3BA,EAAI,KAAK,QAASU,GAAW,CAC3B,IAAMC,EAAOC,GAAkBF,CAAM,EACrCL,EAAS,KAAK,KAAKM,CAAI,CACzB,CAAC,EAEGL,GACF,KAAK,KAAK,YAAY,GAAGR,EAAU,UAAU,qBAAsBO,EAAS,IAAI,CAEpF,OAASJ,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,iBAC9B,CAAC,CACH,CAEA,OAAOI,CACT,CAOA,MAAM,SAASF,EAAkC,MAAOC,EAAgB,GAAoC,CAC1G,IAAMC,EAA+B,CACnC,KAAM,CAAC,EACP,cAAe,EACjB,EAEMQ,EAAe,MAAM,KAAK,gBAAgBV,EAAiBC,CAAa,EAC9E,GAAIS,EAAa,KAAK,SAAW,EAC/B,OAAOR,EAGT,GAAI,CACF,IAAML,EAAM,MAAM,KAAK,KAAK,WAAW,gBACrCa,EAAa,KAAK,IAAKC,GAASA,EAAK,EAAE,EACvC,CACE,YAAa,GACb,SAAU,EACZ,CACF,EACAT,EAAS,cAAgBQ,EAAa,cACtCR,EAAS,YAAcQ,EAAa,YACpC,QAAWE,KAAUf,EAAK,CACxB,IAAMW,EAAOK,GAAcD,CAAM,EAC3BE,EAAW,GAAGN,EAAK,EAAE,eAC3B,KAAK,KAAK,YAAYM,EAAUN,CAAI,EACpCN,EAAS,KAAK,KAAKM,CAAI,CACzB,CACF,OAASV,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,UAC9B,CAAC,CACH,CAEA,OAAOI,CACT,CAUA,MAAM,WAAWa,EAA4BC,EAAgBzB,EAAkBU,EAAgB,GAA0B,CACvH,GAAI,CACF,IAAMa,EAAW,GAAGC,CAAkB,eAAeC,CAAM,GACrDC,EAAY,KAAK,KAAK,SAAoBH,EAAUb,CAAa,EACvE,GAAIgB,IAAc,OAChB,OAAOA,EAGT,IAAMC,EAAQC,EAAS,SAASH,CAAM,EAChC,CAACI,EAAYC,CAAa,EAAIF,EAAS,mBAAmBD,CAAK,EAM/DI,GAJW,MAAM,KAAK,KAAK,WAAW,sBAAsB,CAChE,SAAUP,EACV,KAAM,CAAE,KAAM,MAAO,MAAOK,CAAW,CACzC,CAAC,GACkB,KAAK,QAAQ,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAKC,CAAa,EAAE,OAC5FE,EAAWC,GAAaF,CAAM,EACpC,YAAK,KAAK,YAAYR,EAAUS,CAAQ,EACjCA,CACT,MAAgB,CACd,MAAO,CACL,OAAAP,EACA,SAAU,IACV,SAAU,IACV,UAAW,IACX,kBAAmBG,EAAS,4BAA4BH,EAAQzB,CAAQ,CAC1E,CACF,CACF,CAEA,MAAM,eAAekC,EAA0D,CAC7E,IAAMC,EAAoC,CAAC,EACrCC,EAAcF,EAAQ,IAAKG,GAAW,CAC1C,GAAM,CAAE,mBAAAb,EAAoB,OAAAC,EAAQ,SAAAzB,CAAS,EAAIqC,EAC3CV,EAAQC,EAAS,SAASH,CAAM,EAChC,CAACI,EAAYC,CAAa,EAAIF,EAAS,mBAAmBD,CAAK,EAC/DW,KAAmB,+BAA2Bd,EAAoBK,EAAY,MAAO,KAAK,EAChG,MAAO,CACL,WAAAA,EACA,cAAAC,EACA,OAAAL,EACA,SAAAzB,EACA,mBAAAwB,EACA,iBAAAc,CACF,CACF,CAAC,EAUD,OARY,MAAM,KAAK,KAAK,WAAW,gBACrCF,EAAY,IAAKC,GAAWA,EAAO,gBAAgB,EACnD,CACE,YAAa,GACb,SAAU,EACZ,CACF,GAEI,QAAQ,CAACjB,EAAMmB,IAAU,CAC3B,GAAM,CAAE,cAAAT,EAAe,mBAAAN,EAAoB,SAAAxB,EAAU,OAAAyB,CAAO,EAAIW,EAAYG,CAAK,EACjF,GAAI,CAEF,IAAMC,KADS,oBAAgBpB,CAAI,EACV,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAKU,CAAa,EAAE,OAC9EE,EAAWC,GAAaO,CAAS,EACvCL,EAAc,KAAK,CACjB,GAAGH,EACH,mBAAoBR,EACpB,SAAUxB,CACZ,CAAC,CACH,MAAgB,CACdmC,EAAc,KAAK,CACjB,OAAAV,EACA,SAAU,IACV,SAAU,IACV,UAAW,IACX,kBAAmBG,EAAS,4BAA4BH,EAAQzB,CAAQ,EACxE,mBAAoBwB,EACpB,SAAUxB,CACZ,CAAC,CACH,CACF,CAAC,EAEMmC,CACT,CAEA,MAAM,gBAAgBE,EAAiD,CACrE,GAAM,CAAE,UAAAjC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,QAAAqC,EAAS,YAAA3C,EAAa,YAAAC,CAAY,EAAIsC,EACxCK,EAAkB,IAAI,eAC5BA,EAAG,SAAS,CACV,OAAQ,GAAGtC,EAAU,YAAY,6BACjC,UAAW,CAACsC,EAAG,OAAOD,CAAO,CAAC,EAC9B,cAAe,CAAC3C,EAAaC,CAAW,CAC1C,CAAC,EAED,IAAMO,EAAM,MAAM,KAAK,KAAK,WAAW,2BAA2B,CAChE,iBAAkBoC,EAClB,UAAQ,wBAAoB,KAAK,CACnC,CAAC,EASD,OARmB,OAAI,OAAO,UAAW,CACvC,cAAe,OAAI,IAAI,EACvB,aAAc,OAAI,IAAI,EACtB,eAAgB,OAAI,IAAI,CAC1B,CAAC,EAE0B,MAAM,WAAW,KAAKpC,EAAI,QAAS,CAAC,EAAE,aAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAGvF,CAEA,MAAM,eAAe+B,EAAoD,CACvE,GAAM,CAAE,UAAAjC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,QAAAqC,EAAS,YAAA3C,EAAa,YAAAC,CAAY,EAAIsC,EACxCM,EAAQ,IACRC,EAAyB,CAAC,EAC5BC,EACAC,EAAU,GACd,KAAOA,GAAS,CACd,IAAMJ,EAAkB,IAAI,eACxBK,EACAF,IAAiB,OACnBE,EAAYL,EAAG,SAAS,CACtB,OAAQ,oBACR,UAAW,CAACA,EAAG,KAAK,IAAI,UAAO,YAAQ,OAAOG,CAAY,CAAC,CAAC,CAAC,CAAC,EAC9D,cAAe,CAAC,KAAK,CACvB,CAAC,EAEDE,EAAYL,EAAG,SAAS,CACtB,OAAQ,oBACR,cAAe,CAAC,KAAK,CACvB,CAAC,EAGHA,EAAG,SAAS,CACV,OAAQ,GAAGtC,EAAU,YAAY,qBACjC,UAAW,CAACsC,EAAG,OAAOD,CAAO,EAAGM,EAAWL,EAAG,KAAK,IAAIC,CAAK,CAAC,EAC7D,cAAe,CAAC7C,EAAaC,CAAW,CAC1C,CAAC,EACD,IAAMO,EAAM,MAAM,KAAK,KAAK,WAAW,2BAA2B,CAChE,iBAAkBoC,EAClB,UAAQ,wBAAoB,KAAK,CACnC,CAAC,EAEKM,EAAOC,GAAiB3C,CAAG,EACjCsC,EAAU,KAAK,GAAGI,CAAI,EACtBH,EAAeG,EAAK,OAAS,EAAIA,EAAKA,EAAK,OAAS,CAAC,EAAE,OAAS,EAAI,OACpEF,EAAUE,EAAK,SAAWL,CAC5B,CAEA,OAAOC,EAAU,KAAK,CAACM,EAAGC,IAAMD,EAAE,OAASC,EAAE,MAAM,CACrD,CAEA,MAAM,uBAAuB,CAC3B,QAAAV,EACA,gBAAAhC,EACA,MAAA2C,EAAQ,aACR,aAAAC,CACF,EAK2C,CACzC,GAAM,CAAE,WAAYC,EAAY,WAAAC,CAAW,EAAI,KAAK,KAChDC,EACAH,EACFG,KAAS,qBAAiB,IAAI,aAAU,CAAE,IAAKH,CAAa,CAAC,CAAC,EAE9DG,EAASF,EAEX,IAAMG,EAAsC,CAC1C,KAAM,CAAC,EACP,cAAe,EACjB,EAEMd,EAAQ,GACRe,EAAQjD,EACRkD,EAAalD,EAAgB,OAAS,GAC5C,EAAG,CACD,IAAMH,EAAM,MAAMkD,EAAO,6BAA6B,CAAE,cAAef,CAAQ,EAAG,CAAE,GAAGiB,EAAO,MAAO,EAAG,EAAGN,CAAK,EAChH9C,EAAI,KAAK,QAAQ,CAACc,EAAMmB,IAAU,CAChC,IAAMqB,EAAWC,GAAyBzC,EAAMmB,EAAOgB,EAAW,UAAU,WAAYd,CAAO,EAC/FgB,EAAK,KAAO,CAAC,GAAGA,EAAK,KAAM,GAAGG,CAAQ,CACxC,CAAC,EACDH,EAAK,cAAgBnD,EAAI,cACzBmD,EAAK,YAAcnD,EAAI,YACvBoD,EAAM,OAASpD,EAAI,WACrB,OAASmD,EAAK,KAAK,OAASE,GAAcF,EAAK,eAE/C,OAAIA,EAAK,KAAK,OAASE,IACrBF,EAAK,KAAOA,EAAK,KAAK,MAAM,EAAGE,CAAU,EACzCF,EAAK,cAAgB,IAEnBA,EAAK,KAAK,OAAS,IACrBA,EAAK,YAAcA,EAAK,KAAKA,EAAK,KAAK,OAAS,CAAC,EAAE,IAG9CA,CACT,CAUA,MAAM,gBAAgBjC,EAA4BsC,EAAsBC,EAAsB/D,EAAwC,CACpI,IAAM4C,EAAyB,CAAC,EAChC,QAASnB,EAASqC,EAAcrC,GAAUsC,EAActC,IAAU,CAChE,IAAMO,EAAW,MAAM,QAAQ,IAAI,CAAC,KAAK,WAAWR,EAAoBC,EAAQzB,CAAQ,CAAC,CAAC,EAC1F4C,EAAU,KAAK,GAAGZ,CAAQ,CAC5B,CACA,OAAOY,CACT,CAOA,MAAM,kBAAkBoB,EAAgD,CACtE,GAAIA,EAAgB,SAAW,EAC7B,MAAO,CAAC,EAGV,IAAMC,EAAsB,CAAC,EAE7B,GAAI,CACF,IAAM3D,EAAM,MAAM,KAAK,KAAK,WAAW,gBAAgB0D,EAAiB,CACtE,YAAa,GACb,SAAU,EACZ,CAAC,EACD,QAAW3C,KAAUf,EAAK,CACxB,IAAMW,EAAOK,GAAcD,CAAM,EAC3BE,EAAW,GAAGN,EAAK,EAAE,eAC3B,KAAK,KAAK,YAAYM,EAAUN,CAAI,EACpCgD,EAAQ,KAAKhD,CAAI,CACnB,CACF,OAASV,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,mBAC9B,CAAC,CACH,CAEA,OAAO0D,CACT,CAQA,MAAM,QAAQxB,EAAiB/B,EAAgB,GAAyB,CACtE,GAAI,CACF,IAAMa,EAAW,GAAGkB,CAAO,eACrBf,EAAY,KAAK,KAAK,SAAmBH,EAAUb,CAAa,EACtE,GAAIgB,IAAc,OAChB,OAAOA,EAET,IAAML,EAAS,MAAM,KAAK,KAAK,WAAW,UAAU,CAClD,GAAIoB,EACJ,QAAS,CACP,SAAU,GACV,YAAa,EACf,CACF,CAAC,EACKxB,EAAOK,GAAcD,CAAM,EACjC,YAAK,KAAK,YAAYE,EAAUN,CAAI,EAC7BA,CACT,OAASV,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,UAC5B,CAAC,gBAAa,cAAc,EAAGkC,CACjC,CAAC,CACH,CACF,CAOA,MAAM,iCAAiCJ,EAA+D,CACpG,GAAM,CACJ,SAAArC,EACA,IAAAkE,EACA,YAAApE,EACA,YAAAC,EACA,UAAA6C,EACA,gBAAAuB,EACA,MAAAC,EACA,YAAAC,EACA,YAAAC,EACA,WAAAC,EACA,WAAAC,EACA,cAAAC,EACA,cAAAC,EACA,YAAAzE,EACA,QAAAwC,CACF,EAAIJ,EAEAyB,EACAC,EACAY,EACAC,EAAkChC,EAItC,GAFuBuB,IAAoB,SAGzCL,EAAelC,EAAS,kBAAkByC,EAAarE,EAAU,GAAOuE,EAAYC,CAAU,EAC9FT,EAAenC,EAAS,kBAAkB0C,EAAatE,EAAU,GAAMuE,EAAYC,CAAU,EAC7FG,EAAY/C,EAAS,kBAAkBwC,EAAOpE,EAAU,GAAMuE,EAAYC,CAAU,MAC/E,CACLV,EAAelC,EAAS,qBAAkB,MAAE,CAAC,EAAE,IAAI0C,CAAW,EAAE,SAAS,EAAGtE,EAAU,GAAOuE,EAAYC,CAAU,EACnHT,EAAenC,EAAS,qBAAkB,MAAE,CAAC,EAAE,IAAIyC,CAAW,EAAE,SAAS,EAAGrE,EAAU,GAAMuE,EAAYC,CAAU,EAClHG,EAAY/C,EAAS,qBAAkB,MAAE,CAAC,EAAE,IAAIwC,CAAK,EAAE,SAAS,EAAGpE,EAAU,GAAOuE,EAAYC,CAAU,EAE1G,IAAMK,EAA+C,CACnD,QAAApC,EACA,SAAUG,EAAU,SACpB,SAAUA,EAAU,SACpB,UAAA+B,EACA,SAAA3E,EACA,aAAA8D,EACA,aAAAC,EACA,mBAAoB,OACpB,cAAe1B,EAAO,aACxB,EAEAuC,EAAgB,MAAM,KAAK,IAAI,SAAS,0BAA0BC,CAAe,CACnF,CAEA,IAAMC,EAAiD,CACrD,SAAA9E,EACA,IAAAkE,EACA,YAAApE,EACA,YAAAC,EACA,UAAW6E,EACX,aAAAd,EACA,aAAAC,EACA,UAAAY,EACA,cAAAF,EACA,cAAAC,EACA,YAAAzE,CACF,EAEA,OAAO,KAAK,iCAAiC6E,CAAsB,CACrE,CAQA,kBAAkBzC,EAA0BK,EAA4C,CACtF,GAAM,CAAE,UAAAtC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,SAAAJ,EAAU,YAAAC,EAAa,IAAAiE,EAAK,YAAApE,EAAa,YAAAC,EAAa,UAAA4E,CAAU,EAAItC,EAC5EK,EAAKA,GAAM,IAAI,eAEf,GAAM,CAAE,YAAAqC,EAAa,iBAAAC,EAAkB,aAAAC,CAAa,KAAI,uBAAmB7E,CAAS,EAE9E,CAAC8E,EAAMzC,CAAO,EAAIC,EAAG,SAAS,CAClC,OAAQ,GAAGtC,EAAU,YAAY,6BACjC,UAAW,CACTsC,EAAG,OAAOqC,CAAW,EACrBrC,EAAG,KAAK,IAAI1C,CAAQ,EACpB0C,EAAG,KAAK,IAAIzC,CAAW,EACvByC,EAAG,KAAK,IAAI,UAAO,YAAQ,OAAOiC,CAAS,CAAC,CAAC,CAAC,EAC9CjC,EAAG,KAAK,OAAOwB,GAAO,EAAE,EACxBxB,EAAG,OAAOsC,CAAgB,EAC1BtC,EAAG,OAAOuC,CAAY,EACtBvC,EAAG,OAAO,gBAAa,CACzB,EACA,cAAe,CAAC5C,EAAaC,CAAW,CAC1C,CAAC,EAED,OAAA2C,EAAG,SAAS,CACV,OAAQ,GAAGtC,EAAU,YAAY,8BACjC,UAAW,CAACsC,EAAG,OAAOwC,CAAI,EAAGzC,EAASC,EAAG,OAAOuC,CAAY,CAAC,EAC7D,cAAe,CAACnF,EAAaC,CAAW,CAC1C,CAAC,EAEM0C,CACT,CAOA,iCAAiCJ,EAA6C,CAC5E,GAAM,CACJ,SAAArC,EACA,YAAAC,EACA,IAAAiE,EACA,UAAAS,EACA,YAAA7E,EACA,YAAAC,EACA,UAAA6C,EACA,aAAAkB,EACA,aAAAC,EACA,cAAAU,EACA,cAAAC,CACF,EAAIrC,EAEEK,EAAK,IAAI,kBAEX,uBAAgB,gBAAY5C,EAAa,EAAK,KAAG,gBAAYC,EAAa,EAAK,CAAC,GAClFS,4BAAmD,IAAI,MAAM,4BAA4B,EAAG,CAC1F,CAAC,gBAAa,WAAW,EAAG,mCAC5B,CAAC,gBAAa,cAAc,EAAG6B,CACjC,CAAC,EAGH,IAAM8C,EAAQpB,EAAeD,EAAe,EACxCqB,EAAQ,KACV3E,oBAA2C,IAAI,MAAM,oBAAoB,EAAG,CAC1E,CAAC,gBAAa,WAAW,EAAG,eAC5B,CAAC,gBAAa,cAAc,EAAG6B,CACjC,CAAC,EAGH,QAAQ,IAAI,yDAAmD,CAC7D,GAAGA,EACH,MAAA8C,CACF,CAAC,EAeD,IAAMC,EAAuC,CAC3C,QAbc,KAAK,kBACnB,CACE,UAAAT,EACA,SAAA3E,EACA,YAAAC,EACA,YAAAH,EACA,YAAAC,CACF,EACA2C,CACF,EAKE,UAAAE,EACA,YAAA9C,EACA,YAAAC,EACA,aAAA+D,EACA,aAAAC,EACA,UAAAY,EACA,cAAAF,EACA,cAAAC,EACA,mBAAoB,EACpB,SAAA1E,CACF,EACA,YAAK,IAAI,SAAS,oBAAoBoF,EAAW1C,CAAE,EAE5CA,CACT,CACF,EWpoBA,IAAA2C,GAAsD,qCAGzCC,GAA0B,CACrC,IAAK,UACL,aAAc,qBACd,cAAe,sBACf,UAAW,CACT,WAAY,qEACZ,aAAc,qEACd,QAAS,EACT,OAAQ,CACN,YAAa,qEACb,SAAU,qEACV,iBAAkB,qEAClB,aAAc,qEACd,aAAc,qEACd,YAAa,oEACf,CACF,EACA,YAAa,CACX,WAAY,qEACZ,aAAc,qEACd,QAAS,CACX,EACA,OAAQ,CACN,WAAY,qEACZ,aAAc,qEACd,QAAS,CACX,CACF,EC9BA,IAAAC,EAAiG,qCACjGC,GAA0E,oCAC1EC,GAAoC,6BAsC7B,IAAMC,GAAN,KAAsD,CAG3D,YAAYC,EAAmB,CAC7B,KAAK,KAAOA,CACd,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CAEA,mBAA4B,CAE1B,MAAO,GADY,KAAK,KAAK,WAAW,UAAU,UAC9B,sBACtB,CAEA,MAAM,qBAAqBC,EAAwC,CACjE,IAAMC,EAAuB,CAAC,EAC9B,GAAI,EACU,MAAM,KAAK,KAAK,WAAW,sBAAsBD,EAAO,CAClE,QAAS,CAAE,SAAU,GAAM,YAAa,GAAM,UAAW,EAAK,EAC9D,OAAQ,CACN,WAAY,KAAK,kBAAkB,CACrC,CACF,CAAC,GAEG,KAAK,QAASE,GAAQ,CACxBD,EAAK,KAAKE,GAAkBD,CAAG,CAAC,CAClC,CAAC,CACH,OAASE,EAAO,CACd,QAAQ,IAAI,6DAAuDA,CAAK,EACxEC,mBAA0CD,EAAgB,CACxD,CAAC,eAAa,WAAW,EAAG,uBAC5B,CAAC,eAAa,cAAc,EAAGJ,CACjC,CAAC,CACH,CAEA,OAAOC,CACT,CAEA,MAAM,YAAYK,EAA4C,CAC5D,GAAI,CACF,IAAMC,EAAM,MAAM,KAAK,KAAK,WAAW,UAAU,CAAE,GAAID,EAAa,QAAS,CAAE,SAAU,GAAM,YAAa,GAAM,UAAW,EAAK,CAAE,CAAC,EACrI,OAAOH,GAAkBI,CAAG,CAC9B,OAASH,EAAO,CACd,eAAQ,IAAI,oDAA8CA,CAAK,EACxDC,mBAA0CD,EAAgB,CAC/D,CAAC,eAAa,WAAW,EAAG,cAC5B,CAAC,eAAa,cAAc,EAAGE,CACjC,CAAC,CACH,CACF,CAQA,kBAAkBE,EAA0BC,EAA+B,CACzE,GAAM,CAAE,QAAAC,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAIJ,EACrD,CAAE,UAAAK,CAAU,EAAI,KAAK,IAAI,WACzB,CAAE,aAAAC,EAAc,iBAAAC,CAAiB,KAAI,sBAAmBF,CAAS,EAEvEJ,EAAKA,GAAM,IAAI,eAEf,GAAM,CAACO,EAAeC,CAAa,EAAIR,EAAG,SAAS,CACjD,OAAQ,GAAGI,EAAU,YAAY,+BACjC,UAAW,CAACJ,EAAG,OAAOC,CAAO,EAAGD,EAAG,OAAOH,CAAW,EAAGG,EAAG,OAAOM,CAAgB,EAAGN,EAAG,OAAOK,CAAY,CAAC,EAC5G,cAAe,CAACH,EAAaC,CAAW,CAC1C,CAAC,EAEKM,EAAY,aAAW,YAAYF,EAAeL,EAAaF,CAAE,EACjEU,EAAY,aAAW,YAAYF,EAAeL,EAAaH,CAAE,EACvE,OAAAA,EAAG,gBAAgB,CAACS,EAAWC,CAAS,EAAG,KAAK,IAAI,iBAAiB,CAAC,EAE/DV,CACT,CAQA,4BAA4BD,EAA2CC,EAAiB,CACtF,GAAM,CAAE,UAAAI,CAAU,EAAI,KAAK,IAAI,WACzB,CAAE,aAAAC,CAAa,KAAI,sBAAmBD,CAAS,EAC/C,CAAE,QAAAH,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAIJ,EAC3D,OAAAC,EAAG,SAAS,CACV,OAAQ,GAAGI,EAAU,YAAY,0CACjC,UAAW,CAACJ,EAAG,OAAOC,CAAO,EAAGD,EAAG,KAAK,GAAGH,CAAW,EAAGG,EAAG,OAAOK,CAAY,EAAGL,EAAG,OAAO,eAAa,CAAC,EAC1G,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,EAEMH,CACT,CAQA,qBAAqBW,EAAgCX,EAA+B,CAClF,GAAM,CAAE,UAAAI,CAAU,EAAI,KAAK,IAAI,WACzB,CAAE,aAAAC,EAAc,iBAAAC,CAAiB,KAAI,sBAAmBF,CAAS,EAEvE,OAAAJ,EAAKA,GAAM,IAAI,eAEfW,EAAQ,QAASZ,GAAW,CAC1B,GAAM,CAAE,QAAAE,EAAS,YAAAJ,EAAa,aAAAe,EAAc,YAAAV,EAAa,YAAAC,CAAY,EAAIJ,EAEzEa,EAAa,QAASC,GAAgB,CACpC,IAAMC,EAAsBd,EAAG,SAAS,CACtC,OAAQ,GAAGI,EAAU,YAAY,kCACjC,UAAW,CAACJ,EAAG,OAAOC,CAAO,EAAGD,EAAG,OAAOH,CAAW,EAAGG,EAAG,OAAOM,CAAgB,EAAGN,EAAG,OAAOK,CAAY,CAAC,EAC5G,cAAe,CAACH,EAAaC,EAAaU,CAAW,CACvD,CAAC,EAEKE,EAAkB,aAAW,YAAYD,EAAqBD,EAAab,CAAE,EACnFA,EAAG,gBAAgB,CAACe,CAAe,EAAG,KAAK,IAAI,iBAAiB,CAAC,CACnE,CAAC,CACH,CAAC,EAEMf,CACT,CAEA,2BAA2BW,EAAsCX,EAA+B,CAC9F,OAAAA,EAAKA,GAAM,IAAI,eAEfW,EAAQ,QAASZ,GAAW,CAC1B,GAAM,CAAE,QAAAE,EAAS,YAAAJ,EAAa,aAAAe,EAAc,YAAAV,EAAa,YAAAC,CAAY,EAAIJ,EAEzE,KAAK,4BAA4B,CAAE,QAAAE,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAEvF,KAAK,kBAAkB,CAAE,QAAAC,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAC7E,KAAK,qBAAqB,CAAC,CAAE,QAAAC,EAAS,YAAAJ,EAAa,aAAAe,EAAc,YAAAV,EAAa,YAAAC,CAAY,CAAC,EAAGH,CAAE,CAClG,CAAC,EAEMA,CACT,CAQA,yBAAyBW,EAAyCX,EAA8B,CAC9F,GAAM,CAAE,QAAAC,EAAS,UAAAe,EAAW,mBAAAC,EAAoB,SAAAC,EAAU,YAAAhB,EAAa,YAAAC,CAAY,EAAIQ,EACjF,CAAE,YAAAQ,CAAY,EAAI,KAAK,IAAI,WAE3BC,EAAYC,EAAS,YAAYL,EAAWE,EAAUD,CAAkB,EACxEK,EAAgB,UAAO,WAAQ,OAAON,CAAS,CAAC,CAAC,EAEvD,OAAAhB,EAAG,SAAS,CACV,OAAQ,GAAGmB,EAAY,YAAY,uCACnC,UAAW,CACT,OAAOlB,GAAY,SAAWD,EAAG,OAAOC,CAAO,EAAIA,EACnDD,EAAG,KAAK,IAAI,OAAOsB,CAAa,CAAC,EACjCtB,EAAG,KAAK,IAAI,OAAOoB,CAAS,CAAC,CAC/B,EACA,cAAe,CAAClB,EAAaC,CAAW,CAC1C,CAAC,EAEMH,CACT,CAOA,qBAAqBD,EAA6BC,EAA+B,CAC/EA,EAAKA,GAAM,IAAI,eACf,GAAM,CAAE,WAAAuB,EAAY,WAAAC,CAAW,EAAI,KAAK,+BAA+BzB,EAAQC,CAAE,EACjF,OAAAA,EAAG,gBAAgB,CAACuB,EAAYC,CAAU,EAAG,KAAK,IAAI,iBAAiB,CAAC,EACjExB,CACT,CAQA,+BACED,EACAC,EACkF,CAClF,GAAM,CAAE,QAAAC,EAAS,YAAAJ,EAAa,aAAAe,EAAc,YAAAV,EAAa,YAAAC,CAAY,EAAIJ,EACnE,CAAE,UAAAK,CAAU,EAAI,KAAK,IAAI,WACzB,CAAE,aAAAC,EAAc,iBAAAC,CAAiB,KAAI,sBAAmBF,CAAS,EAEvEJ,EAAKA,GAAM,IAAI,eAEf,KAAK,4BAA4B,CAAE,QAAAC,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAEvF,KAAK,qBAAqB,CAAC,CAAE,QAAAC,EAAS,YAAAJ,EAAa,aAAAe,EAAc,YAAAV,EAAa,YAAAC,CAAY,CAAC,EAAGH,CAAE,EAEhG,GAAM,CAACyB,EAAqBC,EAAgBC,CAAc,EAAI3B,EAAG,SAAS,CACxE,OAAQ,GAAGI,EAAU,YAAY,yBACjC,UAAW,CACTJ,EAAG,OAAOC,CAAO,EACjBD,EAAG,OAAOH,CAAW,EACrBG,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,EAEKoB,EAAa,aAAW,YAAYG,EAAgBxB,EAAaF,CAAE,EACnEwB,EAAa,aAAW,YAAYG,EAAgBxB,EAAaH,CAAE,EAEzE,OAAAA,EAAG,SAAS,CACV,OAAQ,GAAGI,EAAU,YAAY,sCACjC,UAAW,CAACqB,EAAqBzB,EAAG,OAAOK,CAAY,CAAC,EACxD,cAAe,CAAC,CAClB,CAAC,EAEM,CACL,WAAAkB,EACA,WAAAC,CACF,CACF,CAUA,MAAM,sBACJI,EACAC,EACAC,EACAd,EACAE,EACAa,EAAgB,GACgB,CAChC,GAAIf,GAAac,GAAgBd,GAAaa,EAE5C,OADiB,MAAM,KAAK,KAAK,KAAK,WAAWD,EAAoBZ,EAAWE,EAAUa,CAAa,CAI3G,CAOA,6BAA6BhC,EAAmG,CAC9H,GAAM,CAAE,KAAAiC,EAAM,UAAAhB,EAAW,YAAAiB,CAAY,EAAIlC,EACnCmC,EAAa,iBAAkBnC,EAE/BoC,EAASH,EAAK,OAAQI,GAAQA,EAAI,OAASpB,CAAS,EACpDqB,EAASL,EAAK,OAAQI,GAAQA,EAAI,OAASpB,CAAS,EAEtDsB,KAAe,KAAE,CAAC,EAClBC,KAAc,KAAE,CAAC,EACjBC,EAAyB,CAAC,EAE9B,GAAIN,EAAY,CACdM,EAAY,CAAC,GAAGR,CAAI,EACpB,GAAM,CAAE,aAAAS,CAAa,EAAI1C,EACnB2C,EAAaV,EAAK,KAAMI,GAAQA,EAAI,SAAWpB,CAAS,EACxD2B,EAAiBN,EAAO,OAAO,CAACO,EAAKR,OAAQ,KAAEQ,CAAG,EAAE,KAAKR,EAAI,QAAQ,KAAG,KAAE,CAAC,CAAC,EAAE,IAAIM,GAAY,UAAY,GAAG,EAC7GG,EAAiBV,EAAO,OAAO,CAACS,EAAKR,OAAQ,KAAEQ,CAAG,EAAE,KAAKR,EAAI,QAAQ,KAAG,KAAE,CAAC,CAAC,EAAE,IAAIM,GAAY,UAAY,GAAG,EACnHJ,EAAeG,EAAeE,EAAiBE,EAE/CN,KAAc,KAAEN,CAAW,EAAE,IAAIK,CAAY,KAAI,KAAE,CAAC,KAAI,KAAEL,CAAW,EAAE,IAAIK,CAAY,CACzF,KAAO,CACL,GAAM,CAAE,UAAAQ,CAAU,EAAI/C,EACtByC,EAAYM,EAAYT,EAASF,EACjCG,EAAeE,EAAU,OAAO,CAACI,EAAKR,OAAQ,KAAEQ,CAAG,EAAE,KAAKE,EAAYV,EAAI,SAAWA,EAAI,QAAQ,KAAG,KAAE,CAAC,CAAC,EAExGG,KAAc,KAAEN,CAAW,EAAE,IAAIK,CAAY,KAAI,KAAE,CAAC,KAAI,KAAEL,CAAW,EAAE,IAAIK,CAAY,CACzF,CAEA,SAAI,KAAEA,CAAY,EAAE,OAAO,EAClB1C,0BAAiD,IAAI,MAAM,wBAAwB,EAAG,CAC3F,CAAC,eAAa,WAAW,EAAG,iCAC5B,CAAC,eAAa,cAAc,EAAGG,CACjC,CAAC,EAGiBsB,EAAS,kBAAkB,CAAC,GAAGmB,CAAS,EAAGD,EAAY,QAAQ,CAAC,CAGtF,CAOA,MAAM,0BAA0BxC,EAAsG,CACpI,IAAMgD,EAAa,iBAAkBhD,EAC/B,CAAE,UAAAiB,EAAW,SAAAE,EAAU,aAAAW,EAAc,aAAAC,EAAc,mBAAAkB,EAAoB,cAAAC,EAAe,QAAAhD,CAAQ,EAAIF,EAEpGmD,EACJ,GAAIH,EAAY,CACd,GAAM,CAAE,YAAAd,EAAa,aAAAQ,CAAa,EAAI1C,EACtCmD,EAAYC,GAAc,yBACxBnC,EACAE,EACAe,EACAQ,EACAZ,EACAC,EACAmB,EACAD,CACF,CACF,MACEE,EAAYC,GAAc,4BACxBnC,EACAE,EACAW,EACAC,EACA/B,EAAO,SACPA,EAAO,SACPkD,EACAD,CACF,EAEF,GAAIA,GAAsB/C,EAAS,CACjC,IAAMmD,EAAmBF,EAAU,KAAK,UAAWd,GAAQA,EAAI,SAAWpB,CAAS,EACnF,GAAIoC,IAAqB,GAAI,CAC3B,IAAMC,EAAO,MAAM,KAAK,KAAK,KAAK,QAAQpD,EAAS,EAAK,EACxD,GAAIoD,EAAM,CACR,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIC,GAAS,mBAClCR,EACAE,EAAU,KAAKE,CAAgB,EAC/BC,EAAK,mBACP,EACMX,EAAaQ,EAAU,KAAKE,CAAgB,EAClDV,EAAW,YAAW,KAAEA,EAAW,QAAQ,EAAE,IAAIY,CAAM,EAAE,QAAQ,CAAC,EAClEZ,EAAW,YAAW,KAAEA,EAAW,QAAQ,EAAE,IAAIa,CAAM,EAAE,QAAQ,CAAC,EAClEL,EAAU,KAAKE,CAAgB,EAAIV,CACrC,CACF,CACF,CAEA,OAAOQ,CACT,CAOA,uBAAuBnD,EAA4C,CACjE,IAAMC,EAAK,IAAI,eACT,CAAE,WAAAuB,EAAY,WAAAC,CAAW,EAAI,KAAK,iCAAiCzB,EAAQC,CAAE,EACnF,OAAAA,EAAG,gBAAgB,CAACuB,EAAYC,CAAU,EAAG,KAAK,IAAI,iBAAiB,CAAC,EACjExB,CACT,CAEA,iCACED,EACAC,EAIA,CACA,GAAM,CACJ,QAAAC,EACA,YAAAJ,EACA,UAAAqD,EACA,aAAAtC,EACA,SAAA6C,EACA,YAAAvD,EACA,YAAAC,EACA,UAAAa,EACA,YAAA0C,EACA,SAAAxC,EACA,eAAAyC,CACF,EAAI5D,EACE,CAAE,UAAAK,CAAU,EAAI,KAAK,IAAI,WACzB,CAAE,KAAA4B,CAAK,EAAIkB,GAEbQ,GAAe9C,EAAa,OAAS,IACvC,KAAK,4BAA4B,CAAE,QAAAX,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAErF0D,GACF,KAAK,kBAAkB,CAAE,QAAAzD,EAAS,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAG/E,KAAK,qBAAqB,CAAC,CAAE,QAAAC,EAAS,YAAAJ,EAAa,aAAAe,EAAc,YAAAV,EAAa,YAAAC,CAAY,CAAC,EAAGH,CAAE,EAEhG,GAAM,CAAE,aAAAK,EAAc,iBAAAC,CAAiB,KAAI,sBAAmBF,CAAS,EAEvE,GAAIuD,EAAgB,CAClB,IAAMC,KAAiB,WAAQ,OAAO5B,EAAK,CAAC,EAAE,MAAM,CAAC,EAC/C6B,KAAiB,WAAQ,OAAO7B,EAAKA,EAAK,OAAS,CAAC,EAAE,MAAM,CAAC,EAC7D8B,EAAuB,UAAO,KAAEH,CAAc,EAAE,IAAI,GAAW,EAAE,QAAQ,CAAC,CAAC,EAC3E,CAACjC,EAAgBC,CAAc,EAAI3B,EAAG,SAAS,CACnD,OAAQ,GAAGI,EAAU,YAAY,sCACjC,UAAW,CACTJ,EAAG,OAAOC,CAAO,EACjBD,EAAG,OAAOH,CAAW,EACrBG,EAAG,KAAK,IAAI,OAAO4D,CAAc,CAAC,EAClC5D,EAAG,KAAK,IAAI,OAAO6D,CAAc,CAAC,EAClC7D,EAAG,KAAK,IAAI8D,CAAoB,EAChC9D,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,EACKoB,EAAa,aAAW,YAAYG,EAAgBxB,EAAaF,CAAE,EACnEwB,GAAa,aAAW,YAAYG,EAAgBxB,EAAaH,CAAE,EAEzE,YAAK,yBAAyB,CAAE,QAAAC,EAAS,UAAAe,EAAW,mBAAoByC,EAAU,SAAAvC,EAAU,YAAAhB,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAEnH,CACL,WAAAuB,EACA,WAAAC,EACF,CACF,KAAO,CACL,IAAMuC,EAAc/D,EAAG,KAAK,OAC1B,MACAgC,EAAK,IAAKI,IAAQ,UAAO,WAAQ,OAAOA,GAAI,MAAM,CAAC,CAAC,CAAC,CACvD,EACM4B,EAAoBhE,EAAG,KAAK,OAChC,OACAgC,EAAK,IAAKI,IAAQA,GAAI,SAAU,CAClC,EAEM,CAACV,EAAgBC,CAAc,EAAI3B,EAAG,SAAS,CACnD,OAAQ,GAAGI,EAAU,YAAY,2BACjC,UAAW,CACTJ,EAAG,OAAOC,CAAO,EACjBD,EAAG,OAAOH,CAAW,EACrBkE,EACAC,EACAhE,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,EAED,KAAK,yBAAyB,CAAE,QAAAF,EAAS,UAAAe,EAAW,mBAAoByC,EAAU,SAAAvC,EAAU,YAAAhB,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAE1H,IAAMuB,EAAa,aAAW,YAAYG,EAAgBxB,EAAaF,CAAE,EACnEwB,EAAa,aAAW,YAAYG,EAAgBxB,EAAaH,CAAE,EAEzE,MAAO,CACL,WAAAuB,EACA,WAAAC,CACF,CACF,CACF,CAOA,MAAM,6BAA6BzB,EAAkE,CACnG,GAAM,CACJ,QAAAE,EACA,UAAAiD,EACA,YAAAhD,EACA,YAAAC,EACA,gBAAA8D,EACA,MAAAC,EACA,YAAAC,EACA,YAAAC,EACA,SAAAlD,EACA,cAAA+B,EACA,mBAAAD,EACA,WAAAqB,EACA,WAAAC,EACA,cAAAC,EACA,mBAAAtD,CACF,EAAIlB,EACA8B,EACAC,EACAd,EACAwD,EAAkCtB,EAItC,GAFuBe,IAAoB,SAGzCpC,EAAeR,EAAS,kBAAkB8C,EAAajD,EAAU,GAAOmD,EAAYC,CAAU,EAC9FxC,EAAeT,EAAS,kBAAkB+C,EAAalD,EAAU,GAAMmD,EAAYC,CAAU,EAC7FtD,EAAYK,EAAS,kBAAkB6C,EAAOhD,EAAU,GAAMmD,EAAYC,CAAU,MAC/E,CACLzC,EAAeR,EAAS,qBAAkB,KAAE,CAAC,EAAE,IAAI+C,CAAW,EAAE,SAAS,EAAGlD,EAAU,GAAOmD,EAAYC,CAAU,EACnHxC,EAAeT,EAAS,qBAAkB,KAAE,CAAC,EAAE,IAAI8C,CAAW,EAAE,SAAS,EAAGjD,EAAU,GAAMmD,EAAYC,CAAU,EAClHtD,EAAYK,EAAS,qBAAkB,KAAE,CAAC,EAAE,IAAI6C,CAAK,EAAE,SAAS,EAAGhD,EAAU,GAAOmD,EAAYC,CAAU,EAE1G,IAAMG,EAA+C,CACnD,SAAUvB,EAAU,SACpB,SAAUA,EAAU,SACpB,UAAAlC,EACA,SAAAE,EACA,aAAAW,EACA,aAAAC,EACA,mBAAAkB,EACA,cAAeC,CACjB,EAEAuB,EAAgB,MAAM,KAAK,IAAI,SAAS,0BAA0BC,CAAe,CACnF,CAEA,IAAMC,EAAuD,CAC3D,QAAAzE,EACA,UAAAe,EACA,UAAWwD,EACX,YAAAtE,EACA,YAAAC,EACA,aAAA0B,EACA,aAAAC,EACA,cAAAmB,EACA,cAAAsB,EACA,mBAAAtD,EACA,SAAAC,CACF,EAEA,OAAO,KAAK,oBAAoBwD,CAAyB,CAC3D,CAOA,oBAAoB3E,EAAwDC,EAA+B,CACzG,GAAM,CACJ,QAAAC,EACA,UAAAiD,EACA,YAAAhD,EACA,YAAAC,EACA,UAAAa,EACA,cAAAiC,EACA,mBAAAhC,EACA,SAAAC,EACA,cAAAqD,EAAgB,GAChB,iBAAAI,EACA,iBAAAC,CACF,EAAI7E,EACJC,EAAKA,GAAM,IAAI,eAEf,IAAM6E,EAAiB,iBAAkB9E,EAEnC+E,EAAqC,CAAC,EAE5C,GAAID,EAAgB,CAClB,IAAME,EAAgB1D,EAAS,sBAAsB6B,EAAWnD,EAAO,aAAcA,EAAO,YAAY,EACxG+E,EAAe,KAAK,GAAGC,CAAa,CACtC,KAAO,CACL,IAAMlF,EAAcE,EAAO,YAC3B+E,EAAe,KAAK5B,CAAS,GAEzBnD,EAAO,aAAeA,EAAO,aAAa,OAAS,IACrD,KAAK,4BAA4B,CAAE,QAASE,EAAmB,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAGxGD,EAAO,aACT,KAAK,kBAAkB,CAAE,QAASE,EAAmB,YAAAJ,EAAa,YAAAK,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAG9FD,EAAO,aAAa,OAAS,GAC/B,KAAK,qBACH,CAAC,CAAE,QAASE,EAAmB,YAAAJ,EAAa,aAAcE,EAAO,aAAc,YAAAG,EAAa,YAAAC,CAAY,CAAC,EACzGH,CACF,CAEJ,CAEA,OAAA8E,EAAe,QAAQ,CAACE,EAAeC,IAAU,CAC/C,QAAQ,IAAI,oEAA8DA,EAAOD,CAAa,EAC9F,GAAM,CAAE,SAAAE,EAAU,SAAAC,EAAU,KAAAnD,CAAK,EAAIgD,EAE/BI,EAAgBT,GAAsC,aAAW,qBAAqB,OAAOO,CAAQ,EAAGhF,EAAaF,CAAE,EACvHqF,EAAgBT,GAAsC,aAAW,qBAAqB,OAAOO,CAAQ,EAAGhF,EAAaH,CAAE,EAEzHuE,EACF,KAAK,qBAAqB,CACxB,QAAAtE,EACA,YAAAC,EACA,YAAAC,EACA,UAAAa,EACA,cAAAgE,EACA,GAAAhF,EACA,cAAAoF,EACA,cAAAC,EACA,YAAaR,EAAiB,OAAY9E,EAAO,YACjD,mBAAAkB,EACA,SAAAC,CACF,CAAC,EAED,KAAK,6BAA6B,CAChC,QAAAjB,EACA,YAAAC,EACA,YAAAC,EACA,UAAAa,EACA,cAAAgE,EACA,GAAAhF,EACA,mBAAAiB,EACA,SAAAC,EACA,cAAAkE,EACA,cAAAC,EACA,cAAApC,EACA,YAAa4B,EAAiB,OAAY9E,EAAO,WACnD,CAAC,CAEL,CAAC,EAEMC,CACT,CAEQ,6BAA6BD,EAarB,CACd,GAAM,CACJ,mBAAAkB,EACA,SAAAC,EACA,YAAArB,EACA,QAAAI,EACA,YAAAC,EACA,YAAAC,EACA,UAAAa,EACA,cAAAgE,EACA,GAAAhF,EACA,cAAAoF,EACA,cAAAC,EACA,cAAApC,CACF,EAAIlD,EAEE,CAAE,UAAAK,EAAW,YAAAe,CAAY,EAAI,KAAK,IAAI,WACtC,CAAE,aAAAd,EAAc,iBAAAC,CAAiB,KAAI,sBAAmBF,CAAS,EAEjE,CAAE,KAAA4B,EAAM,SAAAkD,EAAU,SAAAC,CAAS,EAAIH,EAEjCM,EAA2DzF,EAEzDgC,EAAeG,EAAK,CAAC,EAAE,OACvBF,EAAeE,EAAKA,EAAK,OAAS,CAAC,EAAE,OACrCuD,MAAmB,WAAQ,OAAO1D,CAAY,CAAC,EAE/CP,GAAgB,UAAO,WAAQ,OAAON,CAAS,CAAC,CAAC,EACjDI,GAAYC,EAAS,YAAYL,EAAWE,EAAUD,CAAkB,EACxEuE,EAAeC,GAAgBxC,CAAa,EAElD,GAAIpD,IAAgB,OAAW,CAC7B,IAAM6F,GAAQ5D,EAAeD,EAAe,EACxC6D,GAAQ,KACV9F,oBAA2C,IAAI,MAAM,oBAAoB,EAAG,CAC1E,CAAC,eAAa,WAAW,EAAG,cAC9B,CAAC,EAGH0F,EAAWtF,EAAG,SAAS,CACrB,OAAQ,GAAGmB,EAAY,YAAY,KAAKqE,CAAY,kBACpD,UAAW,CACT,OAAOvF,GAAY,SAAWD,EAAG,OAAOC,CAAO,EAAIA,EACnDmF,EACAC,EACArF,EAAG,KAAK,IAAIkF,CAAQ,EACpBlF,EAAG,KAAK,IAAImF,CAAQ,EACpBnF,EAAG,KAAK,IAAI,OAAOuF,EAAgB,CAAC,EACpCvF,EAAG,KAAK,IAAI,OAAO0F,EAAK,CAAC,EACzB1F,EAAG,KAAK,IAAI,OAAOsB,EAAa,CAAC,EACjCtB,EAAG,KAAK,IAAI,OAAOoB,EAAS,CAAC,EAC7BpB,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,CACH,KAAO,CACL,IAAMwF,GAAa3D,EAAK,OAAQI,GAAQA,EAAI,WAAa,KAAOA,EAAI,WAAa,GAAG,EACpF,GAAIuD,GAAW,SAAW,EACxB,OAAO/F,kBAAyC,IAAI,MAAM,0BAA0B,EAAG,CACrF,CAAC,eAAa,WAAW,EAAG,+BAC5B,CAAC,eAAa,cAAc,EAAGG,CACjC,CAAC,EAEH,IAAM6F,KAAyB,WAAQ,OAAOD,GAAW,CAAC,EAAE,MAAM,CAAC,EAC7DE,KAAyB,WAAQ,OAAOF,GAAWA,GAAW,OAAS,CAAC,EAAE,MAAM,CAAC,EAEvF3F,EAAG,SAAS,CACV,OAAQ,GAAGmB,EAAY,YAAY,KAAKqE,CAAY,kBACpD,UAAW,CACT,OAAOvF,GAAY,SAAWD,EAAG,OAAOC,CAAO,EAAIA,EACnDD,EAAG,OAAOH,CAAY,EACtBuF,EACAC,EACArF,EAAG,KAAK,IAAIkF,CAAQ,EACpBlF,EAAG,KAAK,IAAImF,CAAQ,EACpBnF,EAAG,KAAK,IAAI,OAAO4F,CAAsB,CAAC,EAC1C5F,EAAG,KAAK,IAAI,OAAO6F,CAAsB,CAAC,EAC1C7F,EAAG,KAAK,IAAI,OAAOsB,EAAa,CAAC,EACjCtB,EAAG,KAAK,IAAI,OAAOoB,EAAS,CAAC,EAC7BpB,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,CACH,CAEA,OAAImF,EACFtF,EAAG,gBAAgB,CAACsF,EAAUF,EAAeC,CAAa,EAAG,KAAK,IAAI,iBAAiB,CAAC,EAExFrF,EAAG,gBAAgB,CAACoF,EAAeC,CAAa,EAAG,KAAK,IAAI,iBAAiB,CAAC,EAGzErF,CACT,CAEQ,qBAAqBD,EAYb,CACd,GAAM,CACJ,YAAAF,EACA,QAAAI,EACA,YAAAC,EACA,YAAAC,EACA,UAAAa,EACA,cAAAgE,EACA,GAAAhF,EACA,cAAAoF,EACA,cAAAC,EACA,mBAAApE,EACA,SAAAC,CACF,EAAInB,EACE,CAAE,KAAAiC,CAAK,EAAIgD,EAEX,CAAE,UAAA5E,EAAW,YAAAe,CAAY,EAAI,KAAK,IAAI,WACtC,CAAE,aAAAd,EAAc,iBAAAC,CAAiB,KAAI,sBAAmBF,CAAS,EACjE0F,EAAY9F,EAAG,KAAK,OACxB,MACAgC,EAAK,IAAKI,GAAQA,EAAI,QAAQ,CAChC,EACM2D,EAAY/F,EAAG,KAAK,OACxB,MACAgC,EAAK,IAAKI,GAAQA,EAAI,QAAQ,CAChC,EAEM4D,EAAUhG,EAAG,YAAY,CAC7B,SAAUgC,EAAK,IAAKI,GAAQpC,EAAG,KAAK,IAAI,UAAO,WAAQ,OAAOoC,EAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAC5E,KAAM,KACR,CAAC,EACKP,EAAemD,EAAc,KAAK,CAAC,EAAE,OACrClD,EAAekD,EAAc,KAAKA,EAAc,KAAK,OAAS,CAAC,EAAE,OACvE,GAAInF,IAAgB,OAAW,CACfiC,EAAeD,EAAe,EAChC,KACVjC,oBAA2C,IAAI,MAAM,oBAAoB,EAAG,CAC1E,CAAC,eAAa,WAAW,EAAG,cAC9B,CAAC,EAEH,IAAMqG,GAAmBjG,EAAG,SAAS,CACnC,OAAQ,GAAGmB,EAAY,YAAY,iCACnC,UAAW,CACT,OAAOlB,GAAY,SAAWD,EAAG,OAAOC,CAAO,EAAIA,EACnDmF,EACAC,EACAW,EACAF,EACAC,EACA/F,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,EAEGa,GAAaa,GAAgBb,GAAac,GAC5C,KAAK,yBAAyB,CAAE,QAAA7B,EAAS,UAAAe,EAAW,mBAAAC,EAAoB,SAAAC,EAAU,YAAAhB,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAElHA,EAAG,gBAAgB,CAACoF,EAAeC,EAAeY,EAAgB,EAAG,KAAK,IAAI,iBAAiB,CAAC,CAClG,MACEjG,EAAG,SAAS,CACV,OAAQ,GAAGmB,EAAY,YAAY,iCACnC,UAAW,CACT,OAAOlB,GAAY,SAAWD,EAAG,OAAOC,CAAO,EAAIA,EACnDD,EAAG,OAAOH,CAAY,EACtBuF,EACAC,EACAW,EACAF,EACAC,EACA/F,EAAG,OAAOM,CAAgB,EAC1BN,EAAG,OAAOK,CAAY,EACtBL,EAAG,OAAO,eAAa,CACzB,EACA,cAAe,CAACE,EAAaC,CAAW,CAC1C,CAAC,EAEGa,GAAaa,GAAgBb,GAAac,GAC5C,KAAK,yBAAyB,CAAE,QAAA7B,EAAS,UAAAe,EAAW,mBAAAC,EAAoB,SAAAC,EAAU,YAAAhB,EAAa,YAAAC,CAAY,EAAGH,CAAE,EAElHA,EAAG,gBAAgB,CAACoF,EAAeC,CAAa,EAAG,KAAK,IAAI,iBAAiB,CAAC,EAGhF,OAAOrF,CACT,CAOA,MAAM,0BACJW,EAC+F,CAC/F,IAAMX,EAAK,IAAI,eACf,KAAK,2BAA2BW,EAASX,CAAE,EAE3C,IAAMkG,EAAc,MAAM,KAAK,IAAI,WAAW,2BAA2B,CACvE,iBAAkBlG,EAClB,UAAQ,wBAAoB,KAAK,CACnC,CAAC,EAED,GAAIkG,EAAY,OAAS,KACvB,OAAOtG,eAAsC,IAAI,MAAMsG,EAAY,KAAK,EAAG,CACzE,CAAC,eAAa,WAAW,EAAG,4BAC5B,CAAC,eAAa,cAAc,EAAG,CAC7B,QAAAvF,EACA,aAAcA,EAAQ,MACxB,CACF,CAAC,EAGH,IAAMwF,EAAUC,GAAqBF,CAAW,EAC1CG,EAAaC,GAAwBJ,CAAW,EAEtD,MAAO,CACL,QAAAC,EACA,WAAAE,CACF,CACF,CACF,ECx4BA,IAAAE,GAA4B,oCAC5BC,GAAwF,qCAIxF,IAAAC,GAAoC,6BAG7B,IAAMC,GAAN,KAAkD,CAGvD,YAAYC,EAAmB,CAC7B,KAAK,KAAOA,CACd,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CAEA,MAAM,aAAaC,EAA8C,CAC/D,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,QAAAC,EAAS,YAAAC,EAAa,YAAAC,EAAa,IAAAC,EAAK,aAAAC,EAAc,UAAAC,CAAU,EAAIP,EACtE,CAAE,aAAAQ,EAAc,iBAAAC,CAAiB,KAAI,uBAAmBR,CAAS,EACjES,EAAK,IAAI,eAEfA,EAAG,SAAS,CACV,OAAQ,GAAGT,EAAU,YAAY,qBACjC,UAAW,CACTS,EAAG,OAAOR,CAAO,EACjBQ,EAAG,KAAK,KAAKL,CAAG,EAChBK,EAAG,KAAK,KAAKJ,CAAY,EACzBI,EAAG,KAAK,IAAIH,CAAS,EACrBG,EAAG,OAAOD,CAAgB,EAC1BC,EAAG,OAAOF,CAAY,EACtBE,EAAG,OAAO,gBAAa,CACzB,EACA,cAAe,CAACP,EAAaC,CAAW,CAC1C,CAAC,EAED,IAAMO,EAAc,MAAM,KAAK,IAAI,WAAW,2BAA2B,CACvE,iBAAkBD,EAClB,UAAQ,wBAAoB,KAAK,CACnC,CAAC,EAED,GAAIC,EAAY,OAAS,KACvB,OAAOC,eAAsC,IAAI,MAAMD,EAAY,KAAK,EAAG,CACzE,CAAC,gBAAa,WAAW,EAAG,iBAC5B,CAAC,gBAAa,cAAc,EAAGX,CACjC,CAAC,EAGH,IAAMa,EAAYC,GAAoBH,EAAaN,CAAG,EACtD,OAAIQ,GAAa,KACRD,eAAsC,IAAI,MAAM,eAAe,EAAG,CACvE,CAAC,gBAAa,WAAW,EAAG,eAC5B,CAAC,gBAAa,cAAc,EAAGZ,CACjC,CAAC,GAEHa,EAAU,IAAMR,EACTQ,EACT,CAEA,YAAYb,EAAiC,CAC3C,GAAM,CAAE,UAAAC,EAAW,YAAAc,CAAY,EAAI,KAAK,KAAK,WACvC,CAAE,UAAAC,EAAW,YAAAb,EAAa,YAAAC,EAAa,aAAAE,EAAc,SAAAW,EAAU,QAAAC,CAAQ,EAAIlB,EAC3E,CAAE,QAAAE,EAAS,UAAAK,EAAW,WAAAY,EAAY,IAAAd,CAAI,EAAIW,EAE1CN,EAAK,IAAI,eAETU,EAAkBd,EACpBC,KACA,MAAEA,CAAS,EACR,IAAI,EAAIU,CAAQ,EAChB,QAAQ,CAAC,EAEVI,EAAmBf,KACrB,MAAEa,CAAU,EACT,IAAI,EAAIF,CAAQ,EAChB,QAAQ,CAAC,EACZE,EAEEG,EAAU,cAAW,qBAAqB,OAAOF,CAAe,EAAGf,EAAMF,EAAcC,EAAaM,CAAE,EAEtG,CAAE,aAAAF,EAAc,iBAAAC,CAAiB,KAAI,uBAAmBR,CAAS,EAEvE,eAAQ,IAAI,mCAA6B,CACvC,GAAGD,EACH,gBAAAoB,EACA,iBAAAC,CACF,CAAC,EAEGH,EACFR,EAAG,SAAS,CACV,OAAQ,GAAGK,EAAY,YAAY,WAAWV,EAAM,wBAA0B,uBAAuB,GACrG,UAAW,CACTK,EAAG,OAAOR,CAAO,EACjBQ,EAAG,OAAOQ,CAAO,EACjBI,EACAZ,EAAG,KAAK,KAAKJ,CAAY,EACzBI,EAAG,KAAK,IAAI,OAAOJ,EAAeC,EAAYY,CAAU,CAAC,EACzDT,EAAG,KAAK,IAAI,OAAOJ,EAAee,EAAmBD,CAAe,CAAC,EACrEV,EAAG,OAAOD,CAAgB,EAC1BC,EAAG,OAAOF,CAAY,EACtBE,EAAG,OAAO,gBAAa,CACzB,EACA,cAAe,CAACP,EAAaC,CAAW,CAC1C,CAAC,EAEDM,EAAG,SAAS,CACV,OAAQ,GAAGK,EAAY,YAAY,WAAWV,EAAM,WAAa,UAAU,GAC3E,UAAW,CACTK,EAAG,OAAOR,CAAO,EACjBoB,EACAZ,EAAG,KAAK,KAAKJ,CAAY,EACzBI,EAAG,KAAK,IAAI,OAAOJ,EAAeC,EAAYY,CAAU,CAAC,EACzDT,EAAG,KAAK,IAAI,OAAOJ,EAAee,EAAmBD,CAAe,CAAC,EACrEV,EAAG,OAAOD,CAAgB,EAC1BC,EAAG,OAAOF,CAAY,EACtBE,EAAG,OAAO,gBAAa,CACzB,EACA,cAAe,CAACP,EAAaC,CAAW,CAC1C,CAAC,EAGHM,EAAG,gBAAgB,CAACY,CAAO,EAAG,KAAK,IAAI,iBAAiB,CAAC,EAElDZ,CACT,CACF,EChIA,IAAAa,GAA4B,oCAC5BC,GAA0G,qCAOnG,IAAMC,GAAN,KAAqD,CAG1D,YAAYC,EAAmB,CAC7B,KAAK,KAAOA,CACd,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CAMA,MAAM,gBAAqC,CACzC,IAAMC,EAAwB,CAAC,EACzB,CAAE,UAAAC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,YAAAC,CAAY,KAAI,uBAAmBD,CAAS,EACpD,GAAI,CACF,IAAME,EAAM,MAAM,KAAK,KAAK,WAAW,UAAU,CAAE,GAAID,EAAa,QAAS,CAAE,YAAa,EAAK,CAAE,CAAC,EAE9FE,KADS,oBAAgBD,CAAG,EACX,SAAS,OAAO,SAAS,IAAKE,GAC5CA,EAAK,OAAO,KACpB,EAEGD,EAAQ,OAAS,IACP,MAAM,KAAK,KAAK,WAAW,gBAAgBA,EAAS,CAC9D,YAAa,GACb,SAAU,EACZ,CAAC,GACG,QAASC,GAAS,CACpB,IAAMC,EAAUC,GAAaF,CAAI,EACjCL,EAAW,KAAKM,CAAO,CACzB,CAAC,CAEL,OAASE,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,iBAC5B,CAAC,gBAAa,cAAc,EAAGN,CACjC,CAAC,CACH,CAEA,OAAOF,CACT,CAQA,MAAM,gBAAgBU,EAAeC,EAAqC,CACxE,GAAM,CAAE,UAAAV,CAAU,EAAI,KAAK,KAAK,WAChC,GAAI,CACF,IAAMW,EAAW,kBAAkBF,CAAK,IAAIC,CAAU,GAChDE,EAAS,KAAK,KAAK,SAAiBD,CAAQ,EAClD,GAAIC,EACF,OAAOA,EAET,IAAMV,EAAM,MAAM,KAAK,KAAK,WAAW,gBAAgB,CACrD,MAAAO,EACA,QAAS,CACP,YAAa,GACb,SAAU,EACZ,EACA,OAAQ,CACN,WAAY,GAAGT,EAAU,UAAU,uBACrC,CACF,CAAC,EACGa,EAQJ,OAPAX,EAAI,KAAK,QAASE,GAAS,CACzB,IAAMU,KAAS,oBAAgBV,CAAI,EAC/BU,EAAO,aAAeJ,IACxBG,EAAeC,EAAO,GAAG,GACzB,KAAK,KAAK,YAAYH,EAAUE,CAAY,EAEhD,CAAC,EACIA,GACIL,aAAoC,IAAI,MAAM,uBAAuB,EAAG,CAC7E,CAAC,gBAAa,WAAW,EAAG,kBAC5B,CAAC,gBAAa,cAAc,EAAG,CAC7B,MAAAC,EACA,WAAAC,CACF,CACF,CAAC,CAGL,OAASH,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,kBAC5B,CAAC,gBAAa,cAAc,EAAG,CAC7B,MAAAE,EACA,WAAAC,CACF,CACF,CAAC,CACH,CACF,CAOA,MAAM,kBAAkBK,EAAgC,CACtD,GAAI,CACF,IAAMb,EAAM,MAAM,KAAK,KAAK,WAAW,uBAAuBa,CAAsB,EAE9EC,EAAwD,CAAC,EAEzDb,EAAUD,EAAI,KAAK,IAAKE,GAASA,EAAK,QAAQ,EAEpD,OAAID,EAAQ,OAAS,IACP,MAAM,KAAK,KAAK,WAAW,gBAAgBA,EAAS,CAC9D,YAAa,GACb,SAAU,EACZ,CAAC,GACG,QAASC,GAAS,CACpB,IAAMU,KAAS,oBAAgBV,CAAI,EACnC,QAAQ,IAAIU,CAAM,EAClBE,EAAY,KAAK,CACf,aAAW,gBAAYF,EAAO,KAAM,EAAK,EACzC,QAASA,EAAO,KAClB,CAAC,CACH,CAAC,EAEIE,CACT,OAAST,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,oBAC5B,CAAC,gBAAa,cAAc,EAAGQ,CACjC,CAAC,CACH,CACF,CAOA,MAAM,WAAWL,EAAsC,CACrD,GAAI,CACF,IAAMR,EAAM,MAAM,KAAK,KAAK,WAAW,UAAU,CAAE,GAAIQ,EAAY,QAAS,CAAE,YAAa,EAAK,CAAE,CAAC,EAEnG,OADgBJ,GAAaJ,CAAG,CAElC,OAASK,EAAO,CACd,OAAOC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,aAC5B,CAAC,gBAAa,cAAc,EAAGG,CACjC,CAAC,CACH,CACF,CAOA,wBAAwBO,EAAgCC,EAA+B,CACrF,GAAM,CAAE,UAAAlB,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,WAAAU,EAAY,aAAAS,CAAa,EAAIF,EAE/B,CAAE,iBAAAG,EAAkB,aAAAC,CAAa,KAAI,uBAAmBrB,CAAS,EAEvEkB,EAAKA,GAAM,IAAI,eAEf,IAAMI,KAAmB,MAAEH,CAAY,EAAE,IAAI,GAAW,EACxD,OAAIG,EAAiB,GAAG,GAAW,EAC1Bd,kBAAyC,IAAI,MAAM,0CAA0C,EAAG,CACrG,CAAC,gBAAa,WAAW,EAAG,0BAC5B,CAAC,gBAAa,cAAc,EAAGS,CACjC,CAAC,GAGHC,EAAG,SAAS,CACV,OAAQ,GAAGlB,EAAU,YAAY,iCACjC,UAAW,CAACkB,EAAG,OAAOR,CAAU,EAAGQ,EAAG,KAAK,IAAII,EAAiB,SAAS,CAAC,EAAGJ,EAAG,OAAOE,CAAgB,EAAGF,EAAG,OAAOG,CAAY,CAAC,EACjI,cAAe,CAAC,CAClB,CAAC,EAEMH,EACT,CAOA,MAAM,mBAAmBD,EAA2B,CAClD,GAAM,CAAE,WAAAP,EAAY,eAAAa,EAAgB,eAAAC,CAAe,EAAIP,EACjD,CAAE,UAAAjB,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,aAAAqB,CAAa,KAAI,uBAAmBrB,CAAS,EAE/CkB,EAAK,IAAI,eAEXL,EAAeU,EACnB,OAAKV,IACHA,EAAe,MAAM,KAAK,gBAAgB,KAAK,KAAK,iBAAiB,EAAGH,CAAU,GAGpFc,EAAe,QAASC,GAAc,CACpCP,EAAG,SAAS,CACV,OAAQ,GAAGlB,EAAU,YAAY,2BACjC,UAAW,CAACkB,EAAG,OAAOR,CAAU,EAAGQ,EAAG,OAAOL,CAAY,EAAGK,EAAG,OAAOG,CAAY,CAAC,EACnF,cAAe,CAACI,CAAS,CAC3B,CAAC,CACH,CAAC,EAEMP,CACT,CAEA,uBAAuBD,EAA+BC,EAA+B,CACnF,GAAM,CAAE,UAAAlB,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,WAAAU,EAAY,WAAAgB,EAAY,SAAAC,CAAS,EAAIV,EAEvC,CAAE,iBAAAG,EAAkB,aAAAC,CAAa,KAAI,uBAAmBrB,CAAS,EAEvEkB,EAAKA,GAAM,IAAI,eAEf,IAAMU,EAAqBF,EAAa,KAAO,KAAK,MAAMA,EAAa,GAAI,EAAIA,EACzEG,EAAmBF,EAAW,KAAO,KAAK,MAAMA,EAAW,GAAI,EAAIA,EAEzE,OAAIE,GAAoBD,EACfpB,kBAAyC,IAAI,MAAM,0CAA0C,EAAG,CACrG,CAAC,gBAAa,WAAW,EAAG,uBAC5B,CAAC,gBAAa,cAAc,EAAGS,CACjC,CAAC,GAGHC,EAAG,SAAS,CACV,OAAQ,GAAGlB,EAAU,YAAY,+BACjC,UAAW,CACTkB,EAAG,OAAOR,CAAU,EACpBQ,EAAG,KAAK,IAAIU,CAAkB,EAC9BV,EAAG,KAAK,IAAIW,CAAgB,EAC5BX,EAAG,OAAOE,CAAgB,EAC1BF,EAAG,OAAOG,CAAY,EACtBH,EAAG,OAAO,gBAAa,CACzB,EACA,cAAe,CAAC,CAClB,CAAC,EAEMA,EACT,CAOA,qBAAqBD,EAA0C,CAC7D,GAAM,CAAE,UAAAjB,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,KAAA8B,EAAM,aAAAX,EAAc,WAAAO,EAAY,SAAAC,EAAU,UAAAI,CAAU,EAAId,EAE1D,CAAE,YAAAhB,EAAa,iBAAAmB,EAAkB,aAAAC,CAAa,KAAI,uBAAmBrB,CAAS,EAE9EkB,EAAK,IAAI,eAETI,KAAmB,MAAEH,CAAY,EAAE,IAAI,GAAW,EACxD,GAAIG,EAAiB,GAAG,GAAW,EACjC,OAAOd,kBAAyC,IAAI,MAAM,0CAA0C,EAAG,CACrG,CAAC,gBAAa,WAAW,EAAG,uBAC5B,CAAC,gBAAa,cAAc,EAAGS,CACjC,CAAC,EAGH,IAAMW,EAAqBF,EAAa,KAAO,KAAK,MAAMA,EAAa,GAAI,EAAIA,EACzEG,EAAmBF,EAAW,KAAO,KAAK,MAAMA,EAAW,GAAI,EAAIA,EAEzE,OAAIE,GAAoBD,EACfpB,kBAAyC,IAAI,MAAM,0CAA0C,EAAG,CACrG,CAAC,gBAAa,WAAW,EAAG,uBAC5B,CAAC,gBAAa,cAAc,EAAGS,CACjC,CAAC,GAGHC,EAAG,SAAS,CACV,OAAQ,GAAGlB,EAAU,YAAY,4BACjC,UAAW,CACTkB,EAAG,OAAOjB,CAAW,EACrBiB,EAAG,KAAK,OAAOY,CAAI,EACnBZ,EAAG,KAAK,IAAII,EAAiB,SAAS,CAAC,EACvCJ,EAAG,KAAK,IAAIU,CAAkB,EAC9BV,EAAG,KAAK,IAAIW,CAAgB,EAC5BX,EAAG,KAAK,QAAQa,CAAS,EACzBb,EAAG,OAAOE,CAAgB,EAC1BF,EAAG,OAAOG,CAAY,CACxB,EACA,cAAe,CAAC,CAClB,CAAC,EAEMH,EACT,CACF,EC7SA,IAAAc,GAA4B,oCAC5BC,GAUO,qCAGPC,GAAe,SAEFC,GAAN,KAAoD,CAGzD,YAAYC,EAAmB,CAC7B,KAAK,KAAOA,CACd,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CAEA,MAAM,wBACJC,EACAC,EACAC,EACiC,CACjC,IAAMC,EAAM,MAAM,KAAK,KAAK,WAAW,uBAAuBH,CAAsB,EAC9EI,EAAiC,CAAC,EAClCC,EAAUF,EAAI,KAAK,IAAKG,GAASA,EAAK,QAAQ,EAChDD,EAAQ,OAAS,IACJ,MAAM,KAAK,KAAK,WAAW,gBAAgBA,EAAS,CACjE,YAAa,EACf,CAAC,GAEM,QAASC,GAAS,CACvB,IAAMC,KAAS,oBAAgBD,CAAI,EAC7BE,EAAgB,YAAS,WAAW,IAAI,GAAAC,QAAGF,EAAO,MAAM,OAAO,MAAM,OAAO,IAAI,CAAC,EAAE,SAAS,EAC5FG,EAAOH,EAAO,KACdI,EAAiB,IAAI,KAAK,OAAOD,CAAI,EAAI,GAAI,EAAE,eAAe,EAE9DE,EAA6C,CACjD,qBAAsB,IACtB,kBAAmB,IACnB,cAJoB,YAAS,QAAQ,IAAI,GAAAH,QAAGD,CAAa,CAAC,EAAE,SAAS,EAKrE,KAAAE,EACA,gBAAiBC,CACnB,EACAP,EAAO,KAAKQ,CAAoB,CAClC,CAAC,EAEH,IAAMC,EAAaT,EAAO,KAAK,CAACU,EAAGC,IAAM,OAAOD,EAAE,IAAI,EAAI,OAAOC,EAAE,IAAI,CAAC,EAClEC,EAAsC,CAAC,EAE7CA,EAAY,KAAK,CACf,qBAAsBf,EACtB,qBAAmB,MAAEA,CAAwB,EAC1C,IAAI,KAAU,EAAE,EAChB,SAAS,EACZ,cAAe,IACf,KAAMC,EAAkB,SAAS,EACjC,gBAAiB,IAAI,KAAKA,EAAoB,GAAI,EAAE,eAAe,CACrE,CAAC,EAED,IAAIe,EAAqBhB,EACzB,QAASiB,EAAI,EAAGA,EAAIL,EAAW,OAAQK,IAAK,CAC1C,IAAMZ,EAAOO,EAAWK,CAAC,EACzB,MAAI,MAAEZ,EAAK,IAAI,EAAE,IAAIJ,CAAiB,EACpC,SAEFe,KAAqB,MAAEA,CAAkB,EAAE,OAAI,MAAEX,EAAK,aAAa,CAAC,EAAE,SAAS,EAC/E,IAAMa,KAAoB,MAAEF,CAAkB,EAC3C,IAAI,KAAU,EAAE,EAChB,SAAS,KACR,MAAEA,CAAkB,EAAE,GAAG,CAAC,GAC5BX,EAAK,qBAAuB,IAC5BA,EAAK,kBAAoB,MAEzBA,EAAK,qBAAuBW,EAC5BX,EAAK,kBAAoBa,GAE3BH,EAAY,KAAKV,CAAI,CACvB,CAEA,OAAOU,CACT,CAOA,iBAAiBI,EAAyBC,EAA+B,CACvEA,EAAKA,GAAM,IAAI,eACf,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,iBAAAC,EAAkB,aAAAC,CAAa,KAAI,uBAAmBF,CAAS,EAEjE,CAAE,QAAAG,EAAS,iBAAAC,EAAkB,cAAAC,EAAe,mBAAAC,EAAoB,iBAAAC,EAAkB,YAAAC,EAAa,YAAAC,CAAY,EAAIX,EAC/GY,EAAc,cAAW,qBAAqB,OAAOL,CAAa,EAAGD,EAAkBL,CAAE,EAM/F,OAAAA,EAAG,KAAK,OAAO,MAAOO,CAAkB,EAExCP,EAAG,SAAS,CACV,OAAQ,GAAGC,EAAU,YAAY,qBACjC,UAAW,CACTD,EAAG,OAAOI,CAAO,EACjBO,EACAX,EAAG,KAAK,OAAO,MAAOO,CAAkB,EACxCP,EAAG,KAAK,IAAIQ,CAAgB,EAC5BR,EAAG,OAAOE,CAAgB,EAC1BF,EAAG,OAAOG,CAAY,EACtBH,EAAG,OAAO,gBAAa,CACzB,EACA,cAAe,CAACS,EAAaC,EAAaL,CAAgB,CAC5D,CAAC,EAEML,CACT,CAQA,kBAAkBD,EAA0BC,EAA+B,CACzEA,EAAKA,GAAM,IAAI,eACf,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,iBAAAC,EAAkB,aAAAC,CAAa,KAAI,uBAAmBF,CAAS,EAEjE,CAAE,QAAAG,EAAS,kBAAAQ,EAAmB,YAAAH,EAAa,YAAAC,CAAY,EAAIX,EAEjE,OAAAa,EAAkB,QAASP,GAAqB,CAC9CL,EAAG,SAAS,CACV,OAAQ,GAAGC,EAAU,YAAY,4BACjC,UAAW,CAACD,EAAG,OAAOI,CAAO,EAAGJ,EAAG,OAAOE,CAAgB,EAAGF,EAAG,OAAOG,CAAY,EAAGH,EAAG,OAAO,gBAAa,CAAC,EAC9G,cAAe,CAACS,EAAaC,EAAaL,CAAgB,CAC5D,CAAC,CACH,CAAC,EAEML,CACT,CAQA,yBAAyBD,EAA4BC,EAA+B,CAClFA,EAAKA,GAAM,IAAI,eACf,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,iBAAAC,EAAkB,aAAAC,CAAa,KAAI,uBAAmBF,CAAS,EAEjE,CAAE,QAAAG,EAAS,KAAAS,EAAM,YAAAJ,EAAa,YAAAC,CAAY,EAAIX,EAEpD,OAAAC,EAAG,SAAS,CACV,OAAQ,GAAGC,EAAU,YAAY,WAAWY,IAAS,YAAc,qBAAuB,qBAAqB,GAC/G,UAAW,CAACb,EAAG,OAAOI,CAAO,EAAGJ,EAAG,OAAOE,CAAgB,EAAGF,EAAG,OAAOG,CAAY,CAAC,EACpF,cAAe,CAACM,EAAaC,CAAW,CAC1C,CAAC,EAEMV,CACT,CACF,EC7KA,IAAAc,GAA4B,oCAC5BC,GAAuG,qCAMhG,IAAMC,GAAN,KAAoD,CAGzD,YAAYC,EAAmB,CAC7B,KAAK,KAAOA,CACd,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CAQA,4BAA4BC,EAA+BC,EAA+B,CACxFA,EAAKA,GAAM,IAAI,eACf,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,iBAAAC,EAAkB,aAAAC,CAAa,KAAI,uBAAmBF,CAAS,EAEjE,CAAE,kBAAAG,EAAmB,KAAAC,CAAK,EAAIN,EAEpC,OAAAK,EAAkB,QAASE,GAAqB,CAC9CN,EAAG,SAAS,CACV,OAAQ,GAAGC,EAAU,YAAY,aAAaI,IAAS,MAAQ,uBAAyB,yBAAyB,GACjH,UAAW,CAACL,EAAG,OAAOE,CAAgB,EAAGF,EAAG,OAAOG,CAAY,CAAC,EAChE,cAAe,CAACG,CAAgB,CAClC,CAAC,CACH,CAAC,EAEMN,CACT,CAEA,MAAM,qBAAqBO,EAAoD,CAC7E,IAAMC,EAAM,MAAM,KAAK,KAAK,WAAW,uBAAuBD,CAAgB,EAExEE,EAAwB,CAAC,EAEzBC,EAAeF,EAAI,KAAK,IAAKG,GAASA,EAAK,QAAQ,EAEzD,OAAID,EAAa,OAAS,IACC,MAAM,KAAK,KAAK,WAAW,gBAAgBA,EAAc,CAChF,YAAa,EACf,CAAC,GAEgB,QAASC,GAAS,CAEjC,IAAMC,EAAiC,CACrC,MAFa,oBAAgBD,CAAI,EAEvB,MAAM,MAClB,EACAF,EAAK,KAAKG,CAAe,CAC3B,CAAC,EAGIH,CACT,CAMA,MAAM,qBAAiD,CACrD,GAAM,CAAE,UAAAR,CAAU,EAAI,KAAK,KAAK,WAC1B,CAAE,iBAAAC,CAAiB,KAAI,uBAAmBD,CAAS,EACzD,GAAI,CACF,IAAMO,EAAM,MAAM,KAAK,KAAK,WAAW,UAAU,CAC/C,GAAIN,EACJ,QAAS,CAAE,YAAa,EAAK,CAC/B,CAAC,EAEKW,KAAS,oBAAgBL,CAAG,EAE5BM,EAAgBD,EAAO,cAAc,OAErCE,EACJD,EAAc,mBAAmB,QAAQ,UAAU,IAAKH,MAC/C,gBAAYA,EAAK,OAAO,IAAI,OAAO,KAAM,EAAK,CACtD,GAAK,CAAC,EAkCT,MAhCuC,CACrC,GAAIE,EAAO,GAAG,GACd,IAAK,CACH,GAAIA,EAAO,IAAI,OAAO,YAAY,OAAO,GAAG,GAC5C,KAAMA,EAAO,IAAI,OAAO,YAAY,OAAO,IAC7C,EACA,aAAc,CACZ,GAAIA,EAAO,aAAa,OAAO,GAAG,GAClC,KAAMA,EAAO,aAAa,OAAO,IACnC,EACA,YAAa,CACX,GAAIA,EAAO,YAAY,OAAO,GAAG,GACjC,KAAMA,EAAO,YAAY,OAAO,IAClC,EACA,UAAW,CACT,GAAIA,EAAO,UAAU,OAAO,GAAG,GAC/B,KAAMA,EAAO,UAAU,OAAO,IAChC,EACA,kBAAmBE,EACnB,iBAAkB,CAChB,GAAIF,EAAO,YAAY,OAAO,iBAAiB,OAAO,YAAY,OAAO,GAAG,GAC5E,KAAMA,EAAO,YAAY,OAAO,iBAAiB,OAAO,YAAY,OAAO,IAC7E,EACA,aAAc,CACZ,GAAIA,EAAO,YAAY,OAAO,aAAa,OAAO,YAAY,OAAO,GAAG,GACxE,KAAMA,EAAO,YAAY,OAAO,aAAa,OAAO,YAAY,OAAO,IACzE,EACA,oBAAqB,OAAOC,EAAc,mBAAmB,EAC7D,kCAAmC,OAAOA,EAAc,kCAAkC,EAC1F,cAAeA,EAAc,aAC/B,CAGF,OAASE,EAAO,CACd,eAAQ,IAAI,4BAA6BA,CAAK,EACvCC,eAAsCD,EAAgB,CAC3D,CAAC,gBAAa,WAAW,EAAG,oBAC5B,CAAC,gBAAa,cAAc,EAAGd,CACjC,CAAC,CACH,CACF,CAMA,MAAM,qBAA4C,CAChD,GAAM,CAAE,UAAAD,CAAU,EAAI,KAAK,KAAK,WAC1BiB,EAAuB,CAC3B,YAAa,GACb,SAAU,GACV,iBAAkB,GAClB,aAAc,GACd,aAAc,GACd,YAAa,EACf,EAMMC,GAJM,MAAM,KAAK,KAAK,WAAW,UAAU,CAC/C,GAAIlB,EAAU,WACd,QAAS,CAAE,YAAa,GAAM,wBAAyB,EAAK,CAC9D,CAAC,GACqB,MAAM,qBACd,MAAM,KAAK,KAAK,WAAW,oBAAoB,CAAE,OAAQkB,EAAW,QAAS,CAAE,WAAY,EAAK,CAAE,CAAC,GAC3G,QAAQ,QAASC,GAAU,CAC/B,IAAMf,EAAOe,EAAM,KACbC,EAAaD,EAAM,WAErBf,EAAK,SAAS,sBAAsB,IACtCa,EAAQ,aAAeG,EAAW,WAGhChB,EAAK,SAAS,2BAA2B,IAC3Ca,EAAQ,YAAcG,EAAW,aAG/BhB,EAAK,SAAS,mBAAmB,IACnCa,EAAQ,iBAAmBG,EAAW,WAGpChB,EAAK,SAAS,sBAAsB,IACtCa,EAAQ,aAAeG,EAAW,cAGhChB,EAAK,SAAS,yBAAyB,IACzCa,EAAQ,YAAcG,EAAW,SAErC,CAAC,EACD,IAAMC,EAAc,MAAM,KAAK,KAAK,WAAW,UAAU,CAAE,GAAIJ,EAAQ,YAAa,QAAS,CAAE,YAAa,EAAK,CAAE,CAAC,EAC9GK,KAAiB,oBAAgBD,CAAW,EAClD,OAAAJ,EAAQ,SAAWK,EAAe,MAAM,OAAO,GAAG,GAE3CL,CACT,CACF,ElB7JO,IAAMM,GAAN,MAAMC,UAAqB,aAAuB,CAQvD,YAAYC,EAAqB,CAC/B,MAAMA,CAAO,EAEb,KAAK,MAAQ,IAAIC,GAAW,IAAI,EAChC,KAAK,UAAY,IAAIC,GAAe,IAAI,EACxC,KAAK,MAAQ,IAAIC,GAAW,IAAI,EAChC,KAAK,SAAW,IAAIC,GAAc,IAAI,EACtC,KAAK,QAAU,IAAIC,GAAa,IAAI,EACpC,KAAK,QAAU,IAAIC,GAAa,IAAI,CACtC,CAEA,IAAI,MAAmB,CACrB,OAAO,KAAK,KACd,CAEA,IAAI,UAA2B,CAC7B,OAAO,KAAK,SACd,CAEA,IAAI,MAAmB,CACrB,OAAO,KAAK,KACd,CAEA,IAAI,SAAyB,CAC3B,OAAO,KAAK,QACd,CAEA,IAAI,QAAuB,CACzB,OAAO,KAAK,OACd,CAEA,IAAI,QAAuB,CACzB,OAAO,KAAK,OACd,CAOA,OAAO,UAAUN,EAAuC,CACtD,GAAM,CAAE,IAAAO,EAAM,SAAU,EAAIP,EAC5B,OAAOO,IAAQ,UACXR,EAAa,gBAAgB,CAAE,GAAGS,GAAa,GAAGR,CAAQ,CAAC,EAC3DD,EAAa,gBAAgB,CAAE,GAAGU,GAAa,GAAGT,CAAQ,CAAC,CACjE,CAOA,OAAO,gBAA0CA,EAAuC,CACtF,OAAO,IAAID,EAAaC,CAAO,CACjC,CACF,EDhFA,IAAOU,GAAQC","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","b","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","index_exports","__export","BASIS_POINT","BASIS_POINT_MAX","BIN_BOUND","BinUtils","CetusDlmmSDK","DEFAULT_MAX_WEIGHT","DEFAULT_MIN_WEIGHT","FEE_PRECISION","FeeUtils","IlmUtils","MAX_BIN_ID","MAX_BIN_PER_POSITION","MAX_FEE_RATE","MIN_BIN_ID","ONE","PoolModule","REWARD_PERIOD","REWARD_PERIOD_START_AT","SCALE_OFFSET","StrategyType","StrategyUtils","WeightUtils","buildPoolKey","index_default","dlmmMainnet","dlmmTestnet","generateRewardSchedule","getRouterModule","parseBinInfo","parseBinInfoList","parseCurrentRewardPeriodEmission","parseDlmmBasePool","parseDlmmPool","parseDlmmPosition","parseLiquidityShares","parsePartner","parsePoolTransactionInfo","parseRewardPeriodEmission","parseStrategyType","parsedDlmmPosFeeData","parsedDlmmPosRewardData","parsedSwapQuoteData","poolFilterEvenTypes","safeAmount","safeMulAmount","__toCommonJS","import_common_sdk","import_common_sdk","dlmmMainnet","import_transactions","import_common_sdk","import_common_sdk","DlmmError","message","error_code","details","e","code","handleError","error","errorDetails","import_common_sdk","import_bn","EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","e","m","n","rep","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","i","d8","sinh2_x","d5","d16","d20","getPi","wpr","xsd","halfPi","px","r","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","s","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","p","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","decimal_default","StrategyType","import_common_sdk","MAX_BIN_PER_POSITION","MIN_BIN_ID","MAX_BIN_ID","BASIS_POINT_MAX","DEFAULT_MAX_WEIGHT","DEFAULT_MIN_WEIGHT","BIN_BOUND","MAX_FEE_RATE","FEE_PRECISION","BASIS_POINT","REWARD_PERIOD","REWARD_PERIOD_START_AT","import_bn","MAX_EXPONENTIAL","BN","SCALE_OFFSET","ONE","MAX","BinUtils","_BinUtils","liquidity_bins","lower_bin_id","upper_bin_id","position_count","positions","current_lower","i","current_upper","position_bins","bin","acc","bins","rate","used_bins","used_total_amount_a","used_total_amount_b","amount_a","amount_b","liquidity","used_liquidity","used_amount_a","used_amount_b","remove_liquidity","amount_a_out","decimal_default","amount_b_out","positionCount","qPrice","delta_liquidity","liquidity_supply","handleError","out_amount_a","out_amount_b","bin_id","bin_step","decimal_a","decimal_b","pricePerLamport","binStepNum","price","binStep","min","binId","bps","base","exp","invert","squaredBase","result","score","BIN_BOUND","scoreBigInt","groupIndex","offsetInGroup","n","minBinId","maxBinId","minQPrice","maxQPrice","active_id","max_price_slippage","price_limit","slippage_active_id","bin_shift","import_bcs","import_blakejs","parseDlmmBasePool","data","fields","error","handleError","parseDlmmPool","type","formatType","bin_manager","position_manager","reward_manager_fields","rewards","reward","current_reward_rate","emissions_per_second","BN","emissions_per_day","reward_manager","variable_parameters","pool","parsePartner","parseDlmmPosition","parseLiquidityShares","liquidity_shares","bin_step","lower_bin_id","active_bin","bins","liquidity","index","bin_id","price_per_lamport","BinUtils","amount_a","amount_b","q_price","acc","bin","decimal_default","parseBinInfoList","res","bcsCoinAmount","bin_amount","parseBinInfo","parsedDlmmPosFeeData","simulate_res","feeData","feeValueData","item","i","parsedJson","posObj","parsedDlmmPosRewardData","rewarderData","rewarderValueData","position_id","reward_coin","reward_amount","rewardInfo","rewarder","parsedSwapQuoteData","a2b","partner","amount_in","amount_out","fee","ref_fee","bin_swaps","from","target","bin_swaps_info","bin_swap","parseStrategyType","strategy_type","poolFilterEvenTypes","parsePoolTransactionInfo","txIndex","package_id","pool_id","list","timestampMs","events","event","package_address","info","generateRewardSchedule","baseTime","maxIntervals","timeInterval","result","intervals","baseDateTime","nowTime","rewardTime","parseRewardPeriodEmission","periodEmissionList","startTimeInSeconds","endTimeInSeconds","durationSeconds","time","findRewardPeriodEmission","period","parseCurrentRewardPeriodEmission","currentTime","safeMulAmount","amount","rate","DlmmError","safeAmount","getRouterModule","buildPoolKey","coin_type_a","coin_type_b","base_factor","coinABytes","coinBBytes","lenB","byteB","binStepBytes","baseFactorBytes","combinedBytes","hash","import_common_sdk","WeightUtils","_WeightUtils","options","strategy_type","active_id","bin_step","lower_bin_id","upper_bin_id","total_amount_a","total_amount_b","active_bin_of_pool","single_side","active_bin_price","BinUtils","active_weight_a","active_weight_b","base_weight","weights","SCALE_OFFSET","total_weight_a","total_weight_b","diff_weight","left_end_bin_id","right_start_bin_id","diff_min_weight","diff_max_weight","bin_id","weight_per_prices","weight","delta_bin","weight_per_price","min_bin_id","max_bin_id","distributions","i","maxWeight","diffWeight","diffMinWeight","diffMaxWeight","minWeight","amount_b","contain_active_bin","totalWeight","bin","sum","el","price_per_lamport","rate","amount_b_in_bin","safeMulAmount","amount_a","qPrice","liquidity","weightPerPrice","decimal_default","amount_a_in_bin","amount_a_in_active_bin","amount_b_in_active_bin","isOnlyAmountA","isOnlyAmountB","activeBins","element","totalWeightA","totalWeightB","activeWeightA","activeWeightB","kA","kB","bin_amounts","weighPerPrice","amountAActiveBin","amountBActiveBin","amount","fix_amount_a","k","other_amount","amount_a_in_active_id","amount_b_in_active_id","p0","amountA","amountB","m","activeBin","is_only_amount","amountAInActiveBinDec","amountBInActiveBinDec","import_common_sdk","StrategyUtils","weights_info","total_weight_a","total_weight_b","weights","weight_per_prices","total_amount_a","total_amount_b","active_weight_a","active_weight_b","lower_bin_id","upper_bin_id","active_id","bin_step","ky","SCALE_OFFSET","kx","amount_a_in_active_id","safeAmount","amount_b_in_active_id","bin_count","bin_id","idx","bin_amounts","amount_a_in_bin","amount_b_in_bin","qPrice","BinUtils","liquidity","min_bin_id","max_bin_id","amount_a","amount_b","strategy_type","active_bin_of_pool","WeightUtils","amount","fix_amount_a","info","import_common_sdk","FeeUtils","_FeeUtils","variableParameters","volatility_accumulator","bin_step_config","variable_fee_control","bin_step","amount","total_fee_rate","fee_amount","protocol_fee_rate","fee_a","fee_b","protocol_fee_a","protocol_fee_b","active_bin","used_bin","base_factor","qPrice","BinUtils","bin_liquidity","delta_liquidity","delta_liquidity_share","amount_a_out","amount_b_out","base_fee","variable_fee","fees_a","fees_b","IlmUtils","options","curvature","initial_price","max_price","bin_step","total_supply","pool_share_percentage","config","price_curve_points_num","liquidity_distribution_num","tokens_table_num","price_table_num","flat","myFormula","c","price_diff","pool_supply","integrate","upper","lower","u","l","reverse_formula","price","liquidity","binTokens","getBinIdFromLamportPrice","pricePerLamport","binStep","min","binStepNum","binId","getPricePerLamportFromBinId","prices","heights","minBinId","maxBinId","total","binFlag","nextPrice","tokenDiff","result","LDstep","pricePoints","priceMin","priceMax","index","x","y","liquidityPoints","liquidityMin","liquidityMax","dlmmBins","dlmmBinsMin","dlmmBinsMax","tokensTable","tokensWithdrawn","step","n","amountUsd","step2","priceTable","r","import_client","import_utils","import_bcs","PoolModule","sdk","coin_type_a","coin_type_b","bin_step","base_factor","poolKey","buildPoolKey","dlmm_pool","pools_id","res","error","handleError","pagination_args","force_refresh","dataPage","queryAll","cacheAllKey","cacheDate","moveEventType","object","pool","parseDlmmBasePool","basePoolPage","item","suiObj","parseDlmmPool","cacheKey","bin_manager_handle","bin_id","cacheData","score","BinUtils","groupIndex","offsetInGroup","fields","bin_info","parseBinInfo","options","bin_info_list","warpOptions","option","dynamic_field_id","index","binFields","pool_id","tx","limit","bin_infos","start_bin_id","hasNext","start_bin","list","parseBinInfoList","a","b","order","full_rpc_url","fullClient","sdkOptions","client","data","query","user_limit","dataList","parsePoolTransactionInfo","lower_bin_id","upper_bin_id","assign_pool_ids","allPool","url","price_base_coin","price","lower_price","upper_price","decimals_a","decimals_b","strategy_type","use_bin_infos","active_id","new_bin_infos","calculateOption","createPoolAndAddOption","registry_id","global_config_id","versioned_id","cert","width","addOption","import_common_sdk","dlmmTestnet","import_common_sdk","import_transactions","import_utils","PositionModule","sdk","owner","list","obj","parseDlmmPosition","error","handleError","position_id","res","option","tx","pool_id","coin_type_a","coin_type_b","dlmm_pool","versioned_id","global_config_id","fee_a_balance","fee_b_balance","fee_a_obj","fee_b_obj","options","reward_coins","reward_coin","reward_coin_balance","reward_coin_obj","active_id","max_price_slippage","bin_step","dlmm_router","bin_shift","BinUtils","active_id_u32","coin_a_obj","coin_b_obj","close_position_cert","coin_a_balance","coin_b_balance","bin_manager_handle","lower_bin_id","upper_bin_id","force_refresh","bins","coin_amount","isBothSide","bins_b","bin","bins_a","total_amount","amount_rate","used_bins","fix_amount_a","active_bin","total_amount_a","acc","total_amount_b","is_only_a","isAutoFill","active_bin_of_pool","strategy_type","bin_infos","StrategyUtils","active_bin_index","pool","fees_a","fees_b","FeeUtils","slippage","collect_fee","remove_percent","min_bin_id_u32","max_bin_id_u32","remove_percent_fixed","bin_amounts","remove_liquiditys","price_base_coin","price","lower_price","upper_price","decimals_a","decimals_b","use_bin_infos","new_bin_infos","calculateOption","openAndAddLiquidityOption","coin_object_id_a","coin_object_id_b","isOpenPosition","liquidity_bins","position_bins","liquidity_bin","index","amount_a","amount_b","coin_a_obj_id","coin_b_obj_id","position","lower_bin_id_u32","routerModule","getRouterModule","width","valid_bins","valid_lower_bin_id_u32","valid_upper_bin_id_u32","amounts_a","amounts_b","bin_ids","open_position_id","simulateRes","feeData","parsedDlmmPosFeeData","rewardData","parsedDlmmPosRewardData","import_transactions","import_common_sdk","import_utils","SwapModule","sdk","option","dlmm_pool","pool_id","coin_type_a","coin_type_b","a2b","by_amount_in","in_amount","versioned_id","global_config_id","tx","simulateRes","handleError","quoteInfo","parsedSwapQuoteData","dlmm_router","quote_obj","slippage","partner","out_amount","in_amount_limit","out_amount_limit","in_coin","import_transactions","import_common_sdk","PartnerModule","sdk","allPartner","dlmm_pool","partners_id","res","warpIds","item","partner","parsePartner","error","handleError","owner","partner_id","cacheKey","cached","partnerCapId","fields","partner_balance_handle","balanceList","option","tx","ref_fee_rate","global_config_id","versioned_id","ref_fee_rate_raw","partner_cap_id","fee_coin_types","coin_type","start_time","end_time","startTimeInSeconds","endTimeInSeconds","name","recipient","import_transactions","import_common_sdk","import_bn","RewardModule","sdk","period_emission_handle","curr_emission_per_second","last_updated_time","res","result","warpIds","item","fields","emission_rate","BN","time","visualizedTime","rewardPeriodEmission","sortedList","a","b","newNodeList","last_emission_rate","i","emissions_per_day","option","tx","dlmm_pool","global_config_id","versioned_id","pool_id","reward_coin_type","reward_amount","start_time_seconds","end_time_seconds","coin_type_a","coin_type_b","reward_coin","reward_coin_types","type","import_transactions","import_common_sdk","ConfigModule","sdk","option","tx","dlmm_pool","global_config_id","versioned_id","reward_coin_types","type","reward_coin_type","bin_steps_handle","res","list","bin_step_ids","item","bin_step_config","fields","reward_config","white_list","error","handleError","configs","tx_digest","event","parsedJson","registerRes","registerFields","CetusDlmmSDK","_CetusDlmmSDK","options","PoolModule","PositionModule","SwapModule","PartnerModule","RewardModule","ConfigModule","env","dlmmMainnet","dlmmTestnet","index_default","CetusDlmmSDK"]}