pimath 0.1.29 → 0.1.32

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.
@@ -1 +1 @@
1
- {"version":3,"file":"pimath.js","sources":["../src/numeric.ts","../src/coefficients/fraction.ts","../src/coefficients/nthRoot.ts","../src/algebra/equationSolver.ts","../node_modules/piexpression/dist/piexpression.js","../src/algebra/monom.ts","../src/helpers.ts","../src/algebra/polynom.ts","../src/algebra/equation.ts","../src/algebra/factor.ts","../src/algebra/linearSystem.ts","../src/algebra/logicalset.ts","../src/algebra/polyFactor.ts","../src/geometry/geomMath.ts","../src/geometry/vector.ts","../src/pimath.interface.ts","../src/randomization/rndHelpers.ts","../src/geometry/point.ts","../src/geometry/line.ts","../src/geometry/circle.ts","../src/geometry/line3.ts","../src/geometry/matrix.ts","../src/geometry/plane3.ts","../src/geometry/triangle.ts","../src/geometry/sphere3.ts","../src/randomization/coefficient/rndFraction.ts","../src/randomization/algebra/rndMonom.ts","../src/randomization/algebra/rndPolynom.ts","../src/randomization/algebra/rndEquation.ts","../src/randomization/geometry/rndVector.ts","../src/randomization/geometry/rndCircle.ts","../src/randomization/geometry/rndLine.ts","../src/randomization/geometry/rndLine3.ts","../src/randomization/random.ts","../src/index.ts"],"sourcesContent":["\r\nfunction decompose(value: number): number[][] {\r\n const divs: number[] = dividers(value)\r\n const arr: number[][] = []\r\n let u, v\r\n\r\n while (divs.length > 0) {\r\n u = divs.shift() ?? 1\r\n v = (divs.length > 0 ? divs.pop() : +u) ?? 1\r\n\r\n arr.push([u, v])\r\n }\r\n\r\n return arr\r\n}\r\n\r\nfunction divideNumbersByGCD(...values: number[]): number[] {\r\n const g = greatestCommonDivisor(...values)\r\n\r\n return values.map(x => x / g)\r\n}\r\n\r\n/**\r\n * Get the list of all dividers of a number.\r\n * @param value\r\n */\r\nfunction dividers(value: number): number[] {\r\n const absV = Math.abs(value)\r\n const maxV = Math.sqrt(absV)\r\n\r\n // Initialize the list of dividers.\r\n const D: number[] = []\r\n\r\n for (let i = 1; i <= maxV; i++) {\r\n if (value % i === 0) {\r\n D.push(i)\r\n D.push(absV / i)\r\n }\r\n }\r\n\r\n // Order numbers.\r\n D.sort(function (a, b) {\r\n return a - b\r\n })\r\n\r\n // Make sure the array of value is unique.\r\n return [...new Set(D)]\r\n}\r\n\r\n/**\r\n * Great Common Divisor\r\n * @param values : number values\r\n */\r\nfunction greatestCommonDivisor(...values: number[]): number {\r\n // Define the gcd for two number\r\n const gcd2 = function (a: number, b: number): number {\r\n if (b === 0) {\r\n return a\r\n }\r\n return gcd2(b, a % b)\r\n }\r\n\r\n let g = 1,\r\n i = 2\r\n\r\n // Nothing is given\r\n if (values.length === 0) {\r\n return 1\r\n }\r\n // Only one number is given\r\n if (values.length === 1) {\r\n // The first number is zero\r\n if (values[0] === 0) {\r\n return 1\r\n }\r\n // Return the number\r\n return values[0]\r\n }\r\n\r\n // We have at least 2 numbers.\r\n g = gcd2(values[0], values[1])\r\n\r\n // The gcd of the two first value is one ? It's already finished.\r\n if (g === 1) {\r\n return 1\r\n }\r\n\r\n // The current gcd isn't one. Continue with all next values.\r\n for (i = 2; i < values.length; i++) {\r\n g = gcd2(g, values[i])\r\n // Escape if gcd is already one.\r\n if (g === 1) {\r\n break\r\n }\r\n }\r\n\r\n return Math.abs(g)\r\n}\r\n\r\n/**\r\n * Least Common Multiple\r\n * @param values: list of numbers\r\n */\r\nfunction leastCommonMultiple(...values: number[]): number {\r\n return values.reduce(function (a, b) {\r\n return Math.abs(a * b / greatestCommonDivisor(a, b))\r\n })\r\n}\r\n\r\nfunction numberCorrection(value: number, number_of_digits = 3) {\r\n return +value.toFixed(number_of_digits)\r\n}\r\n\r\nfunction periodic(value: number): number {\r\n if (Number.isSafeInteger(value)) {\r\n return 0\r\n }\r\n\r\n // Assume it's with decimal.\r\n const decimal = (value.toString()).split('.')[0]\r\n\r\n // The decimal part is limited\r\n if (decimal.length < 10) {\r\n return 0\r\n }\r\n\r\n // Find the periodic if it exists.\r\n throw new Error('Periodic value: Not implemented yet')\r\n}\r\n\r\n/**\r\n * Get the list of the nth first prime numbers.\r\n * @param nb : number of primes to choose from\r\n */\r\nfunction primes(nb?: number): number[] {\r\n const primesValues: number[] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]\r\n if (nb === undefined) {\r\n return primesValues\r\n } else {\r\n return primesValues.slice(0, Math.min(primesValues.length, nb))\r\n }\r\n}\r\n\r\nfunction pythagoreanTripletsWithTarget(target: number, targetIsSquare?: boolean): number[][] {\r\n // méthode inverse, à partir du triplet.\r\n const triplets = [],\r\n targetValue = targetIsSquare === true ? +target : target ** 2\r\n for (let u = 0; u <= target; u++) {\r\n for (let v = 0; v <= target; v++) {\r\n if (u ** 2 + v ** 2 === targetValue) {\r\n triplets.push([u, v, target])\r\n }\r\n }\r\n }\r\n\r\n return triplets\r\n}\r\n\r\nfunction round(value: number, decimals = 2): number {\r\n const exp: number = Math.round(Number(`${value}e${decimals}`))\r\n\r\n return Number(`${exp}e-${decimals}`)\r\n}\r\n\r\n\r\nexport const Numeric = {\r\n decompose,\r\n dividers,\r\n divideNumbersByGCD,\r\n gcd: greatestCommonDivisor,\r\n lcm: leastCommonMultiple,\r\n numberCorrection,\r\n periodic,\r\n primes,\r\n pythagoreanTripletsWithTarget,\r\n round\r\n}","import type {compareSign, IExpression, InputValue, IPiMathObject} from \"../pimath.interface\"\r\nimport {Numeric} from \"../numeric\"\r\n\r\nenum FRAC_TYPE {\r\n frac = 'frac',\r\n dfrac = 'dfrac',\r\n tfrac = 'tfrac'\r\n}\r\n\r\n/**\r\n * The fraction class make possible to handle\r\n * \\\\(\\frac{a}{b}\\\\) or \\\\[\\frac{a}{b}\\\\] values.\r\n */\r\nexport class Fraction implements IPiMathObject<Fraction>, IExpression<Fraction> {\r\n #approximative = false\r\n #denominator = 1\r\n #numerator = 1\r\n #type: FRAC_TYPE = FRAC_TYPE.frac\r\n\r\n constructor()\r\n constructor(value: InputValue<Fraction>)\r\n constructor(numerator: number, denominator: number)\r\n constructor(decimal: number, periodLength: number)\r\n constructor(value?: InputValue<Fraction>, denominatorOrPeriodic?: number) {\r\n\r\n if (value !== undefined) {\r\n this.parse(value, denominatorOrPeriodic)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse the value to get the numerator and denominator\r\n * @param value : number or string to parse to get the fraction\r\n * @param denominatorOrPeriodic (optional|number) : length of the periodic part: 2.333333 => 1 or denominator value\r\n */\r\n public parse = (value: InputValue<Fraction>, denominatorOrPeriodic?: number): Fraction => {\r\n let S: string[]\r\n\r\n // A null value means a zero fraction.\r\n if (value === \"\") {\r\n this.#numerator = 0\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n switch (typeof value) {\r\n case \"string\":\r\n // Split the string value in two parts: Numerator/Denominator\r\n S = value.split('/')\r\n\r\n // Security checks\r\n if (S.length > 2) {\r\n throw new Error(`The given value is not a valid fraction (${value})`)\r\n }\r\n if (S.map(x => x === '' || isNaN(Number(x))).includes(true)) {\r\n throw new Error(`The given value is not a valid fraction (${value})`)\r\n }\r\n\r\n if (S.length === 1) {\r\n // No divide sign - it's a number\r\n return this.parse(+S[0])\r\n } else if (S.length === 2) {\r\n // One divide signe\r\n // We check if the denominator is zero\r\n if (S[1] === '0') {\r\n this.#numerator = NaN\r\n this.#denominator = 1\r\n } else {\r\n this.#numerator = +S[0]\r\n this.#denominator = +S[1]\r\n }\r\n } else {\r\n // More than one divide sign ?\r\n // This is impossible\r\n this.#numerator = NaN\r\n this.#denominator = 1\r\n }\r\n break\r\n case \"number\":\r\n if (Number.isSafeInteger(value)) {\r\n // The given value is an integer\r\n this.#numerator = +value\r\n\r\n if (denominatorOrPeriodic === undefined || !Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this.#denominator = 1\r\n } else {\r\n this.#denominator = +denominatorOrPeriodic\r\n }\r\n } else {\r\n // The given value is a float number\r\n // Get the number of decimals after the float sign\r\n const [, decimal] = (value.toString()).split('.')\r\n const p: number = decimal ? decimal.length : 0\r\n\r\n // Detect if the decimal part is periodic or not...\r\n\r\n // Transform the float number in two integer\r\n if (denominatorOrPeriodic === undefined) {\r\n this.#numerator = value * Math.pow(10, p)\r\n this.#denominator = Math.pow(10, p)\r\n } else if (Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this.#numerator = value * Math.pow(10, p) - Math.floor(value * Math.pow(10, p - denominatorOrPeriodic))\r\n this.denominator = Math.pow(10, p) - Math.pow(10, p - denominatorOrPeriodic)\r\n }\r\n\r\n this.reduce()\r\n }\r\n break\r\n case \"object\":\r\n if (value instanceof Fraction) {\r\n this.#numerator = +value.numerator\r\n this.#denominator = +value.denominator\r\n }\r\n break\r\n }\r\n return this\r\n }\r\n\r\n public clone = (): Fraction => {\r\n const F = new Fraction()\r\n F.numerator = +this.#numerator\r\n F.denominator = +this.#denominator\r\n return F\r\n }\r\n\r\n public static average = (...fractions: (InputValue<Fraction>)[]): Fraction => {\r\n const M = new Fraction().zero()\r\n\r\n for (const f of fractions) {\r\n M.add(f)\r\n }\r\n\r\n M.divide(fractions.length)\r\n\r\n return M\r\n }\r\n\r\n public static max = (...fractions: InputValue<Fraction>[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (const m of fractions) {\r\n const compare = new Fraction(m)\r\n if (compare.isGreater(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n public static min = (...fractions: (InputValue<Fraction>)[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (const m of fractions) {\r\n const compare = new Fraction(m)\r\n if (compare.isLesser(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n public static sort = (fractions: (InputValue<Fraction>)[], reverse?: boolean): Fraction[] => {\r\n const fractionsObject: Fraction[] = fractions.map(f => f instanceof Fraction ? f : new Fraction(f))\r\n\r\n const sorted = fractionsObject.sort((a, b) => a.value - b.value)\r\n\r\n if (reverse) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n\r\n public static unique = (fractions: (InputValue<Fraction>)[]): Fraction[] => {\r\n const unique: Record<string, boolean> = {},\r\n distinct: Fraction[] = []\r\n\r\n fractions.forEach(x => {\r\n if (!(x instanceof Fraction)) {\r\n x = new Fraction(x)\r\n }\r\n\r\n if (!unique[x.clone().reduce().tex]) {\r\n distinct.push(x.clone())\r\n unique[x.tex] = true\r\n }\r\n })\r\n\r\n return distinct\r\n }\r\n\r\n public static xMultiply = (...values: (InputValue<Fraction>)[]): Fraction => {\r\n const R = new Fraction()\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n for (const value of values) {\r\n\r\n const F = new Fraction(value)\r\n R.numerator = R.numerator * F.numerator\r\n R.denominator = R.denominator * F.denominator\r\n }\r\n\r\n return R\r\n }\r\n\r\n public abs = (): this => {\r\n this.#numerator = Math.abs(this.#numerator)\r\n this.#denominator = Math.abs(this.#denominator)\r\n return this\r\n }\r\n\r\n public add = (F: InputValue<Fraction>): Fraction => {\r\n if (F instanceof Fraction) {\r\n const N: number = this.#numerator,\r\n D: number = this.#denominator\r\n\r\n this.#numerator = N * F.denominator + F.numerator * D\r\n this.#denominator = D * F.denominator\r\n } else {\r\n return this.add(new Fraction(F))\r\n }\r\n\r\n return this.reduce()\r\n }\r\n\r\n public amplify = (k: number): this => {\r\n if (Number.isSafeInteger(k)) {\r\n this.#numerator *= k\r\n this.#denominator *= k\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Simple function to determine if it's a fraction\r\n */\r\n public areEquals = (...F: Fraction[]): boolean => {\r\n return F.every(f => f.isEqual(F[0]))\r\n }\r\n\r\n // ------------------------------------------\r\n /**\r\n * Compare the current coefficient with another coefficient\r\n * @param F (Coefficient) The coefficient to _compare\r\n * @param sign (string| default is =): authorized values: =, <, <=, >, >= with some variations.\r\n */\r\n public compare = (F: InputValue<Fraction>, sign?: compareSign): boolean => {\r\n if (sign === undefined) {\r\n sign = '='\r\n }\r\n\r\n let compareFraction: Fraction\r\n if (F instanceof Fraction) {\r\n compareFraction = F.clone()\r\n } else {\r\n compareFraction = new Fraction(F)\r\n }\r\n\r\n switch (sign) {\r\n case '>':\r\n return this.value > compareFraction.value\r\n case \">=\":\r\n case \"=>\":\r\n case \"geq\":\r\n return this.value >= compareFraction.value\r\n case \"<\":\r\n return this.value < compareFraction.value\r\n case \"<=\":\r\n case \"=<\":\r\n case \"leq\":\r\n return this.value <= compareFraction.value\r\n case \"=\":\r\n // let F2: Fraction = compareFraction.clone().reduce(),\r\n // F1: Fraction = this.clone().reduce();\r\n // return (F1.numerator === F2.numerator && F1.denominator === F2.denominator);\r\n return this.value === compareFraction.value\r\n case \"<>\":\r\n return this.value !== compareFraction.value\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n public get denominator(): number {\r\n return this.#denominator\r\n }\r\n\r\n public set denominator(value: number) {\r\n this.#denominator = value\r\n }\r\n\r\n public get dfrac(): this {\r\n this.#type = FRAC_TYPE.dfrac\r\n return this\r\n }\r\n\r\n public get display(): string {\r\n if (this.isExact()) {\r\n if (this.#denominator === 1) {\r\n return `${this.#numerator}`\r\n } else {\r\n return `${this.#numerator}/${this.#denominator}`\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n public divide = (F: Fraction | number): Fraction => {\r\n const Q = new Fraction(F)\r\n\r\n if (Q.numerator === 0) {\r\n return new Fraction().infinite()\r\n }\r\n\r\n const N: number = +this.#numerator,\r\n D: number = +this.#denominator\r\n\r\n this.#numerator = N * Q.denominator\r\n this.#denominator = D * Q.numerator\r\n return this.reduce()\r\n }\r\n\r\n public get frac(): this {\r\n this.#type = FRAC_TYPE.frac\r\n return this\r\n }\r\n\r\n public infinite = (): this => {\r\n this.#numerator = Infinity\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n public invalid = (): this => {\r\n this.#numerator = NaN\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n public inverse = (): this => {\r\n const n = +this.#numerator\r\n this.#numerator = +this.#denominator\r\n this.#denominator = n\r\n\r\n return this\r\n }\r\n\r\n public isApproximative = (): boolean => {\r\n return this.#approximative ||\r\n this.#numerator.toString().length >= 15 && this.#denominator.toString().length >= 15\r\n }\r\n\r\n public isEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '=')\r\n }\r\n\r\n public isEven = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 0\r\n }\r\n\r\n public isExact = (): boolean => {\r\n return !this.isApproximative()\r\n }\r\n\r\n public isFinite = (): boolean => {\r\n return !this.isInfinity() && !this.isNaN()\r\n }\r\n\r\n public isGeq = (than: Fraction | number): boolean => {\r\n return this.compare(than, '>=')\r\n }\r\n\r\n public isGreater = (than: Fraction | number): boolean => {\r\n return this.compare(than, '>')\r\n }\r\n\r\n public isInfinity = (): boolean => {\r\n return Math.abs(this.#numerator) === Infinity\r\n }\r\n\r\n public isInverted = (p: Fraction): boolean => {\r\n return this.isEqual(new Fraction().one().divide(p.clone()))\r\n }\r\n\r\n public isLeq = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<=')\r\n }\r\n\r\n /* Compare shortcuts */\r\n public isLesser = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<')\r\n }\r\n\r\n public isNaN = (): boolean => {\r\n return isNaN(this.#numerator)\r\n }\r\n\r\n public isNatural = (): boolean => {\r\n return this.isRelative() && this.isPositive()\r\n }\r\n\r\n public isNegative = (): boolean => {\r\n return this.sign() === -1\r\n }\r\n\r\n public isNegativeOne = (): boolean => {\r\n return this.#numerator === -1 && this.#denominator === 1\r\n }\r\n\r\n public isNotEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<>')\r\n }\r\n\r\n // ------------------------------------------\r\n\r\n public isNotZero = (): boolean => {\r\n return this.#numerator !== 0\r\n }\r\n\r\n public isOdd = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 1\r\n }\r\n\r\n public isOne = (): boolean => {\r\n return this.#numerator === 1 && this.#denominator === 1\r\n }\r\n\r\n public isOpposite = (p: Fraction): boolean => {\r\n return this.isEqual(p.clone().opposite())\r\n }\r\n\r\n public isPositive = (): boolean => {\r\n return this.sign() === 1\r\n }\r\n\r\n public isRational = (): boolean => {\r\n return !this.isRelative()\r\n }\r\n\r\n public isReduced = (): boolean => {\r\n return Math.abs(Numeric.gcd(this.#numerator, this.#denominator)) === 1\r\n }\r\n\r\n public isRelative = (): boolean => {\r\n return this.clone().reduce().denominator === 1\r\n }\r\n\r\n public isSquare = (): boolean => {\r\n return Math.sqrt(this.#numerator) % 1 === 0 && Math.sqrt(this.#denominator) % 1 === 0\r\n }\r\n\r\n public isStrictlyNegative = (): boolean => {\r\n return this.value < 0\r\n }\r\n\r\n public isStrictlyPositive = (): boolean => {\r\n return this.value > 0\r\n }\r\n\r\n // Mathematical operations specific to fractions\r\n public isZero = (): boolean => {\r\n return this.#numerator === 0\r\n }\r\n\r\n public multiply = (F: Fraction | number): this => {\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n const Q = new Fraction(F)\r\n\r\n this.#numerator = this.#numerator * Q.numerator\r\n this.#denominator = this.#denominator * Q.denominator\r\n\r\n return this.reduce()\r\n }\r\n\r\n // ------------------------------------------\r\n public get numerator(): number {\r\n return this.#numerator\r\n }\r\n\r\n public set numerator(value: number) {\r\n this.#numerator = value\r\n }\r\n\r\n public one = (): this => {\r\n this.#numerator = 1\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n public opposite = (): this => {\r\n this.#numerator = -this.#numerator\r\n return this\r\n }\r\n\r\n public pow = (p: number | Fraction): Fraction => {\r\n if (p instanceof Fraction) {\r\n return this.pow(p.value)\r\n }\r\n\r\n this.reduce()\r\n if (p < 0) {\r\n this.inverse()\r\n }\r\n\r\n // Check if numerator and denominator are roots of...\r\n // otherwise, convert to numeric.\r\n const controlNumerator = Math.floor(Math.pow(this.#numerator, Math.abs(p))),\r\n controlDenominator = Math.floor(Math.pow(this.#denominator, Math.abs(p)))\r\n\r\n if (controlNumerator ** Math.abs(p) === this.#numerator\r\n &&\r\n controlDenominator ** Math.abs(p) === this.#denominator) {\r\n this.#numerator = this.#numerator ** Math.abs(p)\r\n this.#denominator = this.#denominator ** Math.abs(p)\r\n } else {\r\n this.#numerator = this.#numerator ** Math.abs(p)\r\n this.#denominator = this.#denominator ** Math.abs(p)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public reduce = (): this => {\r\n const g = Numeric.gcd(this.#numerator, this.#denominator)\r\n this.#numerator = this.#numerator / g\r\n this.#denominator = this.#denominator / g\r\n\r\n if (this.#denominator < 0) {\r\n this.#denominator = -this.#denominator\r\n this.#numerator = -this.#numerator\r\n }\r\n return this\r\n }\r\n\r\n public root = (p: number): this => {\r\n\r\n // Check if they are perfect roots..\r\n if (p === 0) {\r\n return this\r\n }\r\n\r\n // If negative, inverse the fraction\r\n if (p < 0) {\r\n this.inverse()\r\n }\r\n\r\n // if p is not a safe integer, throw error\r\n if (!Number.isSafeInteger(p)) {\r\n throw new Error(\"The root must be an integer.\")\r\n }\r\n\r\n // if the fraction is negative and the root is even, throw error\r\n if (this.isNegative() && p % 2 === 0) {\r\n throw new Error(\"The root of a negative number must be odd.\")\r\n }\r\n\r\n // get the sign of the fraction and make it positive\r\n const sign = this.sign()\r\n this.abs()\r\n\r\n // Reduce the fraction\r\n this.reduce()\r\n\r\n // Check if numerator and denominator are roots of...\r\n // otherwise, convert to numeric.\r\n const controlNumerator = Math.floor(Math.pow(this.#numerator, Math.abs(1 / p))),\r\n controlDenominator = Math.floor(Math.pow(this.#denominator, Math.abs(1 / p)))\r\n\r\n this.#numerator = Math.pow(this.#numerator, Math.abs(1 / p))\r\n this.#denominator = Math.pow(this.#denominator, Math.abs(1 / p))\r\n\r\n if (controlNumerator !== this.#numerator\r\n ||\r\n controlDenominator !== this.#denominator) {\r\n // The fraction is not a perfect root - make it approximative\r\n this.#numerator = this.#numerator / this.#denominator\r\n this.#denominator = 1\r\n this.#approximative = true\r\n }\r\n\r\n // Restore the sign\r\n this.multiply(sign)\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n public sign = (): number => {\r\n return (this.#numerator * this.#denominator >= 0) ? 1 : -1\r\n }\r\n\r\n public sqrt = (): this => {\r\n return this.root(2)\r\n }\r\n\r\n public subtract = (F: Fraction | number): Fraction => {\r\n if (F instanceof Fraction) {\r\n return this.add(F.clone().opposite())\r\n } else {\r\n return this.add(-F)\r\n }\r\n }\r\n\r\n // Display getter\r\n public get tex(): string {\r\n if (this.isInfinity()) {\r\n return `${this.sign() === 1 ? '+' : '-'}\\\\infty`\r\n }\r\n\r\n\r\n if (this.isExact()) {\r\n if (this.#denominator === 1) {\r\n return `${this.#numerator}`\r\n } else if (this.#numerator < 0) {\r\n return `-\\\\${this.#type}{ ${-this.#numerator} }{ ${this.#denominator} }`\r\n } else {\r\n return `\\\\${this.#type}{ ${this.#numerator} }{ ${this.#denominator} }`\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n public get texWithSign(): string {\r\n return this.isPositive() ? `+${this.tex}` : this.tex\r\n }\r\n\r\n public get tfrac(): this {\r\n this.#type = FRAC_TYPE.tfrac\r\n return this\r\n }\r\n\r\n public get value(): number {\r\n const result = this.#numerator / this.#denominator\r\n return result === 0 ? 0 : result\r\n }\r\n\r\n public zero = (): this => {\r\n this.#numerator = 0\r\n this.#denominator = 1\r\n return this\r\n }\r\n}","// TODO: Remove NthRoot class\r\n/**\r\n * NthRoot is something like \"a+b\\sqrt{3}\r\n */\r\nexport class NthRoot {\r\n #radical: number\r\n #nth: number\r\n #coefficient: number\r\n #isValid: boolean\r\n\r\n constructor(...values: number[]) {\r\n this.#radical = 1\r\n this.#coefficient = 1\r\n this.#nth = 2\r\n this.#isValid = true\r\n\r\n if (values.length > 0) {\r\n this.parse(values[0], values[1], values[2])\r\n }\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get radical(): number {\r\n return this.#radical\r\n }\r\n\r\n set radical(value: number) {\r\n this.#radical = value\r\n }\r\n\r\n get nth(): number {\r\n return this.#nth\r\n }\r\n\r\n set nth(value: number) {\r\n if (Number.isSafeInteger(value) && value >= 2) {\r\n this.#nth = value\r\n } else {\r\n // Error setting the nth root.\r\n console.log('Error setting the nth root')\r\n this.#nth = 2\r\n }\r\n }\r\n\r\n get coefficient(): number {\r\n return this.#coefficient\r\n }\r\n\r\n set coefficient(value: number) {\r\n this.#coefficient = value\r\n }\r\n\r\n get tex(): string {\r\n let C: string\r\n\r\n if (this.#coefficient === 1) {\r\n C = ''\r\n } else if (this.#coefficient === -1) {\r\n C = '-'\r\n } else {\r\n C = this.#coefficient.toString()\r\n }\r\n\r\n if (this.#radical === 1) {\r\n return `${this.#coefficient}`\r\n } else {\r\n if (this.#nth === 2) {\r\n return `${C}\\\\sqrt{${this.#radical}}`\r\n } else {\r\n return `${C}\\\\sqrt[${this.#nth}]{${this.#radical}}`\r\n }\r\n }\r\n }\r\n\r\n get display(): string {\r\n let C: string\r\n\r\n if (this.#coefficient === 1) {\r\n C = ''\r\n } else if (this.#coefficient === -1) {\r\n C = '-'\r\n } else {\r\n C = this.#coefficient.toString()\r\n }\r\n\r\n if (this.#radical === 1) {\r\n return `${this.#coefficient}`\r\n } else {\r\n if (this.#nth === 2) {\r\n return `${C}sqrt{${this.#radical}}`\r\n } else {\r\n return `${C}root(${this.#nth}){${this.#radical}}`\r\n }\r\n }\r\n }\r\n\r\n get value(): number {\r\n return this.#coefficient * Math.pow(this.#radical, 1 / this.#nth)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n parse = (radical: number, nthroot?: number, coefficient?: number): this => {\r\n this.#coefficient = coefficient ?? 1\r\n this.#nth = nthroot ?? 2\r\n this.#radical = radical\r\n\r\n if (this.#nth % 2 === 0 && this.#radical < 0) {\r\n this.#isValid = false\r\n }\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n reduce = (): this => {\r\n // Max value to test.\r\n let V = Math.floor(Math.pow(this.#radical, 1 / this.#nth))\r\n while (V > 1) {\r\n if (this.#radical % Math.pow(V, this.#nth) === 0) {\r\n // It's dividable by V^n\r\n this.#coefficient *= V\r\n this.#radical = this.#radical / Math.pow(V, this.#nth)\r\n\r\n // Redifine the new testing value (this is optimization)\r\n V = Math.floor(Math.pow(this.#radical, 1 / this.#nth))\r\n continue\r\n }\r\n V--\r\n }\r\n return this\r\n }\r\n\r\n multiply = (N: NthRoot): this => {\r\n this.#radical *= N.radical\r\n return this.reduce()\r\n }\r\n\r\n // ------------------------------------------\r\n // Help functions\r\n // ------------------------------------------\r\n hasRadical = (): boolean => {\r\n return !(this.#radical === 1 || this.#radical === 0 || !this.#isValid)\r\n }\r\n}","import type {InputValue, ISolution} from \"../pimath.interface\"\r\nimport type {Polynom} from \"./polynom\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Numeric} from \"../numeric\"\r\nimport type {Equation} from \"./equation\"\r\n\r\nexport class EquationSolver {\r\n readonly #equation: Polynom\r\n readonly #variable: string\r\n\r\n constructor(left: Polynom | Equation, right?: Polynom, variable = \"x\") {\r\n this.#variable = variable\r\n\r\n if (Object.hasOwn(left, 'moveLeft')) {\r\n const equ = left as Equation\r\n this.#equation = equ.left.clone().subtract(equ.right)\r\n } else {\r\n this.#equation = (left as Polynom).clone().subtract(right ?? 0)\r\n }\r\n }\r\n\r\n public solve(): ISolution[] {\r\n const degree = this.#equation.degree().value\r\n if (degree === 0) {\r\n return []\r\n }\r\n\r\n if (degree === 1) {\r\n return this.#solveLinear()\r\n }\r\n\r\n if (degree === 2) {\r\n return this.#solveQuadratic()\r\n }\r\n\r\n // Try to solve by factorization -> exact solutions.\r\n const result = this.#solveByFactorization()\r\n if (result.length > 0) {\r\n return result\r\n }\r\n\r\n // Use approximative solutions, using bissection algorithm.\r\n return this.#solveByBissection()\r\n }\r\n\r\n public solveAsCardan(): ISolution[] {\r\n if (this.#equation.degree().value !== 3) {\r\n throw new Error(\"The equation is not cubic.\")\r\n }\r\n return this.#solveCubic_CardanFormula()\r\n }\r\n\r\n #makeApproximativeSolution(value: number, output?: { tex: string, display: string }): ISolution {\r\n return {\r\n variable: this.#variable,\r\n exact: false,\r\n value: +value.toFixed(10),\r\n tex: output?.tex ?? '',\r\n display: output?.display ?? ''\r\n }\r\n }\r\n\r\n #makeSolution(value: InputValue<Fraction>): ISolution {\r\n if (value instanceof Fraction && value.isApproximative()) {\r\n return this.#makeApproximativeSolution(value.value)\r\n }\r\n\r\n const fraction = new Fraction(value)\r\n return {\r\n variable: this.#variable,\r\n exact: fraction,\r\n value: fraction.value,\r\n tex: fraction.tex,\r\n display: fraction.display\r\n }\r\n }\r\n\r\n #solveByBissection(): ISolution[] {\r\n const solutions: ISolution[] = []\r\n const degree = this.#equation.degree().value\r\n const coeffs = this.#equation.getCoefficients().map(x=>x.value)\r\n\r\n // Calculate the Cauchy Bounds.\r\n const [a, ...values] = this.#equation.getCoefficients()\r\n const B = 1 + Math.max(...values.map(x => x.value / a.value))\r\n\r\n // Cut the [-B;B] interval in *n* parts\r\n\r\n // Calculate the value at each points\r\n const n = 100\r\n const dx = 2 * B / n\r\n const evaluatedPoints: { x: number, fx: number }[] = []\r\n for (let searchValue = -B; searchValue <= B; searchValue += dx) {\r\n const x = Numeric.numberCorrection(searchValue)\r\n evaluatedPoints.push(\r\n {\r\n x,\r\n fx: this.#equation.evaluate(x, true) as number\r\n }\r\n )\r\n }\r\n\r\n // Sort every points\r\n evaluatedPoints.sort((a, b) => a.x - b.x)\r\n\r\n // Check if there is a least n opposite couples\r\n const couples: [number, number][] = []\r\n evaluatedPoints.forEach((value, index) => {\r\n if (index > 0) {\r\n if (value.fx === 0) {\r\n couples.push([value.x, value.x])\r\n } else if (evaluatedPoints[index - 1].fx * value.fx < 0) {\r\n couples.push([\r\n evaluatedPoints[index - 1].x,\r\n value.x\r\n ])\r\n\r\n }\r\n }\r\n })\r\n\r\n // All solutions fund !\r\n couples.forEach(couple => {\r\n const [a, b] = couple\r\n\r\n if (a === b) {\r\n // Exact solution\r\n solutions.push(this.#makeSolution(a))\r\n }else{\r\n const bissection = this.#solveByBissection_algorithm(coeffs, a, b)\r\n if(bissection!==null) {\r\n solutions.push(this.#makeApproximativeSolution(bissection))\r\n }\r\n }\r\n })\r\n\r\n return solutions\r\n }\r\n\r\n #solveByBissection_algorithm(coeffs: number[], a: number, b: number, tol = 1e-10): number | null {\r\n let fa = this.#equation.evaluate(a, true) as number\r\n let fb = this.#equation.evaluate(b, true) as number\r\n\r\n if (fa * fb > 0) {\r\n console.log(\"Pas de racine dans l'intervalle donné\")\r\n return null\r\n }\r\n\r\n let mid: number\r\n while ((b - a) / 2 > tol) {\r\n mid = (a + b) / 2\r\n const fmid = this.#equation.evaluate( mid, true) as number\r\n\r\n if (fmid === 0) {\r\n return mid // racine exacte trouvée\r\n } else if (fa * fmid < 0) {\r\n b = mid\r\n fb = fmid\r\n } else {\r\n a = mid\r\n fa = fmid\r\n }\r\n }\r\n return (a + b) / 2 // retourner la racine approximative\r\n }\r\n\r\n #solveByFactorization(): ISolution[] {\r\n // Move everything to the left.\r\n\r\n // Get the polynom on the left (on the right, it's zero)\r\n let left = this.#equation.clone()\r\n\r\n // The solutions of the equation\r\n let solutions: ISolution[] = []\r\n\r\n // multiply by the lcm of the denominators\r\n // to get rid of the fractions\r\n const lcm = left.lcmDenominator()\r\n if (lcm !== 1) {\r\n left.multiply(lcm)\r\n }\r\n\r\n // left is a polynom ax^n+...+b\r\n const a = left.monomByDegree().coefficient // Greatest coefficient\r\n let b = left.monomByDegree(0).coefficient // Constant term\r\n\r\n // if the constant term is null, the polynom can be divided by x\r\n while (b.isZero()) {\r\n if (solutions.length === 0) {\r\n solutions.push(this.#makeSolution(0))\r\n }\r\n\r\n left = (left.divide('x'))\r\n b = left.monomByDegree(0).coefficient\r\n }\r\n\r\n // get all dividers of a and b\r\n const dividersA = Numeric.dividers(a.value)\r\n const dividersB = Numeric.dividers(b.value)\r\n\r\n // test all possible solutions\r\n for (const da of dividersA) {\r\n for (const db of dividersB) {\r\n const f = new Fraction(db, da)\r\n\r\n // Test with the fraction\r\n if ((left.evaluate(f) as Fraction).isZero() && !solutions.find(s => s.value === f.value)) {\r\n solutions.push(this.#makeSolution(f))\r\n }\r\n\r\n // Test with the opposite fraction\r\n f.opposite()\r\n if ((left.evaluate(f) as Fraction).isZero() && !solutions.find(s => s.value === f.value)) {\r\n solutions.push(this.#makeSolution(f))\r\n }\r\n }\r\n }\r\n\r\n // divide the left polynom by the solutions (as polynom)\r\n // to get the reduced polynom\r\n for (const s of solutions) {\r\n // if the solution is exact and is zero, it's already divided: skip it !\r\n if (s.exact !== false && (s.exact as Fraction).isZero()) {\r\n continue\r\n }\r\n\r\n const p = this.#equation.clone().parse('x', (s.exact as Fraction).denominator, -(s.exact as Fraction).numerator)\r\n\r\n while (left.isDividableBy(p)) {\r\n left = left.divide(p)\r\n }\r\n }\r\n\r\n // if the reduced polynom is of degree 0, we have found all the solutions\r\n if (left.degree().isZero()) {\r\n return solutions.sort((a, b) => a.value - b.value)\r\n }\r\n\r\n // if the reduced polynom is of degree greater than 3, we can't solve it\r\n if (left.degree().value > 3) {\r\n return []\r\n }\r\n\r\n // if the reduced polynom is of degree 1 or 2, we can solve it\r\n const solver = new EquationSolver(left, left.clone().parse('0'), this.#variable)\r\n solutions = solutions.concat(solver.solve())\r\n\r\n return solutions.sort((a, b) => a.value - b.value)\r\n }\r\n\r\n #solveCubic_CardanFormula(): ISolution[] {\r\n // get the coefficients of the equation\r\n const left = this.#equation\r\n\r\n // left is a polynom ax^3+bx^2+cx+d => the solution is x = (-b±√(b^2-4ac))/2a\r\n const a = left.monomByDegree(3).coefficient\r\n const b = left.monomByDegree(2).coefficient\r\n const c = left.monomByDegree(1).coefficient\r\n const d = left.monomByDegree(0).coefficient\r\n\r\n // normalize the coefficient by dividing by a\r\n const an = b.clone().divide(a)\r\n const bn = c.clone().divide(a)\r\n const cn = d.clone().divide(a)\r\n\r\n // Depressed cubic equation\r\n // x^3+px+q=0\r\n const p = bn.clone().subtract(an.clone().pow(2).divide(3))\r\n const q = cn.clone()\r\n .subtract(an.clone().multiply(bn).divide(3))\r\n .add(an.clone().pow(3).multiply(2).divide(27))\r\n\r\n\r\n // Cardan method\r\n // X^2 + qX - p^3/27 = 0\r\n // X^2 -SX + P = 0\r\n // S = u^3 + v^3 = -q\r\n // P = u^3v^3 = -p^3/27\r\n // u^3 and v^3 are the roots of the equation\r\n const S = q.clone().opposite()\r\n const P = p.clone().opposite().pow(3).divide(27)\r\n\r\n // Discriminant : delta = -(S^2 - 4P)\r\n // delta < 0 : 1 real solution\r\n // delta = 0 : 2 real solutions\r\n // delta > 0 : 3 real solutions\r\n const delta = S.clone().pow(2).subtract(P.clone().multiply(4)).opposite()\r\n // console.log('an=', an.display, 'bn=', bn.display, 'cn=', cn.display)\r\n // console.log('p=', p.display, 'q=', q.display)\r\n // console.log('S=', S.display, 'P=', P.display)\r\n // console.log('delta=', delta.display)\r\n\r\n // if delta is negative, there is one real solution\r\n if (delta.isNegative()) {\r\n const u = q.clone().opposite().add(delta.clone().opposite().sqrt()).divide(2).root(3)\r\n const v = q.clone().opposite().subtract(delta.clone().opposite().sqrt()).divide(2).root(3)\r\n\r\n const x = u.clone().add(v).subtract(an.clone().divide(3))\r\n\r\n return [this.#makeSolution(x)]\r\n }\r\n\r\n // if delta is zero, there are two real solutions\r\n if (delta.isZero()) {\r\n const u = q.clone().opposite().divide(2).root(3)\r\n\r\n const x1 = u.clone().opposite().subtract(an.clone().divide(3))\r\n const x2 = u.clone().multiply(2).subtract(an.clone().divide(3))\r\n\r\n // There is only one unique solution\r\n if (x1.isEqual(x2)) {\r\n return [this.#makeSolution(x1)]\r\n }\r\n\r\n return [\r\n this.#makeSolution(x2),\r\n this.#makeSolution(x1)\r\n ].sort((a, b) => a.value - b.value)\r\n }\r\n\r\n // if delta is positive, there are three real solutions\r\n if (delta.isPositive()) {\r\n const x: number[] = []\r\n const pv = p.value,\r\n qv = q.value,\r\n anv = an.value\r\n\r\n for (let i = 0; i < 3; i++) {\r\n x.push(2 * Math.sqrt(-pv / 3) * Math.cos(Math.acos(3 * qv / (2 * pv) * Math.sqrt(-3 / pv)) / 3 + 2 * Math.PI * i / 3) - anv / 3)\r\n }\r\n\r\n return x\r\n .map(v => this.#makeApproximativeSolution(v))\r\n .sort((a, b) => a.value - b.value)\r\n\r\n }\r\n\r\n return []\r\n }\r\n\r\n #solveLinear(): ISolution[] {\r\n // The equation is linear.\r\n const [a, b] = this.#equation.getCoefficients()\r\n\r\n // left is a polynom ax+b => the solution is x = -b/a\r\n const f = b.opposite().divide(a)\r\n\r\n return [\r\n this.#makeSolution(f)\r\n ]\r\n }\r\n\r\n #solveQuadratic(): ISolution[] {\r\n\r\n // The equation is quadratic.\r\n // We can solve it by isolating the variable.\r\n const left = this.#equation\r\n\r\n // left is a polynom ax^2+bx+c => the solution is x = (-b±√(b^2-4ac))/2a\r\n const [a, b, c] = left.getCoefficients()\r\n\r\n // delta2 = b^2-4ac\r\n const delta2 = b.clone().pow(2).subtract(a.clone().multiply(c).multiply(4))\r\n\r\n // if delta2 is negative, there is no solution\r\n if (delta2.isNegative()) {\r\n return []\r\n }\r\n\r\n // if delta2 is zero, there is one solution\r\n // if delta2 is positive, there are two solutions\r\n // if delta2 is a square, it will be an exact solution.\r\n\r\n if (delta2.isSquare()) {\r\n // delta is a fraction.\r\n // the solutions are (-b±√(b^2-4ac))/2a\r\n const delta = delta2.sqrt()\r\n const f1 = b.clone().opposite().add(delta).divide(a.clone().multiply(2))\r\n const f2 = b.clone().opposite().subtract(delta).divide(a.clone().multiply(2))\r\n\r\n // Delta is zero, there is only one solution\r\n if (delta.isZero()) {\r\n return [this.#makeSolution(f1)]\r\n }\r\n\r\n // delta is positive, there are two solutions\r\n return [\r\n this.#makeSolution(f1),\r\n this.#makeSolution(f2)\r\n ].sort((a, b) => a.value - b.value)\r\n }\r\n\r\n // delta is not a square, there are one or two approximative solutions.\r\n // We will use the approximate value of the square root.\r\n // const delta = delta2.value ** 0.5\r\n // const f1 = (-b.value + delta) / (2 * a.value)\r\n // const f2 = (-b.value - delta) / (2 * a.value)\r\n\r\n return this.#solveQuadratic_Output(a, b, delta2)\r\n }\r\n\r\n #solveQuadratic_Output(a: Fraction, b: Fraction, delta: Fraction): ISolution[] {\r\n // -b +/- sqrt(delta) / 2a\r\n // reduce the sqrt - extract pow.\r\n\r\n // Get the greatest square factor\r\n const deltaFactor: number = Numeric\r\n .dividers(delta.value)\r\n .filter(x => Math.sqrt(x) % 1 === 0)\r\n .map(x => Math.sqrt(x)).pop() ?? 1\r\n\r\n // Get the GCD of a, b, and the greatest delta factor.\r\n const gcd = Numeric.gcd(2 * a.value, b.value, deltaFactor) * (a.isNegative() ? -1 : 1)\r\n\r\n // Calculate the various values and transforming\r\n const b2 = b.clone().divide(gcd).opposite()\r\n const a2 = a.clone().divide(gcd).multiply(2)\r\n const delta2 = delta.clone().divide(deltaFactor ** 2)\r\n const deltaGcd = Math.abs(deltaFactor / gcd)\r\n const deltaK1 = deltaFactor === 1 ? '-' : `-${deltaGcd} `\r\n const deltaK2 = deltaFactor === 1 ? '+' : `+${deltaGcd} `\r\n\r\n function texOutput(a: string, b: string, k: string, delta: string) {\r\n return `\\\\frac{ ${b} ${k}\\\\sqrt{ ${delta} } }{ ${a} }`\r\n }\r\n\r\n function displayOutput(a: string, b: string, k: string, delta: string) {\r\n return `(${b}${k}sqrt(${delta}))/${a}`\r\n }\r\n\r\n const d = delta.value ** 0.5\r\n const f1 = (-b.value - d) / (2 * a.value)\r\n const f2 = (-b.value + d) / (2 * a.value)\r\n\r\n return [\r\n this.#makeApproximativeSolution(f1,\r\n {\r\n tex: texOutput(a2.tex, b2.tex, deltaK1.toString(), delta2.tex),\r\n display: displayOutput(a2.display, b2.display, deltaK1.toString(), delta2.display),\r\n }\r\n ),\r\n this.#makeApproximativeSolution(f2,\r\n {\r\n tex: texOutput(a2.tex, b2.tex, deltaK2.toString(), delta2.tex),\r\n display: displayOutput(a2.display, b2.display, deltaK2.toString(), delta2.display),\r\n }\r\n )\r\n ].sort((a, b) => a.value - b.value)\r\n }\r\n}\r\n","var _ = Object.defineProperty;\nvar C = (n) => {\n throw TypeError(n);\n};\nvar b = (n, s, e) => s in n ? _(n, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[s] = e;\nvar A = (n, s, e) => b(n, typeof s != \"symbol\" ? s + \"\" : s, e), P = (n, s, e) => s.has(n) || C(\"Cannot \" + e);\nvar a = (n, s, e) => (P(n, s, \"read from private field\"), e ? e.call(n) : s.get(n)), k = (n, s, e) => s.has(n) ? C(\"Cannot add the same private member more than once\") : s instanceof WeakSet ? s.add(n) : s.set(n, e), N = (n, s, e, c) => (P(n, s, \"write to private field\"), c ? c.call(n, e) : s.set(n, e), e);\nconst v = {\n pi: Math.PI,\n e: Math.exp(1)\n};\nvar t = /* @__PURE__ */ ((n) => (n.VARIABLE = \"variable\", n.COEFFICIENT = \"coefficient\", n.OPERATION = \"operation\", n.CONSTANT = \"constant\", n.FUNCTION = \"function\", n.FUNCTION_ARGUMENT = \"function-argument\", n.MONOM = \"monom\", n.LEFT_PARENTHESIS = \"(\", n.RIGHT_PARENTHESIS = \")\", n))(t || {}), u = /* @__PURE__ */ ((n) => (n.EXPRESSION = \"expression\", n.POLYNOM = \"polynom\", n.SET = \"set\", n.NUMERIC = \"numeric\", n))(u || {});\nfunction F(n, s) {\n if (n.length <= 1)\n return n;\n const e = Object.keys(s).filter((r) => s[r].type === t.FUNCTION).map((r) => r);\n e.sort((r, O) => O.length - r.length);\n const c = new RegExp(`^(${e.join(\"|\")})\\\\(`), i = Object.keys(v);\n i.sort((r, O) => O.length - r.length);\n const o = new RegExp(`^(${i.join(\"|\")})`), T = /^(\\d+(\\.\\d+)?)/;\n let f = \"\", d, p, h;\n for (; n.length > 0; ) {\n if (d = p, h = void 0, e.length > 0 && c.exec(n)) {\n const r = e.find((O) => n.startsWith(O));\n r && (h = r + \"(\", n = n.slice(r.length + 1), p = t.FUNCTION);\n } else if (i.length > 0 && o.exec(n)) {\n const r = i.find((O) => n.startsWith(O));\n r && (h = r, n = n.slice(r.length), p = t.CONSTANT);\n } else if (T.exec(n)) {\n const r = T.exec(n);\n r && (h = r[0], n = n.slice(r[0].length), p = t.COEFFICIENT);\n } else\n switch (h = n[0], n = n.slice(1), h) {\n case \"(\":\n p = t.LEFT_PARENTHESIS;\n break;\n case \")\":\n p = t.RIGHT_PARENTHESIS;\n break;\n case \",\":\n p = t.FUNCTION_ARGUMENT;\n break;\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"^\":\n p = t.OPERATION;\n break;\n default:\n p = t.VARIABLE;\n }\n if (h === void 0 || p === void 0)\n throw new Error(\"The token is undefined\");\n f += w(d, p), f += h;\n }\n return f;\n}\nfunction w(n, s) {\n return n === void 0 || n === t.OPERATION || s === t.OPERATION || n === t.LEFT_PARENTHESIS || n === t.FUNCTION || n === t.FUNCTION_ARGUMENT || s === t.RIGHT_PARENTHESIS || s === t.FUNCTION_ARGUMENT ? \"\" : \"*\";\n}\nconst U = {\n \"^\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"*\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"/\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"+\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION }\n}, y = {\n \"^\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"*\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"/\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"+\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"%\": { precedence: 3, associative: \"right\", type: t.OPERATION },\n sin: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n cos: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n tan: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n sqrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n nthrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n \",\": { precedence: 2, associative: \"left\", type: t.FUNCTION_ARGUMENT }\n}, S = {\n \"^\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"*\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"/\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"+\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"%\": { precedence: 3, associative: \"right\", type: t.OPERATION },\n sin: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n cos: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n tan: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n sqrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n nthrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n ln: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n log: { precedence: 4, associative: \"right\", type: t.FUNCTION }\n}, M = {\n \"&\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"|\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"!\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION }\n};\nvar I, R, l, g, E;\nclass L {\n constructor(s) {\n k(this, I);\n k(this, R, []);\n k(this, l, {});\n k(this, g, []);\n k(this, E);\n N(this, I, typeof s > \"u\" ? u.POLYNOM : s), this.tokenConfigInitialization();\n }\n // Getter\n get rpn() {\n return a(this, R);\n }\n get rpnToken() {\n return a(this, R).map((s) => s.token);\n }\n tokenConfigInitialization() {\n return a(this, I) === u.SET ? (N(this, l, M), N(this, E, !1)) : a(this, I) === u.NUMERIC ? (N(this, l, S), N(this, E, !0)) : a(this, I) === u.EXPRESSION ? (N(this, l, y), N(this, E, !0)) : (N(this, l, U), N(this, E, !0)), N(this, g, Object.keys(a(this, l)).sort((s, e) => e.length - s.length)), a(this, l);\n }\n /**\n * Get the next token to analyse.\n * @param expr (string) Expression to analyse\n * @param start (number) CUrrent position in the expr string.\n */\n NextToken(s, e) {\n let c, i;\n if (c = \"\", i = void 0, s[e] === \"(\")\n c = \"(\", i = t.LEFT_PARENTHESIS;\n else if (s[e] === \")\")\n c = \")\", i = t.RIGHT_PARENTHESIS;\n else if (s[e] === \",\")\n c = \",\", i = t.FUNCTION_ARGUMENT;\n else {\n for (const o of a(this, g))\n if (s.substring(e, e + o.length) === o) {\n c += o, i = a(this, l)[o].type;\n break;\n }\n for (const o in v)\n if (s.substring(e, e + o.length) === o) {\n c += o, i = t.CONSTANT;\n break;\n }\n if (c === \"\")\n if (/[0-9.]/.exec(s[e])) {\n const o = /^([0-9.]+)/.exec(s.substring(e));\n c = o ? o[0] : \"\", i = t.COEFFICIENT;\n } else if (/[a-zA-Z]/.exec(s[e])) {\n const o = /^([a-zA-Z])/.exec(s.substring(e));\n c = o ? o[0] : \"\", i = t.VARIABLE;\n } else\n console.log(\"Unidentified token\", s[e], s, e), c = s[e], i = t.MONOM;\n }\n if (i === void 0)\n throw new Error(`Token type is undefined for token ${c}`);\n return [c, e + c.length, i];\n }\n /**\n * Parse an expression using the shutting yard tree algorithms\n * @param expr (string) Expression to analyse\n * Returns a RPN list of items.\n * @param uniformize\n */\n parse(s, e) {\n const c = [], i = [];\n let o = \"\", T = 0, f;\n (e ?? a(this, E)) && (s = F(s, a(this, l)));\n const d = 50;\n let p = 50, h;\n for (; T < s.length; ) {\n if (p--, p === 0) {\n console.log(\"SECURITY LEVEL 1 EXIT\");\n break;\n }\n switch ([o, T, f] = this.NextToken(s, T), f) {\n case t.MONOM:\n case t.COEFFICIENT:\n case t.VARIABLE:\n case t.CONSTANT:\n c.push({\n token: o,\n tokenType: f\n });\n break;\n case t.OPERATION:\n if (i.length > 0) {\n let r = i[i.length - 1];\n for (h = +d; r.token in a(this, l) && //either o1 is left-associative and its precedence is less than or equal to that of o2,\n (a(this, l)[o].associative === \"left\" && a(this, l)[o].precedence <= a(this, l)[r.token].precedence || //or o1 is right associative, and has precedence less than that of o2,\n a(this, l)[o].associative === \"right\" && a(this, l)[o].precedence < a(this, l)[r.token].precedence); ) {\n if (h--, h === 0) {\n console.log(\"SECURITY LEVEL 2 OPERATION EXIT\");\n break;\n }\n if (c.push(i.pop() ?? { token: \"\", tokenType: t.OPERATION }), i.length === 0)\n break;\n r = i[i.length - 1];\n }\n }\n i.push({ token: o, tokenType: f });\n break;\n case t.FUNCTION_ARGUMENT:\n for (h = +d; i[i.length - 1].token !== \"(\" && i.length > 0; ) {\n if (h--, h === 0) {\n console.log(\"SECURITY LEVEL 2 FUNCTION ARGUMENT EXIT\");\n break;\n }\n c.push(i.pop() ?? { token: o, tokenType: f });\n }\n break;\n case t.LEFT_PARENTHESIS:\n i.push({ token: o, tokenType: f }), s[T] === \"-\" && c.push({ token: \"0\", tokenType: t.COEFFICIENT });\n break;\n case t.RIGHT_PARENTHESIS:\n for (h = +d; i[i.length - 1].token !== \"(\" && i.length > 1; ) {\n if (h--, h === 0) {\n console.log(\"SECURITY LEVEL 2 CLOSING PARENTHESIS EXIT\");\n break;\n }\n c.push(i.pop() ?? { token: o, tokenType: f });\n }\n i.pop();\n break;\n case t.FUNCTION:\n i.push({ token: o, tokenType: f });\n break;\n default:\n throw new Error(`Token type ${o} is not handled`);\n }\n }\n return N(this, R, c.concat(i.reverse())), this;\n }\n}\nI = new WeakMap(), R = new WeakMap(), l = new WeakMap(), g = new WeakMap(), E = new WeakMap();\nclass m {\n constructor(s, e) {\n A(this, \"_rpn\");\n A(this, \"_expression\");\n A(this, \"_isValid\");\n this._expression = s;\n try {\n this._rpn = new L(u.NUMERIC).parse(s, e).rpn;\n } catch {\n throw this._rpn = null, this._isValid = !1, new Error(`There was a problem parsing: ${s}`);\n }\n }\n get rpn() {\n return this._rpn ?? [];\n }\n get isValid() {\n if (this._isValid === void 0)\n try {\n this.evaluate({ x: 2 });\n } catch {\n this._isValid = !1;\n }\n return this._isValid ?? !1;\n }\n set isValid(s) {\n this._isValid = s;\n }\n get expression() {\n return this._expression;\n }\n evaluate(s) {\n const e = [];\n if (this._rpn === null)\n return this._isValid = !1, 0;\n this._isValid = !0;\n for (const c of this._rpn)\n if (c.tokenType === t.COEFFICIENT)\n if (!isNaN(+c.token))\n e.push(+c.token);\n else {\n const i = c.token.split(\"/\");\n if (i.length !== 2)\n throw this._isValid = !1, new Error(\"This coefficient is not a fraction\");\n e.push(+i[0] / +i[1]);\n }\n else if (c.tokenType === t.VARIABLE && s !== void 0)\n Object.hasOwn(s, c.token) && e.push(+s[c.token]);\n else if (c.tokenType === t.CONSTANT)\n e.push(v[c.token]);\n else if (c.tokenType === t.OPERATION) {\n if (c.token === \"*\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The multiplication factors ${o ?? \"a\"} or ${i ?? \"b\"} are not defined`);\n e.push(o * i);\n } else if (c.token === \"/\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The division values ${o ?? \"a\"} or ${i ?? \"b\"} are not defined`);\n e.push(o / i);\n } else if (c.token === \"+\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The addition values ${o ?? \"a\"} or ${i ?? \"b\"} are not defined`);\n e.push(+o + +i);\n } else if (c.token === \"-\") {\n const i = e.pop(), o = e.pop() ?? 0;\n if (i === void 0)\n throw this._isValid = !1, new Error(\"The subtraction value b is not defined\");\n e.push(o - i);\n } else if (c.token === \"^\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The base value ${o ?? \"a\"} or exponent ${i ?? \"b\"} are not defined`);\n e.push(Math.pow(o, i));\n }\n } else if (c.tokenType === t.FUNCTION) {\n const i = e.pop();\n if (i === void 0)\n throw this._isValid = !1, new Error(`The parameters for ${c.token} is not defined`);\n if (c.token === \"sin\")\n e.push(Math.sin(i));\n else if (c.token === \"cos\")\n e.push(Math.cos(i));\n else if (c.token === \"tan\")\n e.push(Math.tan(i));\n else if (c.token === \"sqrt\")\n e.push(Math.sqrt(i));\n else if (c.token === \"nthrt\") {\n const o = e.pop();\n if (o === void 0)\n throw this._isValid = !1, new Error(\"The nthrt function requires two parameters\");\n i % 2 === 0 && o < 0 ? e.push(NaN) : e.push((o < 0 ? -1 : 1) * Math.pow(Math.abs(o), 1 / i));\n } else c.token === \"ln\" ? e.push(Math.log(i)) : c.token === \"log\" && e.push(Math.log10(i));\n }\n if (e.length === 1)\n return this._numberCorrection(e[0]);\n throw new Error(`There was a problem parsing: ${this._expression}`);\n }\n _numberCorrection(s, e = 8) {\n return +s.toFixed(e);\n }\n}\nexport {\n m as NumExp,\n L as ShutingYard,\n u as ShutingyardMode,\n t as ShutingyardType,\n v as tokenConstant\n};\n","/***\r\n * Monom class\r\n */\r\nimport type {\r\n IAlgebra,\r\n IAnalyse,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n literalType\r\n} from \"../pimath.interface\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { NthRoot } from \"../coefficients/nthRoot\"\r\nimport { Numeric } from \"../numeric\"\r\n\r\nimport { ShutingYard, ShutingyardType, type Token } from \"piexpression\"\r\n\r\nexport class Monom implements IPiMathObject<Monom>, IExpression<Monom>, IAnalyse<Monom>, IAlgebra<Monom> {\r\n #coefficient: Fraction\r\n #literal: literalType<Fraction>\r\n\r\n constructor(value?: InputValue<Fraction>)\r\n constructor(value?: Monom)\r\n constructor(value?: InputAlgebra<Fraction>) {\r\n this.#coefficient = new Fraction().zero()\r\n this.#literal = {}\r\n\r\n if (value !== undefined) {\r\n // A string is given - try to parse the value.\r\n this.parse(value)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // -----------------------------------------\r\n /**\r\n * Parse a string to a monom. The string may include fraction.\r\n * @param inputStr\r\n */\r\n public parse(inputStr: InputAlgebra<Monom>): this {\r\n // Initialize the monom\r\n this.#coefficient = new Fraction()\r\n this.#literal = {}\r\n\r\n if (typeof inputStr === 'string') {\r\n this.#shutingYardToReducedMonom(inputStr)\r\n } else if (typeof inputStr === 'number') {\r\n this.#coefficient = new Fraction(inputStr)\r\n } else if (inputStr instanceof Fraction) {\r\n this.#coefficient = inputStr.clone()\r\n } else if (inputStr instanceof Monom) {\r\n this.#coefficient = inputStr.#coefficient.clone()\r\n\r\n // Copy the literal parts\r\n this.#cloneLiteral(inputStr)\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Clone the current Monom.\r\n */\r\n public clone = (): Monom => {\r\n const F: Monom = new Monom()\r\n\r\n F.coefficient = this.#coefficient.clone()\r\n\r\n // Copy the literal parts.\r\n for (const k in this.#literal) {\r\n F.setLetter(k, this.#literal[k].clone())\r\n }\r\n return F\r\n }\r\n\r\n public static gcd = (...monoms: Monom[]): Monom => {\r\n // All the monoms must be with natural powers...\r\n for (const m of monoms) {\r\n if (m.containsRationalPower()) {\r\n return new Monom().zero()\r\n }\r\n }\r\n\r\n const M = new Monom(),\r\n n: number = Numeric.gcd(...monoms.map(value => value.coefficient.numerator)),\r\n d: number = Numeric.lcm(...monoms.map(value => value.coefficient.denominator))\r\n\r\n // Get the coefficient.\r\n M.coefficient = new Fraction(n, d).reduce()\r\n\r\n // Set the literal parts - go through each monoms literal parts and get only the lowest degree of each letters.\r\n for (const m of monoms) {\r\n // Remove the inexistant letters from the resulting monom\r\n for (const letter in M.literal) {\r\n if (!(letter in m.literal)) {\r\n M.literal[letter].zero()\r\n }\r\n }\r\n for (const letter in m.literal) {\r\n if (!M.hasVariable(letter) && m.literal[letter].isStrictlyPositive()) {\r\n M.literal[letter] = m.literal[letter].clone()\r\n } else {\r\n M.literal[letter] = new Fraction(Math.min(m.literal[letter].value, M.literal[letter].value))\r\n }\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n /**\r\n * Multiply two monoms and return a NEW monom.\r\n * @param monoms\r\n */\r\n public static xMultiply = (...monoms: Monom[]): Monom => {\r\n const M = new Monom().one()\r\n\r\n for (const m of monoms) {\r\n M.multiply(m)\r\n }\r\n\r\n return M\r\n }\r\n\r\n /**\r\n * Add all similar monoms. If they aren't similar, they are simply skipped.\r\n * @param M (Monom[]) The monoms to add.\r\n */\r\n public add = (...M: InputAlgebra<Fraction>[]): this => {\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n if (this.isSameAs(mAsMonom)) {\r\n if (this.isZero()) {\r\n this.#cloneLiteral(mAsMonom)\r\n }\r\n\r\n this.#coefficient.add(mAsMonom.coefficient)\r\n } else {\r\n console.log('Add monom: ' + this.display + ' is not similar with ', mAsMonom.display)\r\n }\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Get the coefficient \\\\(k\\\\) of the Monom \\\\(k\\\\cdot x^{n}\\\\)\r\n * @returns {Fraction}\r\n */\r\n public get coefficient(): Fraction {\r\n return this.#coefficient\r\n }\r\n\r\n /**\r\n * Set the coefficient \\\\(k\\\\) value of the monom\r\n * @param {Fraction | number | string} F\r\n */\r\n public set coefficient(F: InputValue<Fraction>) {\r\n this.#coefficient = new Fraction(F)\r\n }\r\n\r\n public containsRationalPower = (): boolean => {\r\n return Object.values(this.#literal).some((value) => value.isRational())\r\n }\r\n\r\n /**\r\n * Get the degree of a monom. If no setLetter is given, the result will be the global degree.\r\n * @param letter (string) Letter to get to degree (power)\r\n */\r\n public degree = (letter?: string): Fraction => {\r\n if (this.variables.length === 0) {\r\n return new Fraction().zero()\r\n }\r\n if (letter === undefined) {\r\n // Not setLetter given -> we get the global monom degree (sum of all the letters).\r\n return Object.values(this.#literal).reduce((t, n) => t.clone().add(n))\r\n } else {\r\n // A setLetter is given -> get the corresponding power.\r\n return !this.hasVariable(letter) ? new Fraction().zero() : this.#literal[letter].clone()\r\n }\r\n }\r\n\r\n /**\r\n * Derivative the monom\r\n * @param letter\r\n */\r\n public derivative = (letter?: string): Monom => {\r\n // No setLetter given - assume it's the setLetter 'x'\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n if (this.hasVariable(letter)) {\r\n const d = this.#literal[letter].clone(),\r\n dM = this.clone()\r\n\r\n // Subtract one to the degree.\r\n dM.#literal[letter].subtract(1)\r\n\r\n // Multiply the coefficient by the previous degree\r\n dM.#coefficient.multiply(new Fraction(d.clone()))\r\n return dM\r\n } else {\r\n return new Monom().zero()\r\n }\r\n }\r\n\r\n // Display getter\r\n /**\r\n * This display getter is to be used in the polynom display getter\r\n */\r\n public get display(): string {\r\n let L = ''\r\n const letters = Object.keys(this.#literal).sort()\r\n for (const letter of letters) {\r\n if (this.#literal[letter].isNotZero()) {\r\n L += letter\r\n if (this.#literal[letter].isNotEqual(1)) {\r\n L += `^(${this.#literal[letter].display})`\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this.#coefficient.value != 0) {\r\n return this.#coefficient.display\r\n } else {\r\n return ''\r\n }\r\n } else {\r\n if (this.#coefficient.value === 1) {\r\n return L\r\n } else if (this.#coefficient.value === -1) {\r\n return `-${L}`\r\n } else if (this.#coefficient.value === 0) {\r\n return '0'\r\n } else {\r\n return `${this.#coefficient.display}${L}`\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Divide the current monoms by multiple monoms\r\n * @param M (Monom[])\r\n */\r\n public divide = (...M: InputAlgebra<Fraction>[]): this => {\r\n // Depending on the given value, choose the current item\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n // Divide the coefficient\r\n this.#coefficient.divide(mAsMonom.coefficient)\r\n\r\n // Subtract the power values\r\n for (const letter in mAsMonom.literal) {\r\n\r\n this.#literal[letter] = this.hasVariable(letter) ?\r\n this.#literal[letter].subtract(mAsMonom.literal[letter]) :\r\n mAsMonom.literal[letter].clone().opposite()\r\n\r\n\r\n // If the power of a particular setLetter is zero, delete it from the literal part..\r\n if (this.#literal[letter].isZero()) {\r\n this.removeVariable(letter)\r\n }\r\n }\r\n }\r\n return this\r\n }\r\n\r\n public get dividers(): Monom[] {\r\n // Decompose only if the coefficient is a natural number\r\n if (!this.coefficient.isRelative()) {\r\n return [this.clone()]\r\n }\r\n\r\n // Decompose only if the power values are natural numbers.\r\n if (this.containsRationalPower()) {\r\n return [this.clone()]\r\n }\r\n\r\n // Security : do not do this if greater than 10000\r\n if (this.coefficient.numerator > 1000000) {\r\n return [this.clone()]\r\n }\r\n\r\n const dividers = Numeric.dividers(Math.abs(this.coefficient.numerator))\r\n\r\n // Decompose the literals parts.\r\n let literals: literalType<Fraction>[] = []\r\n for (const L in this.literal) {\r\n // L is the letter.\r\n literals = this._getLiteralDividers(literals, L)\r\n }\r\n\r\n const monomDividers: Monom[] = []\r\n if (literals.length > 0 && dividers.length > 0) {\r\n for (const N of dividers) {\r\n for (const L of literals) {\r\n const M = new Monom()\r\n M.coefficient = new Fraction(N)\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n }\r\n } else if (dividers.length === 0) {\r\n for (const L of literals) {\r\n const M = new Monom()\r\n M.coefficient = new Fraction().one()\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n } else {\r\n for (const N of dividers) {\r\n const M = new Monom()\r\n M.coefficient = new Fraction(N)\r\n monomDividers.push(M)\r\n }\r\n }\r\n\r\n return monomDividers.length === 0 ? [new Monom().one()] : monomDividers\r\n }\r\n\r\n /**\r\n * Evaluate a monom. Each setLetter must be assigned to a Fraction.\r\n * @param values Dictionary of <setLetter: Fraction>\r\n * @param asNumeric\r\n */\r\n public evaluate = (values: literalType<number | Fraction> | InputValue<Fraction>, asNumeric?: boolean): Fraction | number => {\r\n // If as numeric return the numeric value\r\n if (asNumeric === true) {\r\n // Convert all values to numeric\r\n // If the value is a Fraction, convert it to a number\r\n if (values instanceof Fraction) {\r\n return this.#evaluateAsNumeric(values.value)\r\n }\r\n\r\n // If the value is a NthRoot, return undefined\r\n if (values instanceof NthRoot) {\r\n return new Fraction().invalid()\r\n }\r\n\r\n // If the value is a number, return the numeric value\r\n if (typeof values === 'number') {\r\n return this.#evaluateAsNumeric(values)\r\n }\r\n\r\n // If the value is an object, return the numeric value\r\n if (typeof values === 'object') {\r\n // Convert {[key:string]:Fraction} to {[key:string]:number}\r\n const tmpValues: literalType<number> = {}\r\n for (const L in values) {\r\n tmpValues[L] = new Fraction(values[L]).value\r\n }\r\n\r\n return this.#evaluateAsNumeric(tmpValues)\r\n }\r\n }\r\n\r\n // The answer must be a Fraction\r\n const r = this.coefficient.clone()\r\n\r\n if (typeof values === 'number' || values instanceof Fraction) {\r\n const tmpValues: literalType<Fraction> = {}\r\n tmpValues[this.variables[0]] = new Fraction(values)\r\n return this.evaluate(tmpValues)\r\n }\r\n\r\n if (values instanceof NthRoot) {\r\n return new Fraction().invalid()\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if (this.variables.length === 0) {\r\n return this.coefficient\r\n }\r\n\r\n for (const L in this.#literal) {\r\n const value = new Fraction(values[L])\r\n\r\n r.multiply(value.pow(this.#literal[L]))\r\n }\r\n }\r\n\r\n return r\r\n }\r\n\r\n // -------------------------------------\r\n /**\r\n * Determine if a monom contains a setLetter in it's literal part\r\n * @param letter\r\n */\r\n public hasVariable = (letter?: string): boolean => {\r\n // The letter was not found\r\n return Object.hasOwn(this.#literal, letter ?? 'x')\r\n }\r\n\r\n public integrate(a: InputValue<Fraction>, b: InputValue<Fraction>, letter?: string ): Fraction {\r\n const primitive = this.primitive(letter)\r\n\r\n return (primitive.evaluate(b) as Fraction)\r\n .subtract(primitive.evaluate(a) as Fraction)\r\n }\r\n\r\n public inverse = (): this => {\r\n this.#coefficient.opposite()\r\n for (const letter in this.#literal) {\r\n this.#literal[letter].opposite()\r\n }\r\n return this\r\n }\r\n\r\n public isDivisible = (div: Monom): boolean => {\r\n // For all variables (letters), the current monom must have a degree higher than the divider\r\n if (div.degree().isStrictlyPositive()) {\r\n for (const letter of div.variables) {\r\n if (!this.degree(letter).isGeq(div.degree(letter))) {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n // If the coefficient is rational, we suppose we don't need to check the division by the coefficient.\r\n if (this.coefficient.isRational() || div.coefficient.isRational()) {\r\n return true\r\n }\r\n\r\n return this.coefficient.clone().divide(div.coefficient).isRelative()\r\n }\r\n\r\n /**\r\n * Determine if two monoms are equals\r\n * @param M\r\n */\r\n public isEqual = (M: Monom): boolean => {\r\n return this.isSameAs(M) && this.#coefficient.isEqual(M.coefficient)\r\n }\r\n\r\n public isLiteralSquare = (): boolean => {\r\n for (const letter in this.literal) {\r\n // A literal square must have a natural power\r\n if (this.literal[letter].isRational()) {\r\n return false\r\n }\r\n\r\n // The natural power must be be even\r\n if (this.literal[letter].isEven()) {\r\n return false\r\n }\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * Determine if the monom is one\r\n */\r\n public isOne = (): boolean => {\r\n return this.#coefficient.value === 1 && this.variables.length === 0\r\n }\r\n\r\n /**\r\n * Determine if two monoms are similar\r\n * @param M\r\n */\r\n public isSameAs = (M: Monom): boolean => {\r\n // Get the list of all variables from both monoms.\r\n const M1: string[] = this.variables\r\n const M2: string[] = M.variables\r\n\r\n // Get the list of all variables from both monoms.\r\n const K: string[] = M1.concat(M2.filter((item) => !M1.includes(item)))\r\n\r\n // If one of the monom is zero, it is the same than the other.\r\n if (this.isZero() || M.isZero()) {\r\n return true\r\n }\r\n\r\n // Both monoms has no literal part.\r\n if (M1.length === 0 && M2.length === 0) {\r\n return true\r\n }\r\n\r\n // Both monoms must have the same variables\r\n if (M1.length !== M2.length) {\r\n return false\r\n }\r\n\r\n // To _compare, both must be different from zero.\r\n if (!this.isZero() && !M.isZero()) {\r\n for (const key of K) {\r\n // The variable is not available in one of the monom\r\n if (!this.hasVariable(key) || !M.hasVariable(key)) {\r\n return false\r\n }\r\n\r\n // The variable does not have the same power in each monoms.\r\n if (!this.#literal[key].isEqual(M.literal[key])) {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n // All are positive check - the monoms are the sames.\r\n return true\r\n }\r\n\r\n public isSquare = (): boolean => {\r\n if (!this.coefficient.isSquare()) {\r\n return false\r\n }\r\n return this.isLiteralSquare()\r\n }\r\n\r\n /**\r\n * Determine if the monom is null\r\n */\r\n public isZero = (): boolean => {\r\n return this.#coefficient.value === 0\r\n }\r\n\r\n /**\r\n * Get the literal part of \\\\(x^{n_1}y^{n_2}\\\\) as dictionary \\\\[\\\\begin{array}{ll}x&=n_1\\\\\\\\y&=n_2\\\\end{array}\\\\]\r\n * @returns {literalType}\r\n */\r\n public get literal(): literalType<Fraction> {\r\n return this.#literal\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom. Must be a dictionary {x: Fraction, y: Fraction, ...}\r\n * @param {literalType<Fraction>} L\r\n */\r\n public set literal(L: literalType<Fraction>) {\r\n this.#literal = L\r\n }\r\n\r\n /**\r\n * Get the literal square roots of the Monom.\r\n * @returns {literalType<Fraction>}\r\n */\r\n public get literalSqrt(): literalType<Fraction> {\r\n // TODO: used in Polynom._factorize2ndDegree : remove it from here ?\r\n if (this.isLiteralSquare()) {\r\n const L: literalType<Fraction> = {}\r\n for (const key in this.#literal) {\r\n L[key] = this.#literal[key].clone().sqrt()\r\n }\r\n return L\r\n } else {\r\n return this.#literal\r\n }\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom from a string\r\n * @param inputStr String like x^2y^3\r\n */\r\n public set literalStr(inputStr: string) {\r\n // TODO : parse using ShutingYard tree !\r\n\r\n // Match all x^n\r\n for (const v of [...inputStr.matchAll(/([a-z])\\^([+-]?[0-9]+)/g)]) {\r\n // Create the default letter entry if necessary.\r\n if (!(v[1] in this.#literal)) {\r\n this.#literal[v[1]] = new Fraction().zero()\r\n }\r\n\r\n // Add the new value.\r\n // TODO: actually, it adds only numeric value\r\n this.#literal[v[1]].add(+v[2])\r\n }\r\n\r\n // Match all x\r\n for (const v of [...inputStr.matchAll(/([a-z](?!\\^))/g)]) {\r\n // Match all single letters\r\n if (!(v[1] in this.#literal)) {\r\n this.#literal[v[1]] = new Fraction().zero()\r\n }\r\n\r\n // Add one to the value.\r\n this.#literal[v[1]].add(1)\r\n }\r\n }\r\n\r\n /**\r\n * Multiple multiple monoms to the current monom\r\n * @param M (Monom[]) The monoms to multiply to.\r\n */\r\n public multiply = (...M: InputAlgebra<Fraction>[]): this => {\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n // Multiply the coefficient.\r\n this.#coefficient.multiply(mAsMonom.coefficient)\r\n\r\n // Multiply the literal parts.\r\n for (const letter in mAsMonom.literal) {\r\n if (!this.hasVariable(letter)) {\r\n this.#literal[letter] = mAsMonom.literal[letter].clone()\r\n } else {\r\n this.#literal[letter].add(mAsMonom.literal[letter])\r\n }\r\n }\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Create a one value monom\r\n */\r\n public one = (): this => {\r\n this.#coefficient = new Fraction().one()\r\n this.#literal = {}\r\n return this\r\n }\r\n\r\n /**\r\n * Get the opposite\r\n * Returns a monom.\r\n */\r\n public opposite = (): this => {\r\n this.#coefficient.opposite()\r\n return this\r\n }\r\n\r\n public get plotFunction(): string {\r\n let L = ''\r\n const letters = Object.keys(this.#literal).sort()\r\n\r\n for (const letter of letters) {\r\n if (this.#literal[letter].isNotZero()) {\r\n L += (L === '' ? \"\" : \"*\") + letter\r\n if (this.#literal[letter].isNotEqual(1)) {\r\n L += `^(${this.#literal[letter].display})`\r\n }\r\n }\r\n }\r\n\r\n // No literal part\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this.#coefficient.value != 0) {\r\n return this.#coefficient.display\r\n } else {\r\n return ''\r\n }\r\n } else {\r\n if (this.#coefficient.value === 1) {\r\n return L\r\n } else if (this.#coefficient.value === -1) {\r\n return `-${L}`\r\n } else if (this.#coefficient.value === 0) {\r\n return '0'\r\n } else {\r\n return `${this.#coefficient.display}*${L}`\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the pow of a monom.\r\n * @param nb (number) : Mathematical pow\r\n */\r\n public pow = (nb: number | Fraction): this => {\r\n this.#coefficient.pow(nb)\r\n for (const letter in this.#literal) {\r\n this.#literal[letter].multiply(nb)\r\n }\r\n return this\r\n }\r\n\r\n public primitive = (letter?: string): Monom => {\r\n // TODO: derivative including the ln value => implies creating different monom system ?\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n // Zero monom\r\n const M = this.clone()\r\n let degree: Fraction\r\n\r\n if (M.hasVariable(letter)) {\r\n degree = M.degree(letter).clone().add(1)\r\n M.coefficient = M.coefficient.clone().divide(degree)\r\n M.setLetter(letter, degree)\r\n } else {\r\n // There is no letter.\r\n\r\n // The coefficient might be zero (=> x) or a number a (=> ax)\r\n if (M.coefficient.isZero()) {\r\n M.coefficient = new Fraction().one()\r\n }\r\n M.setLetter(letter, 1)\r\n }\r\n\r\n return M\r\n }\r\n\r\n public reduce = (): this => {\r\n // Reduce the coefficient\r\n this.coefficient.reduce()\r\n\r\n // Reduce the literal parts (removing null powers)\r\n for (const letter in this.#literal) {\r\n if (this.#literal[letter].isZero()) {\r\n this.removeVariable(letter)\r\n }\r\n }\r\n return this\r\n }\r\n\r\n public removeVariable(letter: string) {\r\n /* eslint-disable */\r\n delete this.#literal[letter]\r\n /* eslint-enable */\r\n }\r\n\r\n /**\r\n * Get the nth-root of the monom\r\n */\r\n public root = (): this => {\r\n throw new Error('Method not implemented.')\r\n }\r\n\r\n /**\r\n * Set the power of a particular setLetter\r\n * @param letter (string) Letter to change\r\n * @param pow (number) Power of the setLetter (must be positive integer.\r\n */\r\n public setLetter = (letter: string, pow: InputValue<Fraction>): this => {\r\n if (!(pow instanceof Fraction)) {\r\n return this.setLetter(letter, new Fraction(pow))\r\n }\r\n\r\n // Set the power of the letter to zero => remove it\r\n if (this.hasVariable(letter) && pow.isZero()) {\r\n this.removeVariable(letter)\r\n }\r\n\r\n\r\n this.#literal[letter] = pow.clone()\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Return the square root of a monom\r\n */\r\n public sqrt = (): this => {\r\n if (this.isSquare()) {\r\n this.#coefficient.sqrt()\r\n for (const letter in this.#literal) {\r\n this.#literal[letter].clone().divide(2)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Subtract multiple monoms\r\n * @param M (Monom[]) The monoms to subtract\r\n */\r\n public subtract = (...M: InputAlgebra<Fraction>[]): this => {\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n if (this.isSameAs(mAsMonom)) {\r\n if (this.isZero()) {\r\n this.#cloneLiteral(mAsMonom)\r\n }\r\n\r\n this.#coefficient.add(mAsMonom.clone().coefficient.opposite())\r\n } else {\r\n console.log('Subtract: Is not similar: ', mAsMonom.display)\r\n }\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Get the tex output of the monom\r\n */\r\n public get tex(): string {\r\n // TODO: display with square root !\r\n // TODO: Refactor to make it more readable\r\n let L = ''\r\n const letters = Object.keys(this.#literal).sort()\r\n\r\n for (const letter of letters) {\r\n if (this.#literal[letter].isNotZero()) {\r\n L += letter\r\n if (this.#literal[letter].isNotEqual(1)) {\r\n L += `^{ ${this.#literal[letter].tfrac.tex } }`\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this.#coefficient.value != 0) {\r\n return this.#coefficient.frac.tex\r\n } else {\r\n return '0'\r\n }\r\n } else {\r\n if (this.#coefficient.value === 1) {\r\n return L\r\n } else if (this.#coefficient.value === -1) {\r\n return `-${L}`\r\n } else if (this.#coefficient.value === 0) {\r\n return '0'\r\n } else {\r\n return `${this.#coefficient.frac.tex}${L}`\r\n }\r\n }\r\n }\r\n\r\n // Getter helpers.\r\n /**\r\n * Get the variables letters\r\n */\r\n public get variables(): string[] {\r\n // const M = this.clone().clean()\r\n\r\n const L: string[] = []\r\n Object.entries(this.literal).forEach(\r\n ([key, value]) => {\r\n if (!value.isZero()) {\r\n L.push(key)\r\n }\r\n })\r\n L.sort()\r\n return L\r\n // return Object.keys(M.literal)\r\n }\r\n\r\n /**\r\n * Create a zero value monom\r\n */\r\n public zero = (): this => {\r\n this.#coefficient = new Fraction().zero()\r\n this.#literal = {}\r\n return this\r\n }\r\n\r\n #cloneLiteral(inputStr: Monom) {\r\n for (const k in inputStr.literal) {\r\n this.#literal[k] = inputStr.literal[k].clone()\r\n }\r\n }\r\n\r\n #evaluateAsNumeric = (values: literalType<number | Fraction> | InputValue<Fraction>): number => {\r\n let r = this.coefficient.value\r\n\r\n if (typeof values === \"number\") {\r\n const tmpValues: literalType<number> = {}\r\n const key = this.variables[0]\r\n tmpValues[key] = values\r\n\r\n return this.#evaluateAsNumeric(tmpValues)\r\n }\r\n\r\n if (values instanceof Fraction) {\r\n const tmpValues: literalType<number> = {}\r\n tmpValues[this.variables[0]] = new Fraction(values).value\r\n return this.#evaluateAsNumeric(tmpValues)\r\n }\r\n\r\n if (values instanceof NthRoot) {\r\n return NaN\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if (this.variables.length === 0) {\r\n return this.coefficient.value\r\n }\r\n\r\n for (const L in this.#literal) {\r\n const v = values[L]\r\n\r\n if (v instanceof Fraction) {\r\n r *= v.value ** (this.#literal[L].value)\r\n } else {\r\n r *= v ** (this.#literal[L].value)\r\n }\r\n }\r\n }\r\n\r\n return r\r\n }\r\n\r\n private _getLiteralDividers(arr: literalType<Fraction>[], letter: string): literalType<Fraction>[] {\r\n const tmpList: Record<string, Fraction>[] = []\r\n\r\n // Be default, this.literal[letter] should be a rational number.\r\n for (let d = 0; d <= this.literal[letter].value; d++) {\r\n if (arr.length === 0) {\r\n const litt: literalType<Fraction> = {}\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n } else {\r\n for (const item of arr) {\r\n const litt: literalType<Fraction> = {}\r\n for (const currentLetter in item) {\r\n litt[currentLetter] = item[currentLetter]\r\n }\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n }\r\n }\r\n }\r\n return tmpList\r\n }\r\n\r\n #shutingYardToReducedMonom = (inputStr: string): this => {\r\n // Get the RPN array of the current expression\r\n const SY: ShutingYard = new ShutingYard().parse(inputStr)\r\n const rpn: { token: string, tokenType: ShutingyardType }[] = SY.rpn\r\n\r\n const stack: Monom[] = []\r\n\r\n if (rpn.length === 0) {\r\n this.zero()\r\n return this\r\n } else if (rpn.length === 1) {\r\n const element = rpn[0]\r\n\r\n this.one()\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n this.coefficient = new Fraction(element.token)\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n this.setLetter(element.token, 1)\r\n }\r\n return this\r\n } else {\r\n // Reset the monom\r\n for (const element of rpn) {\r\n this.#shutingYard_AddToken(stack, element)\r\n }\r\n }\r\n\r\n this.one()\r\n this.multiply(stack[0])\r\n return this\r\n }\r\n\r\n #shutingYard_AddToken = (stack: Monom[], element: Token): void => {\r\n let q1: Monom, q2: Monom, m: Monom, letter: string, pow: Fraction\r\n\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n stack.push(new Monom(new Fraction(element.token)))\r\n\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n const M = new Monom().one()\r\n M.setLetter(element.token, 1)\r\n stack.push(M.clone())\r\n\r\n } else if (element.tokenType === ShutingyardType.OPERATION) {\r\n switch (element.token) {\r\n case '-':\r\n // this should only happen for negative powers or for negative coefficient.\r\n q2 = (stack.pop()) ?? new Monom().zero()\r\n q1 = (stack.pop()) ?? new Monom().zero()\r\n\r\n stack.push(q1.subtract(q2))\r\n\r\n break\r\n case '*':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) ?? new Monom().one()\r\n q1 = (stack.pop()) ?? new Monom().one()\r\n\r\n stack.push(q1.multiply(q2))\r\n break\r\n case '/':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) ?? new Monom().one()\r\n q1 = (stack.pop()) ?? new Monom().one()\r\n\r\n stack.push(q1.divide(q2))\r\n break\r\n case '^': {\r\n // get the two last elements in the stack\r\n const poppedCoefficient = stack.pop()?.coefficient\r\n pow = poppedCoefficient ?? new Fraction().one()\r\n m = stack.pop() ?? new Monom().one()\r\n\r\n letter = m.variables[0]\r\n\r\n if (letter) {\r\n m.setLetter(letter, pow)\r\n }\r\n\r\n stack.push(m)\r\n // this.multiply(m.clone())\r\n break\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","export function wrapParenthesis(str: string, tex = true): string {\r\n return tex ? `\\\\left( ${str} \\\\right)` : `(${str})`\r\n}\r\n\r\nexport function wrapVert(str: string, tex = true): string {\r\n return tex ? `\\\\left\\\\vert ${str} \\\\right\\\\vert` : `|${str}|`\r\n}\r\n\r\nexport function wrapNorm(str: string, tex = true): string {\r\n return tex ? `\\\\left\\\\Vect ${str} \\\\right\\\\Vect` : `||${str}||`\r\n}\r\n\r\nexport function replace_in_array<T>(haystack: string[], search: string, target: string, start?: number, end?: number): T {\r\n return haystack.map((x, index) => {\r\n if (start !== undefined && index < start) {\r\n return x\r\n }\r\n if (end !== undefined && index > end) {\r\n return x\r\n }\r\n return x === search ? target : x\r\n }) as T\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.*\r\n */\r\nimport {ShutingYard, ShutingyardType, type Token} from \"piexpression\"\r\nimport type {\r\n IAlgebra,\r\n IAnalyse,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType,\r\n TABLE_OF_SIGNS,\r\n TABLE_OF_SIGNS_VALUES\r\n} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Numeric} from '../numeric'\r\nimport {EquationSolver} from './equationSolver'\r\nimport {Monom} from './monom'\r\nimport {replace_in_array} from \"../helpers\"\r\n\r\n\r\nexport type PolynomParsingType = InputValue<Polynom> | Monom\r\n\r\nexport interface IEuclidean {\r\n quotient: Polynom,\r\n reminder: Polynom\r\n}\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n * ```\r\n * let P = new Polynom('3x-4')\r\n * ```\r\n */\r\nexport class Polynom implements IPiMathObject<Polynom>,\r\n IExpression<Polynom>,\r\n IAnalyse<Polynom>,\r\n IAlgebra<Polynom> {\r\n\r\n #factors: Polynom[]\r\n #monoms: Monom[]\r\n #roots: ISolution[]\r\n #rootsCache = false\r\n\r\n constructor(value: InputValue<Fraction>)\r\n constructor(value: string)\r\n constructor(value: Monom)\r\n constructor(value: Polynom)\r\n constructor(...values: InputValue<Fraction>[])\r\n constructor(...values: InputAlgebra<Polynom>[])\r\n constructor(polynomString?: InputAlgebra<Polynom>, ...values: InputAlgebra<Fraction>[]) {\r\n this.#monoms = []\r\n this.#factors = []\r\n this.#roots = []\r\n\r\n if (polynomString !== undefined) {\r\n this.parse(polynomString, ...values)\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Parse a string to a polynom.\r\n * @param inputStr\r\n * @param values\r\n */\r\n public parse = (inputStr: PolynomParsingType, ...values: InputAlgebra<Monom>[]): this => {\r\n // Reset the main variables.\r\n this.#monoms = []\r\n this.#factors = []\r\n\r\n if (typeof inputStr === 'string') {\r\n return this.#parseString(inputStr, ...values)\r\n } else if (\r\n (typeof inputStr === 'number' || inputStr instanceof Fraction || inputStr instanceof Monom)\r\n && (values.length === 0)\r\n ) {\r\n this.#monoms.push(new Monom(inputStr as Monom))\r\n } else if (inputStr instanceof Monom && values.length > 0) {\r\n this.#monoms.push(new Monom(inputStr))\r\n values.forEach(m => {\r\n this.#monoms.push(new Monom(m as Monom))\r\n })\r\n } else if (inputStr instanceof Polynom) {\r\n for (const m of inputStr.monoms) {\r\n this.#monoms.push(m.clone())\r\n }\r\n }\r\n\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Clone the polynom\r\n */\r\n public clone = (): Polynom => {\r\n const P = new Polynom()\r\n const M: Monom[] = []\r\n\r\n for (const m of this.#monoms) {\r\n M.push(m.clone())\r\n }\r\n\r\n\r\n P.monoms = M\r\n\r\n return P\r\n }\r\n\r\n public get tex(): string {\r\n return this.#genDisplay('tex')\r\n }\r\n\r\n public get display(): string {\r\n return this.#genDisplay()\r\n }\r\n\r\n public add = (...values: InputAlgebra<Polynom>[]): Polynom => {\r\n\r\n for (const value of values) {\r\n if (value instanceof Polynom) {\r\n this.#monoms = this.#monoms.concat(value.monoms)\r\n } else if (value instanceof Monom) {\r\n this.#monoms.push(value.clone())\r\n } else if (typeof value === \"number\" && Number.isSafeInteger(value)) {\r\n this.#monoms.push(new Monom(value.toString()))\r\n } else {\r\n this.#monoms.push(new Monom(value))\r\n }\r\n }\r\n\r\n\r\n return this.reduce()\r\n }\r\n\r\n public commonMonom = (): Monom => {\r\n const M = new Monom().one()\r\n const numerator: number = this.gcdNumerator()\r\n const denominator: number = this.gcdDenominator()\r\n const degree = this.degree()\r\n\r\n M.coefficient = new Fraction(numerator, denominator)\r\n for (const L of this.variables) {\r\n // Initialize the setLetter with the max degree\r\n M.setLetter(L, degree)\r\n for (const m of this.#monoms) {\r\n M.setLetter(L, Fraction.min(m.degree(L), M.degree(L)))\r\n if (M.degree(L).isZero()) {\r\n break\r\n }\r\n\r\n }\r\n }\r\n return M\r\n }\r\n\r\n public degree = (letter?: string): Fraction => {\r\n let d: Fraction = new Fraction().zero()\r\n for (const m of this.#monoms) {\r\n d = Fraction.max(m.degree(letter).value, d)\r\n }\r\n\r\n return d\r\n }\r\n\r\n public derivative = (letter?: string): Polynom => {\r\n const dP = new Polynom()\r\n\r\n for (const m of this.#monoms) {\r\n dP.add(m.derivative(letter))\r\n }\r\n\r\n return dP.reduce()\r\n }\r\n\r\n public divide = (value: InputAlgebra<Polynom>): Polynom => {\r\n\r\n if (value instanceof Fraction) {\r\n return this.#divideByFraction(value)\r\n } else if (typeof value === 'number' && Number.isSafeInteger(value)) {\r\n return this.#divideByInteger(value)\r\n } else if (value instanceof Monom) {\r\n return this.divide(new Polynom(value))\r\n } else if (value instanceof Polynom) {\r\n if (value.monoms.length === 1 && value.variables.length === 0) {\r\n return this.#divideByFraction(value.monoms[0].coefficient)\r\n } else {\r\n const {quotient, reminder} = this.euclidean(value)\r\n if (reminder.isZero()) {\r\n this.#monoms = quotient.monoms\r\n return this\r\n }\r\n }\r\n } else if (typeof value === 'string') {\r\n return this.divide(new Polynom(value))\r\n }\r\n\r\n throw new Error(`Cannot divide by ${value as unknown as string}`)\r\n }\r\n\r\n public empty = (): this => {\r\n this.#monoms = []\r\n return this\r\n }\r\n\r\n /**\r\n * Divide the current polynom by another polynom.\r\n * @param P\r\n * returns {quotient: Polynom, reminder: Polynom}\r\n */\r\n public euclidean = (P: Polynom): IEuclidean => {\r\n const letter: string = P.variables[0]\r\n const quotient: Polynom = new Polynom().zero()\r\n const reminder: Polynom = this.clone().reorder(letter)\r\n\r\n // There is no variable - means it's a number\r\n if (P.variables.length === 0) {\r\n const q = this.clone().divide(P)\r\n\r\n return {\r\n quotient: q.reduce(),\r\n reminder: new Polynom().zero()\r\n }\r\n }\r\n\r\n // Get at least a letter\r\n const maxMP: Monom = P.monomByDegree(undefined, letter)\r\n const degreeP: Fraction = P.degree(letter)\r\n\r\n let newM: Monom\r\n\r\n // Make the Euclidean division of the two polynoms.\r\n let MaxIteration = this.degree(letter).value * 2\r\n while (reminder.degree(letter).isGeq(degreeP) && MaxIteration > 0) {\r\n MaxIteration--\r\n\r\n // Get the greatest monom divided by the max monom of the divider\r\n newM = reminder.monomByDegree(undefined, letter).clone().divide(maxMP)\r\n\r\n if (newM.isZero()) {\r\n continue\r\n }\r\n\r\n // Get the new quotient and reminder.\r\n quotient.add(newM)\r\n reminder.subtract(P.clone().multiply(newM)).reduce()\r\n\r\n // Check if the reminder is zero.\r\n if (newM.degree(letter).isZero()) {\r\n break\r\n }\r\n }\r\n\r\n quotient.reduce()\r\n reminder.reduce()\r\n return {quotient, reminder}\r\n }\r\n\r\n public evaluate = (values: literalType<Fraction | number> | InputValue<Fraction>, asNumeric?: boolean): Fraction | number => {\r\n // Return the numeric value, without using Fraction\r\n if (asNumeric) {\r\n return this.#evaluateAsNumeric(values)\r\n }\r\n\r\n // Build the evaluated fraction\r\n const r = new Fraction().zero()\r\n this.#monoms.forEach(monom => {\r\n //console.log('Evaluate polynom: ', monom.display, values, monom.evaluate(values).display);\r\n r.add(monom.evaluate(values, asNumeric))\r\n })\r\n\r\n return r\r\n }\r\n\r\n // -------------------------------------\r\n /**\r\n * Factorize a polynom and store the best results in factors.\r\n * @param letter\r\n */\r\n public factorize = (letter?: string): Polynom[] => {\r\n let factors: Polynom[] = []\r\n let P = this.clone().reorder()\r\n\r\n // Extract the common monom\r\n // 2x^3+6x^2 => 2x^2\r\n const M = P.commonMonom()\r\n // If the polynom starts with a negative monom, factorize it.\r\n if (P.monomByDegree().coefficient.isStrictlyNegative() && M.coefficient.isStrictlyPositive() && !M.isOne()) {\r\n M.opposite()\r\n }\r\n\r\n\r\n if (!M.isOne()) {\r\n const tempPolynom: Polynom = new Polynom(M)\r\n factors = [tempPolynom.clone()]\r\n P = P.euclidean(tempPolynom).quotient\r\n }\r\n\r\n // Main loop\r\n let securityLoop = P.degree().clone().multiply(2).value,\r\n maxDegree = 1\r\n while (securityLoop >= 0) {\r\n securityLoop--\r\n if (P.monoms.length < 2) {\r\n // The polynom has only one monom => 7x^2\r\n // No need to continue.\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n P.one()\r\n }\r\n break\r\n } else if (P.degree(letter).isOne()) {\r\n // The polynom is a first degree polynom => 3x-5\r\n // No need to continue\r\n factors.push(P.clone())\r\n P.one()\r\n break\r\n } else {\r\n // Create the list of all \"potential\" polynom dividers.\r\n let allDividers: Polynom[] = this.#getAllPotentialFactors(P, maxDegree, letter ?? 'x')\r\n maxDegree = P.degree(letter).value\r\n\r\n // Actually: 100ms\r\n while (allDividers.length > 0) {\r\n const div = allDividers[0]\r\n\r\n if (!P.isDividableBy(div))\r\n // Not dividable. Remove it from the list\r\n {\r\n allDividers.shift()\r\n } else {\r\n // It's dividable - so make the division\r\n const result = P.euclidean(div)\r\n\r\n // Add the factor\r\n factors.push(div)\r\n\r\n // As it's dividable, get the quotient.\r\n P = result.quotient.clone()\r\n\r\n // filter all dividers that are no more suitable.\r\n allDividers = allDividers.filter(x => {\r\n const pX = P.monoms[0],\r\n pC = P.monoms[P.monoms.length - 1],\r\n dX = x.monoms[0],\r\n dC = x.monoms[x.monoms.length - 1]\r\n\r\n // Check last item (degree zero)\r\n if (!pC.isDivisible(dC)) {\r\n return false\r\n }\r\n\r\n // Check the first item (degree max)\r\n return pX.isDivisible(dX)\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Maybe there is still something in the Polynom (not everything was possible to factorize)\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n }\r\n\r\n\r\n // Save the factors\r\n this.#factors = factors\r\n\r\n return this.#factors\r\n }\r\n\r\n public fromCoefficients(...values: InputValue<Fraction>[]) {\r\n this.#monoms = []\r\n const letter = 'x'\r\n values.reverse().forEach((coeff, index) => {\r\n const monom = new Monom()\r\n monom.coefficient = new Fraction(coeff)\r\n monom.setLetter(letter, index)\r\n\r\n this.#monoms.push(monom)\r\n })\r\n\r\n return this\r\n }\r\n\r\n public gcdDenominator = (): number => {\r\n return Numeric.gcd(...this.getDenominators())\r\n }\r\n\r\n public gcdNumerator = (): number => {\r\n return Numeric.gcd(...this.getNumerators())\r\n }\r\n\r\n public getCoefficients(): Fraction[] {\r\n // Assume there is only one letter.\r\n const orderedPolynom = this.clone().reorder()\r\n\r\n const length = this.degree().value + 1\r\n const coeffs = new Array(length).fill(new Fraction(0))\r\n\r\n orderedPolynom.monoms.forEach(monom => {\r\n const index = length - monom.degree().value - 1\r\n coeffs[index] = monom.coefficient.clone()\r\n })\r\n\r\n // return orderedPolynom.monoms.map(x=>x.coefficient)\r\n return coeffs\r\n }\r\n\r\n // Next functions are used for for commonMonom, which is used in the factorize method.\r\n public getDenominators = (): number[] => {\r\n const denominators: number[] = []\r\n for (const m of this.#monoms) {\r\n denominators.push(m.coefficient.denominator)\r\n }\r\n\r\n return denominators\r\n }\r\n\r\n public getNumerators = (): number[] => {\r\n const numerators: number[] = []\r\n for (const m of this.#monoms) {\r\n numerators.push(m.coefficient.numerator)\r\n }\r\n\r\n return numerators\r\n }\r\n\r\n public getZeroes = (): ISolution[] => {\r\n if (this.degree().isZero()) {\r\n return []\r\n }\r\n\r\n this.roots = new EquationSolver(this.clone()).solve()\r\n return this.roots\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.variables.includes(letter)\r\n }\r\n\r\n public integrate = (a: InputValue<Fraction>, b: InputValue<Fraction>, letter = 'x'): Fraction => {\r\n const primitive = this.primitive(letter)\r\n\r\n const valuesA: literalType<Fraction> = {},\r\n valuesB: literalType<Fraction> = {}\r\n\r\n valuesA[letter] = new Fraction(a)\r\n valuesB[letter] = new Fraction(b)\r\n\r\n return (primitive.evaluate(valuesB) as Fraction).subtract(primitive.evaluate(valuesA))\r\n }\r\n\r\n public inverse(): Polynom | undefined {\r\n return undefined\r\n }\r\n\r\n public isDeveloped = (polynomString: string): boolean => {\r\n let P: Polynom\r\n\r\n // Start by removing the parenthesis after a \"power\"\r\n const pString = polynomString.replaceAll(/\\^\\(([-0-9/]+)\\)/g, '$1')\r\n\r\n // There is at least one parenthesis - it is not developed.\r\n if (pString.includes('(') || pString.includes(')')) {\r\n return false\r\n }\r\n\r\n\r\n // Try to build the polynom\r\n try {\r\n // Build the polynom\r\n P = new Polynom(polynomString)\r\n } catch (e) {\r\n return false\r\n }\r\n\r\n // Both polynom aren't the same (once developed and reduced => they cannot be equivalent)\r\n if (!this.isEqual(P)) {\r\n return false\r\n }\r\n\r\n\r\n // Check that everything is completely developed. Actually, there are no parentheses... so it is fully developed\r\n return true\r\n }\r\n\r\n public isDividableBy = (div: Polynom): boolean => {\r\n // Quick evaluation.\r\n if (div.degree().isOne()) {\r\n const zero = div.getZeroes()[0]\r\n\r\n if (zero.exact instanceof Fraction) {\r\n return (this.evaluate(zero.exact) as Fraction).isZero()\r\n } else {\r\n return false\r\n }\r\n\r\n } else {\r\n const {reminder} = this.euclidean(div)\r\n return reminder.isZero()\r\n }\r\n }\r\n\r\n public isEqual = (P: Polynom): boolean => {\r\n return this.#compare(P, '=')\r\n }\r\n\r\n public get isMultiVariable(): boolean {\r\n // Determine if a monom has more than one variable.\r\n return this.#monoms.some(m => m.variables.length > 1)\r\n }\r\n\r\n public isOne(): boolean {\r\n return this.#monoms.length === 1 && this.#monoms[0].coefficient.isOne() && this.degree().isZero()\r\n }\r\n\r\n public isOppositeAt = (P: Polynom): boolean => {\r\n return this.#compare(P.clone().opposite(), '=')\r\n }\r\n\r\n public isReduced = (polynomString: string): boolean => {\r\n // The polynom must be developed to be reduced.\r\n if (!this.isDeveloped(polynomString)) {\r\n return false\r\n }\r\n\r\n\r\n const P = new Polynom(polynomString)\r\n if (P.monoms.length > this.monoms.length) {\r\n return false\r\n }\r\n\r\n\r\n // TODO: Not sure the reduced system checking is working properly !\r\n for (const m of P.monoms) {\r\n if (!m.coefficient.isReduced()) {\r\n return false\r\n }\r\n }\r\n\r\n\r\n return false\r\n }\r\n\r\n public isSameAs = (P: Polynom): boolean => {\r\n return this.#compare(P, 'same')\r\n }\r\n\r\n public isZero(): boolean {\r\n return (this.#monoms.length === 1 && this.#monoms[0].coefficient.isZero()) || this.#monoms.length === 0\r\n }\r\n\r\n public lcmDenominator = (): number => {\r\n return Numeric.lcm(...this.getDenominators())\r\n }\r\n\r\n public lcmNumerator = (): number => {\r\n return Numeric.lcm(...this.getNumerators())\r\n }\r\n\r\n public get length() {\r\n return this.#monoms.length\r\n }\r\n\r\n public letters = (): string[] => {\r\n let S = new Set<string>()\r\n\r\n for (const m of this.#monoms) {\r\n S = new Set([...S, ...m.variables])\r\n }\r\n\r\n\r\n return [...S]\r\n }\r\n\r\n public limitToInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === 1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposite()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n\r\n public limitToNegativeInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === -1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposite()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n\r\n public monomByDegree = (degree?: Fraction | number, letter?: string): Monom => {\r\n if (degree === undefined)\r\n // return the highest degree monom.\r\n {\r\n return this.monomByDegree(this.degree(letter), letter)\r\n }\r\n\r\n\r\n // Reduce the polynom.\r\n const M = this.clone().reduce()\r\n for (const m of M.#monoms) {\r\n if (m.degree(letter).isEqual(degree)) {\r\n return m.clone()\r\n }\r\n }\r\n\r\n\r\n // Nothing was found - return the null monom.\r\n return new Monom().zero()\r\n }\r\n\r\n // Used in LinearSystem.tex\r\n public monomByLetter = (letter: string): Monom => {\r\n const M = this.clone().reduce()\r\n for (const m of M.#monoms) {\r\n if (m.hasVariable(letter)) {\r\n return m.clone()\r\n }\r\n }\r\n\r\n\r\n return new Monom().zero()\r\n }\r\n\r\n // ------------------------------------------\r\n public get monoms() {\r\n return this.#monoms\r\n }\r\n\r\n public set monoms(M: Monom[]) {\r\n this.#monoms = M\r\n }\r\n\r\n public monomsByDegree = (degree?: number | Fraction, letter?: string): Monom[] => {\r\n if (degree === undefined)\r\n // return the highest degree monom.\r\n {\r\n return this.monomsByDegree(this.degree(letter))\r\n }\r\n\r\n // Reduce the polynom.\r\n const Ms: Monom[] = []\r\n\r\n const M = this.clone().reduce()\r\n for (const m of M.#monoms) {\r\n if (m.degree(letter).isEqual(degree)) {\r\n Ms.push(m.clone())\r\n }\r\n }\r\n\r\n\r\n return Ms\r\n // Nothing was found - return\r\n }\r\n\r\n public multiply = (value: unknown): Polynom => {\r\n\r\n if (value instanceof Polynom) {\r\n return this.#multiplyByPolynom(value)\r\n } else if (value instanceof Fraction) {\r\n return this.#multiplyByFraction(value)\r\n } else if (value instanceof Monom) {\r\n return this.#multiplyByMonom(value)\r\n } else if (Number.isSafeInteger(value) && typeof value === 'number') {\r\n return this.#multiplyByInteger(value)\r\n }\r\n\r\n\r\n // Something went wrong...\r\n return this\r\n }\r\n\r\n public get numberOfVars(): number {\r\n return this.variables.length\r\n }\r\n\r\n public one = (): this => {\r\n this.#monoms = []\r\n this.#monoms.push(new Monom().one())\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public opposite = (): this => {\r\n this.#monoms = this.#monoms.map(m => m.opposite())\r\n return this\r\n }\r\n\r\n public get plotFunction(): string {\r\n return this.#genDisplay('tex', false, false, true)\r\n }\r\n\r\n public pow = (nb: number): Polynom => {\r\n if (!Number.isSafeInteger(nb)) {\r\n return this.zero()\r\n }\r\n\r\n if (nb < 0) {\r\n return this.zero()\r\n }\r\n\r\n if (nb === 0) {\r\n return new Polynom()\r\n }\r\n\r\n\r\n const P = this.clone()\r\n for (let i = 1; i < nb; i++) {\r\n this.multiply(P)\r\n }\r\n\r\n return this.reduce()\r\n }\r\n\r\n public primitive = (letter?: string): Polynom => {\r\n const dP = new Polynom()\r\n\r\n for (const m of this.#monoms) {\r\n dP.add(m.primitive(letter))\r\n }\r\n\r\n return dP\r\n }\r\n\r\n public reduce = (): Polynom => {\r\n // Reduce the polynom\r\n\r\n // Group the monoms by similarity\r\n let i = 0\r\n while (i < this.#monoms.length) {\r\n for (let j = i + 1; j < this.#monoms.length; j++) {\r\n if (this.#monoms[i].isSameAs(this.#monoms[j])) {\r\n this.#monoms[i].add(this.#monoms[j])\r\n this.#monoms.splice(j, 1)\r\n if (this.#monoms[i].isZero()) {\r\n this.#monoms[i] = new Monom().zero()\r\n }\r\n\r\n j--\r\n }\r\n }\r\n\r\n\r\n i++\r\n }\r\n\r\n // Remove all null monoms\r\n this.#monoms = this.#monoms.filter((m) => {\r\n return !m.coefficient.isZero()\r\n })\r\n\r\n // Reduce all monoms coefficient.\r\n for (const m of this.#monoms) {\r\n m.coefficient.reduce()\r\n }\r\n\r\n\r\n if (this.length === 0) {\r\n return new Polynom().zero()\r\n }\r\n\r\n\r\n return this.reorder()\r\n }\r\n\r\n // ------------------------------------------\r\n\r\n public reorder = (letter = 'x', revert?: boolean): this => {\r\n if (revert === undefined) {\r\n revert = false\r\n }\r\n\r\n const otherLetters = this.variables.filter(x => x !== letter)\r\n this.#monoms.sort(function (a, b) {\r\n const da = a.degree(letter).value,\r\n db = b.degree(letter).value\r\n\r\n // Values are different\r\n if (da !== db) {\r\n return revert ? da - db : db - da\r\n }\r\n\r\n // if values are equals, check other letters - it must be reverted in that case !\r\n if (otherLetters.length > 0) {\r\n for (const L of otherLetters) {\r\n const da = a.degree(L).value,\r\n db = b.degree(L).value\r\n\r\n // Values are different\r\n if (da !== db) {\r\n return revert ? da - db : db - da\r\n }\r\n }\r\n }\r\n\r\n\r\n return 0\r\n })\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Replace a variable (letter) by a polynom.\r\n * @param letter\r\n * @param P\r\n */\r\n public replaceBy = (letter: string, P: Polynom): this => {\r\n let pow: Fraction\r\n const resultPolynom: Polynom = new Polynom().zero()\r\n\r\n for (const m of this.monoms) {\r\n if (!m.hasVariable(letter) || m.literal[letter].isZero()) {\r\n resultPolynom.add(m.clone())\r\n } else {\r\n // We have found a variable to replace.\r\n\r\n // Get the power.\r\n pow = m.literal[letter].clone()\r\n\r\n // Remove the variable from the monom\r\n m.removeVariable(letter)\r\n\r\n // Add the new monom to the result polynom\r\n resultPolynom.add(P.clone().pow(Math.abs(pow.numerator)).multiply(m))\r\n }\r\n }\r\n\r\n\r\n // Reduce the monoms\r\n this.#monoms = resultPolynom.reduce().monoms\r\n return this\r\n }\r\n\r\n public root(): Polynom {\r\n throw new Error('Cannot take the root from a polynom')\r\n }\r\n\r\n get roots(): ISolution[] {\r\n return this.#rootsCache ? this.#roots : this.getZeroes()\r\n }\r\n\r\n set roots(value: ISolution[]) {\r\n this.#rootsCache = true\r\n this.#roots = value\r\n }\r\n\r\n public sqrt(): Polynom {\r\n throw new Error('Cannot take the square root from a polynom')\r\n }\r\n\r\n public subtract = (...values: InputAlgebra<Polynom>[]): Polynom => {\r\n for (const value of values) {\r\n if (value instanceof Polynom) {\r\n this.add(value.clone().opposite())\r\n } else if (value instanceof Monom) {\r\n this.#monoms.push(value.clone().opposite())\r\n } else {\r\n this.#monoms.push(new Monom(value).opposite())\r\n }\r\n }\r\n\r\n\r\n return this.reduce()\r\n }\r\n\r\n public tableOfSigns(): TABLE_OF_SIGNS {\r\n // returns ['+-', 'd|t|z', '+-']...\r\n\r\n // global roots from eventually Polyfactor. Allows to add \"extra column\".\r\n const roots: ISolution[] = this.roots\r\n\r\n // Build the table os sign length and default values\r\n // The signs looks like: ['+', 't', '+', 't', '+', 't', '+']\r\n let signs: TABLE_OF_SIGNS_VALUES[] = new Array(2 * roots.length + 1)\r\n .fill('')\r\n .map((_x, index) => {\r\n return index % 2 === 0 ? '' : 'z'\r\n })\r\n\r\n\r\n if (signs.length === 1) {\r\n // The polynom is a constant or has not roots\r\n const [a] = this.getCoefficients().map(x => x.value)\r\n signs = replace_in_array(signs, '', a > 0 ? '+' : '-')\r\n } else if (this.degree().isOne()) {\r\n // First degree: ax+b\r\n const [a] = this.getCoefficients().map(x => x.value)\r\n\r\n // Get the index of the zero.\r\n signs[0] = a > 0 ? '-' : '+'\r\n signs[1] = 'z'\r\n signs[2] = a > 0 ? '+' : '-'\r\n } else {\r\n const testingRoots = [\r\n roots[0].value - 1,\r\n ...roots.map((_root, index) => {\r\n return index === roots.length - 1 ?\r\n roots[index].value + 1 :\r\n (roots[index].value + roots[index + 1].value) / 2\r\n })\r\n ]\r\n\r\n testingRoots.forEach((test, index) => {\r\n const sign = this.evaluate({x: test}, true) as number\r\n signs[index * 2] = sign > 0 ? '+' : '-'\r\n })\r\n }\r\n\r\n return {roots, signs}\r\n }\r\n\r\n public get variables(): string[] {\r\n let V: string[] = []\r\n\r\n for (const m of this.#monoms) {\r\n V = V.concat(m.variables)\r\n }\r\n\r\n\r\n // Remove duplicates.\r\n V = [...new Set(V)]\r\n V.sort()\r\n return V\r\n }\r\n\r\n /**\r\n * Set the polynom to zero.\r\n * @returns {this}\r\n */\r\n public zero = (): this => {\r\n this.#monoms = []\r\n this.#monoms.push(new Monom().zero())\r\n return this\r\n }\r\n\r\n public get zeroes(): ISolution[] {\r\n return this.getZeroes()\r\n }\r\n\r\n #compare = (P: Polynom, sign?: string): boolean => {\r\n if (sign === undefined) {\r\n sign = '='\r\n }\r\n\r\n // Create clone version to reduce them without altering the original polynoms.\r\n const cP1 = this.clone().reduce().reorder()\r\n const cP2 = P.clone().reduce().reorder()\r\n\r\n switch (sign) {\r\n case '=':\r\n // They must have the isSame length and the isSame degree\r\n if (cP1.length !== cP2.length || !cP1.degree().isEqual(cP2.degree())) {\r\n return false\r\n }\r\n\r\n // Check if the coefficients are the isSame.\r\n return cP1.monoms\r\n .every((m1, index) => m1.isEqual(cP2.monoms[index]))\r\n\r\n case 'same':\r\n // They must have the same length and the same degree\r\n if (cP1.length !== cP2.length || !cP1.degree().isEqual(cP2.degree())) {\r\n return false\r\n }\r\n\r\n return cP1.monoms\r\n .every((m1, index) => m1.isSameAs(cP2.monoms[index]))\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n\r\n #divideByFraction = (F: Fraction): this => {\r\n for (const m of this.#monoms) {\r\n m.coefficient.divide(F)\r\n }\r\n\r\n return this\r\n }\r\n\r\n #divideByInteger = (nb: number): this => {\r\n const nbF = new Fraction(nb)\r\n for (const m of this.#monoms) {\r\n m.coefficient.divide(nbF)\r\n }\r\n\r\n return this\r\n }\r\n\r\n #evaluateAsNumeric = (values: literalType<number | Fraction> | InputValue<Fraction>): number => {\r\n let r = 0\r\n this.#monoms.forEach(monom => {\r\n r += monom.evaluate(values, true) as number\r\n })\r\n\r\n return r\r\n }\r\n\r\n #factorize2ndDegree = (letter: string): Polynom[] => {\r\n let P1: Polynom, P2: Polynom,\r\n a, b, c, delta, x1, x2, factor\r\n\r\n // One variable only\r\n if (this.numberOfVars === 1) {\r\n a = this.monomByDegree(2, letter).coefficient\r\n b = this.monomByDegree(1, letter).coefficient\r\n c = this.monomByDegree(0, letter).coefficient\r\n delta = b.clone().pow(2).subtract(a.clone().multiply(c).multiply(4))\r\n\r\n if (delta.isZero()) {\r\n x1 = b.clone().opposite().divide(a.clone().multiply(2))\r\n P1 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n P2 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n factor = a.divide(x1.denominator).divide(x1.denominator)\r\n\r\n if (!factor.isOne()) {\r\n return [new Polynom(factor.display), P1, P2]\r\n } else {\r\n return [P1, P2]\r\n }\r\n\r\n } else if (delta.isPositive() && delta.isSquare()) {\r\n x1 = b.clone().opposite()\r\n .add(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n x2 = b.clone().opposite()\r\n .subtract(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n\r\n // (2x+5)(3x-2)\r\n // 6x^2+11x-10\r\n // a = 6, b = 11, c = -10\r\n // delta = 121-4*6*(-10) = 361= 19^2\r\n // x1 = (-11 + 19) / 12 = 8/12 = 2/3\r\n // x2 = (-11 - 19) / 12 = -30/12 = -5/2\r\n factor = a.divide(x1.denominator).divide(x2.denominator)\r\n if (factor.isOne()) {\r\n return [\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n } else {\r\n return [\r\n new Polynom(factor.display),\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n }\r\n\r\n\r\n } else\r\n // No solution possible - return the complete value.\r\n {\r\n return [this.clone()]\r\n }\r\n\r\n } else {\r\n // If multiple variables, only handle perfect squares...\r\n a = this.monomByDegree(2, letter)\r\n b = this.monomByDegree(1, letter)\r\n c = this.monomByDegree(0, letter)\r\n\r\n if (a.isLiteralSquare() && c.isLiteralSquare())\r\n // Check the middle item is same as...\r\n\r\n\r\n {\r\n if (b.clone().pow(2).isSameAs(a.clone().multiply(c))) {\r\n // Determine if the coefficient values matches.\r\n\r\n // Search 4 values (r, s, t, u) that matches:\r\n // (r X + s Y)(t X + u Y) = rt X^2 + (ru + st) XY + su Y^2\r\n\r\n const xPolynom = new Polynom('x', a.coefficient, b.coefficient, c.coefficient)\r\n const xFactors = xPolynom.#factorize2ndDegree('x')\r\n\r\n const factors = []\r\n let xyzPolynom: Polynom\r\n\r\n if (xFactors.length >= 2) {\r\n for (const p of xFactors) {\r\n if (p.degree().isZero()) {\r\n factors.push(p.clone())\r\n } else {\r\n xyzPolynom = p.clone()\r\n xyzPolynom.monoms[0].literal = a.literalSqrt\r\n xyzPolynom.monoms[1].literal = c.literalSqrt\r\n factors.push(xyzPolynom.clone())\r\n }\r\n }\r\n\r\n\r\n return factors\r\n }\r\n }\r\n }\r\n\r\n\r\n return [this.clone()]\r\n }\r\n }\r\n\r\n #genDisplay = (output?: string, forceSign?: boolean, wrapParentheses?: boolean, withAllMultiplicationSign?: boolean): string => {\r\n let P = ''\r\n\r\n for (const k of this.#monoms) {\r\n if (k.coefficient.value === 0) {\r\n continue\r\n }\r\n\r\n\r\n // The monom to be displayed\r\n let m\r\n if (withAllMultiplicationSign) {\r\n m = k.plotFunction\r\n } else {\r\n m = (output === 'tex') ? k.tex : k.display\r\n }\r\n\r\n P += `${(k.coefficient.sign() === 1 && (P !== '' || forceSign === true)) ? '+' : ''}${m}`\r\n }\r\n\r\n if (wrapParentheses === true && this.length > 1) {\r\n if (output === 'tex') {\r\n P = `\\\\left( ${P} \\\\right)`\r\n } else {\r\n P = `(${P})`\r\n }\r\n }\r\n\r\n\r\n if (P === '') {\r\n P = '0'\r\n }\r\n\r\n return P\r\n }\r\n\r\n #getAllPotentialFactors = (P: Polynom, maxDegree: number, letter: string): Polynom[] => {\r\n const m1 = P.monoms[0].dividers,\r\n m2 = P.monoms[P.monoms.length - 1].dividers\r\n\r\n const allDividers: Polynom[] = []\r\n m1.forEach(m1d => {\r\n // Get only polynom that has a degree less than a specific value\r\n if (m1d.degree(letter).isLeq(maxDegree)) {\r\n m2.forEach(m2d => {\r\n if (m1d.degree(letter).isNotEqual(m2d.degree(letter))) {\r\n allDividers.push(new Polynom(m1d, m2d))\r\n allDividers.push(new Polynom(m1d, m2d.clone().opposite()))\r\n }\r\n })\r\n }\r\n\r\n\r\n })\r\n\r\n return allDividers\r\n }\r\n\r\n #multiplyByFraction = (F: Fraction): Polynom => {\r\n for (const m of this.#monoms) {\r\n m.coefficient.multiply(F)\r\n }\r\n\r\n\r\n return this.reduce()\r\n }\r\n\r\n #multiplyByInteger = (nb: number): Polynom => {\r\n return this.#multiplyByFraction(new Fraction(nb))\r\n }\r\n\r\n #multiplyByMonom = (M: Monom): Polynom => {\r\n for (const m of this.#monoms) {\r\n m.multiply(M)\r\n }\r\n\r\n return this.reduce()\r\n }\r\n\r\n #multiplyByPolynom = (P: Polynom): Polynom => {\r\n const M: Monom[] = []\r\n for (const m1 of this.#monoms) {\r\n for (const m2 of P.monoms) {\r\n M.push(Monom.xMultiply(m1, m2))\r\n }\r\n }\r\n\r\n\r\n this.#monoms = M\r\n return this.reduce()\r\n }\r\n\r\n #parseString(inputStr: string, ...values: unknown[]): this {\r\n if (values.length === 0) {\r\n inputStr = '' + inputStr\r\n\r\n // Parse the polynom using the shutting yard algorithm\r\n if (inputStr !== '' && !isNaN(Number(inputStr))) {\r\n this.empty()\r\n // It's a simple number.\r\n const m = new Monom(inputStr)\r\n // m.coefficient = new Fraction(inputStr);\r\n // m.literalStr = '';\r\n this.add(m)\r\n return this\r\n }\r\n\r\n // Parse the string.\r\n return this.#shutingYardToReducedPolynom(inputStr)\r\n } else if (/^[a-z]+/.test(inputStr)) {\r\n // We assume the inputStr contains only letters.\r\n this.empty()\r\n\r\n const fractions = values.map(x => new Fraction(x as InputValue<Fraction>))\r\n\r\n // Multiple setLetter version\r\n if (inputStr.length > 1) {\r\n const letters = inputStr.split('')\r\n\r\n if (letters.length < values.length - 2) {\r\n throw new Error('Too many factors for too few variables !')\r\n }\r\n\r\n let i = 0\r\n\r\n for (const F of fractions) {\r\n const m = new Monom()\r\n m.coefficient = F.clone()\r\n m.literalStr = letters[i] || ''\r\n this.add(m)\r\n i++\r\n }\r\n }\r\n // Single setLetter version\r\n else {\r\n let n = fractions.length - 1\r\n for (const F of fractions) {\r\n const m = new Monom()\r\n m.coefficient = F.clone()\r\n m.literalStr = `${inputStr}^${n}`\r\n this.add(m)\r\n n--\r\n }\r\n }\r\n return this\r\n } else {\r\n return this.zero()\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Main parse using a shutting yard class\r\n * @param inputStr\r\n */\r\n #shutingYardToReducedPolynom = (inputStr: string): this => {\r\n // Get the RPN array of the current expression\r\n const SY: ShutingYard = new ShutingYard().parse(inputStr)\r\n const rpn: { token: string, tokenType: ShutingyardType }[] = SY.rpn\r\n\r\n // New version for reducing shuting yard.\r\n this.zero()\r\n\r\n const stack: Polynom[] = []\r\n\r\n // Loop through the each element of the RPN\r\n for (const element of rpn) {\r\n this.#shutingYard_addToken(stack, element)\r\n }\r\n\r\n\r\n if (stack.length === 1) {\r\n this.add(stack[0])\r\n }\r\n\r\n\r\n return this.reorder()\r\n }\r\n\r\n #shutingYard_addToken = (stack: Polynom[], element: Token): void => {\r\n switch (element.tokenType) {\r\n case ShutingyardType.COEFFICIENT:\r\n stack.push(new Polynom(element.token))\r\n break\r\n\r\n case ShutingyardType.VARIABLE:\r\n stack.push(new Polynom().add(new Monom(element.token)))\r\n break\r\n\r\n case ShutingyardType.CONSTANT:\r\n // TODO: add constant support to Polynom parsing.\r\n console.log('Actually, not supported - will be added later !')\r\n break\r\n\r\n case ShutingyardType.OPERATION:\r\n if (stack.length >= 2) {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n\r\n // Check if the polynoms are not undefined.\r\n if (a === undefined || b === undefined) {\r\n break\r\n }\r\n\r\n if (element.token === '+') {\r\n stack.push(a.add(b))\r\n } else if (element.token === '-') {\r\n stack.push(a.subtract(b))\r\n } else if (element.token === '*') {\r\n stack.push(a.multiply(b))\r\n } else if (element.token === '/') {\r\n if (b.degree().isStrictlyPositive()) {\r\n console.log('divide by a polynom -> should create a rational polynom !')\r\n } else {\r\n // a.divide(b.monoms[0].coefficient)\r\n stack.push(a.divide(b.monoms[0].coefficient))\r\n }\r\n } else if (element.token === '^') {\r\n if (b.degree().isStrictlyPositive()) {\r\n throw new Error('Cannot elevate a polynom with another polynom !')\r\n } else if (b.monoms[0].coefficient.isRelative())\r\n // Integer power\r\n {\r\n stack.push(a.pow(b.monoms[0].coefficient.value))\r\n } else {\r\n // Only allow power if the previous polynom is only a monom, without coefficient.\r\n if (a.monoms.length === 1 && a.monoms[0].coefficient.isOne()) {\r\n for (const letter in a.monoms[0].literal) {\r\n a.monoms[0].literal[letter].multiply(b.monoms[0].coefficient)\r\n }\r\n\r\n stack.push(a)\r\n } else {\r\n console.error('Cannot have power with fraction')\r\n }\r\n }\r\n }\r\n\r\n } else if (element.token === '-') {\r\n const a = stack.pop()\r\n if (a) {\r\n stack.push(a.opposite())\r\n }\r\n } else {\r\n throw new Error(\"Error parsing the polynom\")\r\n }\r\n\r\n\r\n break\r\n\r\n case ShutingyardType.MONOM:\r\n // Should never appear.\r\n console.error('The monom token should not appear here')\r\n break\r\n\r\n case ShutingyardType.FUNCTION:\r\n // Should never appear.\r\n console.error('The function token should not appear here - might be introduced later.')\r\n break\r\n }\r\n\r\n\r\n }\r\n\r\n}\r\n","import type {\r\n EQUATION_SIGN,\r\n IAlgebra,\r\n IEquation,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType\r\n} from \"../pimath.interface\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Numeric } from \"../numeric\"\r\nimport { EquationSolver } from \"./equationSolver\"\r\nimport { Monom } from \"./monom\"\r\nimport { Polynom } from \"./polynom\"\r\n\r\nexport class Equation implements\r\n IPiMathObject<Equation>,\r\n IEquation<Equation>,\r\n IAlgebra<Equation> {\r\n\r\n // Left part of the equation\r\n #left: Polynom\r\n // Right part of the equation\r\n #right: Polynom\r\n // Signe of the equation\r\n #sign: EQUATION_SIGN\r\n\r\n\r\n constructor(equation: InputAlgebra<Polynom> | Equation)\r\n constructor(left: InputAlgebra<Polynom>, right: InputAlgebra<Polynom>, sign?: EQUATION_SIGN)\r\n constructor(left?: InputAlgebra<Polynom> | Equation, right?: InputAlgebra<Polynom>, sign?: EQUATION_SIGN) {\r\n // Default equation\r\n this.#left = new Polynom().zero()\r\n this.#right = new Polynom().zero()\r\n this.#sign = '='\r\n\r\n // Only one value, it's an equation\r\n if (left !== undefined && right === undefined) {\r\n if (left instanceof Equation) {\r\n return left.clone()\r\n } else if (typeof left === 'string') {\r\n // Parse the equation as a string.\r\n this.parse(left)\r\n }\r\n\r\n } else if (left !== undefined && right !== undefined) {\r\n // Two values, it's an equation with left and right polynoms.\r\n this.left = new Polynom(left as InputAlgebra<Polynom>)\r\n this.right = new Polynom(right)\r\n }\r\n\r\n if (sign !== undefined) {\r\n this.sign = sign\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public parse = (equationString: string): this => {\r\n // Find the string separator\r\n const strSign: string | false = this.#findSign(equationString)\r\n\r\n if (strSign === false) {\r\n throw new Error('The equation is not valid (no sign found)')\r\n }\r\n\r\n // The StrSign is found\r\n const pStr: string[] = equationString.split(strSign)\r\n\r\n return this.create(new Polynom(pStr[0]), new Polynom(pStr[1]), this.#formatSign(strSign))\r\n }\r\n\r\n public create = (left: Polynom, right: Polynom, sign?: string): this => {\r\n this.#left = left\r\n this.#right = right\r\n this.#sign = this.#formatSign(sign ?? \"=\")\r\n return this\r\n }\r\n\r\n public clone = (): Equation => {\r\n return new Equation(this.#left.clone(), this.#right.clone(), this.#sign)\r\n }\r\n\r\n /**\r\n * Add a value to the equation\r\n * if value is an equation, add the left part to the left part of the equation\r\n * and the right part to the right part of the equation\r\n * if value is a string, try to create an equation\r\n * if it fails, create a polynom and add it to the left and right part of the equation\r\n * @param value | Polynom | Monom | Fraction | string | monom\r\n */\r\n public add(value: InputValue<Equation | Polynom>): this {\r\n if (value instanceof Equation) {\r\n // add the left part of the equation\r\n this.#left.add(value.left)\r\n // add the right part of the equation\r\n this.#right.add(value.right)\r\n\r\n return this\r\n }\r\n\r\n if (typeof value === 'string' &&\r\n !Equation.isEquationString(value)) {\r\n\r\n return this.add(new Equation(value))\r\n }\r\n\r\n const p = new Polynom(value)\r\n this.#left.add(p)\r\n this.#right.add(p)\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Get the degree of the equation\r\n * @param letter\r\n */\r\n public degree = (letter?: string): Fraction => {\r\n return Fraction.max(this.#left.degree(letter), this.#right.degree(letter))\r\n }\r\n\r\n /**\r\n * divide an equation by a given value (transformed as a fraction)\r\n *\r\n * ```\r\n * 8x+10=6x \\vert 2\r\n * 4x+5=3x\r\n * ```\r\n *\r\n * |>Alternatively with $3x-4$ maybe it's working ?\r\n * $$\\frac{3x}{5}$$\r\n *\r\n * @param value\r\n * @returns {Equation}\r\n */\r\n public divide = (value: InputValue<Fraction>): this => {\r\n // Make sure we have a fraction.\r\n const F: Fraction = new Fraction(value)\r\n\r\n if (F.isZero()) {\r\n return this\r\n } else {\r\n return this.multiply(F.inverse())\r\n }\r\n }\r\n\r\n /**\r\n * Create an Equation using two polynoms.\r\n * Markdown *support* is cool\r\n * @param values\r\n * @param asNumeric\r\n */\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean ): boolean {\r\n // Evaluate the left and right part of the equation.\r\n // compare the results.\r\n\r\n // Evaluate the left and right part of the equation.\r\n const left = this.#left.evaluate(values, asNumeric),\r\n right = this.#right.evaluate(values, asNumeric)\r\n\r\n // compare the results.\r\n if (asNumeric) {\r\n return left === right\r\n }\r\n\r\n return (left as Fraction).isEqual(right as Fraction)\r\n }\r\n\r\n /**\r\n * Determine if the equation contains a variable.\r\n * @param letter\r\n */\r\n public hasVariable = (letter: string): boolean => {\r\n return this.variables.includes(letter)\r\n }\r\n\r\n\r\n public isEqual(value: InputValue<Equation>): boolean {\r\n const equ = new Equation(value)\r\n return equ.left.isEqual(this.#left) && equ.right.isEqual(this.#right)\r\n }\r\n\r\n public isLinearTo = (equ: Equation): boolean => {\r\n // Move all left.\r\n const p1 = equ.clone().moveLeft().simplify().left,\r\n p2 = this.clone().moveLeft().simplify().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOppositeAt(p2)\r\n }\r\n\r\n /**\r\n * Determine if the equation contains more than one letter/variable.\r\n */\r\n public isMultiVariable = (): boolean => {\r\n return this.#left.isMultiVariable || this.#right.isMultiVariable\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations helpers\r\n public isEqualTo = (equ: Equation): boolean => {\r\n const p1 = equ.clone().moveLeft().left,\r\n p2 = this.clone().moveLeft().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOppositeAt(p2)\r\n }\r\n\r\n /**\r\n * Reorder the polynom to have only one letter on the left, the rest on the right.\r\n * @param letter\r\n */\r\n public isolate = (letter?: string): this | false => {\r\n // Determine if we can isolate the variables.\r\n\r\n // Both part of the equations must be of the first degree.\r\n if (!this.degree(letter).isOne()) {\r\n return false\r\n }\r\n\r\n // Modify the equation to isolate the asked variable.\r\n if (this.isMultiVariable()) {\r\n return false\r\n }\r\n\r\n // Isolate the letter.\r\n let mMove: Monom\r\n // Start by moving everything to the left.\r\n this.#left.subtract(this.#right)\r\n this.#right.zero()\r\n const values = [...this.#left.monoms]\r\n for (const m of values) {\r\n if (!m.hasVariable(letter)) {\r\n mMove = m.clone()\r\n this.#left.subtract(mMove)\r\n this.#right.subtract(mMove)\r\n }\r\n }\r\n\r\n // In theory, we should have only one item on the left.\r\n if (this.#left.length !== 1) {\r\n return false\r\n }\r\n\r\n const cMove: Fraction = this.#left.monoms[0].coefficient.clone()\r\n this.#left.divide(cMove)\r\n this.#right.divide(cMove)\r\n return this\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations operations\r\n\r\n // -----------------------------------------------\r\n public letters = (): string[] => {\r\n return [...new Set([...this.#left.letters(), ...this.#right.letters()])]\r\n }\r\n\r\n // -----------------------------------------------\r\n /**\r\n * Reorder will move all monoms containing a letter on the left, all the other on the right.\r\n */\r\n public moveLeft = (): this => {\r\n this.#left.subtract(this.#right)\r\n this.#right.zero()\r\n return this\r\n }\r\n\r\n /**\r\n * Multiple an equation by a fraction value.\r\n * @param value\r\n */\r\n public multiply = (value: InputValue<Fraction>): this => {\r\n // Make sure we have a fraction.\r\n const F: Fraction = new Fraction(value)\r\n\r\n // Multiply each part of the equation by the fraction\r\n this.#left.multiply(F)\r\n this.#right.multiply(F)\r\n\r\n // The sign of the inequality must be changed.\r\n if (this.#sign !== '=' && F.sign() === -1) {\r\n this.#reverseSign()\r\n }\r\n\r\n return this\r\n }\r\n\r\n public pow(value: number): this {\r\n this.#left.pow(value)\r\n this.#right.pow(value)\r\n return this\r\n }\r\n public opposite = (): this => {\r\n this.#left = this.#left.opposite()\r\n this.#right = this.#right.opposite()\r\n return this\r\n }\r\n\r\n public reduce(): this {\r\n // reduce means moving everything to the left\r\n // remove the fractions\r\n // simplify the equation\r\n // reorder the equation\r\n // start with a positive left part\r\n\r\n // Move all left. The right part is now zero.\r\n this.moveLeft()\r\n\r\n // Reduce the equation: simplify and reorder.\r\n this.#left.reduce()\r\n\r\n // Simplify the equation.\r\n this.simplify()\r\n\r\n // Make sure the first part is positive.\r\n if (this.#left.monoms[0].coefficient.isNegative()) {\r\n this.multiply(-1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public reorder = (allLeft?: boolean): this => {\r\n // Move all monoms of degree greater than 0 to the left.\r\n // and all zero degree monoms to the right.\r\n this.#left.subtract(this.#right)\r\n this.#right.zero()\r\n this.#left.reorder()\r\n\r\n // we have all left (so equal zero) : it's done !\r\n if (allLeft) {\r\n return this\r\n }\r\n\r\n // Fetch all zero degree monoms.\r\n this.#left.monoms\r\n .filter(m => m.degree().isZero())\r\n .forEach(m => {\r\n const move = m.clone()\r\n this.#left.subtract(move)\r\n this.#right.subtract(move)\r\n })\r\n\r\n // Reorder the left and right polynoms\r\n this.#left.reorder()\r\n this.#right.reorder()\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public replaceBy = (letter: string, P: Polynom): this => {\r\n this.#left.replaceBy(letter, P)\r\n this.#right.replaceBy(letter, P)\r\n return this\r\n }\r\n\r\n /**\r\n * Multiply by the lcm denominator and divide by the gcm numerators.\r\n */\r\n public simplify = (): this => {\r\n this.multiply(Numeric.lcm(...this.#left.getDenominators(), ...this.#right.getDenominators()))\r\n this.divide(Numeric.gcd(...this.#left.getNumerators(), ...this.#right.getNumerators()))\r\n return this\r\n }\r\n\r\n // -----------------------------------------------\r\n public solve = (): ISolution[] => {\r\n const solver = new EquationSolver(this.clone())\r\n return solver.solve()\r\n }\r\n\r\n public split(): [Polynom, Polynom] {\r\n return [this.#left.clone(), this.#right.clone()]\r\n }\r\n\r\n public subtract(value: InputValue<Equation | Polynom>): this {\r\n if (value instanceof Equation) {\r\n this.#left.subtract(value.left)\r\n this.#right.subtract(value.right)\r\n\r\n return this\r\n }\r\n\r\n if (typeof value === 'string' &&\r\n !Equation.isEquationString(value)) {\r\n return this.subtract(new Equation(value))\r\n }\r\n\r\n const p = new Polynom(value)\r\n this.#left.subtract(p)\r\n this.#right.subtract(p)\r\n\r\n return this\r\n }\r\n\r\n public test = (values: literalType<Fraction>): boolean => {\r\n return (this.left.evaluate(values) as Fraction).isEqual(this.right.evaluate(values))\r\n }\r\n\r\n public static isEquationString(equationString: string): boolean {\r\n // The equation sign can be one of the following:\r\n // =, <, >, <=, >=\r\n\r\n return equationString.includes('=') ||\r\n equationString.includes('<') ||\r\n equationString.includes('>') ||\r\n equationString.includes('<=') ||\r\n equationString.includes('>=')\r\n }\r\n\r\n public static makeSolutionsUnique(solutions: ISolution[], sorted?: boolean): ISolution[] {\r\n const solutionAsTex: string[] = [],\r\n uniqueSolutions = solutions.filter(sol => {\r\n if (!solutionAsTex.includes(sol.tex)) {\r\n solutionAsTex.push(sol.tex)\r\n return true\r\n } else {\r\n return false\r\n }\r\n })\r\n\r\n if (sorted === true) {\r\n uniqueSolutions.sort((a, b) => a.value - b.value)\r\n }\r\n\r\n return uniqueSolutions\r\n }\r\n\r\n public get display(): string {\r\n return `${this.#left.display}${this.signAsTex}${this.#right.display}`\r\n }\r\n\r\n // Getter and setter\r\n public get left(): Polynom {\r\n return this.#left\r\n }\r\n\r\n public set left(value: Polynom) {\r\n this.#left = value\r\n }\r\n\r\n public get numberOfVars(): number {\r\n return this.variables.length\r\n }\r\n\r\n public get right(): Polynom {\r\n return this.#right\r\n }\r\n\r\n public set right(value: Polynom) {\r\n this.#right = value\r\n }\r\n\r\n // ------------------------------------------\r\n public get sign(): string {\r\n return this.#sign\r\n }\r\n\r\n public set sign(value: string) {\r\n // Set the sign value as formatted.\r\n this.#sign = this.#formatSign(value)\r\n }\r\n\r\n public get signAsTex(): string {\r\n if (this.#sign === '>=') {\r\n return '\\\\geq'\r\n }\r\n\r\n if (this.#sign === '<=') {\r\n return '\\\\leq'\r\n }\r\n\r\n return this.#sign\r\n }\r\n\r\n public get tex(): string {\r\n return `${this.#left.tex}${this.signAsTex}${this.#right.tex}`\r\n }\r\n\r\n public get variables(): string[] {\r\n return [...new Set(this.#right.variables.concat(this.#left.variables))]\r\n }\r\n\r\n #findSign = (equationString: string): string | false => {\r\n if (equationString.includes('geq')) {\r\n return (equationString.includes('\\\\geq')) ? '\\\\geq' : 'geq'\r\n } else if (equationString.includes('leq')) {\r\n return (equationString.includes('\\\\leq')) ? '\\\\leq' : 'leq'\r\n } else if (equationString.includes('>=')) {\r\n return '>='\r\n } else if (equationString.includes('=>')) {\r\n return '=>'\r\n } else if (equationString.includes('>')) {\r\n return '>'\r\n } else if (equationString.includes('<=')) {\r\n return '<='\r\n } else if (equationString.includes('=<')) {\r\n return '=<'\r\n } else if (equationString.includes('<')) {\r\n return '<'\r\n } else if (equationString.includes('=')) {\r\n return '='\r\n }\r\n\r\n throw new Error('The equation is not valid (no sign found)')\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations solving algorithms\r\n #formatSign = (signStr?: string): EQUATION_SIGN => {\r\n if (signStr === undefined) {\r\n return '='\r\n }\r\n\r\n if (signStr.includes('geq')) {\r\n return '>='\r\n } else if (signStr.includes('>=')) {\r\n return '>='\r\n } else if (signStr.includes('=>')) {\r\n return '>='\r\n } else if (signStr.includes('>')) {\r\n return '>'\r\n } else if (signStr.includes('leq')) {\r\n return '<='\r\n } else if (signStr.includes('<=')) {\r\n return '<='\r\n } else if (signStr.includes('=<')) {\r\n return '<='\r\n } else if (signStr.includes('<')) {\r\n return '<'\r\n } else {\r\n return '='\r\n }\r\n }\r\n\r\n #reverseSign = (): this => {\r\n if (this.#sign === '=') {\r\n return this\r\n }\r\n\r\n if (this.#sign.includes('<')) {\r\n this.#sign.replace('<', '>')\r\n return this\r\n }\r\n if (this.#sign.includes('>')) {\r\n this.#sign.replace('>', '<')\r\n return this\r\n }\r\n\r\n return this\r\n }\r\n}\r\n","import type {\r\n IAlgebra,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType,\r\n TABLE_OF_SIGNS\r\n} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients/fraction\"\r\nimport {Polynom} from \"./polynom\"\r\nimport {replace_in_array, wrapParenthesis} from \"../helpers\"\r\n\r\nexport class Factor implements IPiMathObject<Factor>,\r\n IExpression<Factor>,\r\n IAlgebra<Factor> {\r\n #displayMode: FACTOR_DISPLAY\r\n #polynom: Polynom\r\n #power: Fraction\r\n #singleMode = false\r\n\r\n constructor(value?: InputAlgebra<Polynom> | Factor, power?: InputValue<Fraction>) {\r\n\r\n\r\n if (value instanceof Factor) {\r\n this.#polynom = value.polynom.clone()\r\n this.#power = value.power.clone()\r\n\r\n if(power !== undefined){\r\n this.#power.multiply(new Fraction(power))\r\n }\r\n } else if(value !== undefined) {\r\n this.#polynom = new Polynom(value)\r\n this.#power = new Fraction(power ?? 1)\r\n }else{\r\n this.#polynom = new Polynom()\r\n this.#power = new Fraction(1)\r\n }\r\n\r\n this.#displayMode = FACTOR_DISPLAY.POWER\r\n\r\n return this\r\n }\r\n\r\n public parse(/*value: InputValue<Factor>*/): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public clone(): Factor {\r\n return new Factor(this)\r\n }\r\n\r\n public fromPolynom(polynom: InputValue<Polynom>): this {\r\n this.#polynom = new Polynom(polynom)\r\n this.#power = new Fraction(1)\r\n return this\r\n }\r\n public get tex(): string {\r\n const num = this.power.numerator\r\n const den = this.power.denominator\r\n\r\n let base: string\r\n let power: string\r\n\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && den > 1) {\r\n base = `\\\\sqrt${den === 2 ? '' : `[ ${den} ]`}{ ${this.polynom.tex} }`\r\n power = num === 1 ? '' : `^{ ${num} }`\r\n } else {\r\n base = this.#singleMode && this.power.isOne() ? this.polynom.tex : wrapParenthesis(this.polynom.tex)\r\n power = (den === 1 && num === 1) ? '' : `^{ ${this.power.tex} }`\r\n }\r\n\r\n // Add the power if it's not 1 or -1\r\n base = `${base}${power}`\r\n\r\n // If the power is negative, make it as a fraction.\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && num < 0) {\r\n base = `\\\\frac{ 1 }{ ${base} }`\r\n }\r\n\r\n\r\n return base\r\n }\r\n\r\n public get display(): string {\r\n const num = this.power.numerator\r\n const den = this.power.denominator\r\n\r\n let base: string\r\n let power: string\r\n\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && den > 1) {\r\n base = `${den === 2 ? 'sqrt' : `root(${den})`}(${this.polynom.display})`\r\n power = num === 1 ? '' : `^(${num})`\r\n } else {\r\n base = this.#singleMode && this.power.isOne() ? this.polynom.display : wrapParenthesis(this.polynom.display, false)\r\n power = (den === 1 && num === 1) ? '' : `^(${this.power.display})`\r\n }\r\n\r\n // Add the power if it's not 1 or -1\r\n base = `${base}${power}`\r\n\r\n // If the power is negative, make it as a fraction.\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && num < 0) {\r\n base = `1/(${base})`\r\n }\r\n\r\n\r\n return base\r\n }\r\n\r\n public add(): Factor {\r\n throw new Error(\"Adding two factors is not possible\")\r\n }\r\n\r\n public get asSingle(): this {\r\n this.#singleMode = true\r\n return this\r\n }\r\n\r\n public degree(letter?: string): Fraction {\r\n return this.polynom.degree(letter).multiply(this.power)\r\n }\r\n\r\n public derivative(): Factor[] {\r\n // The power is zero, the derivative is zero\r\n if (this.power.isZero()) {\r\n return [new Factor('0')]\r\n }\r\n\r\n // The power is one, the derivative is the derivative of the polynom\r\n if (this.power.isOne()) {\r\n return [new Factor(this.polynom.clone().derivative())]\r\n }\r\n\r\n // In any other case, the derivative consist of three Factors:\r\n // the derivative of the polynom, the power and the polynom\r\n return [\r\n new Factor(this.power.clone()),\r\n new Factor(this.polynom.clone().derivative()),\r\n new Factor(this.polynom.clone(), this.power.clone().subtract(1))\r\n ]\r\n }\r\n\r\n public develop(): Polynom {\r\n if (this.power.isNatural()) {\r\n return this.polynom.clone().pow(this.power.value)\r\n }\r\n\r\n throw new Error(\"The power must be a natural number\")\r\n }\r\n\r\n public divide(value: InputAlgebra<Factor | Polynom>): this {\r\n if (value instanceof Factor) {\r\n if (this.isSameAs(value)) {\r\n this.power.subtract(value.power)\r\n return this\r\n }\r\n }\r\n\r\n\r\n const P = new Polynom(value as Polynom)\r\n if (this.isSameAs(P)) {\r\n this.power.subtract(1)\r\n return this\r\n }\r\n\r\n throw new Error(\"The two factors must be the same\")\r\n }\r\n\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean): number | Fraction {\r\n if (asNumeric) {\r\n return (this.polynom.evaluate(values, true) as number) ** this.power.value\r\n }\r\n\r\n\r\n return (this.polynom.evaluate(values) as Fraction).pow(this.power)\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.polynom.hasVariable(letter)\r\n }\r\n\r\n public inverse(): this {\r\n this.power.opposite()\r\n return this\r\n }\r\n\r\n public isEqual(value: Factor): boolean {\r\n // Must have the same polynom and the same reduce power\r\n\r\n return this.isSameAs(value) &&\r\n this.power.isEqual(value.power)\r\n }\r\n\r\n public isOne(): boolean {\r\n return this.polynom.isOne() || this.power.isZero()\r\n }\r\n\r\n public isSameAs(value: InputAlgebra<Factor | Polynom>) {\r\n let P: Polynom\r\n if (value instanceof Factor) {\r\n P = value.polynom\r\n } else if (value instanceof Polynom) {\r\n P = value\r\n } else {\r\n P = new Polynom(value)\r\n }\r\n\r\n\r\n return this.polynom.isEqual(P)\r\n }\r\n\r\n public isZero(): boolean {\r\n return this.polynom.isZero()\r\n }\r\n\r\n public multiply(value: InputAlgebra<Factor | Polynom>): this {\r\n if (value instanceof Factor) {\r\n if (this.isSameAs(value)) {\r\n this.power.add(value.power)\r\n return this\r\n }\r\n }\r\n\r\n\r\n const P = new Polynom(value as Polynom)\r\n if (this.isSameAs(P)) {\r\n this.power.add(1)\r\n return this\r\n }\r\n\r\n throw new Error(\"The two factors must be the same\")\r\n }\r\n\r\n public one(): this {\r\n this.#polynom.one()\r\n this.#power.one()\r\n return this\r\n }\r\n\r\n public opposite(): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public get polynom(): Polynom {\r\n return this.#polynom\r\n }\r\n\r\n public set polynom(value: Polynom) {\r\n this.#polynom = value\r\n }\r\n\r\n public pow(value: number | Fraction): this {\r\n this.power.multiply(value)\r\n return this\r\n }\r\n\r\n public get power(): Fraction {\r\n return this.#power\r\n }\r\n\r\n public set power(value: InputValue<Fraction>) {\r\n this.#power = new Fraction(value)\r\n }\r\n\r\n public primitive(): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public reduce(): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public root(value: number): this {\r\n this.power.divide(value)\r\n return this\r\n }\r\n\r\n public sqrt(): this {\r\n return this.root(2)\r\n }\r\n\r\n public subtract(): Factor {\r\n throw new Error(\"Subtracting two factors is not possible\")\r\n }\r\n\r\n public tableOfSigns(): TABLE_OF_SIGNS {\r\n const pow = this.power.clone().reduce()\r\n const tos = this.polynom.tableOfSigns()\r\n\r\n // The zero roots becomes defence (d) if the power is negative\r\n if (pow.isStrictlyNegative()) {\r\n tos.signs = replace_in_array(tos.signs, 'z', 'd')\r\n }\r\n\r\n // The - sign becomes\r\n // + (plus) if the power num is even and the power den is odd\r\n // i (invalid) if the power denominator is even\r\n if (pow.denominator % 2 === 0) {\r\n // it's an even roots : no negative values!\r\n tos.signs = replace_in_array(tos.signs, '-', 'h')\r\n } else if (pow.numerator % 2 === 0) {\r\n // it's an even power : negative values becomes positive !\r\n tos.signs = replace_in_array(tos.signs, '-', '+')\r\n }\r\n\r\n\r\n return {roots: tos.roots, signs: tos.signs}\r\n }\r\n\r\n public get variables(): string[] {\r\n return this.polynom.variables\r\n }\r\n\r\n public get withPower(): this {\r\n this.#displayMode = FACTOR_DISPLAY.POWER\r\n return this\r\n }\r\n\r\n public get withRoot(): this {\r\n this.#displayMode = FACTOR_DISPLAY.ROOT\r\n return this\r\n }\r\n\r\n public zero(): this {\r\n this.#polynom.zero()\r\n this.#power.one()\r\n return this\r\n }\r\n\r\n}\r\n\r\nexport enum FACTOR_DISPLAY {\r\n ROOT,\r\n POWER\r\n}\r\n\r\n","import type {IAlgebra, IEquation, InputValue, IPiMathObject, ISolution, literalType} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Equation} from \"./equation\"\r\nimport {Monom} from \"./monom\"\r\nimport {Polynom} from \"./polynom\"\r\n\r\nexport class LinearSystem implements IPiMathObject<LinearSystem>,\r\n IEquation<LinearSystem>,\r\n IAlgebra<LinearSystem> {\r\n\r\n #equations: Equation[]\r\n\r\n // Determine the letters in the linear system, usually ['x', 'y']\r\n #variables: string[]\r\n\r\n constructor(...values: (string | Equation)[]) {\r\n this.#equations = []\r\n this.#variables = []\r\n\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public parse = (...equations: (string | Equation)[]): this => {\r\n // make the original equations\r\n this.#equations = equations.map(value => new Equation(value))\r\n\r\n // get the letters.\r\n this.#findLetters()\r\n return this\r\n }\r\n\r\n public clone = (): LinearSystem => {\r\n return new LinearSystem()\r\n .parse(...this.#equations.map(equ => equ.clone()))\r\n }\r\n\r\n public static fromMatrix(\r\n matrix: InputValue<Fraction>[][],\r\n letters = 'xyz'): LinearSystem {\r\n // Check that each row has the same number of columns\r\n const cols = matrix[0].length\r\n if (matrix.some(row => row.length !== cols)) {\r\n throw new Error(\"All rows must have the same number of columns\")\r\n }\r\n\r\n // Determine the default letters. The number of letters are cols-1\r\n const vars = letters.split('')\r\n .splice(0, cols - 1)\r\n\r\n // Create a new LinearSystem\r\n return new LinearSystem(\r\n ...matrix.map(row => {\r\n const P = new Polynom(vars.join(''), ...row)\r\n return new Equation(P, 0)\r\n })\r\n )\r\n\r\n }\r\n\r\n public add(value: InputValue<LinearSystem | Equation | Polynom>, index?: number): this {\r\n if (value instanceof LinearSystem) {\r\n const length = value.equations.length\r\n if (length !== this.#equations.length) {\r\n throw new Error(\"The number of equations must be the same\")\r\n }\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.#equations[i].add(value.equations[i])\r\n }\r\n } else {\r\n if (index === undefined || index < 0 || index >= this.#equations.length) {\r\n throw new Error(\"Index out of range\")\r\n }\r\n const equ = new Equation(value)\r\n this.#equations[index].add(equ)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public buildTex = (equations: Equation[], operators?: (string[])[]): string => {\r\n let equStr: string[]\r\n let m: Monom\r\n let letters: string[] = []\r\n const equArray: string[] = []\r\n\r\n // Get the letters from the linear system\r\n for (const equ of equations) {\r\n letters = letters.concat(equ.letters())\r\n }\r\n\r\n letters = [...new Set(letters)]\r\n letters.sort()\r\n\r\n for (let i = 0; i < equations.length; i++) {\r\n const equ = equations[i]\r\n\r\n equStr = []\r\n for (const L of letters) {\r\n m = equ.left.monomByLetter(L)\r\n\r\n if (equStr.length === 0) {\r\n equStr.push(m.isZero() ? '' : m.tex)\r\n } else {\r\n equStr.push(m.isZero() ? '' : ((m.coefficient.sign() === 1) ? '+' : '') + m.tex)\r\n }\r\n }\r\n\r\n // Add the equal sign\r\n equStr.push('=')\r\n\r\n // Add the right hand part of the equation (should be only a number, because it has been reordered)\r\n equStr.push(equ.right.tex)\r\n\r\n // Add the operations if existing\r\n if (operators?.[i] !== undefined) {\r\n // add extra space at the end of the equation\r\n equStr[equStr.length - 1] = equStr[equStr.length - 1] + ' \\\\phantom{\\\\quad}'\r\n for (const o of operators[i]) {\r\n equStr.push(`\\\\ \\\\cdot\\\\ ${o.startsWith('-') ? \"\\\\left(\" + o + \"\\\\right)\" : o}`)\r\n }\r\n }\r\n\r\n // Add to the list.\r\n equArray.push(equStr.join('&'))\r\n }\r\n\r\n let operatorsColumns = 0\r\n if (operators !== undefined && operators.length > 0) {\r\n operatorsColumns = operators[0].length\r\n }\r\n\r\n return `\\\\left\\\\{\\\\begin{array}{${\"r\".repeat(letters.length)}cl ${\"|l\".repeat(operatorsColumns)}}${equArray.join('\\\\\\\\ ')}\\\\end{array}\\\\right.`\r\n }\r\n\r\n public degree(letter?: string): Fraction {\r\n return Fraction.max(...this.#equations.map(equ => equ.degree(letter)))\r\n }\r\n\r\n get display() {\r\n // TODO : LinearSystem - display: implement the display of the linear system\r\n return this.tex + 'as display'\r\n }\r\n\r\n // ------------------------------------------\r\n public get equations(): Equation[] {\r\n return this.#equations\r\n }\r\n\r\n public set equations(value) {\r\n this.#equations = value\r\n }\r\n\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean): number | Fraction {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.#variables.includes(letter)\r\n }\r\n\r\n public isEqual(value: LinearSystem): boolean {\r\n return this.equations.every((equ, index) => equ.isEqual(value.equations[index]))\r\n }\r\n\r\n public get isSolvable(): boolean {\r\n const V = this.variables\r\n\r\n // TODO: in some case, it is possible to resolve systems if there isn't the isSame number of vars and equations\r\n if (V.length !== this.#equations.length) {\r\n return false\r\n }\r\n\r\n //TODO: Must check if two equations isn't a linear combination of the others ?\r\n\r\n return true\r\n }\r\n\r\n public get matrix(): [Fraction[][], Fraction[]] {\r\n //TODO: use Matrix class\r\n return this.#makeMatrix()\r\n }\r\n\r\n public mergeEquations = (eq1: Equation, eq2: Equation, factor1: Fraction, factor2: Fraction): Equation => {\r\n // Set and clone the equations.\r\n\r\n const eq1multiplied = eq1.clone().multiply(new Fraction(factor1)),\r\n eq2multiplied = eq2.clone().multiply(new Fraction(factor2))\r\n\r\n // Add both equations together.\r\n eq1multiplied.left.add(eq2multiplied.left)\r\n eq1multiplied.right.add(eq2multiplied.right)\r\n\r\n return eq1multiplied\r\n }\r\n\r\n public multiply(value: InputValue<Fraction> | InputValue<Fraction>[], index?: number): this {\r\n // Multiply the system by a number\r\n // the value can be an array of numbers\r\n // the value can be a number and the index of the equation to multiply\r\n if (Array.isArray(value)) {\r\n if (value.length !== this.#equations.length) {\r\n throw new Error(\"The number of values must be the same as the number of equations\")\r\n }\r\n\r\n for (let i = 0; i < value.length; i++) {\r\n this.#equations[i].multiply(value[i])\r\n }\r\n return this\r\n }\r\n\r\n if (index === undefined || index < 0 || index >= this.#equations.length) {\r\n throw new Error(\"Index out of range\")\r\n }\r\n\r\n this.#equations[index].multiply(value)\r\n\r\n return this\r\n }\r\n\r\n public reduce(): LinearSystem {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n // ------------------------------------------\r\n public reorder = (): this => {\r\n for (const E of this.#equations) {\r\n E.reorder()\r\n }\r\n\r\n return this\r\n }\r\n\r\n solve(): ISolution[] {\r\n return []\r\n }\r\n\r\n public solveMatrix = (): Fraction[] => {\r\n const [matrix, vector] = this.matrix\r\n // Solve the matrix\r\n\r\n // console.log(matrix.map(row=>row.map(x=>x.display)))\r\n // console.log(vector.map(x=>x.display))\r\n\r\n // Make the augmented matrix (matrix + vector)\r\n const augmentedMatrix: Fraction[][] = matrix.map((row, index) => [...row, vector[index]])\r\n\r\n // Reduce the matrix\r\n for (let i = 0; i < matrix.length; i++) {\r\n // Find the pivot (the first non-zero element in the row)\r\n let pivot = augmentedMatrix[i][i].clone()\r\n if (pivot.isZero()) {\r\n // throw new Error('Divide by zero !')\r\n // Search a line below that would add it.\r\n const row_to_add = augmentedMatrix\r\n .find((row, index) => {\r\n return index > i && !row[i].isZero()\r\n })\r\n\r\n if (row_to_add) {\r\n augmentedMatrix[i].forEach((value, index) => value.add(row_to_add[index]))\r\n pivot = augmentedMatrix[i][i].clone()\r\n } else {\r\n throw new Error('Unsolvable...')\r\n }\r\n\r\n\r\n }\r\n\r\n // Normalize the row: divide all elements by the pivot\r\n // the pivot is now 1\r\n augmentedMatrix[i] = augmentedMatrix[i].map(x => x.divide(pivot))\r\n\r\n // reduce the other rows using the pivot.\r\n for (let j = 0; j < matrix.length; j++) {\r\n if (j === i) {\r\n continue\r\n }\r\n\r\n const factor = augmentedMatrix[j][i].clone().opposite()\r\n for (let k = 0; k < augmentedMatrix[j].length; k++) {\r\n augmentedMatrix[j][k].add(augmentedMatrix[i][k].clone().multiply(factor))\r\n }\r\n\r\n // Check if the system is undetermined (no solution or infinite solutions)\r\n // the j line must not be all zeros\r\n // the last element must be zero => the system is undetermined\r\n // the last element must not be zero => the system is impossible\r\n if (augmentedMatrix[j].slice(0, augmentedMatrix[j].length - 1).every(x => x.isZero())) {\r\n if (augmentedMatrix[j][augmentedMatrix[j].length - 1].isZero()) {\r\n return [new Fraction().infinite()]\r\n } else {\r\n return []\r\n }\r\n }\r\n }\r\n }\r\n\r\n return augmentedMatrix.map(x => x[x.length - 1])\r\n }\r\n\r\n public subtract(value: InputValue<LinearSystem | Equation | Polynom>, index?: number): this {\r\n if (value instanceof LinearSystem) {\r\n const length = value.equations.length\r\n if (length !== this.#equations.length) {\r\n throw new Error(\"The number of equations must be the same\")\r\n }\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.#equations[i].subtract(value.equations[i])\r\n }\r\n } else {\r\n if (index === undefined || index < 0 || index >= this.#equations.length) {\r\n throw new Error(\"Index out of range\")\r\n }\r\n const equ = new Equation(value)\r\n this.#equations[index].subtract(equ)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public get tex(): string {\r\n // Build the array of values.\r\n // Reorder\r\n // This clone the system :!!!\r\n //TODO: Avoid cloning this linear system\r\n const LS = this.clone().reorder()\r\n\r\n return this.buildTex(LS.equations)\r\n }\r\n\r\n public get variables(): string[] {\r\n return this.#variables\r\n }\r\n\r\n public set variables(value: string | string[]) {\r\n const vars = (typeof value === \"string\") ? value.split('') : [...value]\r\n vars.sort()\r\n this.#variables = vars\r\n }\r\n\r\n #findLetters = (): this => {\r\n this.#variables = this.#equations.reduce((acc: string[], equ) => {\r\n return [...new Set([...acc, ...equ.variables])]\r\n }, [])\r\n //\r\n // // Find all letters used.\r\n // let variables = new Set<string>()\r\n //\r\n // for (const equ of this.#equations) {\r\n // variables = new Set([...variables, ...equ.variables])\r\n // }\r\n //\r\n // this.#variables = [...variables]\r\n this.#variables.sort()\r\n return this\r\n }\r\n\r\n #makeMatrix = (): [Fraction[][], Fraction[]] => {\r\n // Make the matrix\r\n const matrix: Fraction[][] = []\r\n const vector: Fraction[] = []\r\n\r\n for (const E of this.#equations) {\r\n const row: Fraction[] = []\r\n\r\n const equ = E.clone().reorder()\r\n for (const L of this.variables) {\r\n const m = equ.left.monomByLetter(L)\r\n row.push(m.coefficient)\r\n }\r\n\r\n // Add the \"no letter part\"\r\n vector.push(equ.right.monoms[0].coefficient)\r\n\r\n // Add to the matrix\r\n matrix.push(row)\r\n }\r\n\r\n return [matrix, vector]\r\n }\r\n\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.\r\n * @module Logicalset\r\n */\r\nimport {ShutingYard, ShutingyardMode} from \"piexpression\"\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n */\r\nexport class LogicalSet {\r\n #rpn: { token: string, tokenType: string }[]\r\n\r\n /**\r\n *\r\n * @param {string} value (optional) Default polynom to parse on class creation\r\n */\r\n constructor(value?: string) {\r\n this.#rpn = []\r\n\r\n if (value !== undefined) {\r\n this.parse(value)\r\n }\r\n\r\n return this\r\n }\r\n\r\n parse = (value: string): this => {\r\n // Parse the updated value to the shutingyard algorithm\r\n this.#rpn = new ShutingYard(ShutingyardMode.SET)\r\n .parse(value)\r\n .rpn\r\n\r\n return this\r\n }\r\n\r\n evaluate(values: Record<string, boolean>): boolean {\r\n // Add missing key(s) and set them as false by default.\r\n this.variables.forEach(key => {\r\n if (!Object.hasOwn(values, key)) {\r\n values[key] = false\r\n }\r\n })\r\n\r\n const stack: boolean[] = []\r\n for (const token of this.#rpn) {\r\n console.log(token)\r\n if (token.tokenType === 'variable') {\r\n stack.push(values[token.token])\r\n } else if (token.tokenType === 'operation') {\r\n if (token.token === '!') {\r\n // need only one item from stack\r\n if (stack.length >= 1) {\r\n const a = stack.pop()\r\n stack.push(!a)\r\n } else {\r\n return false\r\n }\r\n } else {\r\n // All other operations needs two items from stack\r\n const a = stack.pop()\r\n const b = stack.pop()\r\n if (a !== undefined && b !== undefined) {\r\n switch (token.token) {\r\n case \"&\":\r\n stack.push(a && b)\r\n break\r\n case \"|\":\r\n stack.push(a || b)\r\n break\r\n case \"-\":\r\n return false\r\n }\r\n\r\n } else {\r\n return false\r\n }\r\n }\r\n }\r\n }\r\n\r\n return stack.length === 1 && stack[0]\r\n }\r\n\r\n get rpn(): { token: string, tokenType: string }[] {\r\n return this.#rpn\r\n }\r\n\r\n get tex(): string {\r\n const varStack: { token: string, tokenType: string }[] = []\r\n\r\n for (const token of this.#rpn) {\r\n if (token.tokenType === 'variable') {\r\n varStack.push(token)\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (second && first) {\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cap ${second.token}`, tokenType: 'mix'})\r\n }\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (second && first) {\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cup ${second.token}`, tokenType: 'mix'})\r\n }\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (second && first) {\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\setminus ${second.token}`, tokenType: 'mix'})\r\n }\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n const first = varStack.pop()\r\n\r\n if (first) {\r\n varStack.push({token: `\\\\overline{ ${first.token} }`, tokenType: 'variable'})\r\n }\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return varStack[0].token\r\n }\r\n\r\n get variables(): string[] {\r\n return this.#rpn\r\n .filter(value => value.tokenType === 'variable')\r\n .map(value => value.token)\r\n }\r\n\r\n vennAB(): string[] {\r\n return this.#evaluateAsVenn({\r\n A: ['A', 'AB'],\r\n B: ['B', 'AB']\r\n },\r\n ['A', 'B', 'AB', 'E']\r\n )\r\n }\r\n\r\n vennABC(): string[] {\r\n return this.#evaluateAsVenn({\r\n A: ['A', 'AB', 'AC', 'ABC'],\r\n B: ['B', 'AB', 'BC', 'ABC'],\r\n C: ['C', 'AC', 'BC', 'ABC']\r\n },\r\n ['A', 'B', 'C', 'AB', 'AC', 'BC', 'ABC', 'E']\r\n )\r\n }\r\n\r\n #evaluateAsVenn(tokenSets: Record<string, string[] | undefined>, reference?: string[]): string[] {\r\n const varStack: (Set<string>)[] = []\r\n\r\n let referenceSet: Set<string>\r\n if (reference === undefined) {\r\n referenceSet = new Set()\r\n for (const key in tokenSets) {\r\n referenceSet = new Set([\r\n ...referenceSet,\r\n ...(tokenSets[key] ?? [])\r\n ])\r\n }\r\n } else {\r\n referenceSet = new Set(reference)\r\n }\r\n\r\n for (const token of this.#rpn) {\r\n if (token.tokenType === 'variable') {\r\n // The variable has no token - assume it's empty.\r\n if (tokenSets[token.token] === undefined) {\r\n varStack.push(new Set())\r\n } else {\r\n varStack.push(new Set(tokenSets[token.token]))\r\n }\r\n\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first && second) {\r\n varStack.push(new Set([...first].filter(x => second.has(x))))\r\n }\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n if (first && second) {\r\n varStack.push(new Set([...first, ...second]))\r\n }\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first && second) {\r\n varStack.push(new Set([...first].filter(x => !second.has(x))))\r\n }\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n const first = varStack.pop()\r\n\r\n if (first) {\r\n varStack.push(new Set([...referenceSet].filter(x => !first.has(x))))\r\n }\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return [...varStack[0]].sort()\r\n }\r\n}","import type {\r\n FACTOR_TABLE_OF_SIGNS,\r\n IAlgebra,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType,\r\n POLYFACTOR_TABLE_OF_SIGNS,\r\n TABLE_OF_SIGNS_VALUES\r\n} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Factor, FACTOR_DISPLAY} from \"./factor\"\r\nimport {Polynom} from \"./polynom\"\r\n\r\n\r\n// PolyFactor is a class that represents a polynomial in factored form.\r\nexport class PolyFactor implements IPiMathObject<PolyFactor>,\r\n IExpression<PolyFactor>,\r\n IAlgebra<PolyFactor> {\r\n\r\n #displayMode: FACTOR_DISPLAY = FACTOR_DISPLAY.POWER\r\n #factors: Factor[] = []\r\n\r\n constructor(...values: (Factor | PolyFactor)[]) {\r\n this.parse(...values)\r\n return this\r\n }\r\n\r\n public parse(...values: (Factor | PolyFactor)[]): this {\r\n // Init the factors list\r\n this.#factors = []\r\n\r\n // Nothing to create\r\n if (values.length === 0) {\r\n return this\r\n }\r\n\r\n values.forEach(value => {\r\n if (value instanceof PolyFactor) {\r\n this.#factors.push(...value.factors.map(f => f.clone()))\r\n } else {\r\n this.#factors.push(new Factor(value))\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n public clone(): PolyFactor {\r\n return new PolyFactor(...this.#factors.map(f => f.clone()))\r\n }\r\n\r\n public get tex(): string {\r\n const {num, den} = this.#extractNumeratorAndDenominator()\r\n\r\n if (den.length === 0) {\r\n if (num.length === 1) {\r\n return num[0].asSingle.tex\r\n }\r\n\r\n return num.map(f => f.tex).join(\"\")\r\n }\r\n\r\n // There is a numerator and a denominator\r\n const numTeX = num.length === 1 ? num[0].asSingle.tex : num.map(f => f.tex).join(\"\")\r\n const denTeX = den.length === 1 ? den[0].asSingle.tex : den.map(f => f.tex).join(\"\")\r\n\r\n return `\\\\frac{ ${numTeX} }{ ${denTeX} }`\r\n\r\n }\r\n\r\n public get display(): string {\r\n const {num, den} = this.#extractNumeratorAndDenominator()\r\n\r\n if (den.length === 0) {\r\n if (num.length === 1) {\r\n return num[0].asSingle.display\r\n }\r\n\r\n return num.map((f, index) =>\r\n index === 0 && f.polynom.monoms.length === 1 ? f.asSingle.display : f.display\r\n ).join(\"\")\r\n }\r\n\r\n // There is a numerator and a denominator\r\n const numTeX = num.length === 1 ? num[0].asSingle.display : num.map(f => f.display).join(\"\")\r\n const denTeX = den.length === 1 ? den[0].asSingle.display : den.map(f => f.display).join(\"\")\r\n\r\n return `(${numTeX})/(${denTeX})`\r\n\r\n }\r\n\r\n static #gcdWith(PF1: PolyFactor, PF2: PolyFactor): PolyFactor {\r\n // Get all factors of the two polynomials\r\n // Find the common factors\r\n const factors1 = keyFactors(PF1)\r\n\r\n const factors2 = keyFactors(PF2)\r\n\r\n const common = Object.keys(factors1).filter(k => Object.hasOwn(factors2, k))\r\n\r\n // Find the minimum power of the common factors\r\n const factors = common.map(k => {\r\n const power = factors1[k].reduce((acc, f) => acc.add(f.power), new Fraction('0'))\r\n const power2 = factors2[k].reduce((acc, f) => acc.add(f.power), new Fraction('0'))\r\n return new Factor(k, Fraction.min(power, power2))\r\n })\r\n\r\n return new PolyFactor(...factors)\r\n }\r\n\r\n static #lcmWith(PF1: PolyFactor, PF2: PolyFactor): PolyFactor {\r\n\r\n const factors1 = keyFactors(PF1)\r\n\r\n const factors2 = keyFactors(PF2)\r\n\r\n const common = [...new Set([...Object.keys(factors1), ...Object.keys(factors2)])]\r\n\r\n // Find the maximum power of the common factors\r\n const factors = common.map(k => {\r\n const power =\r\n Object.hasOwn(factors1, k) ?\r\n factors1[k].reduce((acc, f) => acc.add(f.power), new Fraction('0')) :\r\n new Fraction(0)\r\n const power2 = Object.hasOwn(factors2, k) ?\r\n factors2[k].reduce((acc, f) => acc.add(f.power), new Fraction('0')) :\r\n new Fraction(0)\r\n return new Factor(k, Fraction.max(power, power2))\r\n })\r\n\r\n return new PolyFactor(...factors)\r\n }\r\n\r\n public static gcd(...values: PolyFactor[]): PolyFactor {\r\n if (values.length === 0) {\r\n return new PolyFactor().one()\r\n }\r\n if (values.length === 1) {\r\n return values[0]\r\n }\r\n if (values.length === 2) {\r\n return PolyFactor.#gcdWith(values[0], values[1])\r\n }\r\n\r\n // values is not undefined,\r\n let PF = values[0]\r\n values.shift()\r\n values.forEach(value => PF = PolyFactor.#gcdWith(PF, value))\r\n\r\n return PF\r\n }\r\n\r\n public static lcm(...values: PolyFactor[]): PolyFactor {\r\n if (values.length === 0) {\r\n return new PolyFactor().one()\r\n }\r\n if (values.length === 1) {\r\n return values[0]\r\n }\r\n\r\n let PF = values[0]\r\n values.shift()\r\n values.forEach(value => PF = PolyFactor.#lcmWith(PF, value))\r\n return PF\r\n }\r\n\r\n public add(...values: PolyFactor[]): this {\r\n // Adding two (or more) polyfactors:\r\n // if both are numerators only, use the common polynom\r\n // if there are denominators, multiply every polyfactors to match the lcm polyfactor.\r\n\r\n const numerators: PolyFactor[] = [this.numerator, ...values.map(x => x.numerator)]\r\n const denominators: PolyFactor[] = [this.denominator, ...values.map(x => x.denominator)]\r\n\r\n let denominator: PolyFactor | undefined\r\n if (denominators.some(d => d.factors.length > 0)) {\r\n // At least one of the denominators is not empty.\r\n const lcm = PolyFactor.lcm(...denominators)\r\n\r\n // Multiply each numerators by the complementary.\r\n numerators.forEach((n, index) => {\r\n n.multiply(lcm.clone().divide(denominators[index]))\r\n })\r\n\r\n // Set the common denominator to the lcm PolyFctor\r\n denominator = lcm\r\n }\r\n\r\n // Now, every polyfactor should have a common denominator. Just add the numerators.\r\n const gcd = PolyFactor.gcd(...numerators)\r\n const remainingPolynom = new Polynom(0)\r\n .add(...numerators.map(pf => {\r\n return pf\r\n .divide(gcd).reduce()\r\n .develop() // should be a polyfactor with one factor, with a power of 1\r\n .factors[0]\r\n .polynom\r\n })\r\n ).reduce()\r\n\r\n this.#factors = [\r\n ...gcd.factors,\r\n new Factor(remainingPolynom)\r\n ]\r\n\r\n if (denominator) {\r\n this.divide(denominator)\r\n }\r\n\r\n // Remove all factors with a power of zero\r\n this.#factors = this.#factors.filter(x => !x.power.isZero())\r\n\r\n return this\r\n }\r\n\r\n get asPower(): this {\r\n this.#displayMode = FACTOR_DISPLAY.POWER\r\n return this\r\n }\r\n\r\n get asRoot(): this {\r\n this.#displayMode = FACTOR_DISPLAY.ROOT\r\n return this\r\n }\r\n\r\n public degree(letter?: string): Fraction {\r\n return this.#factors.reduce((acc, f) => acc.add(f.degree(letter)), new Fraction('0'))\r\n }\r\n\r\n get denominator(): PolyFactor {\r\n return new PolyFactor(...this.#factors\r\n .filter(f => f.power.isNegative())\r\n .map(f => f.clone().inverse())\r\n )\r\n }\r\n\r\n public derivative(): this {\r\n // (fgh)' = f'gh+fg'h+fgh'\r\n // dPF = [f'gh, fg'h, fgh']\r\n const dPF: PolyFactor[] = []\r\n\r\n const length = this.#factors.length\r\n\r\n for (let i = 0; i < length; i++) {\r\n // unchanged factors\r\n const factors = this.#factors.slice()\r\n // derivative factor\r\n const derivativeFactor = factors.splice(i, 1)[0].derivative()\r\n // Add the product of factors\r\n dPF.push(\r\n new PolyFactor(...factors, ...derivativeFactor))\r\n }\r\n\r\n // Reduce the polyFactors\r\n dPF.forEach(pf => pf.reduce())\r\n\r\n const first = dPF.shift()\r\n if (first !== undefined) {\r\n this.#factors = first.factors\r\n }\r\n\r\n // Add each factors together.\r\n return this.add(...dPF)\r\n }\r\n\r\n public develop(): PolyFactor {\r\n // Develop each factor and multiply them\r\n const N = new Polynom('1')\r\n const D = new Polynom('1')\r\n\r\n this.numerator.factors.forEach(f => {\r\n N.multiply(f.develop())\r\n })\r\n this.denominator.factors.forEach(f => {\r\n D.multiply(f.develop())\r\n })\r\n\r\n return new PolyFactor().fromPolynom(N, D)\r\n }\r\n\r\n public divide(value: PolyFactor): this {\r\n this.#factors = this.#factors.concat(value.clone().factors.map(f => f.inverse()))\r\n return this\r\n }\r\n\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean): number | Fraction {\r\n if (asNumeric) {\r\n return this.#factors\r\n .reduce((acc, f) => acc * (f.evaluate(values, asNumeric) as number), 1)\r\n }\r\n\r\n return this.#factors\r\n .reduce((acc, f) => acc.multiply(f.evaluate(values)), new Fraction('1'))\r\n }\r\n\r\n public factorize(letter?: string): PolyFactor {\r\n // Go through each factors.\r\n // If it can be factorized, remove the factor (set its power to zero) and insert the new factors instead.\r\n const newFactors: Factor[] = []\r\n\r\n this.#factors.forEach(factor => {\r\n const factors = factor.polynom.factorize(letter)\r\n if (factors.length > 1) {\r\n const pow = factor.power.clone()\r\n newFactors.push(...factors.map(x => new Factor(x, pow)))\r\n } else {\r\n newFactors.push(factor.clone())\r\n }\r\n })\r\n\r\n const result = new PolyFactor(...newFactors)\r\n const numerator = result.numerator.reduce()\r\n const denominator = result.denominator.reduce()\r\n\r\n return numerator.divide(denominator)\r\n }\r\n\r\n public get factors(): Factor[] {\r\n return this.#factors\r\n }\r\n\r\n public set factors(value: Factor[]) {\r\n this.#factors = value\r\n }\r\n\r\n public fromPolynom(numerator: InputAlgebra<Polynom>, denominator?: InputAlgebra<Polynom>): this {\r\n // fromPolynom loads the numerator and denominator as is, without factorizing !\r\n this.#factors = [new Factor(new Polynom(numerator))]\r\n\r\n if (denominator) {\r\n const polynom = new Polynom(denominator)\r\n\r\n if (polynom.isOne()) {\r\n return this\r\n }\r\n if (polynom.isZero()) {\r\n throw new Error(\"Cannot divide by zero\")\r\n }\r\n this.#factors.push(new Factor(polynom, -1))\r\n }\r\n // // Find all factors from a polynom\r\n // this.#factors = new Polynom(numerator)\r\n // .factorize(letter)\r\n // .map(value => new Factor(value))\r\n //\r\n // if (denominator) {\r\n // new Polynom(denominator)\r\n // .factorize(letter)\r\n // .forEach(value => this.#factors.push(new Factor(value, -1)))\r\n // }\r\n\r\n return this\r\n }\r\n\r\n public getZeroes(): ISolution[] {\r\n // Calculate the list of roots (ordered, unique)\r\n const roots: ISolution[] = ([] as ISolution[])\r\n .concat(...this.#factors.map(x => x.polynom.getZeroes()))\r\n // .concat(...tos.map(x => x.roots))\r\n\r\n // Sort the values.\r\n roots.sort((a, b) => a.value - b.value)\r\n // Remove duplicates.\r\n return roots\r\n .filter((value, index, self) =>\r\n index === self.findIndex((t) =>\r\n t.value === value.value\r\n )\r\n )\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.#factors.some(f => f.hasVariable(letter))\r\n }\r\n\r\n public inverse(): this {\r\n this.#factors = this.#factors.map(f => f.inverse())\r\n return this\r\n }\r\n\r\n public isEqual(value: PolyFactor): boolean {\r\n const gcd = PolyFactor.gcd(this, value)\r\n\r\n const PF1 = this.clone().divide(gcd).reduce()\r\n const PF2 = value.clone().divide(gcd).reduce()\r\n\r\n return PF1.isOne() && PF2.isOne()\r\n }\r\n\r\n public isOne(): boolean {\r\n return this.#factors.every(f => f.isOne())\r\n }\r\n\r\n public isZero(): boolean {\r\n return this.#factors.every(f => f.isZero())\r\n }\r\n\r\n public multiply(...values: PolyFactor[]): this {\r\n values.forEach(value => {\r\n this.#factors = this.#factors.concat(value.clone().factors)\r\n })\r\n\r\n return this\r\n }\r\n\r\n get numerator(): PolyFactor {\r\n return new PolyFactor(...this.#factors.filter(f => f.power.isPositive()))\r\n }\r\n\r\n public one(): this {\r\n this.#factors = [new Factor('1', '1')]\r\n return this\r\n }\r\n\r\n public opposite(): this {\r\n // Add the -1 factor or remove if it exists\r\n const index = this.#factors.findIndex(f => f.display === '(-1)')\r\n\r\n if (index >= 0) {\r\n this.#factors.splice(index, 1)\r\n } else {\r\n this.#factors.push(new Factor('-1', '1'))\r\n }\r\n\r\n return this\r\n }\r\n\r\n public pow(value: number | Fraction): this {\r\n this.#factors = this.#factors.map(f => f.pow(value))\r\n return this\r\n }\r\n\r\n public primitive(): PolyFactor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public reduce(): this {\r\n // Regroup the factors by their base\r\n const factors = keyFactors(this)\r\n\r\n // Multiply the factors of the same base\r\n this.#factors = Object.values(factors)\r\n .map(f => {\r\n const base = f[0].polynom\r\n const power = f.reduce((acc, f) => acc.add(f.power), new Fraction('0'))\r\n return new Factor(base, power.reduce())\r\n })\r\n .filter(f => !f.power.isZero())\r\n\r\n return this\r\n }\r\n\r\n public root(value: number): this {\r\n this.#factors = this.#factors.map(f => f.root(value))\r\n return this\r\n }\r\n\r\n /**\r\n * Reoarder the factors using :\r\n * 1. number of monoms\r\n * 2. degree of polynom\r\n * 3. power of polyfactor\r\n */\r\n public sort(letter?: string): this {\r\n this.#factors.sort((a, b) => {\r\n // If the compare powers are opposite, the negative power goes to the end.\r\n const aPower = a.power.value\r\n const bPower = b.power.value\r\n if (aPower * bPower < 0) {\r\n return -aPower\r\n }\r\n\r\n\r\n // Monom length\r\n const aLength = a.polynom.monoms.length\r\n const bLength = b.polynom.monoms.length\r\n if (aLength !== bLength) {\r\n return aLength - bLength\r\n }\r\n\r\n // The monom length are the same, check the polynom degree.\r\n const aDegree = a.polynom.degree(letter).value\r\n const bDegree = b.polynom.degree(letter).value\r\n if (aDegree !== bDegree) {\r\n return aDegree - bDegree\r\n }\r\n\r\n // The power of the PolyFactor\r\n if (aPower !== bPower) {\r\n return aPower - bPower\r\n }\r\n\r\n return a.degree().isLeq(b.degree()) ? -1 : 1\r\n })\r\n\r\n return this\r\n }\r\n\r\n public sqrt(): this {\r\n this.#factors = this.#factors.map(f => f.sqrt())\r\n return this\r\n }\r\n\r\n public subtract(...values: PolyFactor[]): this {\r\n return this.add(...values.map(f => f.opposite()))\r\n }\r\n\r\n public tableOfSigns(): POLYFACTOR_TABLE_OF_SIGNS {\r\n // Calculate the table of signs for each factor\r\n const roots = this.getZeroes()\r\n const roots_key = roots.map(x => x.value)\r\n\r\n // Get the table of signs of every factors\r\n // These signs are NOT aligned\r\n const factors: FACTOR_TABLE_OF_SIGNS[] = this.factors\r\n .map(factor => {\r\n return {factor: new Factor(factor), ...factor.tableOfSigns()}\r\n })\r\n\r\n // Build the table of signs with extra roots.\r\n factors.forEach(item => {\r\n // Create the new signs row\r\n const empty_signs: TABLE_OF_SIGNS_VALUES[] = new Array(2 * roots.length + 1).fill('') as unknown as TABLE_OF_SIGNS_VALUES[]\r\n\r\n let sign = item.signs.shift() as unknown as TABLE_OF_SIGNS_VALUES\r\n let root = item.roots.shift()\r\n\r\n const aligned_signs = empty_signs.map((_sign, index) => {\r\n if (index % 2 === 0) {\r\n return sign\r\n }\r\n\r\n // The sign for this indexed root is a t(ab)\r\n if (root === undefined || root.value !== roots_key[(index - 1) / 2]) {\r\n return 't'\r\n }\r\n\r\n // The indexed root is the new root\r\n const rootSign = item.signs.shift() as unknown as TABLE_OF_SIGNS_VALUES\r\n\r\n // Make the new signs.\r\n sign = item.signs.shift() as unknown as TABLE_OF_SIGNS_VALUES\r\n root = item.roots.shift()\r\n return rootSign\r\n })\r\n\r\n // Set the roots for this item to all roots\r\n item.roots = roots\r\n item.signs = aligned_signs\r\n })\r\n\r\n // Build the table of signs with extra roots\r\n const signs: TABLE_OF_SIGNS_VALUES[] = factors\r\n .map((item) => item.signs)\r\n .reduce<TABLE_OF_SIGNS_VALUES[]>((a, b) => {\r\n if (a.length === 0) {\r\n return b\r\n }\r\n\r\n // a and b are \"not aligned\"\r\n b.forEach((value, index) => {\r\n // Case of a zero, invalid or tab value\r\n // tab < zero < defence\r\n switch (value) {\r\n case \"d\":\r\n a[index] = \"d\"\r\n break\r\n case \"z\":\r\n a[index] = a[index] === \"d\" ? \"d\" : \"z\"\r\n break\r\n case \"h\":\r\n a[index] = \"h\"\r\n break\r\n case \"-\":\r\n a[index] = a[index] === \"h\" ? \"h\" : a[index] === \"-\" ? \"+\" : \"-\"\r\n break\r\n }\r\n })\r\n\r\n return a\r\n }, [])\r\n\r\n return {signs, roots, factors}\r\n }\r\n\r\n public get variables(): string[] {\r\n return this.#factors\r\n .reduce((acc: string[], f: Factor) => acc.concat(f.variables), [])\r\n }\r\n\r\n public zero(): this {\r\n this.#factors = [new Factor('0', '1')]\r\n return this\r\n }\r\n\r\n #extractNumeratorAndDenominator() {\r\n let num: Factor[],\r\n den: Factor[] = []\r\n\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT) {\r\n // the power are positive integers\r\n num = this.numerator.factors\r\n den = this.denominator.factors\r\n } else {\r\n num = this.#factors\r\n }\r\n\r\n // There is no factor\r\n if (num.length === 0) {\r\n num = [new Factor('1')]\r\n }\r\n return {num, den}\r\n }\r\n\r\n}\r\n\r\nfunction keyFactors(value: PolyFactor): Record<string, Factor[]> {\r\n const k_numerator = new Fraction().one()\r\n const k_denominator = new Fraction().one()\r\n\r\n const kF = value.factors\r\n .reduce((acc: Record<string, Factor[]>, f) => {\r\n // It's only a value\r\n if (f.polynom.degree().isZero()) {\r\n if (f.power.isPositive()) {\r\n k_numerator.multiply(f.polynom.monoms[0].coefficient)\r\n } else {\r\n k_denominator.multiply(f.polynom.monoms[0].coefficient)\r\n }\r\n\r\n return acc\r\n }\r\n\r\n // It's a polynom\r\n const base = f.polynom.display\r\n if (Object.hasOwn(acc, base)) {\r\n acc[base].push(f)\r\n } else {\r\n acc[base] = [f]\r\n }\r\n\r\n return acc\r\n }, {})\r\n\r\n\r\n const {numerator, denominator} = k_numerator.divide(k_denominator).reduce()\r\n if(numerator!==1){\r\n kF[numerator.toString()] = [new Factor(numerator, 1)]\r\n }\r\n if(denominator!==1){\r\n kF[denominator.toString()] = [new Factor(denominator, -1)]\r\n }\r\n\r\n return kF\r\n}\r\n","import { Fraction } from \"../coefficients/fraction\"\r\nimport type { Vector } from \"./vector\"\r\n\r\ntype V = Vector\r\nexport function areVectorsEquals(v1: V, v2: V): boolean {\r\n return v1.dimension === v2.dimension &&\r\n v1.array.every(\r\n (value, index) => {\r\n return v2.array[index].isEqual(value)\r\n })\r\n}\r\n\r\nexport function areVectorsColinears(v1: V, v2: V): boolean {\r\n if (v1.dimension !== v2.dimension) { return false }\r\n\r\n // Constant of proportionality\r\n const k = v2.array[0].value / v1.array[0].value\r\n return v1.array.every(\r\n (value, index) => {\r\n return v2.array[index].value === value.value * k\r\n })\r\n}\r\n\r\n\r\nexport function dotProduct(v1: V, v2: V): Fraction {\r\n if (v1.dimension !== v2.dimension) { return new Fraction().invalid() }\r\n\r\n // Calculate the dot product\r\n // Why does the reduce not add the last element?\r\n\r\n return v1.array.reduce(\r\n (acc, value, index) => {\r\n return acc.add(value.clone().multiply(v2.array[index]))\r\n }, new Fraction(0))\r\n}\r\n\r\nexport function determinant(...values: V[]): Fraction {\r\n // TODO: Make it work for vectors of dimension n\r\n // Check if the vectors are in the same dimension\r\n if (values.some((value) => value.dimension !== values[0].dimension)) {\r\n throw new Error('All vectors must have the same dimension')\r\n }\r\n\r\n // Check if the vectors are in dimension 2 or 3 and that the number of values is correct\r\n if (values[0].dimension !== values.length ) {\r\n throw new Error(`The determinant of dimension ${values[0].dimension} must have the same number of vectors (${values.length} given)`)\r\n }\r\n\r\n // Calculate the determinant 2x2\r\n if (values[0].dimension === 2) {\r\n return values[0].array[0].clone().multiply(values[1].array[1])\r\n .subtract(values[0].array[1].clone().multiply(values[1].array[0]))\r\n }\r\n\r\n // Calculate the determinant 3x3\r\n return values[0].array[0].clone()\r\n .multiply(\r\n values[1].array[1].clone().multiply(values[2].array[2])\r\n .subtract(values[1].array[2].clone().multiply(values[2].array[1]))\r\n )\r\n .subtract(values[0].array[1].clone()\r\n .multiply(\r\n values[1].array[0].clone().multiply(values[2].array[2])\r\n .subtract(values[1].array[2].clone().multiply(values[2].array[0]))\r\n )\r\n )\r\n .add(values[0].array[2].clone()\r\n .multiply(values[1].array[0].clone().multiply(values[2].array[1])\r\n .subtract(values[1].array[1].clone().multiply(values[2].array[0]))))\r\n}\r\n","/**\r\n * Vector2D module contains everything necessary to handle 2d vectors.\r\n * @module Vector\r\n */\r\nimport type { InputValue, IPiMathObject } from \"../pimath.interface\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Numeric } from \"../numeric\"\r\nimport { areVectorsColinears, areVectorsEquals, dotProduct } from \"./geomMath\"\r\n\r\nexport class Vector implements\r\n IPiMathObject<Vector> {\r\n #array: Fraction[] = []\r\n #asPoint = false\r\n\r\n constructor(...values: Vector[] | InputValue<Fraction>[]) {\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n };\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get array(): Fraction[] {\r\n return this.#array\r\n }\r\n\r\n set array(value: Fraction[]) {\r\n this.#array = value\r\n }\r\n\r\n get x(): Fraction {\r\n return this.#array[0]\r\n }\r\n\r\n set x(value: Fraction | number | string) {\r\n this.#array[0] = new Fraction(value)\r\n }\r\n\r\n get y(): Fraction {\r\n return this.#array[1]\r\n }\r\n\r\n set y(value: Fraction | number | string) {\r\n this.#array[1] = new Fraction(value)\r\n }\r\n\r\n get z(): Fraction {\r\n if (this.dimension < 3) { throw new Error('Vector is not 3D') }\r\n return this.#array[2]\r\n }\r\n\r\n set z(value: Fraction | number | string) {\r\n if (this.dimension < 3) { throw new Error('Vector is not 3D') }\r\n this.#array[2] = new Fraction(value)\r\n }\r\n\r\n get asPoint(): boolean {\r\n return this.#asPoint\r\n }\r\n\r\n set asPoint(value: boolean) {\r\n this.#asPoint = value\r\n }\r\n\r\n\r\n get normSquare(): Fraction {\r\n // Get the norm square of the vector\r\n return this.array.reduce((acc, x) => acc.add(x.clone().pow(2)), new Fraction(0))\r\n }\r\n\r\n get norm(): number {\r\n return Math.sqrt(this.normSquare.value)\r\n }\r\n\r\n get tex(): string {\r\n if (this.#asPoint) {\r\n return `\\\\left(${this.array.map(x => x.tex).join(';')}\\\\right)`\r\n }\r\n\r\n return `\\\\begin{pmatrix} ${this.array.map(x => x.tex).join(' \\\\\\\\ ')} \\\\end{pmatrix}`\r\n }\r\n\r\n get display(): string {\r\n if (this.#asPoint) {\r\n return `(${this.array.map(x => x.display).join(';')})`\r\n }\r\n\r\n return `((${this.array.map(x => x.display).join(',')}))`\r\n }\r\n\r\n setDimension(value = 2): this{\r\n if (value < 2) {\r\n throw new Error('Dimension must be at least 2')\r\n }\r\n\r\n if (value < this.dimension) {\r\n this.#array = this.#array.slice(0, value)\r\n } else if(value > this.dimension) {\r\n for(let i = this.dimension; i < value; i++) {\r\n this.#array.push(new Fraction(0))\r\n }\r\n }\r\n\r\n return this\r\n }\r\n get dimension(): number {\r\n return this.array.length\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n get isNull(): boolean {\r\n return this.array.every(x => x.isZero())\r\n }\r\n\r\n static asTex(...values: string[]): string {\r\n return `\\\\begin{pmatrix} ${values.join(' \\\\\\\\ ')} \\\\end{pmatrix}`\r\n }\r\n static asDisplay(...values: string[]): string {\r\n return `((${values.join(',')}))`\r\n }\r\n\r\n public defineAsPoint(value?: boolean): this {\r\n this.#asPoint = value !== false\r\n return this\r\n }\r\n public parse(...values: Vector[] | InputValue<Fraction>[]): this {\r\n if (values.length === 0) {\r\n throw new Error(`Invalid value`)\r\n }\r\n\r\n if (values.length === 1) {\r\n if (values[0] instanceof Vector) {\r\n return values[0].clone() as this\r\n } else if (typeof values[0] === 'string') {\r\n return this.fromString(values[0])\r\n } else {\r\n throw new Error(`Invalid value`)\r\n }\r\n }\r\n\r\n // Two values are given\r\n if (values.length === 2) {\r\n const [A, B] = values\r\n\r\n // The two values are vectors\r\n if (A instanceof Vector && B instanceof Vector) {\r\n if (A.dimension !== B.dimension) { throw new Error('Vectors must have the same dimension') }\r\n\r\n this.#array = B.array.map((x, index) => x.clone().subtract(A.array[index]))\r\n return this\r\n }\r\n }\r\n\r\n // Two ore more values as number, string, fraction...\r\n this.#array = values.map(x => new Fraction(x as InputValue<Fraction>))\r\n\r\n return this\r\n }\r\n\r\n public clone(): Vector {\r\n const V = new Vector()\r\n V.array = this.copy()\r\n V.asPoint = this.asPoint\r\n return V\r\n }\r\n\r\n public copy(): Fraction[] {\r\n return this.#array.map(x => x.clone())\r\n }\r\n\r\n zero = (): this => {\r\n this.#array.forEach(x => x.zero())\r\n return this\r\n }\r\n\r\n one = (): this => {\r\n this.zero()\r\n this.x.one()\r\n return this\r\n }\r\n\r\n opposite = (): this => {\r\n this.#array.forEach(x => x.opposite())\r\n return this\r\n }\r\n\r\n add = (V: Vector): this => {\r\n this.#array.forEach((x, index) => x.add(V.array[index]))\r\n return this\r\n }\r\n\r\n subtract = (V: Vector): this => {\r\n return this.add(V.clone().opposite())\r\n }\r\n\r\n unit = (): this => {\r\n const norm = this.norm\r\n if (norm === 0) {\r\n return this\r\n }\r\n\r\n return this.divideByScalar(norm)\r\n }\r\n\r\n middleOf(V1: Vector, V2: Vector): this {\r\n if (V1.dimension !== V2.dimension) { throw new Error('Vectors must be the same dimension') }\r\n\r\n this.array = []\r\n V1.array.forEach((x, index) => {\r\n this.array.push(x.clone().add(V2.array[index]).divide(2))\r\n })\r\n\r\n return this\r\n }\r\n\r\n translate(...values: Fraction[]): this {\r\n this.array.forEach((x, index) => x.add(values[index]))\r\n return this\r\n }\r\n\r\n\r\n dot = (V: Vector): Fraction => {\r\n return dotProduct(this, V)\r\n }\r\n\r\n cross(value: Vector): Vector {\r\n if (this.dimension !== 3 || value.dimension !== 3) {\r\n throw new Error('Cross product can only be determined in 3D')\r\n }\r\n\r\n return new Vector(\r\n this.y.clone().multiply(value.z).subtract(this.z.clone().multiply(value.y)),\r\n this.z.clone().multiply(value.x).subtract(this.x.clone().multiply(value.z)),\r\n this.x.clone().multiply(value.y).subtract(this.y.clone().multiply(value.x))\r\n )\r\n }\r\n\r\n normal = (): this => {\r\n if (this.dimension >= 3) { throw new Error('Normal vector can only be determined in 2D') }\r\n\r\n const x = this.x.clone().opposite(),\r\n y = this.y.clone()\r\n this.#array[0] = y\r\n this.#array[1] = x\r\n return this\r\n }\r\n\r\n isZero(): boolean {\r\n return this.array.every(x => x.isZero())\r\n }\r\n isOne(): boolean {\r\n return this.array.every((x, index) => index === 0 ? x.isOne() : x.isZero())\r\n }\r\n\r\n isEqual = (v: Vector): boolean => {\r\n return areVectorsEquals(this, v)\r\n }\r\n\r\n isColinearTo = (v: Vector): boolean => {\r\n return areVectorsColinears(this, v)\r\n }\r\n\r\n isNormalTo = (v: Vector): boolean => {\r\n return this.dot(v).isZero()\r\n }\r\n\r\n multiplyByScalar = (k: InputValue<Fraction>): this => {\r\n const scalar = new Fraction(k)\r\n this.array.forEach(x => x.multiply(scalar))\r\n return this\r\n }\r\n\r\n divideByScalar = (k: InputValue<Fraction>): this => {\r\n return this.multiplyByScalar(new Fraction(k).inverse())\r\n }\r\n\r\n simplify = (): this => {\r\n // Multiply by the lcm of denominators.\r\n return this\r\n .multiplyByScalar(\r\n Numeric.lcm(...this.array.map(x => x.denominator))\r\n )\r\n .divideByScalar(\r\n Numeric.gcd(...this.array.map(x => x.numerator))\r\n ).\r\n multiplyByScalar(\r\n this.x.isNegative() ? -1 : 1\r\n )\r\n }\r\n\r\n angle = (V: Vector, sharp?: boolean, radian?: boolean): number => {\r\n\r\n let scalar = this.dot(V).value\r\n if (sharp) {\r\n scalar = Math.abs(scalar)\r\n }\r\n\r\n const toDegree = radian ? 1 : 180 / Math.PI\r\n\r\n return toDegree * Math.acos(scalar / (this.norm * V.norm))\r\n }\r\n\r\n\r\n fromString = (value: string): this => {\r\n // Remove the first letter if it's a parenthesis.\r\n if (value.startsWith('(')) {\r\n value = value.substring(1)\r\n }\r\n\r\n // Remove the last letter if it's a parenthesis.\r\n if (value.endsWith(')')) {\r\n value = value.substring(0, value.length - 1)\r\n }\r\n\r\n // Split comma, semi colon or single space.\r\n const components = value.split(/[,;\\s]/g)\r\n .filter((v) => v.trim() !== '')\r\n\r\n // there must be at least two components.\r\n if (components.length < 2) {\r\n return this\r\n }\r\n\r\n // Validate the fraction values.\r\n this.#array = components.map(x => new Fraction(x))\r\n return this\r\n }\r\n\r\n distanceTo(item: Vector): { value: number, fraction: Fraction, tex: string } {\r\n const V = new Vector(this, item)\r\n\r\n return {\r\n value: V.norm,\r\n fraction: V.normSquare,\r\n tex: V.tex\r\n }\r\n }\r\n}\r\n","import type { Fraction } from \"./coefficients\"\r\nimport type { NthRoot } from \"./coefficients\"\r\nimport type { Monom } from \"./algebra\"\r\nimport type {Factor} from \"./algebra\"\r\nimport type {Line, Point, Vector} from \"./geometry\"\r\nimport type {Equation} from \"./algebra\"\r\n\r\nexport type InputValue<T> = T | string | number | Fraction | NthRoot;\r\nexport type InputAlgebra<T> = InputValue<T> | Monom\r\nexport type literalType<T> = Record<string, T>;\r\n\r\nexport type compareSign =\r\n '>' | \">=\" | \"=>\" | \"geq\" |\r\n '<' | \"<=\" | \"=<\" | \"leq\" |\r\n '=' | \"<>\" | \"neq\" | \"same\";\r\n\r\nexport type EQUATION_SIGN = \"=\" | \"<=\" | \">=\" | \"<\" | \">\"\r\n\r\nexport enum PARTICULAR_SOLUTION {\r\n real = \"\\\\mathbb{R}\",\r\n varnothing = \"\\\\varnothing\"\r\n}\r\n\r\nexport interface IPiMathObject<T> {\r\n readonly tex: string\r\n readonly display: string\r\n\r\n clone(): T;\r\n\r\n parse(...value: unknown[]): T;\r\n}\r\n\r\nexport interface IExpression<T> {\r\n isEqual(value: InputValue<T>): boolean;\r\n\r\n zero(): T;\r\n\r\n one(): T;\r\n\r\n isZero(): boolean;\r\n\r\n isOne(): boolean;\r\n\r\n add(value: InputValue<T>): T;\r\n\r\n subtract(value: InputValue<T>): T;\r\n\r\n opposite(): T;\r\n\r\n multiply(value: InputValue<T>): T;\r\n\r\n divide(value: InputValue<T>): T | null;\r\n\r\n reduce(): T;\r\n\r\n inverse(): T | undefined;\r\n\r\n sqrt(): T | undefined;\r\n\r\n pow(value: number): T;\r\n\r\n root(value: number): T | undefined;\r\n}\r\n\r\nexport interface IEquation<T> {\r\n\r\n reduce(): T;\r\n\r\n solve(): ISolution[]\r\n}\r\n\r\nexport interface IAlgebra<T> {\r\n readonly variables: string[];\r\n\r\n hasVariable(letter: string): boolean;\r\n\r\n degree(letter?: string): Fraction;\r\n\r\n evaluate(values: literalType<Fraction | number> | InputValue<Fraction>, asNumeric?: boolean): Fraction | number | boolean;\r\n}\r\n\r\nexport interface IAnalyse<T> {\r\n derivative(): T | T[];\r\n\r\n primitive(): T;\r\n\r\n integrate(a: InputValue<Fraction>, b: InputValue<T>, letter?: string): Fraction;\r\n}\r\n\r\nexport interface ISolution {\r\n variable: string,\r\n display: string,\r\n exact: Fraction | boolean\r\n tex: string,\r\n value: number,\r\n}\r\n\r\nexport type TABLE_OF_SIGNS_VALUES = '-'|'+'|'h'|'z'|'t'|'d'|'u'|'n'|''\r\n\r\nexport interface TABLE_OF_SIGNS {roots: ISolution[], signs: TABLE_OF_SIGNS_VALUES[]}\r\nexport interface FACTOR_TABLE_OF_SIGNS extends TABLE_OF_SIGNS {factor: Factor}\r\nexport interface POLYFACTOR_TABLE_OF_SIGNS extends TABLE_OF_SIGNS {\r\n factors: FACTOR_TABLE_OF_SIGNS[]\r\n}\r\n\r\nexport enum LinePropriety {\r\n None = 'none',\r\n Parallel = 'parallel',\r\n Perpendicular = 'perpendicular',\r\n Tangent = 'tangent'\r\n}\r\n\r\nexport enum Line3Propriety {\r\n None = 'none',\r\n Parallel = 'parallel',\r\n Perpendicular = 'perpendicular',\r\n Tangent = 'tangent'\r\n}\r\n\r\nexport interface Plane3Config {\r\n point?: Point,\r\n normal?: Vector,\r\n directions?: Vector[],\r\n equation?: Equation,\r\n points?: Point[],\r\n coefficients?: number[]\r\n}\r\n\r\n\r\nexport interface remarquableLines {\r\n 'medians': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n },\r\n 'mediators': {\r\n 'AB': Line,\r\n 'AC': Line,\r\n 'BC': Line,\r\n 'intersection': Vector | null\r\n },\r\n 'heights': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n },\r\n 'bisectors': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n },\r\n externalBisectors: {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n }\r\n}\r\n","/**\r\n * Random helpers\r\n */\r\nimport { Numeric } from \"../numeric\"\r\n\r\n\r\n/**\r\n * Random boolean with a percent ratio\r\n * @param percent\r\n */\r\nexport function randomBool(percent = 0.5): boolean {\r\n return Math.random() < percent\r\n}\r\n\r\n/**\r\n * Random integer between two values.\r\n * @param a (number) : From this value to the second value. If the second is ommited, this value is the max value.\r\n * @param b (number) : To this value. If this is ommited.\r\n */\r\nexport function randomInt(a: number, b?: number, exclude?: number[]): number {\r\n if (b === undefined) {\r\n if (a >= 0) {\r\n return randomInt(0, a)\r\n } else {\r\n return randomInt(a, 0)\r\n }\r\n }\r\n\r\n // Same start and end values\r\n if (a === b) {\r\n return a\r\n }\r\n\r\n // No exclusion\r\n if (exclude === undefined) {\r\n return Math.floor(Math.random() * (b - a + 1) + a)\r\n }\r\n\r\n // With exclusion\r\n if (Math.abs(b - a) <= exclude.length) {\r\n throw new Error('The number of excluded values is too high.')\r\n }\r\n\r\n let r = randomInt(a, b)\r\n while (exclude.includes(r)) {\r\n r = randomInt(a, b)\r\n }\r\n return r\r\n}\r\n\r\n/**\r\n * Random integer between -max and max value.\r\n * @param max (number) : determine the limits.\r\n * @param zero (bool) : determine if zero is allowed or not.\r\n */\r\nexport function randomIntSym(max: number, zero?: boolean): number {\r\n if (zero === false) {\r\n return randomBool() ? randomInt(1, max) : -randomInt(1, max)\r\n } else {\r\n return randomInt(-max, max)\r\n }\r\n}\r\n\r\nexport function randomPrime(max?: number): number {\r\n let primes = Numeric.primes()\r\n if (max !== undefined) {\r\n primes = primes.filter(x => x < max)\r\n }\r\n return randomItem(primes)\r\n}\r\n\r\nexport function randomArray<T>(arr: T[], number?: number): T[] {\r\n if (number === undefined) {\r\n number = 1\r\n }\r\n\r\n // Return a clone array\r\n if (arr.length <= 0) {\r\n return Object.values(arr)\r\n }\r\n\r\n // Randomize the array and return the n first elements.\r\n return shuffleArray(arr).slice(0, number)\r\n}\r\n\r\nexport function randomItem<T>(arr: T[]): T {\r\n if (arr.length === 0) { return null as T }\r\n return arr[randomInt(0, arr.length - 1)]\r\n}\r\n\r\nexport function shuffleArray<T>(arr: T[]): T[] {\r\n // The Fisher-Yates algorithm\r\n const shuffleArray = Object.values(arr)\r\n for (let i = shuffleArray.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n const temp = shuffleArray[i]\r\n shuffleArray[i] = shuffleArray[j]\r\n shuffleArray[j] = temp\r\n }\r\n\r\n return shuffleArray\r\n}\r\n","/**\r\n * Vector2D module contains everything necessary to handle 2d vectors.\r\n * @module Point\r\n */\r\n\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport type { InputValue } from \"../pimath.interface\"\r\nimport { Vector } from \"./vector\"\r\n\r\nexport class Point extends Vector {\r\n\r\n constructor()\r\n constructor(value: Vector)\r\n constructor(start: Vector, end: Vector)\r\n constructor(...values: InputValue<Fraction>[])\r\n constructor(...values: Vector[] | InputValue<Fraction>[]) {\r\n super()\r\n\r\n // Initialize the vector\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n };\r\n\r\n public override parse(...values: Vector[] | InputValue<Fraction>[]): this {\r\n this.asPoint = true\r\n\r\n if (values.length === 1) {\r\n if (values[0] instanceof Vector) {\r\n this.array = values[0].copy()\r\n return this\r\n }\r\n\r\n if (typeof values[0] === 'string') {\r\n this.fromString(values[0])\r\n return this\r\n }\r\n }\r\n\r\n\r\n if (values.length > 1) {\r\n if (values.some(x => x instanceof Vector)) {\r\n throw new Error('Creating a point with multiple argument requires an input fraction')\r\n }\r\n\r\n const nbs: Fraction[] = values.map(x => new Fraction(x as InputValue<Fraction>))\r\n\r\n if (nbs.some(x => x.isNaN())) {\r\n throw new Error('The value is not a valid point sting (a,b): ' + values.join(','))\r\n }\r\n\r\n this.array = nbs\r\n }\r\n\r\n return this\r\n }\r\n\r\n\r\n public override clone(): Point {\r\n const V = new Point()\r\n V.array = this.copy()\r\n V.asPoint = true\r\n return V\r\n }\r\n\r\n}\r\n","/**\r\n * This class works for 2d line in a plane.\r\n */\r\n\r\nimport { Numeric } from \"../numeric\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Equation } from \"../algebra/equation\"\r\nimport { Polynom } from \"../algebra/polynom\"\r\nimport { Monom } from \"../algebra/monom\"\r\nimport { Vector } from \"./vector\"\r\nimport {type InputValue, type IPiMathObject, LinePropriety} from \"../pimath.interface\"\r\nimport { randomIntSym } from \"../randomization/rndHelpers\"\r\nimport { Point } from \"./point\"\r\n\r\nexport interface LineConfig {\r\n points?: Point[],\r\n point?: Point,\r\n direction?: Vector,\r\n normal?: Vector\r\n}\r\n\r\nexport class Line implements IPiMathObject<Line> {\r\n // A line is defined as the canonical form\r\n static PERPENDICULAR = LinePropriety.Perpendicular\r\n static PARALLEL = LinePropriety.Parallel\r\n #reduceBeforeDisplay: boolean\r\n // ax + by + c = 0\r\n #a: Fraction\r\n #b: Fraction\r\n #c: Fraction\r\n #OA: Vector\r\n #d: Vector\r\n #n: Vector\r\n\r\n #outputMode: 'canonical' | 'equation' | 'mxh' | 'parametric' | 'system' = \"canonical\"\r\n\r\n /**\r\n * Value can be a mix of:\r\n *\r\n * @param values\r\n */\r\n constructor(...values: unknown[]) {\r\n this.#a = new Fraction().zero()\r\n this.#b = new Fraction().zero()\r\n this.#c = new Fraction().zero()\r\n this.#OA = new Vector()\r\n this.#d = new Vector()\r\n this.#n = new Vector()\r\n\r\n this.#reduceBeforeDisplay = true\r\n\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n\r\n return this\r\n }\r\n\r\n get a(): Fraction {\r\n return this.#a\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n set a(value: Fraction) {\r\n this.#a = value\r\n }\r\n\r\n get b(): Fraction {\r\n return this.#b\r\n }\r\n\r\n set b(value: Fraction) {\r\n this.#b = value\r\n }\r\n\r\n get c(): Fraction {\r\n return this.#c\r\n }\r\n\r\n set c(value: Fraction) {\r\n this.#c = value\r\n }\r\n\r\n get OA(): Vector {\r\n return this.#OA\r\n }\r\n\r\n set OA(value: Vector) {\r\n this.#OA = value\r\n }\r\n\r\n get d(): Vector {\r\n return this.#d\r\n }\r\n\r\n set d(value: Vector) {\r\n this.#d = value\r\n }\r\n\r\n get n(): Vector {\r\n return this.#n\r\n }\r\n\r\n // ------------------------------------------\r\n getEquation(): Equation {\r\n const equ = new Equation(new Polynom().parse('xy', this.#a, this.#b, this.#c), new Polynom('0'))\r\n if (this.#reduceBeforeDisplay) {\r\n return equ.simplify()\r\n } else {\r\n return equ\r\n }\r\n }\r\n\r\n // get system(): { x: Equation, y: Equation } {\r\n // const e1 = new Equation(\r\n // new Polynom('x'),\r\n // new Polynom(this.#OA.x)\r\n // .add(new Monom('k').multiply(this.#d.x))\r\n // ),\r\n // e2 = new Equation(\r\n // new Polynom('y'),\r\n // new Polynom(this.#OA.y)\r\n // .add(new Monom('k').multiply(this.#d.y))\r\n // )\r\n\r\n // return { x: e1, y: e2 }\r\n // }\r\n\r\n get canonical(): this {\r\n this.#outputMode = 'canonical'\r\n return this\r\n }\r\n get equation(): this {\r\n this.#outputMode = 'equation'\r\n return this\r\n }\r\n get mxh(): this {\r\n this.#outputMode = 'mxh'\r\n return this\r\n }\r\n get parametric(): this {\r\n this.#outputMode = 'parametric'\r\n return this\r\n }\r\n get system(): this {\r\n this.#outputMode = 'system'\r\n return this\r\n }\r\n\r\n get tex(): string {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d\r\n // equation => ax + by = -c\r\n const output = this.#outputMode\r\n this.#outputMode = 'canonical'\r\n switch (output) {\r\n case 'equation':\r\n return this.getEquation().reorder().tex\r\n case 'mxh':\r\n return this.slope.isInfinity() ?\r\n 'x=' + this.OA.x.tex :\r\n 'y=' + new Polynom().parse('x', this.slope, this.height).tex\r\n case 'parametric':\r\n case 'system': {\r\n const d = this.#d.clone()\r\n if (this.#reduceBeforeDisplay) {\r\n d.simplify()\r\n }\r\n\r\n if (output === 'parametric') {\r\n return `${Vector.asTex('x', 'y')} = ${Vector.asTex(this.#OA.x.tex, this.#OA.y.tex)} + k\\\\cdot ${Vector.asTex(d.x.tex, d.y.tex)}`\r\n } else {\r\n return `\\\\left\\\\{\\\\begin{aligned}\r\n x &= ${(new Polynom(this.#OA.x)\r\n .add(new Monom(this.#d.x).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\ \r\n y &= ${(new Polynom(this.#OA.y)\r\n .add(new Monom(this.#d.y).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\r\n \\\\end{aligned}\\\\right.`\r\n }\r\n }\r\n default:\r\n {\r\n const canonical = this.getEquation()\r\n if (this.#a.isNegative()) {\r\n canonical.multiply(-1)\r\n }\r\n return canonical.tex\r\n }\r\n }\r\n\r\n }\r\n\r\n get reduceBeforeDisplay(): boolean {\r\n return this.#reduceBeforeDisplay\r\n }\r\n\r\n set reduceBeforeDisplay(value: boolean) {\r\n this.#reduceBeforeDisplay = value\r\n }\r\n\r\n get display(): string {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d // not relevant in display mode.\r\n const output = this.#outputMode\r\n this.#outputMode = 'canonical'\r\n\r\n switch (output) {\r\n case 'equation':\r\n return this.getEquation().reorder().display\r\n case 'mxh':\r\n return this.slope.isInfinity() ?\r\n 'x=' + this.OA.x.display :\r\n 'y=' + new Polynom().parse('x', this.slope, this.height).display\r\n case 'parametric': {\r\n const d = this.#d.clone()\r\n if (this.#reduceBeforeDisplay) {\r\n d.simplify()\r\n }\r\n\r\n return `((x,y))=((${this.#OA.x.display},${this.#OA.y.display}))+k((${d.x.display},${d.y.display}))`\r\n }\r\n default: {\r\n const canonical = this.getEquation()\r\n // Make sur the first item is positive.\r\n if (this.#a.isNegative()) {\r\n canonical.multiply(-1)\r\n }\r\n return canonical.display\r\n }\r\n\r\n }\r\n }\r\n\r\n get normal(): Vector {\r\n return new Vector(this.#a, this.#b)\r\n }\r\n\r\n get director(): Vector {\r\n return this.#d.clone()\r\n }\r\n\r\n get slope(): Fraction {\r\n return this.#a.clone().opposite().divide(this.#b)\r\n }\r\n\r\n get height(): Fraction {\r\n return this.#c.clone().opposite().divide(this.#b)\r\n }\r\n\r\n randomPoint = (k?: number): Point => {\r\n // Return a random point on the line.\r\n const pt = this.#d\r\n .clone()\r\n .multiplyByScalar(randomIntSym((k === undefined || k <= 1) ? 3 : k, false))\r\n .add(this.#OA)\r\n\r\n pt.asPoint = true\r\n\r\n return pt\r\n }\r\n\r\n randomNearPoint = (k?: number): Point => {\r\n const pt = this.randomPoint(k)\r\n\r\n let maxIterationTest = 10\r\n while (this.isOnLine(pt) && maxIterationTest > 0) {\r\n pt.x.add(randomIntSym(1, false))\r\n pt.y.add(randomIntSym(1, false))\r\n maxIterationTest--\r\n\r\n }\r\n\r\n return pt\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse data to a line\r\n * @param {any} values\r\n * @returns {Line}\r\n */\r\n parse = (...values: unknown[]): this => {\r\n // Nothing is given...\r\n if (values.length === 0) {\r\n return this\r\n }\r\n\r\n // One value only: already a line (clone it), an Equation, a string (as Equation)\r\n if (values.length === 1) {\r\n if (values[0] instanceof Line) {\r\n // Already a Line\r\n return this.fromCoefficient(values[0].a, values[0].b, values[0].c)\r\n } else if (values[0] instanceof Equation) {\r\n // It's an Equation\r\n return this.fromEquation(values[0])\r\n } else if (typeof values[0] === \"string\") {\r\n // It's a string - create an Equation from it.\r\n try {\r\n const E = new Equation(values[0])\r\n return this.parse(E)\r\n } catch (e) {\r\n return this\r\n }\r\n }\r\n }\r\n\r\n // Two values are given: two vectors\r\n if (values.length === 2 && values.every(x=>x instanceof Vector)) {\r\n const formattedValues: Vector[] = values\r\n\r\n if (formattedValues[0].asPoint && formattedValues[1].asPoint) {\r\n // Two points\r\n return this.fromPointAndDirection(formattedValues[0], new Vector(formattedValues[0], formattedValues[1]))\r\n }\r\n\r\n if (formattedValues[0].asPoint && !formattedValues[1].asPoint) {\r\n // One point and one vector director\r\n return this.fromPointAndDirection(formattedValues[0], formattedValues[1])\r\n }\r\n\r\n }\r\n\r\n if (values.length === 3) {\r\n if (values[0] instanceof Vector && values[1] instanceof Vector) {\r\n if (values[2] === LinePropriety.Perpendicular) {\r\n return this.fromPointAndNormal(values[0], values[1])\r\n } else if (values[2] === LinePropriety.Parallel) {\r\n return this.fromPointAndDirection(values[0], values[1])\r\n }\r\n }\r\n\r\n if (values[0] instanceof Vector && values[1] instanceof Line) {\r\n if (values[2] === LinePropriety.Parallel || values[2] === null) {\r\n return this.fromPointAndLine(values[0], values[1], LinePropriety.Parallel)\r\n } else {\r\n return this.fromPointAndLine(values[0], values[1], LinePropriety.Perpendicular)\r\n }\r\n }\r\n\r\n return this.fromCoefficient(\r\n values[0] as InputValue<Fraction>,\r\n values[1] as InputValue<Fraction>,\r\n values[2] as InputValue<Fraction>\r\n )\r\n }\r\n\r\n console.log('Something wrong happened while creating the line')\r\n console.log(values)\r\n return this\r\n }\r\n\r\n fromPoints(pt1: Point, pt2: Point){\r\n return this.fromPointAndDirection(pt1, new Vector(pt1, pt2))\r\n }\r\n fromEquation = (equ: Equation): this => {\r\n // Reorder the eequation\r\n equ.reorder(true)\r\n\r\n // It must contain either x, y or both.\r\n const letters = new Set(equ.letters())\r\n\r\n // No 'x', no 'y' in the equations\r\n if (!(letters.has('x') || letters.has('y'))) {\r\n return this\r\n }\r\n\r\n // Another letter in the equation ?\r\n for (const elem of ['x', 'y']) {\r\n if (letters.has(elem)) {\r\n letters.delete(elem)\r\n }\r\n }\r\n\r\n if (letters.size > 0) {\r\n return this\r\n }\r\n\r\n // Everything should be ok now...\r\n return this.fromCoefficient(\r\n equ.left.monomByLetter('x').coefficient,\r\n equ.left.monomByLetter('y').coefficient,\r\n equ.left.monomByDegree(0).coefficient\r\n )\r\n }\r\n fromCoefficient = (a: InputValue<Fraction>, b: InputValue<Fraction>, c: InputValue<Fraction>): this => {\r\n this.#a = new Fraction(a)\r\n this.#b = new Fraction(b)\r\n this.#c = new Fraction(c)\r\n\r\n this.#d = new Vector(this.#b.clone(), this.#a.clone().opposite())\r\n this.#OA = new Vector(new Fraction().zero(), this.#c.clone())\r\n this.#n = this.#d.clone().normal()\r\n\r\n return this\r\n }\r\n\r\n fromPointAndDirection = (P: Point, d: Vector): this => {\r\n // OX = OP + k*d\r\n // x = px + kdx * dy\r\n // y = py + kdy * dx\r\n // ------------------\r\n // dy * x = px * dy + kdxdy\r\n // dx * y = py * dx + kdxdy\r\n // ------------------\r\n // dy * x - dx * y = px * dy - py * dx\r\n // dy * x - dx * y - (px * dy - py * dx) = 0\r\n this.fromCoefficient(\r\n d.y,\r\n d.x.clone().opposite(),\r\n P.x.clone().multiply(d.y).subtract(P.y.clone().multiply(d.x)).opposite()\r\n )\r\n\r\n // Choose the current values as point and direction vector instead of the automatic version.\r\n this.#OA = P.clone()\r\n this.#d = d.clone()\r\n this.#n = this.#d.clone().normal()\r\n\r\n return this\r\n }\r\n\r\n fromPointAndNormal = (P: Point, n: Vector): this => {\r\n return this.fromCoefficient(\r\n n.x,\r\n n.y,\r\n P.x.clone().multiply(n.x)\r\n .add(P.y.clone().multiply(n.y)).opposite()\r\n )\r\n }\r\n\r\n fromPointAndLine = (P: Vector, L: Line, orientation?: LinePropriety): this => {\r\n\r\n if (orientation === undefined) {\r\n orientation = LinePropriety.Parallel\r\n }\r\n\r\n if (orientation === LinePropriety.Parallel) {\r\n return this.fromPointAndNormal(P, L.normal)\r\n } else if (orientation === LinePropriety.Perpendicular) {\r\n return this.fromPointAndNormal(P, L.director)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clone = (): this => {\r\n this.#a = this.#a.clone()\r\n this.#b = this.#b.clone()\r\n this.#c = this.#c.clone()\r\n\r\n this.#d = this.#d.clone()\r\n this.#OA = this.#OA.clone()\r\n this.#n = this.#n.clone()\r\n\r\n return this\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n isOnLine = (pt: Vector): boolean => {\r\n return this.#a.clone()\r\n .multiply(pt.x)\r\n .add(\r\n this.#b.clone()\r\n .multiply(pt.y)\r\n )\r\n .add(this.#c)\r\n .isZero()\r\n }\r\n\r\n isParallelTo = (line: Line): boolean => {\r\n // Do they have the isSame direction ?\r\n return this.slope.isEqual(line.slope) && this.height.isNotEqual(line.height)\r\n }\r\n isSameAs = (line: Line): boolean => {\r\n return this.slope.isEqual(line.slope) && this.height.isEqual(line.height)\r\n }\r\n isPerpendicularTo = (line: Line): boolean => {\r\n return this.d.isNormalTo(line.d)\r\n }\r\n isVertical = (): boolean => {\r\n return this.slope.isInfinity()\r\n }\r\n simplify = (): this => {\r\n const lcm = Numeric.lcm(this.#a.denominator, this.#b.denominator, this.#c.denominator),\r\n gcd = Numeric.gcd(this.#a.numerator, this.#b.numerator, this.#c.numerator)\r\n\r\n this.fromCoefficient(\r\n this.#a.clone().multiply(lcm).divide(gcd),\r\n this.#b.clone().multiply(lcm).divide(gcd),\r\n this.#c.clone().multiply(lcm).divide(gcd),\r\n )\r\n\r\n return this\r\n }\r\n\r\n simplifyDirection = (): this => {\r\n this.#d.simplify()\r\n return this\r\n }\r\n intersection = (line: Line): { point: Point, hasIntersection: boolean, isParallel: boolean, isSame: boolean } => {\r\n const Pt = new Point()\r\n let isParallel = false, isSame = false\r\n\r\n // this => ax+by+c = 0\r\n // line => dx+ey+f = 0\r\n //\r\n // aex + bey + ce = 0\r\n // dbx + bey + bf = 0\r\n // (ae-db)x + ce-bf = 0\r\n //\r\n // adx + bdy + cd = 0\r\n // adx + aey + af = 0\r\n // (bd-ae)y + (cd-af)\r\n //\r\n // x = (bf-ce)/(ae-db)\r\n // y = (af-cd)/(bd-ae)\r\n\r\n\r\n // Theres is no 'y'\r\n if (this.#b.isZero() || line.b.isZero()) {\r\n // TODO : handle no y in the line canonical form\r\n }\r\n\r\n if (this.isParallelTo(line)) {\r\n Pt.x = new Fraction().invalid()\r\n Pt.y = new Fraction().invalid()\r\n isParallel = true\r\n } else if (this.isSameAs(line)) {\r\n Pt.x = new Fraction().invalid()\r\n Pt.y = new Fraction().invalid()\r\n isSame = true\r\n } else {\r\n Pt.x = this.#b.clone().multiply(line.c).subtract(this.#c.clone().multiply(line.b))\r\n .divide(this.#a.clone().multiply(line.b).subtract(this.#b.clone().multiply(line.a)))\r\n Pt.y = this.#a.clone().multiply(line.c).subtract(this.#c.clone().multiply(line.a))\r\n .divide(this.#b.clone().multiply(line.a).subtract(this.#a.clone().multiply(line.b)))\r\n }\r\n\r\n return {\r\n point: Pt,\r\n hasIntersection: !(isParallel || isSame),\r\n isParallel,\r\n isSame\r\n }\r\n }\r\n\r\n distanceTo(pt: Point): { value: number, fraction: Fraction, tex: string } {\r\n const numerator = pt.x.clone().multiply(this.#a)\r\n .add(pt.y.clone().multiply(this.#b))\r\n .add(this.#c).abs(),\r\n d2 = this.normal.normSquare\r\n\r\n // The denominator is null - shouldn't be possible\r\n if (d2.isZero()) {\r\n return {\r\n value: NaN,\r\n tex: 'Not a line',\r\n fraction: new Fraction().infinite()\r\n }\r\n }\r\n // The denominator is a perfect square - simplify the tex result\r\n const value = numerator.value / Math.sqrt(d2.value),\r\n F = numerator.clone().divide(d2.clone().sqrt())\r\n\r\n // The denominator is a perfect square.\r\n if (d2.isSquare()) {\r\n return {\r\n value,\r\n tex: F.tex,\r\n fraction: F\r\n }\r\n }\r\n // Complete answer...\r\n return {\r\n value,\r\n tex: `\\\\frac{${numerator.tex}}{\\\\sqrt{${d2.tex}}}`,\r\n fraction: F\r\n }\r\n }\r\n\r\n hitSegment(A: Point, B: Point): boolean {\r\n const iPt = this.intersection(\r\n new Line().fromPoints(A, B)\r\n )\r\n\r\n // There is an intersection point\r\n if (iPt.hasIntersection) {\r\n return iPt.point.x.value >= Math.min(A.x.value, B.x.value)\r\n && iPt.point.x.value <= Math.max(A.x.value, B.x.value)\r\n && iPt.point.y.value >= Math.min(A.y.value, B.y.value)\r\n && iPt.point.y.value <= Math.max(A.y.value, B.y.value)\r\n }\r\n return false\r\n }\r\n\r\n getValueAtX = (value: Fraction | number): Fraction => {\r\n const equ = this.getEquation().isolate('y'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({ x: F }) as Fraction\r\n }\r\n return new Fraction().invalid()\r\n }\r\n\r\n getValueAtY = (value: Fraction | number): Fraction => {\r\n const equ = this.getEquation().isolate('x'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({ y: F }) as Fraction\r\n }\r\n\r\n return new Fraction().invalid()\r\n }\r\n\r\n // ------------------------------------------\r\n // Special functions\r\n // ------------------------------------------\r\n canonicalAsFloatCoefficient(decimals?: number): string {\r\n if (decimals === undefined) {\r\n decimals = 2\r\n }\r\n\r\n let canonical = ''\r\n\r\n if (!this.#a.isZero()) {\r\n if (this.#a.isOne()) {\r\n canonical = 'x'\r\n } else if (this.#a.clone().opposite().isOne()) {\r\n canonical = '-x'\r\n } else {\r\n canonical = this.#a.value.toFixed(decimals) + 'x'\r\n }\r\n }\r\n\r\n if (!this.#b.isZero()) {\r\n if (this.#b.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this.#b.value.toFixed(decimals) + 'y'\r\n }\r\n\r\n if (!this.#c.isZero()) {\r\n if (this.#c.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this.#c.value.toFixed(decimals)\r\n }\r\n\r\n\r\n return canonical + '=0'\r\n }\r\n}","import { Line } from \"./line\"\r\nimport { Vector } from \"./vector\"\r\nimport { Numeric } from \"../numeric\"\r\nimport { Fraction } from \"../coefficients\"\r\nimport { Equation } from \"../algebra\"\r\nimport { Polynom } from \"../algebra\"\r\nimport { Monom } from \"../algebra\"\r\nimport {type IPiMathObject, LinePropriety} from \"../pimath.interface\"\r\nimport { Point } from \"./point\"\r\n\r\nexport class Circle\r\n implements\r\n IPiMathObject<Circle> {\r\n #center: Point | undefined = undefined\r\n #squareRadius: Fraction | undefined = undefined\r\n #cartesian: Equation | undefined = undefined\r\n\r\n constructor()\r\n constructor(equation: string | Equation)\r\n constructor(circle: Circle)\r\n constructor(center: Point, radius: Fraction | number, square?: boolean)\r\n constructor(center: Point, pointThrough: Point)\r\n constructor(A: Point, B: Point, C: Point)\r\n constructor(...values: unknown[]) {\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n }\r\n\r\n get center(): Point {\r\n return this.#center ?? new Point()\r\n }\r\n\r\n get squareRadius(): Fraction {\r\n return this.#squareRadius ?? new Fraction(0)\r\n }\r\n\r\n get cartesian(): Equation {\r\n if (this.#cartesian === undefined) { throw new Error('Cartesian equation not defined') }\r\n\r\n return this.#cartesian\r\n }\r\n\r\n get radius(): { tex: string, display: string, value: number } {\r\n if (this.#squareRadius === undefined) { return { tex: '', display: '', value: 0 } }\r\n if (this.#squareRadius.isSquare()) {\r\n return {\r\n tex: this.#squareRadius.clone().sqrt().tex,\r\n display: this.#squareRadius.clone().sqrt().display,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n } else {\r\n return {\r\n tex: `\\\\sqrt{${this.#squareRadius.tex}}`,\r\n display: `sqrt(${this.#squareRadius.display})`,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n }\r\n }\r\n\r\n get tex(): string {\r\n\r\n let cx, cy\r\n if (this.center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `\\\\left(x${this.center.x.isNegative() ? '+' : '-'}${this.center.x.clone().abs().tex}\\\\right)^2`\r\n }\r\n if (this.center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `\\\\left(y${this.center.y.isNegative() ? '+' : '-'}${this.center.y.clone().abs().tex}\\\\right)^2`\r\n }\r\n return `${cx}+${cy}=${this.squareRadius.tex}`\r\n }\r\n\r\n get developed(): string {\r\n return this.cartesian.tex\r\n }\r\n\r\n get display(): string {\r\n let cx, cy\r\n if (this.center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `(x${this.center.x.isNegative() ? '+' : '-'}${this.center.x.clone().abs().tex})^2`\r\n }\r\n if (this.center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `(y${this.center.y.isNegative() ? '+' : '-'}${this.center.y.clone().abs().tex})^2`\r\n }\r\n return `${cx}+${cy}=${this.squareRadius.display}`\r\n }\r\n\r\n /**\r\n * Get the relative position between circle and line. It corresponds to the number of intersection.\r\n * @param {Line} L\r\n * @returns {number}\r\n */\r\n relativePosition = (L: Line): number => {\r\n if (this.#center === undefined || this.#squareRadius === undefined) { throw new Error('Circle not defined') }\r\n\r\n const distance = L.distanceTo(this.#center), radius = Math.sqrt(this.#squareRadius.value)\r\n\r\n if (distance.value - radius > 0.0000000001) {\r\n return 0 // external\r\n } else if (Math.abs(distance.value - radius) < 0.0000000001) {\r\n return 1 // tangent\r\n } else {\r\n return 2 // secant\r\n }\r\n }\r\n\r\n lineIntersection = (L: Line): Point[] => {\r\n const intersectionPoints: Point[] = []\r\n // let solX: Fraction\r\n\r\n if (this.#cartesian === undefined) { return [] }\r\n const equX = this.#cartesian.clone(), lineX = L.getEquation().clone().isolate('x'),\r\n lineY = L.getEquation().clone().isolate('y')\r\n\r\n if (lineX instanceof Equation && lineY instanceof Equation) {\r\n equX.replaceBy('y', lineY.right).simplify()\r\n equX.solve()\r\n\r\n // TODO: rework the solutions of an equation.\r\n // for (const x of equX.solutions) {\r\n // if (x.exact === false && isNaN(x.value)) {\r\n // continue\r\n // }\r\n\r\n // solX = new Fraction(x.exact === false ? x.value : x.exact)\r\n // intersectionPoints.push(new Point(solX.clone(), lineY.right.evaluate(solX)))\r\n // }\r\n }\r\n\r\n return intersectionPoints\r\n }\r\n\r\n tangents = (P: Point | Fraction): Line[] => {\r\n if (P instanceof Fraction) {\r\n return this.#tangentsWithSlope(P)\r\n } else if (this.isPointOnCircle(P)) {\r\n return this.#tangentsThroughOnePointOnTheCircle(P)\r\n } else if (this.#center !== undefined && this.#center.distanceTo(P).value > this.radius.value) {\r\n //TODO: Must check it's outside the circle\r\n return this.#tangentsThroughOnePointOutsideTheCircle(P)\r\n } else {\r\n console.log('No tangents as the point is inside !')\r\n }\r\n return []\r\n }\r\n\r\n isPointOnCircle = (P: Point): boolean => {\r\n return this.#cartesian?.test({ x: P.x, y: P.y }) ?? false\r\n }\r\n\r\n getPointsOnCircle = (numberIsInteger?: boolean): Point[] => {\r\n if (numberIsInteger === undefined) {\r\n numberIsInteger = false\r\n }\r\n\r\n // It means searching for pythagorician triples that make a perfect square.\r\n // (x-4)^2 + (y+3)^2 = 15\r\n\r\n const triplets = Numeric.pythagoreanTripletsWithTarget(this.squareRadius.value, true)\r\n\r\n const points: Point[] = []\r\n\r\n triplets.forEach(triplet => {\r\n // Allow positive / negative values\r\n // x-a = t => x = a + t\r\n // x-a = -t => x = a - t\r\n\r\n for (const k of [[1, 1], [-1, 1], [-1, -1], [1, -1]]) {\r\n points.push(new Point(\r\n this.center.x.clone().add(k[0] * triplet[0]),\r\n this.center.y.clone().add(k[1] * triplet[1])\r\n )\r\n )\r\n // Check if the point is not already in points.\r\n // TODO: isInListOfPoints not implemented\r\n // if (!pt.isInListOfPoints(points)) {\r\n // points.push(pt)\r\n // }\r\n }\r\n })\r\n return points\r\n }\r\n\r\n clone(): Circle {\r\n return new Circle(\r\n this.center.clone(),\r\n this.squareRadius.clone(),\r\n true\r\n )\r\n // this.#center = this.center.clone()\r\n // this.#squareRadius = this.squareRadius.clone()\r\n // this._calculateCartesian()\r\n // return this\r\n }\r\n\r\n setRadius(radius: Fraction | number, square?: boolean): this {\r\n if (square) {\r\n this.#squareRadius = new Fraction(radius)\r\n } else {\r\n this.#squareRadius = new Fraction(radius).pow(2)\r\n }\r\n this.#calculateCartesian()\r\n return this\r\n }\r\n\r\n #tangentsThroughOnePointOnTheCircle = (P: Point): Line[] => {\r\n const CT = new Vector(this.center, P)\r\n return [new Line(P, CT, LinePropriety.Perpendicular)]\r\n }\r\n\r\n #tangentsThroughOnePointOutsideTheCircle = (P: Point): Line[] => {\r\n // y = mx + h\r\n // px, py => h = -m px + py => mx - y -m.px + py = 0 =>\r\n // Centre: cx, cy, radius: r\r\n // (m.cx - cy -m.px + py)^2 = r^2 * (m^2 + 1)\r\n // (m(cx-py) - (cy - py))^2 = r^2 * (m^2 + 1)\r\n\r\n const cx_px = this.center.x.clone().subtract(P.x), cy_py = this.center.y.clone().subtract(P.y),\r\n polyLeft = new Polynom('x'), polyRight = new Polynom('x^2+1')\r\n\r\n polyLeft.multiply(cx_px).subtract(cy_py).pow(2)\r\n polyRight.multiply(this.squareRadius)\r\n\r\n const equ = new Equation(polyLeft, polyRight)\r\n const solutions = equ.solve()\r\n\r\n return solutions.map(sol => {\r\n // h = -m px + py\r\n let h: Fraction\r\n const equ = new Equation('y', 'x')\r\n\r\n if (sol.exact instanceof Fraction) {\r\n h = P.x.clone().opposite().multiply(sol.exact).add(P.y)\r\n equ.right.multiply(sol.exact).add(h)\r\n } else {\r\n h = P.x.clone().opposite().multiply(sol.value).add(P.y)\r\n equ.right.multiply(sol.value).add(h)\r\n }\r\n\r\n return new Line(equ)\r\n })\r\n\r\n }\r\n\r\n #tangentsWithSlope = (slope: Fraction): Line[] => {\r\n // d(C;t)=r => ac1+bc2 + x = +- sqrt(a^2 + b^2)*r\r\n // x = -ac1-bc2 +- sqrt(a^2 + b^2)*r\r\n // y = a/bx + h => ax-by + H = 0\r\n\r\n const a = slope.numerator, b = -slope.denominator, c1 = this.center.x.clone(), c2 = this.center.y.clone()\r\n\r\n const sq = this.squareRadius.clone().multiply(slope.numerator ** 2 + slope.denominator ** 2),\r\n x1 = c1.clone().multiply(a).opposite().subtract(c2.clone().multiply(b)).add(sq.clone().sqrt()),\r\n x2 = c1.clone().multiply(a).opposite().subtract(c2.clone().multiply(b)).subtract(sq.clone().sqrt())\r\n\r\n return [new Line(a, b, x1), new Line(a, b, x2)]\r\n }\r\n\r\n #reset(): this {\r\n this.#center = undefined\r\n this.#squareRadius = undefined\r\n this.#cartesian = undefined\r\n\r\n return this\r\n }\r\n\r\n parse(...values: unknown[]): this {\r\n // Data can be given in these formats:\r\n // one value, a string -> make it an Equation\r\n // one value, an Equation\r\n // one value, a circle -> clone it\r\n // two values: two points (center and pointThrough)\r\n // two values: point and Fraction (center and radius)\r\n // three values: Vector2D, Fraction, Boolean (center, square radius, true)\r\n\r\n this.#reset()\r\n\r\n if (typeof values[0] === 'string') {\r\n this.#parseEquation(new Equation(values[0]))\r\n } else if (values[0] instanceof Equation) {\r\n this.#parseEquation(values[0])\r\n } else if (values[0] instanceof Circle) {\r\n this.#parseCopyCircle(values[0])\r\n } else if (values[0] instanceof Point && values.length > 1) {\r\n if (values[1] instanceof Point) {\r\n if (values[2] instanceof Point) {\r\n // TODO: Add the method to parse through three points\r\n // this._parseThroughtThreePoints(values[0], values[1], values[2])\r\n } else {\r\n this.#parseCenterAndPointThrough(values[0], values[1])\r\n }\r\n } else if (values[1] instanceof Fraction || typeof values[1] === 'number') {\r\n this.#parseCenterAndRadius(values[0], values[1], (typeof values[2] === \"boolean\") ? values[2] : false)\r\n }\r\n }\r\n\r\n // Calculate once the different values.\r\n this.#calculateCartesian()\r\n\r\n\r\n return this\r\n }\r\n\r\n #calculateCartesian() {\r\n this.#cartesian = (\r\n new Equation(\r\n new Polynom(`(x-(${this.center.x.display}))^2+(y-(${this.center.y.display}))^2`),\r\n new Polynom(this.squareRadius.display))\r\n ).moveLeft()\r\n }\r\n\r\n #parseCopyCircle(circle: Circle): this {\r\n this.#center = circle.center.clone()\r\n this.#squareRadius = circle.squareRadius.clone()\r\n this.#calculateCartesian()\r\n return this\r\n }\r\n\r\n #parseCenterAndRadius(center: Point, radius: Fraction | number, square?: boolean): this {\r\n this.#center = center.clone()\r\n if (square) {\r\n this.#squareRadius = (new Fraction(radius))\r\n } else {\r\n this.#squareRadius = new Fraction(radius).pow(2)\r\n }\r\n\r\n return this\r\n }\r\n\r\n #parseCenterAndPointThrough(center: Point, pointThrough: Point): this {\r\n this.#center = center.clone()\r\n this.#squareRadius = new Vector(this.#center, pointThrough).normSquare\r\n return this\r\n }\r\n\r\n #parseEquation(equ: Equation): this {\r\n\r\n // Move everything to the left.\r\n equ.moveLeft()\r\n\r\n if (equ.degree('x').value === 2 && equ.degree('y').value === 2) {\r\n // Both must be of degree 2.\r\n const x2 = equ.left.monomByDegree(2, 'x'), y2 = equ.left.monomByDegree(2, 'y')\r\n let x1: Monom, y1: Monom, c: Monom\r\n\r\n // Both square monoms must have the same coefficient.\r\n if (x2.coefficient.isEqual(y2.coefficient)) {\r\n equ.divide(x2.coefficient)\r\n\r\n x1 = equ.left.monomByDegree(1, 'x')\r\n y1 = equ.left.monomByDegree(1, 'y')\r\n\r\n c = equ.left.monomByDegree(0)\r\n\r\n this.#center = new Point(x1.coefficient.clone().divide(2).opposite(), y1.coefficient.clone().divide(2).opposite())\r\n\r\n this.#squareRadius = c.coefficient.clone().opposite()\r\n .add(this.#center.x.clone().pow(2))\r\n .add(this.#center.y.clone().pow(2))\r\n\r\n } else {\r\n // The circle is not a valid circle\r\n this.#center = undefined\r\n this.#squareRadius = undefined\r\n }\r\n }\r\n return this\r\n }\r\n\r\n // private _parseThroughtThreePoints(A: Point, B: Point, C: Point): this {\r\n // const T = new Triangle(A, B, C), mAB = T.remarquables.mediators.AB.clone(),\r\n // mAC = T.remarquables.mediators.AC.clone()\r\n // this.parse(mAB.intersection(mAC).point, A)\r\n\r\n // return this\r\n // }\r\n\r\n}","/**\r\n * This class works for 2d line in a plane.\r\n */\r\n\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Polynom } from \"../algebra/polynom\"\r\nimport { Monom } from \"../algebra/monom\"\r\nimport { randomIntSym } from \"../randomization/rndHelpers\"\r\nimport { Vector } from \"./vector\"\r\nimport { Point } from \"./point\"\r\nimport {Line3Propriety} from \"../pimath.interface\"\r\n\r\n\r\nexport class Line3 {\r\n // A line is defined as the canonical form\r\n static PERPENDICULAR = Line3Propriety.Perpendicular\r\n static PARALLEL = Line3Propriety.Parallel\r\n // ax + by + c = 0\r\n #OA: Point = new Point()\r\n #d: Vector = new Vector()\r\n\r\n /**\r\n * Value can be a mix of:\r\n *\r\n * @param values\r\n */\r\n constructor(A: Point, B: Point)\r\n constructor(A: Point, d: Vector)\r\n constructor(A: Point, d: Vector | Point) {\r\n this.#OA = A.clone()\r\n this.#d = d.asPoint ? new Vector(A, d) : d.clone()\r\n return this\r\n }\r\n\r\n get OA(): Point {\r\n return this.#OA\r\n }\r\n\r\n set OA(value: Point) {\r\n this.#OA = value\r\n }\r\n get point(): Point {\r\n return this.#OA.clone()\r\n }\r\n\r\n get d(): Vector {\r\n return this.#d\r\n }\r\n\r\n set d(value: Vector) {\r\n this.#d = value\r\n }\r\n\r\n get tex(): { parametric: string, system: string, cartesian: string } {\r\n return {\r\n parametric: `${Vector.asTex('x', 'y', 'z')} = ${Vector.asTex(this.#OA.x.tex, this.#OA.y.tex, this.#OA.z.tex)} + k\\\\cdot ${Vector.asTex(this.#d.x.tex, this.#d.y.tex, this.#d.z.tex)}`,\r\n system: `\\\\left\\\\{\\\\begin{aligned}\r\n x &= ${(new Polynom(this.#OA.x)\r\n .add(new Monom(this.#d.x).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\ \r\n y &= ${(new Polynom(this.#OA.y)\r\n .add(new Monom(this.#d.y).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\\r\n z &= ${(new Polynom(this.#OA.z)\r\n .add(new Monom(this.#d.z).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\r\n\\\\end{aligned}\\\\right.`,\r\n cartesian: `\\\\frac{ ${new Polynom('x', 1, this.#OA.x.clone().opposite()).tex} }{ ${this.direction.x.tex} } = \\\\frac{ ${new Polynom('y', 1, this.#OA.y.clone().opposite()).tex} }{ ${this.direction.y.tex} } = \\\\frac{ ${new Polynom('z', 1, this.#OA.z.clone().opposite()).tex} }{ ${this.direction.z.tex} }`\r\n }\r\n }\r\n\r\n get display(): { parametric: string, system: string, cartesian: string } {\r\n const OAx = this.#OA.x.display\r\n const OAy = this.#OA.y.display\r\n const OAz = this.#OA.z.display\r\n const n = this.direction.simplify()\r\n const nx = n.x.display\r\n const ny = n.y.display\r\n const nz = n.z.display\r\n\r\n return {\r\n parametric: `${Vector.asDisplay('x', 'y', 'z')} = ${Vector.asDisplay(this.#OA.x.display, this.#OA.y.display, this.#OA.z.display)} + k\\\\cdot ${Vector.asDisplay(this.#d.x.display, this.#d.y.display, this.#d.z.display)}`,\r\n system: '',\r\n cartesian: `(x-${OAx})/${nx} = (y-${OAy})/${ny} = (z-${OAz})/${nz}`\r\n }\r\n }\r\n\r\n get direction(): Vector {\r\n return this.#d.clone()\r\n }\r\n\r\n clone = (): this => {\r\n this.#d = this.#d.clone()\r\n this.#OA = this.#OA.clone()\r\n\r\n return this\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n isOnLine = (pt: Point): boolean => {\r\n return false\r\n }\r\n\r\n isParallelTo = (line: Line3): boolean => {\r\n // Do they have the isSame direction ?\r\n throw new Error('Method not implemented.')\r\n }\r\n isSameAs = (line: Line3): boolean => {\r\n throw new Error('Method not implemented.')\r\n }\r\n isPerpendicularTo = (line: Line3): boolean => {\r\n throw new Error('Method not implemented.')\r\n }\r\n isVertical = (): boolean => {\r\n throw new Error('Method not implemented.')\r\n }\r\n simplify = (): this => {\r\n throw new Error('Method not implemented.')\r\n // const lcm = Numeric.lcm(this.#a.denominator, this.#b.denominator, this.#c.denominator),\r\n // gcd = Numeric.gcd(this.#a.numerator, this.#b.numerator, this.#c.numerator)\r\n\r\n // this.fromCoefficient(\r\n // this.#a.clone().multiply(lcm).divide(gcd),\r\n // this.#b.clone().multiply(lcm).divide(gcd),\r\n // this.#c.clone().multiply(lcm).divide(gcd),\r\n // )\r\n\r\n // return this\r\n }\r\n\r\n intersection = (line: Line3): { point: Vector, hasIntersection: boolean, isParallel: boolean, isSame: boolean } => {\r\n\r\n throw new Error('Method not implemented.')\r\n }\r\n\r\n distanceTo(pt: Point): { value: number, fraction: Fraction, tex: string } {\r\n // Distance is:\r\n // |(x - x0) x d| / |d|\r\n const AP = new Vector(this.#OA, pt),\r\n d = this.direction,\r\n d2 = this.direction.normSquare,\r\n num2 = AP.cross(d).normSquare,\r\n num2d2 = num2.clone().divide(d2),\r\n dnum = num2d2.clone().sqrt()\r\n\r\n console.log('CROSS', AP.cross(d).display)\r\n return {\r\n value: Math.sqrt(num2d2.value),\r\n fraction: num2d2.clone().sqrt(),\r\n tex: dnum.isExact() ? dnum.tex : `\\\\sqrt{${num2d2.tex}}`\r\n }\r\n }\r\n\r\n hitSegment(A: Point, B: Point): boolean {\r\n const iPt = this.intersection(\r\n new Line3(A, B)\r\n )\r\n\r\n // There is an intersection point\r\n if (iPt.hasIntersection) {\r\n return iPt.point.x.value >= Math.min(A.x.value, B.x.value)\r\n && iPt.point.x.value <= Math.max(A.x.value, B.x.value)\r\n && iPt.point.y.value >= Math.min(A.y.value, B.y.value)\r\n && iPt.point.y.value <= Math.max(A.y.value, B.y.value)\r\n && iPt.point.z.value >= Math.min(A.z.value, B.z.value)\r\n && iPt.point.z.value <= Math.max(A.z.value, B.z.value)\r\n }\r\n return false\r\n }\r\n\r\n // getValueAtX = (value: Fraction | number): Fraction => {\r\n // const equ = this.equation.clone().isolate('y'),\r\n // F = new Fraction(value)\r\n\r\n // if (equ instanceof Equation) {\r\n // return equ.right.evaluate({ x: F }) as Fraction\r\n // }\r\n // return new Fraction().invalid()\r\n // }\r\n\r\n // getValueAtY = (value: Fraction | number): Fraction => {\r\n // const equ = this.equation.clone().isolate('x'),\r\n // F = new Fraction(value)\r\n\r\n // if (equ instanceof Equation) {\r\n // return equ.right.evaluate({ y: F }) as Fraction\r\n // }\r\n\r\n // return new Fraction().invalid()\r\n // }\r\n\r\n randomPoint = (max = 5): Point => {\r\n const A = this.#OA.clone(),\r\n k = new Fraction(randomIntSym(max, false))\r\n\r\n return new Point(\r\n A.x.clone().add(this.#d.x.clone().multiply(k)),\r\n A.y.clone().add(this.#d.y.clone().multiply(k)),\r\n A.z.clone().add(this.#d.z.clone().multiply(k))\r\n )\r\n }\r\n}","import { Fraction } from \"../coefficients/fraction\"\r\nimport { determinant } from \"./geomMath\"\r\nimport type { Vector } from \"./vector\"\r\n\r\n\r\nexport class Matrix {\r\n #values: Vector[] = []\r\n constructor(...values: Vector[]) {\r\n this.#values = values\r\n\r\n return this\r\n }\r\n\r\n get values(): Vector[] {\r\n return this.#values\r\n }\r\n\r\n get array(): Fraction[][] {\r\n return this.#values.map(v => v.array)\r\n }\r\n\r\n get dimension(): number[] {\r\n return [this.#values.length, this.#values[0].dimension]\r\n }\r\n\r\n isSquare(): boolean {\r\n return this.#values.length === this.#values[0].dimension\r\n }\r\n\r\n determinant(): Fraction {\r\n if (!this.isSquare()) {\r\n throw new Error('Matrix is not square')\r\n }\r\n\r\n return determinant(...this.values)\r\n }\r\n}","import { Equation } from \"../algebra/equation\"\r\nimport { Polynom } from \"../algebra/polynom\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Line3 } from \"./line3\"\r\nimport { Point } from \"./point\"\r\nimport { Vector } from \"./vector\"\r\nimport type {Plane3Config} from \"../pimath.interface\"\r\n\r\n\r\n\r\nexport class Plane3 {\r\n #normal: Vector = new Vector(0, 0, 1)\r\n #point: Point = new Point(0, 0, 0)\r\n\r\n constructor(config?: Plane3Config) {\r\n if (config) {\r\n this.parse(config)\r\n }\r\n\r\n return this\r\n }\r\n\r\n get normal(): Vector {\r\n return this.#normal\r\n }\r\n set normal(value: Vector) {\r\n this.#normal = value\r\n this.#normal.asPoint = false\r\n }\r\n get point(): Point {\r\n return this.#point\r\n }\r\n set point(value: Point) {\r\n this.#point = value\r\n this.#point.asPoint = true\r\n }\r\n\r\n get a(): Fraction {\r\n return this.#normal.x\r\n }\r\n get b(): Fraction {\r\n return this.#normal.y\r\n }\r\n get c(): Fraction {\r\n return this.#normal.z\r\n }\r\n get d(): Fraction {\r\n return this.#normal.dot(this.#point).opposite()\r\n }\r\n\r\n get tex(): string {\r\n // return the cartesian equation of the plane\r\n return new Equation(\r\n new Polynom('xyz', this.a, this.b, this.c, this.d),\r\n new Polynom(0)\r\n ).reduce().tex\r\n }\r\n\r\n get display(): string {\r\n // return the cartesian equation of the plane\r\n return new Equation(\r\n new Polynom('xyz', this.a, this.b, this.c, this.d),\r\n new Polynom(0)\r\n ).reduce().display\r\n }\r\n\r\n parse(config: Plane3Config) {\r\n if (config.point && config.normal) {\r\n this.point = config.point\r\n this.normal = config.normal\r\n return\r\n }\r\n\r\n if (config.point && config.directions?.length === 2) {\r\n this.point = config.point\r\n const [v1, v2] = config.directions\r\n this.normal = v1.cross(v2)\r\n return\r\n }\r\n\r\n if (config.equation) {\r\n const cartesian = config.equation.moveLeft().reduce().left\r\n\r\n const a = cartesian.monomByLetter('x').coefficient\r\n const b = cartesian.monomByLetter('y').coefficient\r\n const c = cartesian.monomByLetter('z').coefficient\r\n const d = cartesian.monomByDegree(0).coefficient\r\n\r\n // Get the normal vector\r\n this.normal = new Vector(a, b, c)\r\n\r\n // Get a point on the plane\r\n if (a.isNotZero()) {\r\n this.point = new Point(d.clone().divide(a).opposite(), 0, 0)\r\n } else if (b.isNotZero()) {\r\n this.point = new Point(0, d.clone().divide(b).opposite(), 0)\r\n } else {\r\n this.point = new Point(0, 0, d.clone().divide(c).opposite())\r\n }\r\n // Make sure it's considered as point\r\n return\r\n }\r\n\r\n if (config.points?.length === 3 && config.points.every(p => p instanceof Vector)) {\r\n const A = config.points[0]\r\n const B = config.points[1]\r\n const C = config.points[2]\r\n\r\n const AB = new Vector(A, B)\r\n const AC = new Vector(A, C)\r\n this.normal = AB.cross(AC)\r\n this.point = A\r\n return\r\n }\r\n\r\n if (config.coefficients?.length === 4) {\r\n const [a, b, c, d] = config.coefficients\r\n this.normal = new Vector(a, b, c)\r\n this.point = new Point(0, 0, -d)\r\n return\r\n }\r\n }\r\n\r\n angle(vector: Vector, sharp?: boolean, radian?: boolean): number\r\n angle(line: Line3, sharp?: boolean, radian?: boolean): number\r\n angle(plane: Plane3, sharp?: boolean, radian?: boolean): number\r\n angle(value: Plane3 | Line3 | Vector, sharp?: boolean, radian?: boolean): number {\r\n if (value instanceof Plane3) {\r\n return this.normal.angle(value.normal, sharp, radian)\r\n }\r\n\r\n let direction: Vector\r\n if (value instanceof Vector) {\r\n if (value.dimension !== 3) {\r\n throw new Error('Vector is not 3D')\r\n }\r\n\r\n direction = value\r\n } else {\r\n direction = value.direction\r\n }\r\n\r\n const a90 = radian ? Math.PI / 2 : 90\r\n return a90 - this.normal.angle(direction, true, radian)\r\n }\r\n\r\n distanceTo(point: Vector): number {\r\n return this.normal.dot(point).add(this.d).abs().value / this.normal.norm\r\n }\r\n\r\n intersectWithLine(line: Line3): Point {\r\n const { point, direction } = line\r\n const t = this.normal.dot(point).add(this.d).divide(this.normal.dot(direction).opposite())\r\n return point.clone().add(direction.clone().multiplyByScalar(t))\r\n }\r\n\r\n intersectWithPlane(plane: Plane3): Line3 {\r\n const direction = this.normal.cross(plane.normal)\r\n\r\n // Solve the system:\r\n // p1 // p2 // z=0\r\n const pt = new Point(0, 0, 0)\r\n throw new Error('Intersection with plane not yet implemented !')\r\n return new Line3(pt, direction)\r\n }\r\n\r\n isPointOnPlane(pt: Point): boolean {\r\n return this.normal.dot(pt).add(this.d).isZero()\r\n }\r\n}","import { Fraction } from \"../coefficients/fraction\"\r\nimport { Line } from \"./line\"\r\nimport { Vector } from \"./vector\"\r\nimport { Point } from \"./point\"\r\nimport type {remarquableLines} from \"../pimath.interface\"\r\n\r\nexport class Triangle {\r\n #A: Point = new Point()\r\n #B: Point = new Point()\r\n #C: Point = new Point()\r\n #lines: { 'AB': Line, 'AC': Line, 'BC': Line } = {\r\n 'AB': new Line(),\r\n 'AC': new Line(),\r\n 'BC': new Line()\r\n }\r\n #middles: { 'AB': Point, 'AC': Point, 'BC': Point } = {\r\n 'AB': new Point(),\r\n 'AC': new Point(),\r\n 'BC': new Point()\r\n }\r\n #remarquables: remarquableLines | null = null\r\n\r\n constructor(...values: unknown[]) {\r\n\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setters\r\n // ------------------------------------------\r\n\r\n get A(): Point {\r\n return this.#A\r\n }\r\n\r\n get B(): Point {\r\n return this.#B\r\n }\r\n\r\n get C(): Point {\r\n return this.#C\r\n }\r\n\r\n get AB(): Vector {\r\n return this.#getSegment('A', 'B')\r\n }\r\n\r\n get BA(): Vector {\r\n return this.#getSegment('B', 'A')\r\n }\r\n\r\n get BC(): Vector {\r\n return this.#getSegment('B', 'C')\r\n }\r\n\r\n get CB(): Vector {\r\n return this.#getSegment('C', 'B')\r\n }\r\n\r\n get AC(): Vector {\r\n return this.#getSegment('A', 'C')\r\n }\r\n\r\n get CA(): Vector {\r\n return this.#getSegment('C', 'A')\r\n }\r\n\r\n get isRectangle(): boolean {\r\n if (this.AB.isNormalTo(this.BC)) {\r\n return true\r\n }\r\n if (this.AB.isNormalTo(this.AC)) {\r\n return true\r\n }\r\n if (this.BC.isNormalTo(this.AC)) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n get isEquilateral(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) &&\r\n this.AB.normSquare.isEqual(this.AC.normSquare)\r\n }\r\n\r\n get isIsocele(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) ||\r\n this.AB.normSquare.isEqual(this.AC.normSquare) ||\r\n this.BC.normSquare.isEqual(this.AC.normSquare)\r\n }\r\n\r\n get lines(): { 'AB': Line, 'BC': Line, 'AC': Line } {\r\n return this.#lines\r\n }\r\n\r\n get remarquables(): remarquableLines | null {\r\n return this.#remarquables\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n\r\n /**\r\n * Parse values to a triangle. Supported formats:\r\n * Vector2D, Vector2D, Vector2D\r\n * x1, y1, x2, y2, x3, y3\r\n * @param values\r\n */\r\n parse = (...values: unknown[]): Triangle => {\r\n if (values.length === 6) {\r\n // Check if all values are number or fractions.\r\n const v: Fraction[] = values.map((x: unknown) => new Fraction(x as string))\r\n\r\n if (v.some(x => x.isNaN())) {\r\n throw new Error('One of the values is not a valid number')\r\n }\r\n\r\n return this.parse(\r\n new Vector(v[0], v[1]),\r\n new Vector(v[2], v[3]),\r\n new Vector(v[4], v[5]),\r\n )\r\n } else if (values.length === 3) {\r\n // Possibilities:\r\n // - Three points (or part of points, only dict for example, or array\r\n // - Three lines\r\n // - Three lines as text.\r\n if (values.every((x: unknown) => typeof x === 'string')) {\r\n // Three lines as text.\r\n return this.parse(\r\n ...values.map((x) => {\r\n return new Line(x)\r\n })\r\n )\r\n } else if (values.every((x: unknown) => x instanceof Line)) {\r\n // We have three lines\r\n const AB: Line = (values[0]).clone()\r\n const BC: Line = (values[1]).clone()\r\n const AC: Line = (values[2]).clone()\r\n this.#lines = { AB, BC, AC }\r\n\r\n // Get the intersection points -> build the triangle using these intersection points.\r\n let intersect = AB.intersection(BC)\r\n if (intersect.hasIntersection) {\r\n this.#B = intersect.point.clone()\r\n } else {\r\n throw new Error('Lines do not intersect !')\r\n }\r\n\r\n intersect = BC.intersection(AC)\r\n if (intersect.hasIntersection) {\r\n this.#C = intersect.point.clone()\r\n } else {\r\n throw new Error('Lines do not intersect !')\r\n }\r\n\r\n intersect = AC.intersection(AB)\r\n if (intersect.hasIntersection) {\r\n this.#A = intersect.point.clone()\r\n } else {\r\n throw new Error('Lines do not intersect !')\r\n }\r\n\r\n } else if (values.every((x: unknown) => (x instanceof Point))) {\r\n // We have three points.\r\n this.#A = (values[0]).clone()\r\n this.#B = (values[1]).clone()\r\n this.#C = (values[2]).clone()\r\n this.#lines = {\r\n 'AB': new Line(this.#A, this.#B),\r\n 'BC': new Line(this.#B, this.#C),\r\n 'AC': new Line(this.#A, this.#C)\r\n }\r\n }\r\n } else if (values.length === 1) {\r\n if (values[0] instanceof Triangle) {\r\n return values[0].clone()\r\n }\r\n }\r\n\r\n this.#updateTriangle()\r\n return this\r\n }\r\n\r\n /**\r\n * Clone the Triangle class\r\n */\r\n clone = (): Triangle => {\r\n return new Triangle(\r\n this.#A.clone(),\r\n this.#B.clone(),\r\n this.#C.clone()\r\n )\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Triangle operations and properties\r\n // ------------------------------------------\r\n\r\n /**\r\n * Generate the Line object for the three segments of the triangle\r\n */\r\n #updateTriangle = () => {\r\n this.#A.asPoint = true\r\n this.#B.asPoint = true\r\n this.#C.asPoint = true\r\n\r\n this.#middles = {\r\n 'AB': new Point().middleOf(this.#A, this.#B),\r\n 'AC': new Point().middleOf(this.#A, this.#C),\r\n 'BC': new Point().middleOf(this.#B, this.#C)\r\n }\r\n\r\n this.#remarquables = this.#calculateRemarquableLines()\r\n }\r\n\r\n\r\n /**\r\n * Get the Vector2D class for the given name\r\n * @param ptName\r\n */\r\n #getPointByName = (ptName: string): Point => {\r\n switch (ptName.toUpperCase()) {\r\n case 'A':\r\n return this.#A\r\n case 'B':\r\n return this.#B\r\n case 'C':\r\n return this.#C\r\n }\r\n\r\n // Something went wrong ! Return the first point\r\n return this.#A\r\n }\r\n /**\r\n * Get the vector for the segment given by name.\r\n * @param ptName1\r\n * @param ptName2\r\n */\r\n #getSegment = (ptName1: string, ptName2: string): Vector => {\r\n return new Vector(\r\n this.#getPointByName(ptName1),\r\n this.#getPointByName(ptName2)\r\n )\r\n }\r\n\r\n #calculateRemarquableLines = (): remarquableLines => {\r\n\r\n const medians = {\r\n 'A': new Line().fromPoints(this.#A, this.#middles.BC),\r\n 'B': new Line().fromPoints(this.#B, this.#middles.AC),\r\n 'C': new Line().fromPoints(this.#C, this.#middles.AB),\r\n 'intersection': null\r\n }\r\n\r\n const mediators = {\r\n 'AB': new Line().fromPointAndNormal(this.#middles.AB, new Vector(this.#A, this.#B).normal()),\r\n 'AC': new Line().fromPointAndNormal(this.#middles.AC, new Vector(this.#A, this.#C).normal()),\r\n 'BC': new Line().fromPointAndNormal(this.#middles.BC, new Vector(this.#B, this.#C).normal()),\r\n 'intersection': null\r\n }\r\n\r\n const heights = {\r\n 'A': new Line().fromPointAndNormal(this.#A, new Vector(this.#B, this.#C).normal()),\r\n 'B': new Line().fromPointAndNormal(this.#B, new Vector(this.#A, this.#C).normal()),\r\n 'C': new Line().fromPointAndNormal(this.#C, new Vector(this.#A, this.#B).normal()),\r\n 'intersection': null\r\n }\r\n\r\n const bA = this.#calculateBisectors('A'),\r\n bB = this.#calculateBisectors('B'),\r\n bC = this.#calculateBisectors('C')\r\n\r\n const bisectors = {\r\n 'A': bA.internal,\r\n 'B': bB.internal,\r\n 'C': bB.internal,\r\n 'intersection': null\r\n }\r\n\r\n const externalBisectors = {\r\n 'A': bA.external,\r\n 'B': bB.external,\r\n 'C': bC.external,\r\n 'intersection': null\r\n }\r\n\r\n const remarquables: remarquableLines = {\r\n medians,\r\n mediators,\r\n heights,\r\n bisectors,\r\n externalBisectors\r\n }\r\n\r\n // As it's a triangle, we assume the lines are intersecting and aren't parallel or superposed.\r\n remarquables.medians.intersection = remarquables.medians.A.intersection(remarquables.medians.B).point\r\n remarquables.mediators.intersection = remarquables.mediators.AB.intersection(remarquables.mediators.BC).point\r\n remarquables.heights.intersection = remarquables.heights.A.intersection(remarquables.heights.B).point\r\n remarquables.bisectors.intersection = remarquables.bisectors.A.intersection(remarquables.bisectors.B).point\r\n\r\n // Everything was calculated for the remarquable lines.\r\n return remarquables\r\n }\r\n\r\n #calculateBisectors = (pt: string): { internal: Line, external: Line } => {\r\n const tlines = this.lines\r\n let d1, d2\r\n\r\n if (pt === 'A') {\r\n d1 = tlines.AB\r\n d2 = tlines.AC\r\n } else if (pt === 'B') {\r\n d1 = tlines.AB\r\n d2 = tlines.BC\r\n } else if (pt === 'C') {\r\n d1 = tlines.BC\r\n d2 = tlines.AC\r\n }\r\n\r\n if (d1 === undefined || d2 === undefined) {\r\n throw new Error(`The point ${pt} does not exist`)\r\n }\r\n\r\n const d1n = d1.n.simplify().norm\r\n const d2n = d2.n.simplify().norm\r\n const d1Equ = d1.getEquation().multiply(d2n)\r\n const d2Equ = d2.getEquation().multiply(d1n)\r\n\r\n const b1: Line = new Line(d1Equ.clone().subtract(d2Equ).simplify())\r\n const b2: Line = new Line(d2Equ.clone().subtract(d1Equ).simplify())\r\n\r\n // Must determine which bisectors is in the triangle\r\n if (pt === 'A') {\r\n return b1.hitSegment(this.B, this.C) ? { internal: b1, external: b2 } : { internal: b2, external: b1 }\r\n }\r\n if (pt === 'B') {\r\n return b1.hitSegment(this.A, this.C) ? { internal: b1, external: b2 } : { internal: b2, external: b1 }\r\n }\r\n if (pt === 'C') {\r\n return b1.hitSegment(this.B, this.A) ? { internal: b1, external: b2 } : { internal: b2, external: b1 }\r\n }\r\n\r\n // Default returns the first bisector\r\n return { internal: b1, external: b2 }\r\n }\r\n}","import {Point} from \"./point\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Equation, Polynom} from \"../algebra\"\r\nimport type {InputValue} from \"../pimath.interface\"\r\n\r\nenum SPHERE3_FORMAT {\r\n DEVELOPPED,\r\n CENTER_RADIUS\r\n}\r\n\r\nexport enum SPHERE3_RELATIVE_POSITION {\r\n INTERIOR,\r\n EXTERIOR,\r\n SECANT,\r\n TANGENT_INSIDE,\r\n TANGENT_OUTSIDE,\r\n SUPERPOSED,\r\n CONCENTRIC\r\n}\r\n\r\nexport class Sphere3 {\r\n #center: Point | undefined = undefined\r\n #squareRadius: Fraction | undefined = undefined\r\n #equation: Equation | undefined = undefined\r\n\r\n #format: SPHERE3_FORMAT = SPHERE3_FORMAT.CENTER_RADIUS\r\n\r\n constructor(center?: Point, radius?: InputValue<Fraction>) {\r\n if (center && radius) {\r\n this.#center = center\r\n this.#squareRadius = new Fraction(radius).clone().pow(2)\r\n this.#computeEquation()\r\n }\r\n return this\r\n }\r\n\r\n fromPolynom(polynom: Equation | string): this {\r\n const equ = new Equation(polynom).moveLeft().reduce()\r\n\r\n // Check that x, y, z has the same power and same coefficient.\r\n const letters = ['x', 'y', 'z']\r\n\r\n if (letters.some((letter) => equ.degree(letter).value !== 2)){\r\n return this.makeUndefined()\r\n }\r\n\r\n const coefficient = equ.left.monomByDegree(2, 'x').coefficient\r\n if (letters.some((letter) => equ.left.monomByDegree(2, letter).coefficient.isNotEqual(coefficient))) {\r\n return this.makeUndefined()\r\n }\r\n\r\n this.#center = new Point(\r\n equ.left.monomByDegree(1, 'x').coefficient.clone().opposite().divide(2),\r\n equ.left.monomByDegree(1, 'y').coefficient.clone().opposite().divide(2),\r\n equ.left.monomByDegree(1, 'z').coefficient.clone().opposite().divide(2)\r\n )\r\n\r\n this.#squareRadius = equ.left.monomByDegree(0)\r\n .coefficient.clone().opposite()\r\n .add(this.#center.x.clone().pow(2))\r\n .add(this.#center.y.clone().pow(2))\r\n .add(this.#center.z.clone().pow(2))\r\n\r\n this.#computeEquation()\r\n return this\r\n }\r\n\r\n get center(): Point {\r\n if (this.#center === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n return this.#center\r\n }\r\n\r\n get squareRadius(): Fraction {\r\n if (this.#squareRadius === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n return this.#squareRadius\r\n }\r\n\r\n get radius(): { tex: string, display: string, value: number } {\r\n if (this.#squareRadius === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n\r\n if (this.#squareRadius.isSquare()) {\r\n return {\r\n tex: this.#squareRadius.clone().sqrt().tex,\r\n display: this.#squareRadius.clone().sqrt().display,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n } else {\r\n return {\r\n tex: `\\\\sqrt{${this.#squareRadius.tex}}`,\r\n display: `sqrt(${this.#squareRadius.display})`,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n }\r\n }\r\n\r\n get equation(): Equation {\r\n if (this.#equation === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n return this.#equation\r\n }\r\n\r\n makeUndefined(): this {\r\n this.#center = undefined\r\n this.#squareRadius = undefined\r\n this.#equation = undefined\r\n return this\r\n }\r\n\r\n get centerRadius(): this {\r\n this.#format = SPHERE3_FORMAT.CENTER_RADIUS\r\n return this\r\n }\r\n\r\n get developped(): this {\r\n this.#format = SPHERE3_FORMAT.DEVELOPPED\r\n return this\r\n }\r\n\r\n\r\n get tex(): string {\r\n return this.#output(true)\r\n }\r\n\r\n get display(): string {\r\n return this.#output(false)\r\n }\r\n\r\n #output = (asTex: boolean): string => {\r\n if (this.#equation === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n\r\n if (this.#format === SPHERE3_FORMAT.DEVELOPPED) {\r\n return asTex ? this.#equation.tex : this.#equation.display\r\n }\r\n\r\n const output: string[] = []\r\n const letters: ('x' | 'y' | 'z')[] = ['x', 'y', 'z']\r\n\r\n letters.forEach((letter: 'x' | 'y' | 'z') => {\r\n if (this.center[letter].isZero()) {\r\n output.push(`${letter}^2`)\r\n } else {\r\n const P = new Polynom(letter).subtract(this.center[letter])\r\n output.push(\r\n asTex ?\r\n `\\\\(${P.tex}\\\\)^2` :\r\n `(${P.display})^2`\r\n )\r\n }\r\n })\r\n\r\n return output.join('+') + '=' + (asTex ? this.squareRadius.tex : this.squareRadius.display)\r\n\r\n }\r\n\r\n #computeEquation(): void {\r\n this.#equation = new Equation(\r\n new Polynom('x').subtract(this.center.x).pow(2)\r\n .add(\r\n new Polynom('y').subtract(this.center.y).pow(2)\r\n )\r\n .add(\r\n new Polynom('z').subtract(this.center.z).pow(2)\r\n ),\r\n new Polynom(this.squareRadius)\r\n ).reduce()\r\n }\r\n\r\n relativePosition = (S: Sphere3): SPHERE3_RELATIVE_POSITION => {\r\n const distance = this.center.distanceTo(S.center).value\r\n const r1 = this.radius.value\r\n const r2 = S.radius.value\r\n\r\n if (distance > r1 + r2) {\r\n return SPHERE3_RELATIVE_POSITION.EXTERIOR\r\n }\r\n\r\n if (distance === r1 + r2) {\r\n return SPHERE3_RELATIVE_POSITION.TANGENT_OUTSIDE\r\n }\r\n\r\n if (distance === Math.abs(r1 - r2)) {\r\n return SPHERE3_RELATIVE_POSITION.TANGENT_INSIDE\r\n }\r\n\r\n if (distance < Math.abs(r1 - r2)) {\r\n return SPHERE3_RELATIVE_POSITION.INTERIOR\r\n }\r\n\r\n if(distance===0) {\r\n return r1===r2 ? SPHERE3_RELATIVE_POSITION.SUPERPOSED : SPHERE3_RELATIVE_POSITION.CONCENTRIC\r\n }\r\n\r\n return SPHERE3_RELATIVE_POSITION.SECANT\r\n\r\n }\r\n\r\n isPointOnSphere = (P: Point): boolean => {\r\n return this.#equation?.test({\r\n x: P.x,\r\n y: P.y,\r\n z: P.z\r\n }) ?? false\r\n }\r\n}","import type { randomCoefficientConfig } from \"../rndTypes\"\r\nimport { Fraction } from \"../../coefficients/fraction\"\r\nimport { randomInt, randomIntSym } from \"../rndHelpers\"\r\n\r\nexport function rndFraction(userConfig?: randomCoefficientConfig): Fraction {\r\n const config = Object.assign(\r\n {\r\n negative: true,\r\n max: 10,\r\n reduced: true,\r\n zero: true,\r\n natural: false\r\n }, userConfig)\r\n\r\n // Create a null fraction\r\n const Q = new Fraction()\r\n\r\n\r\n if (config.negative) {\r\n // Allow negative numbers\r\n Q.numerator = randomIntSym(config.max, config.zero)\r\n } else {\r\n // Only positive numbers\r\n Q.numerator = randomInt(config.zero ? 0 : 1, config.max)\r\n }\r\n\r\n if (config.natural) {\r\n Q.denominator = 1\r\n } else {\r\n let securityCount = 0\r\n while (Q.isRelative() && securityCount < 10) {\r\n Q.denominator = randomInt(1, config.max)\r\n securityCount++\r\n }\r\n }\r\n\r\n return config.reduced ? Q.reduce() : Q\r\n}\r\n","import type { randomMonomConfig } from \"../rndTypes\"\r\nimport { Monom } from \"../../algebra/monom\"\r\nimport { rndFraction } from \"../coefficient/rndFraction\"\r\nimport { randomItem } from \"../rndHelpers\"\r\n\r\nexport function rndMonom(userConfig?: randomMonomConfig): Monom {\r\n const config = Object.assign(\r\n {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: true,\r\n zero: false\r\n }, userConfig)\r\n\r\n // Create a monom instance\r\n const M = new Monom()\r\n\r\n // Generate the coefficient\r\n M.coefficient = rndFraction({\r\n zero: config.zero,\r\n reduced: true,\r\n natural: !config.fraction\r\n })\r\n\r\n if (config.letters.length > 1) {\r\n // Initialise each items...\r\n for (const L of config.letters.split('')) {\r\n M.setLetter(L, 0)\r\n }\r\n for (let i = 0; i < config.degree; i++) {\r\n const L = randomItem(config.letters.split(\"\"))\r\n M.setLetter(L, M.degree(L).clone().add(1))\r\n }\r\n } else {\r\n M.setLetter(config.letters, config.degree)\r\n }\r\n\r\n return M\r\n}","import type { randomPolynomConfig } from \"../rndTypes\"\r\nimport { rndMonom } from \"./rndMonom\"\r\nimport { Polynom, Monom } from \"../../algebra\"\r\nimport { randomInt } from \"../rndHelpers\"\r\n\r\nconst factorableConfig = {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: false,\r\n zero: false,\r\n unit: false,\r\n factorable: false,\r\n allowNullMonom: true,\r\n numberOfMonoms: 0,\r\n positive: true\r\n}\r\n\r\nexport function rndPolynom(userConfig?: randomPolynomConfig): Polynom {\r\n const config = Object.assign(\r\n factorableConfig,\r\n userConfig\r\n )\r\n\r\n // TODO: Create a factorable polynom does not work !!!!!\r\n\r\n // Create the polynom\r\n const P = new Polynom().empty()\r\n\r\n let M: Monom\r\n\r\n for (let i = config.degree; i >= 0; i--) {\r\n // Create monom of corresponding degree.\r\n M = rndMonom({\r\n letters: config.letters,\r\n degree: i,\r\n fraction: config.fraction,\r\n zero: (i === config.degree) ? false : config.allowNullMonom\r\n })\r\n\r\n // If degree is the greatest and unit is true, set the monom value to one.\r\n if (config.unit && config.degree === i) {\r\n M.coefficient.one()\r\n }\r\n\r\n // Add to the polynom\r\n P.add(M)\r\n }\r\n\r\n // Make sure the first monom is positive.\r\n if (config.positive && P.monomByDegree().coefficient.isNegative()) {\r\n P.monomByDegree().coefficient.opposite()\r\n }\r\n\r\n // If the number of monoms is greater than the allowed value, remove some of them... except the first one !\r\n if (config.numberOfMonoms\r\n && config.numberOfMonoms > 0\r\n && config.numberOfMonoms < P.length) {\r\n while (P.length > config.numberOfMonoms) {\r\n // Remove a random monom, except the first one\r\n const index = randomInt(1, P.length - 1)\r\n\r\n P.monoms.splice(index, 1)\r\n }\r\n }\r\n\r\n return P.reduce()\r\n}\r\n\r\nexport function rndFactorablePolynom(userConfig?: randomPolynomConfig): Polynom {\r\n const config = Object.assign(\r\n factorableConfig,\r\n userConfig\r\n )\r\n\r\n const P = new Polynom().one()\r\n\r\n const _factorableConfig = { ...config }\r\n _factorableConfig.degree = 1\r\n _factorableConfig.factorable = false\r\n\r\n for (let i = 0; i < config.degree; i++) {\r\n P.multiply(rndPolynom(_factorableConfig))\r\n }\r\n\r\n return P.reduce()\r\n}","import type { randomEquationConfig } from \"../rndTypes\"\r\nimport { Polynom } from \"../../algebra/polynom\"\r\nimport { Equation } from \"../../algebra/equation\"\r\nimport { rndPolynom } from \"./rndPolynom\"\r\n\r\nexport function rndEquation(userConfig?: randomEquationConfig): Equation {\r\n const config = Object.assign(\r\n {\r\n letters: 'x',\r\n degree: 1,\r\n fraction: false,\r\n zero: false,\r\n unit: false,\r\n factorable: false,\r\n allowNullMonom: true,\r\n numberOfMonoms: 0,\r\n positive: true,\r\n solution: {\r\n allowZero: true,\r\n fraction: false,\r\n nothing: false,\r\n everything: false\r\n }\r\n }, userConfig)\r\n\r\n // Create a polynom\r\n const P = new Polynom().one()\r\n\r\n for (let i = 0; i < config.degree; i++) {\r\n const factor = rndPolynom({\r\n degree: 1,\r\n unit: config.unit,\r\n fraction: config.fraction,\r\n letters: config.letters,\r\n zero: config.zero\r\n })\r\n P.multiply(factor)\r\n }\r\n\r\n return new Equation(P, 0)\r\n}\r\n","import { Fraction } from \"../../coefficients/fraction\"\r\nimport type { randomGeometryPointConfig } from \"../rndTypes\"\r\nimport { rndFraction } from \"../coefficient/rndFraction\"\r\nimport { randomIntSym } from \"../rndHelpers\"\r\nimport { Point } from \"../../geometry/point\"\r\n\r\nexport function rndVector(userConfig?: randomGeometryPointConfig): Point {\r\n const config: {\r\n axis: 'x' | 'y' | 'z' | null,\r\n fraction: boolean,\r\n max: number,\r\n quadrant: number | null\r\n } = Object.assign(\r\n {\r\n axis: true,\r\n fraction: false,\r\n max: 10,\r\n quadrant: null\r\n }, userConfig)\r\n\r\n const zeroX = config.axis === 'x',\r\n zeroY = config.axis === 'y'\r\n\r\n\r\n const x = config.fraction ?\r\n rndFraction({ max: config.max, zero: zeroX }) :\r\n new Fraction(randomIntSym(config.max, zeroX))\r\n\r\n const y = config.fraction ?\r\n rndFraction({ max: config.max, zero: zeroY }) :\r\n new Fraction(randomIntSym(config.max, zeroY))\r\n\r\n if (Number(config.quadrant) === 1) {\r\n x.abs()\r\n y.abs()\r\n }\r\n if (Number(config.quadrant) === 2) {\r\n if (x.isPositive()) {\r\n x.opposite()\r\n }\r\n if (y.isNegative()) {\r\n y.opposite()\r\n }\r\n }\r\n if (Number(config.quadrant) === 3) {\r\n if (x.isPositive()) {\r\n x.opposite()\r\n }\r\n if (y.isPositive()) {\r\n y.opposite()\r\n }\r\n }\r\n if (Number(config.quadrant) === 4) {\r\n if (x.isNegative()) {\r\n x.opposite()\r\n }\r\n if (y.isPositive()) {\r\n y.opposite()\r\n }\r\n }\r\n\r\n return new Point(x, y)\r\n}\r\n","import { Circle } from \"../../geometry/circle\"\r\nimport { randomInt } from \"../rndHelpers\"\r\nimport type { randomGeometryCircleConfig } from \"../rndTypes\"\r\nimport { rndVector } from \"./rndVector\"\r\n\r\nexport function rndCircle(userConfig?: randomGeometryCircleConfig): Circle {\r\n const config = Object.assign(\r\n {\r\n center: {\r\n x: { min: -10, max: 10 },\r\n y: { min: -10, max: 10 }\r\n },\r\n pointsOnCircle: 8\r\n }, userConfig)\r\n\r\n const center = rndVector(config.center)\r\n\r\n let rv, r\r\n if (config.pointsOnCircle === 8) {\r\n rv = randomInt(1, 3),\r\n r = rv ** 2 + (rv + 1) ** 2\r\n } else {\r\n r = randomInt(1, 20)\r\n }\r\n\r\n return new Circle(center, r, true)\r\n}","import { Line } from \"../../geometry/line\"\r\nimport { Vector } from \"../../geometry/vector\"\r\nimport { randomIntSym } from \"../rndHelpers\"\r\nimport type { randomGeometryLineConfig } from \"../rndTypes\"\r\n\r\nexport function rndLine(userConfig?: randomGeometryLineConfig): Line {\r\n const config = Object.assign(\r\n {\r\n A: {\r\n x: randomIntSym(10),\r\n y: randomIntSym(10)\r\n },\r\n }, userConfig)\r\n\r\n // The A point exists.\r\n const d = new Vector(\r\n randomIntSym(10),\r\n randomIntSym(10)\r\n )\r\n\r\n while (d.isNull) {\r\n d.x = randomIntSym(10)\r\n d.y = randomIntSym(10)\r\n }\r\n\r\n if (config.slope === 1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposite()\r\n }\r\n } else if (config.slope === -1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposite()\r\n }\r\n }\r\n\r\n return new Line().fromPointAndDirection(new Vector(config.A.x, config.A.y), d)\r\n}","import { Line3 } from \"../../geometry/line3\"\r\nimport { Point } from \"../../geometry/point\"\r\nimport { Vector } from \"../../geometry/vector\"\r\nimport { randomIntSym } from \"../rndHelpers\"\r\nimport type { randomGeometryLine3Config } from \"../rndTypes\"\r\n\r\nexport function rndLine3(userConfig?: randomGeometryLine3Config): Line3 {\r\n const config = Object.assign(\r\n {\r\n A: {\r\n x: randomIntSym(10),\r\n y: randomIntSym(10),\r\n z: randomIntSym(10)\r\n },\r\n direction: {\r\n x: randomIntSym(10),\r\n y: randomIntSym(10),\r\n z: randomIntSym(10)\r\n }\r\n }, userConfig)\r\n\r\n // The direction vector exists.\r\n const A = new Point(config.A.x, config.A.y, config.A.z)\r\n const d = new Vector(config.direction.x, config.direction.y, config.direction.z)\r\n\r\n return new Line3(A, d)\r\n}","import type {\r\n randomCoefficientConfig,\r\n randomEquationConfig,\r\n randomGeometryCircleConfig,\r\n randomGeometryLine3Config,\r\n randomGeometryLineConfig,\r\n randomGeometryPointConfig,\r\n randomMonomConfig,\r\n randomPolynomConfig\r\n} from \"./rndTypes\"\r\n\r\nimport { randomArray, randomBool, randomInt, randomIntSym, randomItem, randomPrime, shuffleArray } from \"./rndHelpers\"\r\nimport { rndFraction } from \"./coefficient/rndFraction\"\r\nimport { rndMonom } from \"./algebra/rndMonom\"\r\nimport { rndPolynom } from \"./algebra/rndPolynom\"\r\nimport { rndEquation } from \"./algebra/rndEquation\"\r\nimport { rndCircle } from \"./geometry/rndCircle\"\r\nimport { rndLine } from \"./geometry/rndLine\"\r\nimport { rndLine3 } from \"./geometry/rndLine3\"\r\nimport { rndVector } from \"./geometry/rndVector\"\r\n\r\nexport type * from \"./rndTypes\"\r\n\r\nexport const Random = {\r\n equation: (config?: randomEquationConfig) => {\r\n return rndEquation(config)\r\n },\r\n\r\n polynom: (config?: randomPolynomConfig) => {\r\n return rndPolynom(config)\r\n },\r\n\r\n monom: (config?: randomMonomConfig) => {\r\n return rndMonom(config)\r\n },\r\n\r\n fraction: (config?: randomCoefficientConfig) => {\r\n return rndFraction(config)\r\n },\r\n\r\n number: (from: number, to: number, exclude?: number[]): number => {\r\n return randomInt(from, to, exclude)\r\n },\r\n\r\n numberSym: (max: number, allowZero?: boolean): number => {\r\n return randomIntSym(max, allowZero)\r\n },\r\n\r\n prime: (max: number): number => {\r\n return randomPrime(max)\r\n },\r\n\r\n bool: (percent?: number): boolean => {\r\n return randomBool(percent)\r\n },\r\n\r\n array: <T>(arr: T[], number?: number): T[] => {\r\n return randomArray(arr, number)\r\n },\r\n\r\n item: <T>(arr: T[]): T => {\r\n return randomItem(arr)\r\n },\r\n\r\n shuffle: <T>(arr: T[]): T[] => {\r\n return shuffleArray(arr)\r\n },\r\n\r\n line: (config?: randomGeometryLineConfig) => {\r\n return rndLine(config)\r\n },\r\n\r\n line3: (config?: randomGeometryLine3Config) => {\r\n return rndLine3(config)\r\n },\r\n\r\n vector: (config?: randomGeometryPointConfig) => {\r\n return rndVector(config)\r\n },\r\n\r\n point: (config?: randomGeometryPointConfig) => {\r\n const vector = rndVector(config)\r\n vector.asPoint = true\r\n\r\n return vector\r\n },\r\n\r\n circle: (config?: randomGeometryCircleConfig) => {\r\n return rndCircle(config)\r\n }\r\n}","// Expose as global\r\nexport * from \"./coefficients\"\r\nexport * from \"./algebra\"\r\nexport * from \"./geometry\"\r\n\r\n// Import items individually to make a global object\r\n\r\n// Coefficients\r\nimport {Fraction, NthRoot} from \"./coefficients\"\r\n\r\n// Algebra\r\nimport {Equation, Factor, LinearSystem, LogicalSet, Monom, PolyFactor, Polynom} from \"./algebra\"\r\n\r\n// Geometry\r\nimport {Circle, Line, Line3, Matrix, Plane3, Point, Triangle, Vector, Sphere3} from \"./geometry\"\r\n\r\n// Numeric\r\nimport {Numeric} from \"./numeric\"\r\nexport {Numeric}\r\n\r\n// NumExp\r\nimport {NumExp} from \"piexpression\"\r\nexport {NumExp}\r\n\r\n// randomization\r\nimport {Random} from \"./randomization/random\"\r\nexport {Random}\r\n\r\n// Typesetting\r\nexport type * from \"./pimath.interface\"\r\n\r\n// Make a global object\r\nconst PiMath = {\r\n Numeric,\r\n Fraction,\r\n Root: NthRoot,\r\n Monom,\r\n Polynom,\r\n Equation,\r\n Matrix,\r\n LinearSystem,\r\n Factor,\r\n PolyFactor,\r\n LogicalSet,\r\n Random,\r\n Geometry: {\r\n Vector,\r\n Point,\r\n Line,\r\n Triangle,\r\n Circle,\r\n Line3,\r\n Plane3,\r\n Sphere3\r\n },\r\n NumExp\r\n}\r\n\r\n// Export as default value\r\nexport default PiMath\r\n"],"names":["decompose","value","divs","dividers","arr","u","v","divideNumbersByGCD","values","g","greatestCommonDivisor","x","absV","maxV","D","i","a","b","gcd2","leastCommonMultiple","numberCorrection","number_of_digits","periodic","primes","nb","primesValues","pythagoreanTripletsWithTarget","target","targetIsSquare","triplets","targetValue","round","decimals","Numeric","_approximative","_denominator","_numerator","_type","_Fraction","denominatorOrPeriodic","__privateAdd","__publicField","S","__privateSet","decimal","p","F","__privateGet","N","k","f","sign","compareFraction","Q","n","than","controlNumerator","controlDenominator","result","fractions","M","m","compare","reverse","sorted","unique","distinct","R","Fraction","_radical","_nth","_coefficient","_isValid","NthRoot","radical","nthroot","coefficient","V","C","_equation","_variable","_EquationSolver_instances","makeApproximativeSolution_fn","makeSolution_fn","solveByBissection_fn","solveByBissection_algorithm_fn","solveByFactorization_fn","solveCubic_CardanFormula_fn","solveLinear_fn","solveQuadratic_fn","solveQuadratic_Output_fn","_EquationSolver","left","right","variable","equ","degree","__privateMethod","output","fraction","solutions","coeffs","B","dx","evaluatedPoints","searchValue","couples","index","couple","bissection","tol","fa","fb","mid","fmid","lcm","dividersA","dividersB","da","db","s","solver","c","d","an","bn","cn","q","P","delta","x1","x2","pv","qv","anv","delta2","f1","f2","deltaFactor","gcd","b2","a2","deltaGcd","deltaK1","deltaK2","texOutput","displayOutput","EquationSolver","_","e","A","t","r","O","o","T","h","w","U","y","I","l","E","L","_literal","_Monom_instances","cloneLiteral_fn","_evaluateAsNumeric","_shutingYardToReducedMonom","_shutingYard_AddToken","_Monom","mAsMonom","letter","dM","asNumeric","tmpValues","div","M1","M2","K","item","key","pow","inputStr","rpn","ShutingYard","stack","element","ShutingyardType","_a","q1","q2","letters","literals","monomDividers","primitive","tmpList","litt","currentLetter","monoms","Monom","wrapParenthesis","str","tex","replace_in_array","haystack","search","start","end","_factors","_monoms","_roots","_rootsCache","_compare","_divideByFraction","_divideByInteger","_factorize2ndDegree","_genDisplay","_getAllPotentialFactors","_multiplyByFraction","_multiplyByInteger","_multiplyByMonom","_multiplyByPolynom","_Polynom_instances","parseString_fn","_shutingYardToReducedPolynom","_shutingYard_addToken","_Polynom","polynomString","numerator","denominator","dP","quotient","reminder","maxMP","degreeP","newM","MaxIteration","monom","factors","tempPolynom","securityLoop","maxDegree","allDividers","pX","pC","dX","dC","denominators","numerators","valuesA","valuesB","pString","zero","Ms","j","revert","otherLetters","resultPolynom","cP1","cP2","m1","nbF","P1","P2","factor","xPolynom","xFactors","xyzPolynom","forceSign","wrapParentheses","withAllMultiplicationSign","m2","m1d","m2d","coeff","orderedPolynom","length","roots","signs","_x","_root","test","Polynom","_left","_right","_sign","_findSign","_formatSign","_reverseSign","_Equation","equationString","strSign","pStr","p1","p2","mMove","cMove","allLeft","move","signStr","solutionAsTex","uniqueSolutions","sol","Equation","_displayMode","_polynom","_power","_singleMode","_Factor","power","polynom","num","den","base","tos","Factor","FACTOR_DISPLAY","FACTOR_DISPLAY2","_equations","_variables","_findLetters","_makeMatrix","_LinearSystem","equations","operators","equStr","equArray","operatorsColumns","eq1","eq2","factor1","factor2","eq1multiplied","eq2multiplied","matrix","vector","augmentedMatrix","row","pivot","row_to_add","acc","cols","vars","LS","LinearSystem","_rpn","_LogicalSet_instances","evaluateAsVenn_fn","LogicalSet","ShutingyardMode","token","varStack","second","first","tokenSets","reference","referenceSet","_PolyFactor_static","gcdWith_fn","lcmWith_fn","_PolyFactor_instances","extractNumeratorAndDenominator_fn","_PolyFactor","numTeX","denTeX","PF","remainingPolynom","pf","dPF","derivativeFactor","newFactors","self","PF1","PF2","keyFactors","aPower","bPower","aLength","bLength","aDegree","bDegree","roots_key","empty_signs","root","aligned_signs","rootSign","factors1","factors2","power2","PolyFactor","k_numerator","k_denominator","kF","areVectorsEquals","v1","v2","areVectorsColinears","dotProduct","determinant","_array","_asPoint","_Vector","norm","scalar","sharp","radian","components","V1","V2","Vector","LinePropriety","Line3Propriety","randomBool","percent","randomInt","exclude","randomIntSym","max","randomPrime","randomItem","randomArray","number","shuffleArray","temp","Point","nbs","_reduceBeforeDisplay","_b","_c","_OA","_d","_n","_outputMode","_Line","pt","maxIterationTest","formattedValues","elem","orientation","line","Pt","isParallel","isSame","canonical","pt1","pt2","d2","iPt","Line","_center","_squareRadius","_cartesian","_tangentsThroughOnePointOnTheCircle","_tangentsThroughOnePointOutsideTheCircle","_tangentsWithSlope","_Circle_instances","reset_fn","calculateCartesian_fn","parseCopyCircle_fn","parseCenterAndRadius_fn","parseCenterAndPointThrough_fn","parseEquation_fn","_Circle","distance","radius","intersectionPoints","equX","lineX","lineY","numberIsInteger","points","triplet","CT","cx_px","cy_py","polyLeft","polyRight","slope","c1","c2","sq","cx","cy","square","circle","center","pointThrough","y2","y1","Circle","_Line3","OAx","OAy","OAz","nx","ny","nz","AP","num2","num2d2","dnum","Line3","_values","Matrix","_normal","_point","_Plane3","config","cartesian","AB","AC","direction","point","plane","Plane3","_A","_B","_C","_lines","_middles","_remarquables","_updateTriangle","_getPointByName","_getSegment","_calculateRemarquableLines","_calculateBisectors","_Triangle","BC","intersect","ptName","ptName1","ptName2","medians","mediators","heights","bA","bB","bC","bisectors","externalBisectors","remarquables","tlines","d1","d1n","d2n","d1Equ","d2Equ","b1","Triangle","SPHERE3_RELATIVE_POSITION","SPHERE3_RELATIVE_POSITION2","_format","_output","_Sphere3_instances","computeEquation_fn","Sphere3","asTex","r1","r2","rndFraction","userConfig","securityCount","rndMonom","factorableConfig","rndPolynom","rndEquation","rndVector","zeroX","zeroY","rndCircle","rv","rndLine","rndLine3","Random","from","to","allowZero","PiMath","NumExp"],"mappings":"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,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AACviO,SAAID,MAAO,SACAC,IAEAA,EAAa,MAAM,GAAG,KAAK,IAAIA,EAAa,QAAQD,CAAE,CAAC;AAEtE;AAEA,SAASE,GAA8BC,GAAgBC,GAAsC;AAEnF,QAAAC,IAAW,CACb,GAAAC,IAAcF,MAAmB,KAAO,CAACD,IAASA,KAAU;AAChE,WAAStB,IAAI,GAAGA,KAAKsB,GAAQtB;AACzB,aAASC,IAAI,GAAGA,KAAKqB,GAAQrB;AACzB,MAAID,KAAK,IAAIC,KAAK,MAAMwB,KACpBD,EAAS,KAAK,CAACxB,GAAGC,GAAGqB,CAAM,CAAC;AAKjC,SAAAE;AACX;AAEA,SAASE,GAAM9B,GAAe+B,IAAW,GAAW;AAGhD,SAAO,CAAO,GAFM,KAAK,MAAM,CAAO,GAAG/B,CAAK,IAAI+B,CAAQ,EAAG,CAEzC,KAAKA,CAAQ;AACrC;AAGO,MAAMC,IAAU;AAAA,EACnB,WAAAjC;AAAA,EACA,UAAAG;AAAA,EACA,oBAAAI;AAAA,EACA,KAAKG;AAAA,EACL,KAAKS;AAAA,EACL,kBAAAC;AAAA,EACA,UAAAE;AAAA,EACA,QAAAC;AAAA,EACA,+BAAAG;AAAA,EACA,OAAAK;AACJ;AA/KA,IAAAG,IAAAC,GAAAC,GAAAC;ACYO,MAAMC,IAAN,MAAMA,EAAmE;AAAA,EAU5E,YAAYrC,GAA8BsC,GAAgC;AAT1E,IAAAC,EAAA,MAAAN,IAAiB;AACjB,IAAAM,EAAA,MAAAL,GAAe;AACf,IAAAK,EAAA,MAAAJ,GAAa;AACb,IAAAI,EAAA,MAAAH,IAAmB;AAqBZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAI,EAAA,eAAQ,CAACxC,GAA6BsC,MAA6C;AAClF,UAAAG;AAGJ,UAAIzC,MAAU;AACV,eAAA0C,EAAA,MAAKP,GAAa,IAClBO,EAAA,MAAKR,GAAe,IACb;AAGX,cAAQ,OAAOlC,GAAO;AAAA,QAClB,KAAK;AAKG,cAHAyC,IAAAzC,EAAM,MAAM,GAAG,GAGfyC,EAAE,SAAS;AACX,kBAAM,IAAI,MAAM,4CAA4CzC,CAAK,GAAG;AAExE,cAAIyC,EAAE,IAAI,CAAK/B,MAAAA,MAAM,MAAM,MAAM,OAAOA,CAAC,CAAC,CAAC,EAAE,SAAS,EAAI;AACtD,kBAAM,IAAI,MAAM,4CAA4CV,CAAK,GAAG;AAGpE,cAAAyC,EAAE,WAAW;AAEb,mBAAO,KAAK,MAAM,CAACA,EAAE,CAAC,CAAC;AAC3B,UAAWA,EAAE,WAAW,IAGhBA,EAAE,CAAC,MAAM,OACTC,EAAA,MAAKP,GAAa,MAClBO,EAAA,MAAKR,GAAe,OAEfQ,EAAA,MAAAP,GAAa,CAACM,EAAE,CAAC,IACjBC,EAAA,MAAAR,GAAe,CAACO,EAAE,CAAC,OAK5BC,EAAA,MAAKP,GAAa,MAClBO,EAAA,MAAKR,GAAe;AAExB;AAAA,QACJ,KAAK;AACG,cAAA,OAAO,cAAclC,CAAK;AAE1B,YAAA0C,EAAA,MAAKP,GAAa,CAACnC,IAEfsC,MAA0B,UAAa,CAAC,OAAO,cAAcA,CAAqB,IAClFI,EAAA,MAAKR,GAAe,KAEpBQ,EAAA,MAAKR,GAAe,CAACI;AAAA,eAEtB;AAGG,kBAAA,CAAA,EAAGK,CAAO,IAAK3C,EAAM,SAAS,EAAG,MAAM,GAAG,GAC1C4C,IAAYD,IAAUA,EAAQ,SAAS;AAK7C,YAAIL,MAA0B,UAC1BI,EAAA,MAAKP,GAAanC,IAAQ,KAAK,IAAI,IAAI4C,CAAC,IACxCF,EAAA,MAAKR,GAAe,KAAK,IAAI,IAAIU,CAAC,MAC3B,OAAO,cAAcN,CAAqB,MACjDI,EAAA,MAAKP,GAAanC,IAAQ,KAAK,IAAI,IAAI4C,CAAC,IAAI,KAAK,MAAM5C,IAAQ,KAAK,IAAI,IAAI4C,IAAIN,CAAqB,CAAC,IACjG,KAAA,cAAc,KAAK,IAAI,IAAIM,CAAC,IAAI,KAAK,IAAI,IAAIA,IAAIN,CAAqB,IAG/E,KAAK,OAAO;AAAA,UAChB;AACA;AAAA,QACJ,KAAK;AACD,UAAItC,aAAiBqC,MACZK,EAAA,MAAAP,GAAa,CAACnC,EAAM,YACpB0C,EAAA,MAAAR,GAAe,CAAClC,EAAM;AAE/B;AAAA,MACR;AACO,aAAA;AAAA,IAAA;AAGJ,IAAAwC,EAAA,eAAQ,MAAgB;AACrB,YAAAK,IAAI,IAAIR;AACZ,aAAAQ,EAAA,YAAY,CAACC,EAAA,MAAKX,IAClBU,EAAA,cAAc,CAACC,EAAA,MAAKZ,IACfW;AAAA,IAAA;AAyFJ,IAAAL,EAAA,aAAM,OACTE,EAAA,MAAKP,GAAa,KAAK,IAAIW,EAAA,MAAKX,EAAU,IAC1CO,EAAA,MAAKR,GAAe,KAAK,IAAIY,EAAA,MAAKZ,EAAY,IACvC;AAGJ,IAAAM,EAAA,aAAM,CAACK,MAAsC;AAChD,UAAIA,aAAaR,GAAU;AACvB,cAAMU,IAAYD,EAAA,MAAKX,IACnBtB,IAAYiC,EAAA,MAAKZ;AAErB,QAAAQ,EAAA,MAAKP,GAAaY,IAAIF,EAAE,cAAcA,EAAE,YAAYhC,IAC/C6B,EAAA,MAAAR,GAAerB,IAAIgC,EAAE;AAAA,MAAA;AAE1B,eAAO,KAAK,IAAI,IAAIR,EAASQ,CAAC,CAAC;AAGnC,aAAO,KAAK;IAAO;AAGhB,IAAAL,EAAA,iBAAU,CAACQ,OACV,OAAO,cAAcA,CAAC,MACtBN,EAAA,MAAKP,GAALW,EAAA,MAAKX,KAAca,IACnBN,EAAA,MAAKR,GAALY,EAAA,MAAKZ,KAAgBc,KAElB;AAMJ;AAAA;AAAA;AAAA,IAAAR,EAAA,mBAAY,IAAIK,MACZA,EAAE,MAAM,CAAKI,MAAAA,EAAE,QAAQJ,EAAE,CAAC,CAAC,CAAC;AAShC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAL,EAAA,iBAAU,CAACK,GAAyBK,MAAgC;AACvE,MAAIA,MAAS,WACFA,IAAA;AAGP,UAAAC;AAOJ,cANIN,aAAaR,IACbc,IAAkBN,EAAE,UAEFM,IAAA,IAAId,EAASQ,CAAC,GAG5BK,GAAM;AAAA,QACV,KAAK;AACM,iBAAA,KAAK,QAAQC,EAAgB;AAAA,QACxC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACM,iBAAA,KAAK,SAASA,EAAgB;AAAA,QACzC,KAAK;AACM,iBAAA,KAAK,QAAQA,EAAgB;AAAA,QACxC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACM,iBAAA,KAAK,SAASA,EAAgB;AAAA,QACzC,KAAK;AAIM,iBAAA,KAAK,UAAUA,EAAgB;AAAA,QAC1C,KAAK;AACM,iBAAA,KAAK,UAAUA,EAAgB;AAAA,QAC1C;AACW,iBAAA;AAAA,MACf;AAAA,IAAA;AA4BG,IAAAX,EAAA,gBAAS,CAACK,MAAmC;AAC1C,YAAAO,IAAI,IAAIf,EAASQ,CAAC;AAEpB,UAAAO,EAAE,cAAc;AACT,eAAA,IAAIf,IAAW;AAG1B,YAAMU,IAAY,CAACD,EAAA,MAAKX,IACpBtB,IAAY,CAACiC,EAAA,MAAKZ;AAEjB,aAAAQ,EAAA,MAAAP,GAAaY,IAAIK,EAAE,cACnBV,EAAA,MAAAR,GAAerB,IAAIuC,EAAE,YACnB,KAAK;IAAO;AAQhB,IAAAZ,EAAA,kBAAW,OACdE,EAAA,MAAKP,GAAa,QAClBO,EAAA,MAAKR,GAAe,IACb;AAGJ,IAAAM,EAAA,iBAAU,OACbE,EAAA,MAAKP,GAAa,MAClBO,EAAA,MAAKR,GAAe,IACb;AAGJ,IAAAM,EAAA,iBAAU,MAAY;AACnB,YAAAa,IAAI,CAACP,EAAA,MAAKX;AACX,aAAAO,EAAA,MAAAP,GAAa,CAACW,EAAA,MAAKZ,KACxBQ,EAAA,MAAKR,GAAemB,IAEb;AAAA,IAAA;AAGJ,IAAAb,EAAA,yBAAkB,MACdM,EAAA,MAAKb,OACRa,EAAA,MAAKX,GAAW,SAAS,EAAE,UAAU,MAAMW,EAAA,MAAKZ,GAAa,SAAS,EAAE,UAAU;AAGnF,IAAAM,EAAA,iBAAU,CAACc,MACP,KAAK,QAAQA,GAAM,GAAG;AAG1B,IAAAd,EAAA,gBAAS,MACL,KAAK,WAAgB,KAAA,KAAK,QAAQ,MAAM;AAG5C,IAAAA,EAAA,iBAAU,MACN,CAAC,KAAK;AAGV,IAAAA,EAAA,kBAAW,MACP,CAAC,KAAK,WAAA,KAAgB,CAAC,KAAK,MAAM;AAGtC,IAAAA,EAAA,eAAQ,CAACc,MACL,KAAK,QAAQA,GAAM,IAAI;AAG3B,IAAAd,EAAA,mBAAY,CAACc,MACT,KAAK,QAAQA,GAAM,GAAG;AAG1B,IAAAd,EAAA,oBAAa,MACT,KAAK,IAAIM,EAAA,MAAKX,EAAU,MAAM;AAGlC,IAAAK,EAAA,oBAAa,CAACI,MACV,KAAK,QAAQ,IAAIP,IAAW,MAAM,OAAOO,EAAE,MAAO,CAAA,CAAC;AAGvD,IAAAJ,EAAA,eAAQ,CAACc,MACL,KAAK,QAAQA,GAAM,IAAI;AAI3B;AAAA,IAAAd,EAAA,kBAAW,CAACc,MACR,KAAK,QAAQA,GAAM,GAAG;AAG1B,IAAAd,EAAA,eAAQ,MACJ,MAAMM,EAAA,MAAKX,EAAU;AAGzB,IAAAK,EAAA,mBAAY,MACR,KAAK,WAAA,KAAgB,KAAK,WAAW;AAGzC,IAAAA,EAAA,oBAAa,MACT,KAAK,WAAW;AAGpB,IAAAA,EAAA,uBAAgB,MACZM,EAAA,MAAKX,OAAe,MAAMW,EAAA,MAAKZ,OAAiB;AAGpD,IAAAM,EAAA,oBAAa,CAACc,MACV,KAAK,QAAQA,GAAM,IAAI;AAK3B;AAAA,IAAAd,EAAA,mBAAY,MACRM,EAAA,MAAKX,OAAe;AAGxB,IAAAK,EAAA,eAAQ,MACJ,KAAK,WAAgB,KAAA,KAAK,QAAQ,MAAM;AAG5C,IAAAA,EAAA,eAAQ,MACJM,EAAA,MAAKX,OAAe,KAAKW,EAAA,MAAKZ,OAAiB;AAGnD,IAAAM,EAAA,oBAAa,CAACI,MACV,KAAK,QAAQA,EAAE,MAAM,EAAE,UAAU;AAGrC,IAAAJ,EAAA,oBAAa,MACT,KAAK,KAAW,MAAA;AAGpB,IAAAA,EAAA,oBAAa,MACT,CAAC,KAAK;AAGV,IAAAA,EAAA,mBAAY,MACR,KAAK,IAAIR,EAAQ,IAAIc,EAAA,MAAKX,IAAYW,EAAA,MAAKZ,EAAY,CAAC,MAAM;AAGlE,IAAAM,EAAA,oBAAa,MACT,KAAK,MAAQ,EAAA,OAAA,EAAS,gBAAgB;AAG1C,IAAAA,EAAA,kBAAW,MACP,KAAK,KAAKM,EAAA,MAAKX,EAAU,IAAI,MAAM,KAAK,KAAK,KAAKW,EAAA,MAAKZ,EAAY,IAAI,MAAM;AAGjF,IAAAM,EAAA,4BAAqB,MACjB,KAAK,QAAQ;AAGjB,IAAAA,EAAA,4BAAqB,MACjB,KAAK,QAAQ;AAIjB;AAAA,IAAAA,EAAA,gBAAS,MACLM,EAAA,MAAKX,OAAe;AAGxB,IAAAK,EAAA,kBAAW,CAACK,MAA+B;AAIxC,YAAAO,IAAI,IAAIf,EAASQ,CAAC;AAEnB,aAAAH,EAAA,MAAAP,GAAaW,EAAA,MAAKX,KAAaiB,EAAE,YACjCV,EAAA,MAAAR,GAAeY,EAAA,MAAKZ,KAAekB,EAAE,cAEnC,KAAK;IAAO;AAYhB,IAAAZ,EAAA,aAAM,OACTE,EAAA,MAAKP,GAAa,IAClBO,EAAA,MAAKR,GAAe,IACb;AAGJ,IAAAM,EAAA,kBAAW,OACTE,EAAA,MAAAP,GAAa,CAACW,EAAA,MAAKX,KACjB;AAGJ,IAAAK,EAAA,aAAM,CAACI,MAAmC;AAC7C,UAAIA,aAAaP;AACN,eAAA,KAAK,IAAIO,EAAE,KAAK;AAG3B,WAAK,OAAO,GACRA,IAAI,KACJ,KAAK,QAAQ;AAKX,YAAAW,IAAmB,KAAK,MAAM,KAAK,IAAIT,EAAA,MAAKX,IAAY,KAAK,IAAIS,CAAC,CAAC,CAAC,GACtEY,IAAqB,KAAK,MAAM,KAAK,IAAIV,EAAA,MAAKZ,IAAc,KAAK,IAAIU,CAAC,CAAC,CAAC;AAE5E,aAAIW,KAAoB,KAAK,IAAIX,CAAC,MAAME,EAAA,MAAKX,MAEzCqB,KAAsB,KAAK,IAAIZ,CAAC,MAAME,EAAA,MAAKZ,MAC3CQ,EAAA,MAAKP,GAAaW,EAAA,MAAKX,MAAc,KAAK,IAAIS,CAAC,IAC/CF,EAAA,MAAKR,GAAeY,EAAA,MAAKZ,MAAgB,KAAK,IAAIU,CAAC,OAEnDF,EAAA,MAAKP,GAAaW,EAAA,MAAKX,MAAc,KAAK,IAAIS,CAAC,IAC/CF,EAAA,MAAKR,GAAeY,EAAA,MAAKZ,MAAgB,KAAK,IAAIU,CAAC,KAGhD;AAAA,IAAA;AAIJ;AAAA,IAAAJ,EAAA,gBAAS,MAAY;AACxB,YAAMhC,IAAIwB,EAAQ,IAAIc,EAAA,MAAKX,IAAYW,EAAA,MAAKZ,EAAY;AACnD,aAAAQ,EAAA,MAAAP,GAAaW,EAAA,MAAKX,KAAa3B,IAC/BkC,EAAA,MAAAR,GAAeY,EAAA,MAAKZ,KAAe1B,IAEpCsC,EAAA,MAAKZ,KAAe,MACfQ,EAAA,MAAAR,GAAe,CAACY,EAAA,MAAKZ,KACrBQ,EAAA,MAAAP,GAAa,CAACW,EAAA,MAAKX,MAErB;AAAA,IAAA;AAGJ,IAAAK,EAAA,cAAO,CAACI,MAAoB;AAG/B,UAAIA,MAAM;AACC,eAAA;AASX,UALIA,IAAI,KACJ,KAAK,QAAQ,GAIb,CAAC,OAAO,cAAcA,CAAC;AACjB,cAAA,IAAI,MAAM,8BAA8B;AAIlD,UAAI,KAAK,WAAA,KAAgBA,IAAI,MAAM;AACzB,cAAA,IAAI,MAAM,4CAA4C;AAI1D,YAAAM,IAAO,KAAK;AAClB,WAAK,IAAI,GAGT,KAAK,OAAO;AAIN,YAAAK,IAAmB,KAAK,MAAM,KAAK,IAAIT,EAAA,MAAKX,IAAY,KAAK,IAAI,IAAIS,CAAC,CAAC,CAAC,GAC1EY,IAAqB,KAAK,MAAM,KAAK,IAAIV,EAAA,MAAKZ,IAAc,KAAK,IAAI,IAAIU,CAAC,CAAC,CAAC;AAE3E,aAAAF,EAAA,MAAAP,GAAa,KAAK,IAAIW,EAAA,MAAKX,IAAY,KAAK,IAAI,IAAIS,CAAC,CAAC,IACtDF,EAAA,MAAAR,GAAe,KAAK,IAAIY,EAAA,MAAKZ,IAAc,KAAK,IAAI,IAAIU,CAAC,CAAC,KAE3DW,MAAqBT,EAAA,MAAKX,MAE1BqB,MAAuBV,EAAA,MAAKZ,QAEvBQ,EAAA,MAAAP,GAAaW,EAAA,MAAKX,KAAaW,EAAA,MAAKZ,KACzCQ,EAAA,MAAKR,GAAe,IACpBQ,EAAA,MAAKT,IAAiB,MAI1B,KAAK,SAASiB,CAAI,GAEX;AAAA,IAAA;AAMJ;AAAA;AAAA,IAAAV,EAAA,cAAO,MACFM,EAAA,MAAKX,KAAaW,EAAA,MAAKZ,MAAgB,IAAK,IAAI;AAGrD,IAAAM,EAAA,cAAO,MACH,KAAK,KAAK,CAAC;AAGf,IAAAA,EAAA,kBAAW,CAACK,MACXA,aAAaR,IACN,KAAK,IAAIQ,EAAE,MAAM,EAAE,UAAU,IAE7B,KAAK,IAAI,CAACA,CAAC;AAsCnB,IAAAL,EAAA,cAAO,OACVE,EAAA,MAAKP,GAAa,IAClBO,EAAA,MAAKR,GAAe,IACb;AAtnBP,WAAIlC,MAAU,UACL,KAAA,MAAMA,GAAOsC,CAAqB,GAGpC;AAAA,EACX;AAAA,EAsQA,IAAW,cAAsB;AAC7B,WAAOQ,EAAA,MAAKZ;AAAA,EAChB;AAAA,EAEA,IAAW,YAAYlC,GAAe;AAClC,IAAA0C,EAAA,MAAKR,GAAelC;AAAA,EACxB;AAAA,EAEA,IAAW,QAAc;AACrB,WAAA0C,EAAA,MAAKN,IAAQ,UACN;AAAA,EACX;AAAA,EAEA,IAAW,UAAkB;AACrB,WAAA,KAAK,YACDU,EAAA,MAAKZ,OAAiB,IACf,GAAGY,EAAA,MAAKX,EAAU,KAElB,GAAGW,EAAA,MAAKX,EAAU,IAAIW,EAAA,MAAKZ,EAAY,KAG3C,KAAK,MAAM,QAAQ,CAAC;AAAA,EAEnC;AAAA,EAiBA,IAAW,OAAa;AACpB,WAAAQ,EAAA,MAAKN,IAAQ,SACN;AAAA,EACX;AAAA;AAAA,EAwJA,IAAW,YAAoB;AAC3B,WAAOU,EAAA,MAAKX;AAAA,EAChB;AAAA,EAEA,IAAW,UAAUnC,GAAe;AAChC,IAAA0C,EAAA,MAAKP,GAAanC;AAAA,EACtB;AAAA;AAAA,EA8HA,IAAW,MAAc;AACjB,WAAA,KAAK,eACE,GAAG,KAAK,KAAW,MAAA,IAAI,MAAM,GAAG,YAIvC,KAAK,YACD8C,EAAA,MAAKZ,OAAiB,IACf,GAAGY,EAAA,MAAKX,EAAU,KAClBW,EAAA,MAAKX,KAAa,IAClB,MAAMW,EAAA,MAAKV,GAAK,KAAK,CAACU,EAAA,MAAKX,EAAU,OAAOW,EAAA,MAAKZ,EAAY,OAE7D,KAAKY,EAAA,MAAKV,GAAK,KAAKU,EAAA,MAAKX,EAAU,OAAOW,EAAA,MAAKZ,EAAY,OAG/D,KAAK,MAAM,QAAQ,CAAC;AAAA,EAEnC;AAAA,EAEA,IAAW,cAAsB;AAC7B,WAAO,KAAK,WAAW,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK;AAAA,EACrD;AAAA,EAEA,IAAW,QAAc;AACrB,WAAAQ,EAAA,MAAKN,IAAQ,UACN;AAAA,EACX;AAAA,EAEA,IAAW,QAAgB;AACjB,UAAAqB,IAASX,EAAA,MAAKX,KAAaW,EAAA,MAAKZ;AAC/B,WAAAuB,MAAW,IAAI,IAAIA;AAAA,EAC9B;AAOJ;AAnoBIxB,KAAA,eACAC,IAAA,eACAC,IAAA,eACAC,KAAA,eA+GAI,EAnHSH,GAmHK,WAAU,IAAIqB,MAAkD;AAC1E,QAAMC,IAAI,IAAItB,EAAS,EAAE,KAAK;AAE9B,aAAWY,KAAKS;AACZ,IAAAC,EAAE,IAAIV,CAAC;AAGT,SAAAU,EAAA,OAAOD,EAAU,MAAM,GAElBC;AAAA,IAGXnB,EA/HSH,GA+HK,OAAM,IAAIqB,MAAgD;AACpE,MAAIC,IAAI,IAAItB,EAASqB,EAAU,CAAC,CAAC;AAEjC,aAAWE,KAAKF,GAAW;AACjB,UAAAG,IAAU,IAAIxB,EAASuB,CAAC;AAC1B,IAAAC,EAAQ,UAAUF,CAAC,MACnBA,IAAIE,EAAQ;EAEpB;AAEO,SAAAF;AAAA,IAGXnB,EA5ISH,GA4IK,OAAM,IAAIqB,MAAkD;AACtE,MAAIC,IAAI,IAAItB,EAASqB,EAAU,CAAC,CAAC;AAEjC,aAAWE,KAAKF,GAAW;AACjB,UAAAG,IAAU,IAAIxB,EAASuB,CAAC;AAC1B,IAAAC,EAAQ,SAASF,CAAC,MAClBA,IAAIE,EAAQ;EAEpB;AAEO,SAAAF;AAAA,IAGXnB,EAzJSH,GAyJK,QAAO,CAACqB,GAAqCI,MAAkC;AAGnF,QAAAC,IAF8BL,EAAU,IAAI,CAAKT,MAAAA,aAAaZ,IAAWY,IAAI,IAAIZ,EAASY,CAAC,CAAC,EAEnE,KAAK,CAAClC,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK;AAE/D,SAAI8C,KACAC,EAAO,QAAQ,GAGZA;AAAA;AAAA;AAMXvB,EAxKSH,GAwKK,UAAS,CAACqB,MAAoD;AACxE,QAAMM,IAAkC,CAAA,GACpCC,IAAuB;AAE3B,SAAAP,EAAU,QAAQ,CAAKhD,MAAA;AACf,IAAEA,aAAa2B,MACX3B,IAAA,IAAI2B,EAAS3B,CAAC,IAGjBsD,EAAOtD,EAAE,QAAQ,OAAO,EAAE,GAAG,MACrBuD,EAAA,KAAKvD,EAAE,MAAO,CAAA,GAChBsD,EAAAtD,EAAE,GAAG,IAAI;AAAA,EACpB,CACH,GAEMuD;AAAA,IAGXzB,EA1LSH,GA0LK,aAAY,IAAI9B,MAA+C;AACnE,QAAA2D,IAAI,IAAI7B;AAId,aAAWrC,KAASO,GAAQ;AAElB,UAAAsC,IAAI,IAAIR,EAASrC,CAAK;AAC1B,IAAAkE,EAAA,YAAYA,EAAE,YAAYrB,EAAE,WAC5BqB,EAAA,cAAcA,EAAE,cAAcrB,EAAE;AAAA,EACtC;AAEO,SAAAqB;AAAA;AAtMR,IAAMC,IAAN9B;ADZP,IAAA+B,GAAAC,IAAAC,IAAAC;AEGO,MAAMC,GAAQ;AAAA,EAMjB,eAAejE,GAAkB;AALjC,IAAAgC,EAAA,MAAA6B;AACA,IAAA7B,EAAA,MAAA8B;AACA,IAAA9B,EAAA,MAAA+B;AACA,IAAA/B,EAAA,MAAAgC;AAiGA;AAAA;AAAA;AAAA,IAAA/B,EAAA,eAAQ,CAACiC,GAAiBC,GAAkBC,OACxCjC,EAAA,MAAK4B,IAAeK,KAAe,IACnCjC,EAAA,MAAK2B,IAAOK,KAAW,IACvBhC,EAAA,MAAK0B,GAAWK,IAEZ3B,EAAA,MAAKuB,MAAO,MAAM,KAAKvB,EAAA,MAAKsB,KAAW,KACvC1B,EAAA,MAAK6B,IAAW,KAEb;AAMX;AAAA;AAAA;AAAA,IAAA/B,EAAA,gBAAS,MAAY;AAEb,UAAAoC,IAAI,KAAK,MAAM,KAAK,IAAI9B,EAAA,MAAKsB,IAAU,IAAItB,EAAA,MAAKuB,GAAI,CAAC;AACzD,aAAOO,IAAI,KAAG;AACN,YAAA9B,EAAA,MAAKsB,KAAW,KAAK,IAAIQ,GAAG9B,EAAA,MAAKuB,GAAI,MAAM,GAAG;AAE9C,UAAA3B,EAAA,MAAK4B,IAALxB,EAAA,MAAKwB,MAAgBM,IACrBlC,EAAA,MAAK0B,GAAWtB,EAAA,MAAKsB,KAAW,KAAK,IAAIQ,GAAG9B,EAAA,MAAKuB,GAAI,IAGjDO,IAAA,KAAK,MAAM,KAAK,IAAI9B,EAAA,MAAKsB,IAAU,IAAItB,EAAA,MAAKuB,GAAI,CAAC;AACrD;AAAA,QACJ;AACA,QAAAO;AAAA,MACJ;AACO,aAAA;AAAA,IAAA;AAGX,IAAApC,EAAA,kBAAW,CAACO,OACRL,EAAA,MAAK0B,GAALtB,EAAA,MAAKsB,KAAYrB,EAAE,UACZ,KAAK;AAMhB;AAAA;AAAA;AAAA,IAAAP,EAAA,oBAAa,MACF,EAAEM,EAAA,MAAKsB,OAAa,KAAKtB,EAAA,MAAKsB,OAAa,KAAK,CAACtB,EAAA,MAAKyB;AAvI7D,IAAA7B,EAAA,MAAK0B,GAAW,IAChB1B,EAAA,MAAK4B,IAAe,IACpB5B,EAAA,MAAK2B,IAAO,IACZ3B,EAAA,MAAK6B,IAAW,KAEZhE,EAAO,SAAS,KACX,KAAA,MAAMA,EAAO,CAAC,GAAGA,EAAO,CAAC,GAAGA,EAAO,CAAC,CAAC;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAkB;AAClB,WAAOuC,EAAA,MAAKsB;AAAA,EAChB;AAAA,EAEA,IAAI,QAAQpE,GAAe;AACvB,IAAA0C,EAAA,MAAK0B,GAAWpE;AAAA,EACpB;AAAA,EAEA,IAAI,MAAc;AACd,WAAO8C,EAAA,MAAKuB;AAAA,EAChB;AAAA,EAEA,IAAI,IAAIrE,GAAe;AACnB,IAAI,OAAO,cAAcA,CAAK,KAAKA,KAAS,IACxC0C,EAAA,MAAK2B,IAAOrE,MAGZ,QAAQ,IAAI,4BAA4B,GACxC0C,EAAA,MAAK2B,IAAO;AAAA,EAEpB;AAAA,EAEA,IAAI,cAAsB;AACtB,WAAOvB,EAAA,MAAKwB;AAAA,EAChB;AAAA,EAEA,IAAI,YAAYtE,GAAe;AAC3B,IAAA0C,EAAA,MAAK4B,IAAetE;AAAA,EACxB;AAAA,EAEA,IAAI,MAAc;AACV,QAAA6E;AAUA,WARA/B,EAAA,MAAKwB,QAAiB,IAClBO,IAAA,KACG/B,EAAA,MAAKwB,QAAiB,KACzBO,IAAA,MAEAA,IAAA/B,EAAA,MAAKwB,IAAa,YAGtBxB,EAAA,MAAKsB,OAAa,IACX,GAAGtB,EAAA,MAAKwB,GAAY,KAEvBxB,EAAA,MAAKuB,QAAS,IACP,GAAGQ,CAAC,UAAU/B,EAAA,MAAKsB,EAAQ,MAE3B,GAAGS,CAAC,UAAU/B,EAAA,MAAKuB,GAAI,KAAKvB,EAAA,MAAKsB,EAAQ;AAAA,EAG5D;AAAA,EAEA,IAAI,UAAkB;AACd,QAAAS;AAUA,WARA/B,EAAA,MAAKwB,QAAiB,IAClBO,IAAA,KACG/B,EAAA,MAAKwB,QAAiB,KACzBO,IAAA,MAEAA,IAAA/B,EAAA,MAAKwB,IAAa,YAGtBxB,EAAA,MAAKsB,OAAa,IACX,GAAGtB,EAAA,MAAKwB,GAAY,KAEvBxB,EAAA,MAAKuB,QAAS,IACP,GAAGQ,CAAC,QAAQ/B,EAAA,MAAKsB,EAAQ,MAEzB,GAAGS,CAAC,QAAQ/B,EAAA,MAAKuB,GAAI,KAAKvB,EAAA,MAAKsB,EAAQ;AAAA,EAG1D;AAAA,EAEA,IAAI,QAAgB;AACT,WAAAtB,EAAA,MAAKwB,MAAe,KAAK,IAAIxB,EAAA,MAAKsB,IAAU,IAAItB,EAAA,MAAKuB,GAAI;AAAA,EACpE;AAgDJ;AA/IID,IAAA,eACAC,KAAA,eACAC,KAAA,eACAC,KAAA;AFPJ,IAAAO,GAAAC,IAAAC,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AGKO,MAAMC,KAAN,MAAMA,GAAe;AAAA,EAIxB,YAAYC,GAA0BC,GAAiBC,IAAW,KAAK;AAJpE,IAAAtD,EAAA,MAAAyC;AACM,IAAAzC,EAAA,MAAAuC;AACA,IAAAvC,EAAA,MAAAwC;AAKL,QAFArC,EAAA,MAAKqC,IAAYc,IAEb,OAAO,OAAOF,GAAM,UAAU,GAAG;AACjC,YAAMG,IAAMH;AACZ,MAAAjD,EAAA,MAAKoC,GAAYgB,EAAI,KAAK,QAAQ,SAASA,EAAI,KAAK;AAAA,IAAA;AAEpD,MAAApD,EAAA,MAAKoC,GAAaa,EAAiB,MAAQ,EAAA,SAASC,KAAS,CAAC;AAAA,EAEtE;AAAA,EAEO,QAAqB;AACxB,UAAMG,IAASjD,EAAA,MAAKgC,GAAU,OAAA,EAAS;AACvC,QAAIiB,MAAW;AACX,aAAO;AAGX,QAAIA,MAAW;AACX,aAAOC,EAAA,MAAKhB,GAAAO,IAAL;AAGX,QAAIQ,MAAW;AACX,aAAOC,EAAA,MAAKhB,GAAAQ,IAAL;AAIL,UAAA/B,IAASuC,EAAA,MAAKhB,GAAAK,IAAL;AACX,WAAA5B,EAAO,SAAS,IACTA,IAIJuC,EAAA,MAAKhB,GAAAG,IAAL;AAAA,EACX;AAAA,EAEO,gBAA6B;AAChC,QAAIrC,EAAA,MAAKgC,GAAU,OAAO,EAAE,UAAU;AAC5B,YAAA,IAAI,MAAM,4BAA4B;AAEhD,WAAOkB,EAAA,MAAKhB,GAAAM,IAAL;AAAA,EACX;AA+YJ;AA1baR,IAAA,eACAC,KAAA,eAFNC,IAAA,eA8CHC,KAAA,SAA2BjF,GAAeiG,GAAsD;AACrF,SAAA;AAAA,IACH,UAAUnD,EAAA,MAAKiC;AAAA,IACf,OAAO;AAAA,IACP,OAAO,CAAC/E,EAAM,QAAQ,EAAE;AAAA,IACxB,MAAKiG,KAAA,gBAAAA,EAAQ,QAAO;AAAA,IACpB,UAASA,KAAA,gBAAAA,EAAQ,YAAW;AAAA,EAAA;AAEpC,GAEAf,cAAclF,GAAwC;AAClD,MAAIA,aAAiBmE,KAAYnE,EAAM,gBAAA;AAC5B,WAAAgG,EAAA,MAAKhB,GAAAC,IAAL,WAAgCjF,EAAM;AAG3C,QAAAkG,IAAW,IAAI/B,EAASnE,CAAK;AAC5B,SAAA;AAAA,IACH,UAAU8C,EAAA,MAAKiC;AAAA,IACf,OAAOmB;AAAA,IACP,OAAOA,EAAS;AAAA,IAChB,KAAKA,EAAS;AAAA,IACd,SAASA,EAAS;AAAA,EAAA;AAE1B,GAEAf,KAAkC,WAAA;AAC9B,QAAMgB,IAAyB,CAAA;AAChB,EAAArD,EAAA,MAAKgC,GAAU,OAAA,EAAS;AACjC,QAAAsB,IAAStD,EAAA,MAAKgC,GAAU,gBAAA,EAAkB,IAAI,CAAApE,MAAGA,EAAE,KAAK,GAGxD,CAACK,GAAG,GAAGR,CAAM,IAAIuC,EAAA,MAAKgC,GAAU,mBAChCuB,IAAI,IAAI,KAAK,IAAI,GAAG9F,EAAO,IAAI,CAAAG,MAAKA,EAAE,QAAQK,EAAE,KAAK,CAAC,GAMtDuF,IAAK,IAAID,IADL,KAEJE,IAA+C,CAAA;AACrD,WAASC,IAAc,CAACH,GAAGG,KAAeH,GAAGG,KAAeF,GAAI;AACtD,UAAA5F,IAAIsB,EAAQ,iBAAiBwE,CAAW;AAC9B,IAAAD,EAAA;AAAA,MACZ;AAAA,QACI,GAAA7F;AAAA,QACA,IAAIoC,EAAA,MAAKgC,GAAU,SAASpE,GAAG,EAAI;AAAA,MACvC;AAAA,IAAA;AAAA,EAER;AAGA,EAAA6F,EAAgB,KAAK,CAACxF,GAAGC,MAAMD,EAAE,IAAIC,EAAE,CAAC;AAGxC,QAAMyF,IAA8B,CAAA;AACpB,SAAAF,EAAA,QAAQ,CAACvG,GAAO0G,MAAU;AACtC,IAAIA,IAAQ,MACJ1G,EAAM,OAAO,IACbyG,EAAQ,KAAK,CAACzG,EAAM,GAAGA,EAAM,CAAC,CAAC,IACxBuG,EAAgBG,IAAQ,CAAC,EAAE,KAAK1G,EAAM,KAAK,KAClDyG,EAAQ,KAAK;AAAA,MACTF,EAAgBG,IAAQ,CAAC,EAAE;AAAA,MAC3B1G,EAAM;AAAA,IAAA,CACT;AAAA,EAGT,CACH,GAGDyG,EAAQ,QAAQ,CAAUE,MAAA;AAChB,UAAA,CAAC5F,GAAGC,CAAC,IAAI2F;AAEf,QAAI5F,MAAMC;AAEN,MAAAmF,EAAU,KAAKH,EAAA,MAAKhB,GAAAE,IAAL,WAAmBnE,EAAE;AAAA,SACnC;AACD,YAAM6F,KAAaZ,EAAA,MAAKhB,GAAAI,IAAL,WAAkCgB,GAAQrF,GAAGC;AAChE,MAAG4F,OAAa,QACZT,EAAU,KAAKH,EAAA,MAAKhB,GAAAC,IAAL,WAAgC2B,GAAW;AAAA,IAElE;AAAA,EAAA,CACH,GAEMT;AACX,GAEAf,KAA6B,SAAAgB,GAAkBrF,GAAWC,GAAW6F,IAAM,OAAsB;AAC7F,MAAIC,IAAKhE,EAAA,MAAKgC,GAAU,SAAS/D,GAAG,EAAI,GACpCgG,IAAKjE,EAAA,MAAKgC,GAAU,SAAS9D,GAAG,EAAI;AAEpC,MAAA8F,IAAKC,IAAK;AACV,mBAAQ,IAAI,uCAAuC,GAC5C;AAGP,MAAAC;AACI,UAAAhG,IAAID,KAAK,IAAI8F,KAAK;AACtB,IAAAG,KAAOjG,IAAIC,KAAK;AAChB,UAAMiG,IAAOnE,EAAA,MAAKgC,GAAU,SAAUkC,GAAK,EAAI;AAE/C,QAAIC,MAAS;AACF,aAAAD;AACX,IAAWF,IAAKG,IAAO,KACfjG,IAAAgG,GACCD,IAAAE,MAEDlG,IAAAiG,GACCF,IAAAG;AAAA,EAEb;AACA,UAAQlG,IAAIC,KAAK;AACrB,GAEAqE,KAAqC,WAAA;AAI7B,MAAAM,IAAO7C,EAAA,MAAKgC,GAAU,MAAM,GAG5BqB,IAAyB,CAAA;AAIvB,QAAAe,IAAMvB,EAAK;AACjB,EAAIuB,MAAQ,KACRvB,EAAK,SAASuB,CAAG;AAIf,QAAAnG,IAAI4E,EAAK,cAAA,EAAgB;AAC/B,MAAI3E,IAAI2E,EAAK,cAAc,CAAC,EAAE;AAGvB,SAAA3E,EAAE;AACD,IAAAmF,EAAU,WAAW,KACrBA,EAAU,KAAKH,EAAA,MAAKhB,GAAAE,IAAL,WAAmB,EAAE,GAGhCS,IAAAA,EAAK,OAAO,GAAG,GACnB3E,IAAA2E,EAAK,cAAc,CAAC,EAAE;AAI9B,QAAMwB,IAAYnF,EAAQ,SAASjB,EAAE,KAAK,GACpCqG,IAAYpF,EAAQ,SAAShB,EAAE,KAAK;AAG1C,aAAWqG,KAAMF;AACb,eAAWG,KAAMF,GAAW;AACxB,YAAMnE,IAAI,IAAIkB,EAASmD,GAAID,CAAE;AAG7B,MAAK1B,EAAK,SAAS1C,CAAC,EAAe,OAAY,KAAA,CAACkD,EAAU,KAAK,CAAKoB,MAAAA,EAAE,UAAUtE,EAAE,KAAK,KACnFkD,EAAU,KAAKH,EAAA,MAAKhB,GAAAE,IAAL,WAAmBjC,EAAE,GAIxCA,EAAE,SAAS,GACN0C,EAAK,SAAS1C,CAAC,EAAe,OAAY,KAAA,CAACkD,EAAU,KAAK,CAAKoB,MAAAA,EAAE,UAAUtE,EAAE,KAAK,KACnFkD,EAAU,KAAKH,EAAA,MAAKhB,GAAAE,IAAL,WAAmBjC,EAAE;AAAA,IAE5C;AAKJ,aAAWsE,KAAKpB,GAAW;AAEvB,QAAIoB,EAAE,UAAU,MAAUA,EAAE,MAAmB;AAC3C;AAGJ,UAAM,IAAIzE,EAAA,MAAKgC,GAAU,MAAA,EAAQ,MAAM,KAAMyC,EAAE,MAAmB,aAAa,CAAEA,EAAE,MAAmB,SAAS;AAExG,WAAA5B,EAAK,cAAc,CAAC;AAChB,MAAAA,IAAAA,EAAK,OAAO,CAAC;AAAA,EAE5B;AAGA,MAAIA,EAAK,SAAS;AACP,WAAAQ,EAAU,KAAK,CAACpF,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK;AAIrD,MAAI2E,EAAK,SAAS,QAAQ;AACtB,WAAO;AAIL,QAAA6B,IAAS,IAAI9B,GAAeC,GAAMA,EAAK,QAAQ,MAAM,GAAG,GAAG7C,EAAA,MAAKiC,GAAS;AAC/E,SAAAoB,IAAYA,EAAU,OAAOqB,EAAO,MAAO,CAAA,GAEpCrB,EAAU,KAAK,CAACpF,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK;AACrD,GAEAsE,KAAyC,WAAA;AAErC,QAAMK,IAAO7C,EAAA,MAAKgC,IAGZ/D,IAAI4E,EAAK,cAAc,CAAC,EAAE,aAC1B3E,IAAI2E,EAAK,cAAc,CAAC,EAAE,aAC1B8B,IAAI9B,EAAK,cAAc,CAAC,EAAE,aAC1B+B,IAAI/B,EAAK,cAAc,CAAC,EAAE,aAG1BgC,IAAK3G,EAAE,MAAM,EAAE,OAAOD,CAAC,GACvB6G,IAAKH,EAAE,MAAM,EAAE,OAAO1G,CAAC,GACvB8G,IAAKH,EAAE,MAAM,EAAE,OAAO3G,CAAC,GAIvB6B,IAAIgF,EAAG,MAAM,EAAE,SAASD,EAAG,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,GACnDG,IAAID,EAAG,MAAA,EACR,SAASF,EAAG,MAAA,EAAQ,SAASC,CAAE,EAAE,OAAO,CAAC,CAAC,EAC1C,IAAID,EAAG,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,GAS3ClF,IAAIqF,EAAE,MAAM,EAAE,SAAS,GACvBC,IAAInF,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAC,EAAE,OAAO,EAAE,GAMzCoF,KAAQvF,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAASsF,EAAE,MAAQ,EAAA,SAAS,CAAC,CAAC,EAAE,SAAS;AAOpE,MAAAC,GAAM,cAAc;AACpB,UAAM5H,KAAI0H,EAAE,MAAA,EAAQ,WAAW,IAAIE,GAAM,MAAA,EAAQ,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,GAC9E3H,KAAIyH,EAAE,MAAA,EAAQ,WAAW,SAASE,GAAM,MAAA,EAAQ,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,GAEnFtH,KAAIN,GAAE,MAAM,EAAE,IAAIC,EAAC,EAAE,SAASsH,EAAG,MAAA,EAAQ,OAAO,CAAC,CAAC;AAExD,WAAO,CAAC3B,EAAA,MAAKhB,GAAAE,IAAL,WAAmBxE,GAAE;AAAA,EACjC;AAGI,MAAAsH,GAAM,UAAU;AACV,UAAA5H,KAAI0H,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,EAAE,KAAK,CAAC,GAEzCG,KAAK7H,GAAE,MAAM,EAAE,SAAS,EAAE,SAASuH,EAAG,MAAM,EAAE,OAAO,CAAC,CAAC,GACvDO,KAAK9H,GAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAASuH,EAAG,MAAA,EAAQ,OAAO,CAAC,CAAC;AAG1D,WAAAM,GAAG,QAAQC,EAAE,IACN,CAAClC,EAAA,MAAKhB,GAAAE,IAAL,WAAmB+C,GAAG,IAG3B;AAAA,MACHjC,EAAA,MAAKhB,GAAAE,IAAL,WAAmBgD;AAAA,MACnBlC,EAAA,MAAKhB,GAAAE,IAAL,WAAmB+C;AAAA,IAAE,EACvB,KAAK,CAAClH,IAAGC,OAAMD,GAAE,QAAQC,GAAE,KAAK;AAAA,EACtC;AAGI,MAAAgH,GAAM,cAAc;AACpB,UAAMtH,KAAc,CAAA,GACdyH,KAAKvF,EAAE,OACTwF,KAAKN,EAAE,OACPO,KAAMV,EAAG;AAEb,aAAS7G,KAAI,GAAGA,KAAI,GAAGA;AACnB,MAAAJ,GAAE,KAAK,IAAI,KAAK,KAAK,CAACyH,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAIC,MAAM,IAAID,MAAM,KAAK,KAAK,KAAKA,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,KAAKrH,KAAI,CAAC,IAAIuH,KAAM,CAAC;AAGnI,WAAO3H,GACF,IAAI,CAAKL,OAAA2F,EAAA,MAAKhB,GAAAC,IAAL,WAAgC5E,GAAE,EAC3C,KAAK,CAACU,IAAGC,OAAMD,GAAE,QAAQC,GAAE,KAAK;AAAA,EAEzC;AAEA,SAAO;AACX,GAEAuE,KAA4B,WAAA;AAExB,QAAM,CAACxE,GAAGC,CAAC,IAAI8B,EAAA,MAAKgC,GAAU,mBAGxB7B,IAAIjC,EAAE,SAAS,EAAE,OAAOD,CAAC;AAExB,SAAA;AAAA,IACHiF,EAAA,MAAKhB,GAAAE,IAAL,WAAmBjC;AAAA,EAAC;AAE5B,GAEAuC,KAA+B,WAAA;AAI3B,QAAMG,IAAO7C,EAAA,MAAKgC,IAGZ,CAAC/D,GAAGC,GAAGyG,CAAC,IAAI9B,EAAK,mBAGjB2C,IAAStH,EAAE,MAAQ,EAAA,IAAI,CAAC,EAAE,SAASD,EAAE,MAAA,EAAQ,SAAS0G,CAAC,EAAE,SAAS,CAAC,CAAC;AAGtE,MAAAa,EAAO;AACP,WAAO;AAOP,MAAAA,EAAO,YAAY;AAGb,UAAAN,IAAQM,EAAO,QACfC,IAAKvH,EAAE,MAAM,EAAE,WAAW,IAAIgH,CAAK,EAAE,OAAOjH,EAAE,MAAA,EAAQ,SAAS,CAAC,CAAC,GACjEyH,IAAKxH,EAAE,MAAM,EAAE,WAAW,SAASgH,CAAK,EAAE,OAAOjH,EAAE,MAAA,EAAQ,SAAS,CAAC,CAAC;AAGxE,WAAAiH,EAAM,WACC,CAAChC,EAAA,MAAKhB,GAAAE,IAAL,WAAmBqD,EAAG,IAI3B;AAAA,MACHvC,EAAA,MAAKhB,GAAAE,IAAL,WAAmBqD;AAAA,MACnBvC,EAAA,MAAKhB,GAAAE,IAAL,WAAmBsD;AAAA,IAAE,EACvB,KAAK,CAACzH,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK;AAAA,EACtC;AAQA,SAAOgF,EAAA,MAAKhB,GAAAS,IAAL,WAA4B1E,GAAGC,GAAGsH;AAC7C,GAEA7C,KAAA,SAAuB1E,GAAaC,GAAagH,GAA8B;AAKrE,QAAAS,IAAsBzG,EACvB,SAASgG,EAAM,KAAK,EACpB,OAAO,CAAKtH,OAAA,KAAK,KAAKA,EAAC,IAAI,MAAM,CAAC,EAClC,IAAI,CAAKA,OAAA,KAAK,KAAKA,EAAC,CAAC,EAAE,IAAA,KAAS,GAG/BgI,IAAM1G,EAAQ,IAAI,IAAIjB,EAAE,OAAOC,EAAE,OAAOyH,CAAW,KAAK1H,EAAE,eAAe,KAAK,IAG9E4H,IAAK3H,EAAE,MAAA,EAAQ,OAAO0H,CAAG,EAAE,YAC3BE,IAAK7H,EAAE,MAAM,EAAE,OAAO2H,CAAG,EAAE,SAAS,CAAC,GACrCJ,IAASN,EAAM,MAAA,EAAQ,OAAOS,KAAe,CAAC,GAC9CI,IAAW,KAAK,IAAIJ,IAAcC,CAAG,GACrCI,IAAUL,MAAgB,IAAI,MAAM,IAAII,CAAQ,KAChDE,IAAUN,MAAgB,IAAI,MAAM,IAAII,CAAQ;AAEtD,WAASG,EAAUjI,IAAWC,IAAWgC,IAAWgF,IAAe;AAC/D,WAAO,WAAWhH,EAAC,IAAIgC,EAAC,WAAWgF,EAAK,SAASjH,EAAC;AAAA,EACtD;AAEA,WAASkI,GAAclI,IAAWC,IAAWgC,IAAWgF,IAAe;AACnE,WAAO,IAAIhH,EAAC,GAAGgC,EAAC,QAAQgF,EAAK,MAAMjH,EAAC;AAAA,EACxC;AAEM,QAAA2G,KAAIM,EAAM,SAAS,KACnBO,MAAM,CAACvH,EAAE,QAAQ0G,OAAM,IAAI3G,EAAE,QAC7ByH,MAAM,CAACxH,EAAE,QAAQ0G,OAAM,IAAI3G,EAAE;AAE5B,SAAA;AAAA,IACHiF,EAAA,MAAKhB,GAAAC,IAAL,WAAgCsD,IAC5B;AAAA,MACI,KAAKS,EAAUJ,EAAG,KAAKD,EAAG,KAAKG,EAAQ,SAAA,GAAYR,EAAO,GAAG;AAAA,MAC7D,SAASW,GAAcL,EAAG,SAASD,EAAG,SAASG,EAAQ,SAAA,GAAYR,EAAO,OAAO;AAAA,IACrF;AAAA,IAEJtC,EAAA,MAAKhB,GAAAC,IAAL,WAAgCuD,IAC5B;AAAA,MACI,KAAKQ,EAAUJ,EAAG,KAAKD,EAAG,KAAKI,EAAQ,SAAA,GAAYT,EAAO,GAAG;AAAA,MAC7D,SAASW,GAAcL,EAAG,SAASD,EAAG,SAASI,EAAQ,SAAA,GAAYT,EAAO,OAAO;AAAA,IACrF;AAAA,EACJ,EACF,KAAK,CAACvH,IAAGC,OAAMD,GAAE,QAAQC,GAAE,KAAK;AACtC;AA1bG,IAAMkI,KAANxD;ACNP,IAAIyD,KAAI,OAAO,gBACXtE,KAAI,CAACxB,MAAM;AACb,QAAM,UAAUA,CAAC;AACnB,GACIrC,KAAI,CAACqC,GAAGkE,GAAG6B,MAAM7B,KAAKlE,IAAI8F,GAAE9F,GAAGkE,GAAG,EAAE,YAAY,IAAI,cAAc,IAAI,UAAU,IAAI,OAAO6B,EAAC,CAAE,IAAI/F,EAAEkE,CAAC,IAAI6B,GACzGC,KAAI,CAAChG,GAAGkE,GAAG6B,MAAMpI,GAAEqC,GAAG,OAAOkE,KAAK,WAAWA,IAAI,KAAKA,GAAG6B,CAAC,GAAGrB,KAAI,CAAC1E,GAAGkE,GAAG6B,MAAM7B,EAAE,IAAIlE,CAAC,KAAKwB,GAAE,YAAYuE,CAAC,GACzGrI,KAAI,CAACsC,GAAGkE,GAAG6B,OAAOrB,GAAE1E,GAAGkE,GAAG,yBAAyB,GAAG6B,IAAIA,EAAE,KAAK/F,CAAC,IAAIkE,EAAE,IAAIlE,CAAC,IAAIL,KAAI,CAACK,GAAGkE,GAAG6B,MAAM7B,EAAE,IAAIlE,CAAC,IAAIwB,GAAE,mDAAmD,IAAI0C,aAAa,UAAUA,EAAE,IAAIlE,CAAC,IAAIkE,EAAE,IAAIlE,GAAG+F,CAAC,GAAGrG,KAAI,CAACM,GAAGkE,GAAG6B,GAAG3B,OAAOM,GAAE1E,GAAGkE,GAAG,wBAAwB,GAAsBA,EAAE,IAAIlE,GAAG+F,CAAC,GAAGA;AACjT,MAAM/I,KAAI;AAAA,EACR,IAAI,KAAK;AAAA,EACT,GAAG,KAAK,IAAI,CAAC;AACf;AACA,IAAIiJ,IAAqB,kBAACjG,OAAOA,EAAE,WAAW,YAAYA,EAAE,cAAc,eAAeA,EAAE,YAAY,aAAaA,EAAE,WAAW,YAAYA,EAAE,WAAW,YAAYA,EAAE,oBAAoB,qBAAqBA,EAAE,QAAQ,SAASA,EAAE,mBAAmB,KAAKA,EAAE,oBAAoB,KAAKA,IAAIiG,KAAK,EAAE,GAAGlJ,KAAqB,kBAACiD,OAAOA,EAAE,aAAa,cAAcA,EAAE,UAAU,WAAWA,EAAE,MAAM,OAAOA,EAAE,UAAU,WAAWA,IAAIjD,MAAK,CAAE,CAAA;AACza,SAASyC,GAAEQ,GAAGkE,GAAG;AACf,MAAIlE,EAAE,UAAU;AACd,WAAOA;AACT,QAAM+F,IAAI,OAAO,KAAK7B,CAAC,EAAE,OAAO,CAACgC,MAAMhC,EAAEgC,CAAC,EAAE,SAASD,EAAE,QAAQ,EAAE,IAAI,CAACC,MAAMA,CAAC;AAC7E,EAAAH,EAAE,KAAK,CAACG,GAAGC,MAAMA,EAAE,SAASD,EAAE,MAAM;AACpC,QAAM9B,IAAI,IAAI,OAAO,KAAK2B,EAAE,KAAK,GAAG,CAAC,MAAM,GAAGtI,IAAI,OAAO,KAAKT,EAAC;AAC/D,EAAAS,EAAE,KAAK,CAACyI,GAAGC,MAAMA,EAAE,SAASD,EAAE,MAAM;AACpC,QAAME,IAAI,IAAI,OAAO,KAAK3I,EAAE,KAAK,GAAG,CAAC,GAAG,GAAG4I,IAAI;AAC/C,MAAIzG,IAAI,IAAIyE,GAAG9E,GAAG+G;AAClB,SAAOtG,EAAE,SAAS,KAAK;AACrB,QAAIqE,IAAI9E,GAAG+G,IAAI,QAAQP,EAAE,SAAS,KAAK3B,EAAE,KAAKpE,CAAC,GAAG;AAChD,YAAMkG,IAAIH,EAAE,KAAK,CAACI,MAAMnG,EAAE,WAAWmG,CAAC,CAAC;AACvC,MAAAD,MAAMI,IAAIJ,IAAI,KAAKlG,IAAIA,EAAE,MAAMkG,EAAE,SAAS,CAAC,GAAG3G,IAAI0G,EAAE;AAAA,IAC1D,WAAexI,EAAE,SAAS,KAAK2I,EAAE,KAAKpG,CAAC,GAAG;AACpC,YAAMkG,IAAIzI,EAAE,KAAK,CAAC0I,MAAMnG,EAAE,WAAWmG,CAAC,CAAC;AACvC,MAAAD,MAAMI,IAAIJ,GAAGlG,IAAIA,EAAE,MAAMkG,EAAE,MAAM,GAAG3G,IAAI0G,EAAE;AAAA,IAC3C,WAAUI,EAAE,KAAKrG,CAAC,GAAG;AACpB,YAAMkG,IAAIG,EAAE,KAAKrG,CAAC;AAClB,MAAAkG,MAAMI,IAAIJ,EAAE,CAAC,GAAGlG,IAAIA,EAAE,MAAMkG,EAAE,CAAC,EAAE,MAAM,GAAG3G,IAAI0G,EAAE;AAAA,IACjD;AACC,cAAQK,IAAItG,EAAE,CAAC,GAAGA,IAAIA,EAAE,MAAM,CAAC,GAAGsG,GAAC;AAAA,QACjC,KAAK;AACH,UAAA/G,IAAI0G,EAAE;AACN;AAAA,QACF,KAAK;AACH,UAAA1G,IAAI0G,EAAE;AACN;AAAA,QACF,KAAK;AACH,UAAA1G,IAAI0G,EAAE;AACN;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,UAAA1G,IAAI0G,EAAE;AACN;AAAA,QACF;AACE,UAAA1G,IAAI0G,EAAE;AAAA,MACT;AACH,QAAIK,MAAM,UAAU/G,MAAM;AACxB,YAAM,IAAI,MAAM,wBAAwB;AAC1C,IAAAK,KAAK2G,GAAElC,GAAG9E,CAAC,GAAGK,KAAK0G;AAAA,EACpB;AACD,SAAO1G;AACT;AACA,SAAS2G,GAAEvG,GAAGkE,GAAG;AACf,SAAOlE,MAAM,UAAUA,MAAMiG,EAAE,aAAa/B,MAAM+B,EAAE,aAAajG,MAAMiG,EAAE,oBAAoBjG,MAAMiG,EAAE,YAAYjG,MAAMiG,EAAE,qBAAqB/B,MAAM+B,EAAE,qBAAqB/B,MAAM+B,EAAE,oBAAoB,KAAK;AAC9M;AACA,MAAMO,KAAI;AAAA,EACR,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMP,EAAE,UAAW;AAAA,EAC/D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAChE,GAAGQ,KAAI;AAAA,EACL,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMR,EAAE,UAAW;AAAA,EAC/D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,UAAW;AAAA,EAC/D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC9D,MAAM,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC/D,OAAO,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAChE,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,kBAAmB;AACxE,GAAG7G,KAAI;AAAA,EACL,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAM6G,EAAE,UAAW;AAAA,EAC/D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,UAAW;AAAA,EAC/D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC9D,MAAM,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC/D,OAAO,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAChE,IAAI,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAAA,EAC7D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,SAAU;AAChE,GAAG3F,KAAI;AAAA,EACL,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAM2F,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAAA,EAC9D,KAAK,EAAE,YAAY,GAAG,aAAa,SAAS,MAAMA,EAAE,UAAW;AAAA,EAC/D,KAAK,EAAE,YAAY,GAAG,aAAa,QAAQ,MAAMA,EAAE,UAAW;AAChE;AACA,IAAIS,IAAG7F,IAAG8F,IAAGxJ,IAAGyJ;AAChB,MAAMC,GAAE;AAAA,EACN,YAAY3C,GAAG;AACb,IAAAvE,GAAE,MAAM+G,EAAC,GACT/G,GAAE,MAAMkB,IAAG,CAAA,CAAE,GACblB,GAAE,MAAMgH,IAAG,CAAA,CAAE,GACbhH,GAAE,MAAMxC,IAAG,CAAA,CAAE,GACbwC,GAAE,MAAMiH,EAAC,GACTlH,GAAE,MAAMgH,IAAG,OAAOxC,IAAI,MAAMnH,GAAE,UAAUmH,CAAC,GAAG,KAAK,0BAAyB;AAAA,EAC3E;AAAA;AAAA,EAED,IAAI,MAAM;AACR,WAAOxG,GAAE,MAAMmD,EAAC;AAAA,EACjB;AAAA,EACD,IAAI,WAAW;AACb,WAAOnD,GAAE,MAAMmD,EAAC,EAAE,IAAI,CAACqD,MAAMA,EAAE,KAAK;AAAA,EACrC;AAAA,EACD,4BAA4B;AAC1B,WAAOxG,GAAE,MAAMgJ,EAAC,MAAM3J,GAAE,OAAO2C,GAAE,MAAMiH,IAAGrG,EAAC,GAAGZ,GAAE,MAAMkH,IAAG,EAAE,KAAKlJ,GAAE,MAAMgJ,EAAC,MAAM3J,GAAE,WAAW2C,GAAE,MAAMiH,IAAGvH,EAAC,GAAGM,GAAE,MAAMkH,IAAG,EAAE,KAAKlJ,GAAE,MAAMgJ,EAAC,MAAM3J,GAAE,cAAc2C,GAAE,MAAMiH,IAAGF,EAAC,GAAG/G,GAAE,MAAMkH,IAAG,EAAE,MAAMlH,GAAE,MAAMiH,IAAGH,EAAC,GAAG9G,GAAE,MAAMkH,IAAG,EAAE,IAAIlH,GAAE,MAAMvC,IAAG,OAAO,KAAKO,GAAE,MAAMiJ,EAAC,CAAC,EAAE,KAAK,CAACzC,GAAG6B,MAAMA,EAAE,SAAS7B,EAAE,MAAM,CAAC,GAAGxG,GAAE,MAAMiJ,EAAC;AAAA,EACjT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMD,UAAUzC,GAAG6B,GAAG;AACd,QAAI3B,GAAG3G;AACP,QAAI2G,IAAI,IAAI3G,IAAI,QAAQyG,EAAE6B,CAAC,MAAM;AAC/B,MAAA3B,IAAI,KAAK3G,IAAIwI,EAAE;AAAA,aACR/B,EAAE6B,CAAC,MAAM;AAChB,MAAA3B,IAAI,KAAK3G,IAAIwI,EAAE;AAAA,aACR/B,EAAE6B,CAAC,MAAM;AAChB,MAAA3B,IAAI,KAAK3G,IAAIwI,EAAE;AAAA,SACZ;AACH,iBAAWG,KAAK1I,GAAE,MAAMP,EAAC;AACvB,YAAI+G,EAAE,UAAU6B,GAAGA,IAAIK,EAAE,MAAM,MAAMA,GAAG;AACtC,UAAAhC,KAAKgC,GAAG3I,IAAIC,GAAE,MAAMiJ,EAAC,EAAEP,CAAC,EAAE;AAC1B;AAAA,QACD;AACH,iBAAWA,KAAKpJ;AACd,YAAIkH,EAAE,UAAU6B,GAAGA,IAAIK,EAAE,MAAM,MAAMA,GAAG;AACtC,UAAAhC,KAAKgC,GAAG3I,IAAIwI,EAAE;AACd;AAAA,QACD;AACH,UAAI7B,MAAM;AACR,YAAI,SAAS,KAAKF,EAAE6B,CAAC,CAAC,GAAG;AACvB,gBAAMK,IAAI,aAAa,KAAKlC,EAAE,UAAU6B,CAAC,CAAC;AAC1C,UAAA3B,IAAIgC,IAAIA,EAAE,CAAC,IAAI,IAAI3I,IAAIwI,EAAE;AAAA,QAC1B,WAAU,WAAW,KAAK/B,EAAE6B,CAAC,CAAC,GAAG;AAChC,gBAAMK,IAAI,cAAc,KAAKlC,EAAE,UAAU6B,CAAC,CAAC;AAC3C,UAAA3B,IAAIgC,IAAIA,EAAE,CAAC,IAAI,IAAI3I,IAAIwI,EAAE;AAAA,QAC1B;AACC,kBAAQ,IAAI,sBAAsB/B,EAAE6B,CAAC,GAAG7B,GAAG6B,CAAC,GAAG3B,IAAIF,EAAE6B,CAAC,GAAGtI,IAAIwI,EAAE;AAAA,IACpE;AACD,QAAIxI,MAAM;AACR,YAAM,IAAI,MAAM,qCAAqC2G,CAAC,EAAE;AAC1D,WAAO,CAACA,GAAG2B,IAAI3B,EAAE,QAAQ3G,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOD,MAAMyG,GAAG6B,GAAG;AACV,UAAM3B,IAAI,CAAA,GAAI3G,IAAI;AAClB,QAAI2I,IAAI,IAAIC,IAAI,GAAGzG;AACnB,KAACmG,KAAKrI,GAAE,MAAMkJ,EAAC,OAAO1C,IAAI1E,GAAE0E,GAAGxG,GAAE,MAAMiJ,EAAC,CAAC;AACzC,UAAMtC,IAAI;AACV,QAAI9E,IAAI,IAAI+G;AACZ,WAAOD,IAAInC,EAAE,UAAU;AACrB,UAAI3E,KAAKA,MAAM,GAAG;AAChB,gBAAQ,IAAI,uBAAuB;AACnC;AAAA,MACD;AACD,cAAQ,CAAC6G,GAAGC,GAAGzG,CAAC,IAAI,KAAK,UAAUsE,GAAGmC,CAAC,GAAGzG,GAAC;AAAA,QACzC,KAAKqG,EAAE;AAAA,QACP,KAAKA,EAAE;AAAA,QACP,KAAKA,EAAE;AAAA,QACP,KAAKA,EAAE;AACL,UAAA7B,EAAE,KAAK;AAAA,YACL,OAAOgC;AAAA,YACP,WAAWxG;AAAA,UACvB,CAAW;AACD;AAAA,QACF,KAAKqG,EAAE;AACL,cAAIxI,EAAE,SAAS,GAAG;AAChB,gBAAIyI,IAAIzI,EAAEA,EAAE,SAAS,CAAC;AACtB,iBAAK6I,IAAI,CAACjC,GAAG6B,EAAE,SAASxI,GAAE,MAAMiJ,EAAC;AAAA,aAChCjJ,GAAE,MAAMiJ,EAAC,EAAEP,CAAC,EAAE,gBAAgB,UAAU1I,GAAE,MAAMiJ,EAAC,EAAEP,CAAC,EAAE,cAAc1I,GAAE,MAAMiJ,EAAC,EAAET,EAAE,KAAK,EAAE;AAAA,YACzFxI,GAAE,MAAMiJ,EAAC,EAAEP,CAAC,EAAE,gBAAgB,WAAW1I,GAAE,MAAMiJ,EAAC,EAAEP,CAAC,EAAE,aAAa1I,GAAE,MAAMiJ,EAAC,EAAET,EAAE,KAAK,EAAE,eAAe;AACrG,kBAAII,KAAKA,MAAM,GAAG;AAChB,wBAAQ,IAAI,iCAAiC;AAC7C;AAAA,cACD;AACD,kBAAIlC,EAAE,KAAK3G,EAAE,IAAG,KAAM,EAAE,OAAO,IAAI,WAAWwI,EAAE,UAAS,CAAE,GAAGxI,EAAE,WAAW;AACzE;AACF,cAAAyI,IAAIzI,EAAEA,EAAE,SAAS,CAAC;AAAA,YACnB;AAAA,UACF;AACD,UAAAA,EAAE,KAAK,EAAE,OAAO2I,GAAG,WAAWxG,EAAC,CAAE;AACjC;AAAA,QACF,KAAKqG,EAAE;AACL,eAAKK,IAAI,CAACjC,GAAG5G,EAAEA,EAAE,SAAS,CAAC,EAAE,UAAU,OAAOA,EAAE,SAAS,KAAK;AAC5D,gBAAI6I,KAAKA,MAAM,GAAG;AAChB,sBAAQ,IAAI,yCAAyC;AACrD;AAAA,YACD;AACD,YAAAlC,EAAE,KAAK3G,EAAE,IAAK,KAAI,EAAE,OAAO2I,GAAG,WAAWxG,EAAC,CAAE;AAAA,UAC7C;AACD;AAAA,QACF,KAAKqG,EAAE;AACL,UAAAxI,EAAE,KAAK,EAAE,OAAO2I,GAAG,WAAWxG,EAAC,CAAE,GAAGsE,EAAEmC,CAAC,MAAM,OAAOjC,EAAE,KAAK,EAAE,OAAO,KAAK,WAAW6B,EAAE,YAAW,CAAE;AACnG;AAAA,QACF,KAAKA,EAAE;AACL,eAAKK,IAAI,CAACjC,GAAG5G,EAAEA,EAAE,SAAS,CAAC,EAAE,UAAU,OAAOA,EAAE,SAAS,KAAK;AAC5D,gBAAI6I,KAAKA,MAAM,GAAG;AAChB,sBAAQ,IAAI,2CAA2C;AACvD;AAAA,YACD;AACD,YAAAlC,EAAE,KAAK3G,EAAE,IAAK,KAAI,EAAE,OAAO2I,GAAG,WAAWxG,EAAC,CAAE;AAAA,UAC7C;AACD,UAAAnC,EAAE,IAAG;AACL;AAAA,QACF,KAAKwI,EAAE;AACL,UAAAxI,EAAE,KAAK,EAAE,OAAO2I,GAAG,WAAWxG,EAAC,CAAE;AACjC;AAAA,QACF;AACE,gBAAM,IAAI,MAAM,cAAcwG,CAAC,iBAAiB;AAAA,MACnD;AAAA,IACF;AACD,WAAO1G,GAAE,MAAMmB,IAAGuD,EAAE,OAAO3G,EAAE,QAAO,CAAE,CAAC,GAAG;AAAA,EAC3C;AACH;AACAiJ,KAAI,oBAAI,QAAO,GAAI7F,KAAI,oBAAI,QAAO,GAAI8F,KAAI,oBAAI,QAAO,GAAIxJ,KAAI,oBAAI,QAAO,GAAIyJ,KAAI,oBAAI,QAAO;AAC3F,MAAMrG,GAAE;AAAA,EACN,YAAY2D,GAAG6B,GAAG;AAChB,IAAAC,GAAE,MAAM,MAAM,GACdA,GAAE,MAAM,aAAa,GACrBA,GAAE,MAAM,UAAU,GAClB,KAAK,cAAc9B;AACnB,QAAI;AACF,WAAK,OAAO,IAAI2C,GAAE9J,GAAE,OAAO,EAAE,MAAMmH,GAAG6B,CAAC,EAAE;AAAA,IAC/C,QAAY;AACN,YAAM,KAAK,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,MAAM,gCAAgC7B,CAAC,EAAE;AAAA,IAC1F;AAAA,EACF;AAAA,EACD,IAAI,MAAM;AACR,WAAO,KAAK,QAAQ;EACrB;AAAA,EACD,IAAI,UAAU;AACZ,QAAI,KAAK,aAAa;AACpB,UAAI;AACF,aAAK,SAAS,EAAE,GAAG,EAAG,CAAA;AAAA,MAC9B,QAAc;AACN,aAAK,WAAW;AAAA,MACjB;AACH,WAAO,KAAK,YAAY;AAAA,EACzB;AAAA,EACD,IAAI,QAAQA,GAAG;AACb,SAAK,WAAWA;AAAA,EACjB;AAAA,EACD,IAAI,aAAa;AACf,WAAO,KAAK;AAAA,EACb;AAAA,EACD,SAASA,GAAG;AACV,UAAM6B,IAAI,CAAA;AACV,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK,WAAW,IAAI;AAC7B,SAAK,WAAW;AAChB,eAAW3B,KAAK,KAAK;AACnB,UAAIA,EAAE,cAAc6B,EAAE;AACpB,YAAI,CAAC,MAAM,CAAC7B,EAAE,KAAK;AACjB,UAAA2B,EAAE,KAAK,CAAC3B,EAAE,KAAK;AAAA,aACZ;AACH,gBAAM3G,IAAI2G,EAAE,MAAM,MAAM,GAAG;AAC3B,cAAI3G,EAAE,WAAW;AACf,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,oCAAoC;AAC1E,UAAAsI,EAAE,KAAK,CAACtI,EAAE,CAAC,IAAI,CAACA,EAAE,CAAC,CAAC;AAAA,QACrB;AAAA,eACM2G,EAAE,cAAc6B,EAAE,YAAY/B,MAAM;AAC3C,eAAO,OAAOA,GAAGE,EAAE,KAAK,KAAK2B,EAAE,KAAK,CAAC7B,EAAEE,EAAE,KAAK,CAAC;AAAA,eACxCA,EAAE,cAAc6B,EAAE;AACzB,QAAAF,EAAE,KAAK/I,GAAEoH,EAAE,KAAK,CAAC;AAAA,eACVA,EAAE,cAAc6B,EAAE;AACzB,YAAI7B,EAAE,UAAU,KAAK;AACnB,gBAAM3G,IAAIsI,EAAE,IAAG,GAAIK,IAAIL,EAAE;AACzB,cAAIK,MAAM,UAAU3I,MAAM;AACxB,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,8BAA8B2I,KAAK,GAAG,OAAO3I,KAAK,GAAG,kBAAkB;AAC7G,UAAAsI,EAAE,KAAKK,IAAI3I,CAAC;AAAA,QACtB,WAAmB2G,EAAE,UAAU,KAAK;AAC1B,gBAAM3G,IAAIsI,EAAE,IAAG,GAAIK,IAAIL,EAAE;AACzB,cAAIK,MAAM,UAAU3I,MAAM;AACxB,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,uBAAuB2I,KAAK,GAAG,OAAO3I,KAAK,GAAG,kBAAkB;AACtG,UAAAsI,EAAE,KAAKK,IAAI3I,CAAC;AAAA,QACtB,WAAmB2G,EAAE,UAAU,KAAK;AAC1B,gBAAM3G,IAAIsI,EAAE,IAAG,GAAIK,IAAIL,EAAE;AACzB,cAAIK,MAAM,UAAU3I,MAAM;AACxB,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,uBAAuB2I,KAAK,GAAG,OAAO3I,KAAK,GAAG,kBAAkB;AACtG,UAAAsI,EAAE,KAAK,CAACK,IAAI,CAAC3I,CAAC;AAAA,QACxB,WAAmB2G,EAAE,UAAU,KAAK;AAC1B,gBAAM3G,IAAIsI,EAAE,IAAK,GAAEK,IAAIL,EAAE,IAAK,KAAI;AAClC,cAAItI,MAAM;AACR,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,yCAAyC;AAC/E,UAAAsI,EAAE,KAAKK,IAAI3I,CAAC;AAAA,QACtB,WAAmB2G,EAAE,UAAU,KAAK;AAC1B,gBAAM3G,IAAIsI,EAAE,IAAG,GAAIK,IAAIL,EAAE;AACzB,cAAIK,MAAM,UAAU3I,MAAM;AACxB,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,kBAAkB2I,KAAK,GAAG,gBAAgB3I,KAAK,GAAG,kBAAkB;AAC1G,UAAAsI,EAAE,KAAK,KAAK,IAAIK,GAAG3I,CAAC,CAAC;AAAA,QACtB;AAAA,iBACQ2G,EAAE,cAAc6B,EAAE,UAAU;AACrC,cAAMxI,IAAIsI,EAAE;AACZ,YAAItI,MAAM;AACR,gBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,sBAAsB2G,EAAE,KAAK,iBAAiB;AACpF,YAAIA,EAAE,UAAU;AACd,UAAA2B,EAAE,KAAK,KAAK,IAAItI,CAAC,CAAC;AAAA,iBACX2G,EAAE,UAAU;AACnB,UAAA2B,EAAE,KAAK,KAAK,IAAItI,CAAC,CAAC;AAAA,iBACX2G,EAAE,UAAU;AACnB,UAAA2B,EAAE,KAAK,KAAK,IAAItI,CAAC,CAAC;AAAA,iBACX2G,EAAE,UAAU;AACnB,UAAA2B,EAAE,KAAK,KAAK,KAAKtI,CAAC,CAAC;AAAA,iBACZ2G,EAAE,UAAU,SAAS;AAC5B,gBAAMgC,IAAIL,EAAE;AACZ,cAAIK,MAAM;AACR,kBAAM,KAAK,WAAW,IAAI,IAAI,MAAM,4CAA4C;AAClF,UAAA3I,IAAI,MAAM,KAAK2I,IAAI,IAAIL,EAAE,KAAK,GAAG,IAAIA,EAAE,MAAMK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAIA,CAAC,GAAG,IAAI3I,CAAC,CAAC;AAAA,QACrG,MAAe,CAAA2G,EAAE,UAAU,OAAO2B,EAAE,KAAK,KAAK,IAAItI,CAAC,CAAC,IAAI2G,EAAE,UAAU,SAAS2B,EAAE,KAAK,KAAK,MAAMtI,CAAC,CAAC;AAAA,MAC1F;AACH,QAAIsI,EAAE,WAAW;AACf,aAAO,KAAK,kBAAkBA,EAAE,CAAC,CAAC;AACpC,UAAM,IAAI,MAAM,gCAAgC,KAAK,WAAW,EAAE;AAAA,EACnE;AAAA,EACD,kBAAkB7B,GAAG6B,IAAI,GAAG;AAC1B,WAAO,CAAC7B,EAAE,QAAQ6B,CAAC;AAAA,EACpB;AACH;AJhVA,IAAA9E,GAAA6F,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AKiBO,MAAMC,IAAN,MAAMA,EAA4F;AAAA,EAMrG,YAAYzK,GAAgC;AANzC,IAAAuC,EAAA,MAAA6H;AACH,IAAA7H,EAAA,MAAA+B;AACA,IAAA/B,EAAA,MAAA4H;AA6CO;AAAA;AAAA;AAAA,IAAA3H,EAAA,eAAQ,MAAa;AAClB,YAAAK,IAAW,IAAI4H;AAEnB,MAAA5H,EAAA,cAAcC,EAAA,MAAKwB,GAAa,MAAM;AAG7B,iBAAAtB,KAAKF,EAAA,MAAKqH;AACjB,QAAAtH,EAAE,UAAUG,GAAGF,EAAA,MAAKqH,GAASnH,CAAC,EAAE,OAAO;AAEpC,aAAAH;AAAA,IAAA;AAwDJ;AAAA;AAAA;AAAA;AAAA,IAAAL,EAAA,aAAM,IAAImB,MAAsC;AACnD,iBAAWC,KAAKD,GAAG;AAEf,cAAM+G,IAAc9G,aAAa6G,IAAyB7G,IAAf,IAAI6G,EAAM7G,CAAC;AAElD,QAAA,KAAK,SAAS8G,CAAQ,KAClB,KAAK,YACL1E,EAAA,MAAKoE,IAAAC,IAAL,WAAmBK,IAGlB5H,EAAA,MAAAwB,GAAa,IAAIoG,EAAS,WAAW,KAE1C,QAAQ,IAAI,gBAAgB,KAAK,UAAU,yBAAyBA,EAAS,OAAO;AAAA,MAE5F;AACO,aAAA;AAAA,IAAA;AAmBJ,IAAAlI,EAAA,+BAAwB,MACpB,OAAO,OAAOM,EAAA,MAAKqH,EAAQ,EAAE,KAAK,CAACnK,MAAUA,EAAM,WAAA,CAAY;AAOnE;AAAA;AAAA;AAAA;AAAA,IAAAwC,EAAA,gBAAS,CAACmI,MACT,KAAK,UAAU,WAAW,IACnB,IAAIxG,IAAW,SAEtBwG,MAAW,SAEJ,OAAO,OAAO7H,EAAA,MAAKqH,EAAQ,EAAE,OAAO,CAAC,GAAG9G,MAAM,EAAE,MAAA,EAAQ,IAAIA,CAAC,CAAC,IAG7D,KAAK,YAAYsH,CAAM,IAA4B7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,MAAM,IAApD,IAAIxG,EAAA,EAAW,KAAA;AAQnD;AAAA;AAAA;AAAA;AAAA,IAAA3B,EAAA,oBAAa,CAACmI,MAA2B;AAMxC,UAJAA,MAAW,WACFA,IAAA,MAGT,KAAK,YAAYA,CAAM,GAAG;AACpB,cAAAjD,IAAI5E,EAAA,MAAKqH,GAASQ,CAAM,EAAE,MAAM,GAClCC,IAAK,KAAK;AAGd,eAAA9H,EAAA8H,GAAGT,GAASQ,CAAM,EAAE,SAAS,CAAC,GAG9B7H,EAAA8H,GAAGtG,GAAa,SAAS,IAAIH,EAASuD,EAAE,MAAO,CAAA,CAAC,GACzCkD;AAAA,MAAA;AAEA,eAAA,IAAIH,IAAQ;IACvB;AA2CG;AAAA;AAAA;AAAA;AAAA,IAAAjI,EAAA,gBAAS,IAAImB,MAAsC;AAEtD,iBAAWC,KAAKD,GAAG;AAEf,cAAM+G,IAAc9G,aAAa6G,IAAyB7G,IAAf,IAAI6G,EAAM7G,CAAC;AAGjD,QAAAd,EAAA,MAAAwB,GAAa,OAAOoG,EAAS,WAAW;AAGlC,mBAAAC,KAAUD,EAAS;AAErB,UAAA5H,EAAA,MAAAqH,GAASQ,CAAM,IAAI,KAAK,YAAYA,CAAM,IAC3C7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,SAASD,EAAS,QAAQC,CAAM,CAAC,IACvDD,EAAS,QAAQC,CAAM,EAAE,QAAQ,YAIjC7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,YACtB,KAAK,eAAeA,CAAM;AAAA,MAGtC;AACO,aAAA;AAAA,IAAA;AA6DJ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAnI,EAAA,kBAAW,CAACjC,GAA+DsK,MAA2C;AAEzH,UAAIA,MAAc,IAAM;AAGpB,YAAItK,aAAkB4D;AACX,iBAAArB,EAAA,MAAKwH,IAAL,WAAwB/J,EAAO;AAI1C,YAAIA,aAAkBiE;AACX,iBAAA,IAAIL,IAAW;AAItB,YAAA,OAAO5D,KAAW;AACX,iBAAAuC,EAAA,MAAKwH,IAAL,WAAwB/J;AAI/B,YAAA,OAAOA,KAAW,UAAU;AAE5B,gBAAMuK,IAAiC,CAAA;AACvC,qBAAWZ,KAAK3J;AACZ,YAAAuK,EAAUZ,CAAC,IAAI,IAAI/F,EAAS5D,EAAO2J,CAAC,CAAC,EAAE;AAGpC,iBAAApH,EAAA,MAAKwH,IAAL,WAAwBQ;AAAA,QACnC;AAAA,MACJ;AAGM,YAAAvB,IAAI,KAAK,YAAY,MAAM;AAEjC,UAAI,OAAOhJ,KAAW,YAAYA,aAAkB4D,GAAU;AAC1D,cAAM2G,IAAmC,CAAA;AACzC,eAAAA,EAAU,KAAK,UAAU,CAAC,CAAC,IAAI,IAAI3G,EAAS5D,CAAM,GAC3C,KAAK,SAASuK,CAAS;AAAA,MAClC;AAEA,UAAIvK,aAAkBiE;AACX,eAAA,IAAIL,IAAW;AAGtB,UAAA,OAAO5D,KAAW,UAAU;AACxB,YAAA,KAAK,UAAU,WAAW;AAC1B,iBAAO,KAAK;AAGL,mBAAA2J,KAAKpH,EAAA,MAAKqH,IAAU;AAC3B,gBAAMnK,IAAQ,IAAImE,EAAS5D,EAAO2J,CAAC,CAAC;AAEpC,UAAAX,EAAE,SAASvJ,EAAM,IAAI8C,EAAA,MAAKqH,GAASD,CAAC,CAAC,CAAC;AAAA,QAC1C;AAAA,MACJ;AAEO,aAAAX;AAAA,IAAA;AAQJ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA/G,EAAA,qBAAc,CAACmI,MAEX,OAAO,OAAO7H,EAAA,MAAKqH,IAAUQ,KAAU,GAAG;AAU9C,IAAAnI,EAAA,iBAAU,MAAY;AACzB,MAAAM,EAAA,MAAKwB,GAAa;AACP,iBAAAqG,KAAU7H,EAAA,MAAKqH;AACjB,QAAArH,EAAA,MAAAqH,GAASQ,CAAM,EAAE,SAAS;AAE5B,aAAA;AAAA,IAAA;AAGJ,IAAAnI,EAAA,qBAAc,CAACuI,MAAwB;AAE1C,UAAIA,EAAI,SAAS;AACF,mBAAAJ,KAAUI,EAAI;AACjB,cAAA,CAAC,KAAK,OAAOJ,CAAM,EAAE,MAAMI,EAAI,OAAOJ,CAAM,CAAC;AACtC,mBAAA;AAAA;AAMnB,aAAI,KAAK,YAAY,WAAA,KAAgBI,EAAI,YAAY,eAC1C,KAGJ,KAAK,YAAY,MAAM,EAAE,OAAOA,EAAI,WAAW,EAAE;IAAW;AAOhE;AAAA;AAAA;AAAA;AAAA,IAAAvI,EAAA,iBAAU,CAACmB,MACP,KAAK,SAASA,CAAC,KAAKb,EAAA,MAAKwB,GAAa,QAAQX,EAAE,WAAW;AAG/D,IAAAnB,EAAA,yBAAkB,MAAe;AACzB,iBAAAmI,KAAU,KAAK;AAOtB,YALI,KAAK,QAAQA,CAAM,EAAE,gBAKrB,KAAK,QAAQA,CAAM,EAAE;AACd,iBAAA;AAIR,aAAA;AAAA,IAAA;AAMJ;AAAA;AAAA;AAAA,IAAAnI,EAAA,eAAQ,MACJM,EAAA,MAAKwB,GAAa,UAAU,KAAK,KAAK,UAAU,WAAW;AAO/D;AAAA;AAAA;AAAA;AAAA,IAAA9B,EAAA,kBAAW,CAACmB,MAAsB;AAErC,YAAMqH,IAAe,KAAK,WACpBC,IAAetH,EAAE,WAGjBuH,IAAcF,EAAG,OAAOC,EAAG,OAAO,CAACE,MAAS,CAACH,EAAG,SAASG,CAAI,CAAC,CAAC;AAQrE,UALI,KAAK,OAAA,KAAYxH,EAAE,YAKnBqH,EAAG,WAAW,KAAKC,EAAG,WAAW;AAC1B,eAAA;AAIP,UAAAD,EAAG,WAAWC,EAAG;AACV,eAAA;AAIX,UAAI,CAAC,KAAK,OAAA,KAAY,CAACtH,EAAE;AACrB,mBAAWyH,KAAOF;AAOV,cALA,CAAC,KAAK,YAAYE,CAAG,KAAK,CAACzH,EAAE,YAAYyH,CAAG,KAK5C,CAACtI,EAAA,MAAKqH,GAASiB,CAAG,EAAE,QAAQzH,EAAE,QAAQyH,CAAG,CAAC;AACnC,mBAAA;AAAA;AAMZ,aAAA;AAAA,IAAA;AAGJ,IAAA5I,EAAA,kBAAW,MACT,KAAK,YAAY,aAGf,KAAK,oBAFD;AAQR;AAAA;AAAA;AAAA,IAAAA,EAAA,gBAAS,MACLM,EAAA,MAAKwB,GAAa,UAAU;AAuEhC;AAAA;AAAA;AAAA;AAAA,IAAA9B,EAAA,kBAAW,IAAImB,MAAsC;AACxD,iBAAWC,KAAKD,GAAG;AAEf,cAAM+G,IAAc9G,aAAa6G,IAAyB7G,IAAf,IAAI6G,EAAM7G,CAAC;AAGjD,QAAAd,EAAA,MAAAwB,GAAa,SAASoG,EAAS,WAAW;AAGpC,mBAAAC,KAAUD,EAAS;AAC1B,UAAK,KAAK,YAAYC,CAAM,IAGxB7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,IAAID,EAAS,QAAQC,CAAM,CAAC,IAFlD7H,EAAA,MAAKqH,GAASQ,CAAM,IAAID,EAAS,QAAQC,CAAM,EAAE;MAK7D;AACO,aAAA;AAAA,IAAA;AAMJ;AAAA;AAAA;AAAA,IAAAnI,EAAA,aAAM,OACTE,EAAA,MAAK4B,GAAe,IAAIH,EAAS,EAAE,IAAI,IACvCzB,EAAA,MAAKyH,GAAW,KACT;AAOJ;AAAA;AAAA;AAAA;AAAA,IAAA3H,EAAA,kBAAW,OACdM,EAAA,MAAKwB,GAAa,YACX;AAyCJ;AAAA;AAAA;AAAA;AAAA,IAAA9B,EAAA,aAAM,CAACjB,MAAgC;AACrC,MAAAuB,EAAA,MAAAwB,GAAa,IAAI/C,CAAE;AACb,iBAAAoJ,KAAU7H,EAAA,MAAKqH;AACtB,QAAArH,EAAA,MAAKqH,GAASQ,CAAM,EAAE,SAASpJ,CAAE;AAE9B,aAAA;AAAA,IAAA;AAGJ,IAAAiB,EAAA,mBAAY,CAACmI,MAA2B;AAE3C,MAAIA,MAAW,WACFA,IAAA;AAIP,YAAAhH,IAAI,KAAK;AACX,UAAAoC;AAEA,aAAApC,EAAE,YAAYgH,CAAM,KACpB5E,IAASpC,EAAE,OAAOgH,CAAM,EAAE,QAAQ,IAAI,CAAC,GACvChH,EAAE,cAAcA,EAAE,YAAY,QAAQ,OAAOoC,CAAM,GACjDpC,EAAA,UAAUgH,GAAQ5E,CAAM,MAKtBpC,EAAE,YAAY,aACdA,EAAE,cAAc,IAAIQ,EAAS,EAAE,IAAI,IAErCR,EAAA,UAAUgH,GAAQ,CAAC,IAGlBhH;AAAA,IAAA;AAGJ,IAAAnB,EAAA,gBAAS,MAAY;AAExB,WAAK,YAAY;AAGN,iBAAAmI,KAAU7H,EAAA,MAAKqH;AACtB,QAAIrH,EAAA,MAAKqH,GAASQ,CAAM,EAAE,YACtB,KAAK,eAAeA,CAAM;AAG3B,aAAA;AAAA,IAAA;AAYJ;AAAA;AAAA;AAAA,IAAAnI,EAAA,cAAO,MAAY;AAChB,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AAQtC;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,EAAA,mBAAY,CAACmI,GAAgBU,MAC1BA,aAAelH,KAKjB,KAAK,YAAYwG,CAAM,KAAKU,EAAI,YAChC,KAAK,eAAeV,CAAM,GAI9B7H,EAAA,MAAKqH,GAASQ,CAAM,IAAIU,EAAI,MAAM,GAE3B,QAXI,KAAK,UAAUV,GAAQ,IAAIxG,EAASkH,CAAG,CAAC;AAiBhD;AAAA;AAAA;AAAA,IAAA7I,EAAA,cAAO,MAAY;AAClB,UAAA,KAAK,YAAY;AACjB,QAAAM,EAAA,MAAKwB,GAAa;AACP,mBAAAqG,KAAU7H,EAAA,MAAKqH;AACtB,UAAArH,EAAA,MAAKqH,GAASQ,CAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,MAE9C;AAEO,aAAA;AAAA,IAAA;AAOJ;AAAA;AAAA;AAAA;AAAA,IAAAnI,EAAA,kBAAW,IAAImB,MAAsC;AACxD,iBAAWC,KAAKD,GAAG;AAEf,cAAM+G,IAAc9G,aAAa6G,IAAyB7G,IAAf,IAAI6G,EAAM7G,CAAC;AAElD,QAAA,KAAK,SAAS8G,CAAQ,KAClB,KAAK,YACL1E,EAAA,MAAKoE,IAAAC,IAAL,WAAmBK,IAGvB5H,EAAA,MAAKwB,GAAa,IAAIoG,EAAS,QAAQ,YAAY,UAAU,KAErD,QAAA,IAAI,8BAA8BA,EAAS,OAAO;AAAA,MAElE;AACO,aAAA;AAAA,IAAA;AA+DJ;AAAA;AAAA;AAAA,IAAAlI,EAAA,cAAO,OACVE,EAAA,MAAK4B,GAAe,IAAIH,EAAS,EAAE,KAAK,IACxCzB,EAAA,MAAKyH,GAAW,KACT;AASX,IAAA5H,EAAA,MAAA+H,IAAqB,CAAC/J,MAA0E;AACxF,UAAAgJ,IAAI,KAAK,YAAY;AAErB,UAAA,OAAOhJ,KAAW,UAAU;AAC5B,cAAMuK,IAAiC,CAAA,GACjCM,IAAM,KAAK,UAAU,CAAC;AAC5B,eAAAN,EAAUM,CAAG,IAAI7K,GAEVuC,EAAA,MAAKwH,IAAL,WAAwBQ;AAAA,MACnC;AAEA,UAAIvK,aAAkB4D,GAAU;AAC5B,cAAM2G,IAAiC,CAAA;AAC7B,eAAAA,EAAA,KAAK,UAAU,CAAC,CAAC,IAAI,IAAI3G,EAAS5D,CAAM,EAAE,OAC7CuC,EAAA,MAAKwH,IAAL,WAAwBQ;AAAA,MACnC;AAEA,UAAIvK,aAAkBiE;AACX,eAAA;AAGP,UAAA,OAAOjE,KAAW,UAAU;AACxB,YAAA,KAAK,UAAU,WAAW;AAC1B,iBAAO,KAAK,YAAY;AAGjB,mBAAA2J,KAAKpH,EAAA,MAAKqH,IAAU;AACrB,gBAAA9J,IAAIE,EAAO2J,CAAC;AAElB,UAAI7J,aAAa8D,IACboF,KAAKlJ,EAAE,SAAUyC,EAAA,MAAKqH,GAASD,CAAC,EAAE,QAElCX,KAAKlJ,KAAMyC,EAAA,MAAKqH,GAASD,CAAC,EAAE;AAAA,QAEpC;AAAA,MACJ;AAEO,aAAAX;AAAA,IAAA;AA0BX,IAAAhH,EAAA,MAAAgI,IAA6B,CAACe,MAA2B;AAGrD,YAAMC,IADkB,IAAIC,GAAY,EAAE,MAAMF,CAAQ,EACQ,KAE1DG,IAAiB,CAAA;AAEnB,UAAAF,EAAI,WAAW;AACf,oBAAK,KAAK,GACH;AACX,UAAWA,EAAI,WAAW,GAAG;AACnB,cAAAG,IAAUH,EAAI,CAAC;AAErB,oBAAK,IAAI,GACLG,EAAQ,cAAcC,EAAgB,cACtC,KAAK,cAAc,IAAIxH,EAASuH,EAAQ,KAAK,IACtCA,EAAQ,cAAcC,EAAgB,YACxC,KAAA,UAAUD,EAAQ,OAAO,CAAC,GAE5B;AAAA,MAAA;AAGP,mBAAWA,KAAWH;AACb,UAAAzI,EAAA,MAAA0H,IAAA,WAAsBiB,GAAOC;AAI1C,kBAAK,IAAI,GACJ,KAAA,SAASD,EAAM,CAAC,CAAC,GACf;AAAA,IAAA;AAGX,IAAAlJ,EAAA,MAAAiI,IAAwB,CAACiB,GAAgBC,MAAyB;AL37BtE,UAAAE;AK47BY,UAAAC,GAAWC,GAAWlI,GAAU+G,GAAgBU;AAEhD,UAAAK,EAAQ,cAAcC,EAAgB;AAChC,QAAAF,EAAA,KAAK,IAAIhB,EAAM,IAAItG,EAASuH,EAAQ,KAAK,CAAC,CAAC;AAAA,eAE1CA,EAAQ,cAAcC,EAAgB,UAAU;AACvD,cAAMhI,IAAI,IAAI8G,EAAM,EAAE,IAAI;AACxB,QAAA9G,EAAA,UAAU+H,EAAQ,OAAO,CAAC,GACtBD,EAAA,KAAK9H,EAAE,MAAO,CAAA;AAAA,MAEb,WAAA+H,EAAQ,cAAcC,EAAgB;AAC7C,gBAAQD,EAAQ,OAAO;AAAA,UACnB,KAAK;AAED,YAAAI,IAAML,EAAM,IAAI,KAAM,IAAIhB,EAAA,EAAQ,QAClCoB,IAAMJ,EAAM,IAAI,KAAM,IAAIhB,EAAA,EAAQ,QAElCgB,EAAM,KAAKI,EAAG,SAASC,CAAE,CAAC;AAE1B;AAAA,UACJ,KAAK;AAED,YAAAA,IAAML,EAAM,IAAI,KAAM,IAAIhB,EAAA,EAAQ,OAClCoB,IAAMJ,EAAM,IAAI,KAAM,IAAIhB,EAAA,EAAQ,OAElCgB,EAAM,KAAKI,EAAG,SAASC,CAAE,CAAC;AAC1B;AAAA,UACJ,KAAK;AAED,YAAAA,IAAML,EAAM,IAAI,KAAM,IAAIhB,EAAA,EAAQ,OAClCoB,IAAMJ,EAAM,IAAI,KAAM,IAAIhB,EAAA,EAAQ,OAElCgB,EAAM,KAAKI,EAAG,OAAOC,CAAE,CAAC;AACxB;AAAA,UACJ,KAAK,KAAK;AAGN,YAAAT,MAD0BO,IAAAH,EAAM,IAAA,MAAN,gBAAAG,EAAa,gBACZ,IAAIzH,EAAS,EAAE,IAAI,GAC9CP,IAAI6H,EAAM,IAAI,KAAK,IAAIhB,EAAA,EAAQ,OAEtBE,IAAA/G,EAAE,UAAU,CAAC,GAElB+G,KACE/G,EAAA,UAAU+G,GAAQU,CAAG,GAG3BI,EAAM,KAAK7H,CAAC;AAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,IACJ;AAv9BA,WAAAlB,EAAA,MAAK4B,GAAe,IAAIH,EAAS,EAAE,KAAK,IACxCzB,EAAA,MAAKyH,GAAW,KAEZnK,MAAU,UAEV,KAAK,MAAMA,CAAK,GAGb;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,MAAMsL,GAAqC;AAEzC,WAAA5I,EAAA,MAAA4B,GAAe,IAAIH,MACxBzB,EAAA,MAAKyH,GAAW,KAEZ,OAAOmB,KAAa,WACpBxI,EAAA,MAAKyH,IAAL,WAAgCe,KACzB,OAAOA,KAAa,WACtB5I,EAAA,MAAA4B,GAAe,IAAIH,EAASmH,CAAQ,KAClCA,aAAoBnH,IACtBzB,EAAA,MAAA4B,GAAegH,EAAS,WACtBA,aAAoBb,MACtB/H,EAAA,MAAA4B,GAAexB,EAAAwI,GAAShH,GAAa,MAAM,IAGhD0B,EAAA,MAAKoE,IAAAC,IAAL,WAAmBiB,KAGhB;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FA,IAAW,cAAwB;AAC/B,WAAOxI,EAAA,MAAKwB;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,YAAYzB,GAAyB;AACvC,IAAAH,EAAA,MAAA4B,GAAe,IAAIH,EAAStB,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAoDA,IAAW,UAAkB;AACzB,QAAIqH,IAAI;AACR,UAAM6B,IAAU,OAAO,KAAKjJ,EAAA,MAAKqH,EAAQ,EAAE;AAC3C,eAAWQ,KAAUoB;AACjB,MAAIjJ,EAAA,MAAKqH,GAASQ,CAAM,EAAE,gBACjBT,KAAAS,GACD7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,WAAW,CAAC,MAClCT,KAAK,KAAKpH,EAAA,MAAKqH,GAASQ,CAAM,EAAE,OAAO;AAKnD,WAAIT,MAAM,KAEFpH,EAAA,MAAKwB,GAAa,SAAS,IACpBxB,EAAA,MAAKwB,GAAa,UAElB,KAGPxB,EAAA,MAAKwB,GAAa,UAAU,IACrB4F,IACApH,EAAA,MAAKwB,GAAa,UAAU,KAC5B,IAAI4F,CAAC,KACLpH,EAAA,MAAKwB,GAAa,UAAU,IAC5B,MAEA,GAAGxB,EAAA,MAAKwB,GAAa,OAAO,GAAG4F,CAAC;AAAA,EAGnD;AAAA,EAgCA,IAAW,WAAoB;AAE3B,QAAI,CAAC,KAAK,YAAY;AACX,aAAA,CAAC,KAAK,MAAA,CAAO;AAIpB,QAAA,KAAK;AACE,aAAA,CAAC,KAAK,MAAA,CAAO;AAIpB,QAAA,KAAK,YAAY,YAAY;AACtB,aAAA,CAAC,KAAK,MAAA,CAAO;AAGlB,UAAAhK,IAAW8B,EAAQ,SAAS,KAAK,IAAI,KAAK,YAAY,SAAS,CAAC;AAGtE,QAAIgK,IAAoC,CAAA;AAC7B,eAAA9B,KAAK,KAAK;AAEN,MAAA8B,IAAA,KAAK,oBAAoBA,GAAU9B,CAAC;AAGnD,UAAM+B,IAAyB,CAAA;AAC/B,QAAID,EAAS,SAAS,KAAK9L,EAAS,SAAS;AACzC,iBAAW6C,KAAK7C;AACZ,mBAAWgK,KAAK8B,GAAU;AAChB,gBAAArI,IAAI,IAAI8G;AACZ,UAAA9G,EAAA,cAAc,IAAIQ,EAASpB,CAAC,GAC9BY,EAAE,UAAUuG,GACZ+B,EAAc,KAAKtI,CAAC;AAAA,QACxB;AAAA,aAEGzD,EAAS,WAAW;AAC3B,iBAAWgK,KAAK8B,GAAU;AAChB,cAAArI,IAAI,IAAI8G;AACd,QAAA9G,EAAE,cAAc,IAAIQ,EAAS,EAAE,IAAI,GACnCR,EAAE,UAAUuG,GACZ+B,EAAc,KAAKtI,CAAC;AAAA,MACxB;AAAA;AAEA,iBAAWZ,KAAK7C,GAAU;AAChB,cAAAyD,IAAI,IAAI8G;AACZ,QAAA9G,EAAA,cAAc,IAAIQ,EAASpB,CAAC,GAC9BkJ,EAAc,KAAKtI,CAAC;AAAA,MACxB;AAGG,WAAAsI,EAAc,WAAW,IAAI,CAAC,IAAIxB,IAAQ,KAAK,IAAIwB;AAAA,EAC9D;AAAA,EA4EO,UAAUlL,GAAyBC,GAAyB2J,GAA6B;AACtF,UAAAuB,IAAY,KAAK,UAAUvB,CAAM;AAE/B,WAAAuB,EAAU,SAASlL,CAAC,EACvB,SAASkL,EAAU,SAASnL,CAAC,CAAa;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EA2HA,IAAW,UAAiC;AACxC,WAAO+B,EAAA,MAAKqH;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,QAAQD,GAA0B;AACzC,IAAAxH,EAAA,MAAKyH,GAAWD;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,cAAqC;AAExC,QAAA,KAAK,mBAAmB;AACxB,YAAMA,IAA2B,CAAA;AACtB,iBAAAkB,KAAOtI,EAAA,MAAKqH;AACjB,QAAAD,EAAAkB,CAAG,IAAItI,EAAA,MAAKqH,GAASiB,CAAG,EAAE,QAAQ;AAEjC,aAAAlB;AAAA,IAAA;AAEP,aAAOpH,EAAA,MAAKqH;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,WAAWmB,GAAkB;AAIpC,eAAWjL,KAAK,CAAC,GAAGiL,EAAS,SAAS,yBAAyB,CAAC;AAE5D,MAAMjL,EAAE,CAAC,KAAKyC,EAAA,MAAKqH,OACVrH,EAAA,MAAAqH,GAAS9J,EAAE,CAAC,CAAC,IAAI,IAAI8D,EAAA,EAAW,SAKpCrB,EAAA,MAAAqH,GAAS9J,EAAE,CAAC,CAAC,EAAE,IAAI,CAACA,EAAE,CAAC,CAAC;AAIjC,eAAWA,KAAK,CAAC,GAAGiL,EAAS,SAAS,gBAAgB,CAAC;AAEnD,MAAMjL,EAAE,CAAC,KAAKyC,EAAA,MAAKqH,OACVrH,EAAA,MAAAqH,GAAS9J,EAAE,CAAC,CAAC,IAAI,IAAI8D,EAAA,EAAW,SAIzCrB,EAAA,MAAKqH,GAAS9J,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAEjC;AAAA,EA4CA,IAAW,eAAuB;AAC9B,QAAI6J,IAAI;AACR,UAAM6B,IAAU,OAAO,KAAKjJ,EAAA,MAAKqH,EAAQ,EAAE;AAE3C,eAAWQ,KAAUoB;AACjB,MAAIjJ,EAAA,MAAKqH,GAASQ,CAAM,EAAE,gBAChBT,MAAAA,MAAM,KAAK,KAAK,OAAOS,GACzB7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,WAAW,CAAC,MAClCT,KAAK,KAAKpH,EAAA,MAAKqH,GAASQ,CAAM,EAAE,OAAO;AAMnD,WAAIT,MAAM,KAEFpH,EAAA,MAAKwB,GAAa,SAAS,IACpBxB,EAAA,MAAKwB,GAAa,UAElB,KAGPxB,EAAA,MAAKwB,GAAa,UAAU,IACrB4F,IACApH,EAAA,MAAKwB,GAAa,UAAU,KAC5B,IAAI4F,CAAC,KACLpH,EAAA,MAAKwB,GAAa,UAAU,IAC5B,MAEA,GAAGxB,EAAA,MAAKwB,GAAa,OAAO,IAAI4F,CAAC;AAAA,EAGpD;AAAA,EAsDO,eAAeS,GAAgB;AAE3B,WAAA7H,EAAA,MAAKqH,GAASQ,CAAM;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA,EAqEA,IAAW,MAAc;AAGrB,QAAIT,IAAI;AACR,UAAM6B,IAAU,OAAO,KAAKjJ,EAAA,MAAKqH,EAAQ,EAAE;AAE3C,eAAWQ,KAAUoB;AACjB,MAAIjJ,EAAA,MAAKqH,GAASQ,CAAM,EAAE,gBACjBT,KAAAS,GACD7H,EAAA,MAAKqH,GAASQ,CAAM,EAAE,WAAW,CAAC,MAClCT,KAAK,MAAMpH,EAAA,MAAKqH,GAASQ,CAAM,EAAE,MAAM,GAAI;AAKvD,WAAIT,MAAM,KAEFpH,EAAA,MAAKwB,GAAa,SAAS,IACpBxB,EAAA,MAAKwB,GAAa,KAAK,MAEvB,MAGPxB,EAAA,MAAKwB,GAAa,UAAU,IACrB4F,IACApH,EAAA,MAAKwB,GAAa,UAAU,KAC5B,IAAI4F,CAAC,KACLpH,EAAA,MAAKwB,GAAa,UAAU,IAC5B,MAEA,GAAGxB,EAAA,MAAKwB,GAAa,KAAK,GAAG,GAAG4F,CAAC;AAAA,EAGpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,YAAsB;AAG7B,UAAMA,IAAc,CAAA;AACb,kBAAA,QAAQ,KAAK,OAAO,EAAE;AAAA,MACzB,CAAC,CAACkB,GAAKpL,CAAK,MAAM;AACV,QAACA,EAAM,YACPkK,EAAE,KAAKkB,CAAG;AAAA,MAElB;AAAA,IAAA,GACJlB,EAAE,KAAK,GACAA;AAAA,EAEX;AAAA,EAyDQ,oBAAoB/J,GAA8BwK,GAAyC;AAC/F,UAAMwB,IAAsC,CAAA;AAGnC,aAAAzE,IAAI,GAAGA,KAAK,KAAK,QAAQiD,CAAM,EAAE,OAAOjD;AACzC,UAAAvH,EAAI,WAAW,GAAG;AAClB,cAAMiM,IAA8B,CAAA;AACpC,QAAAA,EAAKzB,CAAM,IAAI,IAAIxG,EAASuD,CAAC,GAC7ByE,EAAQ,KAAKC,CAAI;AAAA,MAAA;AAEjB,mBAAWjB,KAAQhL,GAAK;AACpB,gBAAMiM,IAA8B,CAAA;AACpC,qBAAWC,KAAiBlB;AACnB,YAAAiB,EAAAC,CAAa,IAAIlB,EAAKkB,CAAa;AAE5C,UAAAD,EAAKzB,CAAM,IAAI,IAAIxG,EAASuD,CAAC,GAC7ByE,EAAQ,KAAKC,CAAI;AAAA,QACrB;AAGD,WAAAD;AAAA,EACX;AAwFJ;AA/9BI7H,IAAA,eACA6F,IAAA,eAFGC,KAAA,eAq0BHC,cAAciB,GAAiB;AAChB,aAAAtI,KAAKsI,EAAS;AACrB,IAAAxI,EAAA,MAAKqH,GAASnH,CAAC,IAAIsI,EAAS,QAAQtI,CAAC,EAAE;AAE/C,GAEAsH,KAAA,eA+DAC,KAAA,eAgCAC,KAAA,eA/2BAhI,EA3DSiI,GA2DK,OAAM,IAAI6B,MAA2B;AAE/C,aAAW1I,KAAK0I;AACR,QAAA1I,EAAE;AACK,aAAA,IAAI6G,IAAQ;AAIrB,QAAA9G,IAAI,IAAI8G,EACV,GAAApH,IAAYrB,EAAQ,IAAI,GAAGsK,EAAO,IAAI,CAAAtM,MAASA,EAAM,YAAY,SAAS,CAAC,GAC3E0H,IAAY1F,EAAQ,IAAI,GAAGsK,EAAO,IAAI,CAAStM,MAAAA,EAAM,YAAY,WAAW,CAAC;AAGjF,EAAA2D,EAAE,cAAc,IAAIQ,EAASd,GAAGqE,CAAC,EAAE;AAGnC,aAAW9D,KAAK0I,GAAQ;AAET,eAAA3B,KAAUhH,EAAE;AACf,MAAEgH,KAAU/G,EAAE,WACZD,EAAA,QAAQgH,CAAM,EAAE,KAAK;AAGpB,eAAAA,KAAU/G,EAAE;AACf,MAAA,CAACD,EAAE,YAAYgH,CAAM,KAAK/G,EAAE,QAAQ+G,CAAM,EAAE,uBAC5ChH,EAAE,QAAQgH,CAAM,IAAI/G,EAAE,QAAQ+G,CAAM,EAAE,UAEtChH,EAAE,QAAQgH,CAAM,IAAI,IAAIxG,EAAS,KAAK,IAAIP,EAAE,QAAQ+G,CAAM,EAAE,OAAOhH,EAAE,QAAQgH,CAAM,EAAE,KAAK,CAAC;AAAA,EAGvG;AAEO,SAAAhH;AAAA;AAAA;AAAA;AAAA;AAOXnB,EAlGSiI,GAkGK,aAAY,IAAI6B,MAA2B;AACrD,QAAM3I,IAAI,IAAI8G,EAAM,EAAE,IAAI;AAE1B,aAAW7G,KAAK0I;AACZ,IAAA3I,EAAE,SAASC,CAAC;AAGT,SAAAD;AAAA;AAzGR,IAAM4I,IAAN9B;AClBS,SAAA+B,GAAgBC,GAAaC,IAAM,IAAc;AAC7D,SAAOA,IAAM,WAAWD,CAAG,cAAc,IAAIA,CAAG;AACpD;AAUO,SAASE,GAAoBC,GAAoBC,GAAgBnL,GAAgBoL,GAAgBC,GAAiB;AACrH,SAAOH,EAAS,IAAI,CAAClM,GAAGgG,MAObhG,MAAMmM,IAASnL,IAAShB,CAClC;AACL;ANrBA,IAAAsM,IAAAC,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAhD,IAAAiD,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AOmCO,MAAMC,IAAN,MAAMA,EAGS;AAAA,EAalB,YAAYC,MAA0C5N,GAAkC;AAhBrF,IAAAgC,EAAA,MAAAuL;AAKH,IAAAvL,EAAA,MAAAyK;AACA,IAAAzK,EAAA,MAAA0K;AACA,IAAA1K,EAAA,MAAA2K;AACA,IAAA3K,EAAA,MAAA4K,IAAc;AAwBP;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA3K,EAAA,eAAQ,CAAC8I,MAAiC/K,MAAwC;AAKjF,UAHJmC,EAAA,MAAKuK,GAAU,KACfvK,EAAA,MAAKsK,IAAW,KAEZ,OAAO1B,KAAa;AACpB,eAAOtF,EAAA,MAAK8H,IAAAC,IAAL,WAAkBzC,GAAU,GAAG/K;AAC1C,WACK,OAAO+K,KAAa,YAAYA,aAAoBnH,KAAYmH,aAAoBiB,MACjFhM,EAAO,WAAW;AAEtB,QAAAuC,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAMjB,CAAiB,CAAC;AAAA,eACvCA,aAAoBiB,KAAShM,EAAO,SAAS;AACpD,QAAAuC,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAMjB,CAAQ,CAAC,GACrC/K,EAAO,QAAQ,CAAKqD,MAAA;AAChB,UAAAd,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAM3I,CAAU,CAAC;AAAA,QAAA,CAC1C;AAAA,eACM0H,aAAoB4C;AAChB,mBAAAtK,KAAK0H,EAAS;AACrB,UAAAxI,EAAA,MAAKmK,GAAQ,KAAKrJ,EAAE,MAAO,CAAA;AAK5B,aAAA;AAAA,IAAA;AAMJ;AAAA;AAAA;AAAA,IAAApB,EAAA,eAAQ,MAAe;AACpB,YAAAuF,IAAI,IAAImG,KACRvK,IAAa,CAAA;AAER,iBAAAC,KAAKd,EAAA,MAAKmK;AACf,QAAAtJ,EAAA,KAAKC,EAAE,MAAO,CAAA;AAIpB,aAAAmE,EAAE,SAASpE,GAEJoE;AAAA,IAAA;AAWJ,IAAAvF,EAAA,aAAM,IAAIjC,MAA6C;AAE1D,iBAAWP,KAASO;AAChB,QAAIP,aAAiBkO,IACjBxL,EAAA,MAAKuK,GAAUnK,EAAA,MAAKmK,GAAQ,OAAOjN,EAAM,MAAM,KACxCA,aAAiBuM,IACxBzJ,EAAA,MAAKmK,GAAQ,KAAKjN,EAAM,MAAO,CAAA,IACxB,OAAOA,KAAU,YAAY,OAAO,cAAcA,CAAK,IAC9D8C,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAMvM,EAAM,SAAU,CAAA,CAAC,IAE7C8C,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAMvM,CAAK,CAAC;AAK1C,aAAO,KAAK;IAAO;AAGhB,IAAAwC,EAAA,qBAAc,MAAa;AAC9B,YAAMmB,IAAI,IAAI4I,EAAM,EAAE,IAAI,GACpB6B,IAAoB,KAAK,gBACzBC,IAAsB,KAAK,kBAC3BtI,IAAS,KAAK;AAEpB,MAAApC,EAAE,cAAc,IAAIQ,EAASiK,GAAWC,CAAW;AACxC,iBAAAnE,KAAK,KAAK,WAAW;AAE1B,QAAAvG,EAAA,UAAUuG,GAAGnE,CAAM;AACV,mBAAAnC,KAAKd,EAAA,MAAKmK;AAEjB,cADAtJ,EAAE,UAAUuG,GAAG/F,EAAS,IAAIP,EAAE,OAAOsG,CAAC,GAAGvG,EAAE,OAAOuG,CAAC,CAAC,CAAC,GACjDvG,EAAE,OAAOuG,CAAC,EAAE;AACZ;AAAA,MAIZ;AACO,aAAAvG;AAAA,IAAA;AAGJ,IAAAnB,EAAA,gBAAS,CAACmI,MAA8B;AAC3C,UAAIjD,IAAc,IAAIvD,EAAS,EAAE,KAAK;AAC3B,iBAAAP,KAAKd,EAAA,MAAKmK;AACjB,QAAAvF,IAAIvD,EAAS,IAAIP,EAAE,OAAO+G,CAAM,EAAE,OAAOjD,CAAC;AAGvC,aAAAA;AAAA,IAAA;AAGJ,IAAAlF,EAAA,oBAAa,CAACmI,MAA6B;AACxC,YAAA2D,IAAK,IAAIJ;AAEJ,iBAAAtK,KAAKd,EAAA,MAAKmK;AACjB,QAAAqB,EAAG,IAAI1K,EAAE,WAAW+G,CAAM,CAAC;AAG/B,aAAO2D,EAAG;IAAO;AAGd,IAAA9L,EAAA,gBAAS,CAACxC,MAA0C;AAEvD,UAAIA,aAAiBmE;AACV,eAAArB,EAAA,MAAKuK,IAAL,WAAuBrN;UACvB,OAAOA,KAAU,YAAY,OAAO,cAAcA,CAAK;AACvD,eAAA8C,EAAA,MAAKwK,IAAL,WAAsBtN;AACjC,UAAWA,aAAiBuM;AACxB,eAAO,KAAK,OAAO,IAAI2B,EAAQlO,CAAK,CAAC;AACzC,UAAWA,aAAiBkO,GAAS;AACjC,YAAIlO,EAAM,OAAO,WAAW,KAAKA,EAAM,UAAU,WAAW;AACxD,iBAAO8C,EAAA,MAAKuK,IAAL,WAAuBrN,EAAM,OAAO,CAAC,EAAE;AAC3C;AACH,gBAAM,EAAC,UAAAuO,GAAU,UAAAC,EAAA,IAAY,KAAK,UAAUxO,CAAK;AAC7C,cAAAwO,EAAS;AACT,mBAAA9L,EAAA,MAAKuK,GAAUsB,EAAS,SACjB;AAAA,QAEf;AAAA,MAAA,WACO,OAAOvO,KAAU;AACxB,eAAO,KAAK,OAAO,IAAIkO,EAAQlO,CAAK,CAAC;AAGzC,YAAM,IAAI,MAAM,oBAAoBA,CAA0B,EAAE;AAAA,IAAA;AAG7D,IAAAwC,EAAA,eAAQ,OACXE,EAAA,MAAKuK,GAAU,KACR;AAQJ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAzK,EAAA,mBAAY,CAACuF,MAA2B;AACrC,YAAA4C,IAAiB5C,EAAE,UAAU,CAAC,GAC9BwG,IAAoB,IAAIL,EAAQ,EAAE,KAAK,GACvCM,IAAoB,KAAK,MAAM,EAAE,QAAQ7D,CAAM;AAGjD,UAAA5C,EAAE,UAAU,WAAW;AAGhB,eAAA;AAAA,UACH,UAHM,KAAK,MAAM,EAAE,OAAOA,CAAC,EAGf,OAAO;AAAA,UACnB,UAAU,IAAImG,EAAQ,EAAE,KAAK;AAAA,QAAA;AAKrC,YAAMO,IAAe1G,EAAE,cAAc,QAAW4C,CAAM,GAChD+D,IAAoB3G,EAAE,OAAO4C,CAAM;AAErC,UAAAgE,GAGAC,IAAe,KAAK,OAAOjE,CAAM,EAAE,QAAQ;AACxC,aAAA6D,EAAS,OAAO7D,CAAM,EAAE,MAAM+D,CAAO,KAAKE,IAAe,MAC5DA,KAGOD,IAAAH,EAAS,cAAc,QAAW7D,CAAM,EAAE,MAAM,EAAE,OAAO8D,CAAK,GAEjE,GAAAE,EAAK,aAKTJ,EAAS,IAAII,CAAI,GACRH,EAAA,SAASzG,EAAE,MAAM,EAAE,SAAS4G,CAAI,CAAC,EAAE,UAGxCA,EAAK,OAAOhE,CAAM,EAAE;AATpB;AAcR,aAAA4D,EAAS,OAAO,GAChBC,EAAS,OAAO,GACT,EAAC,UAAAD,GAAU,UAAAC;IAAQ;AAGvB,IAAAhM,EAAA,kBAAW,CAACjC,GAA+DsK,MAA2C;AAEzH,UAAIA;AACO,eAAA/H,EAAA,MAAKwH,IAAL,WAAwB/J;AAInC,YAAMgJ,IAAI,IAAIpF,EAAS,EAAE,KAAK;AACzB,aAAArB,EAAA,MAAAmK,GAAQ,QAAQ,CAAS4B,MAAA;AAE1B,QAAAtF,EAAE,IAAIsF,EAAM,SAAStO,GAAQsK,CAAS,CAAC;AAAA,MAAA,CAC1C,GAEMtB;AAAA,IAAA;AAQJ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA/G,EAAA,mBAAY,CAACmI,MAA+B;AAC/C,UAAImE,IAAqB,CAAA,GACrB/G,IAAI,KAAK,MAAM,EAAE,QAAQ;AAIvB,YAAApE,IAAIoE,EAAE;AAOR,UALAA,EAAE,gBAAgB,YAAY,mBAAmB,KAAKpE,EAAE,YAAY,mBAAmB,KAAK,CAACA,EAAE,WAC/FA,EAAE,SAAS,GAIX,CAACA,EAAE,SAAS;AACN,cAAAoL,IAAuB,IAAIb,EAAQvK,CAAC;AAChC,QAAAmL,IAAA,CAACC,EAAY,MAAA,CAAO,GAC1BhH,IAAAA,EAAE,UAAUgH,CAAW,EAAE;AAAA,MACjC;AAGI,UAAAC,IAAejH,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAC,EAAE,OAC9CkH,IAAY;AAChB,aAAOD,KAAgB;AAEf,YADJA,KACIjH,EAAE,OAAO,SAAS,GAAG;AAGjB,UAACA,EAAE,YACK+G,EAAA,KAAK/G,EAAE,MAAO,CAAA,GACtBA,EAAE,IAAI;AAEV;AAAA,mBACOA,EAAE,OAAO4C,CAAM,EAAE,SAAS;AAGzB,UAAAmE,EAAA,KAAK/G,EAAE,MAAO,CAAA,GACtBA,EAAE,IAAI;AACN;AAAA,QAAA,OACG;AAEH,cAAImH,IAAyBpM,EAAA,MAAK2K,IAAL,WAA6B1F,GAAGkH,GAAWtE,KAAU;AAI3E,eAHKsE,IAAAlH,EAAE,OAAO4C,CAAM,EAAE,OAGtBuE,EAAY,SAAS,KAAG;AACrB,kBAAAnE,IAAMmE,EAAY,CAAC;AAEzB,gBAAI,CAACnH,EAAE,cAAcgD,CAAG;AAGpB,cAAAmE,EAAY,MAAM;AAAA,iBACf;AAEG,oBAAAzL,IAASsE,EAAE,UAAUgD,CAAG;AAG9B,cAAA+D,EAAQ,KAAK/D,CAAG,GAGZhD,IAAAtE,EAAO,SAAS,SAGNyL,IAAAA,EAAY,OAAO,CAAKxO,MAAA;AAC5B,sBAAAyO,IAAKpH,EAAE,OAAO,CAAC,GACjBqH,IAAKrH,EAAE,OAAOA,EAAE,OAAO,SAAS,CAAC,GACjCsH,KAAK3O,EAAE,OAAO,CAAC,GACf4O,KAAK5O,EAAE,OAAOA,EAAE,OAAO,SAAS,CAAC;AAGrC,uBAAK0O,EAAG,YAAYE,EAAE,IAKfH,EAAG,YAAYE,EAAE,IAJb;AAAA,cAIa,CAC3B;AAAA,YACL;AAAA,UACJ;AAAA,QACJ;AAIA,aAACtH,EAAE,WACK+G,EAAA,KAAK/G,EAAE,MAAO,CAAA,GAK1BrF,EAAA,MAAKsK,IAAW8B,IAEThM,EAAA,MAAKkK;AAAA,IAAA;AAiBT,IAAAxK,EAAA,wBAAiB,MACbR,EAAQ,IAAI,GAAG,KAAK,gBAAiB,CAAA;AAGzC,IAAAQ,EAAA,sBAAe,MACXR,EAAQ,IAAI,GAAG,KAAK,cAAe,CAAA;AAoBvC;AAAA,IAAAQ,EAAA,yBAAkB,MAAgB;AACrC,YAAM+M,IAAyB,CAAA;AACpB,iBAAA3L,KAAKd,EAAA,MAAKmK;AACJ,QAAAsC,EAAA,KAAK3L,EAAE,YAAY,WAAW;AAGxC,aAAA2L;AAAA,IAAA;AAGJ,IAAA/M,EAAA,uBAAgB,MAAgB;AACnC,YAAMgN,IAAuB,CAAA;AAClB,iBAAA5L,KAAKd,EAAA,MAAKmK;AACN,QAAAuC,EAAA,KAAK5L,EAAE,YAAY,SAAS;AAGpC,aAAA4L;AAAA,IAAA;AAGJ,IAAAhN,EAAA,mBAAY,MACX,KAAK,SAAS,WACP,MAGX,KAAK,QAAQ,IAAI0G,GAAe,KAAK,MAAO,CAAA,EAAE,SACvC,KAAK;AAOT,IAAA1G,EAAA,mBAAY,CAACzB,GAAyBC,GAAyB2J,IAAS,QAAkB;AACvF,YAAAuB,IAAY,KAAK,UAAUvB,CAAM,GAEjC8E,IAAiC,CAAA,GACnCC,IAAiC;AAErC,aAAAD,EAAQ9E,CAAM,IAAI,IAAIxG,EAASpD,CAAC,GAChC2O,EAAQ/E,CAAM,IAAI,IAAIxG,EAASnD,CAAC,GAExBkL,EAAU,SAASwD,CAAO,EAAe,SAASxD,EAAU,SAASuD,CAAO,CAAC;AAAA,IAAA;AAOlF,IAAAjN,EAAA,qBAAc,CAAC2L,MAAmC;AACjD,UAAApG;AAGJ,YAAM4H,IAAUxB,EAAc,WAAW,qBAAqB,IAAI;AAGlE,UAAIwB,EAAQ,SAAS,GAAG,KAAKA,EAAQ,SAAS,GAAG;AACtC,eAAA;AAKP,UAAA;AAEI,QAAA5H,IAAA,IAAImG,EAAQC,CAAa;AAAA,cACrB;AACD,eAAA;AAAA,MACX;AAGA,aAAK,OAAK,QAAQpG,CAAC;AAAA,IAMZ;AAGJ,IAAAvF,EAAA,uBAAgB,CAACuI,MAA0B;AAE9C,UAAIA,EAAI,SAAS,SAAS;AACtB,cAAM6E,IAAO7E,EAAI,UAAU,EAAE,CAAC;AAE1B,eAAA6E,EAAK,iBAAiBzL,IACd,KAAK,SAASyL,EAAK,KAAK,EAAe,OAAO,IAE/C;AAAA,MACX,OAEG;AACH,cAAM,EAAC,UAAApB,EAAY,IAAA,KAAK,UAAUzD,CAAG;AACrC,eAAOyD,EAAS;MACpB;AAAA,IAAA;AAGG,IAAAhM,EAAA,iBAAU,CAACuF,MACPjF,EAAA,MAAKsK,IAAL,WAAcrF,GAAG;AAYrB,IAAAvF,EAAA,sBAAe,CAACuF,MACZjF,EAAA,MAAKsK,IAAL,WAAcrF,EAAE,QAAQ,SAAA,GAAY;AAGxC,IAAAvF,EAAA,mBAAY,CAAC2L,MAAmC;AAEnD,UAAI,CAAC,KAAK,YAAYA,CAAa;AACxB,eAAA;AAIL,YAAApG,IAAI,IAAImG,EAAQC,CAAa;AACnC,UAAIpG,EAAE,OAAO,SAAS,KAAK,OAAO;AACvB,eAAA;AAKA,iBAAAnE,KAAKmE,EAAE;AACd,YAAI,CAACnE,EAAE,YAAY;AACR,iBAAA;AAKR,aAAA;AAAA,IAAA;AAGJ,IAAApB,EAAA,kBAAW,CAACuF,MACRjF,EAAA,MAAKsK,IAAL,WAAcrF,GAAG;AAOrB,IAAAvF,EAAA,wBAAiB,MACbR,EAAQ,IAAI,GAAG,KAAK,gBAAiB,CAAA;AAGzC,IAAAQ,EAAA,sBAAe,MACXR,EAAQ,IAAI,GAAG,KAAK,cAAe,CAAA;AAOvC,IAAAQ,EAAA,iBAAU,MAAgB;AACzB,UAAAC,wBAAQ;AAED,iBAAAmB,KAAKd,EAAA,MAAKmK;AACb,QAAAxK,IAAA,oBAAI,IAAI,CAAC,GAAGA,GAAG,GAAGmB,EAAE,SAAS,CAAC;AAI/B,aAAA,CAAC,GAAGnB,CAAC;AAAA,IAAA;AAGT,IAAAD,EAAA,yBAAkB,CAACmI,MAA8B;AACpD,YAAMhH,IAAI,KAAK,cAAc,QAAWgH,CAAM,GAC1CzH,IAAOS,EAAE,YAAY,KAAK,GAC1BoC,IAASpC,EAAE,OAAOgH,CAAM;AAExB,aAAA5E,EAAO,uBACA7C,MAAS,IAAK,IAAIiB,IAAY,aAAc,IAAIA,EAAS,EAAG,SAAS,EAAE,SAAS,IAChF4B,EAAO,WACPpC,EAAE,cAKL,IAAIQ,IAAY;IAAK;AAG1B,IAAA3B,EAAA,iCAA0B,CAACmI,MAA8B;AAC5D,YAAMhH,IAAI,KAAK,cAAc,QAAWgH,CAAM,GAC1CzH,IAAOS,EAAE,YAAY,KAAK,GAC1BoC,IAASpC,EAAE,OAAOgH,CAAM;AAExB,aAAA5E,EAAO,uBACA7C,MAAS,KAAM,IAAIiB,EAAA,EAAY,aAAc,IAAIA,EAAS,EAAG,SAAS,EAAE,SAAS,IACjF4B,EAAO,WACPpC,EAAE,cAKL,IAAIQ,IAAY;IAAK;AAG1B,IAAA3B,EAAA,uBAAgB,CAACuD,GAA4B4E,MAA2B;AAC3E,UAAI5E,MAAW;AAGX,eAAO,KAAK,cAAc,KAAK,OAAO4E,CAAM,GAAGA,CAAM;AAKzD,YAAMhH,IAAI,KAAK,MAAM,EAAE,OAAO;AACnB,iBAAAC,KAAKd,EAAAa,GAAEsJ;AACd,YAAIrJ,EAAE,OAAO+G,CAAM,EAAE,QAAQ5E,CAAM;AAC/B,iBAAOnC,EAAE;AAMV,aAAA,IAAI2I,IAAQ;IAAK;AAIrB;AAAA,IAAA/J,EAAA,uBAAgB,CAACmI,MAA0B;AAC9C,YAAMhH,IAAI,KAAK,MAAM,EAAE,OAAO;AACnB,iBAAAC,KAAKd,EAAAa,GAAEsJ;AACV,YAAArJ,EAAE,YAAY+G,CAAM;AACpB,iBAAO/G,EAAE;AAKV,aAAA,IAAI2I,IAAQ;IAAK;AAYrB,IAAA/J,EAAA,wBAAiB,CAACuD,GAA4B4E,MAA6B;AAC9E,UAAI5E,MAAW;AAGX,eAAO,KAAK,eAAe,KAAK,OAAO4E,CAAM,CAAC;AAIlD,YAAMkF,IAAc,CAAA,GAEdlM,IAAI,KAAK,MAAM,EAAE,OAAO;AACnB,iBAAAC,KAAKd,EAAAa,GAAEsJ;AACd,QAAIrJ,EAAE,OAAO+G,CAAM,EAAE,QAAQ5E,CAAM,KAC5B8J,EAAA,KAAKjM,EAAE,MAAO,CAAA;AAKlB,aAAAiM;AAAA,IAAA;AAIJ,IAAArN,EAAA,kBAAW,CAACxC,MAEXA,aAAiBkO,IACVpL,EAAA,MAAK+K,IAAL,WAAwB7N,KACxBA,aAAiBmE,IACjBrB,EAAA,MAAK4K,IAAL,WAAyB1N,KACzBA,aAAiBuM,IACjBzJ,EAAA,MAAK8K,IAAL,WAAsB5N,KACtB,OAAO,cAAcA,CAAK,KAAK,OAAOA,KAAU,WAChD8C,EAAA,MAAK6K,IAAL,WAAwB3N,KAK5B;AAOJ,IAAAwC,EAAA,aAAM,OACTE,EAAA,MAAKuK,GAAU,KACfnK,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAM,EAAE,KAAK,GAC5B;AAIJ;AAAA,IAAA/J,EAAA,kBAAW,OACdE,EAAA,MAAKuK,GAAUnK,EAAA,MAAKmK,GAAQ,IAAI,CAAKrJ,MAAAA,EAAE,UAAU,IAC1C;AAOJ,IAAApB,EAAA,aAAM,CAACjB,MAAwB;AAClC,UAAI,CAAC,OAAO,cAAcA,CAAE;AACxB,eAAO,KAAK;AAGhB,UAAIA,IAAK;AACL,eAAO,KAAK;AAGhB,UAAIA,MAAO;AACP,eAAO,IAAI2M,EAAQ;AAIjB,YAAAnG,IAAI,KAAK;AACf,eAAS,IAAI,GAAG,IAAIxG,GAAI;AACpB,aAAK,SAASwG,CAAC;AAGnB,aAAO,KAAK;IAAO;AAGhB,IAAAvF,EAAA,mBAAY,CAACmI,MAA6B;AACvC,YAAA2D,IAAK,IAAIJ;AAEJ,iBAAAtK,KAAKd,EAAA,MAAKmK;AACjB,QAAAqB,EAAG,IAAI1K,EAAE,UAAU+G,CAAM,CAAC;AAGvB,aAAA2D;AAAA,IAAA;AAGJ,IAAA9L,EAAA,gBAAS,MAAe;AAI3B,UAAI1B,IAAI;AACD,aAAAA,IAAIgC,EAAA,MAAKmK,GAAQ,UAAQ;AAC5B,iBAAS6C,IAAIhP,IAAI,GAAGgP,IAAIhN,EAAA,MAAKmK,GAAQ,QAAQ6C;AACrC,UAAAhN,EAAA,MAAKmK,GAAQnM,CAAC,EAAE,SAASgC,EAAA,MAAKmK,GAAQ6C,CAAC,CAAC,MACxChN,EAAA,MAAKmK,GAAQnM,CAAC,EAAE,IAAIgC,EAAA,MAAKmK,GAAQ6C,CAAC,CAAC,GAC9BhN,EAAA,MAAAmK,GAAQ,OAAO6C,GAAG,CAAC,GACpBhN,EAAA,MAAKmK,GAAQnM,CAAC,EAAE,aAChBgC,EAAA,MAAKmK,GAAQnM,CAAC,IAAI,IAAIyL,EAAA,EAAQ,SAGlCuD;AAKR,QAAAhP;AAAA,MACJ;AAGA,MAAA4B,EAAA,MAAKuK,GAAUnK,EAAA,MAAKmK,GAAQ,OAAO,CAACrJ,MACzB,CAACA,EAAE,YAAY,QACzB;AAGU,iBAAAA,KAAKd,EAAA,MAAKmK;AACjB,QAAArJ,EAAE,YAAY;AAId,aAAA,KAAK,WAAW,IACT,IAAIsK,IAAU,SAIlB,KAAK;IAAQ;AAKjB;AAAA,IAAA1L,EAAA,iBAAU,CAACmI,IAAS,KAAKoF,MAA2B;AACvD,MAAIA,MAAW,WACFA,IAAA;AAGb,YAAMC,IAAe,KAAK,UAAU,OAAO,CAAAtP,MAAKA,MAAMiK,CAAM;AAC5D,aAAA7H,EAAA,MAAKmK,GAAQ,KAAK,SAAUlM,GAAGC,GAAG;AACxB,cAAAqG,IAAKtG,EAAE,OAAO4J,CAAM,EAAE,OACxBrD,IAAKtG,EAAE,OAAO2J,CAAM,EAAE;AAG1B,YAAItD,MAAOC;AACA,iBAAAyI,IAAS1I,IAAKC,IAAKA,IAAKD;AAI/B,YAAA2I,EAAa,SAAS;AACtB,qBAAW9F,KAAK8F,GAAc;AACpB3I,kBAAAA,IAAKtG,EAAE,OAAOmJ,CAAC,EAAE,OACnB5C,IAAKtG,EAAE,OAAOkJ,CAAC,EAAE;AAGrB,gBAAI7C,MAAOC;AACA,qBAAAyI,IAAS1I,IAAKC,IAAKA,IAAKD;AAAAA,UAEvC;AAIG,eAAA;AAAA,MAAA,CACV,GAEM;AAAA,IAAA;AAQJ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA7E,EAAA,mBAAY,CAACmI,GAAgB5C,MAAqB;AACjD,UAAAsD;AACJ,YAAM4E,IAAyB,IAAI/B,EAAQ,EAAE,KAAK;AAEvC,iBAAAtK,KAAK,KAAK;AACb,QAAA,CAACA,EAAE,YAAY+G,CAAM,KAAK/G,EAAE,QAAQ+G,CAAM,EAAE,WAC9BsF,EAAA,IAAIrM,EAAE,MAAO,CAAA,KAK3ByH,IAAMzH,EAAE,QAAQ+G,CAAM,EAAE,MAAM,GAG9B/G,EAAE,eAAe+G,CAAM,GAGvBsF,EAAc,IAAIlI,EAAE,MAAM,EAAE,IAAI,KAAK,IAAIsD,EAAI,SAAS,CAAC,EAAE,SAASzH,CAAC,CAAC;AAMvE,aAAAlB,EAAA,MAAAuK,GAAUgD,EAAc,OAAA,EAAS,SAC/B;AAAA,IAAA;AAoBJ,IAAAzN,EAAA,kBAAW,IAAIjC,MAA6C;AAC/D,iBAAWP,KAASO;AAChB,QAAIP,aAAiBkO,IACjB,KAAK,IAAIlO,EAAM,MAAM,EAAE,SAAU,CAAA,IAC1BA,aAAiBuM,IACxBzJ,EAAA,MAAKmK,GAAQ,KAAKjN,EAAM,MAAM,EAAE,UAAU,IAE1C8C,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAMvM,CAAK,EAAE,UAAU;AAKrD,aAAO,KAAK;IAAO;AAmEhB;AAAA;AAAA;AAAA;AAAA,IAAAwC,EAAA,cAAO,OACVE,EAAA,MAAKuK,GAAU,KACfnK,EAAA,MAAKmK,GAAQ,KAAK,IAAIV,EAAM,EAAE,MAAM,GAC7B;AAOX,IAAAhK,EAAA,MAAA6K,IAAW,CAACrF,GAAY7E,MAA2B;AAC/C,MAAIA,MAAS,WACFA,IAAA;AAIX,YAAMgN,IAAM,KAAK,MAAQ,EAAA,OAAA,EAAS,WAC5BC,IAAMpI,EAAE,MAAQ,EAAA,OAAA,EAAS;AAE/B,cAAQ7E,GAAM;AAAA,QACV,KAAK;AAED,iBAAIgN,EAAI,WAAWC,EAAI,UAAU,CAACD,EAAI,OAAO,EAAE,QAAQC,EAAI,OAAQ,CAAA,IACxD,KAIJD,EAAI,OACN,MAAM,CAACE,GAAI1J,MAAU0J,EAAG,QAAQD,EAAI,OAAOzJ,CAAK,CAAC,CAAC;AAAA,QAE3D,KAAK;AAED,iBAAIwJ,EAAI,WAAWC,EAAI,UAAU,CAACD,EAAI,OAAO,EAAE,QAAQC,EAAI,OAAQ,CAAA,IACxD,KAGJD,EAAI,OACN,MAAM,CAACE,GAAI1J,MAAU0J,EAAG,SAASD,EAAI,OAAOzJ,CAAK,CAAC,CAAC;AAAA,QAE5D;AACW,iBAAA;AAAA,MACf;AAAA,IAAA;AAIJ,IAAAnE,EAAA,MAAA8K,IAAoB,CAACxK,MAAsB;AAC5B,iBAAAe,KAAKd,EAAA,MAAKmK;AACf,QAAArJ,EAAA,YAAY,OAAOf,CAAC;AAGnB,aAAA;AAAA,IAAA;AAGX,IAAAN,EAAA,MAAA+K,IAAmB,CAAC/L,MAAqB;AAC/B,YAAA8O,IAAM,IAAIlM,EAAS5C,CAAE;AAChB,iBAAAqC,KAAKd,EAAA,MAAKmK;AACf,QAAArJ,EAAA,YAAY,OAAOyM,CAAG;AAGrB,aAAA;AAAA,IAAA;AAGX,IAAA9N,EAAA,MAAA+H,IAAqB,CAAC/J,MAA0E;AAC5F,UAAIgJ,IAAI;AACH,aAAAzG,EAAA,MAAAmK,GAAQ,QAAQ,CAAS4B,MAAA;AACrB,QAAAtF,KAAAsF,EAAM,SAAStO,GAAQ,EAAI;AAAA,MAAA,CACnC,GAEMgJ;AAAA,IAAA;AAGX,IAAAhH,EAAA,MAAAgL,IAAsB,CAAC5C,MAA8B;AP9/BzD,UAAAiB;AO+/BQ,UAAI0E,GAAaC,GACbxP,GAAGC,GAAGyG,GAAGO,GAAOC,GAAIC,GAAIsI;AAGxB,UAAA,KAAK,iBAAiB;AAMlB,eALJzP,IAAI,KAAK,cAAc,GAAG4J,CAAM,EAAE,aAClC3J,IAAI,KAAK,cAAc,GAAG2J,CAAM,EAAE,aAClClD,IAAI,KAAK,cAAc,GAAGkD,CAAM,EAAE,aAClC3C,IAAQhH,EAAE,MAAA,EAAQ,IAAI,CAAC,EAAE,SAASD,EAAE,MAAA,EAAQ,SAAS0G,CAAC,EAAE,SAAS,CAAC,CAAC,GAE/DO,EAAM,YACDC,IAAAjH,EAAE,MAAM,EAAE,SAAS,EAAE,OAAOD,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,GACjDuP,IAAA,IAAIpC,EAAQvD,CAAM,EAAE,SAAS1C,EAAG,OAAO,EAAE,SAASA,EAAG,WAAW,GAChEsI,IAAA,IAAIrC,EAAQvD,CAAM,EAAE,SAAS1C,EAAG,OAAO,EAAE,SAASA,EAAG,WAAW,GACrEuI,IAASzP,EAAE,OAAOkH,EAAG,WAAW,EAAE,OAAOA,EAAG,WAAW,GAElDuI,EAAO,UAGD,CAACF,GAAIC,CAAE,IAFP,CAAC,IAAIrC,EAAQsC,EAAO,OAAO,GAAGF,GAAIC,CAAE,KAKxCvI,EAAM,WAAgB,KAAAA,EAAM,cACnCC,IAAKjH,EAAE,MAAM,EAAE,WACV,IAAIgH,EAAM,MAAM,EAAE,KAAM,CAAA,EACxB,OAAOjH,EAAE,QAAQ,SAAS,CAAC,CAAC,GACjCmH,IAAKlH,EAAE,MAAM,EAAE,WACV,SAASgH,EAAM,MAAM,EAAE,KAAM,CAAA,EAC7B,OAAOjH,EAAE,QAAQ,SAAS,CAAC,CAAC,GAQjCyP,IAASzP,EAAE,OAAOkH,EAAG,WAAW,EAAE,OAAOC,EAAG,WAAW,GACnDsI,EAAO,UACA;AAAA,UACH,IAAItC,EAAQvD,CAAM,EAAE,SAAS1C,EAAG,OAAO,EAAE,SAASA,EAAG,WAAW;AAAA,UAChE,IAAIiG,EAAQvD,CAAM,EAAE,SAASzC,EAAG,OAAO,EAAE,SAASA,EAAG,WAAW;AAAA,QAAA,IAG7D;AAAA,UACH,IAAIgG,EAAQsC,EAAO,OAAO;AAAA,UAC1B,IAAItC,EAAQvD,CAAM,EAAE,SAAS1C,EAAG,OAAO,EAAE,SAASA,EAAG,WAAW;AAAA,UAChE,IAAIiG,EAAQvD,CAAM,EAAE,SAASzC,EAAG,OAAO,EAAE,SAASA,EAAG,WAAW;AAAA,QAAA,KAQjE,CAAC,KAAK,MAAA,CAAO;AASxB,UAJInH,IAAA,KAAK,cAAc,GAAG4J,CAAM,GAC5B3J,IAAA,KAAK,cAAc,GAAG2J,CAAM,GAC5BlD,IAAA,KAAK,cAAc,GAAGkD,CAAM,GAE5B5J,EAAE,gBAAA,KAAqB0G,EAAE,qBAKrBzG,EAAE,QAAQ,IAAI,CAAC,EAAE,SAASD,EAAE,MAAM,EAAE,SAAS0G,CAAC,CAAC,GAAG;AAM5C,cAAAgJ,IAAW,IAAIvC,EAAQ,KAAKnN,EAAE,aAAaC,EAAE,aAAayG,EAAE,WAAW,GACvEiJ,KAAW5N,EAAA8I,IAAA6E,GAASlD,IAAT,KAAA3B,GAA6B,MAExCkD,KAAU,CAAA;AACZ,YAAA6B;AAEA,YAAAD,GAAS,UAAU,GAAG;AACtB,qBAAW9N,MAAK8N;AACZ,YAAI9N,GAAE,SAAS,WACHkM,GAAA,KAAKlM,GAAE,MAAO,CAAA,KAEtB+N,KAAa/N,GAAE,SACf+N,GAAW,OAAO,CAAC,EAAE,UAAU5P,EAAE,aACjC4P,GAAW,OAAO,CAAC,EAAE,UAAUlJ,EAAE,aACzBqH,GAAA,KAAK6B,GAAW,MAAO,CAAA;AAKhC,iBAAA7B;AAAA,QACX;AAAA,MACJ;AAIG,aAAA,CAAC,KAAK,MAAA,CAAO;AAAA,IACxB;AAGJ,IAAAvM,EAAA,MAAAiL,IAAc,CAACvH,GAAiB2K,GAAqBC,GAA2BC,MAAgD;AAC5H,UAAI/I,IAAI;AAEG,iBAAA/E,KAAKF,EAAA,MAAKmK,IAAS;AACtB,YAAAjK,EAAE,YAAY,UAAU;AACxB;AAKA,YAAAY;AACJ,QAAIkN,IACAlN,IAAIZ,EAAE,eAENY,IAAKqC,MAAW,QAASjD,EAAE,MAAMA,EAAE,SAGvC+E,KAAK,GAAI/E,EAAE,YAAY,KAAA,MAAW,MAAM+E,MAAM,MAAM6I,MAAc,MAAS,MAAM,EAAE,GAAGhN,CAAC;AAAA,MAC3F;AAEA,aAAIiN,MAAoB,MAAQ,KAAK,SAAS,MACtC5K,MAAW,QACX8B,IAAI,WAAWA,CAAC,cAEhBA,IAAI,IAAIA,CAAC,MAKbA,MAAM,OACFA,IAAA,MAGDA;AAAA,IAAA;AAGX,IAAAxF,EAAA,MAAAkL,IAA0B,CAAC1F,GAAYkH,GAAmBtE,MAA8B;AACpF,YAAMyF,IAAKrI,EAAE,OAAO,CAAC,EAAE,UACnBgJ,IAAKhJ,EAAE,OAAOA,EAAE,OAAO,SAAS,CAAC,EAAE,UAEjCmH,IAAyB,CAAA;AAC/B,aAAAkB,EAAG,QAAQ,CAAOY,MAAA;AAEd,QAAIA,EAAI,OAAOrG,CAAM,EAAE,MAAMsE,CAAS,KAClC8B,EAAG,QAAQ,CAAOE,MAAA;AACV,UAAAD,EAAI,OAAOrG,CAAM,EAAE,WAAWsG,EAAI,OAAOtG,CAAM,CAAC,MAChDuE,EAAY,KAAK,IAAIhB,EAAQ8C,GAAKC,CAAG,CAAC,GAC1B/B,EAAA,KAAK,IAAIhB,EAAQ8C,GAAKC,EAAI,MAAM,EAAE,SAAU,CAAA,CAAC;AAAA,QAC7D,CACH;AAAA,MACL,CAGH,GAEM/B;AAAA,IAAA;AAGX,IAAA3M,EAAA,MAAAmL,IAAsB,CAAC7K,MAAyB;AACjC,iBAAAe,KAAKd,EAAA,MAAKmK;AACf,QAAArJ,EAAA,YAAY,SAASf,CAAC;AAI5B,aAAO,KAAK;IAAO;AAGvB,IAAAN,EAAA,MAAAoL,IAAqB,CAACpM,MACXuB,EAAA,MAAK4K,IAAL,WAAyB,IAAIvJ,EAAS5C,CAAE;AAGnD,IAAAgB,EAAA,MAAAqL,IAAmB,CAACjK,MAAsB;AAC3B,iBAAAC,KAAKd,EAAA,MAAKmK;AACjB,QAAArJ,EAAE,SAASD,CAAC;AAGhB,aAAO,KAAK;IAAO;AAGvB,IAAApB,EAAA,MAAAsL,IAAqB,CAAC9F,MAAwB;AAC1C,YAAMpE,IAAa,CAAA;AACR,iBAAAyM,KAAMtN,EAAA,MAAKmK;AACP,mBAAA8D,KAAMhJ,EAAE;AACf,UAAApE,EAAE,KAAK4I,EAAM,UAAU6D,GAAIW,CAAE,CAAC;AAKtC,aAAArO,EAAA,MAAKuK,GAAUtJ,IACR,KAAK;IAAO;AAkEvB;AAAA;AAAA;AAAA;AAAA,IAAApB,EAAA,MAAAyL,IAA+B,CAAC1C,MAA2B;AAGvD,YAAMC,IADkB,IAAIC,GAAY,EAAE,MAAMF,CAAQ,EACQ;AAGhE,WAAK,KAAK;AAEV,YAAMG,IAAmB,CAAA;AAGzB,iBAAWC,KAAWH;AACb,QAAAzI,EAAA,MAAAmL,IAAA,WAAsBxC,GAAOC;AAIlC,aAAAD,EAAM,WAAW,KACZ,KAAA,IAAIA,EAAM,CAAC,CAAC,GAId,KAAK;IAAQ;AAGxB,IAAAlJ,EAAA,MAAA0L,IAAwB,CAACxC,GAAkBC,MAAyB;AAChE,cAAQA,EAAQ,WAAW;AAAA,QACvB,KAAKC,EAAgB;AACjB,UAAAF,EAAM,KAAK,IAAIyC,EAAQxC,EAAQ,KAAK,CAAC;AACrC;AAAA,QAEJ,KAAKC,EAAgB;AACX,UAAAF,EAAA,KAAK,IAAIyC,IAAU,IAAI,IAAI3B,EAAMb,EAAQ,KAAK,CAAC,CAAC;AACtD;AAAA,QAEJ,KAAKC,EAAgB;AAEjB,kBAAQ,IAAI,iDAAiD;AAC7D;AAAA,QAEJ,KAAKA,EAAgB;AACb,cAAAF,EAAM,UAAU,GAAG;AACnB,kBAAMzK,IAAIyK,EAAM,IAAA,GACZ1K,IAAI0K,EAAM;AAGV,gBAAA1K,MAAM,UAAaC,MAAM;AACzB;AAGA,gBAAA0K,EAAQ,UAAU;AAClB,cAAAD,EAAM,KAAK1K,EAAE,IAAIC,CAAC,CAAC;AAAA,qBACZ0K,EAAQ,UAAU;AACzB,cAAAD,EAAM,KAAK1K,EAAE,SAASC,CAAC,CAAC;AAAA,qBACjB0K,EAAQ,UAAU;AACzB,cAAAD,EAAM,KAAK1K,EAAE,SAASC,CAAC,CAAC;AAAA,qBACjB0K,EAAQ,UAAU;AACzB,cAAI1K,EAAE,SAAS,uBACX,QAAQ,IAAI,2DAA2D,IAGjEyK,EAAA,KAAK1K,EAAE,OAAOC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC;AAAA,qBAEzC0K,EAAQ,UAAU,KAAK;AAC9B,kBAAI1K,EAAE,SAAS;AACL,sBAAA,IAAI,MAAM,iDAAiD;kBAC1DA,EAAE,OAAO,CAAC,EAAE,YAAY;AAGzB,gBAAAyK,EAAA,KAAK1K,EAAE,IAAIC,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,CAAC;AAAA,uBAG3CD,EAAE,OAAO,WAAW,KAAKA,EAAE,OAAO,CAAC,EAAE,YAAY,SAAS;AAC1D,2BAAW4J,KAAU5J,EAAE,OAAO,CAAC,EAAE;AAC3B,kBAAAA,EAAA,OAAO,CAAC,EAAE,QAAQ4J,CAAM,EAAE,SAAS3J,EAAE,OAAO,CAAC,EAAE,WAAW;AAGhE,gBAAAyK,EAAM,KAAK1K,CAAC;AAAA,cAAA;AAEZ,wBAAQ,MAAM,iCAAiC;AAAA,YAG3D;AAAA,UAAA,WAEO2K,EAAQ,UAAU,KAAK;AACxB,kBAAA3K,IAAI0K,EAAM;AAChB,YAAI1K,KACM0K,EAAA,KAAK1K,EAAE,SAAU,CAAA;AAAA,UAC3B;AAEM,kBAAA,IAAI,MAAM,2BAA2B;AAI/C;AAAA,QAEJ,KAAK4K,EAAgB;AAEjB,kBAAQ,MAAM,wCAAwC;AACtD;AAAA,QAEJ,KAAKA,EAAgB;AAEjB,kBAAQ,MAAM,wEAAwE;AACtF;AAAA,MACR;AAAA,IAAA;AArzCA,WAAAjJ,EAAA,MAAKuK,GAAU,KACfvK,EAAA,MAAKsK,IAAW,KAChBtK,EAAA,MAAKwK,IAAS,KAEViB,MAAkB,UACb,KAAA,MAAMA,GAAe,GAAG5N,CAAM,GAEhC;AAAA,EACX;AAAA,EAmDA,IAAW,MAAc;AACd,WAAAuC,EAAA,MAAK0K,IAAL,WAAiB;AAAA,EAC5B;AAAA,EAEA,IAAW,UAAkB;AACzB,WAAO1K,EAAA,MAAK0K,IAAL;AAAA,EACX;AAAA,EAiQO,oBAAoBjN,GAAgC;AACvD,IAAAmC,EAAA,MAAKuK,GAAU;AACf,UAAMtC,IAAS;AACf,WAAApK,EAAO,QAAQ,EAAE,QAAQ,CAAC2Q,GAAOxK,MAAU;AACjC,YAAAmI,IAAQ,IAAItC;AACZ,MAAAsC,EAAA,cAAc,IAAI1K,EAAS+M,CAAK,GAChCrC,EAAA,UAAUlE,GAAQjE,CAAK,GAExB5D,EAAA,MAAAmK,GAAQ,KAAK4B,CAAK;AAAA,IAAA,CAC1B,GAEM;AAAA,EACX;AAAA,EAUO,kBAA8B;AAEjC,UAAMsC,IAAiB,KAAK,MAAM,EAAE,QAAQ,GAEtCC,IAAS,KAAK,OAAO,EAAE,QAAQ,GAC/BhL,IAAS,IAAI,MAAMgL,CAAM,EAAE,KAAK,IAAIjN,EAAS,CAAC,CAAC;AAEtC,WAAAgN,EAAA,OAAO,QAAQ,CAAStC,MAAA;AACnC,YAAMnI,IAAQ0K,IAASvC,EAAM,SAAS,QAAQ;AAC9C,MAAAzI,EAAOM,CAAK,IAAImI,EAAM,YAAY,MAAM;AAAA,IAAA,CAC3C,GAGMzI;AAAA,EACX;AAAA,EA8BO,YAAYuE,GAAyB;AACjC,WAAA,KAAK,UAAU,SAASA,CAAM;AAAA,EACzC;AAAA,EAcO,UAA+B;AAAA,EAEtC;AAAA,EAqDA,IAAW,kBAA2B;AAElC,WAAO7H,EAAA,MAAKmK,GAAQ,KAAK,OAAKrJ,EAAE,UAAU,SAAS,CAAC;AAAA,EACxD;AAAA,EAEO,QAAiB;AACpB,WAAOd,EAAA,MAAKmK,GAAQ,WAAW,KAAKnK,EAAA,MAAKmK,GAAQ,CAAC,EAAE,YAAY,MAAM,KAAK,KAAK,SAAS,OAAO;AAAA,EACpG;AAAA,EAkCO,SAAkB;AACrB,WAAQnK,EAAA,MAAKmK,GAAQ,WAAW,KAAKnK,EAAA,MAAKmK,GAAQ,CAAC,EAAE,YAAY,OAAA,KAAanK,EAAA,MAAKmK,GAAQ,WAAW;AAAA,EAC1G;AAAA,EAUA,IAAW,SAAS;AAChB,WAAOnK,EAAA,MAAKmK,GAAQ;AAAA,EACxB;AAAA;AAAA,EAgFA,IAAW,SAAS;AAChB,WAAOnK,EAAA,MAAKmK;AAAA,EAChB;AAAA,EAEA,IAAW,OAAOtJ,GAAY;AAC1B,IAAAjB,EAAA,MAAKuK,GAAUtJ;AAAA,EACnB;AAAA,EAyCA,IAAW,eAAuB;AAC9B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EAcA,IAAW,eAAuB;AAC9B,WAAOb,EAAA,MAAK0K,IAAL,WAAiB,OAAO,IAAO,IAAO;AAAA,EACjD;AAAA,EAgJO,OAAgB;AACb,UAAA,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAAA,EAEA,IAAI,QAAqB;AACrB,WAAO1K,EAAA,MAAKqK,MAAcrK,EAAA,MAAKoK,MAAS,KAAK;EACjD;AAAA,EAEA,IAAI,MAAMlN,GAAoB;AAC1B,IAAA0C,EAAA,MAAKyK,IAAc,KACnBzK,EAAA,MAAKwK,IAASlN;AAAA,EAClB;AAAA,EAEO,OAAgB;AACb,UAAA,IAAI,MAAM,4CAA4C;AAAA,EAChE;AAAA,EAiBO,eAA+B;AAIlC,UAAMqR,IAAqB,KAAK;AAIhC,QAAIC,IAAiC,IAAI,MAAM,IAAID,EAAM,SAAS,CAAC,EAC9D,KAAK,EAAE,EACP,IAAI,CAACE,GAAI7K,MACCA,IAAQ,MAAM,IAAI,KAAK,GACjC;AAGD,QAAA4K,EAAM,WAAW,GAAG;AAEd,YAAA,CAACvQ,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAKL,MAAAA,EAAE,KAAK;AACnD,MAAA4Q,IAAQ3E,GAAiB2E,GAAO,IAAIvQ,IAAI,IAAI,MAAM,GAAG;AAAA,IAC9C,WAAA,KAAK,OAAO,EAAE,SAAS;AAExB,YAAA,CAACA,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAKL,MAAAA,EAAE,KAAK;AAGnD,MAAA4Q,EAAM,CAAC,IAAIvQ,IAAI,IAAI,MAAM,KACzBuQ,EAAM,CAAC,IAAI,KACXA,EAAM,CAAC,IAAIvQ,IAAI,IAAI,MAAM;AAAA,IAAA;AAWZ,MATQ;AAAA,QACjBsQ,EAAM,CAAC,EAAE,QAAQ;AAAA,QACjB,GAAGA,EAAM,IAAI,CAACG,GAAO9K,MACVA,MAAU2K,EAAM,SAAS,IAC5BA,EAAM3K,CAAK,EAAE,QAAQ,KACpB2K,EAAM3K,CAAK,EAAE,QAAQ2K,EAAM3K,IAAQ,CAAC,EAAE,SAAS,CACvD;AAAA,MAAA,EAGQ,QAAQ,CAAC+K,GAAM/K,MAAU;AAClC,cAAMxD,IAAO,KAAK,SAAS,EAAC,GAAGuO,EAAA,GAAO,EAAI;AAC1C,QAAAH,EAAM5K,IAAQ,CAAC,IAAIxD,IAAO,IAAI,MAAM;AAAA,MAAA,CACvC;AAGE,WAAA,EAAC,OAAAmO,GAAO,OAAAC;EACnB;AAAA,EAEA,IAAW,YAAsB;AAC7B,QAAI1M,IAAc,CAAA;AAEP,eAAAhB,KAAKd,EAAA,MAAKmK;AACb,MAAArI,IAAAA,EAAE,OAAOhB,EAAE,SAAS;AAK5B,WAAAgB,IAAI,CAAC,GAAG,IAAI,IAAIA,CAAC,CAAC,GAClBA,EAAE,KAAK,GACAA;AAAA,EACX;AAAA,EAYA,IAAW,SAAsB;AAC7B,WAAO,KAAK;EAChB;AA+aJ;AAt0CIoI,KAAA,eACAC,IAAA,eACAC,KAAA,eACAC,KAAA,eAs5BAC,KAAA,eAmCAC,KAAA,eAQAC,KAAA,eASAhD,KAAA,eASAiD,KAAA,eAwGAC,KAAA,eAoCAC,KAAA,eAsBAC,KAAA,eASAC,KAAA,eAIAC,KAAA,eAQAC,KAAA,eAlpCGC,KAAA,eA+pCHC,KAAA,SAAazC,MAAqB/K,GAAyB;AACnD,MAAAA,EAAO,WAAW,GAAG;AAIrB,QAHA+K,IAAW,KAAKA,GAGZA,MAAa,MAAM,CAAC,MAAM,OAAOA,CAAQ,CAAC,GAAG;AAC7C,WAAK,MAAM;AAEL,YAAA1H,IAAI,IAAI2I,EAAMjB,CAAQ;AAG5B,kBAAK,IAAI1H,CAAC,GACH;AAAA,IACX;AAGO,WAAAd,EAAA,MAAKkL,IAAL,WAAkC1C;AAAA,EAClC,WAAA,UAAU,KAAKA,CAAQ,GAAG;AAEjC,SAAK,MAAM;AAEX,UAAM5H,IAAYnD,EAAO,IAAI,OAAK,IAAI4D,EAASzD,CAAyB,CAAC;AAGrE,QAAA4K,EAAS,SAAS,GAAG;AACf,YAAAS,IAAUT,EAAS,MAAM,EAAE;AAEjC,UAAIS,EAAQ,SAASxL,EAAO,SAAS;AAC3B,cAAA,IAAI,MAAM,0CAA0C;AAG9D,UAAIO,IAAI;AAER,iBAAW+B,KAAKa,GAAW;AACjB,cAAAE,IAAI,IAAI2I;AACZ,QAAA3I,EAAA,cAAcf,EAAE,SAChBe,EAAA,aAAamI,EAAQjL,CAAC,KAAK,IAC7B,KAAK,IAAI8C,CAAC,GACV9C;AAAA,MACJ;AAAA,IAAA,OAGC;AACG,UAAA,IAAI4C,EAAU,SAAS;AAC3B,iBAAWb,KAAKa,GAAW;AACjB,cAAAE,IAAI,IAAI2I;AACZ,QAAA3I,EAAA,cAAcf,EAAE,SAClBe,EAAE,aAAa,GAAG0H,CAAQ,IAAI,CAAC,IAC/B,KAAK,IAAI1H,CAAC,GACV;AAAA,MACJ;AAAA,IACJ;AACO,WAAA;AAAA,EAAA;AAEP,WAAO,KAAK;AAGpB,GAMAoK,KAAA,eAwBAC,KAAA;AAtvCG,IAAMyD,IAANxD;APnCP,IAAAyD,GAAAC,GAAAC,IAAAC,IAAAC,IAAAC;AQeO,MAAMC,KAAN,MAAMA,GAGU;AAAA,EAYnB,YAAYtM,GAAyCC,GAA+B1C,GAAsB;AAT1G;AAAA,IAAAX,EAAA,MAAAoP;AAEA;AAAA,IAAApP,EAAA,MAAAqP;AAEA;AAAA,IAAArP,EAAA,MAAAsP;AAkCO;AAAA,IAAArP,EAAA,eAAQ,CAAC0P,MAAiC;AAEvC,YAAAC,IAA0BrP,EAAA,MAAKgP,IAAL,WAAeI;AAE/C,UAAIC,MAAY;AACN,cAAA,IAAI,MAAM,2CAA2C;AAIzD,YAAAC,IAAiBF,EAAe,MAAMC,CAAO;AAEnD,aAAO,KAAK,OAAO,IAAIT,EAAQU,EAAK,CAAC,CAAC,GAAG,IAAIV,EAAQU,EAAK,CAAC,CAAC,GAAGtP,EAAA,MAAKiP,IAAL,WAAiBI,EAAQ;AAAA,IAAA;AAGrF,IAAA3P,EAAA,gBAAS,CAACmD,GAAeC,GAAgB1C,OAC5CR,EAAA,MAAKiP,GAAQhM,IACbjD,EAAA,MAAKkP,GAAShM,IACdlD,EAAA,MAAKmP,IAAQ/O,EAAA,MAAKiP,IAAL,WAAiB7O,KAAQ,OAC/B;AAGJ,IAAAV,EAAA,eAAQ,MACJ,IAAIyP,GAASnP,EAAA,MAAK6O,GAAM,MAAS,GAAA7O,EAAA,MAAK8O,GAAO,MAAA,GAAS9O,EAAA,MAAK+O,GAAK;AAsCpE;AAAA;AAAA;AAAA;AAAA,IAAArP,EAAA,gBAAS,CAACmI,MACNxG,EAAS,IAAIrB,EAAA,MAAK6O,GAAM,OAAOhH,CAAM,GAAG7H,EAAA,MAAK8O,GAAO,OAAOjH,CAAM,CAAC;AAiBtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAnI,EAAA,gBAAS,CAACxC,MAAsC;AAE7C,YAAA6C,IAAc,IAAIsB,EAASnE,CAAK;AAElC,aAAA6C,EAAE,WACK,OAEA,KAAK,SAASA,EAAE,QAAS,CAAA;AAAA,IACpC;AA6BG;AAAA;AAAA;AAAA;AAAA,IAAAL,EAAA,qBAAc,CAACmI,MACX,KAAK,UAAU,SAASA,CAAM;AASlC,IAAAnI,EAAA,oBAAa,CAACsD,MAA2B;AAE5C,YAAMuM,IAAKvM,EAAI,MAAQ,EAAA,SAAA,EAAW,WAAW,MACzCwM,IAAK,KAAK,MAAM,EAAE,SAAS,EAAE,SAAW,EAAA;AAG5C,aAAOD,EAAG,QAAQC,CAAE,KAAKD,EAAG,aAAaC,CAAE;AAAA,IAAA;AAMxC;AAAA;AAAA;AAAA,IAAA9P,EAAA,yBAAkB,MACdM,EAAA,MAAK6O,GAAM,mBAAmB7O,EAAA,MAAK8O,GAAO;AAK9C;AAAA;AAAA,IAAApP,EAAA,mBAAY,CAACsD,MAA2B;AAC3C,YAAMuM,IAAKvM,EAAI,MAAM,EAAE,SAAS,EAAE,MAC9BwM,IAAK,KAAK,MAAA,EAAQ,SAAA,EAAW;AAGjC,aAAOD,EAAG,QAAQC,CAAE,KAAKD,EAAG,aAAaC,CAAE;AAAA,IAAA;AAOxC;AAAA;AAAA;AAAA;AAAA,IAAA9P,EAAA,iBAAU,CAACmI,MAAkC;AAS5C,UALA,CAAC,KAAK,OAAOA,CAAM,EAAE,WAKrB,KAAK;AACE,eAAA;AAIP,UAAA4H;AAEC,MAAAzP,EAAA,MAAA6O,GAAM,SAAS7O,EAAA,MAAK8O,EAAM,GAC/B9O,EAAA,MAAK8O,GAAO;AACZ,YAAMrR,IAAS,CAAC,GAAGuC,EAAA,MAAK6O,GAAM,MAAM;AACpC,iBAAW/N,KAAKrD;AACZ,QAAKqD,EAAE,YAAY+G,CAAM,MACrB4H,IAAQ3O,EAAE,SACLd,EAAA,MAAA6O,GAAM,SAASY,CAAK,GACpBzP,EAAA,MAAA8O,GAAO,SAASW,CAAK;AAK9B,UAAAzP,EAAA,MAAK6O,GAAM,WAAW;AACf,eAAA;AAGX,YAAMa,IAAkB1P,EAAA,MAAK6O,GAAM,OAAO,CAAC,EAAE,YAAY;AACpD,aAAA7O,EAAA,MAAA6O,GAAM,OAAOa,CAAK,GAClB1P,EAAA,MAAA8O,GAAO,OAAOY,CAAK,GACjB;AAAA,IAAA;AAOJ;AAAA;AAAA;AAAA,IAAAhQ,EAAA,iBAAU,MACN,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAGM,EAAA,MAAK6O,GAAM,QAAQ,GAAG,GAAG7O,EAAA,MAAK8O,GAAO,QAAS,CAAA,CAAC,CAAC;AAOpE;AAAA;AAAA;AAAA;AAAA,IAAApP,EAAA,kBAAW,OACTM,EAAA,MAAA6O,GAAM,SAAS7O,EAAA,MAAK8O,EAAM,GAC/B9O,EAAA,MAAK8O,GAAO,QACL;AAOJ;AAAA;AAAA;AAAA;AAAA,IAAApP,EAAA,kBAAW,CAACxC,MAAsC;AAE/C,YAAA6C,IAAc,IAAIsB,EAASnE,CAAK;AAGjC,aAAA8C,EAAA,MAAA6O,GAAM,SAAS9O,CAAC,GAChBC,EAAA,MAAA8O,GAAO,SAAS/O,CAAC,GAGlBC,EAAA,MAAK+O,QAAU,OAAOhP,EAAE,KAAA,MAAW,MACnCC,EAAA,MAAKkP,IAAL,YAGG;AAAA,IAAA;AAQJ,IAAAxP,EAAA,kBAAW,OACTE,EAAA,MAAAiP,GAAQ7O,EAAA,MAAK6O,GAAM,SAAS,IAC5BjP,EAAA,MAAAkP,GAAS9O,EAAA,MAAK8O,GAAO,SAAS,IAC5B;AA2BJ,IAAApP,EAAA,iBAAU,CAACiQ,OAGT3P,EAAA,MAAA6O,GAAM,SAAS7O,EAAA,MAAK8O,EAAM,GAC/B9O,EAAA,MAAK8O,GAAO,QACZ9O,EAAA,MAAK6O,GAAM,WAGPc,IACO,QAIN3P,EAAA,MAAA6O,GAAM,OACN,OAAO,CAAK/N,MAAAA,EAAE,OAAO,EAAE,OAAQ,CAAA,EAC/B,QAAQ,CAAKA,MAAA;AACJ,YAAA8O,IAAO9O,EAAE;AACV,MAAAd,EAAA,MAAA6O,GAAM,SAASe,CAAI,GACnB5P,EAAA,MAAA8O,GAAO,SAASc,CAAI;AAAA,IAAA,CAC5B,GAGL5P,EAAA,MAAK6O,GAAM,WACX7O,EAAA,MAAK8O,GAAO,WACL;AAIJ;AAAA,IAAApP,EAAA,mBAAY,CAACmI,GAAgB5C,OAC3BjF,EAAA,MAAA6O,GAAM,UAAUhH,GAAQ5C,CAAC,GACzBjF,EAAA,MAAA8O,GAAO,UAAUjH,GAAQ5C,CAAC,GACxB;AAMJ;AAAA;AAAA;AAAA,IAAAvF,EAAA,kBAAW,OACd,KAAK,SAASR,EAAQ,IAAI,GAAGc,EAAA,MAAK6O,GAAM,gBAAgB,GAAG,GAAG7O,EAAA,MAAK8O,GAAO,gBAAA,CAAiB,CAAC,GAC5F,KAAK,OAAO5P,EAAQ,IAAI,GAAGc,EAAA,MAAK6O,GAAM,cAAc,GAAG,GAAG7O,EAAA,MAAK8O,GAAO,cAAA,CAAe,CAAC,GAC/E;AAIJ;AAAA,IAAApP,EAAA,eAAQ,MACI,IAAI0G,GAAe,KAAK,MAAO,CAAA,EAChC;AA2BX,IAAA1G,EAAA,cAAO,CAACjC,MACH,KAAK,KAAK,SAASA,CAAM,EAAe,QAAQ,KAAK,MAAM,SAASA,CAAM,CAAC;AAuFvF,IAAAgC,EAAA,MAAAuP,IAAY,CAACI,MAA2C;AAChD,UAAAA,EAAe,SAAS,KAAK;AAC7B,eAAQA,EAAe,SAAS,OAAO,IAAK,UAAU;AAC/C,UAAAA,EAAe,SAAS,KAAK;AACpC,eAAQA,EAAe,SAAS,OAAO,IAAK,UAAU;AAC/C,UAAAA,EAAe,SAAS,IAAI;AAC5B,eAAA;AACA,UAAAA,EAAe,SAAS,IAAI;AAC5B,eAAA;AACA,UAAAA,EAAe,SAAS,GAAG;AAC3B,eAAA;AACA,UAAAA,EAAe,SAAS,IAAI;AAC5B,eAAA;AACA,UAAAA,EAAe,SAAS,IAAI;AAC5B,eAAA;AACA,UAAAA,EAAe,SAAS,GAAG;AAC3B,eAAA;AACA,UAAAA,EAAe,SAAS,GAAG;AAC3B,eAAA;AAGL,YAAA,IAAI,MAAM,2CAA2C;AAAA,IAAA;AAK/D;AAAA;AAAA,IAAA3P,EAAA,MAAAwP,IAAc,CAACY,MACPA,MAAY,SACL,MAGPA,EAAQ,SAAS,KAAK,KAEfA,EAAQ,SAAS,IAAI,KAErBA,EAAQ,SAAS,IAAI,IAHrB,OAKAA,EAAQ,SAAS,GAAG,IACpB,MACAA,EAAQ,SAAS,KAAK,KAEtBA,EAAQ,SAAS,IAAI,KAErBA,EAAQ,SAAS,IAAI,IAHrB,OAKAA,EAAQ,SAAS,GAAG,IACpB,MAEA;AAIf,IAAApQ,EAAA,MAAAyP,IAAe,MACPlP,EAAA,MAAK+O,QAAU,MACR,OAGP/O,EAAA,MAAK+O,IAAM,SAAS,GAAG,KAClB/O,EAAA,MAAA+O,IAAM,QAAQ,KAAK,GAAG,GACpB,QAEP/O,EAAA,MAAK+O,IAAM,SAAS,GAAG,KAClB/O,EAAA,MAAA+O,IAAM,QAAQ,KAAK,GAAG,GACpB,QAGJ;AAngBH,QALJnP,EAAA,MAAKiP,GAAQ,IAAID,EAAQ,EAAE,KAAK,IAChChP,EAAA,MAAKkP,GAAS,IAAIF,EAAQ,EAAE,KAAK,IACjChP,EAAA,MAAKmP,IAAQ,MAGTlM,MAAS,UAAaC,MAAU,QAAW;AAC3C,UAAID,aAAgBsM;AAChB,eAAOtM,EAAK;AAChB,MAAW,OAAOA,KAAS,YAEvB,KAAK,MAAMA,CAAI;AAAA,IAGZ,MAAA,CAAAA,MAAS,UAAaC,MAAU,WAElC,KAAA,OAAO,IAAI8L,EAAQ/L,CAA6B,GAChD,KAAA,QAAQ,IAAI+L,EAAQ9L,CAAK;AAGlC,WAAI1C,MAAS,WACT,KAAK,OAAOA,IAGT;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCO,IAAIlD,GAA6C;AACpD,QAAIA,aAAiBiS;AAEZ,aAAAnP,EAAA,MAAA6O,GAAM,IAAI3R,EAAM,IAAI,GAEpB8C,EAAA,MAAA8O,GAAO,IAAI5R,EAAM,KAAK,GAEpB;AAGX,QAAI,OAAOA,KAAU,YACjB,CAACiS,GAAS,iBAAiBjS,CAAK;AAEhC,aAAO,KAAK,IAAI,IAAIiS,GAASjS,CAAK,CAAC;AAGjC,UAAA4C,IAAI,IAAI8O,EAAQ1R,CAAK;AACtB,WAAA8C,EAAA,MAAA6O,GAAM,IAAI/O,CAAC,GACXE,EAAA,MAAA8O,GAAO,IAAIhP,CAAC,GAEV;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCO,SAASrC,GAA+DsK,GAAgC;AAK3G,UAAMlF,IAAO7C,EAAA,MAAK6O,GAAM,SAASpR,GAAQsK,CAAS,GAC9CjF,IAAQ9C,EAAA,MAAK8O,GAAO,SAASrR,GAAQsK,CAAS;AAGlD,WAAIA,IACOlF,MAASC,IAGZD,EAAkB,QAAQC,CAAiB;AAAA,EACvD;AAAA,EAWO,QAAQ5F,GAAsC;AAC3C,UAAA8F,IAAM,IAAImM,GAASjS,CAAK;AACvB,WAAA8F,EAAI,KAAK,QAAQhD,EAAA,MAAK6O,EAAK,KAAK7L,EAAI,MAAM,QAAQhD,EAAA,MAAK8O,EAAM;AAAA,EACxE;AAAA,EA4GO,IAAI5R,GAAqB;AACvB,WAAA8C,EAAA,MAAA6O,GAAM,IAAI3R,CAAK,GACf8C,EAAA,MAAA8O,GAAO,IAAI5R,CAAK,GACd;AAAA,EACX;AAAA,EAOO,SAAe;AAQlB,gBAAK,SAAS,GAGd8C,EAAA,MAAK6O,GAAM,UAGX,KAAK,SAAS,GAGV7O,EAAA,MAAK6O,GAAM,OAAO,CAAC,EAAE,YAAY,gBACjC,KAAK,SAAS,EAAE,GAGb;AAAA,EACX;AAAA,EAmDO,QAA4B;AACxB,WAAA,CAAC7O,EAAA,MAAK6O,GAAM,MAAA,GAAS7O,EAAA,MAAK8O,GAAO,OAAO;AAAA,EACnD;AAAA,EAEO,SAAS5R,GAA6C;AACzD,QAAIA,aAAiBiS;AACZ,aAAAnP,EAAA,MAAA6O,GAAM,SAAS3R,EAAM,IAAI,GACzB8C,EAAA,MAAA8O,GAAO,SAAS5R,EAAM,KAAK,GAEzB;AAGX,QAAI,OAAOA,KAAU,YACjB,CAACiS,GAAS,iBAAiBjS,CAAK;AAChC,aAAO,KAAK,SAAS,IAAIiS,GAASjS,CAAK,CAAC;AAGtC,UAAA4C,IAAI,IAAI8O,EAAQ1R,CAAK;AACtB,WAAA8C,EAAA,MAAA6O,GAAM,SAAS/O,CAAC,GAChBE,EAAA,MAAA8O,GAAO,SAAShP,CAAC,GAEf;AAAA,EACX;AAAA,EAMA,OAAc,iBAAiBsP,GAAiC;AAI5D,WAAOA,EAAe,SAAS,GAAG,KAC9BA,EAAe,SAAS,GAAG,KAC3BA,EAAe,SAAS,GAAG,KAC3BA,EAAe,SAAS,IAAI,KAC5BA,EAAe,SAAS,IAAI;AAAA,EACpC;AAAA,EAEA,OAAc,oBAAoB/L,GAAwBpC,GAA+B;AACrF,UAAM6O,IAA0B,CAAA,GAC5BC,IAAkB1M,EAAU,OAAO,CAAO2M,MACjCF,EAAc,SAASE,EAAI,GAAG,IAIxB,MAHOF,EAAA,KAAKE,EAAI,GAAG,GACnB,GAId;AAEL,WAAI/O,MAAW,MACX8O,EAAgB,KAAK,CAAC9R,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK,GAG7C6R;AAAA,EACX;AAAA,EAEA,IAAW,UAAkB;AAClB,WAAA,GAAG/P,EAAA,MAAK6O,GAAM,OAAO,GAAG,KAAK,SAAS,GAAG7O,EAAA,MAAK8O,GAAO,OAAO;AAAA,EACvE;AAAA;AAAA,EAGA,IAAW,OAAgB;AACvB,WAAO9O,EAAA,MAAK6O;AAAA,EAChB;AAAA,EAEA,IAAW,KAAK3R,GAAgB;AAC5B,IAAA0C,EAAA,MAAKiP,GAAQ3R;AAAA,EACjB;AAAA,EAEA,IAAW,eAAuB;AAC9B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EAEA,IAAW,QAAiB;AACxB,WAAO8C,EAAA,MAAK8O;AAAA,EAChB;AAAA,EAEA,IAAW,MAAM5R,GAAgB;AAC7B,IAAA0C,EAAA,MAAKkP,GAAS5R;AAAA,EAClB;AAAA;AAAA,EAGA,IAAW,OAAe;AACtB,WAAO8C,EAAA,MAAK+O;AAAA,EAChB;AAAA,EAEA,IAAW,KAAK7R,GAAe;AAEtB,IAAA0C,EAAA,MAAAmP,IAAQ/O,EAAA,MAAKiP,IAAL,WAAiB/R;AAAA,EAClC;AAAA,EAEA,IAAW,YAAoB;AACvB,WAAA8C,EAAA,MAAK+O,QAAU,OACR,UAGP/O,EAAA,MAAK+O,QAAU,OACR,UAGJ/O,EAAA,MAAK+O;AAAA,EAChB;AAAA,EAEA,IAAW,MAAc;AACd,WAAA,GAAG/O,EAAA,MAAK6O,GAAM,GAAG,GAAG,KAAK,SAAS,GAAG7O,EAAA,MAAK8O,GAAO,GAAG;AAAA,EAC/D;AAAA,EAEA,IAAW,YAAsB;AAC7B,WAAO,CAAC,GAAG,IAAI,IAAI9O,EAAA,MAAK8O,GAAO,UAAU,OAAO9O,EAAA,MAAK6O,GAAM,SAAS,CAAC,CAAC;AAAA,EAC1E;AAsEJ;AArhBIA,IAAA,eAEAC,IAAA,eAEAC,KAAA,eA6cAC,KAAA,eA0BAC,KAAA,eA0BAC,KAAA;AA3gBG,IAAMe,IAANd;ARfP,IAAAe,IAAAC,IAAAC,IAAAC;ASaO,MAAMC,KAAN,MAAMA,GAEQ;AAAA,EAMjB,YAAYpT,GAAwCqT,GAA8B;AALlF,IAAA9Q,EAAA,MAAAyQ;AACA,IAAAzQ,EAAA,MAAA0Q;AACA,IAAA1Q,EAAA,MAAA2Q;AACA,IAAA3Q,EAAA,MAAA4Q,IAAc;AAKV,WAAInT,aAAiBoT,MACZ1Q,EAAA,MAAAuQ,IAAWjT,EAAM,QAAQ,MAAM,IAC/B0C,EAAA,MAAAwQ,IAASlT,EAAM,MAAM,MAAM,IAE7BqT,MAAU,UACTvQ,EAAA,MAAKoQ,IAAO,SAAS,IAAI/O,EAASkP,CAAK,CAAC,KAEtCrT,MAAU,UACX0C,EAAA,MAAAuQ,IAAW,IAAIvB,EAAQ1R,CAAK,IACjC0C,EAAA,MAAKwQ,IAAS,IAAI/O,EAASkP,KAAS,CAAC,OAEhC3Q,EAAA,MAAAuQ,IAAW,IAAIvB,MACfhP,EAAA,MAAAwQ,IAAS,IAAI/O,EAAS,CAAC,KAGhCzB,EAAA,MAAKsQ,IAAe,IAEb;AAAA,EACX;AAAA,EAEO,QAA6C;AAC1C,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEO,QAAgB;AACZ,WAAA,IAAII,GAAO,IAAI;AAAA,EAC1B;AAAA,EAEO,YAAYE,GAAoC;AAC9C,WAAA5Q,EAAA,MAAAuQ,IAAW,IAAIvB,EAAQ4B,CAAO,IAC9B5Q,EAAA,MAAAwQ,IAAS,IAAI/O,EAAS,CAAC,IACrB;AAAA,EACX;AAAA,EACA,IAAW,MAAc;AACf,UAAAoP,IAAM,KAAK,MAAM,WACjBC,IAAM,KAAK,MAAM;AAEnB,QAAAC,GACAJ;AAEJ,WAAIvQ,EAAA,MAAKkQ,QAAiB,KAAuBQ,IAAM,KAC5CC,IAAA,SAASD,MAAQ,IAAI,KAAK,KAAKA,CAAG,IAAI,KAAK,KAAK,QAAQ,GAAG,MAClEH,IAAQE,MAAQ,IAAI,KAAK,MAAMA,CAAG,SAElCE,IAAO3Q,EAAA,MAAKqQ,OAAe,KAAK,MAAM,MAAM,IAAI,KAAK,QAAQ,MAAM3G,GAAgB,KAAK,QAAQ,GAAG,GAC1F6G,IAAAG,MAAQ,KAAKD,MAAQ,IAAK,KAAK,MAAM,KAAK,MAAM,GAAG,OAIzDE,IAAA,GAAGA,CAAI,GAAGJ,CAAK,IAGlBvQ,EAAA,MAAKkQ,QAAiB,KAAuBO,IAAM,MACnDE,IAAO,gBAAgBA,CAAI,OAIxBA;AAAA,EACX;AAAA,EAEA,IAAW,UAAkB;AACnB,UAAAF,IAAM,KAAK,MAAM,WACjBC,IAAM,KAAK,MAAM;AAEnB,QAAAC,GACAJ;AAEJ,WAAIvQ,EAAA,MAAKkQ,QAAiB,KAAuBQ,IAAM,KAC5CC,IAAA,GAAGD,MAAQ,IAAI,SAAS,QAAQA,CAAG,GAAG,IAAI,KAAK,QAAQ,OAAO,KACrEH,IAAQE,MAAQ,IAAI,KAAK,KAAKA,CAAG,QAEjCE,IAAO3Q,EAAA,MAAKqQ,OAAe,KAAK,MAAM,MAAM,IAAI,KAAK,QAAQ,UAAU3G,GAAgB,KAAK,QAAQ,SAAS,EAAK,GACzG6G,IAAAG,MAAQ,KAAKD,MAAQ,IAAK,KAAK,KAAK,KAAK,MAAM,OAAO,MAI5DE,IAAA,GAAGA,CAAI,GAAGJ,CAAK,IAGlBvQ,EAAA,MAAKkQ,QAAiB,KAAuBO,IAAM,MACnDE,IAAO,MAAMA,CAAI,MAIdA;AAAA,EACX;AAAA,EAEO,MAAc;AACX,UAAA,IAAI,MAAM,oCAAoC;AAAA,EACxD;AAAA,EAEA,IAAW,WAAiB;AACxB,WAAA/Q,EAAA,MAAKyQ,IAAc,KACZ;AAAA,EACX;AAAA,EAEO,OAAOxI,GAA2B;AACrC,WAAO,KAAK,QAAQ,OAAOA,CAAM,EAAE,SAAS,KAAK,KAAK;AAAA,EAC1D;AAAA,EAEO,aAAuB;AAEtB,WAAA,KAAK,MAAM,WACJ,CAAC,IAAIyI,GAAO,GAAG,CAAC,IAIvB,KAAK,MAAM,UACJ,CAAC,IAAIA,GAAO,KAAK,QAAQ,QAAQ,WAAY,CAAA,CAAC,IAKlD;AAAA,MACH,IAAIA,GAAO,KAAK,MAAM,OAAO;AAAA,MAC7B,IAAIA,GAAO,KAAK,QAAQ,MAAM,EAAE,YAAY;AAAA,MAC5C,IAAIA,GAAO,KAAK,QAAQ,MAAM,GAAG,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,IAAA;AAAA,EAEvE;AAAA,EAEO,UAAmB;AAClB,QAAA,KAAK,MAAM;AACX,aAAO,KAAK,QAAQ,QAAQ,IAAI,KAAK,MAAM,KAAK;AAG9C,UAAA,IAAI,MAAM,oCAAoC;AAAA,EACxD;AAAA,EAEO,OAAOpT,GAA6C;AACvD,QAAIA,aAAiBoT,MACb,KAAK,SAASpT,CAAK;AACd,kBAAA,MAAM,SAASA,EAAM,KAAK,GACxB;AAKT,UAAA+H,IAAI,IAAI2J,EAAQ1R,CAAgB;AAClC,QAAA,KAAK,SAAS+H,CAAC;AACV,kBAAA,MAAM,SAAS,CAAC,GACd;AAGL,UAAA,IAAI,MAAM,kCAAkC;AAAA,EACtD;AAAA,EAEO,SAASxH,GAA+DsK,GAAwC;AACnH,WAAIA,IACQ,KAAK,QAAQ,SAAStK,GAAQ,EAAI,KAAgB,KAAK,MAAM,QAIjE,KAAK,QAAQ,SAASA,CAAM,EAAe,IAAI,KAAK,KAAK;AAAA,EACrE;AAAA,EAEO,YAAYoK,GAAyB;AACjC,WAAA,KAAK,QAAQ,YAAYA,CAAM;AAAA,EAC1C;AAAA,EAEO,UAAgB;AACnB,gBAAK,MAAM,YACJ;AAAA,EACX;AAAA,EAEO,QAAQ3K,GAAwB;AAG5B,WAAA,KAAK,SAASA,CAAK,KACtB,KAAK,MAAM,QAAQA,EAAM,KAAK;AAAA,EACtC;AAAA,EAEO,QAAiB;AACpB,WAAO,KAAK,QAAQ,MAAA,KAAW,KAAK,MAAM;EAC9C;AAAA,EAEO,SAASA,GAAuC;AAC/C,QAAA+H;AACJ,WAAI/H,aAAiBoT,KACjBrL,IAAI/H,EAAM,UACHA,aAAiB0R,IACpB3J,IAAA/H,IAEA+H,IAAA,IAAI2J,EAAQ1R,CAAK,GAIlB,KAAK,QAAQ,QAAQ+H,CAAC;AAAA,EACjC;AAAA,EAEO,SAAkB;AACd,WAAA,KAAK,QAAQ;EACxB;AAAA,EAEO,SAAS/H,GAA6C;AACzD,QAAIA,aAAiBoT,MACb,KAAK,SAASpT,CAAK;AACd,kBAAA,MAAM,IAAIA,EAAM,KAAK,GACnB;AAKT,UAAA+H,IAAI,IAAI2J,EAAQ1R,CAAgB;AAClC,QAAA,KAAK,SAAS+H,CAAC;AACV,kBAAA,MAAM,IAAI,CAAC,GACT;AAGL,UAAA,IAAI,MAAM,kCAAkC;AAAA,EACtD;AAAA,EAEO,MAAY;AACf,WAAAjF,EAAA,MAAKmQ,IAAS,OACdnQ,EAAA,MAAKoQ,IAAO,OACL;AAAA,EACX;AAAA,EAEO,WAAmB;AAChB,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEA,IAAW,UAAmB;AAC1B,WAAOpQ,EAAA,MAAKmQ;AAAA,EAChB;AAAA,EAEA,IAAW,QAAQjT,GAAgB;AAC/B,IAAA0C,EAAA,MAAKuQ,IAAWjT;AAAA,EACpB;AAAA,EAEO,IAAIA,GAAgC;AAClC,gBAAA,MAAM,SAASA,CAAK,GAClB;AAAA,EACX;AAAA,EAEA,IAAW,QAAkB;AACzB,WAAO8C,EAAA,MAAKoQ;AAAA,EAChB;AAAA,EAEA,IAAW,MAAMlT,GAA6B;AACrC,IAAA0C,EAAA,MAAAwQ,IAAS,IAAI/O,EAASnE,CAAK;AAAA,EACpC;AAAA,EAEO,YAAoB;AACjB,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEO,SAAiB;AACd,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEO,KAAKA,GAAqB;AACxB,gBAAA,MAAM,OAAOA,CAAK,GAChB;AAAA,EACX;AAAA,EAEO,OAAa;AACT,WAAA,KAAK,KAAK,CAAC;AAAA,EACtB;AAAA,EAEO,WAAmB;AAChB,UAAA,IAAI,MAAM,yCAAyC;AAAA,EAC7D;AAAA,EAEO,eAA+B;AAClC,UAAMqL,IAAM,KAAK,MAAM,QAAQ,OAAO,GAChCqI,IAAM,KAAK,QAAQ,aAAa;AAGlC,WAAArI,EAAI,yBACJqI,EAAI,QAAQ/G,GAAiB+G,EAAI,OAAO,KAAK,GAAG,IAMhDrI,EAAI,cAAc,MAAM,IAExBqI,EAAI,QAAQ/G,GAAiB+G,EAAI,OAAO,KAAK,GAAG,IACzCrI,EAAI,YAAY,MAAM,MAE7BqI,EAAI,QAAQ/G,GAAiB+G,EAAI,OAAO,KAAK,GAAG,IAI7C,EAAC,OAAOA,EAAI,OAAO,OAAOA,EAAI;EACzC;AAAA,EAEA,IAAW,YAAsB;AAC7B,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAW,YAAkB;AACzB,WAAAhR,EAAA,MAAKsQ,IAAe,IACb;AAAA,EACX;AAAA,EAEA,IAAW,WAAiB;AACxB,WAAAtQ,EAAA,MAAKsQ,IAAe,IACb;AAAA,EACX;AAAA,EAEO,OAAa;AAChB,WAAAlQ,EAAA,MAAKmQ,IAAS,QACdnQ,EAAA,MAAKoQ,IAAO,OACL;AAAA,EACX;AAEJ;AA3TIF,KAAA,eACAC,KAAA,eACAC,KAAA,eACAC,KAAA;AANG,IAAMQ,KAANP;AAgUK,IAAAQ,uBAAAA,OACRA,EAAAC,EAAA,OAAA,CAAA,IAAA,QACAD,EAAAC,EAAA,QAAA,CAAA,IAAA,SAFQD,IAAAA,MAAA,CAAA,CAAA,GT7UZE,GAAAC,IAAAC,IAAAC;AUKO,MAAMC,KAAN,MAAMA,GAEc;AAAA,EAOvB,eAAe3T,GAA+B;AAL9C,IAAAgC,EAAA,MAAAuR;AAGA;AAAA,IAAAvR,EAAA,MAAAwR;AAaO,IAAAvR,EAAA,eAAQ,IAAI2R,OAEfzR,EAAA,MAAKoR,GAAaK,EAAU,IAAI,OAAS,IAAIpB,EAAS/S,CAAK,CAAC,IAG5D8C,EAAA,MAAKkR,IAAL,YACO;AAGJ,IAAAxR,EAAA,eAAQ,MACJ,IAAI0R,GAAA,EACN,MAAM,GAAGpR,EAAA,MAAKgR,GAAW,IAAI,CAAOhO,MAAAA,EAAI,MAAM,CAAC,CAAC;AA+ClD,IAAAtD,EAAA,kBAAW,CAAC2R,GAAuBC,MAAqC;AACvE,UAAAC,GACAzQ,GACAmI,IAAoB,CAAA;AACxB,YAAMuI,IAAqB,CAAA;AAG3B,iBAAWxO,KAAOqO;AACd,QAAApI,IAAUA,EAAQ,OAAOjG,EAAI,QAAS,CAAA;AAG1C,MAAAiG,IAAU,CAAC,GAAG,IAAI,IAAIA,CAAO,CAAC,GAC9BA,EAAQ,KAAK;AAEb,eAASjL,IAAI,GAAGA,IAAIqT,EAAU,QAAQrT,KAAK;AACjC,cAAAgF,IAAMqO,EAAUrT,CAAC;AAEvB,QAAAuT,IAAS,CAAA;AACT,mBAAWnK,KAAK6B;AACR,UAAAnI,IAAAkC,EAAI,KAAK,cAAcoE,CAAC,GAExBmK,EAAO,WAAW,IAClBA,EAAO,KAAKzQ,EAAE,OAAW,IAAA,KAAKA,EAAE,GAAG,IAEnCyQ,EAAO,KAAKzQ,EAAE,OAAO,IAAI,MAAOA,EAAE,YAAY,KAAA,MAAW,IAAK,MAAM,MAAMA,EAAE,GAAG;AAWnF,YANJyQ,EAAO,KAAK,GAAG,GAGRA,EAAA,KAAKvO,EAAI,MAAM,GAAG,IAGrBsO,KAAA,gBAAAA,EAAYtT,QAAO,QAAW;AAEvB,UAAAuT,EAAAA,EAAO,SAAS,CAAC,IAAIA,EAAOA,EAAO,SAAS,CAAC,IAAI;AAC7C,qBAAA5K,KAAK2K,EAAUtT,CAAC;AAChB,YAAAuT,EAAA,KAAK,eAAe5K,EAAE,WAAW,GAAG,IAAI,YAAYA,IAAI,aAAaA,CAAC,EAAE;AAAA,QAEvF;AAGA,QAAA6K,EAAS,KAAKD,EAAO,KAAK,GAAG,CAAC;AAAA,MAClC;AAEA,UAAIE,IAAmB;AACvB,aAAIH,MAAc,UAAaA,EAAU,SAAS,MAC3BG,IAAAH,EAAU,CAAC,EAAE,SAG7B,2BAA2B,IAAI,OAAOrI,EAAQ,MAAM,CAAC,MAAM,KAAK,OAAOwI,CAAgB,CAAC,IAAID,EAAS,KAAK,OAAO,CAAC;AAAA,IAAA;AAmDtH,IAAA9R,EAAA,wBAAiB,CAACgS,GAAeC,GAAeC,GAAmBC,MAAgC;AAGtG,YAAMC,IAAgBJ,EAAI,MAAA,EAAQ,SAAS,IAAIrQ,EAASuQ,CAAO,CAAC,GAC5DG,IAAgBJ,EAAI,QAAQ,SAAS,IAAItQ,EAASwQ,CAAO,CAAC;AAGhD,aAAAC,EAAA,KAAK,IAAIC,EAAc,IAAI,GAC3BD,EAAA,MAAM,IAAIC,EAAc,KAAK,GAEpCD;AAAA,IAAA;AAgCJ;AAAA,IAAApS,EAAA,iBAAU,MAAY;AACd,iBAAAyH,KAAKnH,EAAA,MAAKgR;AACjB,QAAA7J,EAAE,QAAQ;AAGP,aAAA;AAAA,IAAA;AAOJ,IAAAzH,EAAA,qBAAc,MAAkB;AACnC,YAAM,CAACsS,GAAQC,CAAM,IAAI,KAAK,QAOxBC,IAAgCF,EAAO,IAAI,CAACG,GAAKvO,MAAU,CAAC,GAAGuO,GAAKF,EAAOrO,CAAK,CAAC,CAAC;AAGxF,eAAS5F,IAAI,GAAGA,IAAIgU,EAAO,QAAQhU,KAAK;AAEpC,YAAIoU,IAAQF,EAAgBlU,CAAC,EAAEA,CAAC,EAAE;AAC9B,YAAAoU,EAAM,UAAU;AAGhB,gBAAMC,IAAaH,EACd,KAAK,CAACC,GAAKvO,MACDA,IAAQ5F,KAAK,CAACmU,EAAInU,CAAC,EAAE,QAC/B;AAEL,cAAIqU;AACgB,YAAAH,EAAAlU,CAAC,EAAE,QAAQ,CAACd,GAAO0G,MAAU1G,EAAM,IAAImV,EAAWzO,CAAK,CAAC,CAAC,GACzEwO,IAAQF,EAAgBlU,CAAC,EAAEA,CAAC,EAAE,MAAM;AAAA;AAE9B,kBAAA,IAAI,MAAM,eAAe;AAAA,QAIvC;AAIgB,QAAAkU,EAAAlU,CAAC,IAAIkU,EAAgBlU,CAAC,EAAE,IAAI,CAAKJ,MAAAA,EAAE,OAAOwU,CAAK,CAAC;AAGhE,iBAASpF,IAAI,GAAGA,IAAIgF,EAAO,QAAQhF,KAAK;AACpC,cAAIA,MAAMhP;AACN;AAGE,gBAAA0P,IAASwE,EAAgBlF,CAAC,EAAEhP,CAAC,EAAE,MAAA,EAAQ;AAC7C,mBAASkC,IAAI,GAAGA,IAAIgS,EAAgBlF,CAAC,EAAE,QAAQ9M;AAC3C,YAAAgS,EAAgBlF,CAAC,EAAE9M,CAAC,EAAE,IAAIgS,EAAgBlU,CAAC,EAAEkC,CAAC,EAAE,MAAA,EAAQ,SAASwN,CAAM,CAAC;AAO5E,cAAIwE,EAAgBlF,CAAC,EAAE,MAAM,GAAGkF,EAAgBlF,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,CAAApP,MAAKA,EAAE,OAAA,CAAQ;AAC5E,mBAAAsU,EAAgBlF,CAAC,EAAEkF,EAAgBlF,CAAC,EAAE,SAAS,CAAC,EAAE,WAC3C,CAAC,IAAI3L,IAAW,SAAU,CAAA,IAE1B;QAGnB;AAAA,MACJ;AAEA,aAAO6Q,EAAgB,IAAI,CAAAtU,MAAKA,EAAEA,EAAE,SAAS,CAAC,CAAC;AAAA,IAAA;AA4CnD,IAAA6B,EAAA,MAAAyR,IAAe,OACXtR,EAAA,MAAKqR,IAAajR,EAAA,MAAKgR,GAAW,OAAO,CAACsB,GAAetP,MAC9C,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAGsP,GAAK,GAAGtP,EAAI,SAAS,CAAC,CAAC,GAC/C,CAAE,CAAA,IAULhD,EAAA,MAAKiR,IAAW,QACT;AAGX,IAAAxR,EAAA,MAAA0R,IAAc,MAAkC;AAE5C,YAAMa,IAAuB,CAAA,GACvBC,IAAqB,CAAA;AAEhB,iBAAA9K,KAAKnH,EAAA,MAAKgR,IAAY;AAC7B,cAAMmB,IAAkB,CAAA,GAElBnP,IAAMmE,EAAE,MAAM,EAAE,QAAQ;AACnB,mBAAAC,KAAK,KAAK,WAAW;AAC5B,gBAAMtG,IAAIkC,EAAI,KAAK,cAAcoE,CAAC;AAC9B,UAAA+K,EAAA,KAAKrR,EAAE,WAAW;AAAA,QAC1B;AAGA,QAAAmR,EAAO,KAAKjP,EAAI,MAAM,OAAO,CAAC,EAAE,WAAW,GAG3CgP,EAAO,KAAKG,CAAG;AAAA,MACnB;AAEO,aAAA,CAACH,GAAQC,CAAM;AAAA,IAAA;AAhXtB,WAAArS,EAAA,MAAKoR,GAAa,KAClBpR,EAAA,MAAKqR,IAAa,KAEdxT,EAAO,SAAS,KACX,KAAA,MAAM,GAAGA,CAAM,GAGjB;AAAA,EACX;AAAA,EAgBA,OAAc,WACVuU,GACA/I,IAAU,OAAqB;AAEzB,UAAAsJ,IAAOP,EAAO,CAAC,EAAE;AACvB,QAAIA,EAAO,KAAK,CAAAG,MAAOA,EAAI,WAAWI,CAAI;AAChC,YAAA,IAAI,MAAM,+CAA+C;AAI7D,UAAAC,IAAOvJ,EAAQ,MAAM,EAAE,EACxB,OAAO,GAAGsJ,IAAO,CAAC;AAGvB,WAAO,IAAInB;AAAA,MACP,GAAGY,EAAO,IAAI,CAAOG,MAAA;AACX,cAAAlN,IAAI,IAAI2J,EAAQ4D,EAAK,KAAK,EAAE,GAAG,GAAGL,CAAG;AACpC,eAAA,IAAIlC,EAAShL,GAAG,CAAC;AAAA,MAAA,CAC3B;AAAA,IAAA;AAAA,EAGT;AAAA,EAEO,IAAI/H,GAAsD0G,GAAsB;AACnF,QAAI1G,aAAiBkU,IAAc;AACzB,YAAA9C,IAASpR,EAAM,UAAU;AAC3B,UAAAoR,MAAWtO,EAAA,MAAKgR,GAAW;AACrB,cAAA,IAAI,MAAM,0CAA0C;AAG9D,eAAShT,IAAI,GAAGA,IAAIsQ,GAAQtQ;AACxB,QAAAgC,EAAA,MAAKgR,GAAWhT,CAAC,EAAE,IAAId,EAAM,UAAUc,CAAC,CAAC;AAAA,IAC7C,OACG;AACH,UAAI4F,MAAU,UAAaA,IAAQ,KAAKA,KAAS5D,EAAA,MAAKgR,GAAW;AACvD,cAAA,IAAI,MAAM,oBAAoB;AAElC,YAAAhO,IAAM,IAAIiN,EAAS/S,CAAK;AAC9B,MAAA8C,EAAA,MAAKgR,GAAWpN,CAAK,EAAE,IAAIZ,CAAG;AAAA,IAClC;AAEO,WAAA;AAAA,EACX;AAAA,EAyDO,OAAO6E,GAA2B;AAC9B,WAAAxG,EAAS,IAAI,GAAGrB,EAAA,MAAKgR,GAAW,IAAI,CAAAhO,MAAOA,EAAI,OAAO6E,CAAM,CAAC,CAAC;AAAA,EACzE;AAAA,EAEA,IAAI,UAAU;AAEV,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA;AAAA,EAGA,IAAW,YAAwB;AAC/B,WAAO7H,EAAA,MAAKgR;AAAA,EAChB;AAAA,EAEA,IAAW,UAAU9T,GAAO;AACxB,IAAA0C,EAAA,MAAKoR,GAAa9T;AAAA,EACtB;AAAA,EAEO,SAASO,GAA+DsK,GAAwC;AAC7G,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEO,YAAYF,GAAyB;AACjC,WAAA7H,EAAA,MAAKiR,IAAW,SAASpJ,CAAM;AAAA,EAC1C;AAAA,EAEO,QAAQ3K,GAA8B;AACzC,WAAO,KAAK,UAAU,MAAM,CAAC8F,GAAKY,MAAUZ,EAAI,QAAQ9F,EAAM,UAAU0G,CAAK,CAAC,CAAC;AAAA,EACnF;AAAA,EAEA,IAAW,aAAsB;AAI7B,WAHU,KAAK,UAGT,WAAW5D,EAAA,MAAKgR,GAAW;AAAA,EAOrC;AAAA,EAEA,IAAW,SAAqC;AAE5C,WAAOhR,EAAA,MAAKmR,IAAL;AAAA,EACX;AAAA,EAeO,SAASjU,GAAsD0G,GAAsB;AAIpF,QAAA,MAAM,QAAQ1G,CAAK,GAAG;AACtB,UAAIA,EAAM,WAAW8C,EAAA,MAAKgR,GAAW;AAC3B,cAAA,IAAI,MAAM,kEAAkE;AAGtF,eAAS,IAAI,GAAG,IAAI9T,EAAM,QAAQ;AAC9B,QAAA8C,EAAA,MAAKgR,GAAW,CAAC,EAAE,SAAS9T,EAAM,CAAC,CAAC;AAEjC,aAAA;AAAA,IACX;AAEA,QAAI0G,MAAU,UAAaA,IAAQ,KAAKA,KAAS5D,EAAA,MAAKgR,GAAW;AACvD,YAAA,IAAI,MAAM,oBAAoB;AAGxC,WAAAhR,EAAA,MAAKgR,GAAWpN,CAAK,EAAE,SAAS1G,CAAK,GAE9B;AAAA,EACX;AAAA,EAEO,SAAuB;AACpB,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAWA,QAAqB;AACjB,WAAO;EACX;AAAA,EAkEO,SAASA,GAAsD0G,GAAsB;AACxF,QAAI1G,aAAiBkU,IAAc;AACzB,YAAA9C,IAASpR,EAAM,UAAU;AAC3B,UAAAoR,MAAWtO,EAAA,MAAKgR,GAAW;AACrB,cAAA,IAAI,MAAM,0CAA0C;AAG9D,eAAShT,IAAI,GAAGA,IAAIsQ,GAAQtQ;AACxB,QAAAgC,EAAA,MAAKgR,GAAWhT,CAAC,EAAE,SAASd,EAAM,UAAUc,CAAC,CAAC;AAAA,IAClD,OACG;AACH,UAAI4F,MAAU,UAAaA,IAAQ,KAAKA,KAAS5D,EAAA,MAAKgR,GAAW;AACvD,cAAA,IAAI,MAAM,oBAAoB;AAElC,YAAAhO,IAAM,IAAIiN,EAAS/S,CAAK;AAC9B,MAAA8C,EAAA,MAAKgR,GAAWpN,CAAK,EAAE,SAASZ,CAAG;AAAA,IACvC;AAEO,WAAA;AAAA,EACX;AAAA,EAEA,IAAW,MAAc;AAKrB,UAAMyP,IAAK,KAAK,MAAM,EAAE,QAAQ;AAEzB,WAAA,KAAK,SAASA,EAAG,SAAS;AAAA,EACrC;AAAA,EAEA,IAAW,YAAsB;AAC7B,WAAOzS,EAAA,MAAKiR;AAAA,EAChB;AAAA,EAEA,IAAW,UAAU/T,GAA0B;AACrC,UAAAsV,IAAQ,OAAOtV,KAAU,WAAYA,EAAM,MAAM,EAAE,IAAI,CAAC,GAAGA,CAAK;AACtE,IAAAsV,EAAK,KAAK,GACV5S,EAAA,MAAKqR,IAAauB;AAAA,EACtB;AA2CJ;AAzXIxB,IAAA,eAGAC,KAAA,eA6UAC,KAAA,eAiBAC,KAAA;AArWG,IAAMuB,KAANtB;AVLP,IAAAuB,IAAAC,IAAAC;AWQO,MAAMC,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpB,YAAY5V,GAAgB;AAPzB,IAAAuC,EAAA,MAAAmT;AACH,IAAAnT,EAAA,MAAAkT;AAgBA,IAAAjT,EAAA,eAAQ,CAACxC,OAEA0C,EAAA,MAAA+S,IAAO,IAAIjK,GAAYqK,GAAgB,GAAG,EAC1C,MAAM7V,CAAK,EACX,MAEE;AAfP,WAAA0C,EAAA,MAAK+S,IAAO,KAERzV,MAAU,UACV,KAAK,MAAMA,CAAK,GAGb;AAAA,EACX;AAAA,EAWA,SAASO,GAA0C;AAE1C,SAAA,UAAU,QAAQ,CAAO6K,MAAA;AAC1B,MAAK,OAAO,OAAO7K,GAAQ6K,CAAG,MAC1B7K,EAAO6K,CAAG,IAAI;AAAA,IAClB,CACH;AAED,UAAMK,IAAmB,CAAA;AACd,eAAAqK,KAAShT,EAAA,MAAK2S;AAEjB,UADJ,QAAQ,IAAIK,CAAK,GACbA,EAAM,cAAc;AACpB,QAAArK,EAAM,KAAKlL,EAAOuV,EAAM,KAAK,CAAC;AAAA,eACvBA,EAAM,cAAc;AACvB,YAAAA,EAAM,UAAU;AAEZ,cAAArK,EAAM,UAAU,GAAG;AACb,kBAAA1K,IAAI0K,EAAM;AACV,YAAAA,EAAA,KAAK,CAAC1K,CAAC;AAAA,UAAA;AAEN,mBAAA;AAAA,aAER;AAEG,gBAAAA,IAAI0K,EAAM,OACVzK,IAAIyK,EAAM;AACZ,cAAA1K,MAAM,UAAaC,MAAM;AACzB,oBAAQ8U,EAAM,OAAO;AAAA,cACjB,KAAK;AACK,gBAAArK,EAAA,KAAK1K,KAAKC,CAAC;AACjB;AAAA,cACJ,KAAK;AACK,gBAAAyK,EAAA,KAAK1K,KAAKC,CAAC;AACjB;AAAA,cACJ,KAAK;AACM,uBAAA;AAAA,YACf;AAAA;AAGO,mBAAA;AAAA,QAEf;AAIR,WAAOyK,EAAM,WAAW,KAAKA,EAAM,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,MAA8C;AAC9C,WAAO3I,EAAA,MAAK2S;AAAA,EAChB;AAAA,EAEA,IAAI,MAAc;AACd,UAAMM,IAAmD,CAAA;AAE9C,eAAAD,KAAShT,EAAA,MAAK2S;AACjB,UAAAK,EAAM,cAAc;AACpB,QAAAC,EAAS,KAAKD,CAAK;AAAA;AAEnB,gBAAQA,EAAM,OAAO;AAAA,UACjB,KAAK;AACG,gBAAAC,EAAS,UAAU,GAAG;AACtB,oBAAMC,IAASD,EAAS,IAAA,GACpBE,IAAQF,EAAS;AAErB,cAAIC,KAAUC,MACNA,EAAM,cAAc,UACdA,EAAA,QAAQ,KAAKA,EAAM,KAAK,OAE9BD,EAAO,cAAc,UACdA,EAAA,QAAQ,KAAKA,EAAO,KAAK,OAEpCD,EAAS,KAAK,EAAC,OAAO,GAAGE,EAAM,KAAK,UAAUD,EAAO,KAAK,IAAI,WAAW,MAAM,CAAA;AAAA,YAEvF;AACA;AAAA,UACJ,KAAK;AACG,gBAAAD,EAAS,UAAU,GAAG;AACtB,oBAAMC,IAASD,EAAS,IAAA,GACpBE,IAAQF,EAAS;AAErB,cAAIC,KAAUC,MACNA,EAAM,cAAc,UACdA,EAAA,QAAQ,KAAKA,EAAM,KAAK,OAE9BD,EAAO,cAAc,UACdA,EAAA,QAAQ,KAAKA,EAAO,KAAK,OAEpCD,EAAS,KAAK,EAAC,OAAO,GAAGE,EAAM,KAAK,UAAUD,EAAO,KAAK,IAAI,WAAW,MAAM,CAAA;AAAA,YAEvF;AACA;AAAA,UACJ,KAAK;AACG,gBAAAD,EAAS,UAAU,GAAG;AACtB,oBAAMC,IAASD,EAAS,IAAA,GACpBE,IAAQF,EAAS;AAErB,cAAIC,KAAUC,MACNA,EAAM,cAAc,UACdA,EAAA,QAAQ,KAAKA,EAAM,KAAK,OAE9BD,EAAO,cAAc,UACdA,EAAA,QAAQ,KAAKA,EAAO,KAAK,OAEpCD,EAAS,KAAK,EAAC,OAAO,GAAGE,EAAM,KAAK,eAAeD,EAAO,KAAK,IAAI,WAAW,MAAM,CAAA;AAAA,YAE5F;AACA;AAAA,UACJ,KAAK;AACG,gBAAAD,EAAS,UAAU,GAAG;AAChB,oBAAAE,IAAQF,EAAS;AAEvB,cAAIE,KACSF,EAAA,KAAK,EAAC,OAAO,eAAeE,EAAM,KAAK,MAAM,WAAW,WAAW,CAAA;AAAA,YAEpF;AACA;AAAA,QACR;AAID,WAAAF,EAAS,CAAC,EAAE;AAAA,EACvB;AAAA,EAEA,IAAI,YAAsB;AACf,WAAAjT,EAAA,MAAK2S,IACP,OAAO,CAASzV,MAAAA,EAAM,cAAc,UAAU,EAC9C,IAAI,CAASA,MAAAA,EAAM,KAAK;AAAA,EACjC;AAAA,EAEA,SAAmB;AACf,WAAOgG,EAAA,MAAK0P,IAAAC,IAAL,WAAqB;AAAA,MACpB,GAAG,CAAC,KAAK,IAAI;AAAA,MACb,GAAG,CAAC,KAAK,IAAI;AAAA,IACjB,GACA,CAAC,KAAK,KAAK,MAAM,GAAG;AAAA,EAE5B;AAAA,EAEA,UAAoB;AAChB,WAAO3P,EAAA,MAAK0P,IAAAC,IAAL,WAAqB;AAAA,MACpB,GAAG,CAAC,KAAK,MAAM,MAAM,KAAK;AAAA,MAC1B,GAAG,CAAC,KAAK,MAAM,MAAM,KAAK;AAAA,MAC1B,GAAG,CAAC,KAAK,MAAM,MAAM,KAAK;AAAA,IAC9B,GACA,CAAC,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,OAAO,GAAG;AAAA,EAEpD;AAyEJ;AArPIF,KAAA,eADGC,KAAA,eA+KHC,KAAA,SAAgBO,GAAiDC,GAAgC;AAC7F,QAAMJ,IAA4B,CAAA;AAE9B,MAAAK;AACJ,MAAID,MAAc,QAAW;AACzB,IAAAC,wBAAmB;AACnB,eAAWhL,KAAO8K;AACd,MAAAE,wBAAmB,IAAI;AAAA,QACnB,GAAGA;AAAA,QACH,GAAIF,EAAU9K,CAAG,KAAK,CAAC;AAAA,MAAA,CAC1B;AAAA,EACL;AAEe,IAAAgL,IAAA,IAAI,IAAID,CAAS;AAGzB,aAAAL,KAAShT,EAAA,MAAK2S;AACjB,QAAAK,EAAM,cAAc;AAEpB,MAAII,EAAUJ,EAAM,KAAK,MAAM,SAClBC,EAAA,KAAS,oBAAA,IAAA,CAAK,IAEvBA,EAAS,KAAK,IAAI,IAAIG,EAAUJ,EAAM,KAAK,CAAC,CAAC;AAAA;AAIjD,cAAQA,EAAM,OAAO;AAAA,QACjB,KAAK;AACG,cAAAC,EAAS,UAAU,GAAG;AACtB,kBAAMC,IAASD,EAAS,IAAA,GACpBE,IAAQF,EAAS;AAErB,YAAIE,KAASD,KACTD,EAAS,KAAK,IAAI,IAAI,CAAC,GAAGE,CAAK,EAAE,OAAO,CAAAvV,MAAKsV,EAAO,IAAItV,CAAC,CAAC,CAAC,CAAC;AAAA,UAEpE;AACA;AAAA,QACJ,KAAK;AACG,cAAAqV,EAAS,UAAU,GAAG;AACtB,kBAAMC,IAASD,EAAS,IAAA,GACpBE,IAAQF,EAAS;AACrB,YAAIE,KAASD,KACAD,EAAA,yBAAS,IAAI,CAAC,GAAGE,GAAO,GAAGD,CAAM,CAAC,CAAC;AAAA,UAEpD;AACA;AAAA,QACJ,KAAK;AACG,cAAAD,EAAS,UAAU,GAAG;AACtB,kBAAMC,IAASD,EAAS,IAAA,GACpBE,IAAQF,EAAS;AAErB,YAAIE,KAASD,KACTD,EAAS,KAAK,IAAI,IAAI,CAAC,GAAGE,CAAK,EAAE,OAAO,CAAAvV,MAAK,CAACsV,EAAO,IAAItV,CAAC,CAAC,CAAC,CAAC;AAAA,UAErE;AACA;AAAA,QACJ,KAAK;AACG,cAAAqV,EAAS,UAAU,GAAG;AAChB,kBAAAE,IAAQF,EAAS;AAEvB,YAAIE,KACAF,EAAS,KAAK,IAAI,IAAI,CAAC,GAAGK,CAAY,EAAE,OAAO,CAAA1V,MAAK,CAACuV,EAAM,IAAIvV,CAAC,CAAC,CAAC,CAAC;AAAA,UAE3E;AACA;AAAA,MACR;AAIR,SAAO,CAAC,GAAGqV,EAAS,CAAC,CAAC,EAAE,KAAK;AACjC;AX7PJ,IAAA/C,IAAAhG,GAAAqJ,IAAAC,IAAAC,IAAAC,IAAAC;AYiBO,MAAMC,IAAN,MAAMA,EAEY;AAAA,EAKrB,eAAenW,GAAiC;AAP7C,IAAAgC,EAAA,MAAAiU;AAIH,IAAAjU,EAAA,MAAAyQ,IAA+BY,GAAe;AAC9C,IAAArR,EAAA,MAAAyK,GAAqB,CAAA;AAGZ,gBAAA,MAAM,GAAGzM,CAAM,GACb;AAAA,EACX;AAAA,EAEO,SAASA,GAAuC;AAK/C,WAHJmC,EAAA,MAAKsK,GAAW,KAGZzM,EAAO,WAAW,IACX,QAGXA,EAAO,QAAQ,CAASP,MAAA;AACpB,MAAIA,aAAiB0W,IACZ5T,EAAA,MAAAkK,GAAS,KAAK,GAAGhN,EAAM,QAAQ,IAAI,CAAKiD,MAAAA,EAAE,MAAM,CAAC,CAAC,IAEvDH,EAAA,MAAKkK,GAAS,KAAK,IAAI2G,GAAO3T,CAAK,CAAC;AAAA,IACxC,CACH,GAEM;AAAA,EACX;AAAA,EAEO,QAAoB;AAChB,WAAA,IAAI0W,EAAW,GAAG5T,EAAA,MAAKkK,GAAS,IAAI,CAAK/J,MAAAA,EAAE,MAAO,CAAA,CAAC;AAAA,EAC9D;AAAA,EAEA,IAAW,MAAc;AACrB,UAAM,EAAC,KAAAsQ,GAAK,KAAAC,EAAG,IAAIxN,EAAA,MAAKwQ,IAAAC,IAAL;AAEf,QAAAjD,EAAI,WAAW;AACX,aAAAD,EAAI,WAAW,IACRA,EAAI,CAAC,EAAE,SAAS,MAGpBA,EAAI,IAAI,CAAAtQ,MAAKA,EAAE,GAAG,EAAE,KAAK,EAAE;AAItC,UAAM0T,IAASpD,EAAI,WAAW,IAAIA,EAAI,CAAC,EAAE,SAAS,MAAMA,EAAI,IAAI,CAAKtQ,MAAAA,EAAE,GAAG,EAAE,KAAK,EAAE,GAC7E2T,IAASpD,EAAI,WAAW,IAAIA,EAAI,CAAC,EAAE,SAAS,MAAMA,EAAI,IAAI,CAAKvQ,MAAAA,EAAE,GAAG,EAAE,KAAK,EAAE;AAE5E,WAAA,WAAW0T,CAAM,OAAOC,CAAM;AAAA,EAEzC;AAAA,EAEA,IAAW,UAAkB;AACzB,UAAM,EAAC,KAAArD,GAAK,KAAAC,EAAG,IAAIxN,EAAA,MAAKwQ,IAAAC,IAAL;AAEf,QAAAjD,EAAI,WAAW;AACX,aAAAD,EAAI,WAAW,IACRA,EAAI,CAAC,EAAE,SAAS,UAGpBA,EAAI;AAAA,QAAI,CAACtQ,GAAGyD,MACfA,MAAU,KAAKzD,EAAE,QAAQ,OAAO,WAAW,IAAIA,EAAE,SAAS,UAAUA,EAAE;AAAA,MAAA,EACxE,KAAK,EAAE;AAIb,UAAM0T,IAASpD,EAAI,WAAW,IAAIA,EAAI,CAAC,EAAE,SAAS,UAAUA,EAAI,IAAI,CAAKtQ,MAAAA,EAAE,OAAO,EAAE,KAAK,EAAE,GACrF2T,IAASpD,EAAI,WAAW,IAAIA,EAAI,CAAC,EAAE,SAAS,UAAUA,EAAI,IAAI,CAAKvQ,MAAAA,EAAE,OAAO,EAAE,KAAK,EAAE;AAEpF,WAAA,IAAI0T,CAAM,MAAMC,CAAM;AAAA,EAEjC;AAAA,EA4CA,OAAc,OAAOrW,GAAkC;AZvI3D,QAAAqL;AYwIY,QAAArL,EAAO,WAAW;AACX,aAAA,IAAImW,IAAa;AAExB,QAAAnW,EAAO,WAAW;AAClB,aAAOA,EAAO,CAAC;AAEf,QAAAA,EAAO,WAAW;AAClB,aAAOyF,EAAA4F,IAAA8K,GAAWL,IAAAC,IAAX,KAAA1K,GAAoBrL,EAAO,CAAC,GAAGA,EAAO,CAAC;AAI9C,QAAAsW,IAAKtW,EAAO,CAAC;AACjB,WAAAA,EAAO,MAAM,GACbA,EAAO,QAAQ,CAASP;AZrJhC,UAAA4L;AYqJgC,aAAAiL,IAAK7Q,EAAA4F,IAAA8K,GAAWL,IAAAC,IAAX,KAAA1K,GAAoBiL,GAAI7W;AAAA,KAAM,GAEpD6W;AAAA,EACX;AAAA,EAEA,OAAc,OAAOtW,GAAkC;AAC/C,QAAAA,EAAO,WAAW;AACX,aAAA,IAAImW,IAAa;AAExB,QAAAnW,EAAO,WAAW;AAClB,aAAOA,EAAO,CAAC;AAGf,QAAAsW,IAAKtW,EAAO,CAAC;AACjB,WAAAA,EAAO,MAAM,GACbA,EAAO,QAAQ,CAASP;AZpKhC,UAAA4L;AYoKgC,aAAAiL,IAAK7Q,EAAA4F,IAAA8K,GAAWL,IAAAE,IAAX,KAAA3K,GAAoBiL,GAAI7W;AAAA,KAAM,GACpD6W;AAAA,EACX;AAAA,EAEO,OAAOtW,GAA4B;AAKhC,UAAAiP,IAA2B,CAAC,KAAK,WAAW,GAAGjP,EAAO,IAAI,CAAAG,MAAKA,EAAE,SAAS,CAAC,GAC3E6O,IAA6B,CAAC,KAAK,aAAa,GAAGhP,EAAO,IAAI,CAAAG,MAAKA,EAAE,WAAW,CAAC;AAEnF,QAAA2N;AACJ,QAAIkB,EAAa,KAAK,CAAA7H,MAAKA,EAAE,QAAQ,SAAS,CAAC,GAAG;AAE9C,YAAMR,IAAMwP,EAAW,IAAI,GAAGnH,CAAY;AAG/B,MAAAC,EAAA,QAAQ,CAACnM,GAAGqD,MAAU;AAC3B,QAAArD,EAAA,SAAS6D,EAAI,MAAM,EAAE,OAAOqI,EAAa7I,CAAK,CAAC,CAAC;AAAA,MAAA,CACrD,GAGa2H,IAAAnH;AAAA,IAClB;AAGA,UAAMwB,IAAMgO,EAAW,IAAI,GAAGlH,CAAU,GAClCsH,IAAmB,IAAIpF,EAAQ,CAAC,EACjC;AAAA,MAAI,GAAGlC,EAAW,IAAI,CAAMuH,MACdA,EACF,OAAOrO,CAAG,EAAE,OAAA,EACZ,QAAQ,EACR,QAAQ,CAAC,EACT,OACR;AAAA,MACH,OAAO;AAEb,WAAAhG,EAAA,MAAKsK,GAAW;AAAA,MACZ,GAAGtE,EAAI;AAAA,MACP,IAAIiL,GAAOmD,CAAgB;AAAA,IAAA,IAG3BzI,KACA,KAAK,OAAOA,CAAW,GAItB3L,EAAA,MAAAsK,GAAWlK,EAAA,MAAKkK,GAAS,OAAO,OAAK,CAACtM,EAAE,MAAM,OAAQ,CAAA,IAEpD;AAAA,EACX;AAAA,EAEA,IAAI,UAAgB;AAChB,WAAAgC,EAAA,MAAKsQ,IAAeY,GAAe,QAC5B;AAAA,EACX;AAAA,EAEA,IAAI,SAAe;AACf,WAAAlR,EAAA,MAAKsQ,IAAeY,GAAe,OAC5B;AAAA,EACX;AAAA,EAEO,OAAOjJ,GAA2B;AACrC,WAAO7H,EAAA,MAAKkK,GAAS,OAAO,CAACoI,GAAKnS,MAAMmS,EAAI,IAAInS,EAAE,OAAO0H,CAAM,CAAC,GAAG,IAAIxG,EAAS,GAAG,CAAC;AAAA,EACxF;AAAA,EAEA,IAAI,cAA0B;AAC1B,WAAO,IAAIuS;AAAA,MAAW,GAAG5T,EAAA,MAAKkK,GACzB,OAAO,CAAA/J,MAAKA,EAAE,MAAM,WAAY,CAAA,EAChC,IAAI,CAAKA,MAAAA,EAAE,MAAM,EAAE,SAAS;AAAA,IAAA;AAAA,EAErC;AAAA,EAEO,aAAmB;AAGtB,UAAM+T,IAAoB,CAAA,GAEpB5F,IAAStO,EAAA,MAAKkK,GAAS;AAE7B,aAASlM,IAAI,GAAGA,IAAIsQ,GAAQtQ,KAAK;AAEvB,YAAAgO,IAAUhM,EAAA,MAAKkK,GAAS,MAAM,GAE9BiK,IAAmBnI,EAAQ,OAAOhO,GAAG,CAAC,EAAE,CAAC,EAAE;AAE7C,MAAAkW,EAAA;AAAA,QACA,IAAIN,EAAW,GAAG5H,GAAS,GAAGmI,CAAgB;AAAA,MAAA;AAAA,IACtD;AAGA,IAAAD,EAAI,QAAQ,CAAAD,MAAMA,EAAG,OAAQ,CAAA;AAEvB,UAAAd,IAAQe,EAAI;AAClB,WAAIf,MAAU,UACVvT,EAAA,MAAKsK,GAAWiJ,EAAM,UAInB,KAAK,IAAI,GAAGe,CAAG;AAAA,EAC1B;AAAA,EAEO,UAAsB;AAEnB,UAAAjU,IAAI,IAAI2O,EAAQ,GAAG,GACnB7Q,IAAI,IAAI6Q,EAAQ,GAAG;AAEpB,gBAAA,UAAU,QAAQ,QAAQ,CAAKzO,MAAA;AAC9B,MAAAF,EAAA,SAASE,EAAE,QAAS,CAAA;AAAA,IAAA,CACzB,GACI,KAAA,YAAY,QAAQ,QAAQ,CAAKA,MAAA;AAChC,MAAApC,EAAA,SAASoC,EAAE,QAAS,CAAA;AAAA,IAAA,CACzB,GAEM,IAAIyT,EAAa,EAAA,YAAY3T,GAAGlC,CAAC;AAAA,EAC5C;AAAA,EAEO,OAAOb,GAAyB;AACnC,WAAA0C,EAAA,MAAKsK,GAAWlK,EAAA,MAAKkK,GAAS,OAAOhN,EAAM,MAAA,EAAQ,QAAQ,IAAI,CAAAiD,MAAKA,EAAE,QAAA,CAAS,CAAC,IACzE;AAAA,EACX;AAAA,EAEO,SAAS1C,GAA+DsK,GAAwC;AACnH,WAAIA,IACO/H,EAAA,MAAKkK,GACP,OAAO,CAACoI,GAAKnS,MAAMmS,IAAOnS,EAAE,SAAS1C,GAAQsK,CAAS,GAAc,CAAC,IAGvE/H,EAAA,MAAKkK,GACP,OAAO,CAACoI,GAAKnS,MAAMmS,EAAI,SAASnS,EAAE,SAAS1C,CAAM,CAAC,GAAG,IAAI4D,EAAS,GAAG,CAAC;AAAA,EAC/E;AAAA,EAEO,UAAUwG,GAA6B;AAG1C,UAAMuM,IAAuB,CAAA;AAExB,IAAApU,EAAA,MAAAkK,GAAS,QAAQ,CAAUwD,MAAA;AAC5B,YAAM1B,IAAU0B,EAAO,QAAQ,UAAU7F,CAAM;AAC3C,UAAAmE,EAAQ,SAAS,GAAG;AACd,cAAAzD,IAAMmF,EAAO,MAAM,MAAM;AACpB,QAAA0G,EAAA,KAAK,GAAGpI,EAAQ,IAAI,CAAApO,MAAK,IAAIiT,GAAOjT,GAAG2K,CAAG,CAAC,CAAC;AAAA,MAAA;AAE5C,QAAA6L,EAAA,KAAK1G,EAAO,MAAO,CAAA;AAAA,IAClC,CACH;AAED,UAAM/M,IAAS,IAAIiT,EAAW,GAAGQ,CAAU,GACrC9I,IAAY3K,EAAO,UAAU,OAAO,GACpC4K,IAAc5K,EAAO,YAAY,OAAO;AAEvC,WAAA2K,EAAU,OAAOC,CAAW;AAAA,EACvC;AAAA,EAEA,IAAW,UAAoB;AAC3B,WAAOvL,EAAA,MAAKkK;AAAA,EAChB;AAAA,EAEA,IAAW,QAAQhN,GAAiB;AAChC,IAAA0C,EAAA,MAAKsK,GAAWhN;AAAA,EACpB;AAAA,EAEO,YAAYoO,GAAkCC,GAA2C;AAI5F,QAFK3L,EAAA,MAAAsK,GAAW,CAAC,IAAI2G,GAAO,IAAIjC,EAAQtD,CAAS,CAAC,CAAC,IAE/CC,GAAa;AACP,YAAAiF,IAAU,IAAI5B,EAAQrD,CAAW;AAEnC,UAAAiF,EAAQ;AACD,eAAA;AAEP,UAAAA,EAAQ;AACF,cAAA,IAAI,MAAM,uBAAuB;AAE3C,MAAAxQ,EAAA,MAAKkK,GAAS,KAAK,IAAI2G,GAAOL,GAAS,EAAE,CAAC;AAAA,IAC9C;AAYO,WAAA;AAAA,EACX;AAAA,EAEO,YAAyB;AAE5B,UAAMjC,IAAsB,CACvB,EAAA,OAAO,GAAGvO,EAAA,MAAKkK,GAAS,IAAI,CAAKtM,MAAAA,EAAE,QAAQ,UAAA,CAAW,CAAC;AAI5D,WAAA2Q,EAAM,KAAK,CAACtQ,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK,GAE/BqQ,EACF;AAAA,MAAO,CAACrR,GAAO0G,GAAOyQ,MACfzQ,MAAUyQ,EAAK;AAAA,QAAU,CAAC7N,MACtBA,EAAE,UAAUtJ,EAAM;AAAA,MACtB;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEO,YAAY2K,GAAyB;AACxC,WAAO7H,EAAA,MAAKkK,GAAS,KAAK,OAAK/J,EAAE,YAAY0H,CAAM,CAAC;AAAA,EACxD;AAAA,EAEO,UAAgB;AACnB,WAAAjI,EAAA,MAAKsK,GAAWlK,EAAA,MAAKkK,GAAS,IAAI,CAAK/J,MAAAA,EAAE,SAAS,IAC3C;AAAA,EACX;AAAA,EAEO,QAAQjD,GAA4B;AACvC,UAAM0I,IAAMgO,EAAW,IAAI,MAAM1W,CAAK,GAEhCoX,IAAM,KAAK,MAAA,EAAQ,OAAO1O,CAAG,EAAE,UAC/B2O,IAAMrX,EAAM,MAAA,EAAQ,OAAO0I,CAAG,EAAE;AAEtC,WAAO0O,EAAI,MAAA,KAAWC,EAAI,MAAM;AAAA,EACpC;AAAA,EAEO,QAAiB;AACpB,WAAOvU,EAAA,MAAKkK,GAAS,MAAM,CAAK/J,MAAAA,EAAE,OAAO;AAAA,EAC7C;AAAA,EAEO,SAAkB;AACrB,WAAOH,EAAA,MAAKkK,GAAS,MAAM,CAAK/J,MAAAA,EAAE,QAAQ;AAAA,EAC9C;AAAA,EAEO,YAAY1C,GAA4B;AAC3C,WAAAA,EAAO,QAAQ,CAASP,MAAA;AACpB,MAAA0C,EAAA,MAAKsK,GAAWlK,EAAA,MAAKkK,GAAS,OAAOhN,EAAM,QAAQ,OAAO;AAAA,IAAA,CAC7D,GAEM;AAAA,EACX;AAAA,EAEA,IAAI,YAAwB;AACjB,WAAA,IAAI0W,EAAW,GAAG5T,EAAA,MAAKkK,GAAS,OAAO,CAAA/J,MAAKA,EAAE,MAAM,WAAW,CAAC,CAAC;AAAA,EAC5E;AAAA,EAEO,MAAY;AACf,WAAAP,EAAA,MAAKsK,GAAW,CAAC,IAAI2G,GAAO,KAAK,GAAG,CAAC,IAC9B;AAAA,EACX;AAAA,EAEO,WAAiB;AAEpB,UAAMjN,IAAQ5D,EAAA,MAAKkK,GAAS,UAAU,CAAK/J,MAAAA,EAAE,YAAY,MAAM;AAE/D,WAAIyD,KAAS,IACJ5D,EAAA,MAAAkK,GAAS,OAAOtG,GAAO,CAAC,IAE7B5D,EAAA,MAAKkK,GAAS,KAAK,IAAI2G,GAAO,MAAM,GAAG,CAAC,GAGrC;AAAA,EACX;AAAA,EAEO,IAAI3T,GAAgC;AAClC,WAAA0C,EAAA,MAAAsK,GAAWlK,EAAA,MAAKkK,GAAS,IAAI,OAAK/J,EAAE,IAAIjD,CAAK,CAAC,IAC5C;AAAA,EACX;AAAA,EAEO,YAAwB;AACrB,UAAA,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEO,SAAe;AAEZ,UAAA8O,IAAUwI,GAAW,IAAI;AAG/B,WAAA5U,EAAA,MAAKsK,GAAW,OAAO,OAAO8B,CAAO,EAChC,IAAI,CAAK7L,MAAA;AACA,YAAAwQ,IAAOxQ,EAAE,CAAC,EAAE,SACZoQ,IAAQpQ,EAAE,OAAO,CAACmS,GAAKnS,MAAMmS,EAAI,IAAInS,EAAE,KAAK,GAAG,IAAIkB,EAAS,GAAG,CAAC;AACtE,aAAO,IAAIwP,GAAOF,GAAMJ,EAAM,OAAQ,CAAA;AAAA,IAAA,CACzC,EACA,OAAO,CAAApQ,MAAK,CAACA,EAAE,MAAM,QAAQ,IAE3B;AAAA,EACX;AAAA,EAEO,KAAKjD,GAAqB;AACxB,WAAA0C,EAAA,MAAAsK,GAAWlK,EAAA,MAAKkK,GAAS,IAAI,OAAK/J,EAAE,KAAKjD,CAAK,CAAC,IAC7C;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAK2K,GAAuB;AAC/B,WAAA7H,EAAA,MAAKkK,GAAS,KAAK,CAACjM,GAAGC,MAAM;AAEnB,YAAAuW,IAASxW,EAAE,MAAM,OACjByW,IAASxW,EAAE,MAAM;AACnB,UAAAuW,IAASC,IAAS;AAClB,eAAO,CAACD;AAKN,YAAAE,IAAU1W,EAAE,QAAQ,OAAO,QAC3B2W,IAAU1W,EAAE,QAAQ,OAAO;AACjC,UAAIyW,MAAYC;AACZ,eAAOD,IAAUC;AAIrB,YAAMC,IAAU5W,EAAE,QAAQ,OAAO4J,CAAM,EAAE,OACnCiN,IAAU5W,EAAE,QAAQ,OAAO2J,CAAM,EAAE;AACzC,aAAIgN,MAAYC,IACLD,IAAUC,IAIjBL,MAAWC,IACJD,IAASC,IAGbzW,EAAE,OAAS,EAAA,MAAMC,EAAE,QAAQ,IAAI,KAAK;AAAA,IAAA,CAC9C,GAEM;AAAA,EACX;AAAA,EAEO,OAAa;AAChB,WAAA0B,EAAA,MAAKsK,GAAWlK,EAAA,MAAKkK,GAAS,IAAI,CAAK/J,MAAAA,EAAE,MAAM,IACxC;AAAA,EACX;AAAA,EAEO,YAAY1C,GAA4B;AACpC,WAAA,KAAK,IAAI,GAAGA,EAAO,IAAI,CAAK0C,MAAAA,EAAE,SAAU,CAAA,CAAC;AAAA,EACpD;AAAA,EAEO,eAA0C;AAEvC,UAAAoO,IAAQ,KAAK,aACbwG,IAAYxG,EAAM,IAAI,CAAA3Q,MAAKA,EAAE,KAAK,GAIlCoO,IAAmC,KAAK,QACzC,IAAI,CAAU0B,OACJ,EAAC,QAAQ,IAAImD,GAAOnD,CAAM,GAAG,GAAGA,EAAO,aAAA,IACjD;AAGL,WAAA1B,EAAQ,QAAQ,CAAQ3D,MAAA;AAEd,YAAA2M,IAAuC,IAAI,MAAM,IAAIzG,EAAM,SAAS,CAAC,EAAE,KAAK,EAAE;AAEhF,UAAAnO,IAAOiI,EAAK,MAAM,MAAM,GACxB4M,IAAO5M,EAAK,MAAM,MAAM;AAE5B,YAAM6M,IAAgBF,EAAY,IAAI,CAACjG,GAAOnL,MAAU;AAChD,YAAAA,IAAQ,MAAM;AACP,iBAAAxD;AAIP,YAAA6U,MAAS,UAAaA,EAAK,UAAUF,GAAWnR,IAAQ,KAAK,CAAC;AACvD,iBAAA;AAIL,cAAAuR,IAAW9M,EAAK,MAAM,MAAM;AAG3B,eAAAjI,IAAAiI,EAAK,MAAM,SACX4M,IAAA5M,EAAK,MAAM,SACX8M;AAAA,MAAA,CACV;AAGD,MAAA9M,EAAK,QAAQkG,GACblG,EAAK,QAAQ6M;AAAA,IAAA,CAChB,GAiCM,EAAC,OA9B+BlJ,EAClC,IAAI,CAAC3D,MAASA,EAAK,KAAK,EACxB,OAAgC,CAACpK,GAAGC,MAC7BD,EAAE,WAAW,IACNC,KAITA,EAAA,QAAQ,CAAChB,GAAO0G,MAAU;AAGxB,cAAQ1G,GAAO;AAAA,QACX,KAAK;AACD,UAAAe,EAAE2F,CAAK,IAAI;AACX;AAAA,QACJ,KAAK;AACD,UAAA3F,EAAE2F,CAAK,IAAI3F,EAAE2F,CAAK,MAAM,MAAM,MAAM;AACpC;AAAA,QACJ,KAAK;AACD,UAAA3F,EAAE2F,CAAK,IAAI;AACX;AAAA,QACJ,KAAK;AACC,UAAA3F,EAAA2F,CAAK,IAAI3F,EAAE2F,CAAK,MAAM,MAAM,MAAM3F,EAAE2F,CAAK,MAAM,MAAM,MAAM;AAC7D;AAAA,MACR;AAAA,IAAA,CACH,GAEM3F,IACR,CAAE,CAAA,GAEM,OAAAsQ,GAAO,SAAAvC;EAC1B;AAAA,EAEA,IAAW,YAAsB;AAC7B,WAAOhM,EAAA,MAAKkK,GACP,OAAO,CAACoI,GAAenS,MAAcmS,EAAI,OAAOnS,EAAE,SAAS,GAAG,CAAE,CAAA;AAAA,EACzE;AAAA,EAEO,OAAa;AAChB,WAAAP,EAAA,MAAKsK,GAAW,CAAC,IAAI2G,GAAO,KAAK,GAAG,CAAC,IAC9B;AAAA,EACX;AAqBJ;AAnlBIX,KAAA,eACAhG,IAAA,eALGqJ,KAAA,eA4EIC,KAAS,SAAAc,GAAiBC,GAA6B;AAGpD,QAAAa,IAAWZ,GAAWF,CAAG,GAEzBe,IAAWb,GAAWD,CAAG,GAKzBvI,IAHS,OAAO,KAAKoJ,CAAQ,EAAE,OAAO,CAAAlV,MAAK,OAAO,OAAOmV,GAAUnV,CAAC,CAAC,EAGpD,IAAI,CAAKA,MAAA;AAC5B,UAAMqQ,IAAQ6E,EAASlV,CAAC,EAAE,OAAO,CAACoS,GAAKnS,MAAMmS,EAAI,IAAInS,EAAE,KAAK,GAAG,IAAIkB,EAAS,GAAG,CAAC,GAC1EiU,IAASD,EAASnV,CAAC,EAAE,OAAO,CAACoS,GAAKnS,MAAMmS,EAAI,IAAInS,EAAE,KAAK,GAAG,IAAIkB,EAAS,GAAG,CAAC;AACjF,WAAO,IAAIwP,GAAO3Q,GAAGmB,EAAS,IAAIkP,GAAO+E,CAAM,CAAC;AAAA,EAAA,CACnD;AAEM,SAAA,IAAI1B,EAAW,GAAG5H,CAAO;AACpC,GAEOyH,KAAS,SAAAa,GAAiBC,GAA6B;AAEpD,QAAAa,IAAWZ,GAAWF,CAAG,GAEzBe,IAAWb,GAAWD,CAAG,GAKzBvI,IAHS,CAAC,GAAO,oBAAA,IAAI,CAAC,GAAG,OAAO,KAAKoJ,CAAQ,GAAG,GAAG,OAAO,KAAKC,CAAQ,CAAC,CAAC,CAAC,EAGzD,IAAI,CAAKnV,MAAA;AACtB,UAAAqQ,IACF,OAAO,OAAO6E,GAAUlV,CAAC,IACrBkV,EAASlV,CAAC,EAAE,OAAO,CAACoS,GAAKnS,MAAMmS,EAAI,IAAInS,EAAE,KAAK,GAAG,IAAIkB,EAAS,GAAG,CAAC,IAClE,IAAIA,EAAS,CAAC,GAChBiU,IAAS,OAAO,OAAOD,GAAUnV,CAAC,IACpCmV,EAASnV,CAAC,EAAE,OAAO,CAACoS,GAAKnS,MAAMmS,EAAI,IAAInS,EAAE,KAAK,GAAG,IAAIkB,EAAS,GAAG,CAAC,IAClE,IAAIA,EAAS,CAAC;AAClB,WAAO,IAAIwP,GAAO3Q,GAAGmB,EAAS,IAAIkP,GAAO+E,CAAM,CAAC;AAAA,EAAA,CACnD;AAEM,SAAA,IAAI1B,EAAW,GAAG5H,CAAO;AACpC,GApHG0H,KAAA,eAokBHC,KAAkC,WAAA;AAC1B,MAAAlD,GACAC,IAAgB;AAEhB,SAAA1Q,EAAA,MAAKkQ,QAAiBY,GAAe,QAErCL,IAAM,KAAK,UAAU,SACrBC,IAAM,KAAK,YAAY,WAEvBD,IAAMzQ,EAAA,MAAKkK,IAIXuG,EAAI,WAAW,MACfA,IAAM,CAAC,IAAII,GAAO,GAAG,CAAC,IAEnB,EAAC,KAAAJ,GAAK,KAAAC;AACjB,GArlBGjR,EAAMmU,GAANL;AAAA,IAAMgC,KAAN3B;AAylBP,SAASY,GAAWtX,GAA6C;AAC7D,QAAMsY,IAAc,IAAInU,EAAS,EAAE,IAAI,GACjCoU,IAAgB,IAAIpU,EAAS,EAAE,IAAI,GAEnCqU,IAAKxY,EAAM,QACZ,OAAO,CAACoV,GAA+BnS,MAAM;AAE1C,QAAIA,EAAE,QAAQ,OAAO,EAAE;AACf,aAAAA,EAAE,MAAM,eACRqV,EAAY,SAASrV,EAAE,QAAQ,OAAO,CAAC,EAAE,WAAW,IAEpDsV,EAAc,SAAStV,EAAE,QAAQ,OAAO,CAAC,EAAE,WAAW,GAGnDmS;AAIL,UAAA3B,IAAOxQ,EAAE,QAAQ;AACvB,WAAI,OAAO,OAAOmS,GAAK3B,CAAI,IACnB2B,EAAA3B,CAAI,EAAE,KAAKxQ,CAAC,IAEZmS,EAAA3B,CAAI,IAAI,CAACxQ,CAAC,GAGXmS;AAAA,EACX,GAAG,CAAE,CAAA,GAGH,EAAC,WAAAhH,GAAW,aAAAC,MAAeiK,EAAY,OAAOC,CAAa,EAAE;AACnE,SAAGnK,MAAY,MACRoK,EAAApK,EAAU,UAAU,IAAI,CAAC,IAAIuF,GAAOvF,GAAW,CAAC,CAAC,IAErDC,MAAc,MACVmK,EAAAnK,EAAY,UAAU,IAAI,CAAC,IAAIsF,GAAOtF,GAAa,EAAE,CAAC,IAGtDmK;AACX;AC7oBgB,SAAAC,GAAiBC,GAAOC,GAAgB;AACpD,SAAOD,EAAG,cAAcC,EAAG,aACvBD,EAAG,MAAM;AAAA,IACL,CAAC1Y,GAAO0G,MACGiS,EAAG,MAAMjS,CAAK,EAAE,QAAQ1G,CAAK;AAAA,EACxC;AACZ;AAEgB,SAAA4Y,GAAoBF,GAAOC,GAAgB;AACnD,MAAAD,EAAG,cAAcC,EAAG;AAAoB,WAAA;AAGtC,QAAA3V,IAAI2V,EAAG,MAAM,CAAC,EAAE,QAAQD,EAAG,MAAM,CAAC,EAAE;AAC1C,SAAOA,EAAG,MAAM;AAAA,IACZ,CAAC1Y,GAAO0G,MACGiS,EAAG,MAAMjS,CAAK,EAAE,UAAU1G,EAAM,QAAQgD;AAAA,EACnD;AACR;AAGgB,SAAA6V,GAAWH,GAAOC,GAAiB;AAC3C,SAAAD,EAAG,cAAcC,EAAG,YAAoB,IAAIxU,IAAW,YAKpDuU,EAAG,MAAM;AAAA,IACZ,CAACtD,GAAKpV,GAAO0G,MACF0O,EAAI,IAAIpV,EAAM,MAAM,EAAE,SAAS2Y,EAAG,MAAMjS,CAAK,CAAC,CAAC;AAAA,IACvD,IAAIvC,EAAS,CAAC;AAAA,EAAA;AACzB;AAEO,SAAS2U,MAAevY,GAAuB;AAG9C,MAAAA,EAAO,KAAK,CAACP,MAAUA,EAAM,cAAcO,EAAO,CAAC,EAAE,SAAS;AACxD,UAAA,IAAI,MAAM,0CAA0C;AAI9D,MAAIA,EAAO,CAAC,EAAE,cAAcA,EAAO;AACzB,UAAA,IAAI,MAAM,gCAAgCA,EAAO,CAAC,EAAE,SAAS,0CAA0CA,EAAO,MAAM,SAAS;AAIvI,SAAIA,EAAO,CAAC,EAAE,cAAc,IACjBA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EACxD,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAIlEA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,QACrB;AAAA,IACGA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAA,EAAQ,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EACjD,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,EAAA,EAExE;AAAA,IAASA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,QACxB;AAAA,MACGA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAA,EAAQ,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EACjD,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,IACzE;AAAA,EAAA,EAEH,IAAIA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,QACnB,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAC3D,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,SAASA,EAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF;AbpEA,IAAAwY,GAAAC;AcQO,MAAMC,KAAN,MAAMA,GACa;AAAA,EAItB,eAAe1Y,GAA2C;AAH1D,IAAAgC,EAAA,MAAAwW,GAAqB,CAAA;AACrB,IAAAxW,EAAA,MAAAyW,IAAW;AAiKX,IAAAxW,EAAA,cAAO,OACHM,EAAA,MAAKiW,GAAO,QAAQ,CAAKrY,MAAAA,EAAE,MAAM,GAC1B;AAGX,IAAA8B,EAAA,aAAM,OACF,KAAK,KAAK,GACV,KAAK,EAAE,OACA;AAGX,IAAAA,EAAA,kBAAW,OACPM,EAAA,MAAKiW,GAAO,QAAQ,CAAKrY,MAAAA,EAAE,UAAU,GAC9B;AAGX,IAAA8B,EAAA,aAAM,CAACoC,OACE9B,EAAA,MAAAiW,GAAO,QAAQ,CAACrY,GAAGgG,MAAUhG,EAAE,IAAIkE,EAAE,MAAM8B,CAAK,CAAC,CAAC,GAChD;AAGX,IAAAlE,EAAA,kBAAW,CAACoC,MACD,KAAK,IAAIA,EAAE,MAAM,EAAE,UAAU;AAGxC,IAAApC,EAAA,cAAO,MAAY;AACf,YAAM0W,IAAO,KAAK;AAClB,aAAIA,MAAS,IACF,OAGJ,KAAK,eAAeA,CAAI;AAAA,IAAA;AAoBnC,IAAA1W,EAAA,aAAM,CAACoC,MACIiU,GAAW,MAAMjU,CAAC;AAe7B,IAAApC,EAAA,gBAAS,MAAY;AACb,UAAA,KAAK,aAAa;AAAW,cAAA,IAAI,MAAM,4CAA4C;AAEjF,YAAA9B,IAAI,KAAK,EAAE,MAAM,EAAE,SACrB,GAAAoJ,IAAI,KAAK,EAAE,MAAM;AAChB,aAAAhH,EAAA,MAAAiW,GAAO,CAAC,IAAIjP,GACZhH,EAAA,MAAAiW,GAAO,CAAC,IAAIrY,GACV;AAAA,IAAA;AAUX,IAAA8B,EAAA,iBAAU,CAACnC,MACAoY,GAAiB,MAAMpY,CAAC;AAGnC,IAAAmC,EAAA,sBAAe,CAACnC,MACLuY,GAAoB,MAAMvY,CAAC;AAGtC,IAAAmC,EAAA,oBAAa,CAACnC,MACH,KAAK,IAAIA,CAAC,EAAE,OAAO;AAG9B,IAAAmC,EAAA,0BAAmB,CAACQ,MAAkC;AAC5C,YAAAmW,IAAS,IAAIhV,EAASnB,CAAC;AAC7B,kBAAK,MAAM,QAAQ,CAAAtC,MAAKA,EAAE,SAASyY,CAAM,CAAC,GACnC;AAAA,IAAA;AAGX,IAAA3W,EAAA,wBAAiB,CAACQ,MACP,KAAK,iBAAiB,IAAImB,EAASnB,CAAC,EAAE,SAAS;AAG1D,IAAAR,EAAA,kBAAW,MAEA,KACF;AAAA,MACGR,EAAQ,IAAI,GAAG,KAAK,MAAM,IAAI,CAAAtB,MAAKA,EAAE,WAAW,CAAC;AAAA,IAAA,EAEpD;AAAA,MACGsB,EAAQ,IAAI,GAAG,KAAK,MAAM,IAAI,CAAAtB,MAAKA,EAAE,SAAS,CAAC;AAAA,IAAA,EAEnD;AAAA,MACI,KAAK,EAAE,eAAe,KAAK;AAAA,IAAA;AAIvC,IAAA8B,EAAA,eAAQ,CAACoC,GAAWwU,GAAiBC,MAA6B;AAE9D,UAAIF,IAAS,KAAK,IAAIvU,CAAC,EAAE;AACzB,aAAIwU,MACSD,IAAA,KAAK,IAAIA,CAAM,KAGXE,IAAS,IAAI,MAAM,KAAK,MAEvB,KAAK,KAAKF,KAAU,KAAK,OAAOvU,EAAE,KAAK;AAAA,IAAA;AAI7D,IAAApC,EAAA,oBAAa,CAACxC,MAAwB;AAE9B,MAAAA,EAAM,WAAW,GAAG,MACZA,IAAAA,EAAM,UAAU,CAAC,IAIzBA,EAAM,SAAS,GAAG,MAClBA,IAAQA,EAAM,UAAU,GAAGA,EAAM,SAAS,CAAC;AAIzC,YAAAsZ,IAAatZ,EAAM,MAAM,SAAS,EACnC,OAAO,CAACK,MAAMA,EAAE,KAAK,MAAM,EAAE;AAG9B,aAAAiZ,EAAW,SAAS,IACb,QAIX5W,EAAA,MAAKqW,GAASO,EAAW,IAAI,OAAK,IAAInV,EAASzD,CAAC,CAAC,IAC1C;AAAA,IAAA;AAzTH,IAAAH,EAAO,SAAS,KACX,KAAA,MAAM,GAAGA,CAAM;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAoB;AACpB,WAAOuC,EAAA,MAAKiW;AAAA,EAChB;AAAA,EAEA,IAAI,MAAM/Y,GAAmB;AACzB,IAAA0C,EAAA,MAAKqW,GAAS/Y;AAAA,EAClB;AAAA,EAEA,IAAI,IAAc;AACP,WAAA8C,EAAA,MAAKiW,GAAO,CAAC;AAAA,EACxB;AAAA,EAEA,IAAI,EAAE/Y,GAAmC;AACrC,IAAA8C,EAAA,MAAKiW,GAAO,CAAC,IAAI,IAAI5U,EAASnE,CAAK;AAAA,EACvC;AAAA,EAEA,IAAI,IAAc;AACP,WAAA8C,EAAA,MAAKiW,GAAO,CAAC;AAAA,EACxB;AAAA,EAEA,IAAI,EAAE/Y,GAAmC;AACrC,IAAA8C,EAAA,MAAKiW,GAAO,CAAC,IAAI,IAAI5U,EAASnE,CAAK;AAAA,EACvC;AAAA,EAEA,IAAI,IAAc;AACV,QAAA,KAAK,YAAY;AAAW,YAAA,IAAI,MAAM,kBAAkB;AACrD,WAAA8C,EAAA,MAAKiW,GAAO,CAAC;AAAA,EACxB;AAAA,EAEA,IAAI,EAAE/Y,GAAmC;AACjC,QAAA,KAAK,YAAY;AAAW,YAAA,IAAI,MAAM,kBAAkB;AAC5D,IAAA8C,EAAA,MAAKiW,GAAO,CAAC,IAAI,IAAI5U,EAASnE,CAAK;AAAA,EACvC;AAAA,EAEA,IAAI,UAAmB;AACnB,WAAO8C,EAAA,MAAKkW;AAAA,EAChB;AAAA,EAEA,IAAI,QAAQhZ,GAAgB;AACxB,IAAA0C,EAAA,MAAKsW,IAAWhZ;AAAA,EACpB;AAAA,EAGA,IAAI,aAAuB;AAEvB,WAAO,KAAK,MAAM,OAAO,CAACoV,GAAK1U,MAAM0U,EAAI,IAAI1U,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,IAAIyD,EAAS,CAAC,CAAC;AAAA,EACnF;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,KAAK,KAAK,WAAW,KAAK;AAAA,EAC1C;AAAA,EAEA,IAAI,MAAc;AACd,WAAIrB,EAAA,MAAKkW,MACE,UAAU,KAAK,MAAM,IAAI,CAAAtY,MAAKA,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,aAGlD,oBAAoB,KAAK,MAAM,IAAI,CAAAA,MAAKA,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,EACxE;AAAA,EAEA,IAAI,UAAkB;AAClB,WAAIoC,EAAA,MAAKkW,MACE,IAAI,KAAK,MAAM,IAAI,CAAAtY,MAAKA,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,MAGhD,KAAK,KAAK,MAAM,IAAI,CAAAA,MAAKA,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,aAAaV,IAAQ,GAAQ;AACzB,QAAIA,IAAQ;AACF,YAAA,IAAI,MAAM,8BAA8B;AAG9C,QAAAA,IAAQ,KAAK;AACb,MAAA0C,EAAA,MAAKqW,GAASjW,EAAA,MAAKiW,GAAO,MAAM,GAAG/Y,CAAK;AAAA,aAClCA,IAAQ,KAAK;AACnB,eAAQc,IAAI,KAAK,WAAWA,IAAId,GAAOc;AACnC,QAAAgC,EAAA,MAAKiW,GAAO,KAAK,IAAI5U,EAAS,CAAC,CAAC;AAIjC,WAAA;AAAA,EACX;AAAA,EACA,IAAI,YAAoB;AACpB,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAkB;AAClB,WAAO,KAAK,MAAM,MAAM,CAAKzD,MAAAA,EAAE,QAAQ;AAAA,EAC3C;AAAA,EAEA,OAAO,SAASH,GAA0B;AACtC,WAAO,oBAAoBA,EAAO,KAAK,QAAQ,CAAC;AAAA,EACpD;AAAA,EACA,OAAO,aAAaA,GAA0B;AAC1C,WAAO,KAAKA,EAAO,KAAK,GAAG,CAAC;AAAA,EAChC;AAAA,EAEO,cAAcP,GAAuB;AACxC,WAAA0C,EAAA,MAAKsW,IAAWhZ,MAAU,KACnB;AAAA,EACX;AAAA,EACO,SAASO,GAAiD;AACzD,QAAAA,EAAO,WAAW;AACZ,YAAA,IAAI,MAAM,eAAe;AAG/B,QAAAA,EAAO,WAAW,GAAG;AACjB,UAAAA,EAAO,CAAC,aAAa0Y;AACd,eAAA1Y,EAAO,CAAC,EAAE;AACV,UAAA,OAAOA,EAAO,CAAC,KAAM;AAC5B,eAAO,KAAK,WAAWA,EAAO,CAAC,CAAC;AAE1B,YAAA,IAAI,MAAM,eAAe;AAAA,IAEvC;AAGI,QAAAA,EAAO,WAAW,GAAG;AACf,YAAA,CAAC8I,GAAGhD,CAAC,IAAI9F;AAGX,UAAA8I,aAAa4P,MAAU5S,aAAa4S,IAAQ;AACxC,YAAA5P,EAAE,cAAchD,EAAE;AAAmB,gBAAA,IAAI,MAAM,sCAAsC;AAEzF,eAAA3D,EAAA,MAAKqW,GAAS1S,EAAE,MAAM,IAAI,CAAC3F,GAAGgG,MAAUhG,EAAE,MAAA,EAAQ,SAAS2I,EAAE,MAAM3C,CAAK,CAAC,CAAC,IACnE;AAAA,MACX;AAAA,IACJ;AAGA,WAAAhE,EAAA,MAAKqW,GAASxY,EAAO,IAAI,OAAK,IAAI4D,EAASzD,CAAyB,CAAC,IAE9D;AAAA,EACX;AAAA,EAEO,QAAgB;AACb,UAAAkE,IAAI,IAAIqU;AACZ,WAAArU,EAAA,QAAQ,KAAK,QACfA,EAAE,UAAU,KAAK,SACVA;AAAA,EACX;AAAA,EAEO,OAAmB;AACtB,WAAO9B,EAAA,MAAKiW,GAAO,IAAI,CAAKrY,MAAAA,EAAE,OAAO;AAAA,EACzC;AAAA,EAoCA,SAAS6Y,GAAYC,GAAkB;AAC/B,QAAAD,EAAG,cAAcC,EAAG;AAAmB,YAAA,IAAI,MAAM,oCAAoC;AAEzF,gBAAK,QAAQ,IACbD,EAAG,MAAM,QAAQ,CAAC7Y,GAAGgG,MAAU;AAC3B,WAAK,MAAM,KAAKhG,EAAE,MAAQ,EAAA,IAAI8Y,EAAG,MAAM9S,CAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAAA,IAAA,CAC3D,GAEM;AAAA,EACX;AAAA,EAEA,aAAanG,GAA0B;AAC9B,gBAAA,MAAM,QAAQ,CAACG,GAAGgG,MAAUhG,EAAE,IAAIH,EAAOmG,CAAK,CAAC,CAAC,GAC9C;AAAA,EACX;AAAA,EAOA,MAAM1G,GAAuB;AACzB,QAAI,KAAK,cAAc,KAAKA,EAAM,cAAc;AACtC,YAAA,IAAI,MAAM,4CAA4C;AAGhE,WAAO,IAAIiZ;AAAA,MACP,KAAK,EAAE,MAAA,EAAQ,SAASjZ,EAAM,CAAC,EAAE,SAAS,KAAK,EAAE,MAAM,EAAE,SAASA,EAAM,CAAC,CAAC;AAAA,MAC1E,KAAK,EAAE,MAAA,EAAQ,SAASA,EAAM,CAAC,EAAE,SAAS,KAAK,EAAE,MAAM,EAAE,SAASA,EAAM,CAAC,CAAC;AAAA,MAC1E,KAAK,EAAE,MAAA,EAAQ,SAASA,EAAM,CAAC,EAAE,SAAS,KAAK,EAAE,MAAM,EAAE,SAASA,EAAM,CAAC,CAAC;AAAA,IAAA;AAAA,EAElF;AAAA,EAYA,SAAkB;AACd,WAAO,KAAK,MAAM,MAAM,CAAKU,MAAAA,EAAE,QAAQ;AAAA,EAC3C;AAAA,EACA,QAAiB;AACb,WAAO,KAAK,MAAM,MAAM,CAACA,GAAGgG,MAAUA,MAAU,IAAIhG,EAAE,MAAA,IAAUA,EAAE,OAAQ,CAAA;AAAA,EAC9E;AAAA,EA4EA,WAAWyK,GAAkE;AACzE,UAAMvG,IAAI,IAAIqU,GAAO,MAAM9N,CAAI;AAExB,WAAA;AAAA,MACH,OAAOvG,EAAE;AAAA,MACT,UAAUA,EAAE;AAAA,MACZ,KAAKA,EAAE;AAAA,IAAA;AAAA,EAEf;AACJ;AAzUImU,IAAA,eACAC,KAAA;AAHG,IAAMS,IAANR;ACgGK,IAAAS,uBAAAA,OACRA,EAAA,OAAO,QACPA,EAAA,WAAW,YACXA,EAAA,gBAAgB,iBAChBA,EAAA,UAAU,WAJFA,IAAAA,MAAA,CAAA,CAAA,GAOAC,uBAAAA,OACRA,EAAA,OAAO,QACPA,EAAA,WAAW,YACXA,EAAA,gBAAgB,iBAChBA,EAAA,UAAU,WAJFA,IAAAA,MAAA,CAAA,CAAA;ACtGI,SAAAC,GAAWC,IAAU,KAAc;AACxC,SAAA,KAAK,OAAW,IAAAA;AAC3B;AAOgB,SAAAC,GAAU/Y,GAAWC,GAAY+Y,GAA4B;AACzE,MAAI/Y,MAAM;AACN,WAAID,KAAK,IACE+Y,GAAU,GAAG/Y,CAAC,IAEd+Y,GAAU/Y,GAAG,CAAC;AAK7B,MAAIA,MAAMC;AACC,WAAAD;AAIX,MAAIgZ,MAAY;AACL,WAAA,KAAK,MAAM,KAAK,OAAA,KAAY/Y,IAAID,IAAI,KAAKA,CAAC;AAIrD,MAAI,KAAK,IAAIC,IAAID,CAAC,KAAKgZ,EAAQ;AACrB,UAAA,IAAI,MAAM,4CAA4C;AAG5D,MAAAxQ,IAAIuQ,GAAU/Y,GAAGC,CAAC;AACf,SAAA+Y,EAAQ,SAASxQ,CAAC;AACjB,IAAAA,IAAAuQ,GAAU/Y,GAAGC,CAAC;AAEf,SAAAuI;AACX;AAOgB,SAAAyQ,EAAaC,GAAarK,GAAwB;AAC9D,SAAIA,MAAS,KACFgK,GAAA,IAAeE,GAAU,GAAGG,CAAG,IAAI,CAACH,GAAU,GAAGG,CAAG,IAEpDH,GAAU,CAACG,GAAKA,CAAG;AAElC;AAEO,SAASC,GAAYD,GAAsB;AAC1C,MAAA3Y,IAASU,EAAQ;AACrB,SAAIiY,MAAQ,WACR3Y,IAASA,EAAO,OAAO,CAAKZ,MAAAA,IAAIuZ,CAAG,IAEhCE,GAAW7Y,CAAM;AAC5B;AAEgB,SAAA8Y,GAAeja,GAAUka,GAAsB;AAMvD,SALAA,MAAW,WACFA,IAAA,IAITla,EAAI,UAAU,IACP,OAAO,OAAOA,CAAG,IAIrBma,GAAana,CAAG,EAAE,MAAM,GAAGka,CAAM;AAC5C;AAEO,SAASF,GAAcha,GAAa;AACnC,SAAAA,EAAI,WAAW,IAAY,OACxBA,EAAI2Z,GAAU,GAAG3Z,EAAI,SAAS,CAAC,CAAC;AAC3C;AAEO,SAASma,GAAgBna,GAAe;AAErCma,QAAAA,IAAe,OAAO,OAAOna,CAAG;AACtC,WAASW,IAAIwZ,EAAa,SAAS,GAAGxZ,IAAI,GAAGA,KAAK;AAC9C,UAAMgP,IAAI,KAAK,MAAM,KAAK,YAAYhP,IAAI,EAAE,GACtCyZ,IAAOD,EAAaxZ,CAAC;AAC3BwZ,IAAAA,EAAaxZ,CAAC,IAAIwZ,EAAaxK,CAAC,GAChCwK,EAAaxK,CAAC,IAAIyK;AAAA,EACtB;AAEOD,SAAAA;AACX;AC5FO,MAAME,UAAcf,EAAO;AAAA,EAM9B,eAAelZ,GAA2C;AAChD,aAGFA,EAAO,SAAS,KACX,KAAA,MAAM,GAAGA,CAAM;AAAA,EAE5B;AAAA,EAEgB,SAASA,GAAiD;AAGlE,QAFJ,KAAK,UAAU,IAEXA,EAAO,WAAW,GAAG;AACjB,UAAAA,EAAO,CAAC,aAAakZ;AACrB,oBAAK,QAAQlZ,EAAO,CAAC,EAAE,KAAK,GACrB;AAGX,UAAI,OAAOA,EAAO,CAAC,KAAM;AAChB,oBAAA,WAAWA,EAAO,CAAC,CAAC,GAClB;AAAA,IAEf;AAGI,QAAAA,EAAO,SAAS,GAAG;AACnB,UAAIA,EAAO,KAAK,CAAKG,MAAAA,aAAa+Y,CAAM;AAC9B,cAAA,IAAI,MAAM,qEAAqE;AAGzF,YAAMgB,IAAkBla,EAAO,IAAI,OAAK,IAAI4D,EAASzD,CAAyB,CAAC;AAE/E,UAAI+Z,EAAI,KAAK,CAAA/Z,MAAKA,EAAE,MAAA,CAAO;AACvB,cAAM,IAAI,MAAM,iDAAiDH,EAAO,KAAK,GAAG,CAAC;AAGrF,WAAK,QAAQka;AAAA,IACjB;AAEO,WAAA;AAAA,EACX;AAAA,EAGgB,QAAe;AACrB,UAAA7V,IAAI,IAAI4V;AACZ,WAAA5V,EAAA,QAAQ,KAAK,QACfA,EAAE,UAAU,IACLA;AAAA,EACX;AAEJ;AjBhEA,IAAA8V,IAAA9O,GAAA+O,GAAAC,GAAAC,IAAAC,GAAAC,IAAAC;AkBoBO,MAAMC,KAAN,MAAMA,GAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB7C,eAAe1a,GAAmB;AAhBlC,IAAAgC,EAAA,MAAAmY;AAEA;AAAA,IAAAnY,EAAA,MAAAqJ;AACA,IAAArJ,EAAA,MAAAoY;AACA,IAAApY,EAAA,MAAAqY;AACA,IAAArY,EAAA,MAAAsY;AACA,IAAAtY,EAAA,MAAAuY;AACA,IAAAvY,EAAA,MAAAwY;AAEA,IAAAxY,EAAA,MAAAyY,IAA0E;AA+N1E,IAAAxY,EAAA,qBAAc,CAACQ,MAAsB;AAEjC,YAAMkY,IAAKpY,EAAA,MAAKgY,GACX,MACA,EAAA,iBAAiBd,EAAchX,MAAM,UAAaA,KAAK,IAAK,IAAIA,GAAG,EAAK,CAAC,EACzE,IAAIF,EAAA,MAAK+X,GAAG;AAEjB,aAAAK,EAAG,UAAU,IAENA;AAAA,IAAA;AAGX,IAAA1Y,EAAA,yBAAkB,CAACQ,MAAsB;AAC/B,YAAAkY,IAAK,KAAK,YAAYlY,CAAC;AAE7B,UAAImY,IAAmB;AACvB,aAAO,KAAK,SAASD,CAAE,KAAKC,IAAmB;AAC3C,QAAAD,EAAG,EAAE,IAAIlB,EAAa,GAAG,EAAK,CAAC,GAC/BkB,EAAG,EAAE,IAAIlB,EAAa,GAAG,EAAK,CAAC,GAC/BmB;AAIG,aAAAD;AAAA,IAAA;AAYX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA1Y,EAAA,eAAQ,IAAIjC,MAA4B;AAEhC,UAAAA,EAAO,WAAW;AACX,eAAA;AAIP,UAAAA,EAAO,WAAW,GAAG;AACjB,YAAAA,EAAO,CAAC,aAAa0a;AAErB,iBAAO,KAAK,gBAAgB1a,EAAO,CAAC,EAAE,GAAGA,EAAO,CAAC,EAAE,GAAGA,EAAO,CAAC,EAAE,CAAC;AAC1D,YAAAA,EAAO,CAAC,aAAawS;AAE5B,iBAAO,KAAK,aAAaxS,EAAO,CAAC,CAAC;AAC3B,YAAA,OAAOA,EAAO,CAAC,KAAM;AAExB,cAAA;AACA,kBAAM0J,IAAI,IAAI8I,EAASxS,EAAO,CAAC,CAAC;AACzB,mBAAA,KAAK,MAAM0J,CAAC;AAAA,kBACX;AACD,mBAAA;AAAA,UACX;AAAA,MAER;AAGI,UAAA1J,EAAO,WAAW,KAAKA,EAAO,MAAM,CAAGG,MAAAA,aAAa+Y,CAAM,GAAG;AAC7D,cAAM2B,IAA4B7a;AAElC,YAAI6a,EAAgB,CAAC,EAAE,WAAWA,EAAgB,CAAC,EAAE;AAEjD,iBAAO,KAAK,sBAAsBA,EAAgB,CAAC,GAAG,IAAI3B,EAAO2B,EAAgB,CAAC,GAAGA,EAAgB,CAAC,CAAC,CAAC;AAGxG,YAAAA,EAAgB,CAAC,EAAE,WAAW,CAACA,EAAgB,CAAC,EAAE;AAElD,iBAAO,KAAK,sBAAsBA,EAAgB,CAAC,GAAGA,EAAgB,CAAC,CAAC;AAAA,MAGhF;AAEI,UAAA7a,EAAO,WAAW,GAAG;AACrB,YAAIA,EAAO,CAAC,aAAakZ,KAAUlZ,EAAO,CAAC,aAAakZ,GAAQ;AAC5D,cAAIlZ,EAAO,CAAC,MAAMmZ,GAAc;AAC5B,mBAAO,KAAK,mBAAmBnZ,EAAO,CAAC,GAAGA,EAAO,CAAC,CAAC;AAC5C,cAAAA,EAAO,CAAC,MAAMmZ,GAAc;AACnC,mBAAO,KAAK,sBAAsBnZ,EAAO,CAAC,GAAGA,EAAO,CAAC,CAAC;AAAA,QAE9D;AAEA,eAAIA,EAAO,CAAC,aAAakZ,KAAUlZ,EAAO,CAAC,aAAa0a,KAChD1a,EAAO,CAAC,MAAMmZ,GAAc,YAAYnZ,EAAO,CAAC,MAAM,OAC/C,KAAK,iBAAiBA,EAAO,CAAC,GAAGA,EAAO,CAAC,GAAGmZ,GAAc,QAAQ,IAElE,KAAK,iBAAiBnZ,EAAO,CAAC,GAAGA,EAAO,CAAC,GAAGmZ,GAAc,aAAa,IAI/E,KAAK;AAAA,UACRnZ,EAAO,CAAC;AAAA,UACRA,EAAO,CAAC;AAAA,UACRA,EAAO,CAAC;AAAA,QAAA;AAAA,MAEhB;AAEA,qBAAQ,IAAI,kDAAkD,GAC9D,QAAQ,IAAIA,CAAM,GACX;AAAA,IAAA;AAMX,IAAAiC,EAAA,sBAAe,CAACsD,MAAwB;AAEpC,MAAAA,EAAI,QAAQ,EAAI;AAGhB,YAAMiG,IAAU,IAAI,IAAIjG,EAAI,QAAS,CAAA;AAGjC,UAAA,EAAEiG,EAAQ,IAAI,GAAG,KAAKA,EAAQ,IAAI,GAAG;AAC9B,eAAA;AAIX,iBAAWsP,KAAQ,CAAC,KAAK,GAAG;AACpB,QAAAtP,EAAQ,IAAIsP,CAAI,KAChBtP,EAAQ,OAAOsP,CAAI;AAIvB,aAAAtP,EAAQ,OAAO,IACR,OAIJ,KAAK;AAAA,QACRjG,EAAI,KAAK,cAAc,GAAG,EAAE;AAAA,QAC5BA,EAAI,KAAK,cAAc,GAAG,EAAE;AAAA,QAC5BA,EAAI,KAAK,cAAc,CAAC,EAAE;AAAA,MAAA;AAAA,IAC9B;AAEJ,IAAAtD,EAAA,yBAAkB,CAACzB,GAAyBC,GAAyByG,OAC5D/E,EAAA,MAAAkJ,GAAK,IAAIzH,EAASpD,CAAC,IACnB2B,EAAA,MAAAiY,GAAK,IAAIxW,EAASnD,CAAC,IACnB0B,EAAA,MAAAkY,GAAK,IAAIzW,EAASsD,CAAC,IAExB/E,EAAA,MAAKoY,GAAK,IAAIrB,EAAO3W,EAAA,MAAK6X,GAAG,SAAS7X,EAAA,MAAK8I,GAAG,QAAQ,SAAU,CAAA,IAC3DlJ,EAAA,MAAAmY,IAAM,IAAIpB,EAAO,IAAItV,EAAA,EAAW,KAAA,GAAQrB,EAAA,MAAK8X,GAAG,MAAO,CAAA,IAC5DlY,EAAA,MAAKqY,IAAKjY,EAAA,MAAKgY,GAAG,MAAA,EAAQ,WAEnB;AAGX,IAAAtY,EAAA,+BAAwB,CAACuF,GAAUL,OAU1B,KAAA;AAAA,MACDA,EAAE;AAAA,MACFA,EAAE,EAAE,MAAM,EAAE,SAAS;AAAA,MACrBK,EAAE,EAAE,QAAQ,SAASL,EAAE,CAAC,EAAE,SAASK,EAAE,EAAE,QAAQ,SAASL,EAAE,CAAC,CAAC,EAAE,SAAS;AAAA,IAAA,GAItEhF,EAAA,MAAAmY,IAAM9S,EAAE,UACRrF,EAAA,MAAAoY,GAAKpT,EAAE,UACZhF,EAAA,MAAKqY,IAAKjY,EAAA,MAAKgY,GAAG,MAAA,EAAQ,WAEnB;AAGX,IAAAtY,EAAA,4BAAqB,CAACuF,GAAU1E,MACrB,KAAK;AAAA,MACRA,EAAE;AAAA,MACFA,EAAE;AAAA,MACF0E,EAAE,EAAE,QAAQ,SAAS1E,EAAE,CAAC,EACnB,IAAI0E,EAAE,EAAE,QAAQ,SAAS1E,EAAE,CAAC,CAAC,EAAE,SAAS;AAAA,IAAA;AAIrD,IAAAb,EAAA,0BAAmB,CAACuF,GAAWmC,GAASoR,OAEhCA,MAAgB,WAChBA,IAAc5B,GAAc,WAG5B4B,MAAgB5B,GAAc,WACvB,KAAK,mBAAmB3R,GAAGmC,EAAE,MAAM,IACnCoR,MAAgB5B,GAAc,gBAC9B,KAAK,mBAAmB3R,GAAGmC,EAAE,QAAQ,IAGzC;AAGX,IAAA1H,EAAA,eAAQ,OACCE,EAAA,MAAAkJ,GAAK9I,EAAA,MAAK8I,GAAG,MAAM,IACnBlJ,EAAA,MAAAiY,GAAK7X,EAAA,MAAK6X,GAAG,MAAM,IACnBjY,EAAA,MAAAkY,GAAK9X,EAAA,MAAK8X,GAAG,MAAM,IAEnBlY,EAAA,MAAAoY,GAAKhY,EAAA,MAAKgY,GAAG,MAAM,IACnBpY,EAAA,MAAAmY,IAAM/X,EAAA,MAAK+X,IAAI,MAAM,IACrBnY,EAAA,MAAAqY,IAAKjY,EAAA,MAAKiY,IAAG,MAAM,IAEjB;AAKX;AAAA;AAAA;AAAA,IAAAvY,EAAA,kBAAW,CAAC0Y,MACDpY,EAAA,MAAK8I,GAAG,MAAA,EACV,SAASsP,EAAG,CAAC,EACb;AAAA,MACGpY,EAAA,MAAK6X,GAAG,MAAA,EACH,SAASO,EAAG,CAAC;AAAA,IAErB,EAAA,IAAIpY,EAAA,MAAK8X,EAAE,EACX,OAAO;AAGhB,IAAApY,EAAA,sBAAe,CAAC+Y,MAEL,KAAK,MAAM,QAAQA,EAAK,KAAK,KAAK,KAAK,OAAO,WAAWA,EAAK,MAAM;AAE/E,IAAA/Y,EAAA,kBAAW,CAAC+Y,MACD,KAAK,MAAM,QAAQA,EAAK,KAAK,KAAK,KAAK,OAAO,QAAQA,EAAK,MAAM;AAE5E,IAAA/Y,EAAA,2BAAoB,CAAC+Y,MACV,KAAK,EAAE,WAAWA,EAAK,CAAC;AAEnC,IAAA/Y,EAAA,oBAAa,MACF,KAAK,MAAM;AAEtB,IAAAA,EAAA,kBAAW,MAAY;AACb,YAAA0E,IAAMlF,EAAQ,IAAIc,EAAA,MAAK8I,GAAG,aAAa9I,EAAA,MAAK6X,GAAG,aAAa7X,EAAA,MAAK8X,GAAG,WAAW,GACjFlS,IAAM1G,EAAQ,IAAIc,EAAA,MAAK8I,GAAG,WAAW9I,EAAA,MAAK6X,GAAG,WAAW7X,EAAA,MAAK8X,GAAG,SAAS;AAExE,kBAAA;AAAA,QACD9X,EAAA,MAAK8I,GAAG,MAAM,EAAE,SAAS1E,CAAG,EAAE,OAAOwB,CAAG;AAAA,QACxC5F,EAAA,MAAK6X,GAAG,MAAM,EAAE,SAASzT,CAAG,EAAE,OAAOwB,CAAG;AAAA,QACxC5F,EAAA,MAAK8X,GAAG,MAAM,EAAE,SAAS1T,CAAG,EAAE,OAAOwB,CAAG;AAAA,MAAA,GAGrC;AAAA,IAAA;AAGX,IAAAlG,EAAA,2BAAoB,OAChBM,EAAA,MAAKgY,GAAG,YACD;AAEX,IAAAtY,EAAA,sBAAe,CAAC+Y,MAAiG;AACvG,YAAAC,IAAK,IAAIhB;AACX,UAAAiB,IAAa,IAAOC,IAAS;AAkBjC,aAAI5Y,EAAA,MAAK6X,GAAG,OAAA,KAAYY,EAAK,EAAE,UAI3B,KAAK,aAAaA,CAAI,KACtBC,EAAG,IAAI,IAAIrX,EAAS,EAAE,QAAQ,GAC9BqX,EAAG,IAAI,IAAIrX,EAAS,EAAE,QAAQ,GACjBsX,IAAA,MACN,KAAK,SAASF,CAAI,KACzBC,EAAG,IAAI,IAAIrX,EAAS,EAAE,QAAQ,GAC9BqX,EAAG,IAAI,IAAIrX,EAAS,EAAE,QAAQ,GACrBuX,IAAA,OAETF,EAAG,IAAI1Y,EAAA,MAAK6X,GAAG,MAAM,EAAE,SAASY,EAAK,CAAC,EAAE,SAASzY,EAAA,MAAK8X,GAAG,MAAQ,EAAA,SAASW,EAAK,CAAC,CAAC,EAC5E,OAAOzY,EAAA,MAAK8I,GAAG,MAAA,EAAQ,SAAS2P,EAAK,CAAC,EAAE,SAASzY,EAAA,MAAK6X,GAAG,QAAQ,SAASY,EAAK,CAAC,CAAC,CAAC,GACvFC,EAAG,IAAI1Y,EAAA,MAAK8I,GAAG,MAAM,EAAE,SAAS2P,EAAK,CAAC,EAAE,SAASzY,EAAA,MAAK8X,GAAG,MAAQ,EAAA,SAASW,EAAK,CAAC,CAAC,EAC5E,OAAOzY,EAAA,MAAK6X,GAAG,MAAA,EAAQ,SAASY,EAAK,CAAC,EAAE,SAASzY,EAAA,MAAK8I,GAAG,QAAQ,SAAS2P,EAAK,CAAC,CAAC,CAAC,IAGpF;AAAA,QACH,OAAOC;AAAA,QACP,iBAAiB,EAAEC,KAAcC;AAAA,QACjC,YAAAD;AAAA,QACA,QAAAC;AAAA,MAAA;AAAA,IACJ;AAoDJ,IAAAlZ,EAAA,qBAAc,CAACxC,MAAuC;AAC5C,YAAA8F,IAAM,KAAK,YAAA,EAAc,QAAQ,GAAG,GACtCjD,IAAI,IAAIsB,EAASnE,CAAK;AAE1B,aAAI8F,aAAeiN,IACRjN,EAAI,MAAM,SAAS,EAAE,GAAGjD,GAAG,IAE/B,IAAIsB,IAAW;IAAQ;AAGlC,IAAA3B,EAAA,qBAAc,CAACxC,MAAuC;AAC5C,YAAA8F,IAAM,KAAK,YAAA,EAAc,QAAQ,GAAG,GACtCjD,IAAI,IAAIsB,EAASnE,CAAK;AAE1B,aAAI8F,aAAeiN,IACRjN,EAAI,MAAM,SAAS,EAAE,GAAGjD,GAAG,IAG/B,IAAIsB,IAAW;IAAQ;AAtkB9B,WAAAzB,EAAA,MAAKkJ,GAAK,IAAIzH,EAAS,EAAE,KAAK,IAC9BzB,EAAA,MAAKiY,GAAK,IAAIxW,EAAS,EAAE,KAAK,IAC9BzB,EAAA,MAAKkY,GAAK,IAAIzW,EAAS,EAAE,KAAK,IACzBzB,EAAA,MAAAmY,IAAM,IAAIpB,MACV/W,EAAA,MAAAoY,GAAK,IAAIrB,MACT/W,EAAA,MAAAqY,IAAK,IAAItB,MAEd/W,EAAA,MAAKgY,IAAuB,KAExBna,EAAO,SAAS,KACX,KAAA,MAAM,GAAGA,CAAM,GAGjB;AAAA,EACX;AAAA,EAEA,IAAI,IAAc;AACd,WAAOuC,EAAA,MAAK8I;AAAA,EAChB;AAAA;AAAA;AAAA,EAKA,IAAI,EAAE5L,GAAiB;AACnB,IAAA0C,EAAA,MAAKkJ,GAAK5L;AAAA,EACd;AAAA,EAEA,IAAI,IAAc;AACd,WAAO8C,EAAA,MAAK6X;AAAA,EAChB;AAAA,EAEA,IAAI,EAAE3a,GAAiB;AACnB,IAAA0C,EAAA,MAAKiY,GAAK3a;AAAA,EACd;AAAA,EAEA,IAAI,IAAc;AACd,WAAO8C,EAAA,MAAK8X;AAAA,EAChB;AAAA,EAEA,IAAI,EAAE5a,GAAiB;AACnB,IAAA0C,EAAA,MAAKkY,GAAK5a;AAAA,EACd;AAAA,EAEA,IAAI,KAAa;AACb,WAAO8C,EAAA,MAAK+X;AAAA,EAChB;AAAA,EAEA,IAAI,GAAG7a,GAAe;AAClB,IAAA0C,EAAA,MAAKmY,IAAM7a;AAAA,EACf;AAAA,EAEA,IAAI,IAAY;AACZ,WAAO8C,EAAA,MAAKgY;AAAA,EAChB;AAAA,EAEA,IAAI,EAAE9a,GAAe;AACjB,IAAA0C,EAAA,MAAKoY,GAAK9a;AAAA,EACd;AAAA,EAEA,IAAI,IAAY;AACZ,WAAO8C,EAAA,MAAKiY;AAAA,EAChB;AAAA;AAAA,EAGA,cAAwB;AACpB,UAAMjV,IAAM,IAAIiN,EAAS,IAAIrB,EAAQ,EAAE,MAAM,MAAM5O,EAAA,MAAK8I,IAAI9I,EAAA,MAAK6X,IAAI7X,EAAA,MAAK8X,EAAE,GAAG,IAAIlJ,EAAQ,GAAG,CAAC;AAC/F,WAAI5O,EAAA,MAAK4X,MACE5U,EAAI,aAEJA;AAAA,EAEf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAI,YAAkB;AAClB,WAAApD,EAAA,MAAKsY,IAAc,cACZ;AAAA,EACX;AAAA,EACA,IAAI,WAAiB;AACjB,WAAAtY,EAAA,MAAKsY,IAAc,aACZ;AAAA,EACX;AAAA,EACA,IAAI,MAAY;AACZ,WAAAtY,EAAA,MAAKsY,IAAc,QACZ;AAAA,EACX;AAAA,EACA,IAAI,aAAmB;AACnB,WAAAtY,EAAA,MAAKsY,IAAc,eACZ;AAAA,EACX;AAAA,EACA,IAAI,SAAe;AACf,WAAAtY,EAAA,MAAKsY,IAAc,WACZ;AAAA,EACX;AAAA,EAEA,IAAI,MAAc;AAKd,UAAM/U,IAASnD,EAAA,MAAKkY;AAEpB,YADAtY,EAAA,MAAKsY,IAAc,cACX/U,GAAQ;AAAA,MACZ,KAAK;AACD,eAAO,KAAK,YAAA,EAAc,QAAA,EAAU;AAAA,MACxC,KAAK;AACD,eAAO,KAAK,MAAM,eACd,OAAO,KAAK,GAAG,EAAE,MACjB,OAAO,IAAIyL,IAAU,MAAM,KAAK,KAAK,OAAO,KAAK,MAAM,EAAE;AAAA,MACjE,KAAK;AAAA,MACL,KAAK,UAAU;AACL,cAAAhK,IAAI5E,EAAA,MAAKgY,GAAG,MAAM;AAKxB,eAJIhY,EAAA,MAAK4X,OACLhT,EAAE,SAAS,GAGXzB,MAAW,eACJ,GAAGwT,EAAO,MAAM,KAAK,GAAG,CAAC,MAAMA,EAAO,MAAM3W,EAAA,MAAK+X,IAAI,EAAE,KAAK/X,EAAA,MAAK+X,IAAI,EAAE,GAAG,CAAC,cAAcpB,EAAO,MAAM/R,EAAE,EAAE,KAAKA,EAAE,EAAE,GAAG,CAAC,KAEvH;AAAA,mBACP,IAAIgK,EAAQ5O,EAAA,MAAK+X,IAAI,CAAC,EACb,IAAI,IAAItO,EAAMzJ,EAAA,MAAKgY,GAAG,CAAC,EAAE,SAAS,IAAIvO,EAAM,GAAG,CAAC,CAAC,EACjD,QAAQ,KAAK,EAAI,EACjB,GAAG;AAAA,mBACZ,IAAImF,EAAQ5O,EAAA,MAAK+X,IAAI,CAAC,EACb,IAAI,IAAItO,EAAMzJ,EAAA,MAAKgY,GAAG,CAAC,EAAE,SAAS,IAAIvO,EAAM,GAAG,CAAC,CAAC,EACjD,QAAQ,KAAK,EAAI,EACjB,GAAG;AAAA;AAAA,MAGpB;AAAA,MACA,SACI;AACU,cAAAoP,IAAY,KAAK;AACnB,eAAA7Y,EAAA,MAAK8I,GAAG,gBACR+P,EAAU,SAAS,EAAE,GAElBA,EAAU;AAAA,MACrB;AAAA,IACR;AAAA,EAEJ;AAAA,EAEA,IAAI,sBAA+B;AAC/B,WAAO7Y,EAAA,MAAK4X;AAAA,EAChB;AAAA,EAEA,IAAI,oBAAoB1a,GAAgB;AACpC,IAAA0C,EAAA,MAAKgY,IAAuB1a;AAAA,EAChC;AAAA,EAEA,IAAI,UAAkB;AAIlB,UAAMiG,IAASnD,EAAA,MAAKkY;AAGpB,YAFAtY,EAAA,MAAKsY,IAAc,cAEX/U,GAAQ;AAAA,MACZ,KAAK;AACD,eAAO,KAAK,YAAA,EAAc,QAAA,EAAU;AAAA,MACxC,KAAK;AACD,eAAO,KAAK,MAAM,eACd,OAAO,KAAK,GAAG,EAAE,UACjB,OAAO,IAAIyL,IAAU,MAAM,KAAK,KAAK,OAAO,KAAK,MAAM,EAAE;AAAA,MACjE,KAAK,cAAc;AACT,cAAAhK,IAAI5E,EAAA,MAAKgY,GAAG,MAAM;AACxB,eAAIhY,EAAA,MAAK4X,OACLhT,EAAE,SAAS,GAGR,aAAa5E,EAAA,MAAK+X,IAAI,EAAE,OAAO,IAAI/X,EAAA,MAAK+X,IAAI,EAAE,OAAO,SAASnT,EAAE,EAAE,OAAO,IAAIA,EAAE,EAAE,OAAO;AAAA,MACnG;AAAA,MACA,SAAS;AACC,cAAAiU,IAAY,KAAK;AAEnB,eAAA7Y,EAAA,MAAK8I,GAAG,gBACR+P,EAAU,SAAS,EAAE,GAElBA,EAAU;AAAA,MACrB;AAAA,IAEJ;AAAA,EACJ;AAAA,EAEA,IAAI,SAAiB;AACjB,WAAO,IAAIlC,EAAO3W,EAAA,MAAK8I,IAAI9I,EAAA,MAAK6X,EAAE;AAAA,EACtC;AAAA,EAEA,IAAI,WAAmB;AACZ,WAAA7X,EAAA,MAAKgY,GAAG;EACnB;AAAA,EAEA,IAAI,QAAkB;AACX,WAAAhY,EAAA,MAAK8I,GAAG,MAAM,EAAE,WAAW,OAAO9I,EAAA,MAAK6X,EAAE;AAAA,EACpD;AAAA,EAEA,IAAI,SAAmB;AACZ,WAAA7X,EAAA,MAAK8X,GAAG,MAAM,EAAE,WAAW,OAAO9X,EAAA,MAAK6X,EAAE;AAAA,EACpD;AAAA,EA2GA,WAAWiB,GAAYC,GAAW;AAC9B,WAAO,KAAK,sBAAsBD,GAAK,IAAInC,EAAOmC,GAAKC,CAAG,CAAC;AAAA,EAC/D;AAAA,EAiMA,WAAWX,GAA+D;AAChE,UAAA9M,IAAY8M,EAAG,EAAE,MAAM,EAAE,SAASpY,EAAA,MAAK8I,EAAE,EAC1C,IAAIsP,EAAG,EAAE,MAAA,EAAQ,SAASpY,EAAA,MAAK6X,EAAE,CAAC,EAClC,IAAI7X,EAAA,MAAK8X,EAAE,EAAE,IAAI,GAClBkB,IAAK,KAAK,OAAO;AAGjB,QAAAA,EAAG;AACI,aAAA;AAAA,QACH,OAAO;AAAA,QACP,KAAK;AAAA,QACL,UAAU,IAAI3X,EAAS,EAAE,SAAS;AAAA,MAAA;AAI1C,UAAMnE,IAAQoO,EAAU,QAAQ,KAAK,KAAK0N,EAAG,KAAK,GAC9CjZ,IAAIuL,EAAU,QAAQ,OAAO0N,EAAG,MAAM,EAAE,MAAM;AAG9C,WAAAA,EAAG,aACI;AAAA,MACH,OAAA9b;AAAA,MACA,KAAK6C,EAAE;AAAA,MACP,UAAUA;AAAA,IAAA,IAIX;AAAA,MACH,OAAA7C;AAAA,MACA,KAAK,UAAUoO,EAAU,GAAG,YAAY0N,EAAG,GAAG;AAAA,MAC9C,UAAUjZ;AAAA,IAAA;AAAA,EAElB;AAAA,EAEA,WAAWwG,GAAUhD,GAAmB;AACpC,UAAM0V,IAAM,KAAK;AAAA,MACb,IAAId,GAAO,EAAA,WAAW5R,GAAGhD,CAAC;AAAA,IAAA;AAI9B,WAAI0V,EAAI,kBACGA,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,IAEtD;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EA0BA,4BAA4BtE,GAA2B;AACnD,IAAIA,MAAa,WACFA,IAAA;AAGf,QAAI4Z,IAAY;AAEhB,WAAK7Y,EAAA,MAAK8I,GAAG,aACL9I,EAAA,MAAK8I,GAAG,UACI+P,IAAA,MACL7Y,EAAA,MAAK8I,GAAG,QAAQ,SAAS,EAAE,UACtB+P,IAAA,OAEZA,IAAY7Y,EAAA,MAAK8I,GAAG,MAAM,QAAQ7J,CAAQ,IAAI,MAIjDe,EAAA,MAAK6X,GAAG,aACL7X,EAAA,MAAK6X,GAAG,iBACKgB,KAAA,MAEjBA,KAAa7Y,EAAA,MAAK6X,GAAG,MAAM,QAAQ5Y,CAAQ,IAAI,MAG9Ce,EAAA,MAAK8X,GAAG,aACL9X,EAAA,MAAK8X,GAAG,iBACKe,KAAA,MAEjBA,KAAa7Y,EAAA,MAAK8X,GAAG,MAAM,QAAQ7Y,CAAQ,IAIxC4Z,IAAY;AAAA,EACvB;AACJ;AA/nBIjB,KAAA,eAEA9O,IAAA,eACA+O,IAAA,eACAC,IAAA,eACAC,KAAA,eACAC,IAAA,eACAC,KAAA,eAEAC,KAAA;AAXAxY,EAFSyY,IAEF,iBAAgBvB,GAAc,gBACrClX,EAHSyY,IAGF,YAAWvB,GAAc;AAH7B,IAAMsC,IAANf;AlBpBP,IAAAgB,IAAAC,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AmBSO,MAAMC,KAAN,MAAMA,GAEa;AAAA,EAWtB,eAAevc,GAAmB;AAb/B,IAAAgC,EAAA,MAAAga;AAGH,IAAAha,EAAA,MAAA0Z;AACA,IAAA1Z,EAAA,MAAA2Z;AACA,IAAA3Z,EAAA,MAAA4Z;AAqFA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA3Z,EAAA,0BAAmB,CAAC0H,MAAoB;AACpC,UAAIpH,EAAA,MAAKmZ,QAAY,UAAanZ,EAAA,MAAKoZ,OAAkB;AAAmB,cAAA,IAAI,MAAM,oBAAoB;AAEpG,YAAAa,IAAW7S,EAAE,WAAWpH,EAAA,MAAKmZ,GAAO,GAAGe,IAAS,KAAK,KAAKla,EAAA,MAAKoZ,GAAc,KAAK;AAEpF,aAAAa,EAAS,QAAQC,IAAS,QACnB,IACA,KAAK,IAAID,EAAS,QAAQC,CAAM,IAAI,QACpC,IAEA;AAAA,IACX;AAGJ,IAAAxa,EAAA,0BAAmB,CAAC0H,MAAqB;AACrC,YAAM+S,IAA8B,CAAA;AAGhC,UAAAna,EAAA,MAAKqZ,QAAe;AAAa,eAAO;AACtC,YAAAe,IAAOpa,EAAA,MAAKqZ,IAAW,SAASgB,IAAQjT,EAAE,cAAc,MAAA,EAAQ,QAAQ,GAAG,GAC7EkT,IAAQlT,EAAE,YAAc,EAAA,MAAQ,EAAA,QAAQ,GAAG;AAE3C,aAAAiT,aAAiBpK,KAAYqK,aAAiBrK,MAC9CmK,EAAK,UAAU,KAAKE,EAAM,KAAK,EAAE,YACjCF,EAAK,MAAM,IAaRD;AAAA,IAAA;AAGX,IAAAza,EAAA,kBAAW,CAACuF,MACJA,aAAa5D,IACNrB,EAAA,MAAKwZ,IAAL,WAAwBvU,KACxB,KAAK,gBAAgBA,CAAC,IACtBjF,EAAA,MAAKsZ,IAAL,WAAyCrU,KACzCjF,EAAA,MAAKmZ,QAAY,UAAanZ,EAAA,MAAKmZ,IAAQ,WAAWlU,CAAC,EAAE,QAAQ,KAAK,OAAO,QAE7EjF,EAAA,MAAKuZ,IAAL,WAA8CtU,MAErD,QAAQ,IAAI,sCAAsC,GAE/C;AAGX,IAAAvF,EAAA,yBAAkB,CAACuF,MAAsB;AnBzJ7C,UAAA6D;AmB0Je,eAAAA,IAAA9I,EAAA,MAAKqZ,QAAL,gBAAAvQ,EAAiB,KAAK,EAAE,GAAG7D,EAAE,GAAG,GAAGA,EAAE,EAAG,OAAK;AAAA,IAAA;AAGxD,IAAAvF,EAAA,2BAAoB,CAAC6a,MAAuC;AAQxD,YAAMzb,IAAWI,EAAQ,8BAA8B,KAAK,aAAa,OAAO,EAAI,GAE9Esb,IAAkB,CAAA;AAExB,aAAA1b,EAAS,QAAQ,CAAW2b,MAAA;AAKxB,mBAAWva,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AACxC,UAAAsa,EAAA;AAAA,YAAK,IAAI9C;AAAA,cACZ,KAAK,OAAO,EAAE,QAAQ,IAAIxX,EAAE,CAAC,IAAIua,EAAQ,CAAC,CAAC;AAAA,cAC3C,KAAK,OAAO,EAAE,QAAQ,IAAIva,EAAE,CAAC,IAAIua,EAAQ,CAAC,CAAC;AAAA,YAC/C;AAAA,UAAA;AAAA,MAOJ,CACH,GACMD;AAAA,IAAA;AAyBX,IAAA/a,EAAA,MAAA6Z,IAAsC,CAACrU,MAAqB;AACxD,YAAMyV,IAAK,IAAI/D,EAAO,KAAK,QAAQ1R,CAAC;AACpC,aAAO,CAAC,IAAIiU,EAAKjU,GAAGyV,GAAI9D,GAAc,aAAa,CAAC;AAAA,IAAA;AAGxD,IAAAnX,EAAA,MAAA8Z,IAA2C,CAACtU,MAAqB;AAO7D,YAAM0V,IAAQ,KAAK,OAAO,EAAE,MAAM,EAAE,SAAS1V,EAAE,CAAC,GAAG2V,IAAQ,KAAK,OAAO,EAAE,MAAM,EAAE,SAAS3V,EAAE,CAAC,GACzF4V,IAAW,IAAIjM,EAAQ,GAAG,GAAGkM,IAAY,IAAIlM,EAAQ,OAAO;AAEhE,aAAAiM,EAAS,SAASF,CAAK,EAAE,SAASC,CAAK,EAAE,IAAI,CAAC,GACpCE,EAAA,SAAS,KAAK,YAAY,GAExB,IAAI7K,EAAS4K,GAAUC,CAAS,EACtB,QAEL,IAAI,CAAO9K,MAAA;AAEpB,YAAAnJ;AACJ,cAAM7D,IAAM,IAAIiN,EAAS,KAAK,GAAG;AAE7B,eAAAD,EAAI,iBAAiB3O,KACrBwF,IAAI5B,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS+K,EAAI,KAAK,EAAE,IAAI/K,EAAE,CAAC,GACtDjC,EAAI,MAAM,SAASgN,EAAI,KAAK,EAAE,IAAInJ,CAAC,MAEnCA,IAAI5B,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS+K,EAAI,KAAK,EAAE,IAAI/K,EAAE,CAAC,GACtDjC,EAAI,MAAM,SAASgN,EAAI,KAAK,EAAE,IAAInJ,CAAC,IAGhC,IAAIqS,EAAKlW,CAAG;AAAA,MAAA,CACtB;AAAA,IAAA;AAIL,IAAAvD,EAAA,MAAA+Z,IAAqB,CAACuB,MAA4B;AAK9C,YAAM9c,IAAI8c,EAAM,WAAW7c,IAAI,CAAC6c,EAAM,aAAaC,IAAK,KAAK,OAAO,EAAE,MAAM,GAAGC,IAAK,KAAK,OAAO,EAAE,SAE5FC,IAAK,KAAK,aAAa,MAAM,EAAE,SAASH,EAAM,aAAa,IAAIA,EAAM,eAAe,CAAC,GACvF5V,IAAK6V,EAAG,QAAQ,SAAS/c,CAAC,EAAE,SAAW,EAAA,SAASgd,EAAG,MAAQ,EAAA,SAAS/c,CAAC,CAAC,EAAE,IAAIgd,EAAG,MAAQ,EAAA,KAAA,CAAM,GAC7F9V,IAAK4V,EAAG,MAAM,EAAE,SAAS/c,CAAC,EAAE,WAAW,SAASgd,EAAG,MAAQ,EAAA,SAAS/c,CAAC,CAAC,EAAE,SAASgd,EAAG,QAAQ,KAAM,CAAA;AAEtG,aAAO,CAAC,IAAIhC,EAAKjb,GAAGC,GAAGiH,CAAE,GAAG,IAAI+T,EAAKjb,GAAGC,GAAGkH,CAAE,CAAC;AAAA,IAAA;AA/O1C,IAAA3H,EAAO,SAAS,KACX,KAAA,MAAM,GAAGA,CAAM;AAAA,EAE5B;AAAA,EAEA,IAAI,SAAgB;AACT,WAAAuC,EAAA,MAAKmZ,OAAW,IAAIzB;EAC/B;AAAA,EAEA,IAAI,eAAyB;AACzB,WAAO1X,EAAA,MAAKoZ,MAAiB,IAAI/X,EAAS,CAAC;AAAA,EAC/C;AAAA,EAEA,IAAI,YAAsB;AAClB,QAAArB,EAAA,MAAKqZ,QAAe;AAAmB,YAAA,IAAI,MAAM,gCAAgC;AAErF,WAAOrZ,EAAA,MAAKqZ;AAAA,EAChB;AAAA,EAEA,IAAI,SAA0D;AACtD,WAAArZ,EAAA,MAAKoZ,OAAkB,SAAoB,EAAE,KAAK,IAAI,SAAS,IAAI,OAAO,MAC1EpZ,EAAA,MAAKoZ,GAAc,aACZ;AAAA,MACH,KAAKpZ,EAAA,MAAKoZ,GAAc,MAAM,EAAE,KAAO,EAAA;AAAA,MACvC,SAASpZ,EAAA,MAAKoZ,GAAc,MAAM,EAAE,KAAO,EAAA;AAAA,MAC3C,OAAOpZ,EAAA,MAAKoZ,GAAc,MAAM,EAAE,KAAO,EAAA;AAAA,IAAA,IAGtC;AAAA,MACH,KAAK,UAAUpZ,EAAA,MAAKoZ,GAAc,GAAG;AAAA,MACrC,SAAS,QAAQpZ,EAAA,MAAKoZ,GAAc,OAAO;AAAA,MAC3C,OAAOpZ,EAAA,MAAKoZ,GAAc,MAAM,EAAE,KAAO,EAAA;AAAA,IAAA;AAAA,EAGrD;AAAA,EAEA,IAAI,MAAc;AAEd,QAAI+B,GAAIC;AACR,WAAI,KAAK,OAAO,EAAE,OAAA,IACTD,IAAA,QAELA,IAAK,WAAW,KAAK,OAAO,EAAE,eAAe,MAAM,GAAG,GAAG,KAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,GAAG,cAExF,KAAK,OAAO,EAAE,OAAA,IACTC,IAAA,QAELA,IAAK,WAAW,KAAK,OAAO,EAAE,eAAe,MAAM,GAAG,GAAG,KAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,GAAG,cAErF,GAAGD,CAAE,IAAIC,CAAE,IAAI,KAAK,aAAa,GAAG;AAAA,EAC/C;AAAA,EAEA,IAAI,YAAoB;AACpB,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EAEA,IAAI,UAAkB;AAClB,QAAID,GAAIC;AACR,WAAI,KAAK,OAAO,EAAE,OAAA,IACTD,IAAA,QAELA,IAAK,KAAK,KAAK,OAAO,EAAE,eAAe,MAAM,GAAG,GAAG,KAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,GAAG,OAElF,KAAK,OAAO,EAAE,OAAA,IACTC,IAAA,QAELA,IAAK,KAAK,KAAK,OAAO,EAAE,eAAe,MAAM,GAAG,GAAG,KAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,GAAG,OAE/E,GAAGD,CAAE,IAAIC,CAAE,IAAI,KAAK,aAAa,OAAO;AAAA,EACnD;AAAA,EAkGA,QAAgB;AACZ,WAAO,IAAIpB;AAAA,MACP,KAAK,OAAO,MAAM;AAAA,MAClB,KAAK,aAAa,MAAM;AAAA,MACxB;AAAA,IAAA;AAAA,EAMR;AAAA,EAEA,UAAUE,GAA2BmB,GAAwB;AACzD,WAAIA,IACKzb,EAAA,MAAAwZ,GAAgB,IAAI/X,EAAS6Y,CAAM,KAExCta,EAAA,MAAKwZ,GAAgB,IAAI/X,EAAS6Y,CAAM,EAAE,IAAI,CAAC,IAEnDhX,EAAA,MAAKuW,IAAAE,IAAL,YACO;AAAA,EACX;AAAA,EA+DA,SAASlc,GAAyB;AAS9B,WAAAyF,EAAA,MAAKuW,IAAAC,IAAL,YAEI,OAAOjc,EAAO,CAAC,KAAM,WACrByF,EAAA,MAAKuW,IAAAM,IAAL,WAAoB,IAAI9J,EAASxS,EAAO,CAAC,CAAC,KACnCA,EAAO,CAAC,aAAawS,IACvB/M,EAAA,MAAAuW,IAAAM,IAAA,WAAetc,EAAO,CAAC,KACrBA,EAAO,CAAC,aAAauc,KACvB9W,EAAA,MAAAuW,IAAAG,IAAA,WAAiBnc,EAAO,CAAC,KACvBA,EAAO,CAAC,aAAaia,KAASja,EAAO,SAAS,MACjDA,EAAO,CAAC,aAAaia,IACjBja,EAAO,CAAC,aAAaia,KAIrBxU,EAAA,MAAKuW,IAAAK,IAAL,WAAiCrc,EAAO,CAAC,GAAGA,EAAO,CAAC,MAEjDA,EAAO,CAAC,aAAa4D,KAAY,OAAO5D,EAAO,CAAC,KAAM,aAC7DyF,EAAA,MAAKuW,IAAAI,IAAL,WAA2Bpc,EAAO,CAAC,GAAGA,EAAO,CAAC,GAAI,OAAOA,EAAO,CAAC,KAAM,YAAaA,EAAO,CAAC,IAAI,MAKxGyF,EAAA,MAAKuW,IAAAE,IAAL,YAGO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4EJ;AApXIR,KAAA,eACAC,IAAA,eACAC,KAAA,eAsMAC,KAAA,eAKAC,KAAA,eAkCAC,KAAA,eAlPGC,KAAA,eAgQHC,KAAe,WAAA;AACX,SAAA9Z,EAAA,MAAKuZ,IAAU,SACfvZ,EAAA,MAAKwZ,GAAgB,SACrBxZ,EAAA,MAAKyZ,IAAa,SAEX;AACX,GAuCAM,KAAsB,WAAA;AAClB,EAAA/Z,EAAA,MAAKyZ,IACD,IAAIpJ;AAAA,IACA,IAAIrB,EAAQ,OAAO,KAAK,OAAO,EAAE,OAAO,YAAY,KAAK,OAAO,EAAE,OAAO,MAAM;AAAA,IAC/E,IAAIA,EAAQ,KAAK,aAAa,OAAO;AAAA,IAC3C,SAAS;AACf,GAEAgL,cAAiB0B,GAAsB;AAC9B,SAAA1b,EAAA,MAAAuZ,IAAUmC,EAAO,OAAO,MAAM,IAC9B1b,EAAA,MAAAwZ,GAAgBkC,EAAO,aAAa,MAAM,IAC/CpY,EAAA,MAAKuW,IAAAE,IAAL,YACO;AACX,GAEAE,KAAA,SAAsB0B,GAAerB,GAA2BmB,GAAwB;AAC/E,SAAAzb,EAAA,MAAAuZ,IAAUoC,EAAO,UAClBF,IACKzb,EAAA,MAAAwZ,GAAiB,IAAI/X,EAAS6Y,CAAM,KAEzCta,EAAA,MAAKwZ,GAAgB,IAAI/X,EAAS6Y,CAAM,EAAE,IAAI,CAAC,IAG5C;AACX,GAEAJ,KAAA,SAA4ByB,GAAeC,GAA2B;AAC7D,SAAA5b,EAAA,MAAAuZ,IAAUoC,EAAO,UACtB3b,EAAA,MAAKwZ,GAAgB,IAAIzC,EAAO3W,EAAA,MAAKmZ,KAASqC,CAAY,EAAE,aACrD;AACX,GAEAzB,cAAe/W,GAAqB;AAK5B,MAFJA,EAAI,SAAS,GAETA,EAAI,OAAO,GAAG,EAAE,UAAU,KAAKA,EAAI,OAAO,GAAG,EAAE,UAAU,GAAG;AAE5D,UAAMoC,IAAKpC,EAAI,KAAK,cAAc,GAAG,GAAG,GAAGyY,IAAKzY,EAAI,KAAK,cAAc,GAAG,GAAG;AAC7E,QAAImC,GAAWuW,GAAW/W;AAG1B,IAAIS,EAAG,YAAY,QAAQqW,EAAG,WAAW,KACjCzY,EAAA,OAAOoC,EAAG,WAAW,GAEzBD,IAAKnC,EAAI,KAAK,cAAc,GAAG,GAAG,GAClC0Y,IAAK1Y,EAAI,KAAK,cAAc,GAAG,GAAG,GAE9B2B,IAAA3B,EAAI,KAAK,cAAc,CAAC,GAEvBpD,EAAA,MAAAuZ,IAAU,IAAIzB,EAAMvS,EAAG,YAAY,MAAM,EAAE,OAAO,CAAC,EAAE,YAAYuW,EAAG,YAAY,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,IAE5G9b,EAAA,MAAAwZ,GAAgBzU,EAAE,YAAY,MAAM,EAAE,WACtC,IAAI3E,EAAA,MAAKmZ,IAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,EACjC,IAAInZ,EAAA,MAAKmZ,IAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,OAItCvZ,EAAA,MAAKuZ,IAAU,SACfvZ,EAAA,MAAKwZ,GAAgB;AAAA,EAE7B;AACO,SAAA;AACX;AA7WG,IAAMuC,KAAN3B;AnBTP,IAAAjC,GAAAC;AoBYO,MAAM4D,KAAN,MAAMA,GAAM;AAAA,EAef,YAAYrV,GAAU3B,GAAmB;AAVzC;AAAA,IAAAnF,EAAA,MAAAsY,GAAa,IAAIL;AACjB,IAAAjY,EAAA,MAAAuY,GAAa,IAAIrB;AA2EjB,IAAAjX,EAAA,eAAQ,OACCE,EAAA,MAAAoY,GAAKhY,EAAA,MAAKgY,GAAG,MAAM,IACnBpY,EAAA,MAAAmY,GAAM/X,EAAA,MAAK+X,GAAI,MAAM,IAEnB;AAKX;AAAA;AAAA;AAAA,IAAArY,EAAA,kBAAW,CAAC0Y,MACD;AAGX,IAAA1Y,EAAA,sBAAe,CAAC+Y,MAAyB;AAE/B,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AAE7C,IAAA/Y,EAAA,kBAAW,CAAC+Y,MAAyB;AAC3B,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AAE7C,IAAA/Y,EAAA,2BAAoB,CAAC+Y,MAAyB;AACpC,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AAE7C,IAAA/Y,EAAA,oBAAa,MAAe;AAClB,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AAE7C,IAAAA,EAAA,kBAAW,MAAY;AACb,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AAa7C,IAAAA,EAAA,sBAAe,CAAC+Y,MAAmG;AAEzG,YAAA,IAAI,MAAM,yBAAyB;AAAA,IAAA;AA2D7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA/Y,EAAA,qBAAc,CAACyX,IAAM,MAAa;AACxB,YAAA5Q,IAAIvG,EAAA,MAAK+X,GAAI,MAAM,GACrB7X,IAAI,IAAImB,EAAS6V,EAAaC,GAAK,EAAK,CAAC;AAE7C,aAAO,IAAIO;AAAA,QACPnR,EAAE,EAAE,MAAM,EAAE,IAAIvG,EAAA,MAAKgY,GAAG,EAAE,MAAM,EAAE,SAAS9X,CAAC,CAAC;AAAA,QAC7CqG,EAAE,EAAE,MAAM,EAAE,IAAIvG,EAAA,MAAKgY,GAAG,EAAE,MAAM,EAAE,SAAS9X,CAAC,CAAC;AAAA,QAC7CqG,EAAE,EAAE,MAAM,EAAE,IAAIvG,EAAA,MAAKgY,GAAG,EAAE,MAAM,EAAE,SAAS9X,CAAC,CAAC;AAAA,MAAA;AAAA,IACjD;AA9KK,WAAAN,EAAA,MAAAmY,GAAMxR,EAAE,UACR3G,EAAA,MAAAoY,GAAKpT,EAAE,UAAU,IAAI+R,EAAOpQ,GAAG3B,CAAC,IAAIA,EAAE,UACpC;AAAA,EACX;AAAA,EAEA,IAAI,KAAY;AACZ,WAAO5E,EAAA,MAAK+X;AAAA,EAChB;AAAA,EAEA,IAAI,GAAG7a,GAAc;AACjB,IAAA0C,EAAA,MAAKmY,GAAM7a;AAAA,EACf;AAAA,EACA,IAAI,QAAe;AACR,WAAA8C,EAAA,MAAK+X,GAAI;EACpB;AAAA,EAEA,IAAI,IAAY;AACZ,WAAO/X,EAAA,MAAKgY;AAAA,EAChB;AAAA,EAEA,IAAI,EAAE9a,GAAe;AACjB,IAAA0C,EAAA,MAAKoY,GAAK9a;AAAA,EACd;AAAA,EAEA,IAAI,MAAiE;AAC1D,WAAA;AAAA,MACH,YAAY,GAAGyZ,EAAO,MAAM,KAAK,KAAK,GAAG,CAAC,MAAMA,EAAO,MAAM3W,EAAA,MAAK+X,GAAI,EAAE,KAAK/X,EAAA,MAAK+X,GAAI,EAAE,KAAK/X,EAAA,MAAK+X,GAAI,EAAE,GAAG,CAAC,cAAcpB,EAAO,MAAM3W,EAAA,MAAKgY,GAAG,EAAE,KAAKhY,EAAA,MAAKgY,GAAG,EAAE,KAAKhY,EAAA,MAAKgY,GAAG,EAAE,GAAG,CAAC;AAAA,MACnL,QAAQ;AAAA,WACR,IAAIpJ,EAAQ5O,EAAA,MAAK+X,GAAI,CAAC,EACb,IAAI,IAAItO,EAAMzJ,EAAA,MAAKgY,GAAG,CAAC,EAAE,SAAS,IAAIvO,EAAM,GAAG,CAAC,CAAC,EACjD,QAAQ,KAAK,EAAI,EACjB,GAAG;AAAA,WACZ,IAAImF,EAAQ5O,EAAA,MAAK+X,GAAI,CAAC,EACb,IAAI,IAAItO,EAAMzJ,EAAA,MAAKgY,GAAG,CAAC,EAAE,SAAS,IAAIvO,EAAM,GAAG,CAAC,CAAC,EACjD,QAAQ,KAAK,EAAI,EACjB,GAAG;AAAA,WACZ,IAAImF,EAAQ5O,EAAA,MAAK+X,GAAI,CAAC,EACb,IAAI,IAAItO,EAAMzJ,EAAA,MAAKgY,GAAG,CAAC,EAAE,SAAS,IAAIvO,EAAM,GAAG,CAAC,CAAC,EACjD,QAAQ,KAAK,EAAI,EACjB,GAAG;AAAA;AAAA,MAEZ,WAAW,WAAW,IAAImF,EAAQ,KAAK,GAAG5O,EAAA,MAAK+X,GAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,OAAO,KAAK,UAAU,EAAE,GAAG,gBAAgB,IAAInJ,EAAQ,KAAK,GAAG5O,EAAA,MAAK+X,GAAI,EAAE,QAAQ,UAAU,EAAE,GAAG,OAAO,KAAK,UAAU,EAAE,GAAG,gBAAgB,IAAInJ,EAAQ,KAAK,GAAG5O,EAAA,MAAK+X,GAAI,EAAE,QAAQ,SAAU,CAAA,EAAE,GAAG,OAAO,KAAK,UAAU,EAAE,GAAG;AAAA,IAAA;AAAA,EAEjT;AAAA,EAEA,IAAI,UAAqE;AAC/D,UAAA8D,IAAM7b,EAAA,MAAK+X,GAAI,EAAE,SACjB+D,IAAM9b,EAAA,MAAK+X,GAAI,EAAE,SACjBgE,IAAM/b,EAAA,MAAK+X,GAAI,EAAE,SACjB,IAAI,KAAK,UAAU,SAAS,GAC5BiE,IAAK,EAAE,EAAE,SACTC,IAAK,EAAE,EAAE,SACTC,IAAK,EAAE,EAAE;AAER,WAAA;AAAA,MACH,YAAY,GAAGvF,EAAO,UAAU,KAAK,KAAK,GAAG,CAAC,MAAMA,EAAO,UAAU3W,EAAA,MAAK+X,GAAI,EAAE,SAAS/X,EAAA,MAAK+X,GAAI,EAAE,SAAS/X,EAAA,MAAK+X,GAAI,EAAE,OAAO,CAAC,cAAcpB,EAAO,UAAU3W,EAAA,MAAKgY,GAAG,EAAE,SAAShY,EAAA,MAAKgY,GAAG,EAAE,SAAShY,EAAA,MAAKgY,GAAG,EAAE,OAAO,CAAC;AAAA,MACvN,QAAQ;AAAA,MACR,WAAW,MAAM6D,CAAG,KAAKG,CAAE,SAASF,CAAG,KAAKG,CAAE,SAASF,CAAG,KAAKG,CAAE;AAAA,IAAA;AAAA,EAEzE;AAAA,EAEA,IAAI,YAAoB;AACb,WAAAlc,EAAA,MAAKgY,GAAG;EACnB;AAAA,EA+CA,WAAWI,GAA+D;AAGtE,UAAM+D,IAAK,IAAIxF,EAAO3W,EAAA,MAAK+X,IAAKK,CAAE,GAC9BxT,IAAI,KAAK,WACToU,IAAK,KAAK,UAAU,YACpBoD,IAAOD,EAAG,MAAMvX,CAAC,EAAE,YACnByX,IAASD,EAAK,MAAM,EAAE,OAAOpD,CAAE,GAC/BsD,IAAOD,EAAO,QAAQ,KAAK;AAE/B,mBAAQ,IAAI,SAASF,EAAG,MAAMvX,CAAC,EAAE,OAAO,GACjC;AAAA,MACH,OAAO,KAAK,KAAKyX,EAAO,KAAK;AAAA,MAC7B,UAAUA,EAAO,MAAM,EAAE,KAAK;AAAA,MAC9B,KAAKC,EAAK,QAAQ,IAAIA,EAAK,MAAM,UAAUD,EAAO,GAAG;AAAA,IAAA;AAAA,EAE7D;AAAA,EAEA,WAAW9V,GAAUhD,GAAmB;AACpC,UAAM0V,IAAM,KAAK;AAAA,MACb,IAAI2C,GAAMrV,GAAGhD,CAAC;AAAA,IAAA;AAIlB,WAAI0V,EAAI,kBACGA,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,KAClD0V,EAAI,MAAM,EAAE,SAAS,KAAK,IAAI1S,EAAE,EAAE,OAAOhD,EAAE,EAAE,KAAK,IAEtD;AAAA,EACX;AAiCJ;AA3LIwU,IAAA,eACAC,IAAA;AAJAtY,EAFSkc,IAEF,iBAAgB/E,GAAe,gBACtCnX,EAHSkc,IAGF,YAAW/E,GAAe;AAH9B,IAAM0F,KAANX;ApBZP,IAAAY;AqBIO,MAAMC,GAAO;AAAA,EAEhB,eAAehf,GAAkB;AADjC,IAAAgC,EAAA,MAAA+c,IAAoB,CAAA;AAEhB,WAAA5c,EAAA,MAAK4c,IAAU/e,IAER;AAAA,EACX;AAAA,EAEA,IAAI,SAAmB;AACnB,WAAOuC,EAAA,MAAKwc;AAAA,EAChB;AAAA,EAEA,IAAI,QAAsB;AACtB,WAAOxc,EAAA,MAAKwc,IAAQ,IAAI,CAAAjf,MAAKA,EAAE,KAAK;AAAA,EACxC;AAAA,EAEA,IAAI,YAAsB;AACf,WAAA,CAACyC,EAAA,MAAKwc,IAAQ,QAAQxc,EAAA,MAAKwc,IAAQ,CAAC,EAAE,SAAS;AAAA,EAC1D;AAAA,EAEA,WAAoB;AAChB,WAAOxc,EAAA,MAAKwc,IAAQ,WAAWxc,EAAA,MAAKwc,IAAQ,CAAC,EAAE;AAAA,EACnD;AAAA,EAEA,cAAwB;AAChB,QAAA,CAAC,KAAK;AACA,YAAA,IAAI,MAAM,sBAAsB;AAGnC,WAAAxG,GAAY,GAAG,KAAK,MAAM;AAAA,EACrC;AACJ;AA9BIwG,KAAA;ArBLJ,IAAAE,IAAAC;AsBSO,MAAMC,KAAN,MAAMA,GAAO;AAAA,EAIhB,YAAYC,GAAuB;AAHnC,IAAApd,EAAA,MAAAid,IAAkB,IAAI/F,EAAO,GAAG,GAAG,CAAC;AACpC,IAAAlX,EAAA,MAAAkd,IAAgB,IAAIjF,EAAM,GAAG,GAAG,CAAC;AAG7B,WAAImF,KACA,KAAK,MAAMA,CAAM,GAGd;AAAA,EACX;AAAA,EAEA,IAAI,SAAiB;AACjB,WAAO7c,EAAA,MAAK0c;AAAA,EAChB;AAAA,EACA,IAAI,OAAOxf,GAAe;AACtB,IAAA0C,EAAA,MAAK8c,IAAUxf,IACf8C,EAAA,MAAK0c,IAAQ,UAAU;AAAA,EAC3B;AAAA,EACA,IAAI,QAAe;AACf,WAAO1c,EAAA,MAAK2c;AAAA,EAChB;AAAA,EACA,IAAI,MAAMzf,GAAc;AACpB,IAAA0C,EAAA,MAAK+c,IAASzf,IACd8C,EAAA,MAAK2c,IAAO,UAAU;AAAA,EAC1B;AAAA,EAEA,IAAI,IAAc;AACd,WAAO3c,EAAA,MAAK0c,IAAQ;AAAA,EACxB;AAAA,EACA,IAAI,IAAc;AACd,WAAO1c,EAAA,MAAK0c,IAAQ;AAAA,EACxB;AAAA,EACA,IAAI,IAAc;AACd,WAAO1c,EAAA,MAAK0c,IAAQ;AAAA,EACxB;AAAA,EACA,IAAI,IAAc;AACd,WAAO1c,EAAA,MAAK0c,IAAQ,IAAI1c,EAAA,MAAK2c,GAAM,EAAE;EACzC;AAAA,EAEA,IAAI,MAAc;AAEd,WAAO,IAAI1M;AAAA,MACP,IAAIrB,EAAQ,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAAA,MACjD,IAAIA,EAAQ,CAAC;AAAA,IAAA,EACf,OAAS,EAAA;AAAA,EACf;AAAA,EAEA,IAAI,UAAkB;AAElB,WAAO,IAAIqB;AAAA,MACP,IAAIrB,EAAQ,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAAA,MACjD,IAAIA,EAAQ,CAAC;AAAA,IAAA,EACf,OAAS,EAAA;AAAA,EACf;AAAA,EAEA,MAAMiO,GAAsB;AtBjEhC,QAAA/T,GAAA+O,GAAAC;AsBkEY,QAAA+E,EAAO,SAASA,EAAO,QAAQ;AAC/B,WAAK,QAAQA,EAAO,OACpB,KAAK,SAASA,EAAO;AACrB;AAAA,IACJ;AAEA,QAAIA,EAAO,WAAS/T,IAAA+T,EAAO,eAAP,gBAAA/T,EAAmB,YAAW,GAAG;AACjD,WAAK,QAAQ+T,EAAO;AACpB,YAAM,CAACjH,GAAIC,CAAE,IAAIgH,EAAO;AACnB,WAAA,SAASjH,EAAG,MAAMC,CAAE;AACzB;AAAA,IACJ;AAEA,QAAIgH,EAAO,UAAU;AACjB,YAAMC,IAAYD,EAAO,SAAS,SAAS,EAAE,OAAS,EAAA,MAEhD5e,IAAI6e,EAAU,cAAc,GAAG,EAAE,aACjC5e,IAAI4e,EAAU,cAAc,GAAG,EAAE,aACjCnY,IAAImY,EAAU,cAAc,GAAG,EAAE,aACjC,IAAIA,EAAU,cAAc,CAAC,EAAE;AAGrC,WAAK,SAAS,IAAInG,EAAO1Y,GAAGC,GAAGyG,CAAC,GAG5B1G,EAAE,cACF,KAAK,QAAQ,IAAIyZ,EAAM,EAAE,MAAM,EAAE,OAAOzZ,CAAC,EAAE,SAAA,GAAY,GAAG,CAAC,IACpDC,EAAE,cACT,KAAK,QAAQ,IAAIwZ,EAAM,GAAG,EAAE,QAAQ,OAAOxZ,CAAC,EAAE,SAAS,GAAG,CAAC,IAE3D,KAAK,QAAQ,IAAIwZ,EAAM,GAAG,GAAG,EAAE,MAAM,EAAE,OAAO/S,CAAC,EAAE,SAAU,CAAA;AAG/D;AAAA,IACJ;AAEI,UAAAkT,IAAAgF,EAAO,WAAP,gBAAAhF,EAAe,YAAW,KAAKgF,EAAO,OAAO,MAAM,CAAA/c,MAAKA,aAAa6W,CAAM,GAAG;AACxE,YAAApQ,IAAIsW,EAAO,OAAO,CAAC,GACnBtZ,IAAIsZ,EAAO,OAAO,CAAC,GACnB9a,IAAI8a,EAAO,OAAO,CAAC,GAEnBE,IAAK,IAAIpG,EAAOpQ,GAAGhD,CAAC,GACpByZ,IAAK,IAAIrG,EAAOpQ,GAAGxE,CAAC;AACrB,WAAA,SAASgb,EAAG,MAAMC,CAAE,GACzB,KAAK,QAAQzW;AACb;AAAA,IACJ;AAEI,UAAAuR,IAAA+E,EAAO,iBAAP,gBAAA/E,EAAqB,YAAW,GAAG;AACnC,YAAM,CAAC7Z,GAAGC,GAAG,GAAG0G,CAAC,IAAIiY,EAAO;AAC5B,WAAK,SAAS,IAAIlG,EAAO1Y,GAAGC,GAAG,CAAC,GAChC,KAAK,QAAQ,IAAIwZ,EAAM,GAAG,GAAG,CAAC9S,CAAC;AAC/B;AAAA,IACJ;AAAA,EACJ;AAAA,EAKA,MAAM1H,GAAgCoZ,GAAiBC,GAA0B;AAC7E,QAAIrZ,aAAiB0f;AACjB,aAAO,KAAK,OAAO,MAAM1f,EAAM,QAAQoZ,GAAOC,CAAM;AAGpD,QAAA0G;AACJ,QAAI/f,aAAiByZ,GAAQ;AACrB,UAAAzZ,EAAM,cAAc;AACd,cAAA,IAAI,MAAM,kBAAkB;AAG1B,MAAA+f,IAAA/f;AAAA,IAAA;AAEZ,MAAA+f,IAAY/f,EAAM;AAItB,YADYqZ,IAAS,KAAK,KAAK,IAAI,MACtB,KAAK,OAAO,MAAM0G,GAAW,IAAM1G,CAAM;AAAA,EAC1D;AAAA,EAEA,WAAW2G,GAAuB;AAC9B,WAAO,KAAK,OAAO,IAAIA,CAAK,EAAE,IAAI,KAAK,CAAC,EAAE,IAAA,EAAM,QAAQ,KAAK,OAAO;AAAA,EACxE;AAAA,EAEA,kBAAkBzE,GAAoB;AAC5B,UAAA,EAAE,OAAAyE,GAAO,WAAAD,EAAc,IAAAxE,GACvBjS,IAAI,KAAK,OAAO,IAAI0W,CAAK,EAAE,IAAI,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,IAAID,CAAS,EAAE,UAAU;AAClF,WAAAC,EAAM,MAAQ,EAAA,IAAID,EAAU,QAAQ,iBAAiBzW,CAAC,CAAC;AAAA,EAClE;AAAA,EAEA,mBAAmB2W,GAAsB;AACnB,eAAK,OAAO,MAAMA,EAAM,MAAM,GAIrC,IAAIzF,EAAM,GAAG,GAAG,CAAC,GACtB,IAAI,MAAM,gDAAgD;AAAA,EAEpE;AAAA,EAEA,eAAeU,GAAoB;AACxB,WAAA,KAAK,OAAO,IAAIA,CAAE,EAAE,IAAI,KAAK,CAAC,EAAE;EAC3C;AACJ;AA9JIsE,KAAA,eACAC,KAAA;AAFG,IAAMS,KAANR;AtBTP,IAAAS,GAAAC,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AuBKO,MAAMC,KAAN,MAAMA,GAAS;AAAA,EAgBlB,eAAevgB,GAAmB;AAflC,IAAAgC,EAAA,MAAA4d,GAAY,IAAI3F;AAChB,IAAAjY,EAAA,MAAA6d,GAAY,IAAI5F;AAChB,IAAAjY,EAAA,MAAA8d,IAAY,IAAI7F;AAChB,IAAAjY,EAAA,MAAA+d,IAAiD;AAAA,MAC7C,IAAM,IAAItE,EAAK;AAAA,MACf,IAAM,IAAIA,EAAK;AAAA,MACf,IAAM,IAAIA,EAAK;AAAA,IAAA;AAEnB,IAAAzZ,EAAA,MAAAge,IAAsD;AAAA,MAClD,IAAM,IAAI/F,EAAM;AAAA,MAChB,IAAM,IAAIA,EAAM;AAAA,MAChB,IAAM,IAAIA,EAAM;AAAA,IAAA;AAEpB,IAAAjY,EAAA,MAAAie,IAAyC;AA8FzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAhe,EAAA,eAAQ,IAAIjC,MAAgC;AACpC,UAAAA,EAAO,WAAW,GAAG;AAEf,cAAAF,IAAgBE,EAAO,IAAI,CAACG,MAAe,IAAIyD,EAASzD,CAAW,CAAC;AAE1E,YAAIL,EAAE,KAAK,CAAAK,MAAKA,EAAE,MAAA,CAAO;AACf,gBAAA,IAAI,MAAM,yCAAyC;AAG7D,eAAO,KAAK;AAAA,UACR,IAAI+Y,EAAOpZ,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,UACrB,IAAIoZ,EAAOpZ,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,UACrB,IAAIoZ,EAAOpZ,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QAAA;AAAA,MACzB,WACOE,EAAO,WAAW,GAAG;AAK5B,YAAIA,EAAO,MAAM,CAACG,MAAe,OAAOA,KAAM,QAAQ;AAElD,iBAAO,KAAK;AAAA,YACR,GAAGH,EAAO,IAAI,CAACG,MACJ,IAAIsb,EAAKtb,CAAC,CACpB;AAAA,UAAA;YAEEH,EAAO,MAAM,CAACG,MAAeA,aAAasb,CAAI,GAAG;AAExD,gBAAM6D,IAAYtf,EAAO,CAAC,EAAG,MAAM,GAC7BwgB,IAAYxgB,EAAO,CAAC,EAAG,MAAM,GAC7Buf,IAAYvf,EAAO,CAAC,EAAG,MAAM;AACnC,UAAAmC,EAAA,MAAK4d,IAAS,EAAE,IAAAT,GAAI,IAAAkB,GAAI,IAAAjB,EAAG;AAGvB,cAAAkB,IAAYnB,EAAG,aAAakB,CAAE;AAClC,cAAIC,EAAU;AACL,YAAAte,EAAA,MAAA0d,GAAKY,EAAU,MAAM,MAAM;AAAA;AAE1B,kBAAA,IAAI,MAAM,0BAA0B;AAI9C,cADYA,IAAAD,EAAG,aAAajB,CAAE,GAC1BkB,EAAU;AACL,YAAAte,EAAA,MAAA2d,IAAKW,EAAU,MAAM,MAAM;AAAA;AAE1B,kBAAA,IAAI,MAAM,0BAA0B;AAI9C,cADYA,IAAAlB,EAAG,aAAaD,CAAE,GAC1BmB,EAAU;AACL,YAAAte,EAAA,MAAAyd,GAAKa,EAAU,MAAM,MAAM;AAAA;AAE1B,kBAAA,IAAI,MAAM,0BAA0B;AAAA,QAC9C,OAEOzgB,EAAO,MAAM,CAACG,MAAgBA,aAAa8Z,CAAM,MAExD9X,EAAA,MAAKyd,GAAM5f,EAAO,CAAC,EAAG,MAAM,IAC5BmC,EAAA,MAAK0d,GAAM7f,EAAO,CAAC,EAAG,MAAM,IAC5BmC,EAAA,MAAK2d,IAAM9f,EAAO,CAAC,EAAG,MAAM,IAC5BmC,EAAA,MAAK4d,IAAS;AAAA,UACV,IAAM,IAAItE,EAAKlZ,EAAA,MAAKqd,IAAIrd,EAAA,MAAKsd,EAAE;AAAA,UAC/B,IAAM,IAAIpE,EAAKlZ,EAAA,MAAKsd,IAAItd,EAAA,MAAKud,GAAE;AAAA,UAC/B,IAAM,IAAIrE,EAAKlZ,EAAA,MAAKqd,IAAIrd,EAAA,MAAKud,GAAE;AAAA,QAAA;AAAA,MAEvC,WACO9f,EAAO,WAAW,KACrBA,EAAO,CAAC,aAAaugB;AACd,eAAAvgB,EAAO,CAAC,EAAE;AAIzB,aAAAuC,EAAA,MAAK2d,IAAL,YACO;AAAA,IAAA;AAMX;AAAA;AAAA;AAAA,IAAAje,EAAA,eAAQ,MACG,IAAIse;AAAA,MACPhe,EAAA,MAAKqd,GAAG,MAAM;AAAA,MACdrd,EAAA,MAAKsd,GAAG,MAAM;AAAA,MACdtd,EAAA,MAAKud,IAAG,MAAM;AAAA,IAAA;AAYtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA9d,EAAA,MAAAke,IAAkB,MAAM;AACpB,MAAA3d,EAAA,MAAKqd,GAAG,UAAU,IAClBrd,EAAA,MAAKsd,GAAG,UAAU,IAClBtd,EAAA,MAAKud,IAAG,UAAU,IAElB3d,EAAA,MAAK6d,IAAW;AAAA,QACZ,IAAM,IAAI/F,IAAQ,SAAS1X,EAAA,MAAKqd,IAAIrd,EAAA,MAAKsd,EAAE;AAAA,QAC3C,IAAM,IAAI5F,IAAQ,SAAS1X,EAAA,MAAKqd,IAAIrd,EAAA,MAAKud,GAAE;AAAA,QAC3C,IAAM,IAAI7F,IAAQ,SAAS1X,EAAA,MAAKsd,IAAItd,EAAA,MAAKud,GAAE;AAAA,MAAA,IAG1C3d,EAAA,MAAA8d,IAAgB1d,EAAA,MAAK8d,IAAL;AAAA,IAAgC;AAQzD;AAAA;AAAA;AAAA;AAAA,IAAAre,EAAA,MAAAme,IAAkB,CAACO,MAA0B;AACjC,cAAAA,EAAO,YAAe,GAAA;AAAA,QAC1B,KAAK;AACD,iBAAOne,EAAA,MAAKqd;AAAA,QAChB,KAAK;AACD,iBAAOrd,EAAA,MAAKsd;AAAA,QAChB,KAAK;AACD,iBAAOtd,EAAA,MAAKud;AAAA,MACpB;AAGA,aAAOvd,EAAA,MAAKqd;AAAA,IAAA;AAOhB;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA5d,EAAA,MAAAoe,IAAc,CAACO,GAAiBC,MACrB,IAAI1H;AAAA,MACP3W,EAAA,MAAK4d,IAAL,WAAqBQ;AAAA,MACrBpe,EAAA,MAAK4d,IAAL,WAAqBS;AAAA,IAAO;AAIpC,IAAA5e,EAAA,MAAAqe,IAA6B,MAAwB;AAEjD,YAAMQ,IAAU;AAAA,QACZ,GAAK,IAAIpF,EAAK,EAAE,WAAWlZ,EAAA,MAAKqd,IAAIrd,EAAA,MAAKyd,IAAS,EAAE;AAAA,QACpD,GAAK,IAAIvE,EAAK,EAAE,WAAWlZ,EAAA,MAAKsd,IAAItd,EAAA,MAAKyd,IAAS,EAAE;AAAA,QACpD,GAAK,IAAIvE,EAAK,EAAE,WAAWlZ,EAAA,MAAKud,KAAIvd,EAAA,MAAKyd,IAAS,EAAE;AAAA,QACpD,cAAgB;AAAA,MAAA,GAGdc,IAAY;AAAA,QACd,IAAM,IAAIrF,EAAO,EAAA,mBAAmBlZ,EAAA,MAAKyd,IAAS,IAAI,IAAI9G,EAAO3W,EAAA,MAAKqd,IAAIrd,EAAA,MAAKsd,EAAE,EAAE,QAAQ;AAAA,QAC3F,IAAM,IAAIpE,EAAO,EAAA,mBAAmBlZ,EAAA,MAAKyd,IAAS,IAAI,IAAI9G,EAAO3W,EAAA,MAAKqd,IAAIrd,EAAA,MAAKud,GAAE,EAAE,QAAQ;AAAA,QAC3F,IAAM,IAAIrE,EAAO,EAAA,mBAAmBlZ,EAAA,MAAKyd,IAAS,IAAI,IAAI9G,EAAO3W,EAAA,MAAKsd,IAAItd,EAAA,MAAKud,GAAE,EAAE,QAAQ;AAAA,QAC3F,cAAgB;AAAA,MAAA,GAGdiB,IAAU;AAAA,QACZ,GAAK,IAAItF,EAAK,EAAE,mBAAmBlZ,EAAA,MAAKqd,IAAI,IAAI1G,EAAO3W,EAAA,MAAKsd,IAAItd,EAAA,MAAKud,GAAE,EAAE,QAAQ;AAAA,QACjF,GAAK,IAAIrE,EAAK,EAAE,mBAAmBlZ,EAAA,MAAKsd,IAAI,IAAI3G,EAAO3W,EAAA,MAAKqd,IAAIrd,EAAA,MAAKud,GAAE,EAAE,QAAQ;AAAA,QACjF,GAAK,IAAIrE,EAAK,EAAE,mBAAmBlZ,EAAA,MAAKud,KAAI,IAAI5G,EAAO3W,EAAA,MAAKqd,IAAIrd,EAAA,MAAKsd,EAAE,EAAE,QAAQ;AAAA,QACjF,cAAgB;AAAA,MAAA,GAGdmB,IAAKze,EAAA,MAAK+d,IAAL,WAAyB,MAChCW,IAAK1e,EAAA,MAAK+d,IAAL,WAAyB,MAC9BY,IAAK3e,EAAA,MAAK+d,IAAL,WAAyB,MAE5Ba,IAAY;AAAA,QACd,GAAKH,EAAG;AAAA,QACR,GAAKC,EAAG;AAAA,QACR,GAAKA,EAAG;AAAA,QACR,cAAgB;AAAA,MAAA,GAGdG,IAAoB;AAAA,QACtB,GAAKJ,EAAG;AAAA,QACR,GAAKC,EAAG;AAAA,QACR,GAAKC,EAAG;AAAA,QACR,cAAgB;AAAA,MAAA,GAGdG,IAAiC;AAAA,QACnC,SAAAR;AAAA,QACA,WAAAC;AAAA,QACA,SAAAC;AAAA,QACA,WAAAI;AAAA,QACA,mBAAAC;AAAA,MAAA;AAIS,aAAAC,EAAA,QAAQ,eAAeA,EAAa,QAAQ,EAAE,aAAaA,EAAa,QAAQ,CAAC,EAAE,OACnFA,EAAA,UAAU,eAAeA,EAAa,UAAU,GAAG,aAAaA,EAAa,UAAU,EAAE,EAAE,OAC3FA,EAAA,QAAQ,eAAeA,EAAa,QAAQ,EAAE,aAAaA,EAAa,QAAQ,CAAC,EAAE,OACnFA,EAAA,UAAU,eAAeA,EAAa,UAAU,EAAE,aAAaA,EAAa,UAAU,CAAC,EAAE,OAG/FA;AAAA,IAAA;AAGX,IAAArf,EAAA,MAAAse,IAAsB,CAAC3F,MAAmD;AACtE,YAAM2G,IAAS,KAAK;AACpB,UAAIC,GAAIhG;AAaJ,UAXAZ,MAAO,OACP4G,IAAKD,EAAO,IACZ/F,IAAK+F,EAAO,MACL3G,MAAO,OACd4G,IAAKD,EAAO,IACZ/F,IAAK+F,EAAO,MACL3G,MAAO,QACd4G,IAAKD,EAAO,IACZ/F,IAAK+F,EAAO,KAGZC,MAAO,UAAahG,MAAO;AAC3B,cAAM,IAAI,MAAM,aAAaZ,CAAE,iBAAiB;AAGpD,YAAM6G,IAAMD,EAAG,EAAE,SAAA,EAAW,MACtBE,IAAMlG,EAAG,EAAE,SAAA,EAAW,MACtBmG,IAAQH,EAAG,YAAY,EAAE,SAASE,CAAG,GACrCE,IAAQpG,EAAG,YAAY,EAAE,SAASiG,CAAG,GAErCI,IAAW,IAAInG,EAAKiG,EAAM,QAAQ,SAASC,CAAK,EAAE,SAAA,CAAU,GAC5DvZ,IAAW,IAAIqT,EAAKkG,EAAM,QAAQ,SAASD,CAAK,EAAE,SAAA,CAAU;AAGlE,aAAI/G,MAAO,MACAiH,EAAG,WAAW,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,UAAUA,GAAI,UAAUxZ,MAAO,EAAE,UAAUA,GAAI,UAAUwZ,MAElGjH,MAAO,MACAiH,EAAG,WAAW,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,UAAUA,GAAI,UAAUxZ,MAAO,EAAE,UAAUA,GAAI,UAAUwZ,MAElGjH,MAAO,MACAiH,EAAG,WAAW,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,UAAUA,GAAI,UAAUxZ,MAAO,EAAE,UAAUA,GAAI,UAAUwZ,MAI/F,EAAE,UAAUA,GAAI,UAAUxZ,EAAG;AAAA,IAAA;AAvUhC,WAAApI,EAAO,SAAS,KACX,KAAA,MAAM,GAAGA,CAAM,GAGjB;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAW;AACX,WAAOuC,EAAA,MAAKqd;AAAA,EAChB;AAAA,EAEA,IAAI,IAAW;AACX,WAAOrd,EAAA,MAAKsd;AAAA,EAChB;AAAA,EAEA,IAAI,IAAW;AACX,WAAOtd,EAAA,MAAKud;AAAA,EAChB;AAAA,EAEA,IAAI,KAAa;AACN,WAAAvd,EAAA,MAAK6d,IAAL,WAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,IAAI,KAAa;AACN,WAAA7d,EAAA,MAAK6d,IAAL,WAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,IAAI,KAAa;AACN,WAAA7d,EAAA,MAAK6d,IAAL,WAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,IAAI,KAAa;AACN,WAAA7d,EAAA,MAAK6d,IAAL,WAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,IAAI,KAAa;AACN,WAAA7d,EAAA,MAAK6d,IAAL,WAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,IAAI,KAAa;AACN,WAAA7d,EAAA,MAAK6d,IAAL,WAAiB,KAAK;AAAA,EACjC;AAAA,EAEA,IAAI,cAAuB;AAOvB,WANI,QAAK,GAAG,WAAW,KAAK,EAAE,KAG1B,KAAK,GAAG,WAAW,KAAK,EAAE,KAG1B,KAAK,GAAG,WAAW,KAAK,EAAE;AAAA,EAKlC;AAAA,EAEA,IAAI,gBAAyB;AACzB,WAAO,KAAK,GAAG,WAAW,QAAQ,KAAK,GAAG,UAAU,KAChD,KAAK,GAAG,WAAW,QAAQ,KAAK,GAAG,UAAU;AAAA,EACrD;AAAA,EAEA,IAAI,YAAqB;AACd,WAAA,KAAK,GAAG,WAAW,QAAQ,KAAK,GAAG,UAAU,KAChD,KAAK,GAAG,WAAW,QAAQ,KAAK,GAAG,UAAU,KAC7C,KAAK,GAAG,WAAW,QAAQ,KAAK,GAAG,UAAU;AAAA,EACrD;AAAA,EAEA,IAAI,QAAgD;AAChD,WAAO7d,EAAA,MAAKwd;AAAA,EAChB;AAAA,EAEA,IAAI,eAAwC;AACxC,WAAOxd,EAAA,MAAK0d;AAAA,EAChB;AA2PJ;AA1VIL,IAAA,eACAC,IAAA,eACAC,KAAA,eACAC,KAAA,eAKAC,KAAA,eAKAC,KAAA,eA6LAC,KAAA,eAmBAC,KAAA,eAkBAC,KAAA,eAOAC,KAAA,eA2DAC,KAAA;AAlTG,IAAMuB,KAANtB;ACIK,IAAAuB,uBAAAA,OACRA,EAAAC,EAAA,WAAA,CAAA,IAAA,YACAD,EAAAC,EAAA,WAAA,CAAA,IAAA,YACAD,EAAAC,EAAA,SAAA,CAAA,IAAA,UACAD,EAAAC,EAAA,iBAAA,CAAA,IAAA,kBACAD,EAAAC,EAAA,kBAAA,CAAA,IAAA,mBACAD,EAAAC,EAAA,aAAA,CAAA,IAAA,cACAD,EAAAC,EAAA,aAAA,CAAA,IAAA,cAPQD,IAAAA,MAAA,CAAA,CAAA,GxBTZpG,IAAAC,IAAApX,IAAAyd,IAAAC,IAAAC,IAAAC;AwBmBO,MAAMC,GAAQ;AAAA,EAOjB,YAAYtE,GAAgBrB,GAA+B;AAPxD,IAAAza,EAAA,MAAAkgB;AACH,IAAAlgB,EAAA,MAAA0Z;AACA,IAAA1Z,EAAA,MAAA2Z;AACA,IAAA3Z,EAAA,MAAAuC;AAEA,IAAAvC,EAAA,MAAAggB,IAA0B;AA6G1B,IAAAhgB,EAAA,MAAAigB,IAAU,CAACI,MAA2B;AAC9B,UAAA9f,EAAA,MAAKgC,QAAc;AACb,cAAA,IAAI,MAAM,sBAAsB;AAGtC,UAAAhC,EAAA,MAAKyf,QAAY;AACjB,eAAOK,IAAQ9f,EAAA,MAAKgC,IAAU,MAAMhC,EAAA,MAAKgC,IAAU;AAGvD,YAAMmB,IAAmB,CAAA;AAGjB,aAF6B,CAAC,KAAK,KAAK,GAAG,EAE3C,QAAQ,CAAC0E,MAA4B;AACzC,YAAI,KAAK,OAAOA,CAAM,EAAE;AACb,UAAA1E,EAAA,KAAK,GAAG0E,CAAM,IAAI;AAAA,aACtB;AACG,gBAAA5C,IAAI,IAAI2J,EAAQ/G,CAAM,EAAE,SAAS,KAAK,OAAOA,CAAM,CAAC;AACnD,UAAA1E,EAAA;AAAA,YACH2c,IACI,MAAM7a,EAAE,GAAG,UACX,IAAIA,EAAE,OAAO;AAAA,UAAA;AAAA,QAEzB;AAAA,MAAA,CACH,GAEM9B,EAAO,KAAK,GAAG,IAAI,OAAO2c,IAAQ,KAAK,aAAa,MAAM,KAAK,aAAa;AAAA,IAAA;AAiBvF,IAAApgB,EAAA,0BAAmB,CAACC,MAA0C;AAC1D,YAAMsa,IAAW,KAAK,OAAO,WAAWta,EAAE,MAAM,EAAE,OAC5CogB,IAAK,KAAK,OAAO,OACjBC,IAAKrgB,EAAE,OAAO;AAEhB,aAAAsa,IAAW8F,IAAKC,IACT,IAGP/F,MAAa8F,IAAKC,IACX,IAGP/F,MAAa,KAAK,IAAI8F,IAAKC,CAAE,IACtB,IAGP/F,IAAW,KAAK,IAAI8F,IAAKC,CAAE,IACpB,IAGR/F,MAAW,IACH8F,MAAKC,IAAK,IAAuC,IAGrD;AAAA,IAAA;AAIX,IAAAtgB,EAAA,yBAAkB,CAACuF,MAAsB;AxB5M7C,UAAA6D;AwB6Me,eAAAA,IAAA9I,EAAA,MAAKgC,QAAL,gBAAA8G,EAAgB,KAAK;AAAA,QACxB,GAAG7D,EAAE;AAAA,QACL,GAAGA,EAAE;AAAA,QACL,GAAGA,EAAE;AAAA,MACR,OAAK;AAAA,IAAA;AAtLN,WAAIsW,KAAUrB,MACVta,EAAA,MAAKuZ,IAAUoC,IACV3b,EAAA,MAAAwZ,IAAgB,IAAI/X,EAAS6Y,CAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IACvDhX,EAAA,MAAKyc,IAAAC,IAAL,aAEG;AAAA,EACX;AAAA,EAEA,YAAYpP,GAAkC;AAC1C,UAAMxN,IAAM,IAAIiN,EAASO,CAAO,EAAE,SAAA,EAAW,UAGvCvH,IAAU,CAAC,KAAK,KAAK,GAAG;AAE1B,QAAAA,EAAQ,KAAK,CAACpB,MAAW7E,EAAI,OAAO6E,CAAM,EAAE,UAAU,CAAC;AACvD,aAAO,KAAK;AAGhB,UAAMhG,IAAcmB,EAAI,KAAK,cAAc,GAAG,GAAG,EAAE;AACnD,WAAIiG,EAAQ,KAAK,CAACpB,MAAW7E,EAAI,KAAK,cAAc,GAAG6E,CAAM,EAAE,YAAY,WAAWhG,CAAW,CAAC,IACvF,KAAK,mBAGhBjC,EAAA,MAAKuZ,IAAU,IAAIzB;AAAA,MACf1U,EAAI,KAAK,cAAc,GAAG,GAAG,EAAE,YAAY,QAAQ,WAAW,OAAO,CAAC;AAAA,MACtEA,EAAI,KAAK,cAAc,GAAG,GAAG,EAAE,YAAY,QAAQ,WAAW,OAAO,CAAC;AAAA,MACtEA,EAAI,KAAK,cAAc,GAAG,GAAG,EAAE,YAAY,QAAQ,WAAW,OAAO,CAAC;AAAA,IAAA,IAG1EpD,EAAA,MAAKwZ,IAAgBpW,EAAI,KAAK,cAAc,CAAC,EACxC,YAAY,MAAQ,EAAA,SAAA,EACpB,IAAIhD,EAAA,MAAKmZ,IAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,EACjC,IAAInZ,EAAA,MAAKmZ,IAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EACjC,IAAInZ,EAAA,MAAKmZ,IAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,IAEtCjW,EAAA,MAAKyc,IAAAC,IAAL,YACO;AAAA,EACX;AAAA,EAEA,IAAI,SAAgB;AACZ,QAAA5f,EAAA,MAAKmZ,QAAY;AACX,YAAA,IAAI,MAAM,sBAAsB;AAE1C,WAAOnZ,EAAA,MAAKmZ;AAAA,EAChB;AAAA,EAEA,IAAI,eAAyB;AACrB,QAAAnZ,EAAA,MAAKoZ,QAAkB;AACjB,YAAA,IAAI,MAAM,sBAAsB;AAE1C,WAAOpZ,EAAA,MAAKoZ;AAAA,EAChB;AAAA,EAEA,IAAI,SAA0D;AACtD,QAAApZ,EAAA,MAAKoZ,QAAkB;AACjB,YAAA,IAAI,MAAM,sBAAsB;AAGtC,WAAApZ,EAAA,MAAKoZ,IAAc,aACZ;AAAA,MACH,KAAKpZ,EAAA,MAAKoZ,IAAc,MAAM,EAAE,KAAO,EAAA;AAAA,MACvC,SAASpZ,EAAA,MAAKoZ,IAAc,MAAM,EAAE,KAAO,EAAA;AAAA,MAC3C,OAAOpZ,EAAA,MAAKoZ,IAAc,MAAM,EAAE,KAAO,EAAA;AAAA,IAAA,IAGtC;AAAA,MACH,KAAK,UAAUpZ,EAAA,MAAKoZ,IAAc,GAAG;AAAA,MACrC,SAAS,QAAQpZ,EAAA,MAAKoZ,IAAc,OAAO;AAAA,MAC3C,OAAOpZ,EAAA,MAAKoZ,IAAc,MAAM,EAAE,KAAO,EAAA;AAAA,IAAA;AAAA,EAGrD;AAAA,EAEA,IAAI,WAAqB;AACjB,QAAApZ,EAAA,MAAKgC,QAAc;AACb,YAAA,IAAI,MAAM,sBAAsB;AAE1C,WAAOhC,EAAA,MAAKgC;AAAA,EAChB;AAAA,EAEA,gBAAsB;AAClB,WAAApC,EAAA,MAAKuZ,IAAU,SACfvZ,EAAA,MAAKwZ,IAAgB,SACrBxZ,EAAA,MAAKoC,IAAY,SACV;AAAA,EACX;AAAA,EAEA,IAAI,eAAqB;AACrB,WAAApC,EAAA,MAAK6f,IAAU,IACR;AAAA,EACX;AAAA,EAEA,IAAI,aAAmB;AACnB,WAAA7f,EAAA,MAAK6f,IAAU,IACR;AAAA,EACX;AAAA,EAGA,IAAI,MAAc;AACP,WAAAzf,EAAA,MAAK0f,IAAL,WAAa;AAAA,EACxB;AAAA,EAEA,IAAI,UAAkB;AACX,WAAA1f,EAAA,MAAK0f,IAAL,WAAa;AAAA,EACxB;AAgFJ;AA/LIvG,KAAA,eACAC,KAAA,eACApX,KAAA,eAEAyd,KAAA,eA6GAC,KAAA,eAlHGC,KAAA,eA+IHC,KAAyB,WAAA;AACrB,EAAAhgB,EAAA,MAAKoC,IAAY,IAAIiO;AAAA,IACjB,IAAIrB,EAAQ,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,EACzC;AAAA,MACG,IAAIA,EAAQ,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC;AAAA,IAAA,EAEjD;AAAA,MACG,IAAIA,EAAQ,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC;AAAA,IAClD;AAAA,IACJ,IAAIA,EAAQ,KAAK,YAAY;AAAA,IAC/B,OAAO;AACb;AC1KG,SAASqR,GAAYC,GAAgD;AACxE,QAAMrD,IAAS,OAAO;AAAA,IAClB;AAAA,MACI,UAAU;AAAA,MACV,KAAK;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACb;AAAA,IAAGqD;AAAA,EAAA,GAGD5f,IAAI,IAAIe;AAWd,MARIwb,EAAO,WAEPvc,EAAE,YAAY4W,EAAa2F,EAAO,KAAKA,EAAO,IAAI,IAGlDvc,EAAE,YAAY0W,GAAU6F,EAAO,OAAO,IAAI,GAAGA,EAAO,GAAG,GAGvDA,EAAO;AACP,IAAAvc,EAAE,cAAc;AAAA,OACb;AACH,QAAI6f,IAAgB;AACpB,WAAO7f,EAAE,gBAAgB6f,IAAgB;AACrC,MAAA7f,EAAE,cAAc0W,GAAU,GAAG6F,EAAO,GAAG,GACvCsD;AAAA,EAER;AAEA,SAAOtD,EAAO,UAAUvc,EAAE,OAAA,IAAWA;AACzC;AChCO,SAAS8f,GAASF,GAAuC;AAC5D,QAAMrD,IAAS,OAAO;AAAA,IAClB;AAAA,MACI,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IACV;AAAA,IAAGqD;AAAA,EAAA,GAGDrf,IAAI,IAAI4I;AASV,MANJ5I,EAAE,cAAcof,GAAY;AAAA,IACxB,MAAMpD,EAAO;AAAA,IACb,SAAS;AAAA,IACT,SAAS,CAACA,EAAO;AAAA,EAAA,CACpB,GAEGA,EAAO,QAAQ,SAAS,GAAG;AAE3B,eAAWzV,KAAKyV,EAAO,QAAQ,MAAM,EAAE;AACjC,MAAAhc,EAAA,UAAUuG,GAAG,CAAC;AAEpB,aAAS,IAAI,GAAG,IAAIyV,EAAO,QAAQ,KAAK;AACpC,YAAMzV,IAAIiQ,GAAWwF,EAAO,QAAQ,MAAM,EAAE,CAAC;AAC3C,MAAAhc,EAAA,UAAUuG,GAAGvG,EAAE,OAAOuG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAAA,IAC7C;AAAA,EAAA;AAEA,IAAAvG,EAAE,UAAUgc,EAAO,SAASA,EAAO,MAAM;AAGtC,SAAAhc;AACX;ACjCA,MAAMwf,KAAmB;AAAA,EACrB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AACd;AAEO,SAASC,GAAWJ,GAA2C;AAClE,QAAMrD,IAAS,OAAO;AAAA,IAClBwD;AAAA,IACAH;AAAA,EAAA,GAMEjb,IAAI,IAAI2J,EAAQ,EAAE,MAAM;AAE1B,MAAA/N;AAEJ,WAAS7C,IAAI6e,EAAO,QAAQ7e,KAAK,GAAGA;AAEhC,IAAA6C,IAAIuf,GAAS;AAAA,MACT,SAASvD,EAAO;AAAA,MAChB,QAAQ7e;AAAA,MACR,UAAU6e,EAAO;AAAA,MACjB,MAAO7e,MAAM6e,EAAO,SAAU,KAAQA,EAAO;AAAA,IAAA,CAChD,GAGGA,EAAO,QAAQA,EAAO,WAAW7e,KACjC6C,EAAE,YAAY,OAIlBoE,EAAE,IAAIpE,CAAC;AASP,MALAgc,EAAO,YAAY5X,EAAE,gBAAgB,YAAY,gBAC/CA,EAAA,cAAA,EAAgB,YAAY,SAAS,GAIvC4X,EAAO,kBACJA,EAAO,iBAAiB,KACxBA,EAAO,iBAAiB5X,EAAE;AACtB,WAAAA,EAAE,SAAS4X,EAAO,kBAAgB;AAErC,YAAMjZ,IAAQoT,GAAU,GAAG/R,EAAE,SAAS,CAAC;AAErC,MAAAA,EAAA,OAAO,OAAOrB,GAAO,CAAC;AAAA,IAC5B;AAGJ,SAAOqB,EAAE;AACb;AC7DO,SAASsb,GAAYL,GAA6C;AACrE,QAAMrD,IAAS,OAAO;AAAA,IAClB;AAAA,MACI,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,UAAU;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,MAChB;AAAA,IACJ;AAAA,IAAGqD;AAAA,EAAA,GAGDjb,IAAI,IAAI2J,EAAQ,EAAE,IAAI;AAE5B,WAAS,IAAI,GAAG,IAAIiO,EAAO,QAAQ,KAAK;AACpC,UAAMnP,IAAS4S,GAAW;AAAA,MACtB,QAAQ;AAAA,MACR,MAAMzD,EAAO;AAAA,MACb,UAAUA,EAAO;AAAA,MACjB,SAASA,EAAO;AAAA,MAChB,MAAMA,EAAO;AAAA,IAAA,CAChB;AACD,IAAA5X,EAAE,SAASyI,CAAM;AAAA,EACrB;AAEO,SAAA,IAAIuC,EAAShL,GAAG,CAAC;AAC5B;AClCO,SAASub,GAAUN,GAA+C;AACrE,QAAMrD,IAKF,OAAO;AAAA,IACP;AAAA,MACI,MAAM;AAAA,MACN,UAAU;AAAA,MACV,KAAK;AAAA,MACL,UAAU;AAAA,IACd;AAAA,IAAGqD;AAAA,EAAA,GAEDO,IAAQ5D,EAAO,SAAS,KAC1B6D,IAAQ7D,EAAO,SAAS,KAGtBjf,IAAIif,EAAO,WACboD,GAAY,EAAE,KAAKpD,EAAO,KAAK,MAAM4D,EAAO,CAAA,IAC5C,IAAIpf,EAAS6V,EAAa2F,EAAO,KAAK4D,CAAK,CAAC,GAE1CzZ,IAAI6V,EAAO,WACboD,GAAY,EAAE,KAAKpD,EAAO,KAAK,MAAM6D,EAAO,CAAA,IAC5C,IAAIrf,EAAS6V,EAAa2F,EAAO,KAAK6D,CAAK,CAAC;AAEhD,SAAI,OAAO7D,EAAO,QAAQ,MAAM,MAC5Bjf,EAAE,IAAI,GACNoJ,EAAE,IAAI,IAEN,OAAO6V,EAAO,QAAQ,MAAM,MACxBjf,EAAE,gBACFA,EAAE,SAAS,GAEXoJ,EAAE,gBACFA,EAAE,SAAS,IAGf,OAAO6V,EAAO,QAAQ,MAAM,MACxBjf,EAAE,gBACFA,EAAE,SAAS,GAEXoJ,EAAE,gBACFA,EAAE,SAAS,IAGf,OAAO6V,EAAO,QAAQ,MAAM,MACxBjf,EAAE,gBACFA,EAAE,SAAS,GAEXoJ,EAAE,gBACFA,EAAE,SAAS,IAIZ,IAAI0Q,EAAM9Z,GAAGoJ,CAAC;AACzB;ACzDO,SAAS2Z,GAAUT,GAAiD;AACvE,QAAMrD,IAAS,OAAO;AAAA,IAClB;AAAA,MACI,QAAQ;AAAA,QACJ,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG;AAAA,QACvB,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG;AAAA,MAC3B;AAAA,MACA,gBAAgB;AAAA,IACpB;AAAA,IAAGqD;AAAA,EAAA,GAED3E,IAASiF,GAAU3D,EAAO,MAAM;AAEtC,MAAI+D,GAAIna;AACJ,SAAAoW,EAAO,mBAAmB,KACrB+D,IAAA5J,GAAU,GAAG,CAAC,GACfvQ,IAAIma,KAAM,KAAKA,IAAK,MAAM,KAE1Bna,IAAAuQ,GAAU,GAAG,EAAE,GAGhB,IAAI2E,GAAOJ,GAAQ9U,GAAG,EAAI;AACrC;ACrBO,SAASoa,GAAQX,GAA6C;AACjE,QAAMrD,IAAS,OAAO;AAAA,IAClB;AAAA,MACI,GAAG;AAAA,QACC,GAAG3F,EAAa,EAAE;AAAA,QAClB,GAAGA,EAAa,EAAE;AAAA,MACtB;AAAA,IACJ;AAAA,IAAGgJ;AAAA,EAAA,GAGDtb,IAAI,IAAI+R;AAAA,IACVO,EAAa,EAAE;AAAA,IACfA,EAAa,EAAE;AAAA,EAAA;AAGnB,SAAOtS,EAAE;AACH,IAAAA,EAAA,IAAIsS,EAAa,EAAE,GACnBtS,EAAA,IAAIsS,EAAa,EAAE;AAGrB,SAAA2F,EAAO,UAAU,IACbjY,EAAE,EAAE,KAAA,MAAWA,EAAE,EAAE,UACnBA,EAAE,EAAE,aAEDiY,EAAO,UAAU,MACpBjY,EAAE,EAAE,KAAA,MAAWA,EAAE,EAAE,UACnBA,EAAE,EAAE,YAIL,IAAIsU,EAAO,EAAA,sBAAsB,IAAIvC,EAAOkG,EAAO,EAAE,GAAGA,EAAO,EAAE,CAAC,GAAGjY,CAAC;AACjF;AC9BO,SAASkc,GAASZ,GAA+C;AACpE,QAAMrD,IAAS,OAAO;AAAA,IAClB;AAAA,MACI,GAAG;AAAA,QACC,GAAG3F,EAAa,EAAE;AAAA,QAClB,GAAGA,EAAa,EAAE;AAAA,QAClB,GAAGA,EAAa,EAAE;AAAA,MACtB;AAAA,MACA,WAAW;AAAA,QACP,GAAGA,EAAa,EAAE;AAAA,QAClB,GAAGA,EAAa,EAAE;AAAA,QAClB,GAAGA,EAAa,EAAE;AAAA,MACtB;AAAA,IACJ;AAAA,IAAGgJ;AAAA,EAAA,GAGD3Z,IAAI,IAAImR,EAAMmF,EAAO,EAAE,GAAGA,EAAO,EAAE,GAAGA,EAAO,EAAE,CAAC,GAChDjY,IAAI,IAAI+R,EAAOkG,EAAO,UAAU,GAAGA,EAAO,UAAU,GAAGA,EAAO,UAAU,CAAC;AAExE,SAAA,IAAIN,GAAMhW,GAAG3B,CAAC;AACzB;ACHO,MAAMmc,KAAS;AAAA,EAClB,UAAU,CAAClE,MACA0D,GAAY1D,CAAM;AAAA,EAG7B,SAAS,CAACA,MACCyD,GAAWzD,CAAM;AAAA,EAG5B,OAAO,CAACA,MACGuD,GAASvD,CAAM;AAAA,EAG1B,UAAU,CAACA,MACAoD,GAAYpD,CAAM;AAAA,EAG7B,QAAQ,CAACmE,GAAcC,GAAYhK,MACxBD,GAAUgK,GAAMC,GAAIhK,CAAO;AAAA,EAGtC,WAAW,CAACE,GAAa+J,MACdhK,EAAaC,GAAK+J,CAAS;AAAA,EAGtC,OAAO,CAAC/J,MACGC,GAAYD,CAAG;AAAA,EAG1B,MAAM,CAACJ,MACID,GAAWC,CAAO;AAAA,EAG7B,OAAO,CAAI1Z,GAAUka,MACVD,GAAYja,GAAKka,CAAM;AAAA,EAGlC,MAAM,CAAIla,MACCga,GAAWha,CAAG;AAAA,EAGzB,SAAS,CAAIA,MACFma,GAAana,CAAG;AAAA,EAG3B,MAAM,CAACwf,MACIgE,GAAQhE,CAAM;AAAA,EAGzB,OAAO,CAACA,MACGiE,GAASjE,CAAM;AAAA,EAG1B,QAAQ,CAACA,MACE2D,GAAU3D,CAAM;AAAA,EAG3B,OAAO,CAACA,MAAuC;AACrC,UAAA5K,IAASuO,GAAU3D,CAAM;AAC/B,WAAA5K,EAAO,UAAU,IAEVA;AAAA,EACX;AAAA,EAEA,QAAQ,CAAC4K,MACE8D,GAAU9D,CAAM;AAE/B,GC1DMsE,KAAS;AAAA,EACX,SAAAjiB;AAAA,EACA,UAAAmC;AAAA,EACA,MAAMK;AAAA,EACN,OAAA+H;AAAA,EACA,SAAAmF;AAAA,EACA,UAAAqB;AAAA,EACA,QAAAwM;AAAA,EACA,cAAA/J;AAAA,EACA,QAAA7B;AAAA,EACA,YAAA0E;AAAA,EACA,YAAAzC;AAAA,EACA,QAAAiO;AAAA,EACA,UAAU;AAAA,IACN,QAAApK;AAAA,IACA,OAAAe;AAAA,IACA,MAAAwB;AAAA,IACA,UAAAoG;AAAA,IACA,QAAA3D;AAAA,IACA,OAAAY;AAAA,IACA,QAAAa;AAAA,IACA,SAAAyC;AAAA,EACJ;AAAA,EAAA,QACAuB;AACJ;","x_google_ignoreList":[4]}
1
+ {"version":3,"file":"pimath.js","sources":["../src/numeric.ts","../src/coefficients/fraction.ts","../src/coefficients/nthRoot.ts","../src/algebra/equationSolver.ts","../node_modules/piexpression/dist/piexpression.js","../src/algebra/monom.ts","../src/helpers.ts","../src/algebra/polynom.ts","../src/algebra/equation.ts","../src/algebra/factor.ts","../src/algebra/linearSystem.ts","../src/algebra/logicalset.ts","../src/algebra/polyFactor.ts","../src/geometry/geomMath.ts","../src/geometry/vector.ts","../src/pimath.interface.ts","../src/randomization/rndHelpers.ts","../src/geometry/point.ts","../src/geometry/line.ts","../src/geometry/circle.ts","../src/geometry/line3.ts","../src/geometry/matrix.ts","../src/geometry/plane3.ts","../src/geometry/triangle.ts","../src/geometry/sphere3.ts","../src/randomization/coefficient/rndFraction.ts","../src/randomization/algebra/rndMonom.ts","../src/randomization/algebra/rndPolynom.ts","../src/randomization/algebra/rndEquation.ts","../src/randomization/geometry/rndVector.ts","../src/randomization/geometry/rndCircle.ts","../src/randomization/geometry/rndLine.ts","../src/randomization/geometry/rndLine3.ts","../src/randomization/random.ts","../src/index.ts"],"sourcesContent":["\r\nfunction decompose(value: number): number[][] {\r\n const divs: number[] = dividers(value)\r\n const arr: number[][] = []\r\n let u, v\r\n\r\n while (divs.length > 0) {\r\n u = divs.shift() ?? 1\r\n v = (divs.length > 0 ? divs.pop() : +u) ?? 1\r\n\r\n arr.push([u, v])\r\n }\r\n\r\n return arr\r\n}\r\n\r\nfunction divideNumbersByGCD(...values: number[]): number[] {\r\n const g = greatestCommonDivisor(...values)\r\n\r\n return values.map(x => x / g)\r\n}\r\n\r\n/**\r\n * Get the list of all dividers of a number.\r\n * @param value\r\n */\r\nfunction dividers(value: number): number[] {\r\n const absV = Math.abs(value)\r\n const maxV = Math.sqrt(absV)\r\n\r\n // Initialize the list of dividers.\r\n const D: number[] = []\r\n\r\n for (let i = 1; i <= maxV; i++) {\r\n if (value % i === 0) {\r\n D.push(i)\r\n D.push(absV / i)\r\n }\r\n }\r\n\r\n // Order numbers.\r\n D.sort(function (a, b) {\r\n return a - b\r\n })\r\n\r\n // Make sure the array of value is unique.\r\n return [...new Set(D)]\r\n}\r\n\r\n/**\r\n * Great Common Divisor\r\n * @param values : number values\r\n */\r\nfunction greatestCommonDivisor(...values: number[]): number {\r\n // Define the gcd for two number\r\n const gcd2 = function (a: number, b: number): number {\r\n if (b === 0) {\r\n return a\r\n }\r\n return gcd2(b, a % b)\r\n }\r\n\r\n let g = 1,\r\n i = 2\r\n\r\n // Nothing is given\r\n if (values.length === 0) {\r\n return 1\r\n }\r\n // Only one number is given\r\n if (values.length === 1) {\r\n // The first number is zero\r\n if (values[0] === 0) {\r\n return 1\r\n }\r\n // Return the number\r\n return values[0]\r\n }\r\n\r\n // We have at least 2 numbers.\r\n g = gcd2(values[0], values[1])\r\n\r\n // The gcd of the two first value is one ? It's already finished.\r\n if (g === 1) {\r\n return 1\r\n }\r\n\r\n // The current gcd isn't one. Continue with all next values.\r\n for (i = 2; i < values.length; i++) {\r\n g = gcd2(g, values[i])\r\n // Escape if gcd is already one.\r\n if (g === 1) {\r\n break\r\n }\r\n }\r\n\r\n return Math.abs(g)\r\n}\r\n\r\n/**\r\n * Least Common Multiple\r\n * @param values: list of numbers\r\n */\r\nfunction leastCommonMultiple(...values: number[]): number {\r\n return values.reduce(function (a, b) {\r\n return Math.abs(a * b / greatestCommonDivisor(a, b))\r\n })\r\n}\r\n\r\nfunction numberCorrection(value: number, number_of_digits = 3) {\r\n return +value.toFixed(number_of_digits)\r\n}\r\n\r\nfunction periodic(value: number): number {\r\n if (Number.isSafeInteger(value)) {\r\n return 0\r\n }\r\n\r\n // Assume it's with decimal.\r\n const decimal = (value.toString()).split('.')[0]\r\n\r\n // The decimal part is limited\r\n if (decimal.length < 10) {\r\n return 0\r\n }\r\n\r\n // Find the periodic if it exists.\r\n throw new Error('Periodic value: Not implemented yet')\r\n}\r\n\r\n/**\r\n * Get the list of the nth first prime numbers.\r\n * @param nb : number of primes to choose from\r\n */\r\nfunction primes(nb?: number): number[] {\r\n const primesValues: number[] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]\r\n if (nb === undefined) {\r\n return primesValues\r\n } else {\r\n return primesValues.slice(0, Math.min(primesValues.length, nb))\r\n }\r\n}\r\n\r\nfunction pythagoreanTripletsWithTarget(target: number, targetIsSquare?: boolean): number[][] {\r\n // méthode inverse, à partir du triplet.\r\n const triplets = [],\r\n targetValue = targetIsSquare === true ? +target : target ** 2\r\n for (let u = 0; u <= target; u++) {\r\n for (let v = 0; v <= target; v++) {\r\n if (u ** 2 + v ** 2 === targetValue) {\r\n triplets.push([u, v, target])\r\n }\r\n }\r\n }\r\n\r\n return triplets\r\n}\r\n\r\nfunction round(value: number, decimals = 2): number {\r\n const exp: number = Math.round(Number(`${value}e${decimals}`))\r\n\r\n return Number(`${exp}e-${decimals}`)\r\n}\r\n\r\n\r\nexport const Numeric = {\r\n decompose,\r\n dividers,\r\n divideNumbersByGCD,\r\n gcd: greatestCommonDivisor,\r\n lcm: leastCommonMultiple,\r\n numberCorrection,\r\n periodic,\r\n primes,\r\n pythagoreanTripletsWithTarget,\r\n round\r\n}","import type {compareSign, IExpression, InputValue, IPiMathObject} from \"../pimath.interface\"\r\nimport {Numeric} from \"../numeric\"\r\n\r\nenum FRAC_TYPE {\r\n frac = 'frac',\r\n dfrac = 'dfrac',\r\n tfrac = 'tfrac'\r\n}\r\n\r\n/**\r\n * The fraction class make possible to handle\r\n * \\\\(\\frac{a}{b}\\\\) or \\\\[\\frac{a}{b}\\\\] values.\r\n */\r\nexport class Fraction implements IPiMathObject<Fraction>, IExpression<Fraction> {\r\n #approximative = false\r\n #denominator = 1\r\n #numerator = 1\r\n #type: FRAC_TYPE = FRAC_TYPE.frac\r\n\r\n constructor()\r\n constructor(value: InputValue<Fraction>)\r\n constructor(numerator: number, denominator: number)\r\n constructor(decimal: number, periodLength: number)\r\n constructor(value?: InputValue<Fraction>, denominatorOrPeriodic?: number) {\r\n\r\n if (value !== undefined) {\r\n this.parse(value, denominatorOrPeriodic)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse the value to get the numerator and denominator\r\n * @param value : number or string to parse to get the fraction\r\n * @param denominatorOrPeriodic (optional|number) : length of the periodic part: 2.333333 => 1 or denominator value\r\n */\r\n public parse = (value: InputValue<Fraction>, denominatorOrPeriodic?: number): Fraction => {\r\n let S: string[]\r\n\r\n // A null value means a zero fraction.\r\n if (value === \"\") {\r\n this.#numerator = 0\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n switch (typeof value) {\r\n case \"string\":\r\n // Split the string value in two parts: Numerator/Denominator\r\n S = value.split('/')\r\n\r\n // Security checks\r\n if (S.length > 2) {\r\n throw new Error(`The given value is not a valid fraction (${value})`)\r\n }\r\n if (S.map(x => x === '' || isNaN(Number(x))).includes(true)) {\r\n throw new Error(`The given value is not a valid fraction (${value})`)\r\n }\r\n\r\n if (S.length === 1) {\r\n // No divide sign - it's a number\r\n return this.parse(+S[0])\r\n } else if (S.length === 2) {\r\n // One divide signe\r\n // We check if the denominator is zero\r\n if (S[1] === '0') {\r\n this.#numerator = NaN\r\n this.#denominator = 1\r\n } else {\r\n this.#numerator = +S[0]\r\n this.#denominator = +S[1]\r\n }\r\n } else {\r\n // More than one divide sign ?\r\n // This is impossible\r\n this.#numerator = NaN\r\n this.#denominator = 1\r\n }\r\n break\r\n case \"number\":\r\n if (Number.isSafeInteger(value)) {\r\n // The given value is an integer\r\n this.#numerator = +value\r\n\r\n if (denominatorOrPeriodic === undefined || !Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this.#denominator = 1\r\n } else {\r\n this.#denominator = +denominatorOrPeriodic\r\n }\r\n } else {\r\n // The given value is a float number\r\n // Get the number of decimals after the float sign\r\n const [, decimal] = (value.toString()).split('.')\r\n const p: number = decimal ? decimal.length : 0\r\n\r\n // Detect if the decimal part is periodic or not...\r\n\r\n // Transform the float number in two integer\r\n if (denominatorOrPeriodic === undefined) {\r\n this.#numerator = value * Math.pow(10, p)\r\n this.#denominator = Math.pow(10, p)\r\n } else if (Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this.#numerator = value * Math.pow(10, p) - Math.floor(value * Math.pow(10, p - denominatorOrPeriodic))\r\n this.denominator = Math.pow(10, p) - Math.pow(10, p - denominatorOrPeriodic)\r\n }\r\n\r\n this.reduce()\r\n }\r\n break\r\n case \"object\":\r\n if (value instanceof Fraction) {\r\n this.#numerator = +value.numerator\r\n this.#denominator = +value.denominator\r\n }\r\n break\r\n }\r\n return this\r\n }\r\n\r\n public clone = (): Fraction => {\r\n const F = new Fraction()\r\n F.numerator = +this.#numerator\r\n F.denominator = +this.#denominator\r\n return F\r\n }\r\n\r\n public static average = (...fractions: (InputValue<Fraction>)[]): Fraction => {\r\n const M = new Fraction().zero()\r\n\r\n for (const f of fractions) {\r\n M.add(f)\r\n }\r\n\r\n M.divide(fractions.length)\r\n\r\n return M\r\n }\r\n\r\n public static max = (...fractions: InputValue<Fraction>[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (const m of fractions) {\r\n const compare = new Fraction(m)\r\n if (compare.isGreater(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n public static min = (...fractions: (InputValue<Fraction>)[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (const m of fractions) {\r\n const compare = new Fraction(m)\r\n if (compare.isLesser(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n public static sort = (fractions: (InputValue<Fraction>)[], reverse?: boolean): Fraction[] => {\r\n const fractionsObject: Fraction[] = fractions.map(f => f instanceof Fraction ? f : new Fraction(f))\r\n\r\n const sorted = fractionsObject.sort((a, b) => a.value - b.value)\r\n\r\n if (reverse) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n\r\n public static unique = (fractions: (InputValue<Fraction>)[]): Fraction[] => {\r\n const unique: Record<string, boolean> = {},\r\n distinct: Fraction[] = []\r\n\r\n fractions.forEach(x => {\r\n if (!(x instanceof Fraction)) {\r\n x = new Fraction(x)\r\n }\r\n\r\n if (!unique[x.clone().reduce().tex]) {\r\n distinct.push(x.clone())\r\n unique[x.tex] = true\r\n }\r\n })\r\n\r\n return distinct\r\n }\r\n\r\n public static xMultiply = (...values: (InputValue<Fraction>)[]): Fraction => {\r\n const R = new Fraction()\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n for (const value of values) {\r\n\r\n const F = new Fraction(value)\r\n R.numerator = R.numerator * F.numerator\r\n R.denominator = R.denominator * F.denominator\r\n }\r\n\r\n return R\r\n }\r\n\r\n public abs = (): this => {\r\n this.#numerator = Math.abs(this.#numerator)\r\n this.#denominator = Math.abs(this.#denominator)\r\n return this\r\n }\r\n\r\n public add = (F: InputValue<Fraction>): Fraction => {\r\n if (F instanceof Fraction) {\r\n const N: number = this.#numerator,\r\n D: number = this.#denominator\r\n\r\n this.#numerator = N * F.denominator + F.numerator * D\r\n this.#denominator = D * F.denominator\r\n } else {\r\n return this.add(new Fraction(F))\r\n }\r\n\r\n return this.reduce()\r\n }\r\n\r\n public amplify = (k: number): this => {\r\n if (Number.isSafeInteger(k)) {\r\n this.#numerator *= k\r\n this.#denominator *= k\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Simple function to determine if it's a fraction\r\n */\r\n public areEquals = (...F: Fraction[]): boolean => {\r\n return F.every(f => f.isEqual(F[0]))\r\n }\r\n\r\n // ------------------------------------------\r\n /**\r\n * Compare the current coefficient with another coefficient\r\n * @param F (Coefficient) The coefficient to _compare\r\n * @param sign (string| default is =): authorized values: =, <, <=, >, >= with some variations.\r\n */\r\n public compare = (F: InputValue<Fraction>, sign?: compareSign): boolean => {\r\n if (sign === undefined) {\r\n sign = '='\r\n }\r\n\r\n let compareFraction: Fraction\r\n if (F instanceof Fraction) {\r\n compareFraction = F.clone()\r\n } else {\r\n compareFraction = new Fraction(F)\r\n }\r\n\r\n switch (sign) {\r\n case '>':\r\n return this.value > compareFraction.value\r\n case \">=\":\r\n case \"=>\":\r\n case \"geq\":\r\n return this.value >= compareFraction.value\r\n case \"<\":\r\n return this.value < compareFraction.value\r\n case \"<=\":\r\n case \"=<\":\r\n case \"leq\":\r\n return this.value <= compareFraction.value\r\n case \"=\":\r\n // let F2: Fraction = compareFraction.clone().reduce(),\r\n // F1: Fraction = this.clone().reduce();\r\n // return (F1.numerator === F2.numerator && F1.denominator === F2.denominator);\r\n return this.value === compareFraction.value\r\n case \"<>\":\r\n return this.value !== compareFraction.value\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n public get denominator(): number {\r\n return this.#denominator\r\n }\r\n\r\n public set denominator(value: number) {\r\n this.#denominator = value\r\n }\r\n\r\n public get dfrac(): this {\r\n this.#type = FRAC_TYPE.dfrac\r\n return this\r\n }\r\n\r\n public get display(): string {\r\n if (this.isExact()) {\r\n if (this.#denominator === 1) {\r\n return `${this.#numerator}`\r\n } else {\r\n return `${this.#numerator}/${this.#denominator}`\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n public divide = (F: Fraction | number): Fraction => {\r\n const Q = new Fraction(F)\r\n\r\n if (Q.numerator === 0) {\r\n return new Fraction().infinite()\r\n }\r\n\r\n const N: number = +this.#numerator,\r\n D: number = +this.#denominator\r\n\r\n this.#numerator = N * Q.denominator\r\n this.#denominator = D * Q.numerator\r\n return this.reduce()\r\n }\r\n\r\n public get frac(): this {\r\n this.#type = FRAC_TYPE.frac\r\n return this\r\n }\r\n\r\n public infinite = (): this => {\r\n this.#numerator = Infinity\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n public invalid = (): this => {\r\n this.#numerator = NaN\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n public inverse = (): this => {\r\n const n = +this.#numerator\r\n this.#numerator = +this.#denominator\r\n this.#denominator = n\r\n\r\n return this\r\n }\r\n\r\n public isApproximative = (): boolean => {\r\n return this.#approximative ||\r\n this.#numerator.toString().length >= 15 && this.#denominator.toString().length >= 15\r\n }\r\n\r\n public isEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '=')\r\n }\r\n\r\n public isEven = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 0\r\n }\r\n\r\n public isExact = (): boolean => {\r\n return !this.isApproximative()\r\n }\r\n\r\n public isFinite = (): boolean => {\r\n return !this.isInfinity() && !this.isNaN()\r\n }\r\n\r\n public isGeq = (than: Fraction | number): boolean => {\r\n return this.compare(than, '>=')\r\n }\r\n\r\n public isGreater = (than: Fraction | number): boolean => {\r\n return this.compare(than, '>')\r\n }\r\n\r\n public isInfinity = (): boolean => {\r\n return Math.abs(this.#numerator) === Infinity\r\n }\r\n\r\n public isInverted = (p: Fraction): boolean => {\r\n return this.isEqual(new Fraction().one().divide(p.clone()))\r\n }\r\n\r\n public isLeq = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<=')\r\n }\r\n\r\n /* Compare shortcuts */\r\n public isLesser = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<')\r\n }\r\n\r\n public isNaN = (): boolean => {\r\n return isNaN(this.#numerator)\r\n }\r\n\r\n public isNatural = (): boolean => {\r\n return this.isRelative() && this.isPositive()\r\n }\r\n\r\n public isNegative = (): boolean => {\r\n return this.sign() === -1\r\n }\r\n\r\n public isNegativeOne = (): boolean => {\r\n return this.#numerator === -1 && this.#denominator === 1\r\n }\r\n\r\n public isNotEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<>')\r\n }\r\n\r\n // ------------------------------------------\r\n\r\n public isNotZero = (): boolean => {\r\n return this.#numerator !== 0\r\n }\r\n\r\n public isOdd = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 1\r\n }\r\n\r\n public isOne = (): boolean => {\r\n return this.#numerator === 1 && this.#denominator === 1\r\n }\r\n\r\n public isOpposite = (p: Fraction): boolean => {\r\n return this.isEqual(p.clone().opposite())\r\n }\r\n\r\n public isPositive = (): boolean => {\r\n return this.sign() === 1\r\n }\r\n\r\n public isRational = (): boolean => {\r\n return !this.isRelative()\r\n }\r\n\r\n public isReduced = (): boolean => {\r\n return Math.abs(Numeric.gcd(this.#numerator, this.#denominator)) === 1\r\n }\r\n\r\n public isRelative = (): boolean => {\r\n return this.clone().reduce().denominator === 1\r\n }\r\n\r\n public isSquare = (): boolean => {\r\n return Math.sqrt(this.#numerator) % 1 === 0 && Math.sqrt(this.#denominator) % 1 === 0\r\n }\r\n\r\n public isStrictlyNegative = (): boolean => {\r\n return this.value < 0\r\n }\r\n\r\n public isStrictlyPositive = (): boolean => {\r\n return this.value > 0\r\n }\r\n\r\n // Mathematical operations specific to fractions\r\n public isZero = (): boolean => {\r\n return this.#numerator === 0\r\n }\r\n\r\n public multiply = (F: Fraction | number): this => {\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n const Q = new Fraction(F)\r\n\r\n this.#numerator = this.#numerator * Q.numerator\r\n this.#denominator = this.#denominator * Q.denominator\r\n\r\n return this.reduce()\r\n }\r\n\r\n // ------------------------------------------\r\n public get numerator(): number {\r\n return this.#numerator\r\n }\r\n\r\n public set numerator(value: number) {\r\n this.#numerator = value\r\n }\r\n\r\n public one = (): this => {\r\n this.#numerator = 1\r\n this.#denominator = 1\r\n return this\r\n }\r\n\r\n public opposite = (): this => {\r\n this.#numerator = -this.#numerator\r\n return this\r\n }\r\n\r\n public pow = (p: number | Fraction): Fraction => {\r\n if (p instanceof Fraction) {\r\n return this.pow(p.value)\r\n }\r\n\r\n this.reduce()\r\n if (p < 0) {\r\n this.inverse()\r\n }\r\n\r\n // Check if numerator and denominator are roots of...\r\n // otherwise, convert to numeric.\r\n const controlNumerator = Math.floor(Math.pow(this.#numerator, Math.abs(p))),\r\n controlDenominator = Math.floor(Math.pow(this.#denominator, Math.abs(p)))\r\n\r\n if (controlNumerator ** Math.abs(p) === this.#numerator\r\n &&\r\n controlDenominator ** Math.abs(p) === this.#denominator) {\r\n this.#numerator = this.#numerator ** Math.abs(p)\r\n this.#denominator = this.#denominator ** Math.abs(p)\r\n } else {\r\n this.#numerator = this.#numerator ** Math.abs(p)\r\n this.#denominator = this.#denominator ** Math.abs(p)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public reduce = (): this => {\r\n const g = Numeric.gcd(this.#numerator, this.#denominator)\r\n this.#numerator = this.#numerator / g\r\n this.#denominator = this.#denominator / g\r\n\r\n if (this.#denominator < 0) {\r\n this.#denominator = -this.#denominator\r\n this.#numerator = -this.#numerator\r\n }\r\n return this\r\n }\r\n\r\n public root = (p: number): this => {\r\n\r\n // Check if they are perfect roots..\r\n if (p === 0) {\r\n return this\r\n }\r\n\r\n // If negative, inverse the fraction\r\n if (p < 0) {\r\n this.inverse()\r\n }\r\n\r\n // if p is not a safe integer, throw error\r\n if (!Number.isSafeInteger(p)) {\r\n throw new Error(\"The root must be an integer.\")\r\n }\r\n\r\n // if the fraction is negative and the root is even, throw error\r\n if (this.isNegative() && p % 2 === 0) {\r\n throw new Error(\"The root of a negative number must be odd.\")\r\n }\r\n\r\n // get the sign of the fraction and make it positive\r\n const sign = this.sign()\r\n this.abs()\r\n\r\n // Reduce the fraction\r\n this.reduce()\r\n\r\n // Check if numerator and denominator are roots of...\r\n // otherwise, convert to numeric.\r\n const controlNumerator = Math.floor(Math.pow(this.#numerator, Math.abs(1 / p))),\r\n controlDenominator = Math.floor(Math.pow(this.#denominator, Math.abs(1 / p)))\r\n\r\n this.#numerator = Math.pow(this.#numerator, Math.abs(1 / p))\r\n this.#denominator = Math.pow(this.#denominator, Math.abs(1 / p))\r\n\r\n if (controlNumerator !== this.#numerator\r\n ||\r\n controlDenominator !== this.#denominator) {\r\n // The fraction is not a perfect root - make it approximative\r\n this.#numerator = this.#numerator / this.#denominator\r\n this.#denominator = 1\r\n this.#approximative = true\r\n }\r\n\r\n // Restore the sign\r\n this.multiply(sign)\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n public sign = (): number => {\r\n return (this.#numerator * this.#denominator >= 0) ? 1 : -1\r\n }\r\n\r\n public sqrt = (): this => {\r\n return this.root(2)\r\n }\r\n\r\n public subtract = (F: Fraction | number): Fraction => {\r\n if (F instanceof Fraction) {\r\n return this.add(F.clone().opposite())\r\n } else {\r\n return this.add(-F)\r\n }\r\n }\r\n\r\n // Display getter\r\n public get tex(): string {\r\n if (this.isInfinity()) {\r\n return `${this.sign() === 1 ? '+' : '-'}\\\\infty`\r\n }\r\n\r\n\r\n if (this.isExact()) {\r\n if (this.#denominator === 1) {\r\n return `${this.#numerator}`\r\n } else if (this.#numerator < 0) {\r\n return `-\\\\${this.#type}{ ${-this.#numerator} }{ ${this.#denominator} }`\r\n } else {\r\n return `\\\\${this.#type}{ ${this.#numerator} }{ ${this.#denominator} }`\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n public get texWithSign(): string {\r\n return this.isPositive() ? `+${this.tex}` : this.tex\r\n }\r\n\r\n public get tfrac(): this {\r\n this.#type = FRAC_TYPE.tfrac\r\n return this\r\n }\r\n\r\n public get value(): number {\r\n const result = this.#numerator / this.#denominator\r\n return result === 0 ? 0 : result\r\n }\r\n\r\n public zero = (): this => {\r\n this.#numerator = 0\r\n this.#denominator = 1\r\n return this\r\n }\r\n}","// TODO: Remove NthRoot class\r\n/**\r\n * NthRoot is something like \"a+b\\sqrt{3}\r\n */\r\nexport class NthRoot {\r\n #radical: number\r\n #nth: number\r\n #coefficient: number\r\n #isValid: boolean\r\n\r\n constructor(...values: number[]) {\r\n this.#radical = 1\r\n this.#coefficient = 1\r\n this.#nth = 2\r\n this.#isValid = true\r\n\r\n if (values.length > 0) {\r\n this.parse(values[0], values[1], values[2])\r\n }\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get radical(): number {\r\n return this.#radical\r\n }\r\n\r\n set radical(value: number) {\r\n this.#radical = value\r\n }\r\n\r\n get nth(): number {\r\n return this.#nth\r\n }\r\n\r\n set nth(value: number) {\r\n if (Number.isSafeInteger(value) && value >= 2) {\r\n this.#nth = value\r\n } else {\r\n // Error setting the nth root.\r\n console.log('Error setting the nth root')\r\n this.#nth = 2\r\n }\r\n }\r\n\r\n get coefficient(): number {\r\n return this.#coefficient\r\n }\r\n\r\n set coefficient(value: number) {\r\n this.#coefficient = value\r\n }\r\n\r\n get tex(): string {\r\n let C: string\r\n\r\n if (this.#coefficient === 1) {\r\n C = ''\r\n } else if (this.#coefficient === -1) {\r\n C = '-'\r\n } else {\r\n C = this.#coefficient.toString()\r\n }\r\n\r\n if (this.#radical === 1) {\r\n return `${this.#coefficient}`\r\n } else {\r\n if (this.#nth === 2) {\r\n return `${C}\\\\sqrt{${this.#radical}}`\r\n } else {\r\n return `${C}\\\\sqrt[${this.#nth}]{${this.#radical}}`\r\n }\r\n }\r\n }\r\n\r\n get display(): string {\r\n let C: string\r\n\r\n if (this.#coefficient === 1) {\r\n C = ''\r\n } else if (this.#coefficient === -1) {\r\n C = '-'\r\n } else {\r\n C = this.#coefficient.toString()\r\n }\r\n\r\n if (this.#radical === 1) {\r\n return `${this.#coefficient}`\r\n } else {\r\n if (this.#nth === 2) {\r\n return `${C}sqrt{${this.#radical}}`\r\n } else {\r\n return `${C}root(${this.#nth}){${this.#radical}}`\r\n }\r\n }\r\n }\r\n\r\n get value(): number {\r\n return this.#coefficient * Math.pow(this.#radical, 1 / this.#nth)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n parse = (radical: number, nthroot?: number, coefficient?: number): this => {\r\n this.#coefficient = coefficient ?? 1\r\n this.#nth = nthroot ?? 2\r\n this.#radical = radical\r\n\r\n if (this.#nth % 2 === 0 && this.#radical < 0) {\r\n this.#isValid = false\r\n }\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n reduce = (): this => {\r\n // Max value to test.\r\n let V = Math.floor(Math.pow(this.#radical, 1 / this.#nth))\r\n while (V > 1) {\r\n if (this.#radical % Math.pow(V, this.#nth) === 0) {\r\n // It's dividable by V^n\r\n this.#coefficient *= V\r\n this.#radical = this.#radical / Math.pow(V, this.#nth)\r\n\r\n // Redifine the new testing value (this is optimization)\r\n V = Math.floor(Math.pow(this.#radical, 1 / this.#nth))\r\n continue\r\n }\r\n V--\r\n }\r\n return this\r\n }\r\n\r\n multiply = (N: NthRoot): this => {\r\n this.#radical *= N.radical\r\n return this.reduce()\r\n }\r\n\r\n // ------------------------------------------\r\n // Help functions\r\n // ------------------------------------------\r\n hasRadical = (): boolean => {\r\n return !(this.#radical === 1 || this.#radical === 0 || !this.#isValid)\r\n }\r\n}","import type {InputValue, ISolution} from \"../pimath.interface\"\r\nimport type {Polynom} from \"./polynom\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Numeric} from \"../numeric\"\r\nimport type {Equation} from \"./equation\"\r\n\r\nexport class EquationSolver {\r\n readonly #equation: Polynom\r\n readonly #variable: string\r\n\r\n constructor(left: Polynom | Equation, right?: Polynom, variable = \"x\") {\r\n this.#variable = variable\r\n\r\n if (Object.hasOwn(left, 'moveLeft')) {\r\n const equ = left as Equation\r\n this.#equation = equ.left.clone().subtract(equ.right)\r\n } else {\r\n this.#equation = (left as Polynom).clone().subtract(right ?? 0)\r\n }\r\n }\r\n\r\n public solve(): ISolution[] {\r\n const degree = this.#equation.degree().value\r\n if (degree === 0) {\r\n return []\r\n }\r\n\r\n if (degree === 1) {\r\n return this.#solveLinear()\r\n }\r\n\r\n if (degree === 2) {\r\n return this.#solveQuadratic()\r\n }\r\n\r\n // Try to solve by factorization -> exact solutions.\r\n const result = this.#solveByFactorization()\r\n if (result.length > 0) {\r\n return result\r\n }\r\n\r\n // Use approximative solutions, using bissection algorithm.\r\n return this.#solveByBissection()\r\n }\r\n\r\n public solveAsCardan(): ISolution[] {\r\n if (this.#equation.degree().value !== 3) {\r\n throw new Error(\"The equation is not cubic.\")\r\n }\r\n return this.#solveCubic_CardanFormula()\r\n }\r\n\r\n #makeApproximativeSolution(value: number, output?: { tex: string, display: string }): ISolution {\r\n return {\r\n variable: this.#variable,\r\n exact: false,\r\n value: +value.toFixed(10),\r\n tex: output?.tex ?? '',\r\n display: output?.display ?? ''\r\n }\r\n }\r\n\r\n #makeSolution(value: InputValue<Fraction>): ISolution {\r\n if (value instanceof Fraction && value.isApproximative()) {\r\n return this.#makeApproximativeSolution(value.value)\r\n }\r\n\r\n const fraction = new Fraction(value)\r\n return {\r\n variable: this.#variable,\r\n exact: fraction,\r\n value: fraction.value,\r\n tex: fraction.tex,\r\n display: fraction.display\r\n }\r\n }\r\n\r\n #solveByBissection(): ISolution[] {\r\n const solutions: ISolution[] = []\r\n const degree = this.#equation.degree().value\r\n const coeffs = this.#equation.getCoefficients().map(x=>x.value)\r\n\r\n // Calculate the Cauchy Bounds.\r\n const [a, ...values] = this.#equation.getCoefficients()\r\n const B = 1 + Math.max(...values.map(x => x.value / a.value))\r\n\r\n // Cut the [-B;B] interval in *n* parts\r\n\r\n // Calculate the value at each points\r\n const n = 100\r\n const dx = 2 * B / n\r\n const evaluatedPoints: { x: number, fx: number }[] = []\r\n for (let searchValue = -B; searchValue <= B; searchValue += dx) {\r\n const x = Numeric.numberCorrection(searchValue)\r\n evaluatedPoints.push(\r\n {\r\n x,\r\n fx: this.#equation.evaluate(x, true) as number\r\n }\r\n )\r\n }\r\n\r\n // Sort every points\r\n evaluatedPoints.sort((a, b) => a.x - b.x)\r\n\r\n // Check if there is a least n opposite couples\r\n const couples: [number, number][] = []\r\n evaluatedPoints.forEach((value, index) => {\r\n if (index > 0) {\r\n if (value.fx === 0) {\r\n couples.push([value.x, value.x])\r\n } else if (evaluatedPoints[index - 1].fx * value.fx < 0) {\r\n couples.push([\r\n evaluatedPoints[index - 1].x,\r\n value.x\r\n ])\r\n\r\n }\r\n }\r\n })\r\n\r\n // All solutions fund !\r\n couples.forEach(couple => {\r\n const [a, b] = couple\r\n\r\n if (a === b) {\r\n // Exact solution\r\n solutions.push(this.#makeSolution(a))\r\n }else{\r\n const bissection = this.#solveByBissection_algorithm(coeffs, a, b)\r\n if(bissection!==null) {\r\n solutions.push(this.#makeApproximativeSolution(bissection))\r\n }\r\n }\r\n })\r\n\r\n return solutions\r\n }\r\n\r\n #solveByBissection_algorithm(coeffs: number[], a: number, b: number, tol = 1e-10): number | null {\r\n let fa = this.#equation.evaluate(a, true) as number\r\n let fb = this.#equation.evaluate(b, true) as number\r\n\r\n if (fa * fb > 0) {\r\n console.log(\"Pas de racine dans l'intervalle donné\")\r\n return null\r\n }\r\n\r\n let mid: number\r\n while ((b - a) / 2 > tol) {\r\n mid = (a + b) / 2\r\n const fmid = this.#equation.evaluate( mid, true) as number\r\n\r\n if (fmid === 0) {\r\n return mid // racine exacte trouvée\r\n } else if (fa * fmid < 0) {\r\n b = mid\r\n fb = fmid\r\n } else {\r\n a = mid\r\n fa = fmid\r\n }\r\n }\r\n return (a + b) / 2 // retourner la racine approximative\r\n }\r\n\r\n #solveByFactorization(): ISolution[] {\r\n // Move everything to the left.\r\n\r\n // Get the polynom on the left (on the right, it's zero)\r\n let left = this.#equation.clone()\r\n\r\n // The solutions of the equation\r\n let solutions: ISolution[] = []\r\n\r\n // multiply by the lcm of the denominators\r\n // to get rid of the fractions\r\n const lcm = left.lcmDenominator()\r\n if (lcm !== 1) {\r\n left.multiply(lcm)\r\n }\r\n\r\n // left is a polynom ax^n+...+b\r\n const a = left.monomByDegree().coefficient // Greatest coefficient\r\n let b = left.monomByDegree(0).coefficient // Constant term\r\n\r\n // if the constant term is null, the polynom can be divided by x\r\n while (b.isZero()) {\r\n if (solutions.length === 0) {\r\n solutions.push(this.#makeSolution(0))\r\n }\r\n\r\n left = (left.divide('x'))\r\n b = left.monomByDegree(0).coefficient\r\n }\r\n\r\n // get all dividers of a and b\r\n const dividersA = Numeric.dividers(a.value)\r\n const dividersB = Numeric.dividers(b.value)\r\n\r\n // test all possible solutions\r\n for (const da of dividersA) {\r\n for (const db of dividersB) {\r\n const f = new Fraction(db, da)\r\n\r\n // Test with the fraction\r\n if ((left.evaluate(f) as Fraction).isZero() && !solutions.find(s => s.value === f.value)) {\r\n solutions.push(this.#makeSolution(f))\r\n }\r\n\r\n // Test with the opposite fraction\r\n f.opposite()\r\n if ((left.evaluate(f) as Fraction).isZero() && !solutions.find(s => s.value === f.value)) {\r\n solutions.push(this.#makeSolution(f))\r\n }\r\n }\r\n }\r\n\r\n // divide the left polynom by the solutions (as polynom)\r\n // to get the reduced polynom\r\n for (const s of solutions) {\r\n // if the solution is exact and is zero, it's already divided: skip it !\r\n if (s.exact !== false && (s.exact as Fraction).isZero()) {\r\n continue\r\n }\r\n\r\n const p = this.#equation.clone().parse('x', (s.exact as Fraction).denominator, -(s.exact as Fraction).numerator)\r\n\r\n while (left.isDividableBy(p)) {\r\n left = left.divide(p)\r\n }\r\n }\r\n\r\n // if the reduced polynom is of degree 0, we have found all the solutions\r\n if (left.degree().isZero()) {\r\n return solutions.sort((a, b) => a.value - b.value)\r\n }\r\n\r\n // if the reduced polynom is of degree greater than 3, we can't solve it\r\n if (left.degree().value > 3) {\r\n return []\r\n }\r\n\r\n // if the reduced polynom is of degree 1 or 2, we can solve it\r\n const solver = new EquationSolver(left, left.clone().parse('0'), this.#variable)\r\n solutions = solutions.concat(solver.solve())\r\n\r\n return solutions.sort((a, b) => a.value - b.value)\r\n }\r\n\r\n #solveCubic_CardanFormula(): ISolution[] {\r\n // get the coefficients of the equation\r\n const left = this.#equation\r\n\r\n // left is a polynom ax^3+bx^2+cx+d => the solution is x = (-b±√(b^2-4ac))/2a\r\n const a = left.monomByDegree(3).coefficient\r\n const b = left.monomByDegree(2).coefficient\r\n const c = left.monomByDegree(1).coefficient\r\n const d = left.monomByDegree(0).coefficient\r\n\r\n // normalize the coefficient by dividing by a\r\n const an = b.clone().divide(a)\r\n const bn = c.clone().divide(a)\r\n const cn = d.clone().divide(a)\r\n\r\n // Depressed cubic equation\r\n // x^3+px+q=0\r\n const p = bn.clone().subtract(an.clone().pow(2).divide(3))\r\n const q = cn.clone()\r\n .subtract(an.clone().multiply(bn).divide(3))\r\n .add(an.clone().pow(3).multiply(2).divide(27))\r\n\r\n\r\n // Cardan method\r\n // X^2 + qX - p^3/27 = 0\r\n // X^2 -SX + P = 0\r\n // S = u^3 + v^3 = -q\r\n // P = u^3v^3 = -p^3/27\r\n // u^3 and v^3 are the roots of the equation\r\n const S = q.clone().opposite()\r\n const P = p.clone().opposite().pow(3).divide(27)\r\n\r\n // Discriminant : delta = -(S^2 - 4P)\r\n // delta < 0 : 1 real solution\r\n // delta = 0 : 2 real solutions\r\n // delta > 0 : 3 real solutions\r\n const delta = S.clone().pow(2).subtract(P.clone().multiply(4)).opposite()\r\n // console.log('an=', an.display, 'bn=', bn.display, 'cn=', cn.display)\r\n // console.log('p=', p.display, 'q=', q.display)\r\n // console.log('S=', S.display, 'P=', P.display)\r\n // console.log('delta=', delta.display)\r\n\r\n // if delta is negative, there is one real solution\r\n if (delta.isNegative()) {\r\n const u = q.clone().opposite().add(delta.clone().opposite().sqrt()).divide(2).root(3)\r\n const v = q.clone().opposite().subtract(delta.clone().opposite().sqrt()).divide(2).root(3)\r\n\r\n const x = u.clone().add(v).subtract(an.clone().divide(3))\r\n\r\n return [this.#makeSolution(x)]\r\n }\r\n\r\n // if delta is zero, there are two real solutions\r\n if (delta.isZero()) {\r\n const u = q.clone().opposite().divide(2).root(3)\r\n\r\n const x1 = u.clone().opposite().subtract(an.clone().divide(3))\r\n const x2 = u.clone().multiply(2).subtract(an.clone().divide(3))\r\n\r\n // There is only one unique solution\r\n if (x1.isEqual(x2)) {\r\n return [this.#makeSolution(x1)]\r\n }\r\n\r\n return [\r\n this.#makeSolution(x2),\r\n this.#makeSolution(x1)\r\n ].sort((a, b) => a.value - b.value)\r\n }\r\n\r\n // if delta is positive, there are three real solutions\r\n if (delta.isPositive()) {\r\n const x: number[] = []\r\n const pv = p.value,\r\n qv = q.value,\r\n anv = an.value\r\n\r\n for (let i = 0; i < 3; i++) {\r\n x.push(2 * Math.sqrt(-pv / 3) * Math.cos(Math.acos(3 * qv / (2 * pv) * Math.sqrt(-3 / pv)) / 3 + 2 * Math.PI * i / 3) - anv / 3)\r\n }\r\n\r\n return x\r\n .map(v => this.#makeApproximativeSolution(v))\r\n .sort((a, b) => a.value - b.value)\r\n\r\n }\r\n\r\n return []\r\n }\r\n\r\n #solveLinear(): ISolution[] {\r\n // The equation is linear.\r\n const [a, b] = this.#equation.getCoefficients()\r\n\r\n // left is a polynom ax+b => the solution is x = -b/a\r\n const f = b.opposite().divide(a)\r\n\r\n return [\r\n this.#makeSolution(f)\r\n ]\r\n }\r\n\r\n #solveQuadratic(): ISolution[] {\r\n\r\n // The equation is quadratic.\r\n // We can solve it by isolating the variable.\r\n const left = this.#equation\r\n\r\n // left is a polynom ax^2+bx+c => the solution is x = (-b±√(b^2-4ac))/2a\r\n const [a, b, c] = left.getCoefficients()\r\n\r\n // delta2 = b^2-4ac\r\n const delta2 = b.clone().pow(2).subtract(a.clone().multiply(c).multiply(4))\r\n\r\n // if delta2 is negative, there is no solution\r\n if (delta2.isNegative()) {\r\n return []\r\n }\r\n\r\n // if delta2 is zero, there is one solution\r\n // if delta2 is positive, there are two solutions\r\n // if delta2 is a square, it will be an exact solution.\r\n\r\n if (delta2.isSquare()) {\r\n // delta is a fraction.\r\n // the solutions are (-b±√(b^2-4ac))/2a\r\n const delta = delta2.sqrt()\r\n const f1 = b.clone().opposite().add(delta).divide(a.clone().multiply(2))\r\n const f2 = b.clone().opposite().subtract(delta).divide(a.clone().multiply(2))\r\n\r\n // Delta is zero, there is only one solution\r\n if (delta.isZero()) {\r\n return [this.#makeSolution(f1)]\r\n }\r\n\r\n // delta is positive, there are two solutions\r\n return [\r\n this.#makeSolution(f1),\r\n this.#makeSolution(f2)\r\n ].sort((a, b) => a.value - b.value)\r\n }\r\n\r\n // delta is not a square, there are one or two approximative solutions.\r\n // We will use the approximate value of the square root.\r\n // const delta = delta2.value ** 0.5\r\n // const f1 = (-b.value + delta) / (2 * a.value)\r\n // const f2 = (-b.value - delta) / (2 * a.value)\r\n\r\n return this.#solveQuadratic_Output(a, b, delta2)\r\n }\r\n\r\n #solveQuadratic_Output(a: Fraction, b: Fraction, delta: Fraction): ISolution[] {\r\n // -b +/- sqrt(delta) / 2a\r\n // reduce the sqrt - extract pow.\r\n\r\n // Get the greatest square factor\r\n const deltaFactor: number = Numeric\r\n .dividers(delta.value)\r\n .filter(x => Math.sqrt(x) % 1 === 0)\r\n .map(x => Math.sqrt(x)).pop() ?? 1\r\n\r\n // Get the GCD of a, b, and the greatest delta factor.\r\n const gcd = Numeric.gcd(2 * a.value, b.value, deltaFactor) * (a.isNegative() ? -1 : 1)\r\n\r\n // Calculate the various values and transforming\r\n const b2 = b.clone().divide(gcd).opposite()\r\n const a2 = a.clone().divide(gcd).multiply(2)\r\n const delta2 = delta.clone().divide(deltaFactor ** 2)\r\n const deltaGcd = Math.abs(deltaFactor / gcd)\r\n const deltaK1 = deltaFactor === 1 ? '-' : `-${deltaGcd} `\r\n const deltaK2 = deltaFactor === 1 ? '+' : `+${deltaGcd} `\r\n\r\n function texOutput(a: string, b: string, k: string, delta: string) {\r\n return `\\\\frac{ ${b} ${k}\\\\sqrt{ ${delta} } }{ ${a} }`\r\n }\r\n\r\n function displayOutput(a: string, b: string, k: string, delta: string) {\r\n return `(${b}${k}sqrt(${delta}))/${a}`\r\n }\r\n\r\n const d = delta.value ** 0.5\r\n const f1 = (-b.value - d) / (2 * a.value)\r\n const f2 = (-b.value + d) / (2 * a.value)\r\n\r\n return [\r\n this.#makeApproximativeSolution(f1,\r\n {\r\n tex: texOutput(a2.tex, b2.tex, deltaK1.toString(), delta2.tex),\r\n display: displayOutput(a2.display, b2.display, deltaK1.toString(), delta2.display),\r\n }\r\n ),\r\n this.#makeApproximativeSolution(f2,\r\n {\r\n tex: texOutput(a2.tex, b2.tex, deltaK2.toString(), delta2.tex),\r\n display: displayOutput(a2.display, b2.display, deltaK2.toString(), delta2.display),\r\n }\r\n )\r\n ].sort((a, b) => a.value - b.value)\r\n }\r\n}\r\n","var _ = Object.defineProperty;\nvar C = (n) => {\n throw TypeError(n);\n};\nvar b = (n, s, e) => s in n ? _(n, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[s] = e;\nvar A = (n, s, e) => b(n, typeof s != \"symbol\" ? s + \"\" : s, e), P = (n, s, e) => s.has(n) || C(\"Cannot \" + e);\nvar a = (n, s, e) => (P(n, s, \"read from private field\"), e ? e.call(n) : s.get(n)), k = (n, s, e) => s.has(n) ? C(\"Cannot add the same private member more than once\") : s instanceof WeakSet ? s.add(n) : s.set(n, e), N = (n, s, e, c) => (P(n, s, \"write to private field\"), c ? c.call(n, e) : s.set(n, e), e);\nconst v = {\n pi: Math.PI,\n e: Math.exp(1)\n};\nvar t = /* @__PURE__ */ ((n) => (n.VARIABLE = \"variable\", n.COEFFICIENT = \"coefficient\", n.OPERATION = \"operation\", n.CONSTANT = \"constant\", n.FUNCTION = \"function\", n.FUNCTION_ARGUMENT = \"function-argument\", n.MONOM = \"monom\", n.LEFT_PARENTHESIS = \"(\", n.RIGHT_PARENTHESIS = \")\", n))(t || {}), u = /* @__PURE__ */ ((n) => (n.EXPRESSION = \"expression\", n.POLYNOM = \"polynom\", n.SET = \"set\", n.NUMERIC = \"numeric\", n))(u || {});\nfunction F(n, s) {\n if (n.length <= 1)\n return n;\n const e = Object.keys(s).filter((r) => s[r].type === t.FUNCTION).map((r) => r);\n e.sort((r, O) => O.length - r.length);\n const c = new RegExp(`^(${e.join(\"|\")})\\\\(`), i = Object.keys(v);\n i.sort((r, O) => O.length - r.length);\n const o = new RegExp(`^(${i.join(\"|\")})`), T = /^(\\d+(\\.\\d+)?)/;\n let f = \"\", d, p, h;\n for (; n.length > 0; ) {\n if (d = p, h = void 0, e.length > 0 && c.exec(n)) {\n const r = e.find((O) => n.startsWith(O));\n r && (h = r + \"(\", n = n.slice(r.length + 1), p = t.FUNCTION);\n } else if (i.length > 0 && o.exec(n)) {\n const r = i.find((O) => n.startsWith(O));\n r && (h = r, n = n.slice(r.length), p = t.CONSTANT);\n } else if (T.exec(n)) {\n const r = T.exec(n);\n r && (h = r[0], n = n.slice(r[0].length), p = t.COEFFICIENT);\n } else\n switch (h = n[0], n = n.slice(1), h) {\n case \"(\":\n p = t.LEFT_PARENTHESIS;\n break;\n case \")\":\n p = t.RIGHT_PARENTHESIS;\n break;\n case \",\":\n p = t.FUNCTION_ARGUMENT;\n break;\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"^\":\n p = t.OPERATION;\n break;\n default:\n p = t.VARIABLE;\n }\n if (h === void 0 || p === void 0)\n throw new Error(\"The token is undefined\");\n f += w(d, p), f += h;\n }\n return f;\n}\nfunction w(n, s) {\n return n === void 0 || n === t.OPERATION || s === t.OPERATION || n === t.LEFT_PARENTHESIS || n === t.FUNCTION || n === t.FUNCTION_ARGUMENT || s === t.RIGHT_PARENTHESIS || s === t.FUNCTION_ARGUMENT ? \"\" : \"*\";\n}\nconst U = {\n \"^\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"*\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"/\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"+\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION }\n}, y = {\n \"^\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"*\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"/\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"+\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"%\": { precedence: 3, associative: \"right\", type: t.OPERATION },\n sin: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n cos: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n tan: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n sqrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n nthrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n \",\": { precedence: 2, associative: \"left\", type: t.FUNCTION_ARGUMENT }\n}, S = {\n \"^\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"*\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"/\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"+\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION },\n \"%\": { precedence: 3, associative: \"right\", type: t.OPERATION },\n sin: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n cos: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n tan: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n sqrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n nthrt: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n ln: { precedence: 4, associative: \"right\", type: t.FUNCTION },\n log: { precedence: 4, associative: \"right\", type: t.FUNCTION }\n}, M = {\n \"&\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"|\": { precedence: 3, associative: \"left\", type: t.OPERATION },\n \"!\": { precedence: 4, associative: \"right\", type: t.OPERATION },\n \"-\": { precedence: 2, associative: \"left\", type: t.OPERATION }\n};\nvar I, R, l, g, E;\nclass L {\n constructor(s) {\n k(this, I);\n k(this, R, []);\n k(this, l, {});\n k(this, g, []);\n k(this, E);\n N(this, I, typeof s > \"u\" ? u.POLYNOM : s), this.tokenConfigInitialization();\n }\n // Getter\n get rpn() {\n return a(this, R);\n }\n get rpnToken() {\n return a(this, R).map((s) => s.token);\n }\n tokenConfigInitialization() {\n return a(this, I) === u.SET ? (N(this, l, M), N(this, E, !1)) : a(this, I) === u.NUMERIC ? (N(this, l, S), N(this, E, !0)) : a(this, I) === u.EXPRESSION ? (N(this, l, y), N(this, E, !0)) : (N(this, l, U), N(this, E, !0)), N(this, g, Object.keys(a(this, l)).sort((s, e) => e.length - s.length)), a(this, l);\n }\n /**\n * Get the next token to analyse.\n * @param expr (string) Expression to analyse\n * @param start (number) CUrrent position in the expr string.\n */\n NextToken(s, e) {\n let c, i;\n if (c = \"\", i = void 0, s[e] === \"(\")\n c = \"(\", i = t.LEFT_PARENTHESIS;\n else if (s[e] === \")\")\n c = \")\", i = t.RIGHT_PARENTHESIS;\n else if (s[e] === \",\")\n c = \",\", i = t.FUNCTION_ARGUMENT;\n else {\n for (const o of a(this, g))\n if (s.substring(e, e + o.length) === o) {\n c += o, i = a(this, l)[o].type;\n break;\n }\n for (const o in v)\n if (s.substring(e, e + o.length) === o) {\n c += o, i = t.CONSTANT;\n break;\n }\n if (c === \"\")\n if (/[0-9.]/.exec(s[e])) {\n const o = /^([0-9.]+)/.exec(s.substring(e));\n c = o ? o[0] : \"\", i = t.COEFFICIENT;\n } else if (/[a-zA-Z]/.exec(s[e])) {\n const o = /^([a-zA-Z])/.exec(s.substring(e));\n c = o ? o[0] : \"\", i = t.VARIABLE;\n } else\n console.log(\"Unidentified token\", s[e], s, e), c = s[e], i = t.MONOM;\n }\n if (i === void 0)\n throw new Error(`Token type is undefined for token ${c}`);\n return [c, e + c.length, i];\n }\n /**\n * Parse an expression using the shutting yard tree algorithms\n * @param expr (string) Expression to analyse\n * Returns a RPN list of items.\n * @param uniformize\n */\n parse(s, e) {\n const c = [], i = [];\n let o = \"\", T = 0, f;\n (e ?? a(this, E)) && (s = F(s, a(this, l)));\n const d = 50;\n let p = 50, h;\n for (; T < s.length; ) {\n if (p--, p === 0) {\n console.log(\"SECURITY LEVEL 1 EXIT\");\n break;\n }\n switch ([o, T, f] = this.NextToken(s, T), f) {\n case t.MONOM:\n case t.COEFFICIENT:\n case t.VARIABLE:\n case t.CONSTANT:\n c.push({\n token: o,\n tokenType: f\n });\n break;\n case t.OPERATION:\n if (i.length > 0) {\n let r = i[i.length - 1];\n for (h = +d; r.token in a(this, l) && //either o1 is left-associative and its precedence is less than or equal to that of o2,\n (a(this, l)[o].associative === \"left\" && a(this, l)[o].precedence <= a(this, l)[r.token].precedence || //or o1 is right associative, and has precedence less than that of o2,\n a(this, l)[o].associative === \"right\" && a(this, l)[o].precedence < a(this, l)[r.token].precedence); ) {\n if (h--, h === 0) {\n console.log(\"SECURITY LEVEL 2 OPERATION EXIT\");\n break;\n }\n if (c.push(i.pop() ?? { token: \"\", tokenType: t.OPERATION }), i.length === 0)\n break;\n r = i[i.length - 1];\n }\n }\n i.push({ token: o, tokenType: f });\n break;\n case t.FUNCTION_ARGUMENT:\n for (h = +d; i[i.length - 1].token !== \"(\" && i.length > 0; ) {\n if (h--, h === 0) {\n console.log(\"SECURITY LEVEL 2 FUNCTION ARGUMENT EXIT\");\n break;\n }\n c.push(i.pop() ?? { token: o, tokenType: f });\n }\n break;\n case t.LEFT_PARENTHESIS:\n i.push({ token: o, tokenType: f }), s[T] === \"-\" && c.push({ token: \"0\", tokenType: t.COEFFICIENT });\n break;\n case t.RIGHT_PARENTHESIS:\n for (h = +d; i[i.length - 1].token !== \"(\" && i.length > 1; ) {\n if (h--, h === 0) {\n console.log(\"SECURITY LEVEL 2 CLOSING PARENTHESIS EXIT\");\n break;\n }\n c.push(i.pop() ?? { token: o, tokenType: f });\n }\n i.pop();\n break;\n case t.FUNCTION:\n i.push({ token: o, tokenType: f });\n break;\n default:\n throw new Error(`Token type ${o} is not handled`);\n }\n }\n return N(this, R, c.concat(i.reverse())), this;\n }\n}\nI = new WeakMap(), R = new WeakMap(), l = new WeakMap(), g = new WeakMap(), E = new WeakMap();\nclass m {\n constructor(s, e) {\n A(this, \"_rpn\");\n A(this, \"_expression\");\n A(this, \"_isValid\");\n this._expression = s;\n try {\n this._rpn = new L(u.NUMERIC).parse(s, e).rpn;\n } catch {\n throw this._rpn = null, this._isValid = !1, new Error(`There was a problem parsing: ${s}`);\n }\n }\n get rpn() {\n return this._rpn ?? [];\n }\n get isValid() {\n if (this._isValid === void 0)\n try {\n this.evaluate({ x: 2 });\n } catch {\n this._isValid = !1;\n }\n return this._isValid ?? !1;\n }\n set isValid(s) {\n this._isValid = s;\n }\n get expression() {\n return this._expression;\n }\n evaluate(s) {\n const e = [];\n if (this._rpn === null)\n return this._isValid = !1, 0;\n this._isValid = !0;\n for (const c of this._rpn)\n if (c.tokenType === t.COEFFICIENT)\n if (!isNaN(+c.token))\n e.push(+c.token);\n else {\n const i = c.token.split(\"/\");\n if (i.length !== 2)\n throw this._isValid = !1, new Error(\"This coefficient is not a fraction\");\n e.push(+i[0] / +i[1]);\n }\n else if (c.tokenType === t.VARIABLE && s !== void 0)\n Object.hasOwn(s, c.token) && e.push(+s[c.token]);\n else if (c.tokenType === t.CONSTANT)\n e.push(v[c.token]);\n else if (c.tokenType === t.OPERATION) {\n if (c.token === \"*\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The multiplication factors ${o ?? \"a\"} or ${i ?? \"b\"} are not defined`);\n e.push(o * i);\n } else if (c.token === \"/\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The division values ${o ?? \"a\"} or ${i ?? \"b\"} are not defined`);\n e.push(o / i);\n } else if (c.token === \"+\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The addition values ${o ?? \"a\"} or ${i ?? \"b\"} are not defined`);\n e.push(+o + +i);\n } else if (c.token === \"-\") {\n const i = e.pop(), o = e.pop() ?? 0;\n if (i === void 0)\n throw this._isValid = !1, new Error(\"The subtraction value b is not defined\");\n e.push(o - i);\n } else if (c.token === \"^\") {\n const i = e.pop(), o = e.pop();\n if (o === void 0 || i === void 0)\n throw this._isValid = !1, new Error(`The base value ${o ?? \"a\"} or exponent ${i ?? \"b\"} are not defined`);\n e.push(Math.pow(o, i));\n }\n } else if (c.tokenType === t.FUNCTION) {\n const i = e.pop();\n if (i === void 0)\n throw this._isValid = !1, new Error(`The parameters for ${c.token} is not defined`);\n if (c.token === \"sin\")\n e.push(Math.sin(i));\n else if (c.token === \"cos\")\n e.push(Math.cos(i));\n else if (c.token === \"tan\")\n e.push(Math.tan(i));\n else if (c.token === \"sqrt\")\n e.push(Math.sqrt(i));\n else if (c.token === \"nthrt\") {\n const o = e.pop();\n if (o === void 0)\n throw this._isValid = !1, new Error(\"The nthrt function requires two parameters\");\n i % 2 === 0 && o < 0 ? e.push(NaN) : e.push((o < 0 ? -1 : 1) * Math.pow(Math.abs(o), 1 / i));\n } else c.token === \"ln\" ? e.push(Math.log(i)) : c.token === \"log\" && e.push(Math.log10(i));\n }\n if (e.length === 1)\n return this._numberCorrection(e[0]);\n throw new Error(`There was a problem parsing: ${this._expression}`);\n }\n _numberCorrection(s, e = 8) {\n return +s.toFixed(e);\n }\n}\nexport {\n m as NumExp,\n L as ShutingYard,\n u as ShutingyardMode,\n t as ShutingyardType,\n v as tokenConstant\n};\n","/***\r\n * Monom class\r\n */\r\nimport type {\r\n IAlgebra,\r\n IAnalyse,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n literalType\r\n} from \"../pimath.interface\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { NthRoot } from \"../coefficients/nthRoot\"\r\nimport { Numeric } from \"../numeric\"\r\n\r\nimport { ShutingYard, ShutingyardType, type Token } from \"piexpression\"\r\n\r\nexport class Monom implements IPiMathObject<Monom>, IExpression<Monom>, IAnalyse<Monom>, IAlgebra<Monom> {\r\n #coefficient: Fraction\r\n #literal: literalType<Fraction>\r\n\r\n constructor(value?: InputValue<Fraction>)\r\n constructor(value?: Monom)\r\n constructor(value?: InputAlgebra<Fraction>) {\r\n this.#coefficient = new Fraction().zero()\r\n this.#literal = {}\r\n\r\n if (value !== undefined) {\r\n // A string is given - try to parse the value.\r\n this.parse(value)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // -----------------------------------------\r\n /**\r\n * Parse a string to a monom. The string may include fraction.\r\n * @param inputStr\r\n */\r\n public parse(inputStr: InputAlgebra<Monom>): this {\r\n // Initialize the monom\r\n this.#coefficient = new Fraction()\r\n this.#literal = {}\r\n\r\n if (typeof inputStr === 'string') {\r\n this.#shutingYardToReducedMonom(inputStr)\r\n } else if (typeof inputStr === 'number') {\r\n this.#coefficient = new Fraction(inputStr)\r\n } else if (inputStr instanceof Fraction) {\r\n this.#coefficient = inputStr.clone()\r\n } else if (inputStr instanceof Monom) {\r\n this.#coefficient = inputStr.#coefficient.clone()\r\n\r\n // Copy the literal parts\r\n this.#cloneLiteral(inputStr)\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Clone the current Monom.\r\n */\r\n public clone = (): Monom => {\r\n const F: Monom = new Monom()\r\n\r\n F.coefficient = this.#coefficient.clone()\r\n\r\n // Copy the literal parts.\r\n for (const k in this.#literal) {\r\n F.setLetter(k, this.#literal[k].clone())\r\n }\r\n return F\r\n }\r\n\r\n public static gcd = (...monoms: Monom[]): Monom => {\r\n // All the monoms must be with natural powers...\r\n for (const m of monoms) {\r\n if (m.containsRationalPower()) {\r\n return new Monom().zero()\r\n }\r\n }\r\n\r\n const M = new Monom(),\r\n n: number = Numeric.gcd(...monoms.map(value => value.coefficient.numerator)),\r\n d: number = Numeric.lcm(...monoms.map(value => value.coefficient.denominator))\r\n\r\n // Get the coefficient.\r\n M.coefficient = new Fraction(n, d).reduce()\r\n\r\n // Set the literal parts - go through each monoms literal parts and get only the lowest degree of each letters.\r\n for (const m of monoms) {\r\n // Remove the inexistant letters from the resulting monom\r\n for (const letter in M.literal) {\r\n if (!(letter in m.literal)) {\r\n M.literal[letter].zero()\r\n }\r\n }\r\n for (const letter in m.literal) {\r\n if (!M.hasVariable(letter) && m.literal[letter].isStrictlyPositive()) {\r\n M.literal[letter] = m.literal[letter].clone()\r\n } else {\r\n M.literal[letter] = new Fraction(Math.min(m.literal[letter].value, M.literal[letter].value))\r\n }\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n /**\r\n * Multiply two monoms and return a NEW monom.\r\n * @param monoms\r\n */\r\n public static xMultiply = (...monoms: Monom[]): Monom => {\r\n const M = new Monom().one()\r\n\r\n for (const m of monoms) {\r\n M.multiply(m)\r\n }\r\n\r\n return M\r\n }\r\n\r\n /**\r\n * Add all similar monoms. If they aren't similar, they are simply skipped.\r\n * @param M (Monom[]) The monoms to add.\r\n */\r\n public add = (...M: InputAlgebra<Fraction>[]): this => {\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n if (this.isSameAs(mAsMonom)) {\r\n if (this.isZero()) {\r\n this.#cloneLiteral(mAsMonom)\r\n }\r\n\r\n this.#coefficient.add(mAsMonom.coefficient)\r\n } else {\r\n console.log('Add monom: ' + this.display + ' is not similar with ', mAsMonom.display)\r\n }\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Get the coefficient \\\\(k\\\\) of the Monom \\\\(k\\\\cdot x^{n}\\\\)\r\n * @returns {Fraction}\r\n */\r\n public get coefficient(): Fraction {\r\n return this.#coefficient\r\n }\r\n\r\n /**\r\n * Set the coefficient \\\\(k\\\\) value of the monom\r\n * @param {Fraction | number | string} F\r\n */\r\n public set coefficient(F: InputValue<Fraction>) {\r\n this.#coefficient = new Fraction(F)\r\n }\r\n\r\n public containsRationalPower = (): boolean => {\r\n return Object.values(this.#literal).some((value) => value.isRational())\r\n }\r\n\r\n /**\r\n * Get the degree of a monom. If no setLetter is given, the result will be the global degree.\r\n * @param letter (string) Letter to get to degree (power)\r\n */\r\n public degree = (letter?: string): Fraction => {\r\n if (this.variables.length === 0) {\r\n return new Fraction().zero()\r\n }\r\n if (letter === undefined) {\r\n // Not setLetter given -> we get the global monom degree (sum of all the letters).\r\n return Object.values(this.#literal).reduce((t, n) => t.clone().add(n))\r\n } else {\r\n // A setLetter is given -> get the corresponding power.\r\n return !this.hasVariable(letter) ? new Fraction().zero() : this.#literal[letter].clone()\r\n }\r\n }\r\n\r\n /**\r\n * Derivative the monom\r\n * @param letter\r\n */\r\n public derivative = (letter?: string): Monom => {\r\n // No setLetter given - assume it's the setLetter 'x'\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n if (this.hasVariable(letter)) {\r\n const d = this.#literal[letter].clone(),\r\n dM = this.clone()\r\n\r\n // Subtract one to the degree.\r\n dM.#literal[letter].subtract(1)\r\n\r\n // Multiply the coefficient by the previous degree\r\n dM.#coefficient.multiply(new Fraction(d.clone()))\r\n return dM\r\n } else {\r\n return new Monom().zero()\r\n }\r\n }\r\n\r\n // Display getter\r\n /**\r\n * This display getter is to be used in the polynom display getter\r\n */\r\n public get display(): string {\r\n let L = ''\r\n const letters = Object.keys(this.#literal).sort()\r\n for (const letter of letters) {\r\n if (this.#literal[letter].isNotZero()) {\r\n L += letter\r\n if (this.#literal[letter].isNotEqual(1)) {\r\n L += `^(${this.#literal[letter].display})`\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this.#coefficient.value != 0) {\r\n return this.#coefficient.display\r\n } else {\r\n return ''\r\n }\r\n } else {\r\n if (this.#coefficient.value === 1) {\r\n return L\r\n } else if (this.#coefficient.value === -1) {\r\n return `-${L}`\r\n } else if (this.#coefficient.value === 0) {\r\n return '0'\r\n } else {\r\n return `${this.#coefficient.display}${L}`\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Divide the current monoms by multiple monoms\r\n * @param M (Monom[])\r\n */\r\n public divide = (...M: InputAlgebra<Fraction>[]): this => {\r\n // Depending on the given value, choose the current item\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n // Divide the coefficient\r\n this.#coefficient.divide(mAsMonom.coefficient)\r\n\r\n // Subtract the power values\r\n for (const letter in mAsMonom.literal) {\r\n\r\n this.#literal[letter] = this.hasVariable(letter) ?\r\n this.#literal[letter].subtract(mAsMonom.literal[letter]) :\r\n mAsMonom.literal[letter].clone().opposite()\r\n\r\n\r\n // If the power of a particular setLetter is zero, delete it from the literal part..\r\n if (this.#literal[letter].isZero()) {\r\n this.removeVariable(letter)\r\n }\r\n }\r\n }\r\n return this\r\n }\r\n\r\n public get dividers(): Monom[] {\r\n // Decompose only if the coefficient is a natural number\r\n if (!this.coefficient.isRelative()) {\r\n return [this.clone()]\r\n }\r\n\r\n // Decompose only if the power values are natural numbers.\r\n if (this.containsRationalPower()) {\r\n return [this.clone()]\r\n }\r\n\r\n // Security : do not do this if greater than 10000\r\n if (this.coefficient.numerator > 1000000) {\r\n return [this.clone()]\r\n }\r\n\r\n const dividers = Numeric.dividers(Math.abs(this.coefficient.numerator))\r\n\r\n // Decompose the literals parts.\r\n let literals: literalType<Fraction>[] = []\r\n for (const L in this.literal) {\r\n // L is the letter.\r\n literals = this._getLiteralDividers(literals, L)\r\n }\r\n\r\n const monomDividers: Monom[] = []\r\n if (literals.length > 0 && dividers.length > 0) {\r\n for (const N of dividers) {\r\n for (const L of literals) {\r\n const M = new Monom()\r\n M.coefficient = new Fraction(N)\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n }\r\n } else if (dividers.length === 0) {\r\n for (const L of literals) {\r\n const M = new Monom()\r\n M.coefficient = new Fraction().one()\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n } else {\r\n for (const N of dividers) {\r\n const M = new Monom()\r\n M.coefficient = new Fraction(N)\r\n monomDividers.push(M)\r\n }\r\n }\r\n\r\n return monomDividers.length === 0 ? [new Monom().one()] : monomDividers\r\n }\r\n\r\n /**\r\n * Evaluate a monom. Each setLetter must be assigned to a Fraction.\r\n * @param values Dictionary of <setLetter: Fraction>\r\n * @param asNumeric\r\n */\r\n public evaluate = (values: literalType<number | Fraction> | InputValue<Fraction>, asNumeric?: boolean): Fraction | number => {\r\n // If as numeric return the numeric value\r\n if (asNumeric === true) {\r\n // Convert all values to numeric\r\n // If the value is a Fraction, convert it to a number\r\n if (values instanceof Fraction) {\r\n return this.#evaluateAsNumeric(values.value)\r\n }\r\n\r\n // If the value is a NthRoot, return undefined\r\n if (values instanceof NthRoot) {\r\n return new Fraction().invalid()\r\n }\r\n\r\n // If the value is a number, return the numeric value\r\n if (typeof values === 'number') {\r\n return this.#evaluateAsNumeric(values)\r\n }\r\n\r\n // If the value is an object, return the numeric value\r\n if (typeof values === 'object') {\r\n // Convert {[key:string]:Fraction} to {[key:string]:number}\r\n const tmpValues: literalType<number> = {}\r\n for (const L in values) {\r\n tmpValues[L] = new Fraction(values[L]).value\r\n }\r\n\r\n return this.#evaluateAsNumeric(tmpValues)\r\n }\r\n }\r\n\r\n // The answer must be a Fraction\r\n const r = this.coefficient.clone()\r\n\r\n if (typeof values === 'number' || values instanceof Fraction) {\r\n const tmpValues: literalType<Fraction> = {}\r\n tmpValues[this.variables[0]] = new Fraction(values)\r\n return this.evaluate(tmpValues)\r\n }\r\n\r\n if (values instanceof NthRoot) {\r\n return new Fraction().invalid()\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if (this.variables.length === 0) {\r\n return this.coefficient\r\n }\r\n\r\n for (const L in this.#literal) {\r\n const value = new Fraction(values[L])\r\n\r\n r.multiply(value.pow(this.#literal[L]))\r\n }\r\n }\r\n\r\n return r\r\n }\r\n\r\n // -------------------------------------\r\n /**\r\n * Determine if a monom contains a setLetter in it's literal part\r\n * @param letter\r\n */\r\n public hasVariable = (letter?: string): boolean => {\r\n // The letter was not found\r\n return Object.hasOwn(this.#literal, letter ?? 'x')\r\n }\r\n\r\n public integrate(a: InputValue<Fraction>, b: InputValue<Fraction>, letter?: string ): Fraction {\r\n const primitive = this.primitive(letter)\r\n\r\n return (primitive.evaluate(b) as Fraction)\r\n .subtract(primitive.evaluate(a) as Fraction)\r\n }\r\n\r\n public inverse = (): this => {\r\n this.#coefficient.opposite()\r\n for (const letter in this.#literal) {\r\n this.#literal[letter].opposite()\r\n }\r\n return this\r\n }\r\n\r\n public isDivisible = (div: Monom): boolean => {\r\n // For all variables (letters), the current monom must have a degree higher than the divider\r\n if (div.degree().isStrictlyPositive()) {\r\n for (const letter of div.variables) {\r\n if (!this.degree(letter).isGeq(div.degree(letter))) {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n // If the coefficient is rational, we suppose we don't need to check the division by the coefficient.\r\n if (this.coefficient.isRational() || div.coefficient.isRational()) {\r\n return true\r\n }\r\n\r\n return this.coefficient.clone().divide(div.coefficient).isRelative()\r\n }\r\n\r\n /**\r\n * Determine if two monoms are equals\r\n * @param M\r\n */\r\n public isEqual = (M: Monom): boolean => {\r\n return this.isSameAs(M) && this.#coefficient.isEqual(M.coefficient)\r\n }\r\n\r\n public isLiteralSquare = (): boolean => {\r\n for (const letter in this.literal) {\r\n // A literal square must have a natural power\r\n if (this.literal[letter].isRational()) {\r\n return false\r\n }\r\n\r\n // The natural power must be be even\r\n if (this.literal[letter].isEven()) {\r\n return false\r\n }\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * Determine if the monom is one\r\n */\r\n public isOne = (): boolean => {\r\n return this.#coefficient.value === 1 && this.variables.length === 0\r\n }\r\n\r\n /**\r\n * Determine if two monoms are similar\r\n * @param M\r\n */\r\n public isSameAs = (M: Monom): boolean => {\r\n // Get the list of all variables from both monoms.\r\n const M1: string[] = this.variables\r\n const M2: string[] = M.variables\r\n\r\n // Get the list of all variables from both monoms.\r\n const K: string[] = M1.concat(M2.filter((item) => !M1.includes(item)))\r\n\r\n // If one of the monom is zero, it is the same than the other.\r\n if (this.isZero() || M.isZero()) {\r\n return true\r\n }\r\n\r\n // Both monoms has no literal part.\r\n if (M1.length === 0 && M2.length === 0) {\r\n return true\r\n }\r\n\r\n // Both monoms must have the same variables\r\n if (M1.length !== M2.length) {\r\n return false\r\n }\r\n\r\n // To _compare, both must be different from zero.\r\n if (!this.isZero() && !M.isZero()) {\r\n for (const key of K) {\r\n // The variable is not available in one of the monom\r\n if (!this.hasVariable(key) || !M.hasVariable(key)) {\r\n return false\r\n }\r\n\r\n // The variable does not have the same power in each monoms.\r\n if (!this.#literal[key].isEqual(M.literal[key])) {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n // All are positive check - the monoms are the sames.\r\n return true\r\n }\r\n\r\n public isSquare = (): boolean => {\r\n if (!this.coefficient.isSquare()) {\r\n return false\r\n }\r\n return this.isLiteralSquare()\r\n }\r\n\r\n /**\r\n * Determine if the monom is null\r\n */\r\n public isZero = (): boolean => {\r\n return this.#coefficient.value === 0\r\n }\r\n\r\n /**\r\n * Get the literal part of \\\\(x^{n_1}y^{n_2}\\\\) as dictionary \\\\[\\\\begin{array}{ll}x&=n_1\\\\\\\\y&=n_2\\\\end{array}\\\\]\r\n * @returns {literalType}\r\n */\r\n public get literal(): literalType<Fraction> {\r\n return this.#literal\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom. Must be a dictionary {x: Fraction, y: Fraction, ...}\r\n * @param {literalType<Fraction>} L\r\n */\r\n public set literal(L: literalType<Fraction>) {\r\n this.#literal = L\r\n }\r\n\r\n /**\r\n * Get the literal square roots of the Monom.\r\n * @returns {literalType<Fraction>}\r\n */\r\n public get literalSqrt(): literalType<Fraction> {\r\n // TODO: used in Polynom._factorize2ndDegree : remove it from here ?\r\n if (this.isLiteralSquare()) {\r\n const L: literalType<Fraction> = {}\r\n for (const key in this.#literal) {\r\n L[key] = this.#literal[key].clone().sqrt()\r\n }\r\n return L\r\n } else {\r\n return this.#literal\r\n }\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom from a string\r\n * @param inputStr String like x^2y^3\r\n */\r\n public set literalStr(inputStr: string) {\r\n // TODO : parse using ShutingYard tree !\r\n\r\n // Match all x^n\r\n for (const v of [...inputStr.matchAll(/([a-z])\\^([+-]?[0-9]+)/g)]) {\r\n // Create the default letter entry if necessary.\r\n if (!(v[1] in this.#literal)) {\r\n this.#literal[v[1]] = new Fraction().zero()\r\n }\r\n\r\n // Add the new value.\r\n // TODO: actually, it adds only numeric value\r\n this.#literal[v[1]].add(+v[2])\r\n }\r\n\r\n // Match all x\r\n for (const v of [...inputStr.matchAll(/([a-z](?!\\^))/g)]) {\r\n // Match all single letters\r\n if (!(v[1] in this.#literal)) {\r\n this.#literal[v[1]] = new Fraction().zero()\r\n }\r\n\r\n // Add one to the value.\r\n this.#literal[v[1]].add(1)\r\n }\r\n }\r\n\r\n /**\r\n * Multiple multiple monoms to the current monom\r\n * @param M (Monom[]) The monoms to multiply to.\r\n */\r\n public multiply = (...M: InputAlgebra<Fraction>[]): this => {\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n // Multiply the coefficient.\r\n this.#coefficient.multiply(mAsMonom.coefficient)\r\n\r\n // Multiply the literal parts.\r\n for (const letter in mAsMonom.literal) {\r\n if (!this.hasVariable(letter)) {\r\n this.#literal[letter] = mAsMonom.literal[letter].clone()\r\n } else {\r\n this.#literal[letter].add(mAsMonom.literal[letter])\r\n }\r\n }\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Create a one value monom\r\n */\r\n public one = (): this => {\r\n this.#coefficient = new Fraction().one()\r\n this.#literal = {}\r\n return this\r\n }\r\n\r\n /**\r\n * Get the opposite\r\n * Returns a monom.\r\n */\r\n public opposite = (): this => {\r\n this.#coefficient.opposite()\r\n return this\r\n }\r\n\r\n public get plotFunction(): string {\r\n let L = ''\r\n const letters = Object.keys(this.#literal).sort()\r\n\r\n for (const letter of letters) {\r\n if (this.#literal[letter].isNotZero()) {\r\n L += (L === '' ? \"\" : \"*\") + letter\r\n if (this.#literal[letter].isNotEqual(1)) {\r\n L += `^(${this.#literal[letter].display})`\r\n }\r\n }\r\n }\r\n\r\n // No literal part\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this.#coefficient.value != 0) {\r\n return this.#coefficient.display\r\n } else {\r\n return ''\r\n }\r\n } else {\r\n if (this.#coefficient.value === 1) {\r\n return L\r\n } else if (this.#coefficient.value === -1) {\r\n return `-${L}`\r\n } else if (this.#coefficient.value === 0) {\r\n return '0'\r\n } else {\r\n return `${this.#coefficient.display}*${L}`\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the pow of a monom.\r\n * @param nb (number) : Mathematical pow\r\n */\r\n public pow = (nb: number | Fraction): this => {\r\n this.#coefficient.pow(nb)\r\n for (const letter in this.#literal) {\r\n this.#literal[letter].multiply(nb)\r\n }\r\n return this\r\n }\r\n\r\n public primitive = (letter?: string): Monom => {\r\n // TODO: derivative including the ln value => implies creating different monom system ?\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n // Zero monom\r\n const M = this.clone()\r\n let degree: Fraction\r\n\r\n if (M.hasVariable(letter)) {\r\n degree = M.degree(letter).clone().add(1)\r\n M.coefficient = M.coefficient.clone().divide(degree)\r\n M.setLetter(letter, degree)\r\n } else {\r\n // There is no letter.\r\n\r\n // The coefficient might be zero (=> x) or a number a (=> ax)\r\n if (M.coefficient.isZero()) {\r\n M.coefficient = new Fraction().one()\r\n }\r\n M.setLetter(letter, 1)\r\n }\r\n\r\n return M\r\n }\r\n\r\n public reduce = (): this => {\r\n // Reduce the coefficient\r\n this.coefficient.reduce()\r\n\r\n // Reduce the literal parts (removing null powers)\r\n for (const letter in this.#literal) {\r\n if (this.#literal[letter].isZero()) {\r\n this.removeVariable(letter)\r\n }\r\n }\r\n return this\r\n }\r\n\r\n public removeVariable(letter: string) {\r\n /* eslint-disable */\r\n delete this.#literal[letter]\r\n /* eslint-enable */\r\n }\r\n\r\n /**\r\n * Get the nth-root of the monom\r\n */\r\n public root = (): this => {\r\n throw new Error('Method not implemented.')\r\n }\r\n\r\n /**\r\n * Set the power of a particular setLetter\r\n * @param letter (string) Letter to change\r\n * @param pow (number) Power of the setLetter (must be positive integer.\r\n */\r\n public setLetter = (letter: string, pow: InputValue<Fraction>): this => {\r\n if (!(pow instanceof Fraction)) {\r\n return this.setLetter(letter, new Fraction(pow))\r\n }\r\n\r\n // Set the power of the letter to zero => remove it\r\n if (this.hasVariable(letter) && pow.isZero()) {\r\n this.removeVariable(letter)\r\n }\r\n\r\n\r\n this.#literal[letter] = pow.clone()\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Return the square root of a monom\r\n */\r\n public sqrt = (): this => {\r\n if (this.isSquare()) {\r\n this.#coefficient.sqrt()\r\n for (const letter in this.#literal) {\r\n this.#literal[letter].clone().divide(2)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Subtract multiple monoms\r\n * @param M (Monom[]) The monoms to subtract\r\n */\r\n public subtract = (...M: InputAlgebra<Fraction>[]): this => {\r\n for (const m of M) {\r\n // If the value given is not a monom, create it.\r\n const mAsMonom = (!(m instanceof Monom)) ? new Monom(m) : m\r\n\r\n if (this.isSameAs(mAsMonom)) {\r\n if (this.isZero()) {\r\n this.#cloneLiteral(mAsMonom)\r\n }\r\n\r\n this.#coefficient.add(mAsMonom.clone().coefficient.opposite())\r\n } else {\r\n console.log('Subtract: Is not similar: ', mAsMonom.display)\r\n }\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Get the tex output of the monom\r\n */\r\n public get tex(): string {\r\n // TODO: display with square root !\r\n // TODO: Refactor to make it more readable\r\n let L = ''\r\n const letters = Object.keys(this.#literal).sort()\r\n\r\n for (const letter of letters) {\r\n if (this.#literal[letter].isNotZero()) {\r\n L += letter\r\n if (this.#literal[letter].isNotEqual(1)) {\r\n L += `^{ ${this.#literal[letter].tfrac.tex } }`\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this.#coefficient.value != 0) {\r\n return this.#coefficient.frac.tex\r\n } else {\r\n return '0'\r\n }\r\n } else {\r\n if (this.#coefficient.value === 1) {\r\n return L\r\n } else if (this.#coefficient.value === -1) {\r\n return `-${L}`\r\n } else if (this.#coefficient.value === 0) {\r\n return '0'\r\n } else {\r\n return `${this.#coefficient.frac.tex}${L}`\r\n }\r\n }\r\n }\r\n\r\n // Getter helpers.\r\n /**\r\n * Get the variables letters\r\n */\r\n public get variables(): string[] {\r\n // const M = this.clone().clean()\r\n\r\n const L: string[] = []\r\n Object.entries(this.literal).forEach(\r\n ([key, value]) => {\r\n if (!value.isZero()) {\r\n L.push(key)\r\n }\r\n })\r\n L.sort()\r\n return L\r\n // return Object.keys(M.literal)\r\n }\r\n\r\n /**\r\n * Create a zero value monom\r\n */\r\n public zero = (): this => {\r\n this.#coefficient = new Fraction().zero()\r\n this.#literal = {}\r\n return this\r\n }\r\n\r\n #cloneLiteral(inputStr: Monom) {\r\n for (const k in inputStr.literal) {\r\n this.#literal[k] = inputStr.literal[k].clone()\r\n }\r\n }\r\n\r\n #evaluateAsNumeric = (values: literalType<number | Fraction> | InputValue<Fraction>): number => {\r\n let r = this.coefficient.value\r\n\r\n if (typeof values === \"number\") {\r\n const tmpValues: literalType<number> = {}\r\n const key = this.variables[0]\r\n tmpValues[key] = values\r\n\r\n return this.#evaluateAsNumeric(tmpValues)\r\n }\r\n\r\n if (values instanceof Fraction) {\r\n const tmpValues: literalType<number> = {}\r\n tmpValues[this.variables[0]] = new Fraction(values).value\r\n return this.#evaluateAsNumeric(tmpValues)\r\n }\r\n\r\n if (values instanceof NthRoot) {\r\n return NaN\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if (this.variables.length === 0) {\r\n return this.coefficient.value\r\n }\r\n\r\n for (const L in this.#literal) {\r\n const v = values[L]\r\n\r\n if (v instanceof Fraction) {\r\n r *= v.value ** (this.#literal[L].value)\r\n } else {\r\n r *= v ** (this.#literal[L].value)\r\n }\r\n }\r\n }\r\n\r\n return r\r\n }\r\n\r\n private _getLiteralDividers(arr: literalType<Fraction>[], letter: string): literalType<Fraction>[] {\r\n const tmpList: Record<string, Fraction>[] = []\r\n\r\n // Be default, this.literal[letter] should be a rational number.\r\n for (let d = 0; d <= this.literal[letter].value; d++) {\r\n if (arr.length === 0) {\r\n const litt: literalType<Fraction> = {}\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n } else {\r\n for (const item of arr) {\r\n const litt: literalType<Fraction> = {}\r\n for (const currentLetter in item) {\r\n litt[currentLetter] = item[currentLetter]\r\n }\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n }\r\n }\r\n }\r\n return tmpList\r\n }\r\n\r\n #shutingYardToReducedMonom = (inputStr: string): this => {\r\n // Get the RPN array of the current expression\r\n const SY: ShutingYard = new ShutingYard().parse(inputStr)\r\n const rpn: { token: string, tokenType: ShutingyardType }[] = SY.rpn\r\n\r\n const stack: Monom[] = []\r\n\r\n if (rpn.length === 0) {\r\n this.zero()\r\n return this\r\n } else if (rpn.length === 1) {\r\n const element = rpn[0]\r\n\r\n this.one()\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n this.coefficient = new Fraction(element.token)\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n this.setLetter(element.token, 1)\r\n }\r\n return this\r\n } else {\r\n // Reset the monom\r\n for (const element of rpn) {\r\n this.#shutingYard_AddToken(stack, element)\r\n }\r\n }\r\n\r\n this.one()\r\n this.multiply(stack[0])\r\n return this\r\n }\r\n\r\n #shutingYard_AddToken = (stack: Monom[], element: Token): void => {\r\n let q1: Monom, q2: Monom, m: Monom, letter: string, pow: Fraction\r\n\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n stack.push(new Monom(new Fraction(element.token)))\r\n\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n const M = new Monom().one()\r\n M.setLetter(element.token, 1)\r\n stack.push(M.clone())\r\n\r\n } else if (element.tokenType === ShutingyardType.OPERATION) {\r\n switch (element.token) {\r\n case '-':\r\n // this should only happen for negative powers or for negative coefficient.\r\n q2 = (stack.pop()) ?? new Monom().zero()\r\n q1 = (stack.pop()) ?? new Monom().zero()\r\n\r\n stack.push(q1.subtract(q2))\r\n\r\n break\r\n case '*':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) ?? new Monom().one()\r\n q1 = (stack.pop()) ?? new Monom().one()\r\n\r\n stack.push(q1.multiply(q2))\r\n break\r\n case '/':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) ?? new Monom().one()\r\n q1 = (stack.pop()) ?? new Monom().one()\r\n\r\n stack.push(q1.divide(q2))\r\n break\r\n case '^': {\r\n // get the two last elements in the stack\r\n const poppedCoefficient = stack.pop()?.coefficient\r\n pow = poppedCoefficient ?? new Fraction().one()\r\n m = stack.pop() ?? new Monom().one()\r\n\r\n letter = m.variables[0]\r\n\r\n if (letter) {\r\n m.setLetter(letter, pow)\r\n }\r\n\r\n stack.push(m)\r\n // this.multiply(m.clone())\r\n break\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","export function wrapParenthesis(str: string, tex = true): string {\r\n return tex ? `\\\\left( ${str} \\\\right)` : `(${str})`\r\n}\r\n\r\nexport function wrapVert(str: string, tex = true): string {\r\n return tex ? `\\\\left\\\\vert ${str} \\\\right\\\\vert` : `|${str}|`\r\n}\r\n\r\nexport function wrapNorm(str: string, tex = true): string {\r\n return tex ? `\\\\left\\\\Vect ${str} \\\\right\\\\Vect` : `||${str}||`\r\n}\r\n\r\nexport function replace_in_array<T>(haystack: string[], search: string, target: string, start?: number, end?: number): T {\r\n return haystack.map((x, index) => {\r\n if (start !== undefined && index < start) {\r\n return x\r\n }\r\n if (end !== undefined && index > end) {\r\n return x\r\n }\r\n return x === search ? target : x\r\n }) as T\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.*\r\n */\r\nimport {ShutingYard, ShutingyardType, type Token} from \"piexpression\"\r\nimport type {\r\n IAlgebra,\r\n IAnalyse,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType,\r\n TABLE_OF_SIGNS,\r\n TABLE_OF_SIGNS_VALUES\r\n} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Numeric} from '../numeric'\r\nimport {EquationSolver} from './equationSolver'\r\nimport {Monom} from './monom'\r\nimport {replace_in_array} from \"../helpers\"\r\n\r\n\r\nexport type PolynomParsingType = InputValue<Polynom> | Monom\r\n\r\nexport interface IEuclidean {\r\n quotient: Polynom,\r\n reminder: Polynom\r\n}\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n * ```\r\n * let P = new Polynom('3x-4')\r\n * ```\r\n */\r\nexport class Polynom implements IPiMathObject<Polynom>,\r\n IExpression<Polynom>,\r\n IAnalyse<Polynom>,\r\n IAlgebra<Polynom> {\r\n\r\n #factors: Polynom[]\r\n #monoms: Monom[]\r\n #roots: ISolution[]\r\n #rootsCache = false\r\n\r\n constructor(value: InputValue<Fraction>)\r\n constructor(value: string)\r\n constructor(value: Monom)\r\n constructor(value: Polynom)\r\n constructor(...values: InputValue<Fraction>[])\r\n constructor(...values: InputAlgebra<Polynom>[])\r\n constructor(polynomString?: InputAlgebra<Polynom>, ...values: InputAlgebra<Fraction>[]) {\r\n this.#monoms = []\r\n this.#factors = []\r\n this.#roots = []\r\n\r\n if (polynomString !== undefined) {\r\n this.parse(polynomString, ...values)\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Parse a string to a polynom.\r\n * @param inputStr\r\n * @param values\r\n */\r\n public parse = (inputStr: PolynomParsingType, ...values: InputAlgebra<Monom>[]): this => {\r\n // Reset the main variables.\r\n this.#monoms = []\r\n this.#factors = []\r\n\r\n if (typeof inputStr === 'string') {\r\n return this.#parseString(inputStr, ...values)\r\n } else if (\r\n (typeof inputStr === 'number' || inputStr instanceof Fraction || inputStr instanceof Monom)\r\n && (values.length === 0)\r\n ) {\r\n this.#monoms.push(new Monom(inputStr as Monom))\r\n } else if (inputStr instanceof Monom && values.length > 0) {\r\n this.#monoms.push(new Monom(inputStr))\r\n values.forEach(m => {\r\n this.#monoms.push(new Monom(m as Monom))\r\n })\r\n } else if (inputStr instanceof Polynom) {\r\n for (const m of inputStr.monoms) {\r\n this.#monoms.push(m.clone())\r\n }\r\n }\r\n\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Clone the polynom\r\n */\r\n public clone = (): Polynom => {\r\n const P = new Polynom()\r\n const M: Monom[] = []\r\n\r\n for (const m of this.#monoms) {\r\n M.push(m.clone())\r\n }\r\n\r\n\r\n P.monoms = M\r\n\r\n return P\r\n }\r\n\r\n public get tex(): string {\r\n return this.#genDisplay('tex')\r\n }\r\n\r\n public get display(): string {\r\n return this.#genDisplay()\r\n }\r\n\r\n public add = (...values: InputAlgebra<Polynom>[]): Polynom => {\r\n\r\n for (const value of values) {\r\n if (value instanceof Polynom) {\r\n this.#monoms = this.#monoms.concat(value.monoms)\r\n } else if (value instanceof Monom) {\r\n this.#monoms.push(value.clone())\r\n } else if (typeof value === \"number\" && Number.isSafeInteger(value)) {\r\n this.#monoms.push(new Monom(value.toString()))\r\n } else {\r\n this.#monoms.push(new Monom(value))\r\n }\r\n }\r\n\r\n\r\n return this.reduce()\r\n }\r\n\r\n public commonMonom = (): Monom => {\r\n const M = new Monom().one()\r\n const numerator: number = this.gcdNumerator()\r\n const denominator: number = this.gcdDenominator()\r\n const degree = this.degree()\r\n\r\n M.coefficient = new Fraction(numerator, denominator)\r\n for (const L of this.variables) {\r\n // Initialize the setLetter with the max degree\r\n M.setLetter(L, degree)\r\n for (const m of this.#monoms) {\r\n M.setLetter(L, Fraction.min(m.degree(L), M.degree(L)))\r\n if (M.degree(L).isZero()) {\r\n break\r\n }\r\n\r\n }\r\n }\r\n return M\r\n }\r\n\r\n public degree = (letter?: string): Fraction => {\r\n let d: Fraction = new Fraction().zero()\r\n for (const m of this.#monoms) {\r\n d = Fraction.max(m.degree(letter).value, d)\r\n }\r\n\r\n return d\r\n }\r\n\r\n public derivative = (letter?: string): Polynom => {\r\n const dP = new Polynom()\r\n\r\n for (const m of this.#monoms) {\r\n dP.add(m.derivative(letter))\r\n }\r\n\r\n return dP.reduce()\r\n }\r\n\r\n public divide = (value: InputAlgebra<Polynom>): Polynom => {\r\n\r\n if (value instanceof Fraction) {\r\n return this.#divideByFraction(value)\r\n } else if (typeof value === 'number' && Number.isSafeInteger(value)) {\r\n return this.#divideByInteger(value)\r\n } else if (value instanceof Monom) {\r\n return this.divide(new Polynom(value))\r\n } else if (value instanceof Polynom) {\r\n if (value.monoms.length === 1 && value.variables.length === 0) {\r\n return this.#divideByFraction(value.monoms[0].coefficient)\r\n } else {\r\n const {quotient, reminder} = this.euclidean(value)\r\n if (reminder.isZero()) {\r\n this.#monoms = quotient.monoms\r\n return this\r\n }\r\n }\r\n } else if (typeof value === 'string') {\r\n return this.divide(new Polynom(value))\r\n }\r\n\r\n throw new Error(`Cannot divide by ${value as unknown as string}`)\r\n }\r\n\r\n public empty = (): this => {\r\n this.#monoms = []\r\n return this\r\n }\r\n\r\n /**\r\n * Divide the current polynom by another polynom.\r\n * @param P\r\n * returns {quotient: Polynom, reminder: Polynom}\r\n */\r\n public euclidean = (P: Polynom): IEuclidean => {\r\n const letter: string = P.variables[0]\r\n const quotient: Polynom = new Polynom().zero()\r\n const reminder: Polynom = this.clone().reorder(letter)\r\n\r\n // There is no variable - means it's a number\r\n if (P.variables.length === 0) {\r\n const q = this.clone().divide(P)\r\n\r\n return {\r\n quotient: q.reduce(),\r\n reminder: new Polynom().zero()\r\n }\r\n }\r\n\r\n // Get at least a letter\r\n const maxMP: Monom = P.monomByDegree(undefined, letter)\r\n const degreeP: Fraction = P.degree(letter)\r\n\r\n let newM: Monom\r\n\r\n // Make the Euclidean division of the two polynoms.\r\n let MaxIteration = this.degree(letter).value * 2\r\n while (reminder.degree(letter).isGeq(degreeP) && MaxIteration > 0) {\r\n MaxIteration--\r\n\r\n // Get the greatest monom divided by the max monom of the divider\r\n newM = reminder.monomByDegree(undefined, letter).clone().divide(maxMP)\r\n\r\n if (newM.isZero()) {\r\n continue\r\n }\r\n\r\n // Get the new quotient and reminder.\r\n quotient.add(newM)\r\n reminder.subtract(P.clone().multiply(newM)).reduce()\r\n\r\n // Check if the reminder is zero.\r\n if (newM.degree(letter).isZero()) {\r\n break\r\n }\r\n }\r\n\r\n quotient.reduce()\r\n reminder.reduce()\r\n return {quotient, reminder}\r\n }\r\n\r\n public evaluate = (values: literalType<Fraction | number> | InputValue<Fraction>, asNumeric?: boolean): Fraction | number => {\r\n // Return the numeric value, without using Fraction\r\n if (asNumeric) {\r\n return this.#evaluateAsNumeric(values)\r\n }\r\n\r\n // Build the evaluated fraction\r\n const r = new Fraction().zero()\r\n this.#monoms.forEach(monom => {\r\n //console.log('Evaluate polynom: ', monom.display, values, monom.evaluate(values).display);\r\n r.add(monom.evaluate(values, asNumeric))\r\n })\r\n\r\n return r\r\n }\r\n\r\n // -------------------------------------\r\n /**\r\n * Factorize a polynom and store the best results in factors.\r\n * @param letter\r\n */\r\n public factorize = (letter?: string): Polynom[] => {\r\n let factors: Polynom[] = []\r\n let P = this.clone().reorder()\r\n\r\n // Extract the common monom\r\n // 2x^3+6x^2 => 2x^2\r\n const M = P.commonMonom()\r\n // If the polynom starts with a negative monom, factorize it.\r\n if (P.monomByDegree().coefficient.isStrictlyNegative() && M.coefficient.isStrictlyPositive() && !M.isOne()) {\r\n M.opposite()\r\n }\r\n\r\n\r\n if (!M.isOne()) {\r\n const tempPolynom: Polynom = new Polynom(M)\r\n factors = [tempPolynom.clone()]\r\n P = P.euclidean(tempPolynom).quotient\r\n }\r\n\r\n // Main loop\r\n let securityLoop = P.degree().clone().multiply(2).value,\r\n maxDegree = 1\r\n while (securityLoop >= 0) {\r\n securityLoop--\r\n if (P.monoms.length < 2) {\r\n // The polynom has only one monom => 7x^2\r\n // No need to continue.\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n P.one()\r\n }\r\n break\r\n } else if (P.degree(letter).isOne()) {\r\n // The polynom is a first degree polynom => 3x-5\r\n // No need to continue\r\n factors.push(P.clone())\r\n P.one()\r\n break\r\n } else {\r\n // Create the list of all \"potential\" polynom dividers.\r\n let allDividers: Polynom[] = this.#getAllPotentialFactors(P, maxDegree, letter ?? 'x')\r\n maxDegree = P.degree(letter).value\r\n\r\n // Actually: 100ms\r\n while (allDividers.length > 0) {\r\n const div = allDividers[0]\r\n\r\n if (!P.isDividableBy(div))\r\n // Not dividable. Remove it from the list\r\n {\r\n allDividers.shift()\r\n } else {\r\n // It's dividable - so make the division\r\n const result = P.euclidean(div)\r\n\r\n // Add the factor\r\n factors.push(div)\r\n\r\n // As it's dividable, get the quotient.\r\n P = result.quotient.clone()\r\n\r\n // filter all dividers that are no more suitable.\r\n allDividers = allDividers.filter(x => {\r\n const pX = P.monoms[0],\r\n pC = P.monoms[P.monoms.length - 1],\r\n dX = x.monoms[0],\r\n dC = x.monoms[x.monoms.length - 1]\r\n\r\n // Check last item (degree zero)\r\n if (!pC.isDivisible(dC)) {\r\n return false\r\n }\r\n\r\n // Check the first item (degree max)\r\n return pX.isDivisible(dX)\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Maybe there is still something in the Polynom (not everything was possible to factorize)\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n }\r\n\r\n\r\n // Save the factors\r\n this.#factors = factors\r\n\r\n return this.#factors\r\n }\r\n\r\n public fromCoefficients(...values: InputValue<Fraction>[]) {\r\n this.#monoms = []\r\n const letter = 'x'\r\n values.reverse().forEach((coeff, index) => {\r\n const monom = new Monom()\r\n monom.coefficient = new Fraction(coeff)\r\n monom.setLetter(letter, index)\r\n\r\n this.#monoms.push(monom)\r\n })\r\n\r\n return this\r\n }\r\n\r\n public gcdDenominator = (): number => {\r\n return Numeric.gcd(...this.getDenominators())\r\n }\r\n\r\n public gcdNumerator = (): number => {\r\n return Numeric.gcd(...this.getNumerators())\r\n }\r\n\r\n public getCoefficients(): Fraction[] {\r\n // Assume there is only one letter.\r\n const orderedPolynom = this.clone().reorder()\r\n\r\n const length = this.degree().value + 1\r\n const coeffs = new Array(length).fill(new Fraction(0))\r\n\r\n orderedPolynom.monoms.forEach(monom => {\r\n const index = length - monom.degree().value - 1\r\n coeffs[index] = monom.coefficient.clone()\r\n })\r\n\r\n // return orderedPolynom.monoms.map(x=>x.coefficient)\r\n return coeffs\r\n }\r\n\r\n // Next functions are used for for commonMonom, which is used in the factorize method.\r\n public getDenominators = (): number[] => {\r\n const denominators: number[] = []\r\n for (const m of this.#monoms) {\r\n denominators.push(m.coefficient.denominator)\r\n }\r\n\r\n return denominators\r\n }\r\n\r\n public getNumerators = (): number[] => {\r\n const numerators: number[] = []\r\n for (const m of this.#monoms) {\r\n numerators.push(m.coefficient.numerator)\r\n }\r\n\r\n return numerators\r\n }\r\n\r\n public getZeroes = (): ISolution[] => {\r\n if (this.degree().isZero()) {\r\n return []\r\n }\r\n\r\n this.roots = new EquationSolver(this.clone()).solve()\r\n return this.roots\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.variables.includes(letter)\r\n }\r\n\r\n public integrate = (a: InputValue<Fraction>, b: InputValue<Fraction>, letter = 'x'): Fraction => {\r\n const primitive = this.primitive(letter)\r\n\r\n const valuesA: literalType<Fraction> = {},\r\n valuesB: literalType<Fraction> = {}\r\n\r\n valuesA[letter] = new Fraction(a)\r\n valuesB[letter] = new Fraction(b)\r\n\r\n return (primitive.evaluate(valuesB) as Fraction).subtract(primitive.evaluate(valuesA))\r\n }\r\n\r\n public inverse(): Polynom | undefined {\r\n return undefined\r\n }\r\n\r\n public isDeveloped = (polynomString: string): boolean => {\r\n let P: Polynom\r\n\r\n // Start by removing the parenthesis after a \"power\"\r\n const pString = polynomString.replaceAll(/\\^\\(([-0-9/]+)\\)/g, '$1')\r\n\r\n // There is at least one parenthesis - it is not developed.\r\n if (pString.includes('(') || pString.includes(')')) {\r\n return false\r\n }\r\n\r\n\r\n // Try to build the polynom\r\n try {\r\n // Build the polynom\r\n P = new Polynom(polynomString)\r\n } catch (e) {\r\n return false\r\n }\r\n\r\n // Both polynom aren't the same (once developed and reduced => they cannot be equivalent)\r\n if (!this.isEqual(P)) {\r\n return false\r\n }\r\n\r\n\r\n // Check that everything is completely developed. Actually, there are no parentheses... so it is fully developed\r\n return true\r\n }\r\n\r\n public isDividableBy = (div: Polynom): boolean => {\r\n // Quick evaluation.\r\n if (div.degree().isOne()) {\r\n const zero = div.getZeroes()[0]\r\n\r\n if (zero.exact instanceof Fraction) {\r\n return (this.evaluate(zero.exact) as Fraction).isZero()\r\n } else {\r\n return false\r\n }\r\n\r\n } else {\r\n const {reminder} = this.euclidean(div)\r\n return reminder.isZero()\r\n }\r\n }\r\n\r\n public isEqual = (P: Polynom): boolean => {\r\n return this.#compare(P, '=')\r\n }\r\n\r\n public get isMultiVariable(): boolean {\r\n // Determine if a monom has more than one variable.\r\n return this.#monoms.some(m => m.variables.length > 1)\r\n }\r\n\r\n public isOne(): boolean {\r\n return this.#monoms.length === 1 && this.#monoms[0].coefficient.isOne() && this.degree().isZero()\r\n }\r\n\r\n public isOppositeAt = (P: Polynom): boolean => {\r\n return this.#compare(P.clone().opposite(), '=')\r\n }\r\n\r\n public isReduced = (polynomString: string): boolean => {\r\n // The polynom must be developed to be reduced.\r\n if (!this.isDeveloped(polynomString)) {\r\n return false\r\n }\r\n\r\n\r\n const P = new Polynom(polynomString)\r\n if (P.monoms.length > this.monoms.length) {\r\n return false\r\n }\r\n\r\n\r\n // TODO: Not sure the reduced system checking is working properly !\r\n for (const m of P.monoms) {\r\n if (!m.coefficient.isReduced()) {\r\n return false\r\n }\r\n }\r\n\r\n\r\n return false\r\n }\r\n\r\n public isSameAs = (P: Polynom): boolean => {\r\n return this.#compare(P, 'same')\r\n }\r\n\r\n public isZero(): boolean {\r\n return (this.#monoms.length === 1 && this.#monoms[0].coefficient.isZero()) || this.#monoms.length === 0\r\n }\r\n\r\n public lcmDenominator = (): number => {\r\n return Numeric.lcm(...this.getDenominators())\r\n }\r\n\r\n public lcmNumerator = (): number => {\r\n return Numeric.lcm(...this.getNumerators())\r\n }\r\n\r\n public get length() {\r\n return this.#monoms.length\r\n }\r\n\r\n public letters = (): string[] => {\r\n let S = new Set<string>()\r\n\r\n for (const m of this.#monoms) {\r\n S = new Set([...S, ...m.variables])\r\n }\r\n\r\n\r\n return [...S]\r\n }\r\n\r\n public limitToInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === 1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposite()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n\r\n public limitToNegativeInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === -1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposite()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n\r\n public monomByDegree = (degree?: Fraction | number, letter?: string): Monom => {\r\n if (degree === undefined)\r\n // return the highest degree monom.\r\n {\r\n return this.monomByDegree(this.degree(letter), letter)\r\n }\r\n\r\n\r\n // Reduce the polynom.\r\n const M = this.clone().reduce()\r\n for (const m of M.#monoms) {\r\n if (m.degree(letter).isEqual(degree)) {\r\n return m.clone()\r\n }\r\n }\r\n\r\n\r\n // Nothing was found - return the null monom.\r\n return new Monom().zero()\r\n }\r\n\r\n // Used in LinearSystem.tex\r\n public monomByLetter = (letter: string): Monom => {\r\n const M = this.clone().reduce()\r\n for (const m of M.#monoms) {\r\n if (m.hasVariable(letter)) {\r\n return m.clone()\r\n }\r\n }\r\n\r\n\r\n return new Monom().zero()\r\n }\r\n\r\n // ------------------------------------------\r\n public get monoms() {\r\n return this.#monoms\r\n }\r\n\r\n public set monoms(M: Monom[]) {\r\n this.#monoms = M\r\n }\r\n\r\n public monomsByDegree = (degree?: number | Fraction, letter?: string): Monom[] => {\r\n if (degree === undefined)\r\n // return the highest degree monom.\r\n {\r\n return this.monomsByDegree(this.degree(letter))\r\n }\r\n\r\n // Reduce the polynom.\r\n const Ms: Monom[] = []\r\n\r\n const M = this.clone().reduce()\r\n for (const m of M.#monoms) {\r\n if (m.degree(letter).isEqual(degree)) {\r\n Ms.push(m.clone())\r\n }\r\n }\r\n\r\n\r\n return Ms\r\n // Nothing was found - return\r\n }\r\n\r\n public multiply = (value: unknown): Polynom => {\r\n\r\n if (value instanceof Polynom) {\r\n return this.#multiplyByPolynom(value)\r\n } else if (value instanceof Fraction) {\r\n return this.#multiplyByFraction(value)\r\n } else if (value instanceof Monom) {\r\n return this.#multiplyByMonom(value)\r\n } else if (Number.isSafeInteger(value) && typeof value === 'number') {\r\n return this.#multiplyByInteger(value)\r\n }\r\n\r\n\r\n // Something went wrong...\r\n return this\r\n }\r\n\r\n public get numberOfVars(): number {\r\n return this.variables.length\r\n }\r\n\r\n public one = (): this => {\r\n this.#monoms = []\r\n this.#monoms.push(new Monom().one())\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public opposite = (): this => {\r\n this.#monoms = this.#monoms.map(m => m.opposite())\r\n return this\r\n }\r\n\r\n public get plotFunction(): string {\r\n return this.#genDisplay('tex', false, false, true)\r\n }\r\n\r\n public pow = (nb: number): Polynom => {\r\n if (!Number.isSafeInteger(nb)) {\r\n return this.zero()\r\n }\r\n\r\n if (nb < 0) {\r\n return this.zero()\r\n }\r\n\r\n if (nb === 0) {\r\n return new Polynom()\r\n }\r\n\r\n\r\n const P = this.clone()\r\n for (let i = 1; i < nb; i++) {\r\n this.multiply(P)\r\n }\r\n\r\n return this.reduce()\r\n }\r\n\r\n public primitive = (letter?: string): Polynom => {\r\n const dP = new Polynom()\r\n\r\n for (const m of this.#monoms) {\r\n dP.add(m.primitive(letter))\r\n }\r\n\r\n return dP\r\n }\r\n\r\n public reduce = (): Polynom => {\r\n // Reduce the polynom\r\n\r\n // Group the monoms by similarity\r\n let i = 0\r\n while (i < this.#monoms.length) {\r\n for (let j = i + 1; j < this.#monoms.length; j++) {\r\n if (this.#monoms[i].isSameAs(this.#monoms[j])) {\r\n this.#monoms[i].add(this.#monoms[j])\r\n this.#monoms.splice(j, 1)\r\n if (this.#monoms[i].isZero()) {\r\n this.#monoms[i] = new Monom().zero()\r\n }\r\n\r\n j--\r\n }\r\n }\r\n\r\n\r\n i++\r\n }\r\n\r\n // Remove all null monoms\r\n this.#monoms = this.#monoms.filter((m) => {\r\n return !m.coefficient.isZero()\r\n })\r\n\r\n // Reduce all monoms coefficient.\r\n for (const m of this.#monoms) {\r\n m.coefficient.reduce()\r\n }\r\n\r\n\r\n if (this.length === 0) {\r\n return new Polynom().zero()\r\n }\r\n\r\n\r\n return this.reorder()\r\n }\r\n\r\n // ------------------------------------------\r\n\r\n public reorder = (letter = 'x', revert?: boolean): this => {\r\n if (revert === undefined) {\r\n revert = false\r\n }\r\n\r\n const otherLetters = this.variables.filter(x => x !== letter)\r\n this.#monoms.sort(function (a, b) {\r\n const da = a.degree(letter).value,\r\n db = b.degree(letter).value\r\n\r\n // Values are different\r\n if (da !== db) {\r\n return revert ? da - db : db - da\r\n }\r\n\r\n // if values are equals, check other letters - it must be reverted in that case !\r\n if (otherLetters.length > 0) {\r\n for (const L of otherLetters) {\r\n const da = a.degree(L).value,\r\n db = b.degree(L).value\r\n\r\n // Values are different\r\n if (da !== db) {\r\n return revert ? da - db : db - da\r\n }\r\n }\r\n }\r\n\r\n\r\n return 0\r\n })\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Replace a variable (letter) by a polynom.\r\n * @param letter\r\n * @param P\r\n */\r\n public replaceBy = (letter: string, P: Polynom): this => {\r\n let pow: Fraction\r\n const resultPolynom: Polynom = new Polynom().zero()\r\n\r\n for (const m of this.monoms) {\r\n if (!m.hasVariable(letter) || m.literal[letter].isZero()) {\r\n resultPolynom.add(m.clone())\r\n } else {\r\n // We have found a variable to replace.\r\n\r\n // Get the power.\r\n pow = m.literal[letter].clone()\r\n\r\n // Remove the variable from the monom\r\n m.removeVariable(letter)\r\n\r\n // Add the new monom to the result polynom\r\n resultPolynom.add(P.clone().pow(Math.abs(pow.numerator)).multiply(m))\r\n }\r\n }\r\n\r\n\r\n // Reduce the monoms\r\n this.#monoms = resultPolynom.reduce().monoms\r\n return this\r\n }\r\n\r\n public root(): Polynom {\r\n throw new Error('Cannot take the root from a polynom')\r\n }\r\n\r\n get roots(): ISolution[] {\r\n return this.#rootsCache ? this.#roots : this.getZeroes()\r\n }\r\n\r\n set roots(value: ISolution[]) {\r\n this.#rootsCache = true\r\n this.#roots = value\r\n }\r\n\r\n public sqrt(): Polynom {\r\n throw new Error('Cannot take the square root from a polynom')\r\n }\r\n\r\n public subtract = (...values: InputAlgebra<Polynom>[]): Polynom => {\r\n for (const value of values) {\r\n if (value instanceof Polynom) {\r\n this.add(value.clone().opposite())\r\n } else if (value instanceof Monom) {\r\n this.#monoms.push(value.clone().opposite())\r\n } else {\r\n this.#monoms.push(new Monom(value).opposite())\r\n }\r\n }\r\n\r\n\r\n return this.reduce()\r\n }\r\n\r\n public tableOfSigns(): TABLE_OF_SIGNS {\r\n // returns ['+-', 'd|t|z', '+-']...\r\n\r\n // global roots from eventually Polyfactor. Allows to add \"extra column\".\r\n const roots: ISolution[] = this.roots\r\n\r\n // Build the table os sign length and default values\r\n // The signs looks like: ['+', 't', '+', 't', '+', 't', '+']\r\n let signs: TABLE_OF_SIGNS_VALUES[] = new Array(2 * roots.length + 1)\r\n .fill('')\r\n .map((_x, index) => {\r\n return index % 2 === 0 ? '' : 'z'\r\n })\r\n\r\n\r\n if (signs.length === 1) {\r\n // The polynom is a constant or has not roots\r\n const [a] = this.getCoefficients().map(x => x.value)\r\n signs = replace_in_array(signs, '', a > 0 ? '+' : '-')\r\n } else if (this.degree().isOne()) {\r\n // First degree: ax+b\r\n const [a] = this.getCoefficients().map(x => x.value)\r\n\r\n // Get the index of the zero.\r\n signs[0] = a > 0 ? '-' : '+'\r\n signs[1] = 'z'\r\n signs[2] = a > 0 ? '+' : '-'\r\n } else {\r\n const testingRoots = [\r\n roots[0].value - 1,\r\n ...roots.map((_root, index) => {\r\n return index === roots.length - 1 ?\r\n roots[index].value + 1 :\r\n (roots[index].value + roots[index + 1].value) / 2\r\n })\r\n ]\r\n\r\n testingRoots.forEach((test, index) => {\r\n const sign = this.evaluate({x: test}, true) as number\r\n signs[index * 2] = sign > 0 ? '+' : '-'\r\n })\r\n }\r\n\r\n return {roots, signs}\r\n }\r\n\r\n public get variables(): string[] {\r\n let V: string[] = []\r\n\r\n for (const m of this.#monoms) {\r\n V = V.concat(m.variables)\r\n }\r\n\r\n\r\n // Remove duplicates.\r\n V = [...new Set(V)]\r\n V.sort()\r\n return V\r\n }\r\n\r\n /**\r\n * Set the polynom to zero.\r\n * @returns {this}\r\n */\r\n public zero = (): this => {\r\n this.#monoms = []\r\n this.#monoms.push(new Monom().zero())\r\n return this\r\n }\r\n\r\n public get zeroes(): ISolution[] {\r\n return this.getZeroes()\r\n }\r\n\r\n #compare = (P: Polynom, sign?: string): boolean => {\r\n if (sign === undefined) {\r\n sign = '='\r\n }\r\n\r\n // Create clone version to reduce them without altering the original polynoms.\r\n const cP1 = this.clone().reduce().reorder()\r\n const cP2 = P.clone().reduce().reorder()\r\n\r\n switch (sign) {\r\n case '=':\r\n // They must have the isSame length and the isSame degree\r\n if (cP1.length !== cP2.length || !cP1.degree().isEqual(cP2.degree())) {\r\n return false\r\n }\r\n\r\n // Check if the coefficients are the isSame.\r\n return cP1.monoms\r\n .every((m1, index) => m1.isEqual(cP2.monoms[index]))\r\n\r\n case 'same':\r\n // They must have the same length and the same degree\r\n if (cP1.length !== cP2.length || !cP1.degree().isEqual(cP2.degree())) {\r\n return false\r\n }\r\n\r\n return cP1.monoms\r\n .every((m1, index) => m1.isSameAs(cP2.monoms[index]))\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n\r\n #divideByFraction = (F: Fraction): this => {\r\n for (const m of this.#monoms) {\r\n m.coefficient.divide(F)\r\n }\r\n\r\n return this\r\n }\r\n\r\n #divideByInteger = (nb: number): this => {\r\n const nbF = new Fraction(nb)\r\n for (const m of this.#monoms) {\r\n m.coefficient.divide(nbF)\r\n }\r\n\r\n return this\r\n }\r\n\r\n #evaluateAsNumeric = (values: literalType<number | Fraction> | InputValue<Fraction>): number => {\r\n let r = 0\r\n this.#monoms.forEach(monom => {\r\n r += monom.evaluate(values, true) as number\r\n })\r\n\r\n return r\r\n }\r\n\r\n #factorize2ndDegree = (letter: string): Polynom[] => {\r\n let P1: Polynom, P2: Polynom,\r\n a, b, c, delta, x1, x2, factor\r\n\r\n // One variable only\r\n if (this.numberOfVars === 1) {\r\n a = this.monomByDegree(2, letter).coefficient\r\n b = this.monomByDegree(1, letter).coefficient\r\n c = this.monomByDegree(0, letter).coefficient\r\n delta = b.clone().pow(2).subtract(a.clone().multiply(c).multiply(4))\r\n\r\n if (delta.isZero()) {\r\n x1 = b.clone().opposite().divide(a.clone().multiply(2))\r\n P1 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n P2 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n factor = a.divide(x1.denominator).divide(x1.denominator)\r\n\r\n if (!factor.isOne()) {\r\n return [new Polynom(factor.display), P1, P2]\r\n } else {\r\n return [P1, P2]\r\n }\r\n\r\n } else if (delta.isPositive() && delta.isSquare()) {\r\n x1 = b.clone().opposite()\r\n .add(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n x2 = b.clone().opposite()\r\n .subtract(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n\r\n // (2x+5)(3x-2)\r\n // 6x^2+11x-10\r\n // a = 6, b = 11, c = -10\r\n // delta = 121-4*6*(-10) = 361= 19^2\r\n // x1 = (-11 + 19) / 12 = 8/12 = 2/3\r\n // x2 = (-11 - 19) / 12 = -30/12 = -5/2\r\n factor = a.divide(x1.denominator).divide(x2.denominator)\r\n if (factor.isOne()) {\r\n return [\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n } else {\r\n return [\r\n new Polynom(factor.display),\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n }\r\n\r\n\r\n } else\r\n // No solution possible - return the complete value.\r\n {\r\n return [this.clone()]\r\n }\r\n\r\n } else {\r\n // If multiple variables, only handle perfect squares...\r\n a = this.monomByDegree(2, letter)\r\n b = this.monomByDegree(1, letter)\r\n c = this.monomByDegree(0, letter)\r\n\r\n if (a.isLiteralSquare() && c.isLiteralSquare())\r\n // Check the middle item is same as...\r\n\r\n\r\n {\r\n if (b.clone().pow(2).isSameAs(a.clone().multiply(c))) {\r\n // Determine if the coefficient values matches.\r\n\r\n // Search 4 values (r, s, t, u) that matches:\r\n // (r X + s Y)(t X + u Y) = rt X^2 + (ru + st) XY + su Y^2\r\n\r\n const xPolynom = new Polynom('x', a.coefficient, b.coefficient, c.coefficient)\r\n const xFactors = xPolynom.#factorize2ndDegree('x')\r\n\r\n const factors = []\r\n let xyzPolynom: Polynom\r\n\r\n if (xFactors.length >= 2) {\r\n for (const p of xFactors) {\r\n if (p.degree().isZero()) {\r\n factors.push(p.clone())\r\n } else {\r\n xyzPolynom = p.clone()\r\n xyzPolynom.monoms[0].literal = a.literalSqrt\r\n xyzPolynom.monoms[1].literal = c.literalSqrt\r\n factors.push(xyzPolynom.clone())\r\n }\r\n }\r\n\r\n\r\n return factors\r\n }\r\n }\r\n }\r\n\r\n\r\n return [this.clone()]\r\n }\r\n }\r\n\r\n #genDisplay = (output?: string, forceSign?: boolean, wrapParentheses?: boolean, withAllMultiplicationSign?: boolean): string => {\r\n let P = ''\r\n\r\n for (const k of this.#monoms) {\r\n if (k.coefficient.value === 0) {\r\n continue\r\n }\r\n\r\n\r\n // The monom to be displayed\r\n let m\r\n if (withAllMultiplicationSign) {\r\n m = k.plotFunction\r\n } else {\r\n m = (output === 'tex') ? k.tex : k.display\r\n }\r\n\r\n P += `${(k.coefficient.sign() === 1 && (P !== '' || forceSign === true)) ? '+' : ''}${m}`\r\n }\r\n\r\n if (wrapParentheses === true && this.length > 1) {\r\n if (output === 'tex') {\r\n P = `\\\\left( ${P} \\\\right)`\r\n } else {\r\n P = `(${P})`\r\n }\r\n }\r\n\r\n\r\n if (P === '') {\r\n P = '0'\r\n }\r\n\r\n return P\r\n }\r\n\r\n #getAllPotentialFactors = (P: Polynom, maxDegree: number, letter: string): Polynom[] => {\r\n const m1 = P.monoms[0].dividers,\r\n m2 = P.monoms[P.monoms.length - 1].dividers\r\n\r\n const allDividers: Polynom[] = []\r\n m1.forEach(m1d => {\r\n // Get only polynom that has a degree less than a specific value\r\n if (m1d.degree(letter).isLeq(maxDegree)) {\r\n m2.forEach(m2d => {\r\n if (m1d.degree(letter).isNotEqual(m2d.degree(letter))) {\r\n allDividers.push(new Polynom(m1d, m2d))\r\n allDividers.push(new Polynom(m1d, m2d.clone().opposite()))\r\n }\r\n })\r\n }\r\n\r\n\r\n })\r\n\r\n return allDividers\r\n }\r\n\r\n #multiplyByFraction = (F: Fraction): Polynom => {\r\n for (const m of this.#monoms) {\r\n m.coefficient.multiply(F)\r\n }\r\n\r\n\r\n return this.reduce()\r\n }\r\n\r\n #multiplyByInteger = (nb: number): Polynom => {\r\n return this.#multiplyByFraction(new Fraction(nb))\r\n }\r\n\r\n #multiplyByMonom = (M: Monom): Polynom => {\r\n for (const m of this.#monoms) {\r\n m.multiply(M)\r\n }\r\n\r\n return this.reduce()\r\n }\r\n\r\n #multiplyByPolynom = (P: Polynom): Polynom => {\r\n const M: Monom[] = []\r\n for (const m1 of this.#monoms) {\r\n for (const m2 of P.monoms) {\r\n M.push(Monom.xMultiply(m1, m2))\r\n }\r\n }\r\n\r\n\r\n this.#monoms = M\r\n return this.reduce()\r\n }\r\n\r\n #parseString(inputStr: string, ...values: unknown[]): this {\r\n if (values.length === 0) {\r\n inputStr = '' + inputStr\r\n\r\n // Parse the polynom using the shutting yard algorithm\r\n if (inputStr !== '' && !isNaN(Number(inputStr))) {\r\n this.empty()\r\n // It's a simple number.\r\n const m = new Monom(inputStr)\r\n // m.coefficient = new Fraction(inputStr);\r\n // m.literalStr = '';\r\n this.add(m)\r\n return this\r\n }\r\n\r\n // Parse the string.\r\n return this.#shutingYardToReducedPolynom(inputStr)\r\n } else if (/^[a-z]+/.test(inputStr)) {\r\n // We assume the inputStr contains only letters.\r\n this.empty()\r\n\r\n const fractions = values.map(x => new Fraction(x as InputValue<Fraction>))\r\n\r\n // Multiple setLetter version\r\n if (inputStr.length > 1) {\r\n const letters = inputStr.split('')\r\n\r\n if (letters.length < values.length - 2) {\r\n throw new Error('Too many factors for too few variables !')\r\n }\r\n\r\n let i = 0\r\n\r\n for (const F of fractions) {\r\n const m = new Monom()\r\n m.coefficient = F.clone()\r\n m.literalStr = letters[i] || ''\r\n this.add(m)\r\n i++\r\n }\r\n }\r\n // Single setLetter version\r\n else {\r\n let n = fractions.length - 1\r\n for (const F of fractions) {\r\n const m = new Monom()\r\n m.coefficient = F.clone()\r\n m.literalStr = `${inputStr}^${n}`\r\n this.add(m)\r\n n--\r\n }\r\n }\r\n return this\r\n } else {\r\n return this.zero()\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Main parse using a shutting yard class\r\n * @param inputStr\r\n */\r\n #shutingYardToReducedPolynom = (inputStr: string): this => {\r\n // Get the RPN array of the current expression\r\n const SY: ShutingYard = new ShutingYard().parse(inputStr)\r\n const rpn: { token: string, tokenType: ShutingyardType }[] = SY.rpn\r\n\r\n // New version for reducing shuting yard.\r\n this.zero()\r\n\r\n const stack: Polynom[] = []\r\n\r\n // Loop through the each element of the RPN\r\n for (const element of rpn) {\r\n this.#shutingYard_addToken(stack, element)\r\n }\r\n\r\n\r\n if (stack.length === 1) {\r\n this.add(stack[0])\r\n }\r\n\r\n\r\n return this.reorder()\r\n }\r\n\r\n #shutingYard_addToken = (stack: Polynom[], element: Token): void => {\r\n switch (element.tokenType) {\r\n case ShutingyardType.COEFFICIENT:\r\n stack.push(new Polynom(element.token))\r\n break\r\n\r\n case ShutingyardType.VARIABLE:\r\n stack.push(new Polynom().add(new Monom(element.token)))\r\n break\r\n\r\n case ShutingyardType.CONSTANT:\r\n // TODO: add constant support to Polynom parsing.\r\n console.log('Actually, not supported - will be added later !')\r\n break\r\n\r\n case ShutingyardType.OPERATION:\r\n if (stack.length >= 2) {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n\r\n // Check if the polynoms are not undefined.\r\n if (a === undefined || b === undefined) {\r\n break\r\n }\r\n\r\n if (element.token === '+') {\r\n stack.push(a.add(b))\r\n } else if (element.token === '-') {\r\n stack.push(a.subtract(b))\r\n } else if (element.token === '*') {\r\n stack.push(a.multiply(b))\r\n } else if (element.token === '/') {\r\n if (b.degree().isStrictlyPositive()) {\r\n console.log('divide by a polynom -> should create a rational polynom !')\r\n } else {\r\n // a.divide(b.monoms[0].coefficient)\r\n stack.push(a.divide(b.monoms[0].coefficient))\r\n }\r\n } else if (element.token === '^') {\r\n if (b.degree().isStrictlyPositive()) {\r\n throw new Error('Cannot elevate a polynom with another polynom !')\r\n } else if (b.monoms[0].coefficient.isRelative())\r\n // Integer power\r\n {\r\n stack.push(a.pow(b.monoms[0].coefficient.value))\r\n } else {\r\n // Only allow power if the previous polynom is only a monom, without coefficient.\r\n if (a.monoms.length === 1 && a.monoms[0].coefficient.isOne()) {\r\n for (const letter in a.monoms[0].literal) {\r\n a.monoms[0].literal[letter].multiply(b.monoms[0].coefficient)\r\n }\r\n\r\n stack.push(a)\r\n } else {\r\n console.error('Cannot have power with fraction')\r\n }\r\n }\r\n }\r\n\r\n } else if (element.token === '-') {\r\n const a = stack.pop()\r\n if (a) {\r\n stack.push(a.opposite())\r\n }\r\n } else {\r\n throw new Error(\"Error parsing the polynom\")\r\n }\r\n\r\n\r\n break\r\n\r\n case ShutingyardType.MONOM:\r\n // Should never appear.\r\n console.error('The monom token should not appear here')\r\n break\r\n\r\n case ShutingyardType.FUNCTION:\r\n // Should never appear.\r\n console.error('The function token should not appear here - might be introduced later.')\r\n break\r\n }\r\n\r\n\r\n }\r\n\r\n}\r\n","import type {\r\n EQUATION_SIGN,\r\n IAlgebra,\r\n IEquation,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType\r\n} from \"../pimath.interface\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Numeric } from \"../numeric\"\r\nimport { EquationSolver } from \"./equationSolver\"\r\nimport { Monom } from \"./monom\"\r\nimport { Polynom } from \"./polynom\"\r\n\r\nexport class Equation implements\r\n IPiMathObject<Equation>,\r\n IEquation<Equation>,\r\n IAlgebra<Equation> {\r\n\r\n // Left part of the equation\r\n #left: Polynom\r\n // Right part of the equation\r\n #right: Polynom\r\n // Signe of the equation\r\n #sign: EQUATION_SIGN\r\n\r\n\r\n constructor(equation: InputAlgebra<Polynom> | Equation)\r\n constructor(left: InputAlgebra<Polynom>, right: InputAlgebra<Polynom>, sign?: EQUATION_SIGN)\r\n constructor(left?: InputAlgebra<Polynom> | Equation, right?: InputAlgebra<Polynom>, sign?: EQUATION_SIGN) {\r\n // Default equation\r\n this.#left = new Polynom().zero()\r\n this.#right = new Polynom().zero()\r\n this.#sign = '='\r\n\r\n // Only one value, it's an equation\r\n if (left !== undefined && right === undefined) {\r\n if (left instanceof Equation) {\r\n return left.clone()\r\n } else if (typeof left === 'string') {\r\n // Parse the equation as a string.\r\n this.parse(left)\r\n }\r\n\r\n } else if (left !== undefined && right !== undefined) {\r\n // Two values, it's an equation with left and right polynoms.\r\n this.left = new Polynom(left as InputAlgebra<Polynom>)\r\n this.right = new Polynom(right)\r\n }\r\n\r\n if (sign !== undefined) {\r\n this.sign = sign\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public parse = (equationString: string): this => {\r\n // Find the string separator\r\n const strSign: string | false = this.#findSign(equationString)\r\n\r\n if (strSign === false) {\r\n throw new Error('The equation is not valid (no sign found)')\r\n }\r\n\r\n // The StrSign is found\r\n const pStr: string[] = equationString.split(strSign)\r\n\r\n return this.create(new Polynom(pStr[0]), new Polynom(pStr[1]), this.#formatSign(strSign))\r\n }\r\n\r\n public create = (left: Polynom, right: Polynom, sign?: string): this => {\r\n this.#left = left\r\n this.#right = right\r\n this.#sign = this.#formatSign(sign ?? \"=\")\r\n return this\r\n }\r\n\r\n public clone = (): Equation => {\r\n return new Equation(this.#left.clone(), this.#right.clone(), this.#sign)\r\n }\r\n\r\n /**\r\n * Add a value to the equation\r\n * if value is an equation, add the left part to the left part of the equation\r\n * and the right part to the right part of the equation\r\n * if value is a string, try to create an equation\r\n * if it fails, create a polynom and add it to the left and right part of the equation\r\n * @param value | Polynom | Monom | Fraction | string | monom\r\n */\r\n public add(value: InputValue<Equation | Polynom>): this {\r\n if (value instanceof Equation) {\r\n // add the left part of the equation\r\n this.#left.add(value.left)\r\n // add the right part of the equation\r\n this.#right.add(value.right)\r\n\r\n return this\r\n }\r\n\r\n if (typeof value === 'string' &&\r\n !Equation.isEquationString(value)) {\r\n\r\n return this.add(new Equation(value))\r\n }\r\n\r\n const p = new Polynom(value)\r\n this.#left.add(p)\r\n this.#right.add(p)\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Get the degree of the equation\r\n * @param letter\r\n */\r\n public degree = (letter?: string): Fraction => {\r\n return Fraction.max(this.#left.degree(letter), this.#right.degree(letter))\r\n }\r\n\r\n /**\r\n * divide an equation by a given value (transformed as a fraction)\r\n *\r\n * ```\r\n * 8x+10=6x \\vert 2\r\n * 4x+5=3x\r\n * ```\r\n *\r\n * |>Alternatively with $3x-4$ maybe it's working ?\r\n * $$\\frac{3x}{5}$$\r\n *\r\n * @param value\r\n * @returns {Equation}\r\n */\r\n public divide = (value: InputValue<Fraction>): this => {\r\n // Make sure we have a fraction.\r\n const F: Fraction = new Fraction(value)\r\n\r\n if (F.isZero()) {\r\n return this\r\n } else {\r\n return this.multiply(F.inverse())\r\n }\r\n }\r\n\r\n /**\r\n * Create an Equation using two polynoms.\r\n * Markdown *support* is cool\r\n * @param values\r\n * @param asNumeric\r\n */\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean ): boolean {\r\n // Evaluate the left and right part of the equation.\r\n // compare the results.\r\n\r\n // Evaluate the left and right part of the equation.\r\n const left = this.#left.evaluate(values, asNumeric),\r\n right = this.#right.evaluate(values, asNumeric)\r\n\r\n // compare the results.\r\n if (asNumeric) {\r\n return left === right\r\n }\r\n\r\n return (left as Fraction).isEqual(right as Fraction)\r\n }\r\n\r\n /**\r\n * Determine if the equation contains a variable.\r\n * @param letter\r\n */\r\n public hasVariable = (letter: string): boolean => {\r\n return this.variables.includes(letter)\r\n }\r\n\r\n\r\n public isEqual(value: InputValue<Equation>): boolean {\r\n const equ = new Equation(value)\r\n return equ.left.isEqual(this.#left) && equ.right.isEqual(this.#right)\r\n }\r\n\r\n public isLinearTo = (equ: Equation): boolean => {\r\n // Move all left.\r\n const p1 = equ.clone().moveLeft().simplify().left,\r\n p2 = this.clone().moveLeft().simplify().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOppositeAt(p2)\r\n }\r\n\r\n /**\r\n * Determine if the equation contains more than one letter/variable.\r\n */\r\n public isMultiVariable = (): boolean => {\r\n return this.#left.isMultiVariable || this.#right.isMultiVariable\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations helpers\r\n public isEqualTo = (equ: Equation): boolean => {\r\n const p1 = equ.clone().moveLeft().left,\r\n p2 = this.clone().moveLeft().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOppositeAt(p2)\r\n }\r\n\r\n /**\r\n * Reorder the polynom to have only one letter on the left, the rest on the right.\r\n * @param letter\r\n */\r\n public isolate = (letter?: string): this | false => {\r\n // Determine if we can isolate the variables.\r\n\r\n // Both part of the equations must be of the first degree.\r\n if (!this.degree(letter).isOne()) {\r\n return false\r\n }\r\n\r\n // Modify the equation to isolate the asked variable.\r\n if (this.isMultiVariable()) {\r\n return false\r\n }\r\n\r\n // Isolate the letter.\r\n let mMove: Monom\r\n // Start by moving everything to the left.\r\n this.#left.subtract(this.#right)\r\n this.#right.zero()\r\n const values = [...this.#left.monoms]\r\n for (const m of values) {\r\n if (!m.hasVariable(letter)) {\r\n mMove = m.clone()\r\n this.#left.subtract(mMove)\r\n this.#right.subtract(mMove)\r\n }\r\n }\r\n\r\n // In theory, we should have only one item on the left.\r\n if (this.#left.length !== 1) {\r\n return false\r\n }\r\n\r\n const cMove: Fraction = this.#left.monoms[0].coefficient.clone()\r\n this.#left.divide(cMove)\r\n this.#right.divide(cMove)\r\n return this\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations operations\r\n\r\n // -----------------------------------------------\r\n public letters = (): string[] => {\r\n return [...new Set([...this.#left.letters(), ...this.#right.letters()])]\r\n }\r\n\r\n // -----------------------------------------------\r\n /**\r\n * Reorder will move all monoms containing a letter on the left, all the other on the right.\r\n */\r\n public moveLeft = (): this => {\r\n this.#left.subtract(this.#right)\r\n this.#right.zero()\r\n return this\r\n }\r\n\r\n /**\r\n * Multiple an equation by a fraction value.\r\n * @param value\r\n */\r\n public multiply = (value: InputValue<Fraction>): this => {\r\n // Make sure we have a fraction.\r\n const F: Fraction = new Fraction(value)\r\n\r\n // Multiply each part of the equation by the fraction\r\n this.#left.multiply(F)\r\n this.#right.multiply(F)\r\n\r\n // The sign of the inequality must be changed.\r\n if (this.#sign !== '=' && F.sign() === -1) {\r\n this.#reverseSign()\r\n }\r\n\r\n return this\r\n }\r\n\r\n public pow(value: number): this {\r\n this.#left.pow(value)\r\n this.#right.pow(value)\r\n return this\r\n }\r\n public opposite = (): this => {\r\n this.#left = this.#left.opposite()\r\n this.#right = this.#right.opposite()\r\n return this\r\n }\r\n\r\n public reduce(): this {\r\n // reduce means moving everything to the left\r\n // remove the fractions\r\n // simplify the equation\r\n // reorder the equation\r\n // start with a positive left part\r\n\r\n // Move all left. The right part is now zero.\r\n this.moveLeft()\r\n\r\n // Reduce the equation: simplify and reorder.\r\n this.#left.reduce()\r\n\r\n // Simplify the equation.\r\n this.simplify()\r\n\r\n // Make sure the first part is positive.\r\n if (this.#left.monoms[0].coefficient.isNegative()) {\r\n this.multiply(-1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public reorder = (allLeft?: boolean): this => {\r\n // Move all monoms of degree greater than 0 to the left.\r\n // and all zero degree monoms to the right.\r\n this.#left.subtract(this.#right)\r\n this.#right.zero()\r\n this.#left.reorder()\r\n\r\n // we have all left (so equal zero) : it's done !\r\n if (allLeft) {\r\n return this\r\n }\r\n\r\n // Fetch all zero degree monoms.\r\n this.#left.monoms\r\n .filter(m => m.degree().isZero())\r\n .forEach(m => {\r\n const move = m.clone()\r\n this.#left.subtract(move)\r\n this.#right.subtract(move)\r\n })\r\n\r\n // Reorder the left and right polynoms\r\n this.#left.reorder()\r\n this.#right.reorder()\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n public replaceBy = (letter: string, P: Polynom): this => {\r\n this.#left.replaceBy(letter, P)\r\n this.#right.replaceBy(letter, P)\r\n return this\r\n }\r\n\r\n /**\r\n * Multiply by the lcm denominator and divide by the gcm numerators.\r\n */\r\n public simplify = (): this => {\r\n this.multiply(Numeric.lcm(...this.#left.getDenominators(), ...this.#right.getDenominators()))\r\n this.divide(Numeric.gcd(...this.#left.getNumerators(), ...this.#right.getNumerators()))\r\n return this\r\n }\r\n\r\n // -----------------------------------------------\r\n public solve = (): ISolution[] => {\r\n const solver = new EquationSolver(this.clone())\r\n return solver.solve()\r\n }\r\n\r\n public split(): [Polynom, Polynom] {\r\n return [this.#left.clone(), this.#right.clone()]\r\n }\r\n\r\n public subtract(value: InputValue<Equation | Polynom>): this {\r\n if (value instanceof Equation) {\r\n this.#left.subtract(value.left)\r\n this.#right.subtract(value.right)\r\n\r\n return this\r\n }\r\n\r\n if (typeof value === 'string' &&\r\n !Equation.isEquationString(value)) {\r\n return this.subtract(new Equation(value))\r\n }\r\n\r\n const p = new Polynom(value)\r\n this.#left.subtract(p)\r\n this.#right.subtract(p)\r\n\r\n return this\r\n }\r\n\r\n public test = (values: literalType<Fraction>): boolean => {\r\n return (this.left.evaluate(values) as Fraction).isEqual(this.right.evaluate(values))\r\n }\r\n\r\n public static isEquationString(equationString: string): boolean {\r\n // The equation sign can be one of the following:\r\n // =, <, >, <=, >=\r\n\r\n return equationString.includes('=') ||\r\n equationString.includes('<') ||\r\n equationString.includes('>') ||\r\n equationString.includes('<=') ||\r\n equationString.includes('>=')\r\n }\r\n\r\n public static makeSolutionsUnique(solutions: ISolution[], sorted?: boolean): ISolution[] {\r\n const solutionAsTex: string[] = [],\r\n uniqueSolutions = solutions.filter(sol => {\r\n if (!solutionAsTex.includes(sol.tex)) {\r\n solutionAsTex.push(sol.tex)\r\n return true\r\n } else {\r\n return false\r\n }\r\n })\r\n\r\n if (sorted === true) {\r\n uniqueSolutions.sort((a, b) => a.value - b.value)\r\n }\r\n\r\n return uniqueSolutions\r\n }\r\n\r\n public get display(): string {\r\n return `${this.#left.display}${this.signAsTex}${this.#right.display}`\r\n }\r\n\r\n // Getter and setter\r\n public get left(): Polynom {\r\n return this.#left\r\n }\r\n\r\n public set left(value: Polynom) {\r\n this.#left = value\r\n }\r\n\r\n public get numberOfVars(): number {\r\n return this.variables.length\r\n }\r\n\r\n public get right(): Polynom {\r\n return this.#right\r\n }\r\n\r\n public set right(value: Polynom) {\r\n this.#right = value\r\n }\r\n\r\n // ------------------------------------------\r\n public get sign(): string {\r\n return this.#sign\r\n }\r\n\r\n public set sign(value: string) {\r\n // Set the sign value as formatted.\r\n this.#sign = this.#formatSign(value)\r\n }\r\n\r\n public get signAsTex(): string {\r\n if (this.#sign === '>=') {\r\n return '\\\\geq'\r\n }\r\n\r\n if (this.#sign === '<=') {\r\n return '\\\\leq'\r\n }\r\n\r\n return this.#sign\r\n }\r\n\r\n public get tex(): string {\r\n return `${this.#left.tex}${this.signAsTex}${this.#right.tex}`\r\n }\r\n\r\n public get variables(): string[] {\r\n return [...new Set(this.#right.variables.concat(this.#left.variables))]\r\n }\r\n\r\n #findSign = (equationString: string): string | false => {\r\n if (equationString.includes('geq')) {\r\n return (equationString.includes('\\\\geq')) ? '\\\\geq' : 'geq'\r\n } else if (equationString.includes('leq')) {\r\n return (equationString.includes('\\\\leq')) ? '\\\\leq' : 'leq'\r\n } else if (equationString.includes('>=')) {\r\n return '>='\r\n } else if (equationString.includes('=>')) {\r\n return '=>'\r\n } else if (equationString.includes('>')) {\r\n return '>'\r\n } else if (equationString.includes('<=')) {\r\n return '<='\r\n } else if (equationString.includes('=<')) {\r\n return '=<'\r\n } else if (equationString.includes('<')) {\r\n return '<'\r\n } else if (equationString.includes('=')) {\r\n return '='\r\n }\r\n\r\n throw new Error('The equation is not valid (no sign found)')\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations solving algorithms\r\n #formatSign = (signStr?: string): EQUATION_SIGN => {\r\n if (signStr === undefined) {\r\n return '='\r\n }\r\n\r\n if (signStr.includes('geq')) {\r\n return '>='\r\n } else if (signStr.includes('>=')) {\r\n return '>='\r\n } else if (signStr.includes('=>')) {\r\n return '>='\r\n } else if (signStr.includes('>')) {\r\n return '>'\r\n } else if (signStr.includes('leq')) {\r\n return '<='\r\n } else if (signStr.includes('<=')) {\r\n return '<='\r\n } else if (signStr.includes('=<')) {\r\n return '<='\r\n } else if (signStr.includes('<')) {\r\n return '<'\r\n } else {\r\n return '='\r\n }\r\n }\r\n\r\n #reverseSign = (): this => {\r\n if (this.#sign === '=') {\r\n return this\r\n }\r\n\r\n if (this.#sign.includes('<')) {\r\n this.#sign.replace('<', '>')\r\n return this\r\n }\r\n if (this.#sign.includes('>')) {\r\n this.#sign.replace('>', '<')\r\n return this\r\n }\r\n\r\n return this\r\n }\r\n}\r\n","import type {\r\n IAlgebra,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType,\r\n TABLE_OF_SIGNS\r\n} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients/fraction\"\r\nimport {Polynom} from \"./polynom\"\r\nimport {replace_in_array, wrapParenthesis} from \"../helpers\"\r\n\r\nexport class Factor implements IPiMathObject<Factor>,\r\n IExpression<Factor>,\r\n IAlgebra<Factor> {\r\n #displayMode: FACTOR_DISPLAY\r\n #polynom: Polynom\r\n #power: Fraction\r\n #singleMode = false\r\n\r\n constructor(value?: InputAlgebra<Polynom> | Factor, power?: InputValue<Fraction>) {\r\n\r\n\r\n if (value instanceof Factor) {\r\n this.#polynom = value.polynom.clone()\r\n this.#power = value.power.clone()\r\n\r\n if(power !== undefined){\r\n this.#power.multiply(new Fraction(power))\r\n }\r\n } else if(value !== undefined) {\r\n this.#polynom = new Polynom(value)\r\n this.#power = new Fraction(power ?? 1)\r\n }else{\r\n this.#polynom = new Polynom()\r\n this.#power = new Fraction(1)\r\n }\r\n\r\n this.#displayMode = FACTOR_DISPLAY.POWER\r\n\r\n return this\r\n }\r\n\r\n public parse(/*value: InputValue<Factor>*/): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public clone(): Factor {\r\n return new Factor(this)\r\n }\r\n\r\n public fromPolynom(polynom: InputValue<Polynom>): this {\r\n this.#polynom = new Polynom(polynom)\r\n this.#power = new Fraction(1)\r\n return this\r\n }\r\n public get tex(): string {\r\n const num = this.power.numerator\r\n const den = this.power.denominator\r\n\r\n let base: string\r\n let power: string\r\n\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && den > 1) {\r\n base = `\\\\sqrt${den === 2 ? '' : `[ ${den} ]`}{ ${this.polynom.tex} }`\r\n power = num === 1 ? '' : `^{ ${num} }`\r\n } else {\r\n base = this.#singleMode && this.power.isOne() ? this.polynom.tex : wrapParenthesis(this.polynom.tex)\r\n power = (den === 1 && num === 1) ? '' : `^{ ${this.power.tex} }`\r\n }\r\n\r\n // Add the power if it's not 1 or -1\r\n base = `${base}${power}`\r\n\r\n // If the power is negative, make it as a fraction.\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && num < 0) {\r\n base = `\\\\frac{ 1 }{ ${base} }`\r\n }\r\n\r\n\r\n return base\r\n }\r\n\r\n public get display(): string {\r\n const num = this.power.numerator\r\n const den = this.power.denominator\r\n\r\n let base: string\r\n let power: string\r\n\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && den > 1) {\r\n base = `${den === 2 ? 'sqrt' : `root(${den})`}(${this.polynom.display})`\r\n power = num === 1 ? '' : `^(${num})`\r\n } else {\r\n base = this.#singleMode && this.power.isOne() ? this.polynom.display : wrapParenthesis(this.polynom.display, false)\r\n power = (den === 1 && num === 1) ? '' : `^(${this.power.display})`\r\n }\r\n\r\n // Add the power if it's not 1 or -1\r\n base = `${base}${power}`\r\n\r\n // If the power is negative, make it as a fraction.\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT && num < 0) {\r\n base = `1/(${base})`\r\n }\r\n\r\n\r\n return base\r\n }\r\n\r\n public add(): Factor {\r\n throw new Error(\"Adding two factors is not possible\")\r\n }\r\n\r\n public get asSingle(): this {\r\n this.#singleMode = true\r\n return this\r\n }\r\n\r\n public degree(letter?: string): Fraction {\r\n return this.polynom.degree(letter).multiply(this.power)\r\n }\r\n\r\n public derivative(): Factor[] {\r\n // The power is zero, the derivative is zero\r\n if (this.power.isZero()) {\r\n return [new Factor('0')]\r\n }\r\n\r\n // The power is one, the derivative is the derivative of the polynom\r\n if (this.power.isOne()) {\r\n return [new Factor(this.polynom.clone().derivative())]\r\n }\r\n\r\n // In any other case, the derivative consist of three Factors:\r\n // the derivative of the polynom, the power and the polynom\r\n return [\r\n new Factor(this.power.clone()),\r\n new Factor(this.polynom.clone().derivative()),\r\n new Factor(this.polynom.clone(), this.power.clone().subtract(1))\r\n ]\r\n }\r\n\r\n public develop(): Polynom {\r\n if (this.power.isNatural()) {\r\n return this.polynom.clone().pow(this.power.value)\r\n }\r\n\r\n throw new Error(\"The power must be a natural number\")\r\n }\r\n\r\n public divide(value: InputAlgebra<Factor | Polynom>): this {\r\n if (value instanceof Factor) {\r\n if (this.isSameAs(value)) {\r\n this.power.subtract(value.power)\r\n return this\r\n }\r\n }\r\n\r\n\r\n const P = new Polynom(value as Polynom)\r\n if (this.isSameAs(P)) {\r\n this.power.subtract(1)\r\n return this\r\n }\r\n\r\n throw new Error(\"The two factors must be the same\")\r\n }\r\n\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean): number | Fraction {\r\n if (asNumeric) {\r\n return (this.polynom.evaluate(values, true) as number) ** this.power.value\r\n }\r\n\r\n\r\n return (this.polynom.evaluate(values) as Fraction).pow(this.power)\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.polynom.hasVariable(letter)\r\n }\r\n\r\n public inverse(): this {\r\n this.power.opposite()\r\n return this\r\n }\r\n\r\n public isEqual(value: Factor): boolean {\r\n // Must have the same polynom and the same reduce power\r\n\r\n return this.isSameAs(value) &&\r\n this.power.isEqual(value.power)\r\n }\r\n\r\n public isOne(): boolean {\r\n return this.polynom.isOne() || this.power.isZero()\r\n }\r\n\r\n public isSameAs(value: InputAlgebra<Factor | Polynom>) {\r\n let P: Polynom\r\n if (value instanceof Factor) {\r\n P = value.polynom\r\n } else if (value instanceof Polynom) {\r\n P = value\r\n } else {\r\n P = new Polynom(value)\r\n }\r\n\r\n\r\n return this.polynom.isEqual(P)\r\n }\r\n\r\n public isZero(): boolean {\r\n return this.polynom.isZero()\r\n }\r\n\r\n public multiply(value: InputAlgebra<Factor | Polynom>): this {\r\n if (value instanceof Factor) {\r\n if (this.isSameAs(value)) {\r\n this.power.add(value.power)\r\n return this\r\n }\r\n }\r\n\r\n\r\n const P = new Polynom(value as Polynom)\r\n if (this.isSameAs(P)) {\r\n this.power.add(1)\r\n return this\r\n }\r\n\r\n throw new Error(\"The two factors must be the same\")\r\n }\r\n\r\n public one(): this {\r\n this.#polynom.one()\r\n this.#power.one()\r\n return this\r\n }\r\n\r\n public opposite(): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public get polynom(): Polynom {\r\n return this.#polynom\r\n }\r\n\r\n public set polynom(value: Polynom) {\r\n this.#polynom = value\r\n }\r\n\r\n public pow(value: number | Fraction): this {\r\n this.power.multiply(value)\r\n return this\r\n }\r\n\r\n public get power(): Fraction {\r\n return this.#power\r\n }\r\n\r\n public set power(value: InputValue<Fraction>) {\r\n this.#power = new Fraction(value)\r\n }\r\n\r\n public primitive(): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public reduce(): Factor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public root(value: number): this {\r\n this.power.divide(value)\r\n return this\r\n }\r\n\r\n public sqrt(): this {\r\n return this.root(2)\r\n }\r\n\r\n public subtract(): Factor {\r\n throw new Error(\"Subtracting two factors is not possible\")\r\n }\r\n\r\n public tableOfSigns(): TABLE_OF_SIGNS {\r\n const pow = this.power.clone().reduce()\r\n const tos = this.polynom.tableOfSigns()\r\n\r\n // The zero roots becomes defence (d) if the power is negative\r\n if (pow.isStrictlyNegative()) {\r\n tos.signs = replace_in_array(tos.signs, 'z', 'd')\r\n }\r\n\r\n // The - sign becomes\r\n // + (plus) if the power num is even and the power den is odd\r\n // i (invalid) if the power denominator is even\r\n if (pow.denominator % 2 === 0) {\r\n // it's an even roots : no negative values!\r\n tos.signs = replace_in_array(tos.signs, '-', 'h')\r\n } else if (pow.numerator % 2 === 0) {\r\n // it's an even power : negative values becomes positive !\r\n tos.signs = replace_in_array(tos.signs, '-', '+')\r\n }\r\n\r\n\r\n return {roots: tos.roots, signs: tos.signs}\r\n }\r\n\r\n public get variables(): string[] {\r\n return this.polynom.variables\r\n }\r\n\r\n public get withPower(): this {\r\n this.#displayMode = FACTOR_DISPLAY.POWER\r\n return this\r\n }\r\n\r\n public get withRoot(): this {\r\n this.#displayMode = FACTOR_DISPLAY.ROOT\r\n return this\r\n }\r\n\r\n public zero(): this {\r\n this.#polynom.zero()\r\n this.#power.one()\r\n return this\r\n }\r\n\r\n}\r\n\r\nexport enum FACTOR_DISPLAY {\r\n ROOT,\r\n POWER\r\n}\r\n\r\n","import type {IAlgebra, IEquation, InputValue, IPiMathObject, ISolution, literalType} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Equation} from \"./equation\"\r\nimport {Monom} from \"./monom\"\r\nimport {Polynom} from \"./polynom\"\r\n\r\nexport class LinearSystem implements IPiMathObject<LinearSystem>,\r\n IEquation<LinearSystem>,\r\n IAlgebra<LinearSystem> {\r\n\r\n #equations: Equation[]\r\n\r\n // Determine the letters in the linear system, usually ['x', 'y']\r\n #variables: string[]\r\n\r\n constructor(...values: (string | Equation)[]) {\r\n this.#equations = []\r\n this.#variables = []\r\n\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public parse = (...equations: (string | Equation)[]): this => {\r\n // make the original equations\r\n this.#equations = equations.map(value => new Equation(value))\r\n\r\n // get the letters.\r\n this.#findLetters()\r\n return this\r\n }\r\n\r\n public clone = (): LinearSystem => {\r\n return new LinearSystem()\r\n .parse(...this.#equations.map(equ => equ.clone()))\r\n }\r\n\r\n public static fromMatrix(\r\n matrix: InputValue<Fraction>[][],\r\n letters = 'xyz'): LinearSystem {\r\n // Check that each row has the same number of columns\r\n const cols = matrix[0].length\r\n if (matrix.some(row => row.length !== cols)) {\r\n throw new Error(\"All rows must have the same number of columns\")\r\n }\r\n\r\n // Determine the default letters. The number of letters are cols-1\r\n const vars = letters.split('')\r\n .splice(0, cols - 1)\r\n\r\n // Create a new LinearSystem\r\n return new LinearSystem(\r\n ...matrix.map(row => {\r\n const P = new Polynom(vars.join(''), ...row)\r\n return new Equation(P, 0)\r\n })\r\n )\r\n\r\n }\r\n\r\n public add(value: InputValue<LinearSystem | Equation | Polynom>, index?: number): this {\r\n if (value instanceof LinearSystem) {\r\n const length = value.equations.length\r\n if (length !== this.#equations.length) {\r\n throw new Error(\"The number of equations must be the same\")\r\n }\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.#equations[i].add(value.equations[i])\r\n }\r\n } else {\r\n if (index === undefined || index < 0 || index >= this.#equations.length) {\r\n throw new Error(\"Index out of range\")\r\n }\r\n const equ = new Equation(value)\r\n this.#equations[index].add(equ)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public buildTex = (equations: Equation[], operators?: (string[])[]): string => {\r\n let equStr: string[]\r\n let m: Monom\r\n let letters: string[] = []\r\n const equArray: string[] = []\r\n\r\n // Get the letters from the linear system\r\n for (const equ of equations) {\r\n letters = letters.concat(equ.letters())\r\n }\r\n\r\n letters = [...new Set(letters)]\r\n letters.sort()\r\n\r\n for (let i = 0; i < equations.length; i++) {\r\n const equ = equations[i]\r\n\r\n equStr = []\r\n for (const L of letters) {\r\n m = equ.left.monomByLetter(L)\r\n\r\n if (equStr.length === 0) {\r\n equStr.push(m.isZero() ? '' : m.tex)\r\n } else {\r\n equStr.push(m.isZero() ? '' : ((m.coefficient.sign() === 1) ? '+' : '') + m.tex)\r\n }\r\n }\r\n\r\n // Add the equal sign\r\n equStr.push('=')\r\n\r\n // Add the right hand part of the equation (should be only a number, because it has been reordered)\r\n equStr.push(equ.right.tex)\r\n\r\n // Add the operations if existing\r\n if (operators?.[i] !== undefined) {\r\n // add extra space at the end of the equation\r\n equStr[equStr.length - 1] = equStr[equStr.length - 1] + ' \\\\phantom{\\\\quad}'\r\n for (const o of operators[i]) {\r\n equStr.push(`\\\\ \\\\cdot\\\\ ${o.startsWith('-') ? \"\\\\left(\" + o + \"\\\\right)\" : o}`)\r\n }\r\n }\r\n\r\n // Add to the list.\r\n equArray.push(equStr.join('&'))\r\n }\r\n\r\n let operatorsColumns = 0\r\n if (operators !== undefined && operators.length > 0) {\r\n operatorsColumns = operators[0].length\r\n }\r\n\r\n return `\\\\left\\\\{\\\\begin{array}{${\"r\".repeat(letters.length)}cl ${\"|l\".repeat(operatorsColumns)}}${equArray.join('\\\\\\\\ ')}\\\\end{array}\\\\right.`\r\n }\r\n\r\n public degree(letter?: string): Fraction {\r\n return Fraction.max(...this.#equations.map(equ => equ.degree(letter)))\r\n }\r\n\r\n get display() {\r\n // TODO : LinearSystem - display: implement the display of the linear system\r\n return this.tex + 'as display'\r\n }\r\n\r\n // ------------------------------------------\r\n public get equations(): Equation[] {\r\n return this.#equations\r\n }\r\n\r\n public set equations(value) {\r\n this.#equations = value\r\n }\r\n\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean): number | Fraction {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.#variables.includes(letter)\r\n }\r\n\r\n public isEqual(value: LinearSystem): boolean {\r\n return this.equations.every((equ, index) => equ.isEqual(value.equations[index]))\r\n }\r\n\r\n public get isSolvable(): boolean {\r\n const V = this.variables\r\n\r\n // TODO: in some case, it is possible to resolve systems if there isn't the isSame number of vars and equations\r\n if (V.length !== this.#equations.length) {\r\n return false\r\n }\r\n\r\n //TODO: Must check if two equations isn't a linear combination of the others ?\r\n\r\n return true\r\n }\r\n\r\n public get matrix(): [Fraction[][], Fraction[]] {\r\n //TODO: use Matrix class\r\n return this.#makeMatrix()\r\n }\r\n\r\n public mergeEquations = (eq1: Equation, eq2: Equation, factor1: Fraction, factor2: Fraction): Equation => {\r\n // Set and clone the equations.\r\n\r\n const eq1multiplied = eq1.clone().multiply(new Fraction(factor1)),\r\n eq2multiplied = eq2.clone().multiply(new Fraction(factor2))\r\n\r\n // Add both equations together.\r\n eq1multiplied.left.add(eq2multiplied.left)\r\n eq1multiplied.right.add(eq2multiplied.right)\r\n\r\n return eq1multiplied\r\n }\r\n\r\n public multiply(value: InputValue<Fraction> | InputValue<Fraction>[], index?: number): this {\r\n // Multiply the system by a number\r\n // the value can be an array of numbers\r\n // the value can be a number and the index of the equation to multiply\r\n if (Array.isArray(value)) {\r\n if (value.length !== this.#equations.length) {\r\n throw new Error(\"The number of values must be the same as the number of equations\")\r\n }\r\n\r\n for (let i = 0; i < value.length; i++) {\r\n this.#equations[i].multiply(value[i])\r\n }\r\n return this\r\n }\r\n\r\n if (index === undefined || index < 0 || index >= this.#equations.length) {\r\n throw new Error(\"Index out of range\")\r\n }\r\n\r\n this.#equations[index].multiply(value)\r\n\r\n return this\r\n }\r\n\r\n public reduce(): LinearSystem {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n // ------------------------------------------\r\n public reorder = (): this => {\r\n for (const E of this.#equations) {\r\n E.reorder()\r\n }\r\n\r\n return this\r\n }\r\n\r\n solve(): ISolution[] {\r\n return []\r\n }\r\n\r\n public solveMatrix = (): Fraction[] => {\r\n const [matrix, vector] = this.matrix\r\n // Solve the matrix\r\n\r\n // console.log(matrix.map(row=>row.map(x=>x.display)))\r\n // console.log(vector.map(x=>x.display))\r\n\r\n // Make the augmented matrix (matrix + vector)\r\n const augmentedMatrix: Fraction[][] = matrix.map((row, index) => [...row, vector[index]])\r\n\r\n // Reduce the matrix\r\n for (let i = 0; i < matrix.length; i++) {\r\n // Find the pivot (the first non-zero element in the row)\r\n let pivot = augmentedMatrix[i][i].clone()\r\n if (pivot.isZero()) {\r\n // throw new Error('Divide by zero !')\r\n // Search a line below that would add it.\r\n const row_to_add = augmentedMatrix\r\n .find((row, index) => {\r\n return index > i && !row[i].isZero()\r\n })\r\n\r\n if (row_to_add) {\r\n augmentedMatrix[i].forEach((value, index) => value.add(row_to_add[index]))\r\n pivot = augmentedMatrix[i][i].clone()\r\n } else {\r\n throw new Error('Unsolvable...')\r\n }\r\n\r\n\r\n }\r\n\r\n // Normalize the row: divide all elements by the pivot\r\n // the pivot is now 1\r\n augmentedMatrix[i] = augmentedMatrix[i].map(x => x.divide(pivot))\r\n\r\n // reduce the other rows using the pivot.\r\n for (let j = 0; j < matrix.length; j++) {\r\n if (j === i) {\r\n continue\r\n }\r\n\r\n const factor = augmentedMatrix[j][i].clone().opposite()\r\n for (let k = 0; k < augmentedMatrix[j].length; k++) {\r\n augmentedMatrix[j][k].add(augmentedMatrix[i][k].clone().multiply(factor))\r\n }\r\n\r\n // Check if the system is undetermined (no solution or infinite solutions)\r\n // the j line must not be all zeros\r\n // the last element must be zero => the system is undetermined\r\n // the last element must not be zero => the system is impossible\r\n if (augmentedMatrix[j].slice(0, augmentedMatrix[j].length - 1).every(x => x.isZero())) {\r\n if (augmentedMatrix[j][augmentedMatrix[j].length - 1].isZero()) {\r\n return [new Fraction().infinite()]\r\n } else {\r\n return []\r\n }\r\n }\r\n }\r\n }\r\n\r\n return augmentedMatrix.map(x => x[x.length - 1])\r\n }\r\n\r\n public subtract(value: InputValue<LinearSystem | Equation | Polynom>, index?: number): this {\r\n if (value instanceof LinearSystem) {\r\n const length = value.equations.length\r\n if (length !== this.#equations.length) {\r\n throw new Error(\"The number of equations must be the same\")\r\n }\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.#equations[i].subtract(value.equations[i])\r\n }\r\n } else {\r\n if (index === undefined || index < 0 || index >= this.#equations.length) {\r\n throw new Error(\"Index out of range\")\r\n }\r\n const equ = new Equation(value)\r\n this.#equations[index].subtract(equ)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public get tex(): string {\r\n // Build the array of values.\r\n // Reorder\r\n // This clone the system :!!!\r\n //TODO: Avoid cloning this linear system\r\n const LS = this.clone().reorder()\r\n\r\n return this.buildTex(LS.equations)\r\n }\r\n\r\n public get variables(): string[] {\r\n return this.#variables\r\n }\r\n\r\n public set variables(value: string | string[]) {\r\n const vars = (typeof value === \"string\") ? value.split('') : [...value]\r\n vars.sort()\r\n this.#variables = vars\r\n }\r\n\r\n #findLetters = (): this => {\r\n this.#variables = this.#equations.reduce((acc: string[], equ) => {\r\n return [...new Set([...acc, ...equ.variables])]\r\n }, [])\r\n //\r\n // // Find all letters used.\r\n // let variables = new Set<string>()\r\n //\r\n // for (const equ of this.#equations) {\r\n // variables = new Set([...variables, ...equ.variables])\r\n // }\r\n //\r\n // this.#variables = [...variables]\r\n this.#variables.sort()\r\n return this\r\n }\r\n\r\n #makeMatrix = (): [Fraction[][], Fraction[]] => {\r\n // Make the matrix\r\n const matrix: Fraction[][] = []\r\n const vector: Fraction[] = []\r\n\r\n for (const E of this.#equations) {\r\n const row: Fraction[] = []\r\n\r\n const equ = E.clone().reorder()\r\n for (const L of this.variables) {\r\n const m = equ.left.monomByLetter(L)\r\n row.push(m.coefficient)\r\n }\r\n\r\n // Add the \"no letter part\"\r\n vector.push(equ.right.monoms[0].coefficient)\r\n\r\n // Add to the matrix\r\n matrix.push(row)\r\n }\r\n\r\n return [matrix, vector]\r\n }\r\n\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.\r\n * @module Logicalset\r\n */\r\nimport {ShutingYard, ShutingyardMode} from \"piexpression\"\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n */\r\nexport class LogicalSet {\r\n #rpn: { token: string, tokenType: string }[]\r\n\r\n /**\r\n *\r\n * @param {string} value (optional) Default polynom to parse on class creation\r\n */\r\n constructor(value?: string) {\r\n this.#rpn = []\r\n\r\n if (value !== undefined) {\r\n this.parse(value)\r\n }\r\n\r\n return this\r\n }\r\n\r\n parse = (value: string): this => {\r\n // Parse the updated value to the shutingyard algorithm\r\n this.#rpn = new ShutingYard(ShutingyardMode.SET)\r\n .parse(value)\r\n .rpn\r\n\r\n return this\r\n }\r\n\r\n evaluate(values: Record<string, boolean>): boolean {\r\n // Add missing key(s) and set them as false by default.\r\n this.variables.forEach(key => {\r\n if (!Object.hasOwn(values, key)) {\r\n values[key] = false\r\n }\r\n })\r\n\r\n const stack: boolean[] = []\r\n for (const token of this.#rpn) {\r\n console.log(token)\r\n if (token.tokenType === 'variable') {\r\n stack.push(values[token.token])\r\n } else if (token.tokenType === 'operation') {\r\n if (token.token === '!') {\r\n // need only one item from stack\r\n if (stack.length >= 1) {\r\n const a = stack.pop()\r\n stack.push(!a)\r\n } else {\r\n return false\r\n }\r\n } else {\r\n // All other operations needs two items from stack\r\n const a = stack.pop()\r\n const b = stack.pop()\r\n if (a !== undefined && b !== undefined) {\r\n switch (token.token) {\r\n case \"&\":\r\n stack.push(a && b)\r\n break\r\n case \"|\":\r\n stack.push(a || b)\r\n break\r\n case \"-\":\r\n return false\r\n }\r\n\r\n } else {\r\n return false\r\n }\r\n }\r\n }\r\n }\r\n\r\n return stack.length === 1 && stack[0]\r\n }\r\n\r\n get rpn(): { token: string, tokenType: string }[] {\r\n return this.#rpn\r\n }\r\n\r\n get tex(): string {\r\n const varStack: { token: string, tokenType: string }[] = []\r\n\r\n for (const token of this.#rpn) {\r\n if (token.tokenType === 'variable') {\r\n varStack.push(token)\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (second && first) {\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cap ${second.token}`, tokenType: 'mix'})\r\n }\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (second && first) {\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cup ${second.token}`, tokenType: 'mix'})\r\n }\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (second && first) {\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\setminus ${second.token}`, tokenType: 'mix'})\r\n }\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n const first = varStack.pop()\r\n\r\n if (first) {\r\n varStack.push({token: `\\\\overline{ ${first.token} }`, tokenType: 'variable'})\r\n }\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return varStack[0].token\r\n }\r\n\r\n get variables(): string[] {\r\n return this.#rpn\r\n .filter(value => value.tokenType === 'variable')\r\n .map(value => value.token)\r\n }\r\n\r\n vennAB(): string[] {\r\n return this.#evaluateAsVenn({\r\n A: ['A', 'AB'],\r\n B: ['B', 'AB']\r\n },\r\n ['A', 'B', 'AB', 'E']\r\n )\r\n }\r\n\r\n vennABC(): string[] {\r\n return this.#evaluateAsVenn({\r\n A: ['A', 'AB', 'AC', 'ABC'],\r\n B: ['B', 'AB', 'BC', 'ABC'],\r\n C: ['C', 'AC', 'BC', 'ABC']\r\n },\r\n ['A', 'B', 'C', 'AB', 'AC', 'BC', 'ABC', 'E']\r\n )\r\n }\r\n\r\n #evaluateAsVenn(tokenSets: Record<string, string[] | undefined>, reference?: string[]): string[] {\r\n const varStack: (Set<string>)[] = []\r\n\r\n let referenceSet: Set<string>\r\n if (reference === undefined) {\r\n referenceSet = new Set()\r\n for (const key in tokenSets) {\r\n referenceSet = new Set([\r\n ...referenceSet,\r\n ...(tokenSets[key] ?? [])\r\n ])\r\n }\r\n } else {\r\n referenceSet = new Set(reference)\r\n }\r\n\r\n for (const token of this.#rpn) {\r\n if (token.tokenType === 'variable') {\r\n // The variable has no token - assume it's empty.\r\n if (tokenSets[token.token] === undefined) {\r\n varStack.push(new Set())\r\n } else {\r\n varStack.push(new Set(tokenSets[token.token]))\r\n }\r\n\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first && second) {\r\n varStack.push(new Set([...first].filter(x => second.has(x))))\r\n }\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n if (first && second) {\r\n varStack.push(new Set([...first, ...second]))\r\n }\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n const second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first && second) {\r\n varStack.push(new Set([...first].filter(x => !second.has(x))))\r\n }\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n const first = varStack.pop()\r\n\r\n if (first) {\r\n varStack.push(new Set([...referenceSet].filter(x => !first.has(x))))\r\n }\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return [...varStack[0]].sort()\r\n }\r\n}","import type {\r\n FACTOR_TABLE_OF_SIGNS,\r\n IAlgebra,\r\n IExpression,\r\n InputAlgebra,\r\n InputValue,\r\n IPiMathObject,\r\n ISolution,\r\n literalType,\r\n POLYFACTOR_TABLE_OF_SIGNS,\r\n TABLE_OF_SIGNS_VALUES\r\n} from \"../pimath.interface\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Factor, FACTOR_DISPLAY} from \"./factor\"\r\nimport {Polynom} from \"./polynom\"\r\n\r\n\r\n// PolyFactor is a class that represents a polynomial in factored form.\r\nexport class PolyFactor implements IPiMathObject<PolyFactor>,\r\n IExpression<PolyFactor>,\r\n IAlgebra<PolyFactor> {\r\n\r\n #displayMode: FACTOR_DISPLAY = FACTOR_DISPLAY.POWER\r\n #factors: Factor[] = []\r\n\r\n constructor(...values: (Factor | PolyFactor)[]) {\r\n this.parse(...values)\r\n return this\r\n }\r\n\r\n public parse(...values: (Factor | PolyFactor)[]): this {\r\n // Init the factors list\r\n this.#factors = []\r\n\r\n // Nothing to create\r\n if (values.length === 0) {\r\n return this\r\n }\r\n\r\n values.forEach(value => {\r\n if (value instanceof PolyFactor) {\r\n this.#factors.push(...value.factors.map(f => f.clone()))\r\n } else {\r\n this.#factors.push(new Factor(value))\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n public clone(): PolyFactor {\r\n return new PolyFactor(...this.#factors.map(f => f.clone()))\r\n }\r\n\r\n public get tex(): string {\r\n const {num, den} = this.#extractNumeratorAndDenominator()\r\n\r\n if (den.length === 0) {\r\n if (num.length === 1) {\r\n return num[0].asSingle.tex\r\n }\r\n\r\n return num.map(f => f.tex).join(\"\")\r\n }\r\n\r\n // There is a numerator and a denominator\r\n const numTeX = num.length === 1 ? num[0].asSingle.tex : num.map(f => f.tex).join(\"\")\r\n const denTeX = den.length === 1 ? den[0].asSingle.tex : den.map(f => f.tex).join(\"\")\r\n\r\n return `\\\\frac{ ${numTeX} }{ ${denTeX} }`\r\n\r\n }\r\n\r\n public get display(): string {\r\n const {num, den} = this.#extractNumeratorAndDenominator()\r\n\r\n if (den.length === 0) {\r\n if (num.length === 1) {\r\n return num[0].asSingle.display\r\n }\r\n\r\n return num.map((f, index) =>\r\n index === 0 && f.polynom.monoms.length === 1 ? f.asSingle.display : f.display\r\n ).join(\"\")\r\n }\r\n\r\n // There is a numerator and a denominator\r\n const numTeX = num.length === 1 ? num[0].asSingle.display : num.map(f => f.display).join(\"\")\r\n const denTeX = den.length === 1 ? den[0].asSingle.display : den.map(f => f.display).join(\"\")\r\n\r\n return `(${numTeX})/(${denTeX})`\r\n\r\n }\r\n\r\n static #gcdWith(PF1: PolyFactor, PF2: PolyFactor): PolyFactor {\r\n // Get all factors of the two polynomials\r\n // Find the common factors\r\n const factors1 = keyFactors(PF1)\r\n\r\n const factors2 = keyFactors(PF2)\r\n\r\n const common = Object.keys(factors1).filter(k => Object.hasOwn(factors2, k))\r\n\r\n // Find the minimum power of the common factors\r\n const factors = common.map(k => {\r\n const power = factors1[k].reduce((acc, f) => acc.add(f.power), new Fraction('0'))\r\n const power2 = factors2[k].reduce((acc, f) => acc.add(f.power), new Fraction('0'))\r\n return new Factor(k, Fraction.min(power, power2))\r\n })\r\n\r\n return new PolyFactor(...factors)\r\n }\r\n\r\n static #lcmWith(PF1: PolyFactor, PF2: PolyFactor): PolyFactor {\r\n\r\n const factors1 = keyFactors(PF1)\r\n\r\n const factors2 = keyFactors(PF2)\r\n\r\n const common = [...new Set([...Object.keys(factors1), ...Object.keys(factors2)])]\r\n\r\n // Find the maximum power of the common factors\r\n const factors = common.map(k => {\r\n const power =\r\n Object.hasOwn(factors1, k) ?\r\n factors1[k].reduce((acc, f) => acc.add(f.power), new Fraction('0')) :\r\n new Fraction(0)\r\n const power2 = Object.hasOwn(factors2, k) ?\r\n factors2[k].reduce((acc, f) => acc.add(f.power), new Fraction('0')) :\r\n new Fraction(0)\r\n return new Factor(k, Fraction.max(power, power2))\r\n })\r\n\r\n return new PolyFactor(...factors)\r\n }\r\n\r\n public static gcd(...values: PolyFactor[]): PolyFactor {\r\n if (values.length === 0) {\r\n return new PolyFactor().one()\r\n }\r\n if (values.length === 1) {\r\n return values[0]\r\n }\r\n if (values.length === 2) {\r\n return PolyFactor.#gcdWith(values[0], values[1])\r\n }\r\n\r\n // values is not undefined,\r\n let PF = values[0]\r\n values.shift()\r\n values.forEach(value => PF = PolyFactor.#gcdWith(PF, value))\r\n\r\n return PF\r\n }\r\n\r\n public static lcm(...values: PolyFactor[]): PolyFactor {\r\n if (values.length === 0) {\r\n return new PolyFactor().one()\r\n }\r\n if (values.length === 1) {\r\n return values[0]\r\n }\r\n\r\n let PF = values[0]\r\n values.shift()\r\n values.forEach(value => PF = PolyFactor.#lcmWith(PF, value))\r\n return PF\r\n }\r\n\r\n public add(...values: PolyFactor[]): this {\r\n // Adding two (or more) polyfactors:\r\n // if both are numerators only, use the common polynom\r\n // if there are denominators, multiply every polyfactors to match the lcm polyfactor.\r\n\r\n const numerators: PolyFactor[] = [this.numerator, ...values.map(x => x.numerator)]\r\n const denominators: PolyFactor[] = [this.denominator, ...values.map(x => x.denominator)]\r\n\r\n let denominator: PolyFactor | undefined\r\n if (denominators.some(d => d.factors.length > 0)) {\r\n // At least one of the denominators is not empty.\r\n const lcm = PolyFactor.lcm(...denominators)\r\n\r\n // Multiply each numerators by the complementary.\r\n numerators.forEach((n, index) => {\r\n n.multiply(lcm.clone().divide(denominators[index]))\r\n })\r\n\r\n // Set the common denominator to the lcm PolyFctor\r\n denominator = lcm\r\n }\r\n\r\n // Now, every polyfactor should have a common denominator. Just add the numerators.\r\n const gcd = PolyFactor.gcd(...numerators)\r\n const remainingPolynom = new Polynom(0)\r\n .add(...numerators.map(pf => {\r\n return pf\r\n .divide(gcd).reduce()\r\n .develop() // should be a polyfactor with one factor, with a power of 1\r\n .factors[0]\r\n .polynom\r\n })\r\n ).reduce()\r\n\r\n this.#factors = [\r\n ...gcd.factors,\r\n new Factor(remainingPolynom)\r\n ]\r\n\r\n if (denominator) {\r\n this.divide(denominator)\r\n }\r\n\r\n // Remove all factors with a power of zero\r\n this.#factors = this.#factors.filter(x => !x.power.isZero())\r\n\r\n return this\r\n }\r\n\r\n get asPower(): this {\r\n this.#displayMode = FACTOR_DISPLAY.POWER\r\n return this\r\n }\r\n\r\n get asRoot(): this {\r\n this.#displayMode = FACTOR_DISPLAY.ROOT\r\n return this\r\n }\r\n\r\n public degree(letter?: string): Fraction {\r\n return this.#factors.reduce((acc, f) => acc.add(f.degree(letter)), new Fraction('0'))\r\n }\r\n\r\n get denominator(): PolyFactor {\r\n return new PolyFactor(...this.#factors\r\n .filter(f => f.power.isNegative())\r\n .map(f => f.clone().inverse())\r\n )\r\n }\r\n\r\n public derivative(): this {\r\n // (fgh)' = f'gh+fg'h+fgh'\r\n // dPF = [f'gh, fg'h, fgh']\r\n const dPF: PolyFactor[] = []\r\n\r\n const length = this.#factors.length\r\n\r\n for (let i = 0; i < length; i++) {\r\n // unchanged factors\r\n const factors = this.#factors.slice()\r\n // derivative factor\r\n const derivativeFactor = factors.splice(i, 1)[0].derivative()\r\n // Add the product of factors\r\n dPF.push(\r\n new PolyFactor(...factors, ...derivativeFactor))\r\n }\r\n\r\n // Reduce the polyFactors\r\n dPF.forEach(pf => pf.reduce())\r\n\r\n const first = dPF.shift()\r\n if (first !== undefined) {\r\n this.#factors = first.factors\r\n }\r\n\r\n // Add each factors together.\r\n return this.add(...dPF)\r\n }\r\n\r\n public develop(): PolyFactor {\r\n // Develop each factor and multiply them\r\n const N = new Polynom('1')\r\n const D = new Polynom('1')\r\n\r\n this.numerator.factors.forEach(f => {\r\n N.multiply(f.develop())\r\n })\r\n this.denominator.factors.forEach(f => {\r\n D.multiply(f.develop())\r\n })\r\n\r\n return new PolyFactor().fromPolynom(N, D)\r\n }\r\n\r\n public divide(value: PolyFactor): this {\r\n this.#factors = this.#factors.concat(value.clone().factors.map(f => f.inverse()))\r\n return this\r\n }\r\n\r\n public evaluate(values: InputValue<Fraction> | literalType<number | Fraction>, asNumeric?: boolean): number | Fraction {\r\n if (asNumeric) {\r\n return this.#factors\r\n .reduce((acc, f) => acc * (f.evaluate(values, asNumeric) as number), 1)\r\n }\r\n\r\n return this.#factors\r\n .reduce((acc, f) => acc.multiply(f.evaluate(values)), new Fraction('1'))\r\n }\r\n\r\n public factorize(letter?: string): PolyFactor {\r\n // Go through each factors.\r\n // If it can be factorized, remove the factor (set its power to zero) and insert the new factors instead.\r\n const newFactors: Factor[] = []\r\n\r\n this.#factors.forEach(factor => {\r\n const factors = factor.polynom.factorize(letter)\r\n if (factors.length > 1) {\r\n const pow = factor.power.clone()\r\n newFactors.push(...factors.map(x => new Factor(x, pow)))\r\n } else {\r\n newFactors.push(factor.clone())\r\n }\r\n })\r\n\r\n const result = new PolyFactor(...newFactors)\r\n const numerator = result.numerator.reduce()\r\n const denominator = result.denominator.reduce()\r\n\r\n return numerator.divide(denominator)\r\n }\r\n\r\n public get factors(): Factor[] {\r\n return this.#factors\r\n }\r\n\r\n public set factors(value: Factor[]) {\r\n this.#factors = value\r\n }\r\n\r\n public fromPolynom(numerator: InputAlgebra<Polynom>, denominator?: InputAlgebra<Polynom>): this {\r\n // fromPolynom loads the numerator and denominator as is, without factorizing !\r\n this.#factors = [new Factor(new Polynom(numerator))]\r\n\r\n if (denominator) {\r\n const polynom = new Polynom(denominator)\r\n\r\n if (polynom.isOne()) {\r\n return this\r\n }\r\n if (polynom.isZero()) {\r\n throw new Error(\"Cannot divide by zero\")\r\n }\r\n this.#factors.push(new Factor(polynom, -1))\r\n }\r\n // // Find all factors from a polynom\r\n // this.#factors = new Polynom(numerator)\r\n // .factorize(letter)\r\n // .map(value => new Factor(value))\r\n //\r\n // if (denominator) {\r\n // new Polynom(denominator)\r\n // .factorize(letter)\r\n // .forEach(value => this.#factors.push(new Factor(value, -1)))\r\n // }\r\n\r\n return this\r\n }\r\n\r\n public getZeroes(): ISolution[] {\r\n // Calculate the list of roots (ordered, unique)\r\n const roots: ISolution[] = ([] as ISolution[])\r\n .concat(...this.#factors.map(x => x.polynom.getZeroes()))\r\n // .concat(...tos.map(x => x.roots))\r\n\r\n // Sort the values.\r\n roots.sort((a, b) => a.value - b.value)\r\n // Remove duplicates.\r\n return roots\r\n .filter((value, index, self) =>\r\n index === self.findIndex((t) =>\r\n t.value === value.value\r\n )\r\n )\r\n }\r\n\r\n public hasVariable(letter: string): boolean {\r\n return this.#factors.some(f => f.hasVariable(letter))\r\n }\r\n\r\n public inverse(): this {\r\n this.#factors = this.#factors.map(f => f.inverse())\r\n return this\r\n }\r\n\r\n public isEqual(value: PolyFactor): boolean {\r\n const gcd = PolyFactor.gcd(this, value)\r\n\r\n const PF1 = this.clone().divide(gcd).reduce()\r\n const PF2 = value.clone().divide(gcd).reduce()\r\n\r\n return PF1.isOne() && PF2.isOne()\r\n }\r\n\r\n public isOne(): boolean {\r\n return this.#factors.every(f => f.isOne())\r\n }\r\n\r\n public isZero(): boolean {\r\n return this.#factors.every(f => f.isZero())\r\n }\r\n\r\n public multiply(...values: PolyFactor[]): this {\r\n values.forEach(value => {\r\n this.#factors = this.#factors.concat(value.clone().factors)\r\n })\r\n\r\n return this\r\n }\r\n\r\n get numerator(): PolyFactor {\r\n return new PolyFactor(...this.#factors.filter(f => f.power.isPositive()))\r\n }\r\n\r\n public one(): this {\r\n this.#factors = [new Factor('1', '1')]\r\n return this\r\n }\r\n\r\n public opposite(): this {\r\n // Add the -1 factor or remove if it exists\r\n const index = this.#factors.findIndex(f => f.display === '(-1)')\r\n\r\n if (index >= 0) {\r\n this.#factors.splice(index, 1)\r\n } else {\r\n this.#factors.push(new Factor('-1', '1'))\r\n }\r\n\r\n return this\r\n }\r\n\r\n public pow(value: number | Fraction): this {\r\n this.#factors = this.#factors.map(f => f.pow(value))\r\n return this\r\n }\r\n\r\n public primitive(): PolyFactor {\r\n throw new Error(\"Method not implemented.\")\r\n }\r\n\r\n public reduce(): this {\r\n // Regroup the factors by their base\r\n const factors = keyFactors(this)\r\n\r\n // Multiply the factors of the same base\r\n this.#factors = Object.values(factors)\r\n .map(f => {\r\n const base = f[0].polynom\r\n const power = f.reduce((acc, f) => acc.add(f.power), new Fraction('0'))\r\n return new Factor(base, power.reduce())\r\n })\r\n .filter(f => !f.power.isZero())\r\n\r\n return this\r\n }\r\n\r\n public root(value: number): this {\r\n this.#factors = this.#factors.map(f => f.root(value))\r\n return this\r\n }\r\n\r\n /**\r\n * Reoarder the factors using :\r\n * 1. number of monoms\r\n * 2. degree of polynom\r\n * 3. power of polyfactor\r\n */\r\n public sort(letter?: string): this {\r\n this.#factors.sort((a, b) => {\r\n // If the compare powers are opposite, the negative power goes to the end.\r\n const aPower = a.power.value\r\n const bPower = b.power.value\r\n if (aPower * bPower < 0) {\r\n return -aPower\r\n }\r\n\r\n\r\n // Monom length\r\n const aLength = a.polynom.monoms.length\r\n const bLength = b.polynom.monoms.length\r\n if (aLength !== bLength) {\r\n return aLength - bLength\r\n }\r\n\r\n // The monom length are the same, check the polynom degree.\r\n const aDegree = a.polynom.degree(letter).value\r\n const bDegree = b.polynom.degree(letter).value\r\n if (aDegree !== bDegree) {\r\n return aDegree - bDegree\r\n }\r\n\r\n // The power of the PolyFactor\r\n if (aPower !== bPower) {\r\n return aPower - bPower\r\n }\r\n\r\n return a.degree().isLeq(b.degree()) ? -1 : 1\r\n })\r\n\r\n return this\r\n }\r\n\r\n public sqrt(): this {\r\n this.#factors = this.#factors.map(f => f.sqrt())\r\n return this\r\n }\r\n\r\n public subtract(...values: PolyFactor[]): this {\r\n return this.add(...values.map(f => f.opposite()))\r\n }\r\n\r\n public tableOfSigns(): POLYFACTOR_TABLE_OF_SIGNS {\r\n // Calculate the table of signs for each factor\r\n const roots = this.getZeroes()\r\n const roots_key = roots.map(x => x.value)\r\n\r\n // Get the table of signs of every factors\r\n // These signs are NOT aligned\r\n const factors: FACTOR_TABLE_OF_SIGNS[] = this.factors\r\n .map(factor => {\r\n return {factor: new Factor(factor), ...factor.tableOfSigns()}\r\n })\r\n\r\n // Build the table of signs with extra roots.\r\n factors.forEach(item => {\r\n // Create the new signs row\r\n const empty_signs: TABLE_OF_SIGNS_VALUES[] = new Array(2 * roots.length + 1).fill('') as unknown as TABLE_OF_SIGNS_VALUES[]\r\n\r\n let sign = item.signs.shift() as unknown as TABLE_OF_SIGNS_VALUES\r\n let root = item.roots.shift()\r\n\r\n const aligned_signs = empty_signs.map((_sign, index) => {\r\n if (index % 2 === 0) {\r\n return sign\r\n }\r\n\r\n // The sign for this indexed root is a t(ab)\r\n if (root === undefined || root.value !== roots_key[(index - 1) / 2]) {\r\n return 't'\r\n }\r\n\r\n // The indexed root is the new root\r\n const rootSign = item.signs.shift() as unknown as TABLE_OF_SIGNS_VALUES\r\n\r\n // Make the new signs.\r\n sign = item.signs.shift() as unknown as TABLE_OF_SIGNS_VALUES\r\n root = item.roots.shift()\r\n return rootSign\r\n })\r\n\r\n // Set the roots for this item to all roots\r\n item.roots = roots\r\n item.signs = aligned_signs\r\n })\r\n\r\n // Build the table of signs with extra roots\r\n const signs: TABLE_OF_SIGNS_VALUES[] = factors\r\n .map((item) => item.signs)\r\n .reduce<TABLE_OF_SIGNS_VALUES[]>((a, b) => {\r\n if (a.length === 0) {\r\n return b\r\n }\r\n\r\n // a and b are \"not aligned\"\r\n b.forEach((value, index) => {\r\n // Case of a zero, invalid or tab value\r\n // tab < zero < defence\r\n switch (value) {\r\n case \"d\":\r\n a[index] = \"d\"\r\n break\r\n case \"z\":\r\n a[index] = a[index] === \"d\" ? \"d\" : \"z\"\r\n break\r\n case \"h\":\r\n a[index] = \"h\"\r\n break\r\n case \"-\":\r\n a[index] = a[index] === \"h\" ? \"h\" : a[index] === \"-\" ? \"+\" : \"-\"\r\n break\r\n }\r\n })\r\n\r\n return a\r\n }, [])\r\n\r\n return {signs, roots, factors}\r\n }\r\n\r\n public get variables(): string[] {\r\n return this.#factors\r\n .reduce((acc: string[], f: Factor) => acc.concat(f.variables), [])\r\n }\r\n\r\n public zero(): this {\r\n this.#factors = [new Factor('0', '1')]\r\n return this\r\n }\r\n\r\n #extractNumeratorAndDenominator() {\r\n let num: Factor[],\r\n den: Factor[] = []\r\n\r\n if (this.#displayMode === FACTOR_DISPLAY.ROOT) {\r\n // the power are positive integers\r\n num = this.numerator.factors\r\n den = this.denominator.factors\r\n } else {\r\n num = this.#factors\r\n }\r\n\r\n // There is no factor\r\n if (num.length === 0) {\r\n num = [new Factor('1')]\r\n }\r\n return {num, den}\r\n }\r\n\r\n}\r\n\r\nfunction keyFactors(value: PolyFactor): Record<string, Factor[]> {\r\n const k_numerator = new Fraction().one()\r\n const k_denominator = new Fraction().one()\r\n\r\n const kF = value.factors\r\n .reduce((acc: Record<string, Factor[]>, f) => {\r\n // It's only a value\r\n if (f.polynom.degree().isZero()) {\r\n if (f.power.isPositive()) {\r\n k_numerator.multiply(f.polynom.monoms[0].coefficient)\r\n } else {\r\n k_denominator.multiply(f.polynom.monoms[0].coefficient)\r\n }\r\n\r\n return acc\r\n }\r\n\r\n // It's a polynom\r\n const base = f.polynom.display\r\n if (Object.hasOwn(acc, base)) {\r\n acc[base].push(f)\r\n } else {\r\n acc[base] = [f]\r\n }\r\n\r\n return acc\r\n }, {})\r\n\r\n\r\n const {numerator, denominator} = k_numerator.divide(k_denominator).reduce()\r\n if(numerator!==1){\r\n kF[numerator.toString()] = [new Factor(numerator, 1)]\r\n }\r\n if(denominator!==1){\r\n kF[denominator.toString()] = [new Factor(denominator, -1)]\r\n }\r\n\r\n return kF\r\n}\r\n","import { Fraction } from \"../coefficients/fraction\"\r\nimport type { Vector } from \"./vector\"\r\n\r\ntype V = Vector\r\nexport function areVectorsEquals(v1: V, v2: V): boolean {\r\n return v1.dimension === v2.dimension &&\r\n v1.array.every(\r\n (value, index) => {\r\n return v2.array[index].isEqual(value)\r\n })\r\n}\r\n\r\nexport function areVectorsColinears(v1: V, v2: V): boolean {\r\n if (v1.dimension !== v2.dimension) { return false }\r\n\r\n // Constant of proportionality\r\n const k = v2.array[0].value / v1.array[0].value\r\n return v1.array.every(\r\n (value, index) => {\r\n return v2.array[index].value === value.value * k\r\n })\r\n}\r\n\r\n\r\nexport function dotProduct(v1: V, v2: V): Fraction {\r\n if (v1.dimension !== v2.dimension) { return new Fraction().invalid() }\r\n\r\n // Calculate the dot product\r\n // Why does the reduce not add the last element?\r\n\r\n return v1.array.reduce(\r\n (acc, value, index) => {\r\n return acc.add(value.clone().multiply(v2.array[index]))\r\n }, new Fraction(0))\r\n}\r\n\r\nexport function determinant(...values: V[]): Fraction {\r\n // TODO: Make it work for vectors of dimension n\r\n // Check if the vectors are in the same dimension\r\n if (values.some((value) => value.dimension !== values[0].dimension)) {\r\n throw new Error('All vectors must have the same dimension')\r\n }\r\n\r\n // Check if the vectors are in dimension 2 or 3 and that the number of values is correct\r\n if (values[0].dimension !== values.length ) {\r\n throw new Error(`The determinant of dimension ${values[0].dimension} must have the same number of vectors (${values.length} given)`)\r\n }\r\n\r\n // Calculate the determinant 2x2\r\n if (values[0].dimension === 2) {\r\n return values[0].array[0].clone().multiply(values[1].array[1])\r\n .subtract(values[0].array[1].clone().multiply(values[1].array[0]))\r\n }\r\n\r\n // Calculate the determinant 3x3\r\n return values[0].array[0].clone()\r\n .multiply(\r\n values[1].array[1].clone().multiply(values[2].array[2])\r\n .subtract(values[1].array[2].clone().multiply(values[2].array[1]))\r\n )\r\n .subtract(values[0].array[1].clone()\r\n .multiply(\r\n values[1].array[0].clone().multiply(values[2].array[2])\r\n .subtract(values[1].array[2].clone().multiply(values[2].array[0]))\r\n )\r\n )\r\n .add(values[0].array[2].clone()\r\n .multiply(values[1].array[0].clone().multiply(values[2].array[1])\r\n .subtract(values[1].array[1].clone().multiply(values[2].array[0]))))\r\n}\r\n","/**\r\n * Vector2D module contains everything necessary to handle 2d vectors.\r\n * @module Vector\r\n */\r\nimport type { InputValue, IPiMathObject } from \"../pimath.interface\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Numeric } from \"../numeric\"\r\nimport { areVectorsColinears, areVectorsEquals, dotProduct } from \"./geomMath\"\r\n\r\nexport class Vector implements\r\n IPiMathObject<Vector> {\r\n #array: Fraction[] = []\r\n #asPoint = false\r\n\r\n constructor(...values: Vector[] | InputValue<Fraction>[]) {\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n };\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get array(): Fraction[] {\r\n return this.#array\r\n }\r\n\r\n set array(value: Fraction[]) {\r\n this.#array = value\r\n }\r\n\r\n get x(): Fraction {\r\n return this.#array[0]\r\n }\r\n\r\n set x(value: Fraction | number | string) {\r\n this.#array[0] = new Fraction(value)\r\n }\r\n\r\n get y(): Fraction {\r\n return this.#array[1]\r\n }\r\n\r\n set y(value: Fraction | number | string) {\r\n this.#array[1] = new Fraction(value)\r\n }\r\n\r\n get z(): Fraction {\r\n if (this.dimension < 3) { throw new Error('Vector is not 3D') }\r\n return this.#array[2]\r\n }\r\n\r\n set z(value: Fraction | number | string) {\r\n if (this.dimension < 3) { throw new Error('Vector is not 3D') }\r\n this.#array[2] = new Fraction(value)\r\n }\r\n\r\n get asPoint(): boolean {\r\n return this.#asPoint\r\n }\r\n\r\n set asPoint(value: boolean) {\r\n this.#asPoint = value\r\n }\r\n\r\n\r\n get normSquare(): Fraction {\r\n // Get the norm square of the vector\r\n return this.array.reduce((acc, x) => acc.add(x.clone().pow(2)), new Fraction(0))\r\n }\r\n\r\n get norm(): number {\r\n return Math.sqrt(this.normSquare.value)\r\n }\r\n\r\n get tex(): string {\r\n if (this.#asPoint) {\r\n return `\\\\left(${this.array.map(x => x.tex).join(';')}\\\\right)`\r\n }\r\n\r\n return `\\\\begin{pmatrix} ${this.array.map(x => x.tex).join(' \\\\\\\\ ')} \\\\end{pmatrix}`\r\n }\r\n\r\n get display(): string {\r\n if (this.#asPoint) {\r\n return `(${this.array.map(x => x.display).join(';')})`\r\n }\r\n\r\n return `((${this.array.map(x => x.display).join(',')}))`\r\n }\r\n\r\n setDimension(value = 2): this{\r\n if (value < 2) {\r\n throw new Error('Dimension must be at least 2')\r\n }\r\n\r\n if (value < this.dimension) {\r\n this.#array = this.#array.slice(0, value)\r\n } else if(value > this.dimension) {\r\n for(let i = this.dimension; i < value; i++) {\r\n this.#array.push(new Fraction(0))\r\n }\r\n }\r\n\r\n return this\r\n }\r\n get dimension(): number {\r\n return this.array.length\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n get isNull(): boolean {\r\n return this.array.every(x => x.isZero())\r\n }\r\n\r\n static asTex(...values: string[]): string {\r\n return `\\\\begin{pmatrix} ${values.join(' \\\\\\\\ ')} \\\\end{pmatrix}`\r\n }\r\n static asDisplay(...values: string[]): string {\r\n return `((${values.join(',')}))`\r\n }\r\n\r\n public defineAsPoint(value?: boolean): this {\r\n this.#asPoint = value !== false\r\n return this\r\n }\r\n public parse(...values: Vector[] | InputValue<Fraction>[]): this {\r\n if (values.length === 0) {\r\n throw new Error(`Invalid value`)\r\n }\r\n\r\n if (values.length === 1) {\r\n if (values[0] instanceof Vector) {\r\n return values[0].clone() as this\r\n } else if (typeof values[0] === 'string') {\r\n return this.fromString(values[0])\r\n } else {\r\n throw new Error(`Invalid value`)\r\n }\r\n }\r\n\r\n // Two values are given\r\n if (values.length === 2) {\r\n const [A, B] = values\r\n\r\n // The two values are vectors\r\n if (A instanceof Vector && B instanceof Vector) {\r\n if (A.dimension !== B.dimension) { throw new Error('Vectors must have the same dimension') }\r\n\r\n this.#array = B.array.map((x, index) => x.clone().subtract(A.array[index]))\r\n return this\r\n }\r\n }\r\n\r\n // Two ore more values as number, string, fraction...\r\n this.#array = values.map(x => new Fraction(x as InputValue<Fraction>))\r\n\r\n return this\r\n }\r\n\r\n public clone(): Vector {\r\n const V = new Vector()\r\n V.array = this.copy()\r\n V.asPoint = this.asPoint\r\n return V\r\n }\r\n\r\n public copy(): Fraction[] {\r\n return this.#array.map(x => x.clone())\r\n }\r\n\r\n zero = (): this => {\r\n this.#array.forEach(x => x.zero())\r\n return this\r\n }\r\n\r\n one = (): this => {\r\n this.zero()\r\n this.x.one()\r\n return this\r\n }\r\n\r\n opposite = (): this => {\r\n this.#array.forEach(x => x.opposite())\r\n return this\r\n }\r\n\r\n add = (V: Vector): this => {\r\n this.#array.forEach((x, index) => x.add(V.array[index]))\r\n return this\r\n }\r\n\r\n subtract = (V: Vector): this => {\r\n return this.add(V.clone().opposite())\r\n }\r\n\r\n unit = (): this => {\r\n const norm = this.norm\r\n if (norm === 0) {\r\n return this\r\n }\r\n\r\n return this.divideByScalar(norm)\r\n }\r\n\r\n middleOf(V1: Vector, V2: Vector): this {\r\n if (V1.dimension !== V2.dimension) { throw new Error('Vectors must be the same dimension') }\r\n\r\n this.array = []\r\n V1.array.forEach((x, index) => {\r\n this.array.push(x.clone().add(V2.array[index]).divide(2))\r\n })\r\n\r\n return this\r\n }\r\n\r\n translate(...values: Fraction[]): this {\r\n this.array.forEach((x, index) => x.add(values[index]))\r\n return this\r\n }\r\n\r\n\r\n dot = (V: Vector): Fraction => {\r\n return dotProduct(this, V)\r\n }\r\n\r\n cross(value: Vector): Vector {\r\n if (this.dimension !== 3 || value.dimension !== 3) {\r\n throw new Error('Cross product can only be determined in 3D')\r\n }\r\n\r\n return new Vector(\r\n this.y.clone().multiply(value.z).subtract(this.z.clone().multiply(value.y)),\r\n this.z.clone().multiply(value.x).subtract(this.x.clone().multiply(value.z)),\r\n this.x.clone().multiply(value.y).subtract(this.y.clone().multiply(value.x))\r\n )\r\n }\r\n\r\n normal = (): this => {\r\n if (this.dimension >= 3) { throw new Error('Normal vector can only be determined in 2D') }\r\n\r\n const x = this.x.clone().opposite(),\r\n y = this.y.clone()\r\n this.#array[0] = y\r\n this.#array[1] = x\r\n return this\r\n }\r\n\r\n isZero(): boolean {\r\n return this.array.every(x => x.isZero())\r\n }\r\n isOne(): boolean {\r\n return this.array.every((x, index) => index === 0 ? x.isOne() : x.isZero())\r\n }\r\n\r\n isEqual = (v: Vector): boolean => {\r\n return areVectorsEquals(this, v)\r\n }\r\n\r\n isColinearTo = (v: Vector): boolean => {\r\n return areVectorsColinears(this, v)\r\n }\r\n\r\n isNormalTo = (v: Vector): boolean => {\r\n return this.dot(v).isZero()\r\n }\r\n\r\n multiplyByScalar = (k: InputValue<Fraction>): this => {\r\n const scalar = new Fraction(k)\r\n this.array.forEach(x => x.multiply(scalar))\r\n return this\r\n }\r\n\r\n divideByScalar = (k: InputValue<Fraction>): this => {\r\n return this.multiplyByScalar(new Fraction(k).inverse())\r\n }\r\n\r\n simplify = (): this => {\r\n // Multiply by the lcm of denominators.\r\n return this\r\n .multiplyByScalar(\r\n Numeric.lcm(...this.array.map(x => x.denominator))\r\n )\r\n .divideByScalar(\r\n Numeric.gcd(...this.array.map(x => x.numerator))\r\n ).\r\n multiplyByScalar(\r\n this.x.isNegative() ? -1 : 1\r\n )\r\n }\r\n\r\n angle = (V: Vector, sharp?: boolean, radian?: boolean): number => {\r\n\r\n let scalar = this.dot(V).value\r\n if (sharp) {\r\n scalar = Math.abs(scalar)\r\n }\r\n\r\n const toDegree = radian ? 1 : 180 / Math.PI\r\n\r\n return toDegree * Math.acos(scalar / (this.norm * V.norm))\r\n }\r\n\r\n\r\n fromString = (value: string): this => {\r\n // Remove the first letter if it's a parenthesis.\r\n if (value.startsWith('(')) {\r\n value = value.substring(1)\r\n }\r\n\r\n // Remove the last letter if it's a parenthesis.\r\n if (value.endsWith(')')) {\r\n value = value.substring(0, value.length - 1)\r\n }\r\n\r\n // Split comma, semi colon or single space.\r\n const components = value.split(/[,;\\s]/g)\r\n .filter((v) => v.trim() !== '')\r\n\r\n // there must be at least two components.\r\n if (components.length < 2) {\r\n return this\r\n }\r\n\r\n // Validate the fraction values.\r\n this.#array = components.map(x => new Fraction(x))\r\n return this\r\n }\r\n\r\n distanceTo(item: Vector): { value: number, fraction: Fraction, tex: string } {\r\n const V = new Vector(this, item)\r\n\r\n return {\r\n value: V.norm,\r\n fraction: V.normSquare,\r\n tex: V.tex\r\n }\r\n }\r\n}\r\n","import type { Fraction } from \"./coefficients\"\r\nimport type { NthRoot } from \"./coefficients\"\r\nimport type { Monom } from \"./algebra\"\r\nimport type {Factor} from \"./algebra\"\r\nimport type {Line, Point, Vector} from \"./geometry\"\r\nimport type {Equation} from \"./algebra\"\r\n\r\nexport type InputValue<T> = T | string | number | Fraction | NthRoot;\r\nexport type InputAlgebra<T> = InputValue<T> | Monom\r\nexport type literalType<T> = Record<string, T>;\r\n\r\nexport type compareSign =\r\n '>' | \">=\" | \"=>\" | \"geq\" |\r\n '<' | \"<=\" | \"=<\" | \"leq\" |\r\n '=' | \"<>\" | \"neq\" | \"same\";\r\n\r\nexport type EQUATION_SIGN = \"=\" | \"<=\" | \">=\" | \"<\" | \">\"\r\n\r\nexport enum PARTICULAR_SOLUTION {\r\n real = \"\\\\mathbb{R}\",\r\n varnothing = \"\\\\varnothing\"\r\n}\r\n\r\nexport interface IPiMathObject<T> {\r\n readonly tex: string\r\n readonly display: string\r\n\r\n clone(): T;\r\n\r\n parse(...value: unknown[]): T;\r\n}\r\n\r\nexport interface IExpression<T> {\r\n isEqual(value: InputValue<T>): boolean;\r\n\r\n zero(): T;\r\n\r\n one(): T;\r\n\r\n isZero(): boolean;\r\n\r\n isOne(): boolean;\r\n\r\n add(value: InputValue<T>): T;\r\n\r\n subtract(value: InputValue<T>): T;\r\n\r\n opposite(): T;\r\n\r\n multiply(value: InputValue<T>): T;\r\n\r\n divide(value: InputValue<T>): T | null;\r\n\r\n reduce(): T;\r\n\r\n inverse(): T | undefined;\r\n\r\n sqrt(): T | undefined;\r\n\r\n pow(value: number): T;\r\n\r\n root(value: number): T | undefined;\r\n}\r\n\r\nexport interface IEquation<T> {\r\n\r\n reduce(): T;\r\n\r\n solve(): ISolution[]\r\n}\r\n\r\nexport interface IAlgebra<T> {\r\n readonly variables: string[];\r\n\r\n hasVariable(letter: string): boolean;\r\n\r\n degree(letter?: string): Fraction;\r\n\r\n evaluate(values: literalType<Fraction | number> | InputValue<Fraction>, asNumeric?: boolean): Fraction | number | boolean;\r\n}\r\n\r\nexport interface IAnalyse<T> {\r\n derivative(): T | T[];\r\n\r\n primitive(): T;\r\n\r\n integrate(a: InputValue<Fraction>, b: InputValue<T>, letter?: string): Fraction;\r\n}\r\n\r\nexport interface ISolution {\r\n variable: string,\r\n display: string,\r\n exact: Fraction | boolean\r\n tex: string,\r\n value: number,\r\n}\r\n\r\nexport type TABLE_OF_SIGNS_VALUES = '-'|'+'|'h'|'z'|'t'|'d'|'u'|'n'|''\r\n\r\nexport interface TABLE_OF_SIGNS {roots: ISolution[], signs: TABLE_OF_SIGNS_VALUES[]}\r\nexport interface FACTOR_TABLE_OF_SIGNS extends TABLE_OF_SIGNS {factor: Factor}\r\nexport interface POLYFACTOR_TABLE_OF_SIGNS extends TABLE_OF_SIGNS {\r\n factors: FACTOR_TABLE_OF_SIGNS[]\r\n}\r\n\r\nexport enum LinePropriety {\r\n None = 'none',\r\n Parallel = 'parallel',\r\n Perpendicular = 'perpendicular',\r\n Tangent = 'tangent'\r\n}\r\n\r\nexport enum Line3Propriety {\r\n None = 'none',\r\n Parallel = 'parallel',\r\n Perpendicular = 'perpendicular',\r\n Tangent = 'tangent'\r\n}\r\n\r\nexport interface Plane3Config {\r\n point?: Point,\r\n normal?: Vector,\r\n directions?: Vector[],\r\n equation?: Equation,\r\n points?: Point[],\r\n coefficients?: number[]\r\n}\r\n\r\n\r\nexport interface remarquableLines {\r\n 'medians': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n },\r\n 'mediators': {\r\n 'AB': Line,\r\n 'AC': Line,\r\n 'BC': Line,\r\n 'intersection': Vector | null\r\n },\r\n 'heights': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n },\r\n 'bisectors': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n },\r\n externalBisectors: {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Vector | null\r\n }\r\n}\r\n","/**\r\n * Random helpers\r\n */\r\nimport { Numeric } from \"../numeric\"\r\n\r\n\r\n/**\r\n * Random boolean with a percent ratio\r\n * @param percent\r\n */\r\nexport function randomBool(percent = 0.5): boolean {\r\n return Math.random() < percent\r\n}\r\n\r\n/**\r\n * Random integer between two values.\r\n * @param a (number) : From this value to the second value. If the second is ommited, this value is the max value.\r\n * @param b (number) : To this value. If this is ommited.\r\n */\r\nexport function randomInt(a: number, b?: number, exclude?: number[]): number {\r\n if (b === undefined) {\r\n if (a >= 0) {\r\n return randomInt(0, a)\r\n } else {\r\n return randomInt(a, 0)\r\n }\r\n }\r\n\r\n // Same start and end values\r\n if (a === b) {\r\n return a\r\n }\r\n\r\n // No exclusion\r\n if (exclude === undefined) {\r\n return Math.floor(Math.random() * (b - a + 1) + a)\r\n }\r\n\r\n // With exclusion\r\n if (Math.abs(b - a) <= exclude.length) {\r\n throw new Error('The number of excluded values is too high.')\r\n }\r\n\r\n let r = randomInt(a, b)\r\n while (exclude.includes(r)) {\r\n r = randomInt(a, b)\r\n }\r\n return r\r\n}\r\n\r\n/**\r\n * Random integer between -max and max value.\r\n * @param max (number) : determine the limits.\r\n * @param zero (bool) : determine if zero is allowed or not.\r\n */\r\nexport function randomIntSym(max: number, zero?: boolean): number {\r\n if (zero === false) {\r\n return randomBool() ? randomInt(1, max) : -randomInt(1, max)\r\n } else {\r\n return randomInt(-max, max)\r\n }\r\n}\r\n\r\nexport function randomPrime(max?: number): number {\r\n let primes = Numeric.primes()\r\n if (max !== undefined) {\r\n primes = primes.filter(x => x < max)\r\n }\r\n return randomItem(primes)\r\n}\r\n\r\nexport function randomArray<T>(arr: T[], number?: number): T[] {\r\n if (number === undefined) {\r\n number = 1\r\n }\r\n\r\n // Return a clone array\r\n if (arr.length <= 0) {\r\n return Object.values(arr)\r\n }\r\n\r\n // Randomize the array and return the n first elements.\r\n return shuffleArray(arr).slice(0, number)\r\n}\r\n\r\nexport function randomItem<T>(arr: T[]): T {\r\n if (arr.length === 0) { return null as T }\r\n return arr[randomInt(0, arr.length - 1)]\r\n}\r\n\r\nexport function shuffleArray<T>(arr: T[]): T[] {\r\n // The Fisher-Yates algorithm\r\n const shuffleArray = Object.values(arr)\r\n for (let i = shuffleArray.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n const temp = shuffleArray[i]\r\n shuffleArray[i] = shuffleArray[j]\r\n shuffleArray[j] = temp\r\n }\r\n\r\n return shuffleArray\r\n}\r\n","/**\r\n * Vector2D module contains everything necessary to handle 2d vectors.\r\n * @module Point\r\n */\r\n\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport type { InputValue } from \"../pimath.interface\"\r\nimport { Vector } from \"./vector\"\r\n\r\nexport class Point extends Vector {\r\n\r\n constructor()\r\n constructor(value: Vector)\r\n constructor(start: Vector, end: Vector)\r\n constructor(...values: InputValue<Fraction>[])\r\n constructor(...values: Vector[] | InputValue<Fraction>[]) {\r\n super()\r\n\r\n // Initialize the vector\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n };\r\n\r\n public override parse(...values: Vector[] | InputValue<Fraction>[]): this {\r\n this.asPoint = true\r\n\r\n if (values.length === 1) {\r\n if (values[0] instanceof Vector) {\r\n this.array = values[0].copy()\r\n return this\r\n }\r\n\r\n if (typeof values[0] === 'string') {\r\n this.fromString(values[0])\r\n return this\r\n }\r\n }\r\n\r\n\r\n if (values.length > 1) {\r\n if (values.some(x => x instanceof Vector)) {\r\n throw new Error('Creating a point with multiple argument requires an input fraction')\r\n }\r\n\r\n const nbs: Fraction[] = values.map(x => new Fraction(x as InputValue<Fraction>))\r\n\r\n if (nbs.some(x => x.isNaN())) {\r\n throw new Error('The value is not a valid point sting (a,b): ' + values.join(','))\r\n }\r\n\r\n this.array = nbs\r\n }\r\n\r\n return this\r\n }\r\n\r\n\r\n public override clone(): Point {\r\n const V = new Point()\r\n V.array = this.copy()\r\n V.asPoint = true\r\n return V\r\n }\r\n\r\n}\r\n","/**\r\n * This class works for 2d line in a plane.\r\n */\r\n\r\nimport { Numeric } from \"../numeric\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Equation } from \"../algebra/equation\"\r\nimport { Polynom } from \"../algebra/polynom\"\r\nimport { Monom } from \"../algebra/monom\"\r\nimport { Vector } from \"./vector\"\r\nimport {type InputValue, type IPiMathObject, LinePropriety} from \"../pimath.interface\"\r\nimport { randomIntSym } from \"../randomization/rndHelpers\"\r\nimport { Point } from \"./point\"\r\n\r\nexport interface LineConfig {\r\n points?: Point[],\r\n point?: Point,\r\n direction?: Vector,\r\n normal?: Vector\r\n}\r\n\r\nexport class Line implements IPiMathObject<Line> {\r\n // A line is defined as the canonical form\r\n static PERPENDICULAR = LinePropriety.Perpendicular\r\n static PARALLEL = LinePropriety.Parallel\r\n #reduceBeforeDisplay: boolean\r\n // ax + by + c = 0\r\n #a: Fraction\r\n #b: Fraction\r\n #c: Fraction\r\n #OA: Vector\r\n #d: Vector\r\n #n: Vector\r\n\r\n #outputMode: 'canonical' | 'equation' | 'mxh' | 'parametric' | 'system' = \"canonical\"\r\n\r\n /**\r\n * Value can be a mix of:\r\n *\r\n * @param values\r\n */\r\n constructor(...values: unknown[]) {\r\n this.#a = new Fraction().zero()\r\n this.#b = new Fraction().zero()\r\n this.#c = new Fraction().zero()\r\n this.#OA = new Vector()\r\n this.#d = new Vector()\r\n this.#n = new Vector()\r\n\r\n this.#reduceBeforeDisplay = true\r\n\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n\r\n return this\r\n }\r\n\r\n get a(): Fraction {\r\n return this.#a\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n set a(value: Fraction) {\r\n this.#a = value\r\n }\r\n\r\n get b(): Fraction {\r\n return this.#b\r\n }\r\n\r\n set b(value: Fraction) {\r\n this.#b = value\r\n }\r\n\r\n get c(): Fraction {\r\n return this.#c\r\n }\r\n\r\n set c(value: Fraction) {\r\n this.#c = value\r\n }\r\n\r\n get OA(): Vector {\r\n return this.#OA\r\n }\r\n\r\n set OA(value: Vector) {\r\n this.#OA = value\r\n }\r\n\r\n get d(): Vector {\r\n return this.#d\r\n }\r\n\r\n set d(value: Vector) {\r\n this.#d = value\r\n }\r\n\r\n get n(): Vector {\r\n return this.#n\r\n }\r\n\r\n // ------------------------------------------\r\n getEquation(): Equation {\r\n const equ = new Equation(new Polynom().parse('xy', this.#a, this.#b, this.#c), new Polynom('0'))\r\n if (this.#reduceBeforeDisplay) {\r\n return equ.simplify()\r\n } else {\r\n return equ\r\n }\r\n }\r\n\r\n // get system(): { x: Equation, y: Equation } {\r\n // const e1 = new Equation(\r\n // new Polynom('x'),\r\n // new Polynom(this.#OA.x)\r\n // .add(new Monom('k').multiply(this.#d.x))\r\n // ),\r\n // e2 = new Equation(\r\n // new Polynom('y'),\r\n // new Polynom(this.#OA.y)\r\n // .add(new Monom('k').multiply(this.#d.y))\r\n // )\r\n\r\n // return { x: e1, y: e2 }\r\n // }\r\n\r\n get canonical(): this {\r\n this.#outputMode = 'canonical'\r\n return this\r\n }\r\n get equation(): this {\r\n this.#outputMode = 'equation'\r\n return this\r\n }\r\n get mxh(): this {\r\n this.#outputMode = 'mxh'\r\n return this\r\n }\r\n get parametric(): this {\r\n this.#outputMode = 'parametric'\r\n return this\r\n }\r\n get system(): this {\r\n this.#outputMode = 'system'\r\n return this\r\n }\r\n\r\n get tex(): string {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d\r\n // equation => ax + by = -c\r\n const output = this.#outputMode\r\n this.#outputMode = 'canonical'\r\n switch (output) {\r\n case 'equation':\r\n return this.getEquation().reorder().tex\r\n case 'mxh':\r\n return this.slope.isInfinity() ?\r\n 'x=' + this.OA.x.tex :\r\n 'y=' + new Polynom().parse('x', this.slope, this.height).tex\r\n case 'parametric':\r\n case 'system': {\r\n const d = this.#d.clone()\r\n if (this.#reduceBeforeDisplay) {\r\n d.simplify()\r\n }\r\n\r\n if (output === 'parametric') {\r\n return `${Vector.asTex('x', 'y')} = ${Vector.asTex(this.#OA.x.tex, this.#OA.y.tex)} + k\\\\cdot ${Vector.asTex(d.x.tex, d.y.tex)}`\r\n } else {\r\n return `\\\\left\\\\{\\\\begin{aligned}\r\n x &= ${(new Polynom(this.#OA.x)\r\n .add(new Monom(this.#d.x).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\ \r\n y &= ${(new Polynom(this.#OA.y)\r\n .add(new Monom(this.#d.y).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\r\n \\\\end{aligned}\\\\right.`\r\n }\r\n }\r\n default:\r\n {\r\n const canonical = this.getEquation()\r\n if (this.#a.isNegative()) {\r\n canonical.multiply(-1)\r\n }\r\n return canonical.tex\r\n }\r\n }\r\n\r\n }\r\n\r\n get reduceBeforeDisplay(): boolean {\r\n return this.#reduceBeforeDisplay\r\n }\r\n\r\n set reduceBeforeDisplay(value: boolean) {\r\n this.#reduceBeforeDisplay = value\r\n }\r\n\r\n get display(): string {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d // not relevant in display mode.\r\n const output = this.#outputMode\r\n this.#outputMode = 'canonical'\r\n\r\n switch (output) {\r\n case 'equation':\r\n return this.getEquation().reorder().display\r\n case 'mxh':\r\n return this.slope.isInfinity() ?\r\n 'x=' + this.OA.x.display :\r\n 'y=' + new Polynom().parse('x', this.slope, this.height).display\r\n case 'parametric': {\r\n const d = this.#d.clone()\r\n if (this.#reduceBeforeDisplay) {\r\n d.simplify()\r\n }\r\n\r\n return `((x,y))=((${this.#OA.x.display},${this.#OA.y.display}))+k((${d.x.display},${d.y.display}))`\r\n }\r\n default: {\r\n const canonical = this.getEquation()\r\n // Make sur the first item is positive.\r\n if (this.#a.isNegative()) {\r\n canonical.multiply(-1)\r\n }\r\n return canonical.display\r\n }\r\n\r\n }\r\n }\r\n\r\n get normal(): Vector {\r\n return new Vector(this.#a, this.#b)\r\n }\r\n\r\n get director(): Vector {\r\n return this.#d.clone()\r\n }\r\n\r\n get slope(): Fraction {\r\n return this.#a.clone().opposite().divide(this.#b)\r\n }\r\n\r\n get height(): Fraction {\r\n return this.#c.clone().opposite().divide(this.#b)\r\n }\r\n\r\n randomPoint = (k?: number): Point => {\r\n // Return a random point on the line.\r\n const pt = this.#d\r\n .clone()\r\n .multiplyByScalar(randomIntSym((k === undefined || k <= 1) ? 3 : k, false))\r\n .add(this.#OA)\r\n\r\n pt.asPoint = true\r\n\r\n return pt\r\n }\r\n\r\n randomNearPoint = (k?: number): Point => {\r\n const pt = this.randomPoint(k)\r\n\r\n let maxIterationTest = 10\r\n while (this.isOnLine(pt) && maxIterationTest > 0) {\r\n pt.x.add(randomIntSym(1, false))\r\n pt.y.add(randomIntSym(1, false))\r\n maxIterationTest--\r\n\r\n }\r\n\r\n return pt\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse data to a line\r\n * @param {any} values\r\n * @returns {Line}\r\n */\r\n parse = (...values: unknown[]): this => {\r\n // Nothing is given...\r\n if (values.length === 0) {\r\n return this\r\n }\r\n\r\n // One value only: already a line (clone it), an Equation, a string (as Equation)\r\n if (values.length === 1) {\r\n if (values[0] instanceof Line) {\r\n // Already a Line\r\n return this.fromCoefficient(values[0].a, values[0].b, values[0].c)\r\n } else if (values[0] instanceof Equation) {\r\n // It's an Equation\r\n return this.fromEquation(values[0])\r\n } else if (typeof values[0] === \"string\") {\r\n // It's a string - create an Equation from it.\r\n try {\r\n const E = new Equation(values[0])\r\n return this.parse(E)\r\n } catch (e) {\r\n return this\r\n }\r\n }\r\n }\r\n\r\n // Two values are given: two vectors\r\n if (values.length === 2 && values.every(x=>x instanceof Vector)) {\r\n const formattedValues: Vector[] = values\r\n\r\n if (formattedValues[0].asPoint && formattedValues[1].asPoint) {\r\n // Two points\r\n return this.fromPointAndDirection(formattedValues[0], new Vector(formattedValues[0], formattedValues[1]))\r\n }\r\n\r\n if (formattedValues[0].asPoint && !formattedValues[1].asPoint) {\r\n // One point and one vector director\r\n return this.fromPointAndDirection(formattedValues[0], formattedValues[1])\r\n }\r\n\r\n }\r\n\r\n if (values.length === 3) {\r\n if (values[0] instanceof Vector && values[1] instanceof Vector) {\r\n if (values[2] === LinePropriety.Perpendicular) {\r\n return this.fromPointAndNormal(values[0], values[1])\r\n } else if (values[2] === LinePropriety.Parallel) {\r\n return this.fromPointAndDirection(values[0], values[1])\r\n }\r\n }\r\n\r\n if (values[0] instanceof Vector && values[1] instanceof Line) {\r\n if (values[2] === LinePropriety.Parallel || values[2] === null) {\r\n return this.fromPointAndLine(values[0], values[1], LinePropriety.Parallel)\r\n } else {\r\n return this.fromPointAndLine(values[0], values[1], LinePropriety.Perpendicular)\r\n }\r\n }\r\n\r\n return this.fromCoefficient(\r\n values[0] as InputValue<Fraction>,\r\n values[1] as InputValue<Fraction>,\r\n values[2] as InputValue<Fraction>\r\n )\r\n }\r\n\r\n console.log('Something wrong happened while creating the line')\r\n console.log(values)\r\n return this\r\n }\r\n\r\n fromPoints(pt1: Point, pt2: Point){\r\n return this.fromPointAndDirection(pt1, new Vector(pt1, pt2))\r\n }\r\n fromEquation = (equ: Equation): this => {\r\n // Reorder the eequation\r\n equ.reorder(true)\r\n\r\n // It must contain either x, y or both.\r\n const letters = new Set(equ.letters())\r\n\r\n // No 'x', no 'y' in the equations\r\n if (!(letters.has('x') || letters.has('y'))) {\r\n return this\r\n }\r\n\r\n // Another letter in the equation ?\r\n for (const elem of ['x', 'y']) {\r\n if (letters.has(elem)) {\r\n letters.delete(elem)\r\n }\r\n }\r\n\r\n if (letters.size > 0) {\r\n return this\r\n }\r\n\r\n // Everything should be ok now...\r\n return this.fromCoefficient(\r\n equ.left.monomByLetter('x').coefficient,\r\n equ.left.monomByLetter('y').coefficient,\r\n equ.left.monomByDegree(0).coefficient\r\n )\r\n }\r\n fromCoefficient = (a: InputValue<Fraction>, b: InputValue<Fraction>, c: InputValue<Fraction>): this => {\r\n this.#a = new Fraction(a)\r\n this.#b = new Fraction(b)\r\n this.#c = new Fraction(c)\r\n\r\n this.#d = new Vector(this.#b.clone(), this.#a.clone().opposite())\r\n this.#OA = new Vector(new Fraction().zero(), this.#c.clone())\r\n this.#n = this.#d.clone().normal()\r\n\r\n return this\r\n }\r\n\r\n fromPointAndDirection = (P: Point, d: Vector): this => {\r\n // OX = OP + k*d\r\n // x = px + kdx * dy\r\n // y = py + kdy * dx\r\n // ------------------\r\n // dy * x = px * dy + kdxdy\r\n // dx * y = py * dx + kdxdy\r\n // ------------------\r\n // dy * x - dx * y = px * dy - py * dx\r\n // dy * x - dx * y - (px * dy - py * dx) = 0\r\n this.fromCoefficient(\r\n d.y,\r\n d.x.clone().opposite(),\r\n P.x.clone().multiply(d.y).subtract(P.y.clone().multiply(d.x)).opposite()\r\n )\r\n\r\n // Choose the current values as point and direction vector instead of the automatic version.\r\n this.#OA = P.clone()\r\n this.#d = d.clone()\r\n this.#n = this.#d.clone().normal()\r\n\r\n return this\r\n }\r\n\r\n fromPointAndNormal = (P: Point, n: Vector): this => {\r\n return this.fromCoefficient(\r\n n.x,\r\n n.y,\r\n P.x.clone().multiply(n.x)\r\n .add(P.y.clone().multiply(n.y)).opposite()\r\n )\r\n }\r\n\r\n fromPointAndLine = (P: Vector, L: Line, orientation?: LinePropriety): this => {\r\n\r\n if (orientation === undefined) {\r\n orientation = LinePropriety.Parallel\r\n }\r\n\r\n if (orientation === LinePropriety.Parallel) {\r\n return this.fromPointAndNormal(P, L.normal)\r\n } else if (orientation === LinePropriety.Perpendicular) {\r\n return this.fromPointAndNormal(P, L.director)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clone = (): this => {\r\n this.#a = this.#a.clone()\r\n this.#b = this.#b.clone()\r\n this.#c = this.#c.clone()\r\n\r\n this.#d = this.#d.clone()\r\n this.#OA = this.#OA.clone()\r\n this.#n = this.#n.clone()\r\n\r\n return this\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n isOnLine = (pt: Vector): boolean => {\r\n return this.#a.clone()\r\n .multiply(pt.x)\r\n .add(\r\n this.#b.clone()\r\n .multiply(pt.y)\r\n )\r\n .add(this.#c)\r\n .isZero()\r\n }\r\n\r\n isParallelTo = (line: Line): boolean => {\r\n // Do they have the isSame direction ?\r\n return this.slope.isEqual(line.slope) && this.height.isNotEqual(line.height)\r\n }\r\n isSameAs = (line: Line): boolean => {\r\n return this.slope.isEqual(line.slope) && this.height.isEqual(line.height)\r\n }\r\n isPerpendicularTo = (line: Line): boolean => {\r\n return this.d.isNormalTo(line.d)\r\n }\r\n isVertical = (): boolean => {\r\n return this.slope.isInfinity()\r\n }\r\n simplify = (): this => {\r\n const lcm = Numeric.lcm(this.#a.denominator, this.#b.denominator, this.#c.denominator),\r\n gcd = Numeric.gcd(this.#a.numerator, this.#b.numerator, this.#c.numerator)\r\n\r\n this.fromCoefficient(\r\n this.#a.clone().multiply(lcm).divide(gcd),\r\n this.#b.clone().multiply(lcm).divide(gcd),\r\n this.#c.clone().multiply(lcm).divide(gcd),\r\n )\r\n\r\n return this\r\n }\r\n\r\n simplifyDirection = (): this => {\r\n this.#d.simplify()\r\n return this\r\n }\r\n intersection = (line: Line): { point: Point, hasIntersection: boolean, isParallel: boolean, isSame: boolean } => {\r\n const Pt = new Point()\r\n let isParallel = false, isSame = false\r\n\r\n // this => ax+by+c = 0\r\n // line => dx+ey+f = 0\r\n //\r\n // aex + bey + ce = 0\r\n // dbx + bey + bf = 0\r\n // (ae-db)x + ce-bf = 0\r\n //\r\n // adx + bdy + cd = 0\r\n // adx + aey + af = 0\r\n // (bd-ae)y + (cd-af)\r\n //\r\n // x = (bf-ce)/(ae-db)\r\n // y = (af-cd)/(bd-ae)\r\n\r\n\r\n // Theres is no 'y'\r\n if (this.#b.isZero() || line.b.isZero()) {\r\n // TODO : handle no y in the line canonical form\r\n }\r\n\r\n if (this.isParallelTo(line)) {\r\n Pt.x = new Fraction().invalid()\r\n Pt.y = new Fraction().invalid()\r\n isParallel = true\r\n } else if (this.isSameAs(line)) {\r\n Pt.x = new Fraction().invalid()\r\n Pt.y = new Fraction().invalid()\r\n isSame = true\r\n } else {\r\n Pt.x = this.#b.clone().multiply(line.c).subtract(this.#c.clone().multiply(line.b))\r\n .divide(this.#a.clone().multiply(line.b).subtract(this.#b.clone().multiply(line.a)))\r\n Pt.y = this.#a.clone().multiply(line.c).subtract(this.#c.clone().multiply(line.a))\r\n .divide(this.#b.clone().multiply(line.a).subtract(this.#a.clone().multiply(line.b)))\r\n }\r\n\r\n return {\r\n point: Pt,\r\n hasIntersection: !(isParallel || isSame),\r\n isParallel,\r\n isSame\r\n }\r\n }\r\n\r\n distanceTo(pt: Point): { value: number, fraction: Fraction, tex: string } {\r\n const numerator = pt.x.clone().multiply(this.#a)\r\n .add(pt.y.clone().multiply(this.#b))\r\n .add(this.#c).abs(),\r\n d2 = this.normal.normSquare\r\n\r\n // The denominator is null - shouldn't be possible\r\n if (d2.isZero()) {\r\n return {\r\n value: NaN,\r\n tex: 'Not a line',\r\n fraction: new Fraction().infinite()\r\n }\r\n }\r\n // The denominator is a perfect square - simplify the tex result\r\n const value = numerator.value / Math.sqrt(d2.value),\r\n F = numerator.clone().divide(d2.clone().sqrt())\r\n\r\n // The denominator is a perfect square.\r\n if (d2.isSquare()) {\r\n return {\r\n value,\r\n tex: F.tex,\r\n fraction: F\r\n }\r\n }\r\n // Complete answer...\r\n return {\r\n value,\r\n tex: `\\\\frac{${numerator.tex}}{\\\\sqrt{${d2.tex}}}`,\r\n fraction: F\r\n }\r\n }\r\n\r\n hitSegment(A: Point, B: Point): boolean {\r\n const iPt = this.intersection(\r\n new Line().fromPoints(A, B)\r\n )\r\n\r\n // There is an intersection point\r\n if (iPt.hasIntersection) {\r\n return iPt.point.x.value >= Math.min(A.x.value, B.x.value)\r\n && iPt.point.x.value <= Math.max(A.x.value, B.x.value)\r\n && iPt.point.y.value >= Math.min(A.y.value, B.y.value)\r\n && iPt.point.y.value <= Math.max(A.y.value, B.y.value)\r\n }\r\n return false\r\n }\r\n\r\n getValueAtX = (value: Fraction | number): Fraction => {\r\n const equ = this.getEquation().isolate('y'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({ x: F }) as Fraction\r\n }\r\n return new Fraction().invalid()\r\n }\r\n\r\n getValueAtY = (value: Fraction | number): Fraction => {\r\n const equ = this.getEquation().isolate('x'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({ y: F }) as Fraction\r\n }\r\n\r\n return new Fraction().invalid()\r\n }\r\n\r\n // ------------------------------------------\r\n // Special functions\r\n // ------------------------------------------\r\n canonicalAsFloatCoefficient(decimals?: number): string {\r\n if (decimals === undefined) {\r\n decimals = 2\r\n }\r\n\r\n let canonical = ''\r\n\r\n if (!this.#a.isZero()) {\r\n if (this.#a.isOne()) {\r\n canonical = 'x'\r\n } else if (this.#a.clone().opposite().isOne()) {\r\n canonical = '-x'\r\n } else {\r\n canonical = this.#a.value.toFixed(decimals) + 'x'\r\n }\r\n }\r\n\r\n if (!this.#b.isZero()) {\r\n if (this.#b.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this.#b.value.toFixed(decimals) + 'y'\r\n }\r\n\r\n if (!this.#c.isZero()) {\r\n if (this.#c.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this.#c.value.toFixed(decimals)\r\n }\r\n\r\n\r\n return canonical + '=0'\r\n }\r\n}","import { Line } from \"./line\"\r\nimport { Vector } from \"./vector\"\r\nimport { Numeric } from \"../numeric\"\r\nimport { Fraction } from \"../coefficients\"\r\nimport { Equation } from \"../algebra\"\r\nimport { Polynom } from \"../algebra\"\r\nimport { Monom } from \"../algebra\"\r\nimport {type IPiMathObject, LinePropriety} from \"../pimath.interface\"\r\nimport { Point } from \"./point\"\r\n\r\nexport class Circle\r\n implements\r\n IPiMathObject<Circle> {\r\n #center: Point | undefined = undefined\r\n #squareRadius: Fraction | undefined = undefined\r\n #cartesian: Equation | undefined = undefined\r\n\r\n constructor()\r\n constructor(equation: string | Equation)\r\n constructor(circle: Circle)\r\n constructor(center: Point, radius: Fraction | number, square?: boolean)\r\n constructor(center: Point, pointThrough: Point)\r\n constructor(A: Point, B: Point, C: Point)\r\n constructor(...values: unknown[]) {\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n }\r\n\r\n get center(): Point {\r\n return this.#center ?? new Point()\r\n }\r\n\r\n get squareRadius(): Fraction {\r\n return this.#squareRadius ?? new Fraction(0)\r\n }\r\n\r\n get cartesian(): Equation {\r\n if (this.#cartesian === undefined) { throw new Error('Cartesian equation not defined') }\r\n\r\n return this.#cartesian\r\n }\r\n\r\n get radius(): { tex: string, display: string, value: number } {\r\n if (this.#squareRadius === undefined) { return { tex: '', display: '', value: 0 } }\r\n if (this.#squareRadius.isSquare()) {\r\n return {\r\n tex: this.#squareRadius.clone().sqrt().tex,\r\n display: this.#squareRadius.clone().sqrt().display,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n } else {\r\n return {\r\n tex: `\\\\sqrt{${this.#squareRadius.tex}}`,\r\n display: `sqrt(${this.#squareRadius.display})`,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n }\r\n }\r\n\r\n get tex(): string {\r\n\r\n let cx, cy\r\n if (this.center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `\\\\left(x${this.center.x.isNegative() ? '+' : '-'}${this.center.x.clone().abs().tex}\\\\right)^2`\r\n }\r\n if (this.center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `\\\\left(y${this.center.y.isNegative() ? '+' : '-'}${this.center.y.clone().abs().tex}\\\\right)^2`\r\n }\r\n return `${cx}+${cy}=${this.squareRadius.tex}`\r\n }\r\n\r\n get developed(): string {\r\n return this.cartesian.tex\r\n }\r\n\r\n get display(): string {\r\n let cx, cy\r\n if (this.center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `(x${this.center.x.isNegative() ? '+' : '-'}${this.center.x.clone().abs().tex})^2`\r\n }\r\n if (this.center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `(y${this.center.y.isNegative() ? '+' : '-'}${this.center.y.clone().abs().tex})^2`\r\n }\r\n return `${cx}+${cy}=${this.squareRadius.display}`\r\n }\r\n\r\n /**\r\n * Get the relative position between circle and line. It corresponds to the number of intersection.\r\n * @param {Line} L\r\n * @returns {number}\r\n */\r\n relativePosition = (L: Line): number => {\r\n if (this.#center === undefined || this.#squareRadius === undefined) { throw new Error('Circle not defined') }\r\n\r\n const distance = L.distanceTo(this.#center), radius = Math.sqrt(this.#squareRadius.value)\r\n\r\n if (distance.value - radius > 0.0000000001) {\r\n return 0 // external\r\n } else if (Math.abs(distance.value - radius) < 0.0000000001) {\r\n return 1 // tangent\r\n } else {\r\n return 2 // secant\r\n }\r\n }\r\n\r\n lineIntersection = (L: Line): Point[] => {\r\n const intersectionPoints: Point[] = []\r\n // let solX: Fraction\r\n\r\n if (this.#cartesian === undefined) { return [] }\r\n const equX = this.#cartesian.clone(), lineX = L.getEquation().clone().isolate('x'),\r\n lineY = L.getEquation().clone().isolate('y')\r\n\r\n if (lineX instanceof Equation && lineY instanceof Equation) {\r\n equX.replaceBy('y', lineY.right).simplify()\r\n equX.solve()\r\n\r\n // TODO: rework the solutions of an equation.\r\n // for (const x of equX.solutions) {\r\n // if (x.exact === false && isNaN(x.value)) {\r\n // continue\r\n // }\r\n\r\n // solX = new Fraction(x.exact === false ? x.value : x.exact)\r\n // intersectionPoints.push(new Point(solX.clone(), lineY.right.evaluate(solX)))\r\n // }\r\n }\r\n\r\n return intersectionPoints\r\n }\r\n\r\n tangents = (P: Point | Fraction): Line[] => {\r\n if (P instanceof Fraction) {\r\n return this.#tangentsWithSlope(P)\r\n } else if (this.isPointOnCircle(P)) {\r\n return this.#tangentsThroughOnePointOnTheCircle(P)\r\n } else if (this.#center !== undefined && this.#center.distanceTo(P).value > this.radius.value) {\r\n //TODO: Must check it's outside the circle\r\n return this.#tangentsThroughOnePointOutsideTheCircle(P)\r\n } else {\r\n console.log('No tangents as the point is inside !')\r\n }\r\n return []\r\n }\r\n\r\n isPointOnCircle = (P: Point): boolean => {\r\n return this.#cartesian?.test({ x: P.x, y: P.y }) ?? false\r\n }\r\n\r\n getPointsOnCircle = (numberIsInteger?: boolean): Point[] => {\r\n if (numberIsInteger === undefined) {\r\n numberIsInteger = false\r\n }\r\n\r\n // It means searching for pythagorician triples that make a perfect square.\r\n // (x-4)^2 + (y+3)^2 = 15\r\n\r\n const triplets = Numeric.pythagoreanTripletsWithTarget(this.squareRadius.value, true)\r\n\r\n const points: Point[] = []\r\n\r\n triplets.forEach(triplet => {\r\n // Allow positive / negative values\r\n // x-a = t => x = a + t\r\n // x-a = -t => x = a - t\r\n\r\n for (const k of [[1, 1], [-1, 1], [-1, -1], [1, -1]]) {\r\n points.push(new Point(\r\n this.center.x.clone().add(k[0] * triplet[0]),\r\n this.center.y.clone().add(k[1] * triplet[1])\r\n )\r\n )\r\n // Check if the point is not already in points.\r\n // TODO: isInListOfPoints not implemented\r\n // if (!pt.isInListOfPoints(points)) {\r\n // points.push(pt)\r\n // }\r\n }\r\n })\r\n return points\r\n }\r\n\r\n clone(): Circle {\r\n return new Circle(\r\n this.center.clone(),\r\n this.squareRadius.clone(),\r\n true\r\n )\r\n // this.#center = this.center.clone()\r\n // this.#squareRadius = this.squareRadius.clone()\r\n // this._calculateCartesian()\r\n // return this\r\n }\r\n\r\n setRadius(radius: Fraction | number, square?: boolean): this {\r\n if (square) {\r\n this.#squareRadius = new Fraction(radius)\r\n } else {\r\n this.#squareRadius = new Fraction(radius).pow(2)\r\n }\r\n this.#calculateCartesian()\r\n return this\r\n }\r\n\r\n #tangentsThroughOnePointOnTheCircle = (P: Point): Line[] => {\r\n const CT = new Vector(this.center, P)\r\n return [new Line(P, CT, LinePropriety.Perpendicular)]\r\n }\r\n\r\n #tangentsThroughOnePointOutsideTheCircle = (P: Point): Line[] => {\r\n // y = mx + h\r\n // px, py => h = -m px + py => mx - y -m.px + py = 0 =>\r\n // Centre: cx, cy, radius: r\r\n // (m.cx - cy -m.px + py)^2 = r^2 * (m^2 + 1)\r\n // (m(cx-py) - (cy - py))^2 = r^2 * (m^2 + 1)\r\n\r\n const cx_px = this.center.x.clone().subtract(P.x), cy_py = this.center.y.clone().subtract(P.y),\r\n polyLeft = new Polynom('x'), polyRight = new Polynom('x^2+1')\r\n\r\n polyLeft.multiply(cx_px).subtract(cy_py).pow(2)\r\n polyRight.multiply(this.squareRadius)\r\n\r\n const equ = new Equation(polyLeft, polyRight)\r\n const solutions = equ.solve()\r\n\r\n return solutions.map(sol => {\r\n // h = -m px + py\r\n let h: Fraction\r\n const equ = new Equation('y', 'x')\r\n\r\n if (sol.exact instanceof Fraction) {\r\n h = P.x.clone().opposite().multiply(sol.exact).add(P.y)\r\n equ.right.multiply(sol.exact).add(h)\r\n } else {\r\n h = P.x.clone().opposite().multiply(sol.value).add(P.y)\r\n equ.right.multiply(sol.value).add(h)\r\n }\r\n\r\n return new Line(equ)\r\n })\r\n\r\n }\r\n\r\n #tangentsWithSlope = (slope: Fraction): Line[] => {\r\n // d(C;t)=r => ac1+bc2 + x = +- sqrt(a^2 + b^2)*r\r\n // x = -ac1-bc2 +- sqrt(a^2 + b^2)*r\r\n // y = a/bx + h => ax-by + H = 0\r\n\r\n const a = slope.numerator, b = -slope.denominator, c1 = this.center.x.clone(), c2 = this.center.y.clone()\r\n\r\n const sq = this.squareRadius.clone().multiply(slope.numerator ** 2 + slope.denominator ** 2),\r\n x1 = c1.clone().multiply(a).opposite().subtract(c2.clone().multiply(b)).add(sq.clone().sqrt()),\r\n x2 = c1.clone().multiply(a).opposite().subtract(c2.clone().multiply(b)).subtract(sq.clone().sqrt())\r\n\r\n return [new Line(a, b, x1), new Line(a, b, x2)]\r\n }\r\n\r\n #reset(): this {\r\n this.#center = undefined\r\n this.#squareRadius = undefined\r\n this.#cartesian = undefined\r\n\r\n return this\r\n }\r\n\r\n parse(...values: unknown[]): this {\r\n // Data can be given in these formats:\r\n // one value, a string -> make it an Equation\r\n // one value, an Equation\r\n // one value, a circle -> clone it\r\n // two values: two points (center and pointThrough)\r\n // two values: point and Fraction (center and radius)\r\n // three values: Vector2D, Fraction, Boolean (center, square radius, true)\r\n\r\n this.#reset()\r\n\r\n if (typeof values[0] === 'string') {\r\n this.#parseEquation(new Equation(values[0]))\r\n } else if (values[0] instanceof Equation) {\r\n this.#parseEquation(values[0])\r\n } else if (values[0] instanceof Circle) {\r\n this.#parseCopyCircle(values[0])\r\n } else if (values[0] instanceof Point && values.length > 1) {\r\n if (values[1] instanceof Point) {\r\n if (values[2] instanceof Point) {\r\n // TODO: Add the method to parse through three points\r\n // this._parseThroughtThreePoints(values[0], values[1], values[2])\r\n } else {\r\n this.#parseCenterAndPointThrough(values[0], values[1])\r\n }\r\n } else if (values[1] instanceof Fraction || typeof values[1] === 'number') {\r\n this.#parseCenterAndRadius(values[0], values[1], (typeof values[2] === \"boolean\") ? values[2] : false)\r\n }\r\n }\r\n\r\n // Calculate once the different values.\r\n this.#calculateCartesian()\r\n\r\n\r\n return this\r\n }\r\n\r\n #calculateCartesian() {\r\n this.#cartesian = (\r\n new Equation(\r\n new Polynom(`(x-(${this.center.x.display}))^2+(y-(${this.center.y.display}))^2`),\r\n new Polynom(this.squareRadius.display))\r\n ).moveLeft()\r\n }\r\n\r\n #parseCopyCircle(circle: Circle): this {\r\n this.#center = circle.center.clone()\r\n this.#squareRadius = circle.squareRadius.clone()\r\n this.#calculateCartesian()\r\n return this\r\n }\r\n\r\n #parseCenterAndRadius(center: Point, radius: Fraction | number, square?: boolean): this {\r\n this.#center = center.clone()\r\n if (square) {\r\n this.#squareRadius = (new Fraction(radius))\r\n } else {\r\n this.#squareRadius = new Fraction(radius).pow(2)\r\n }\r\n\r\n return this\r\n }\r\n\r\n #parseCenterAndPointThrough(center: Point, pointThrough: Point): this {\r\n this.#center = center.clone()\r\n this.#squareRadius = new Vector(this.#center, pointThrough).normSquare\r\n return this\r\n }\r\n\r\n #parseEquation(equ: Equation): this {\r\n\r\n // Move everything to the left.\r\n equ.moveLeft()\r\n\r\n if (equ.degree('x').value === 2 && equ.degree('y').value === 2) {\r\n // Both must be of degree 2.\r\n const x2 = equ.left.monomByDegree(2, 'x'), y2 = equ.left.monomByDegree(2, 'y')\r\n let x1: Monom, y1: Monom, c: Monom\r\n\r\n // Both square monoms must have the same coefficient.\r\n if (x2.coefficient.isEqual(y2.coefficient)) {\r\n equ.divide(x2.coefficient)\r\n\r\n x1 = equ.left.monomByDegree(1, 'x')\r\n y1 = equ.left.monomByDegree(1, 'y')\r\n\r\n c = equ.left.monomByDegree(0)\r\n\r\n this.#center = new Point(x1.coefficient.clone().divide(2).opposite(), y1.coefficient.clone().divide(2).opposite())\r\n\r\n this.#squareRadius = c.coefficient.clone().opposite()\r\n .add(this.#center.x.clone().pow(2))\r\n .add(this.#center.y.clone().pow(2))\r\n\r\n } else {\r\n // The circle is not a valid circle\r\n this.#center = undefined\r\n this.#squareRadius = undefined\r\n }\r\n }\r\n return this\r\n }\r\n\r\n // private _parseThroughtThreePoints(A: Point, B: Point, C: Point): this {\r\n // const T = new Triangle(A, B, C), mAB = T.remarquables.mediators.AB.clone(),\r\n // mAC = T.remarquables.mediators.AC.clone()\r\n // this.parse(mAB.intersection(mAC).point, A)\r\n\r\n // return this\r\n // }\r\n\r\n}","/**\r\n * This class works for 2d line in a plane.\r\n */\r\n\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Polynom } from \"../algebra/polynom\"\r\nimport { Monom } from \"../algebra/monom\"\r\nimport { randomIntSym } from \"../randomization/rndHelpers\"\r\nimport { Vector } from \"./vector\"\r\nimport { Point } from \"./point\"\r\nimport {Line3Propriety} from \"../pimath.interface\"\r\n\r\n\r\nexport class Line3 {\r\n // A line is defined as the canonical form\r\n static PERPENDICULAR = Line3Propriety.Perpendicular\r\n static PARALLEL = Line3Propriety.Parallel\r\n // ax + by + c = 0\r\n #OA: Point = new Point()\r\n #d: Vector = new Vector()\r\n\r\n /**\r\n * Value can be a mix of:\r\n *\r\n * @param values\r\n */\r\n constructor(A: Point, B: Point)\r\n constructor(A: Point, d: Vector)\r\n constructor(A: Point, d: Vector | Point) {\r\n this.#OA = A.clone()\r\n this.#d = d.asPoint ? new Vector(A, d) : d.clone()\r\n return this\r\n }\r\n\r\n get OA(): Point {\r\n return this.#OA\r\n }\r\n\r\n set OA(value: Point) {\r\n this.#OA = value\r\n }\r\n get point(): Point {\r\n return this.#OA.clone()\r\n }\r\n\r\n get d(): Vector {\r\n return this.#d\r\n }\r\n\r\n set d(value: Vector) {\r\n this.#d = value\r\n }\r\n\r\n get tex(): { parametric: string, system: string, cartesian: string } {\r\n return {\r\n parametric: `${Vector.asTex('x', 'y', 'z')} = ${Vector.asTex(this.#OA.x.tex, this.#OA.y.tex, this.#OA.z.tex)} + k\\\\cdot ${Vector.asTex(this.#d.x.tex, this.#d.y.tex, this.#d.z.tex)}`,\r\n system: `\\\\left\\\\{\\\\begin{aligned}\r\n x &= ${(new Polynom(this.#OA.x)\r\n .add(new Monom(this.#d.x).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\ \r\n y &= ${(new Polynom(this.#OA.y)\r\n .add(new Monom(this.#d.y).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\\r\n z &= ${(new Polynom(this.#OA.z)\r\n .add(new Monom(this.#d.z).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\r\n\\\\end{aligned}\\\\right.`,\r\n cartesian: `\\\\frac{ ${new Polynom('x', 1, this.#OA.x.clone().opposite()).tex} }{ ${this.direction.x.tex} } = \\\\frac{ ${new Polynom('y', 1, this.#OA.y.clone().opposite()).tex} }{ ${this.direction.y.tex} } = \\\\frac{ ${new Polynom('z', 1, this.#OA.z.clone().opposite()).tex} }{ ${this.direction.z.tex} }`\r\n }\r\n }\r\n\r\n get display(): { parametric: string, system: string, cartesian: string } {\r\n const OAx = this.#OA.x.display\r\n const OAy = this.#OA.y.display\r\n const OAz = this.#OA.z.display\r\n const n = this.direction.simplify()\r\n const nx = n.x.display\r\n const ny = n.y.display\r\n const nz = n.z.display\r\n\r\n return {\r\n parametric: `${Vector.asDisplay('x', 'y', 'z')} = ${Vector.asDisplay(this.#OA.x.display, this.#OA.y.display, this.#OA.z.display)} + k\\\\cdot ${Vector.asDisplay(this.#d.x.display, this.#d.y.display, this.#d.z.display)}`,\r\n system: '',\r\n cartesian: `(x-${OAx})/${nx} = (y-${OAy})/${ny} = (z-${OAz})/${nz}`\r\n }\r\n }\r\n\r\n get direction(): Vector {\r\n return this.#d.clone()\r\n }\r\n\r\n clone = (): this => {\r\n this.#d = this.#d.clone()\r\n this.#OA = this.#OA.clone()\r\n\r\n return this\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n isOnLine = (pt: Point): boolean => {\r\n return false\r\n }\r\n\r\n isParallelTo = (line: Line3): boolean => {\r\n // Do they have the isSame direction ?\r\n throw new Error('Method not implemented.')\r\n }\r\n isSameAs = (line: Line3): boolean => {\r\n throw new Error('Method not implemented.')\r\n }\r\n isPerpendicularTo = (line: Line3): boolean => {\r\n throw new Error('Method not implemented.')\r\n }\r\n isVertical = (): boolean => {\r\n throw new Error('Method not implemented.')\r\n }\r\n simplify = (): this => {\r\n throw new Error('Method not implemented.')\r\n // const lcm = Numeric.lcm(this.#a.denominator, this.#b.denominator, this.#c.denominator),\r\n // gcd = Numeric.gcd(this.#a.numerator, this.#b.numerator, this.#c.numerator)\r\n\r\n // this.fromCoefficient(\r\n // this.#a.clone().multiply(lcm).divide(gcd),\r\n // this.#b.clone().multiply(lcm).divide(gcd),\r\n // this.#c.clone().multiply(lcm).divide(gcd),\r\n // )\r\n\r\n // return this\r\n }\r\n\r\n intersection = (line: Line3): { point: Vector, hasIntersection: boolean, isParallel: boolean, isSame: boolean } => {\r\n\r\n throw new Error('Method not implemented.')\r\n }\r\n\r\n distanceTo(pt: Point): { value: number, fraction: Fraction, tex: string } {\r\n // Distance is:\r\n // |(x - x0) x d| / |d|\r\n const AP = new Vector(this.#OA, pt),\r\n d = this.direction,\r\n d2 = this.direction.normSquare,\r\n num2 = AP.cross(d).normSquare,\r\n num2d2 = num2.clone().divide(d2),\r\n dnum = num2d2.clone().sqrt()\r\n\r\n console.log('CROSS', AP.cross(d).display)\r\n return {\r\n value: Math.sqrt(num2d2.value),\r\n fraction: num2d2.clone().sqrt(),\r\n tex: dnum.isExact() ? dnum.tex : `\\\\sqrt{${num2d2.tex}}`\r\n }\r\n }\r\n\r\n hitSegment(A: Point, B: Point): boolean {\r\n const iPt = this.intersection(\r\n new Line3(A, B)\r\n )\r\n\r\n // There is an intersection point\r\n if (iPt.hasIntersection) {\r\n return iPt.point.x.value >= Math.min(A.x.value, B.x.value)\r\n && iPt.point.x.value <= Math.max(A.x.value, B.x.value)\r\n && iPt.point.y.value >= Math.min(A.y.value, B.y.value)\r\n && iPt.point.y.value <= Math.max(A.y.value, B.y.value)\r\n && iPt.point.z.value >= Math.min(A.z.value, B.z.value)\r\n && iPt.point.z.value <= Math.max(A.z.value, B.z.value)\r\n }\r\n return false\r\n }\r\n\r\n // getValueAtX = (value: Fraction | number): Fraction => {\r\n // const equ = this.equation.clone().isolate('y'),\r\n // F = new Fraction(value)\r\n\r\n // if (equ instanceof Equation) {\r\n // return equ.right.evaluate({ x: F }) as Fraction\r\n // }\r\n // return new Fraction().invalid()\r\n // }\r\n\r\n // getValueAtY = (value: Fraction | number): Fraction => {\r\n // const equ = this.equation.clone().isolate('x'),\r\n // F = new Fraction(value)\r\n\r\n // if (equ instanceof Equation) {\r\n // return equ.right.evaluate({ y: F }) as Fraction\r\n // }\r\n\r\n // return new Fraction().invalid()\r\n // }\r\n\r\n randomPoint = (max = 5): Point => {\r\n const A = this.#OA.clone(),\r\n k = new Fraction(randomIntSym(max, false))\r\n\r\n return new Point(\r\n A.x.clone().add(this.#d.x.clone().multiply(k)),\r\n A.y.clone().add(this.#d.y.clone().multiply(k)),\r\n A.z.clone().add(this.#d.z.clone().multiply(k))\r\n )\r\n }\r\n}","import { Fraction } from \"../coefficients/fraction\"\r\nimport { determinant } from \"./geomMath\"\r\nimport type { Vector } from \"./vector\"\r\n\r\n\r\nexport class Matrix {\r\n #values: Vector[] = []\r\n constructor(...values: Vector[]) {\r\n this.#values = values\r\n\r\n return this\r\n }\r\n\r\n get values(): Vector[] {\r\n return this.#values\r\n }\r\n\r\n get array(): Fraction[][] {\r\n return this.#values.map(v => v.array)\r\n }\r\n\r\n get dimension(): number[] {\r\n return [this.#values.length, this.#values[0].dimension]\r\n }\r\n\r\n isSquare(): boolean {\r\n return this.#values.length === this.#values[0].dimension\r\n }\r\n\r\n determinant(): Fraction {\r\n if (!this.isSquare()) {\r\n throw new Error('Matrix is not square')\r\n }\r\n\r\n return determinant(...this.values)\r\n }\r\n}","import { Equation } from \"../algebra/equation\"\r\nimport { Polynom } from \"../algebra/polynom\"\r\nimport { Fraction } from \"../coefficients/fraction\"\r\nimport { Line3 } from \"./line3\"\r\nimport { Point } from \"./point\"\r\nimport { Vector } from \"./vector\"\r\nimport type {Plane3Config} from \"../pimath.interface\"\r\n\r\n\r\n\r\nexport class Plane3 {\r\n #normal: Vector = new Vector(0, 0, 1)\r\n #point: Point = new Point(0, 0, 0)\r\n\r\n constructor(config?: Plane3Config) {\r\n if (config) {\r\n this.parse(config)\r\n }\r\n\r\n return this\r\n }\r\n\r\n get normal(): Vector {\r\n return this.#normal\r\n }\r\n set normal(value: Vector) {\r\n this.#normal = value\r\n this.#normal.asPoint = false\r\n }\r\n get point(): Point {\r\n return this.#point\r\n }\r\n set point(value: Point) {\r\n this.#point = value\r\n this.#point.asPoint = true\r\n }\r\n\r\n get a(): Fraction {\r\n return this.#normal.x\r\n }\r\n get b(): Fraction {\r\n return this.#normal.y\r\n }\r\n get c(): Fraction {\r\n return this.#normal.z\r\n }\r\n get d(): Fraction {\r\n return this.#normal.dot(this.#point).opposite()\r\n }\r\n\r\n get tex(): string {\r\n // return the cartesian equation of the plane\r\n return new Equation(\r\n new Polynom('xyz', this.a, this.b, this.c, this.d),\r\n new Polynom(0)\r\n ).reduce().tex\r\n }\r\n\r\n get display(): string {\r\n // return the cartesian equation of the plane\r\n return new Equation(\r\n new Polynom('xyz', this.a, this.b, this.c, this.d),\r\n new Polynom(0)\r\n ).reduce().display\r\n }\r\n\r\n parse(config: Plane3Config) {\r\n if (config.point && config.normal) {\r\n this.point = config.point\r\n this.normal = config.normal\r\n return\r\n }\r\n\r\n if (config.point && config.directions?.length === 2) {\r\n this.point = config.point\r\n const [v1, v2] = config.directions\r\n this.normal = v1.cross(v2)\r\n return\r\n }\r\n\r\n if (config.equation) {\r\n const cartesian = config.equation.moveLeft().reduce().left\r\n\r\n const a = cartesian.monomByLetter('x').coefficient\r\n const b = cartesian.monomByLetter('y').coefficient\r\n const c = cartesian.monomByLetter('z').coefficient\r\n const d = cartesian.monomByDegree(0).coefficient\r\n\r\n // Get the normal vector\r\n this.normal = new Vector(a, b, c)\r\n\r\n // Get a point on the plane\r\n if (a.isNotZero()) {\r\n this.point = new Point(d.clone().divide(a).opposite(), 0, 0)\r\n } else if (b.isNotZero()) {\r\n this.point = new Point(0, d.clone().divide(b).opposite(), 0)\r\n } else {\r\n this.point = new Point(0, 0, d.clone().divide(c).opposite())\r\n }\r\n // Make sure it's considered as point\r\n return\r\n }\r\n\r\n if (config.points?.length === 3 && config.points.every(p => p instanceof Vector)) {\r\n const A = config.points[0]\r\n const B = config.points[1]\r\n const C = config.points[2]\r\n\r\n const AB = new Vector(A, B)\r\n const AC = new Vector(A, C)\r\n this.normal = AB.cross(AC)\r\n this.point = A\r\n return\r\n }\r\n\r\n if (config.coefficients?.length === 4) {\r\n const [a, b, c, d] = config.coefficients\r\n this.normal = new Vector(a, b, c)\r\n this.point = new Point(0, 0, -d)\r\n return\r\n }\r\n }\r\n\r\n angle(vector: Vector, sharp?: boolean, radian?: boolean): number\r\n angle(line: Line3, sharp?: boolean, radian?: boolean): number\r\n angle(plane: Plane3, sharp?: boolean, radian?: boolean): number\r\n angle(value: Plane3 | Line3 | Vector, sharp?: boolean, radian?: boolean): number {\r\n if (value instanceof Plane3) {\r\n return this.normal.angle(value.normal, sharp, radian)\r\n }\r\n\r\n let direction: Vector\r\n if (value instanceof Vector) {\r\n if (value.dimension !== 3) {\r\n throw new Error('Vector is not 3D')\r\n }\r\n\r\n direction = value\r\n } else {\r\n direction = value.direction\r\n }\r\n\r\n const a90 = radian ? Math.PI / 2 : 90\r\n return a90 - this.normal.angle(direction, true, radian)\r\n }\r\n\r\n distanceTo(point: Vector): number {\r\n return this.normal.dot(point).add(this.d).abs().value / this.normal.norm\r\n }\r\n\r\n intersectWithLine(line: Line3): Point {\r\n const { point, direction } = line\r\n const t = this.normal.dot(point).add(this.d).divide(this.normal.dot(direction).opposite())\r\n return point.clone().add(direction.clone().multiplyByScalar(t))\r\n }\r\n\r\n intersectWithPlane(plane: Plane3): Line3 {\r\n const direction = this.normal.cross(plane.normal)\r\n\r\n // Solve the system:\r\n // p1 // p2 // z=0\r\n const pt = new Point(0, 0, 0)\r\n throw new Error('Intersection with plane not yet implemented !')\r\n return new Line3(pt, direction)\r\n }\r\n\r\n isPointOnPlane(pt: Point): boolean {\r\n return this.normal.dot(pt).add(this.d).isZero()\r\n }\r\n}","import { Fraction } from \"../coefficients/fraction\"\r\nimport { Line } from \"./line\"\r\nimport { Vector } from \"./vector\"\r\nimport { Point } from \"./point\"\r\nimport type {remarquableLines} from \"../pimath.interface\"\r\n\r\nexport class Triangle {\r\n #A: Point = new Point()\r\n #B: Point = new Point()\r\n #C: Point = new Point()\r\n #lines: { 'AB': Line, 'AC': Line, 'BC': Line } = {\r\n 'AB': new Line(),\r\n 'AC': new Line(),\r\n 'BC': new Line()\r\n }\r\n #middles: { 'AB': Point, 'AC': Point, 'BC': Point } = {\r\n 'AB': new Point(),\r\n 'AC': new Point(),\r\n 'BC': new Point()\r\n }\r\n #remarquables: remarquableLines | null = null\r\n\r\n constructor(...values: unknown[]) {\r\n\r\n if (values.length > 0) {\r\n this.parse(...values)\r\n }\r\n\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setters\r\n // ------------------------------------------\r\n\r\n get A(): Point {\r\n return this.#A\r\n }\r\n\r\n get B(): Point {\r\n return this.#B\r\n }\r\n\r\n get C(): Point {\r\n return this.#C\r\n }\r\n\r\n get AB(): Vector {\r\n return this.#getSegment('A', 'B')\r\n }\r\n\r\n get BA(): Vector {\r\n return this.#getSegment('B', 'A')\r\n }\r\n\r\n get BC(): Vector {\r\n return this.#getSegment('B', 'C')\r\n }\r\n\r\n get CB(): Vector {\r\n return this.#getSegment('C', 'B')\r\n }\r\n\r\n get AC(): Vector {\r\n return this.#getSegment('A', 'C')\r\n }\r\n\r\n get CA(): Vector {\r\n return this.#getSegment('C', 'A')\r\n }\r\n\r\n get isRectangle(): boolean {\r\n if (this.AB.isNormalTo(this.BC)) {\r\n return true\r\n }\r\n if (this.AB.isNormalTo(this.AC)) {\r\n return true\r\n }\r\n if (this.BC.isNormalTo(this.AC)) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n get isEquilateral(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) &&\r\n this.AB.normSquare.isEqual(this.AC.normSquare)\r\n }\r\n\r\n get isIsocele(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) ||\r\n this.AB.normSquare.isEqual(this.AC.normSquare) ||\r\n this.BC.normSquare.isEqual(this.AC.normSquare)\r\n }\r\n\r\n get lines(): { 'AB': Line, 'BC': Line, 'AC': Line } {\r\n return this.#lines\r\n }\r\n\r\n get remarquables(): remarquableLines | null {\r\n return this.#remarquables\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n\r\n /**\r\n * Parse values to a triangle. Supported formats:\r\n * Vector2D, Vector2D, Vector2D\r\n * x1, y1, x2, y2, x3, y3\r\n * @param values\r\n */\r\n parse = (...values: unknown[]): Triangle => {\r\n if (values.length === 6) {\r\n // Check if all values are number or fractions.\r\n const v: Fraction[] = values.map((x: unknown) => new Fraction(x as string))\r\n\r\n if (v.some(x => x.isNaN())) {\r\n throw new Error('One of the values is not a valid number')\r\n }\r\n\r\n return this.parse(\r\n new Vector(v[0], v[1]),\r\n new Vector(v[2], v[3]),\r\n new Vector(v[4], v[5]),\r\n )\r\n } else if (values.length === 3) {\r\n // Possibilities:\r\n // - Three points (or part of points, only dict for example, or array\r\n // - Three lines\r\n // - Three lines as text.\r\n if (values.every((x: unknown) => typeof x === 'string')) {\r\n // Three lines as text.\r\n return this.parse(\r\n ...values.map((x) => {\r\n return new Line(x)\r\n })\r\n )\r\n } else if (values.every((x: unknown) => x instanceof Line)) {\r\n // We have three lines\r\n const AB: Line = (values[0]).clone()\r\n const BC: Line = (values[1]).clone()\r\n const AC: Line = (values[2]).clone()\r\n this.#lines = { AB, BC, AC }\r\n\r\n // Get the intersection points -> build the triangle using these intersection points.\r\n let intersect = AB.intersection(BC)\r\n if (intersect.hasIntersection) {\r\n this.#B = intersect.point.clone()\r\n } else {\r\n throw new Error('Lines do not intersect !')\r\n }\r\n\r\n intersect = BC.intersection(AC)\r\n if (intersect.hasIntersection) {\r\n this.#C = intersect.point.clone()\r\n } else {\r\n throw new Error('Lines do not intersect !')\r\n }\r\n\r\n intersect = AC.intersection(AB)\r\n if (intersect.hasIntersection) {\r\n this.#A = intersect.point.clone()\r\n } else {\r\n throw new Error('Lines do not intersect !')\r\n }\r\n\r\n } else if (values.every((x: unknown) => (x instanceof Point))) {\r\n // We have three points.\r\n this.#A = (values[0]).clone()\r\n this.#B = (values[1]).clone()\r\n this.#C = (values[2]).clone()\r\n this.#lines = {\r\n 'AB': new Line(this.#A, this.#B),\r\n 'BC': new Line(this.#B, this.#C),\r\n 'AC': new Line(this.#A, this.#C)\r\n }\r\n }\r\n } else if (values.length === 1) {\r\n if (values[0] instanceof Triangle) {\r\n return values[0].clone()\r\n }\r\n }\r\n\r\n this.#updateTriangle()\r\n return this\r\n }\r\n\r\n /**\r\n * Clone the Triangle class\r\n */\r\n clone = (): Triangle => {\r\n return new Triangle(\r\n this.#A.clone(),\r\n this.#B.clone(),\r\n this.#C.clone()\r\n )\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Triangle operations and properties\r\n // ------------------------------------------\r\n\r\n /**\r\n * Generate the Line object for the three segments of the triangle\r\n */\r\n #updateTriangle = () => {\r\n this.#A.asPoint = true\r\n this.#B.asPoint = true\r\n this.#C.asPoint = true\r\n\r\n this.#middles = {\r\n 'AB': new Point().middleOf(this.#A, this.#B),\r\n 'AC': new Point().middleOf(this.#A, this.#C),\r\n 'BC': new Point().middleOf(this.#B, this.#C)\r\n }\r\n\r\n this.#remarquables = this.#calculateRemarquableLines()\r\n }\r\n\r\n\r\n /**\r\n * Get the Vector2D class for the given name\r\n * @param ptName\r\n */\r\n #getPointByName = (ptName: string): Point => {\r\n switch (ptName.toUpperCase()) {\r\n case 'A':\r\n return this.#A\r\n case 'B':\r\n return this.#B\r\n case 'C':\r\n return this.#C\r\n }\r\n\r\n // Something went wrong ! Return the first point\r\n return this.#A\r\n }\r\n /**\r\n * Get the vector for the segment given by name.\r\n * @param ptName1\r\n * @param ptName2\r\n */\r\n #getSegment = (ptName1: string, ptName2: string): Vector => {\r\n return new Vector(\r\n this.#getPointByName(ptName1),\r\n this.#getPointByName(ptName2)\r\n )\r\n }\r\n\r\n #calculateRemarquableLines = (): remarquableLines => {\r\n\r\n const medians = {\r\n 'A': new Line().fromPoints(this.#A, this.#middles.BC),\r\n 'B': new Line().fromPoints(this.#B, this.#middles.AC),\r\n 'C': new Line().fromPoints(this.#C, this.#middles.AB),\r\n 'intersection': null\r\n }\r\n\r\n const mediators = {\r\n 'AB': new Line().fromPointAndNormal(this.#middles.AB, new Vector(this.#A, this.#B).normal()),\r\n 'AC': new Line().fromPointAndNormal(this.#middles.AC, new Vector(this.#A, this.#C).normal()),\r\n 'BC': new Line().fromPointAndNormal(this.#middles.BC, new Vector(this.#B, this.#C).normal()),\r\n 'intersection': null\r\n }\r\n\r\n const heights = {\r\n 'A': new Line().fromPointAndNormal(this.#A, new Vector(this.#B, this.#C).normal()),\r\n 'B': new Line().fromPointAndNormal(this.#B, new Vector(this.#A, this.#C).normal()),\r\n 'C': new Line().fromPointAndNormal(this.#C, new Vector(this.#A, this.#B).normal()),\r\n 'intersection': null\r\n }\r\n\r\n const bA = this.#calculateBisectors('A'),\r\n bB = this.#calculateBisectors('B'),\r\n bC = this.#calculateBisectors('C')\r\n\r\n const bisectors = {\r\n 'A': bA.internal,\r\n 'B': bB.internal,\r\n 'C': bB.internal,\r\n 'intersection': null\r\n }\r\n\r\n const externalBisectors = {\r\n 'A': bA.external,\r\n 'B': bB.external,\r\n 'C': bC.external,\r\n 'intersection': null\r\n }\r\n\r\n const remarquables: remarquableLines = {\r\n medians,\r\n mediators,\r\n heights,\r\n bisectors,\r\n externalBisectors\r\n }\r\n\r\n // As it's a triangle, we assume the lines are intersecting and aren't parallel or superposed.\r\n remarquables.medians.intersection = remarquables.medians.A.intersection(remarquables.medians.B).point\r\n remarquables.mediators.intersection = remarquables.mediators.AB.intersection(remarquables.mediators.BC).point\r\n remarquables.heights.intersection = remarquables.heights.A.intersection(remarquables.heights.B).point\r\n remarquables.bisectors.intersection = remarquables.bisectors.A.intersection(remarquables.bisectors.B).point\r\n\r\n // Everything was calculated for the remarquable lines.\r\n return remarquables\r\n }\r\n\r\n #calculateBisectors = (pt: string): { internal: Line, external: Line } => {\r\n const tlines = this.lines\r\n let d1, d2\r\n\r\n if (pt === 'A') {\r\n d1 = tlines.AB\r\n d2 = tlines.AC\r\n } else if (pt === 'B') {\r\n d1 = tlines.AB\r\n d2 = tlines.BC\r\n } else if (pt === 'C') {\r\n d1 = tlines.BC\r\n d2 = tlines.AC\r\n }\r\n\r\n if (d1 === undefined || d2 === undefined) {\r\n throw new Error(`The point ${pt} does not exist`)\r\n }\r\n\r\n const d1n = d1.n.simplify().norm\r\n const d2n = d2.n.simplify().norm\r\n const d1Equ = d1.getEquation().multiply(d2n)\r\n const d2Equ = d2.getEquation().multiply(d1n)\r\n\r\n const b1: Line = new Line(d1Equ.clone().subtract(d2Equ).simplify())\r\n const b2: Line = new Line(d2Equ.clone().subtract(d1Equ).simplify())\r\n\r\n // Must determine which bisectors is in the triangle\r\n if (pt === 'A') {\r\n return b1.hitSegment(this.B, this.C) ? { internal: b1, external: b2 } : { internal: b2, external: b1 }\r\n }\r\n if (pt === 'B') {\r\n return b1.hitSegment(this.A, this.C) ? { internal: b1, external: b2 } : { internal: b2, external: b1 }\r\n }\r\n if (pt === 'C') {\r\n return b1.hitSegment(this.B, this.A) ? { internal: b1, external: b2 } : { internal: b2, external: b1 }\r\n }\r\n\r\n // Default returns the first bisector\r\n return { internal: b1, external: b2 }\r\n }\r\n}","import {Point} from \"./point\"\r\nimport {Fraction} from \"../coefficients\"\r\nimport {Equation, Polynom} from \"../algebra\"\r\nimport type {InputValue} from \"../pimath.interface\"\r\n\r\nenum SPHERE3_FORMAT {\r\n DEVELOPPED,\r\n CENTER_RADIUS\r\n}\r\n\r\nexport enum SPHERE3_RELATIVE_POSITION {\r\n INTERIOR,\r\n EXTERIOR,\r\n SECANT,\r\n TANGENT_INSIDE,\r\n TANGENT_OUTSIDE,\r\n SUPERPOSED,\r\n CONCENTRIC\r\n}\r\n\r\nexport class Sphere3 {\r\n #center: Point | undefined = undefined\r\n #squareRadius: Fraction | undefined = undefined\r\n #equation: Equation | undefined = undefined\r\n #format: SPHERE3_FORMAT = SPHERE3_FORMAT.CENTER_RADIUS\r\n\r\n constructor(center?: Point, radius?: InputValue<Fraction>) {\r\n if (center && radius) {\r\n this.#center = center\r\n this.#squareRadius = new Fraction(radius).clone().pow(2)\r\n this.#computeEquation()\r\n }\r\n return this\r\n }\r\n\r\n fromEquation(equation: Equation | string): this {\r\n const equ = new Equation(equation).moveLeft().reduce()\r\n\r\n // Check that x, y, z has the same power and same coefficient.\r\n const letters = ['x', 'y', 'z']\r\n\r\n if (letters.some((letter) => equ.degree(letter).value !== 2)){\r\n return this.makeUndefined()\r\n }\r\n\r\n const coefficient = equ.left.monomByDegree(2, 'x').coefficient\r\n if (letters.some((letter) => equ.left.monomByDegree(2, letter).coefficient.isNotEqual(coefficient))) {\r\n return this.makeUndefined()\r\n }\r\n\r\n this.#center = new Point(\r\n equ.left.monomByDegree(1, 'x').coefficient.clone().opposite().divide(2),\r\n equ.left.monomByDegree(1, 'y').coefficient.clone().opposite().divide(2),\r\n equ.left.monomByDegree(1, 'z').coefficient.clone().opposite().divide(2)\r\n )\r\n\r\n this.#squareRadius = equ.left.monomByDegree(0)\r\n .coefficient.clone().opposite()\r\n .add(this.#center.x.clone().pow(2))\r\n .add(this.#center.y.clone().pow(2))\r\n .add(this.#center.z.clone().pow(2))\r\n\r\n this.#computeEquation()\r\n return this\r\n }\r\n\r\n get center(): Point {\r\n if (this.#center === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n return this.#center\r\n }\r\n\r\n get squareRadius(): Fraction {\r\n if (this.#squareRadius === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n return this.#squareRadius\r\n }\r\n\r\n get radius(): { tex: string, display: string, value: number } {\r\n if (this.#squareRadius === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n\r\n if (this.#squareRadius.isSquare()) {\r\n return {\r\n tex: this.#squareRadius.clone().sqrt().tex,\r\n display: this.#squareRadius.clone().sqrt().display,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n } else {\r\n return {\r\n tex: `\\\\sqrt{${this.#squareRadius.tex}}`,\r\n display: `sqrt(${this.#squareRadius.display})`,\r\n value: this.#squareRadius.clone().sqrt().value\r\n }\r\n }\r\n }\r\n\r\n get equation(): Equation {\r\n if (this.#equation === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n return this.#equation\r\n }\r\n\r\n makeUndefined(): this {\r\n this.#center = undefined\r\n this.#squareRadius = undefined\r\n this.#equation = undefined\r\n return this\r\n }\r\n\r\n get centerRadius(): this {\r\n this.#format = SPHERE3_FORMAT.CENTER_RADIUS\r\n return this\r\n }\r\n\r\n get developped(): this {\r\n this.#format = SPHERE3_FORMAT.DEVELOPPED\r\n return this\r\n }\r\n\r\n\r\n get tex(): string {\r\n return this.#output(true)\r\n }\r\n\r\n get display(): string {\r\n return this.#output(false)\r\n }\r\n\r\n #output = (asTex: boolean): string => {\r\n if (this.#equation === undefined) {\r\n throw new Error('Sphere3 is undefined')\r\n }\r\n\r\n if (this.#format === SPHERE3_FORMAT.DEVELOPPED) {\r\n return asTex ? this.#equation.tex : this.#equation.display\r\n }\r\n\r\n const output: string[] = []\r\n const letters: ('x' | 'y' | 'z')[] = ['x', 'y', 'z']\r\n\r\n letters.forEach((letter: 'x' | 'y' | 'z') => {\r\n if (this.center[letter].isZero()) {\r\n output.push(`${letter}^2`)\r\n } else {\r\n const P = new Polynom(letter).subtract(this.center[letter])\r\n output.push(\r\n asTex ?\r\n `\\\\(${P.tex}\\\\)^2` :\r\n `(${P.display})^2`\r\n )\r\n }\r\n })\r\n\r\n return output.join('+') + '=' + (asTex ? this.squareRadius.tex : this.squareRadius.display)\r\n\r\n }\r\n\r\n #computeEquation(): void {\r\n this.#equation = new Equation(\r\n new Polynom('x').subtract(this.center.x).pow(2)\r\n .add(\r\n new Polynom('y').subtract(this.center.y).pow(2)\r\n )\r\n .add(\r\n new Polynom('z').subtract(this.center.z).pow(2)\r\n ),\r\n new Polynom(this.squareRadius)\r\n ).reduce()\r\n }\r\n\r\n static RELATIVE_POSITION = SPHERE3_RELATIVE_POSITION\r\n relativePosition = (S: Sphere3): SPHERE3_RELATIVE_POSITION => {\r\n const distance = this.center.distanceTo(S.center).value\r\n const r1 = this.radius.value\r\n const r2 = S.radius.value\r\n\r\n if (distance > r1 + r2) {\r\n return SPHERE3_RELATIVE_POSITION.EXTERIOR\r\n }\r\n\r\n if (distance === r1 + r2) {\r\n return SPHERE3_RELATIVE_POSITION.TANGENT_OUTSIDE\r\n }\r\n\r\n if(distance===0) {\r\n return r1===r2 ? SPHERE3_RELATIVE_POSITION.SUPERPOSED : SPHERE3_RELATIVE_POSITION.CONCENTRIC\r\n }\r\n\r\n if (distance === Math.abs(r1 - r2)) {\r\n return SPHERE3_RELATIVE_POSITION.TANGENT_INSIDE\r\n }\r\n\r\n\r\n if (distance < Math.abs(r1 - r2)) {\r\n return SPHERE3_RELATIVE_POSITION.INTERIOR\r\n }\r\n\r\n return SPHERE3_RELATIVE_POSITION.SECANT\r\n\r\n }\r\n\r\n isPointOnSphere = (P: Point): boolean => {\r\n return this.#equation?.test({\r\n x: P.x,\r\n y: P.y,\r\n z: P.z\r\n }) ?? false\r\n }\r\n}","import type { randomCoefficientConfig } from \"../rndTypes\"\r\nimport { Fraction } from \"../../coefficients/fraction\"\r\nimport { randomInt, randomIntSym } from \"../rndHelpers\"\r\n\r\nexport function rndFraction(userConfig?: randomCoefficientConfig): Fraction {\r\n const config = Object.assign(\r\n {\r\n negative: true,\r\n max: 10,\r\n reduced: true,\r\n zero: true,\r\n natural: false\r\n }, userConfig)\r\n\r\n // Create a null fraction\r\n const Q = new Fraction()\r\n\r\n\r\n if (config.negative) {\r\n // Allow negative numbers\r\n Q.numerator = randomIntSym(config.max, config.zero)\r\n } else {\r\n // Only positive numbers\r\n Q.numerator = randomInt(config.zero ? 0 : 1, config.max)\r\n }\r\n\r\n if (config.natural) {\r\n Q.denominator = 1\r\n } else {\r\n let securityCount = 0\r\n while (Q.isRelative() && securityCount < 10) {\r\n Q.denominator = randomInt(1, config.max)\r\n securityCount++\r\n }\r\n }\r\n\r\n return config.reduced ? Q.reduce() : Q\r\n}\r\n","import type { randomMonomConfig } from \"../rndTypes\"\r\nimport { Monom } from \"../../algebra/monom\"\r\nimport { rndFraction } from \"../coefficient/rndFraction\"\r\nimport { randomItem } from \"../rndHelpers\"\r\n\r\nexport function rndMonom(userConfig?: randomMonomConfig): Monom {\r\n const config = Object.assign(\r\n {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: true,\r\n zero: false\r\n }, userConfig)\r\n\r\n // Create a monom instance\r\n const M = new Monom()\r\n\r\n // Generate the coefficient\r\n M.coefficient = rndFraction({\r\n zero: config.zero,\r\n reduced: true,\r\n natural: !config.fraction\r\n })\r\n\r\n if (config.letters.length > 1) {\r\n // Initialise each items...\r\n for (const L of config.letters.split('')) {\r\n M.setLetter(L, 0)\r\n }\r\n for (let i = 0; i < config.degree; i++) {\r\n const L = randomItem(config.letters.split(\"\"))\r\n M.setLetter(L, M.degree(L).clone().add(1))\r\n }\r\n } else {\r\n M.setLetter(config.letters, config.degree)\r\n }\r\n\r\n return M\r\n}","import type { randomPolynomConfig } from \"../rndTypes\"\r\nimport { rndMonom } from \"./rndMonom\"\r\nimport { Polynom, Monom } from \"../../algebra\"\r\nimport { randomInt } from \"../rndHelpers\"\r\n\r\nconst factorableConfig = {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: false,\r\n zero: false,\r\n unit: false,\r\n factorable: false,\r\n allowNullMonom: true,\r\n numberOfMonoms: 0,\r\n positive: true\r\n}\r\n\r\nexport function rndPolynom(userConfig?: randomPolynomConfig): Polynom {\r\n const config = Object.assign(\r\n factorableConfig,\r\n userConfig\r\n )\r\n\r\n // TODO: Create a factorable polynom does not work !!!!!\r\n\r\n // Create the polynom\r\n const P = new Polynom().empty()\r\n\r\n let M: Monom\r\n\r\n for (let i = config.degree; i >= 0; i--) {\r\n // Create monom of corresponding degree.\r\n M = rndMonom({\r\n letters: config.letters,\r\n degree: i,\r\n fraction: config.fraction,\r\n zero: (i === config.degree) ? false : config.allowNullMonom\r\n })\r\n\r\n // If degree is the greatest and unit is true, set the monom value to one.\r\n if (config.unit && config.degree === i) {\r\n M.coefficient.one()\r\n }\r\n\r\n // Add to the polynom\r\n P.add(M)\r\n }\r\n\r\n // Make sure the first monom is positive.\r\n if (config.positive && P.monomByDegree().coefficient.isNegative()) {\r\n P.monomByDegree().coefficient.opposite()\r\n }\r\n\r\n // If the number of monoms is greater than the allowed value, remove some of them... except the first one !\r\n if (config.numberOfMonoms\r\n && config.numberOfMonoms > 0\r\n && config.numberOfMonoms < P.length) {\r\n while (P.length > config.numberOfMonoms) {\r\n // Remove a random monom, except the first one\r\n const index = randomInt(1, P.length - 1)\r\n\r\n P.monoms.splice(index, 1)\r\n }\r\n }\r\n\r\n return P.reduce()\r\n}\r\n\r\nexport function rndFactorablePolynom(userConfig?: randomPolynomConfig): Polynom {\r\n const config = Object.assign(\r\n factorableConfig,\r\n userConfig\r\n )\r\n\r\n const P = new Polynom().one()\r\n\r\n const _factorableConfig = { ...config }\r\n _factorableConfig.degree = 1\r\n _factorableConfig.factorable = false\r\n\r\n for (let i = 0; i < config.degree; i++) {\r\n P.multiply(rndPolynom(_factorableConfig))\r\n }\r\n\r\n return P.reduce()\r\n}","import type { randomEquationConfig } from \"../rndTypes\"\r\nimport { Polynom } from \"../../algebra/polynom\"\r\nimport { Equation } from \"../../algebra/equation\"\r\nimport { rndPolynom } from \"./rndPolynom\"\r\n\r\nexport function rndEquation(userConfig?: randomEquationConfig): Equation {\r\n const config = Object.assign(\r\n {\r\n letters: 'x',\r\n degree: 1,\r\n fraction: false,\r\n zero: false,\r\n unit: false,\r\n factorable: false,\r\n allowNullMonom: true,\r\n numberOfMonoms: 0,\r\n positive: true,\r\n solution: {\r\n allowZero: true,\r\n fraction: false,\r\n nothing: false,\r\n everything: false\r\n }\r\n }, userConfig)\r\n\r\n // Create a polynom\r\n const P = new Polynom().one()\r\n\r\n for (let i = 0; i < config.degree; i++) {\r\n const factor = rndPolynom({\r\n degree: 1,\r\n unit: config.unit,\r\n fraction: config.fraction,\r\n letters: config.letters,\r\n zero: config.zero\r\n })\r\n P.multiply(factor)\r\n }\r\n\r\n return new Equation(P, 0)\r\n}\r\n","import { Fraction } from \"../../coefficients/fraction\"\r\nimport type { randomGeometryPointConfig } from \"../rndTypes\"\r\nimport { rndFraction } from \"../coefficient/rndFraction\"\r\nimport { randomIntSym } from \"../rndHelpers\"\r\nimport { Point } from \"../../geometry/point\"\r\n\r\nexport function rndVector(userConfig?: randomGeometryPointConfig): Point {\r\n const config: {\r\n axis: 'x' | 'y' | 'z' | null,\r\n fraction: boolean,\r\n max: number,\r\n quadrant: number | null\r\n } = Object.assign(\r\n {\r\n axis: true,\r\n fraction: false,\r\n max: 10,\r\n quadrant: null\r\n }, userConfig)\r\n\r\n const zeroX = config.axis === 'x',\r\n zeroY = config.axis === 'y'\r\n\r\n\r\n const x = config.fraction ?\r\n rndFraction({ max: config.max, zero: zeroX }) :\r\n new Fraction(randomIntSym(config.max, zeroX))\r\n\r\n const y = config.fraction ?\r\n rndFraction({ max: config.max, zero: zeroY }) :\r\n new Fraction(randomIntSym(config.max, zeroY))\r\n\r\n if (Number(config.quadrant) === 1) {\r\n x.abs()\r\n y.abs()\r\n }\r\n if (Number(config.quadrant) === 2) {\r\n if (x.isPositive()) {\r\n x.opposite()\r\n }\r\n if (y.isNegative()) {\r\n y.opposite()\r\n }\r\n }\r\n if (Number(config.quadrant) === 3) {\r\n if (x.isPositive()) {\r\n x.opposite()\r\n }\r\n if (y.isPositive()) {\r\n y.opposite()\r\n }\r\n }\r\n if (Number(config.quadrant) === 4) {\r\n if (x.isNegative()) {\r\n x.opposite()\r\n }\r\n if (y.isPositive()) {\r\n y.opposite()\r\n }\r\n }\r\n\r\n return new Point(x, y)\r\n}\r\n","import { Circle } from \"../../geometry/circle\"\r\nimport { randomInt } from \"../rndHelpers\"\r\nimport type { randomGeometryCircleConfig } from \"../rndTypes\"\r\nimport { rndVector } from \"./rndVector\"\r\n\r\nexport function rndCircle(userConfig?: randomGeometryCircleConfig): Circle {\r\n const config = Object.assign(\r\n {\r\n center: {\r\n x: { min: -10, max: 10 },\r\n y: { min: -10, max: 10 }\r\n },\r\n pointsOnCircle: 8\r\n }, userConfig)\r\n\r\n const center = rndVector(config.center)\r\n\r\n let rv, r\r\n if (config.pointsOnCircle === 8) {\r\n rv = randomInt(1, 3),\r\n r = rv ** 2 + (rv + 1) ** 2\r\n } else {\r\n r = randomInt(1, 20)\r\n }\r\n\r\n return new Circle(center, r, true)\r\n}","import { Line } from \"../../geometry/line\"\r\nimport { Vector } from \"../../geometry/vector\"\r\nimport { randomIntSym } from \"../rndHelpers\"\r\nimport type { randomGeometryLineConfig } from \"../rndTypes\"\r\n\r\nexport function rndLine(userConfig?: randomGeometryLineConfig): Line {\r\n const config = Object.assign(\r\n {\r\n A: {\r\n x: randomIntSym(10),\r\n y: randomIntSym(10)\r\n },\r\n }, userConfig)\r\n\r\n // The A point exists.\r\n const d = new Vector(\r\n randomIntSym(10),\r\n randomIntSym(10)\r\n )\r\n\r\n while (d.isNull) {\r\n d.x = randomIntSym(10)\r\n d.y = randomIntSym(10)\r\n }\r\n\r\n if (config.slope === 1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposite()\r\n }\r\n } else if (config.slope === -1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposite()\r\n }\r\n }\r\n\r\n return new Line().fromPointAndDirection(new Vector(config.A.x, config.A.y), d)\r\n}","import { Line3 } from \"../../geometry/line3\"\r\nimport { Point } from \"../../geometry/point\"\r\nimport { Vector } from \"../../geometry/vector\"\r\nimport { randomIntSym } from \"../rndHelpers\"\r\nimport type { randomGeometryLine3Config } from \"../rndTypes\"\r\n\r\nexport function rndLine3(userConfig?: randomGeometryLine3Config): Line3 {\r\n const config = Object.assign(\r\n {\r\n A: {\r\n x: randomIntSym(10),\r\n y: randomIntSym(10),\r\n z: randomIntSym(10)\r\n },\r\n direction: {\r\n x: randomIntSym(10),\r\n y: randomIntSym(10),\r\n z: randomIntSym(10)\r\n }\r\n }, userConfig)\r\n\r\n // The direction vector exists.\r\n const A = new Point(config.A.x, config.A.y, config.A.z)\r\n const d = new Vector(config.direction.x, config.direction.y, config.direction.z)\r\n\r\n return new Line3(A, d)\r\n}","import type {\r\n randomCoefficientConfig,\r\n randomEquationConfig,\r\n randomGeometryCircleConfig,\r\n randomGeometryLine3Config,\r\n randomGeometryLineConfig,\r\n randomGeometryPointConfig,\r\n randomMonomConfig,\r\n randomPolynomConfig\r\n} from \"./rndTypes\"\r\n\r\nimport { randomArray, randomBool, randomInt, randomIntSym, randomItem, randomPrime, shuffleArray } from \"./rndHelpers\"\r\nimport { rndFraction } from \"./coefficient/rndFraction\"\r\nimport { rndMonom } from \"./algebra/rndMonom\"\r\nimport { rndPolynom } from \"./algebra/rndPolynom\"\r\nimport { rndEquation } from \"./algebra/rndEquation\"\r\nimport { rndCircle } from \"./geometry/rndCircle\"\r\nimport { rndLine } from \"./geometry/rndLine\"\r\nimport { rndLine3 } from \"./geometry/rndLine3\"\r\nimport { rndVector } from \"./geometry/rndVector\"\r\n\r\nexport type * from \"./rndTypes\"\r\n\r\nexport const Random = {\r\n equation: (config?: randomEquationConfig) => {\r\n return rndEquation(config)\r\n },\r\n\r\n polynom: (config?: randomPolynomConfig) => {\r\n return rndPolynom(config)\r\n },\r\n\r\n monom: (config?: randomMonomConfig) => {\r\n return rndMonom(config)\r\n },\r\n\r\n fraction: (config?: randomCoefficientConfig) => {\r\n return rndFraction(config)\r\n },\r\n\r\n number: (from: number, to: number, exclude?: number[]): number => {\r\n return randomInt(from, to, exclude)\r\n },\r\n\r\n numberSym: (max: number, allowZero?: boolean): number => {\r\n return randomIntSym(max, allowZero)\r\n },\r\n\r\n prime: (max: number): number => {\r\n return randomPrime(max)\r\n },\r\n\r\n bool: (percent?: number): boolean => {\r\n return randomBool(percent)\r\n },\r\n\r\n array: <T>(arr: T[], number?: number): T[] => {\r\n return randomArray(arr, number)\r\n },\r\n\r\n item: <T>(arr: T[]): T => {\r\n return randomItem(arr)\r\n },\r\n\r\n shuffle: <T>(arr: T[]): T[] => {\r\n return shuffleArray(arr)\r\n },\r\n\r\n line: (config?: randomGeometryLineConfig) => {\r\n return rndLine(config)\r\n },\r\n\r\n line3: (config?: randomGeometryLine3Config) => {\r\n return rndLine3(config)\r\n },\r\n\r\n vector: (config?: randomGeometryPointConfig) => {\r\n return rndVector(config)\r\n },\r\n\r\n point: (config?: randomGeometryPointConfig) => {\r\n const vector = rndVector(config)\r\n vector.asPoint = true\r\n\r\n return vector\r\n },\r\n\r\n circle: (config?: randomGeometryCircleConfig) => {\r\n return rndCircle(config)\r\n }\r\n}","// Expose as global\r\nexport * from \"./coefficients\"\r\nexport * from \"./algebra\"\r\nexport * from \"./geometry\"\r\n\r\n// Import items individually to make a global object\r\n\r\n// Coefficients\r\nimport {Fraction, NthRoot} from \"./coefficients\"\r\n\r\n// Algebra\r\nimport {Equation, Factor, LinearSystem, LogicalSet, Monom, PolyFactor, Polynom} from \"./algebra\"\r\n\r\n// Geometry\r\nimport {Circle, Line, Line3, Matrix, Plane3, Point, Triangle, Vector, Sphere3} from \"./geometry\"\r\n\r\n// Numeric\r\nimport {Numeric} from \"./numeric\"\r\nexport {Numeric}\r\n\r\n// NumExp\r\nimport {NumExp} from \"piexpression\"\r\nexport {NumExp}\r\n\r\n// randomization\r\nimport {Random} from \"./randomization/random\"\r\nexport {Random}\r\n\r\n// Typesetting\r\nexport type * from \"./pimath.interface\"\r\n\r\n// Make a global object\r\nconst PiMath = {\r\n Numeric,\r\n Fraction,\r\n Root: NthRoot,\r\n Monom,\r\n Polynom,\r\n Equation,\r\n Matrix,\r\n LinearSystem,\r\n Factor,\r\n PolyFactor,\r\n LogicalSet,\r\n Random,\r\n Geometry: {\r\n Vector,\r\n Point,\r\n Line,\r\n Triangle,\r\n Circle,\r\n Line3,\r\n Plane3,\r\n Sphere3\r\n },\r\n NumExp\r\n}\r\n\r\n// Export as default value\r\nexport default PiMath\r\n"],"names":["decompose","value","divs","dividers","arr","u","v","divideNumbersByGCD","values","g","greatestCommonDivisor","x","absV","maxV","D","i","a","b","gcd2","leastCommonMultiple","numberCorrection","number_of_digits","periodic","primes","nb","primesValues","pythagoreanTripletsWithTarget","target","targetIsSquare","triplets","targetValue","round","decimals","Numeric","_approximative","_denominator","_numerator","_type","_Fraction","denominatorOrPeriodic","__privateAdd","__publicField","S","__privateSet","decimal","p","F","__privateGet","N","k","f","sign","compareFraction","Q","n","than","controlNumerator","controlDenominator","result","fractions","M","m","compare","reverse","sorted","unique","distinct","R","Fraction","_radical","_nth","_coefficient","_isValid","NthRoot","radical","nthroot","coefficient","V","C","_equation","_variable","_EquationSolver_instances","makeApproximativeSolution_fn","makeSolution_fn","solveByBissection_fn","solveByBissection_algorithm_fn","solveByFactorization_fn","solveCubic_CardanFormula_fn","solveLinear_fn","solveQuadratic_fn","solveQuadratic_Output_fn","_EquationSolver","left","right","variable","equ","degree","__privateMethod","output","fraction","solutions","coeffs","B","dx","evaluatedPoints","searchValue","couples","index","couple","bissection","tol","fa","fb","mid","fmid","lcm","dividersA","dividersB","da","db","s","solver","c","d","an","bn","cn","q","P","delta","x1","x2","pv","qv","anv","delta2","f1","f2","deltaFactor","gcd","b2","a2","deltaGcd","deltaK1","deltaK2","texOutput","displayOutput","EquationSolver","_","e","A","t","r","O","o","T","h","w","U","y","I","l","E","L","_literal","_Monom_instances","cloneLiteral_fn","_evaluateAsNumeric","_shutingYardToReducedMonom","_shutingYard_AddToken","_Monom","mAsMonom","letter","dM","asNumeric","tmpValues","div","M1","M2","K","item","key","pow","inputStr","rpn","ShutingYard","stack","element","ShutingyardType","_a","q1","q2","letters","literals","monomDividers","primitive","tmpList","litt","currentLetter","monoms","Monom","wrapParenthesis","str","tex","replace_in_array","haystack","search","start","end","_factors","_monoms","_roots","_rootsCache","_compare","_divideByFraction","_divideByInteger","_factorize2ndDegree","_genDisplay","_getAllPotentialFactors","_multiplyByFraction","_multiplyByInteger","_multiplyByMonom","_multiplyByPolynom","_Polynom_instances","parseString_fn","_shutingYardToReducedPolynom","_shutingYard_addToken","_Polynom","polynomString","numerator","denominator","dP","quotient","reminder","maxMP","degreeP","newM","MaxIteration","monom","factors","tempPolynom","securityLoop","maxDegree","allDividers","pX","pC","dX","dC","denominators","numerators","valuesA","valuesB","pString","zero","Ms","j","revert","otherLetters","resultPolynom","cP1","cP2","m1","nbF","P1","P2","factor","xPolynom","xFactors","xyzPolynom","forceSign","wrapParentheses","withAllMultiplicationSign","m2","m1d","m2d","coeff","orderedPolynom","length","roots","signs","_x","_root","test","Polynom","_left","_right","_sign","_findSign","_formatSign","_reverseSign","_Equation","equationString","strSign","pStr","p1","p2","mMove","cMove","allLeft","move","signStr","solutionAsTex","uniqueSolutions","sol","Equation","_displayMode","_polynom","_power","_singleMode","_Factor","power","polynom","num","den","base","tos","Factor","FACTOR_DISPLAY","FACTOR_DISPLAY2","_equations","_variables","_findLetters","_makeMatrix","_LinearSystem","equations","operators","equStr","equArray","operatorsColumns","eq1","eq2","factor1","factor2","eq1multiplied","eq2multiplied","matrix","vector","augmentedMatrix","row","pivot","row_to_add","acc","cols","vars","LS","LinearSystem","_rpn","_LogicalSet_instances","evaluateAsVenn_fn","LogicalSet","ShutingyardMode","token","varStack","second","first","tokenSets","reference","referenceSet","_PolyFactor_static","gcdWith_fn","lcmWith_fn","_PolyFactor_instances","extractNumeratorAndDenominator_fn","_PolyFactor","numTeX","denTeX","PF","remainingPolynom","pf","dPF","derivativeFactor","newFactors","self","PF1","PF2","keyFactors","aPower","bPower","aLength","bLength","aDegree","bDegree","roots_key","empty_signs","root","aligned_signs","rootSign","factors1","factors2","power2","PolyFactor","k_numerator","k_denominator","kF","areVectorsEquals","v1","v2","areVectorsColinears","dotProduct","determinant","_array","_asPoint","_Vector","norm","scalar","sharp","radian","components","V1","V2","Vector","LinePropriety","Line3Propriety","randomBool","percent","randomInt","exclude","randomIntSym","max","randomPrime","randomItem","randomArray","number","shuffleArray","temp","Point","nbs","_reduceBeforeDisplay","_b","_c","_OA","_d","_n","_outputMode","_Line","pt","maxIterationTest","formattedValues","elem","orientation","line","Pt","isParallel","isSame","canonical","pt1","pt2","d2","iPt","Line","_center","_squareRadius","_cartesian","_tangentsThroughOnePointOnTheCircle","_tangentsThroughOnePointOutsideTheCircle","_tangentsWithSlope","_Circle_instances","reset_fn","calculateCartesian_fn","parseCopyCircle_fn","parseCenterAndRadius_fn","parseCenterAndPointThrough_fn","parseEquation_fn","_Circle","distance","radius","intersectionPoints","equX","lineX","lineY","numberIsInteger","points","triplet","CT","cx_px","cy_py","polyLeft","polyRight","slope","c1","c2","sq","cx","cy","square","circle","center","pointThrough","y2","y1","Circle","_Line3","OAx","OAy","OAz","nx","ny","nz","AP","num2","num2d2","dnum","Line3","_values","Matrix","_normal","_point","_Plane3","config","cartesian","AB","AC","direction","point","plane","Plane3","_A","_B","_C","_lines","_middles","_remarquables","_updateTriangle","_getPointByName","_getSegment","_calculateRemarquableLines","_calculateBisectors","_Triangle","BC","intersect","ptName","ptName1","ptName2","medians","mediators","heights","bA","bB","bC","bisectors","externalBisectors","remarquables","tlines","d1","d1n","d2n","d1Equ","d2Equ","b1","Triangle","SPHERE3_RELATIVE_POSITION","SPHERE3_RELATIVE_POSITION2","_format","_output","_Sphere3_instances","computeEquation_fn","Sphere3","asTex","r1","r2","equation","rndFraction","userConfig","securityCount","rndMonom","factorableConfig","rndPolynom","rndEquation","rndVector","zeroX","zeroY","rndCircle","rv","rndLine","rndLine3","Random","from","to","allowZero","PiMath","NumExp"],"mappings":"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,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM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","x_google_ignoreList":[4]}