{"version":3,"file":"spectra-processor.min.js","sources":["../node_modules/ml-spectra-processing/lib-esm/utils/createFromToArray.js","../node_modules/is-any-array/lib-esm/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedian.js","../node_modules/ml-spectra-processing/lib-esm/x/xAdd.js","../node_modules/ml-spectra-processing/lib-esm/x/utils/getOutputArray.js","../node_modules/ml-spectra-processing/lib-esm/x/xMultiply.js","../node_modules/ml-spectra-processing/lib-esm/x/xBoxPlot.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-spectra-processing/lib-esm/x/xCorrelation.js","../node_modules/ml-spectra-processing/lib-esm/x/xEnsureFloat64.js","../node_modules/ml-spectra-processing/lib-esm/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xGetFromToIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsEquallySpaced.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsMonotone.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsMonotoneIncreasing.js","../node_modules/ml-spectra-processing/lib-esm/x/xMean.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xNoiseStandardDeviation.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedianAbsoluteDeviation.js","../node_modules/ml-spectra-processing/lib-esm/x/xSum.js","../node_modules/ml-spectra-processing/lib-esm/x/xNormed.js","../node_modules/ml-spectra-processing/lib-esm/x/xVariance.js","../node_modules/ml-spectra-processing/lib-esm/x/xStandardDeviation.js","../node_modules/ml-spectra-processing/lib-esm/x/xParetoNormalization.js","../node_modules/ml-spectra-processing/lib-esm/x/xRescale.js","../node_modules/ml-spectra-processing/lib-esm/x/xApplyFunctionStr.js","../node_modules/ml-spectra-processing/lib-esm/x/xSubtract.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyCheck.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyMaxYPoint.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyEnsureGrowingX.js","../node_modules/ml-spectra-processing/lib-esm/zones/zonesNormalize.js","../node_modules/ml-spectra-processing/lib-esm/zones/zonesWithPoints.js","../node_modules/ml-spectra-processing/lib-esm/xy/utils/integral.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyEquallySpaced.js","../node_modules/ml-spectra-processing/lib-esm/xy/utils/equallySpacedSlot.js","../node_modules/ml-spectra-processing/lib-esm/xy/utils/equallySpacedSmooth.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyFilterX.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyIntegration.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyMinYPoint.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixCenterZMean.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/views/base.js","../node_modules/ml-matrix/src/views/transpose.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/lu.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/qr.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixPQN.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixZRescale.js","../node_modules/chroma-js/chroma.js","../src/spectra/getBoxPlotData.js","../src/jsgraph/getBoxPlotChart.js","../src/jsgraph/addChartDataStyle.js","../src/spectra/getNormalizedData.js","../src/metadata/getCategoriesStats.js","../node_modules/ensure-string/lib-esm/index.js","../node_modules/isutf8/dist/index.esm.js","../node_modules/dynamic-typing/src/parseString.js","../node_modules/jcampconverter/lib-esm/complexChromatogram.js","../node_modules/jcampconverter/lib-esm/convertToFloatArray.js","../node_modules/jcampconverter/lib-esm/parse/fastParseXYData.js","../node_modules/jcampconverter/lib-esm/parse/parsePeakTable.js","../node_modules/jcampconverter/lib-esm/parse/parseXYA.js","../node_modules/ml-array-median/lib-es6/index.js","../node_modules/jcampconverter/lib-esm/2d/add2D.js","../node_modules/jcampconverter/lib-esm/2d/convertTo3DZ.js","../node_modules/jcampconverter/lib-esm/2d/generateContourLines.js","../node_modules/gyromagnetic-ratio/lib-esm/index.js","../node_modules/jcampconverter/lib-esm/profiling.js","../node_modules/jcampconverter/lib-esm/simpleChromatogram.js","../node_modules/jcampconverter/lib-esm/postProcessing.js","../node_modules/jcampconverter/lib-esm/postProcessingNMR.js","../node_modules/jcampconverter/lib-esm/prepareNtuplesDatatable.js","../node_modules/jcampconverter/lib-esm/prepareSpectrum.js","../node_modules/jcampconverter/lib-esm/convert.js","../src/Kinds.js","../src/parser/jcamp.js","../node_modules/ml-arrayxy-uniquex/src/index.js","../node_modules/xy-parser/lib-esm/parse.js","../node_modules/xy-parser/lib-esm/index.js","../src/spectra/util/convertToText.js","../node_modules/object-hash/dist/object_hash.js","../src/spectra/scaled/getFromToIndex.js","../src/spectra/scaled/integration.js","../src/spectra/scaled/max.js","../src/spectra/scaled/min.js","../src/spectra/scaled/minMax.js","../src/spectra/getPostProcessedData.js","../node_modules/ml-airpls/src/choleskySolver.js","../node_modules/cuthill-mckee/cuthill-mckee.js","../node_modules/ml-airpls/src/utils.js","../node_modules/ml-airpls/src/index.js","../node_modules/ml-array-sequential-fill/lib-es6/index.js","../node_modules/ml-regression-base/src/maybeToPrecision.js","../node_modules/ml-regression-base/src/index.js","../node_modules/ml-regression-polynomial/src/index.js","../node_modules/ml-regression-base/src/checkArrayLength.js","../node_modules/ml-matrix/src/decompositions.js","../node_modules/ml-baseline-correction-regression/src/index.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-array-mean/lib-es6/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xPadding.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xRolling.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xRollingAverage.js","../node_modules/baselines/node_modules/ml-spectra-processing/lib-esm/x/xRollingMedian.js","../node_modules/ml-rolling-ball-baseline/src/rollingBall.js","../node_modules/ml-savitzky-golay-generalized/lib-esm/index.js","../node_modules/ml-gsd/lib-esm/utils/optimizeTop.js","../node_modules/ml-gsd/lib-esm/gsd.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/centerMean.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/centerMedian.js","../node_modules/ml-signal-processing/lib-esm/filters/x/fromTo.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/normed.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/divideBySD.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/rescale.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/paretoNormalization.js","../node_modules/ml-signal-processing/lib-esm/filters/baseline/airPLSBaseline.js","../node_modules/baselines/src/airPLS.js","../node_modules/ml-signal-processing/lib-esm/filters/baseline/iterativePolynomialBaseline.js","../node_modules/baselines/src/iterativePolynomial.js","../node_modules/ml-signal-processing/lib-esm/filters/baseline/rollingAverageBaseline.js","../node_modules/baselines/src/rollingAverage.js","../node_modules/ml-signal-processing/lib-esm/filters/baseline/rollingBallBaseline.js","../node_modules/baselines/src/rollingBall.js","../node_modules/ml-signal-processing/lib-esm/filters/baseline/rollingMedianBaseline.js","../node_modules/baselines/src/rollingMedian.js","../node_modules/ml-signal-processing/lib-esm/filters/sg/firstDerivative.js","../node_modules/ml-signal-processing/lib-esm/filters/sg/secondDerivative.js","../node_modules/ml-signal-processing/lib-esm/filters/sg/thirdDerivative.js","../node_modules/ml-signal-processing/lib-esm/filters/sg/savitzkyGolay.js","../node_modules/ml-signal-processing/lib-esm/filters/x/ensureGrowing.js","../node_modules/ml-signal-processing/lib-esm/filters/x/equallySpaced.js","../node_modules/ml-signal-processing/lib-esm/filters/x/filterX.js","../node_modules/ml-signal-processing/lib-esm/filters/x/calibrateX.js","../node_modules/ml-signal-processing/lib-esm/filters/x/xFunction.js","../node_modules/ml-signal-processing/lib-esm/filters/scaling/yFunction.js","../node_modules/ml-signal-processing/lib-esm/filterXY.js","../src/spectrum/Spectrum.js","../src/spectrum/updateRangesInfo.js","../src/spectrum/getNormalized.js","../src/spectrum/getData.js","../src/SpectraProcessor.js","../src/jsgraph/getNormalizationAnnotations.js","../src/spectra/getAutocorrelation.js","../src/spectra/getMeanData.js","../src/spectra/getNormalizedText.js","../src/spectra/getPostProcessedText.js","../src/parser/text.js","../src/metadata/getMetadata.js","../src/metadata/getClasses.js","../src/metadata/getClassLabels.js","../src/jsgraph/getChart.js","../src/jsgraph/getAutocorrelationChart.js","../src/jsgraph/getTrackAnnotation.js","../src/jsgraph/getNormalizedChart.js","../src/jsgraph/getPostProcessedChart.js","../src/parser/matrix.js","../src/jsgraph/getFilterAnnotations.js"],"sourcesContent":["/**\n * Create an array with numbers between \"from\" and \"to\" of length \"length\"\n *\n * @param options - options\n * @return - array of distributed numbers between \"from\" and \"to\"\n */\nexport function createFromToArray(options = {}) {\n    let { from = 0, to = 1, length = 1000, includeFrom = true, includeTo = true, distribution = 'uniform', } = options;\n    const array = new Float64Array(length);\n    let div = length;\n    if (includeFrom === true && includeTo === true) {\n        div = length - 1;\n    }\n    else if ((includeFrom === false && includeTo === true) ||\n        (includeFrom === true && includeTo === false)) {\n        div = length;\n    }\n    else if (includeFrom === false && includeTo === false) {\n        div = length + 1;\n    }\n    let delta = (to - from) / div;\n    if (distribution === 'uniform') {\n        if (includeFrom === true) {\n            let index = 0;\n            while (index < length) {\n                array[index] = from + delta * index;\n                index++;\n            }\n        }\n        else {\n            let index = 0;\n            while (index < length) {\n                array[index] = from + delta * (index + 1);\n                index++;\n            }\n        }\n    }\n    else if (distribution === 'log') {\n        let base = (to / from) ** (1 / div);\n        let firstExponent = Math.log(from) / Math.log(base);\n        if (includeFrom === true) {\n            let index = 0;\n            while (index < length) {\n                array[index] = base ** (firstExponent + index);\n                index++;\n            }\n        }\n        else {\n            let index = 0;\n            while (index < length) {\n                array[index] = base ** (firstExponent + index + 1);\n                index++;\n            }\n        }\n    }\n    else {\n        throw new Error('Please choose for the distribution either uniform or log. By default the distribution chosen is uniform.');\n    }\n    return array;\n}\n//# sourceMappingURL=createFromToArray.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","(function(){function a(d){for(var e=0,f=d.length-1,g=void 0,h=void 0,i=void 0,j=c(e,f);!0;){if(f<=e)return d[j];if(f==e+1)return d[e]>d[f]&&b(d,e,f),d[j];for(g=c(e,f),d[g]>d[f]&&b(d,g,f),d[e]>d[f]&&b(d,e,f),d[g]>d[e]&&b(d,g,e),b(d,g,e+1),h=e+1,i=f;!0;){do h++;while(d[e]>d[h]);do i--;while(d[i]>d[e]);if(i<h)break;b(d,h,i)}b(d,e,i),i<=j&&(e=h),i>=j&&(f=i-1)}}var b=function b(d,e,f){var _ref;return _ref=[d[f],d[e]],d[e]=_ref[0],d[f]=_ref[1],_ref},c=function c(d,e){return~~((d+e)/2)};'undefined'!=typeof module&&module.exports?module.exports=a:window.median=a})();\n","import { isAnyArray } from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n/**\n * Calculates the median of an array\n *\n * @param input - Array containing values\n * @returns - median\n */\nexport function xMedian(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    // we need to slice because the order of elements is changed in the quickselect\n    // https://github.com/mad-gooze/median-quickselect\n    return quickSelectMedian(input.slice());\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function xAdd the first array by the second array or a constant value to each element of the first array\n *\n * @param array1 - the first array\n * @param array2 - the second array or number\n */\nexport function xAdd(array1, array2) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xAdd: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = array2;\n    }\n    let array3 = new Float64Array(array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] + constant;\n        }\n    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] + array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xAdd.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function\n * @param output - undefined or a new array\n * @param length - length of the output array\n * @returns\n */\nexport function getOutputArray(output, length) {\n    if (output !== undefined) {\n        if (!isAnyArray(output)) {\n            throw new TypeError('output option must be an array if specified');\n        }\n        if (output.length !== length) {\n            throw new TypeError('the output array does not have the correct length');\n        }\n        return output;\n    }\n    else {\n        return new Float64Array(length);\n    }\n}\n//# sourceMappingURL=getOutputArray.js.map","import { isAnyArray } from 'is-any-array';\nimport { getOutputArray } from './utils/getOutputArray';\n/**\n * This function xMultiply the first array by the second array or a constant value to each element of the first array\n *\n * @param array1 - first array\n * @param array2 - second array\n * @param options - options\n */\nexport function xMultiply(array1, array2, options = {}) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xMultiply: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = Number(array2);\n    }\n    let array3 = getOutputArray(options.output, array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] * constant;\n        }\n    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] * array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xMultiply.js.map","/**\n * Calculating the box plot of the array\n *\n * @param array - data\n */\nexport function xBoxPlot(array) {\n    array = Float64Array.from(array).sort();\n    if (array.length < 5) {\n        throw Error('xBoxPlot: can not calculate info if array contains less than 3 elements');\n    }\n    let info = {\n        q1: 0.0,\n        median: 0.0,\n        q3: 0.0,\n        min: array[0],\n        max: array[array.length - 1],\n    };\n    let q1max, q3min;\n    if (array.length % 2 === 1) {\n        // odd\n        let middle = (array.length - 1) / 2;\n        info.median = array[middle];\n        q1max = middle - 1;\n        q3min = middle + 1;\n    }\n    else {\n        // even\n        q3min = array.length / 2;\n        q1max = q3min - 1;\n        info.median = (array[q1max] + array[q3min]) / 2;\n    }\n    if (q1max % 2 === 0) {\n        info.q1 = array[q1max / 2];\n        info.q3 = array[(array.length + q3min - 1) / 2];\n    }\n    else {\n        info.q1 = (array[(q1max + 1) / 2] + array[(q1max - 1) / 2]) / 2;\n        let middleOver = (array.length + q3min) / 2;\n        info.q3 = (array[middleOver] + array[middleOver - 1]) / 2;\n    }\n    return info;\n}\n//# sourceMappingURL=xBoxPlot.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","/**\n * Calculates the correlation between 2 vectors\n * https://en.wikipedia.org/wiki/Correlation_and_dependence\n *\n * @param A - first array\n * @param B - sencond array\n */\nexport function xCorrelation(A, B) {\n    let n = A.length;\n    let sumA = 0;\n    let sumA2 = 0;\n    let sumB = 0;\n    let sumB2 = 0;\n    let sumAB = 0;\n    for (let i = 0; i < n; i++) {\n        let a = A[i];\n        let b = B[i];\n        sumA += a;\n        sumA2 += a ** 2;\n        sumB += b;\n        sumB2 += b ** 2;\n        sumAB += a * b;\n    }\n    return ((n * sumAB - sumA * sumB) /\n        (Math.sqrt(n * sumA2 - sumA ** 2) * Math.sqrt(n * sumB2 - sumB ** 2)));\n}\n//# sourceMappingURL=xCorrelation.js.map","import { xCheck } from './xCheck';\n/**\n * Returns a copy of the data as Float64\n *\n * @param array - array of numbers\n */\nexport function xEnsureFloat64(array) {\n    xCheck(array);\n    if (array instanceof Float64Array) {\n        return array.slice(0);\n    }\n    return Float64Array.from(array);\n}\n//# sourceMappingURL=xEnsureFloat64.js.map","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","/**\n * Check if the values are separated always by the same difference\n *\n * @param array - Monotone growing array of number\n */\nexport function xIsEquallySpaced(array, options = {}) {\n    if (array.length < 3)\n        return true;\n    const { tolerance = 0.05 } = options;\n    let maxDx = 0;\n    let minDx = Number.MAX_SAFE_INTEGER;\n    for (let i = 0; i < array.length - 1; ++i) {\n        let absoluteDifference = array[i + 1] - array[i];\n        if (absoluteDifference < minDx) {\n            minDx = absoluteDifference;\n        }\n        if (absoluteDifference > maxDx) {\n            maxDx = absoluteDifference;\n        }\n    }\n    return (maxDx - minDx) / maxDx < tolerance;\n}\n//# sourceMappingURL=xIsEquallySpaced.js.map","/**\n * Returns true if x is monotone\n *\n * @param array - array of numbers\n */\nexport function xIsMonotone(array) {\n    if (array.length <= 2) {\n        return true;\n    }\n    if (array[0] === array[1]) {\n        // maybe a constant series\n        for (let i = 1; i < array.length - 1; i++) {\n            if (array[i] !== array[i + 1])\n                return false;\n        }\n        return true;\n    }\n    if (array[0] < array[array.length - 1]) {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] >= array[i + 1])\n                return false;\n        }\n    }\n    else {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] <= array[i + 1])\n                return false;\n        }\n    }\n    return true;\n}\n//# sourceMappingURL=xIsMonotone.js.map","/**\n * Returns true if x is monotone\n *\n * @param array - array of numbers\n */\nexport function xIsMonotoneIncreasing(array) {\n    if (array.length < 2) {\n        return true;\n    }\n    for (let i = 0; i < array.length - 1; i++) {\n        if (array[i] >= array[i + 1])\n            return false;\n    }\n    return true;\n}\n//# sourceMappingURL=xIsMonotoneIncreasing.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the mean value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMean(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue / (toIndex - fromIndex + 1);\n}\n//# sourceMappingURL=xMean.js.map","import { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { xMedianAbsoluteDeviation } from '..';\n/**\n * Determine noise level using MAD https://en.wikipedia.org/wiki/Median_absolute_deviation\n * Constant to convert mad to sd calculated using https://www.wolframalpha.com/input?i=sqrt%282%29+inverse+erf%280.5%29\n * This assumes a gaussian distribution of the noise\n * @param array\n * @returns noise level corresponding to one standard deviation\n */\nexport function xNoiseStandardDeviation(array) {\n    const { mad, median } = xMedianAbsoluteDeviation(array);\n    return { sd: mad / 0.6744897501960817, mad, median };\n}\n//# sourceMappingURL=xNoiseStandardDeviation.js.map","import { xMedian } from './xMedian';\n/**\n * This function calculates the median absolute deviation (MAD)\n * https://en.wikipedia.org/wiki/Median_absolute_deviation\n * @param array\n */\nexport function xMedianAbsoluteDeviation(array) {\n    const median = xMedian(array);\n    const averageDeviations = new Float64Array(array.length);\n    for (let i = 0; i < array.length; i++) {\n        averageDeviations[i] = Math.abs(array[i] - median);\n    }\n    return {\n        median,\n        mad: xMedian(averageDeviations),\n    };\n}\n//# sourceMappingURL=xMedianAbsoluteDeviation.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Calculate the sum of the values\n *\n * @param array - Object that contains property x (an ordered increasing array) and y (an array).\n * @param options - Options.\n * @returns XSum value on the specified range.\n */\nexport function xSum(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue;\n}\n//# sourceMappingURL=xSum.js.map","import { getOutputArray } from './utils/getOutputArray';\nimport { xCheck } from './xCheck';\nimport { xMaxValue } from './xMaxValue';\nimport { xSum } from './xSum';\n/**\n * Divides the data with either the sum, the absolute sum or the maximum of the data\n * @param array - Array containing values\n * @param options - options\n * @returns - normalized data\n */\nexport function xNormed(input, options = {}) {\n    const { algorithm = 'absolute', value = 1 } = options;\n    xCheck(input);\n    const output = getOutputArray(options.output, input.length);\n    if (input.length === 0) {\n        throw new Error('input must not be empty');\n    }\n    switch (algorithm.toLowerCase()) {\n        case 'absolute': {\n            let absoluteSumValue = absoluteSum(input) / value;\n            if (absoluteSumValue === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] / absoluteSumValue;\n            }\n            return output;\n        }\n        case 'max': {\n            let currentMaxValue = xMaxValue(input);\n            if (currentMaxValue === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            const factor = value / currentMaxValue;\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] * factor;\n            }\n            return output;\n        }\n        case 'sum': {\n            let sumFactor = xSum(input) / value;\n            if (sumFactor === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] / sumFactor;\n            }\n            return output;\n        }\n        default:\n            throw new Error(`norm: unknown algorithm: ${algorithm}`);\n    }\n}\nfunction absoluteSum(input) {\n    let sumValue = 0;\n    for (let i = 0; i < input.length; i++) {\n        sumValue += Math.abs(input[i]);\n    }\n    return sumValue;\n}\n//# sourceMappingURL=xNormed.js.map","import { isAnyArray } from 'is-any-array';\nimport { xMean } from './xMean';\n/** Finds the variance of the data\n *\n * @param values - the values of the array\n * @param options - options\n * @returns variance\n */\nexport function xVariance(values, options = {}) {\n    if (!isAnyArray(values)) {\n        throw new TypeError('input must be an array');\n    }\n    const { unbiased = true, mean = xMean(values) } = options;\n    let sqrError = 0;\n    for (let i = 0; i < values.length; i++) {\n        let x = values[i] - mean;\n        sqrError += x * x;\n    }\n    if (unbiased) {\n        return sqrError / (values.length - 1);\n    }\n    else {\n        return sqrError / values.length;\n    }\n}\n//# sourceMappingURL=xVariance.js.map","import { xVariance } from './xVariance';\n/** Finds the standard deviation for the data at hand\n *\n * @param values - values in the data\n * @param options - options\n * @returns standard deviation\n */\nexport function xStandardDeviation(values, options = {}) {\n    return Math.sqrt(xVariance(values, options));\n}\n//# sourceMappingURL=xStandardDeviation.js.map","import { xCheck } from './xCheck';\nimport { xStandardDeviation } from './xStandardDeviation';\n/**\n * Pareto scaling, which uses the square root of standard deviation as the scaling factor, circumvents the amplification of noise by retaining a small portion of magnitude information.\n * Noda, I. (2008). Scaling techniques to enhance two-dimensional correlation spectra. Journal of Molecular Structure, 883, 216-227.\n * DOI: 10.1016/j.molstruc.2007.12.026\n *\n * @param array - array of number\n */\nexport function xParetoNormalization(array) {\n    xCheck(array);\n    let result = [];\n    const sqrtSD = Math.sqrt(xStandardDeviation(array));\n    for (let item of array) {\n        result.push(item / sqrtSD);\n    }\n    return result;\n}\n//# sourceMappingURL=xParetoNormalization.js.map","import { xCheck } from '..';\nimport { getOutputArray } from './utils/getOutputArray';\nimport { xMaxValue } from './xMaxValue';\nimport { xMinValue } from './xMinValue';\n/** Function used to rescale data\n *\n * @param input - input for the rescale\n * @param options - options\n * @returns rescaled data\n */\nexport function xRescale(input, options = {}) {\n    xCheck(input);\n    const output = getOutputArray(options.output, input.length);\n    const currentMin = xMinValue(input);\n    const currentMax = xMaxValue(input);\n    if (currentMin === currentMax) {\n        throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n    }\n    const { min = 0, max = 1 } = options;\n    if (min >= max) {\n        throw new RangeError('min option must be smaller than max option');\n    }\n    const factor = (max - min) / (currentMax - currentMin);\n    for (let i = 0; i < input.length; i++) {\n        output[i] = (input[i] - currentMin) * factor + min;\n    }\n    return output;\n}\n//# sourceMappingURL=xRescale.js.map","/**\n * Will apply a function on each element of the array described as a string\n * By default we will use as variable 'x'\n * In front of sequence of lowercase we will add 'Math.'. This allows to write\n * `sin(x) + cos(x)` and it will be replace internally by (x) => (Math.sin(x) + Math.cos(x))\n * @param array\n * @param options\n * @returns\n */\nexport function xApplyFunctionStr(array, options = {}) {\n    const { variableLabel = 'x', fctString = variableLabel } = options;\n    const fct = new Function(variableLabel, `return Number(${fctString\n        .replace(/(^|\\W)([a-z]{2,})/g, '$1Math.$2')\n        .replace(/Math\\.Math/g, 'Math')})`);\n    const toReturn = Float64Array.from(array);\n    for (let i = 0; i < array.length; i++) {\n        toReturn[i] = fct(array[i]);\n        if (isNaN(toReturn[i])) {\n            throw Error(`The callback ${fctString} does not return a number: ${array[i]}`);\n        }\n    }\n    return toReturn;\n}\n//# sourceMappingURL=xApplyFunctionStr.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function xSubtract the first array by the second array or a constant value from each element of the first array\n *\n * @param array1 - the array that will be rotated\n * @param array2 - second array or number\n * @returns array after subtraction\n */\nexport function xSubtract(array1, array2) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xSubtract: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = Number(array2);\n    }\n    let array3 = new Float64Array(array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] - constant;\n        }\n    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] - array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xSubtract.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Throw an error in no an object of x,y arrays\n *\n * @param data - array of points {x,y,z}\n */\nexport function xyCheck(data, options = {}) {\n    const { minLength } = options;\n    if (typeof data !== 'object' || !isAnyArray(data.x) || !isAnyArray(data.y)) {\n        throw new Error('Data must be an object of x and y arrays');\n    }\n    if (data.x.length !== data.y.length) {\n        throw new Error('The x and y arrays must have the same length');\n    }\n    if (minLength) {\n        if (data.x.length < minLength) {\n            throw new Error(`data.x must have a length of at least ${minLength}`);\n        }\n    }\n}\n//# sourceMappingURL=xyCheck.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the max y value in a range and return a {x,y} point\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options Options\n */\nexport function xyMaxYPoint(data, options = {}) {\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    if (x.length === 1) {\n        return { x: x[0], y: y[0], index: 0 };\n    }\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n    let current = { x: x[fromIndex], y: y[fromIndex], index: fromIndex };\n    for (let i = fromIndex; i <= toIndex; i++) {\n        if (y[i] > current.y)\n            current = { x: x[i], y: y[i], index: i };\n    }\n    return current;\n}\n//# sourceMappingURL=xyMaxYPoint.js.map","import { xIsMonotoneIncreasing } from '../x/xIsMonotoneIncreasing';\nimport { xyCheck } from './xyCheck';\n/**\n * Filters x,y values to allow strictly growing values in x axis.\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array).\n */\nexport function xyEnsureGrowingX(data) {\n    xyCheck(data);\n    if (xIsMonotoneIncreasing(data.x))\n        return data;\n    const x = Array.from(data.x);\n    const y = Array.from(data.y);\n    let prevX = Number.NEGATIVE_INFINITY;\n    let currentIndex = 0;\n    for (let index = 0; index < x.length; index++) {\n        if (prevX < x[index]) {\n            if (currentIndex < index) {\n                x[currentIndex] = x[index];\n                y[currentIndex] = y[index];\n            }\n            currentIndex++;\n            prevX = x[index];\n        }\n    }\n    x.length = currentIndex;\n    y.length = currentIndex;\n    return { x, y };\n}\n//# sourceMappingURL=xyEnsureGrowingX.js.map","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n * - deal with exclusions zones\n * - if no zones is specified add one between -Infinity and +Infinity\n * @param zones - array of zones\n * @param options - options\n * @returns array of zones\n */\nexport function zonesNormalize(zones = [], options = {}) {\n    let { from = Number.NEGATIVE_INFINITY, to = Number.POSITIVE_INFINITY, exclusions = [], } = options;\n    if (from > to)\n        [from, to] = [to, from];\n    zones = JSON.parse(JSON.stringify(zones)).map((zone) => zone.from > zone.to ? { from: zone.to, to: zone.from } : zone);\n    zones = zones.sort((a, b) => {\n        if (a.from !== b.from)\n            return a.from - b.from;\n        return a.to - b.to;\n    });\n    if (zones.length === 0) {\n        zones.push({ from, to });\n    }\n    zones.forEach((zone) => {\n        if (from > zone.from)\n            zone.from = from;\n        if (to < zone.to)\n            zone.to = to;\n    });\n    zones = zones.filter((zone) => zone.from <= zone.to);\n    if (zones.length === 0)\n        return [];\n    let currentZone = zones[0];\n    let beforeExclusionsZones = [currentZone];\n    for (let i = 1; i < zones.length; i++) {\n        let zone = zones[i];\n        if (zone.from <= currentZone.to) {\n            if (currentZone.to < zone.to) {\n                currentZone.to = zone.to;\n            }\n        }\n        else {\n            currentZone = zone;\n            beforeExclusionsZones.push(currentZone);\n        }\n    }\n    if (exclusions.length === 0)\n        return beforeExclusionsZones;\n    const normalizedExclusions = zonesNormalize(exclusions);\n    let currentExclusionIndex = 0;\n    const results = [];\n    let counter = 0;\n    for (let zoneIndex = 0; zoneIndex < beforeExclusionsZones.length; zoneIndex++) {\n        if (counter++ > 5)\n            break;\n        const zone = beforeExclusionsZones[zoneIndex];\n        if (currentExclusionIndex === normalizedExclusions.length) {\n            // we analysed all the exclusion zones\n            results.push(zone);\n            continue;\n        }\n        while (currentExclusionIndex < normalizedExclusions.length &&\n            normalizedExclusions[currentExclusionIndex].to <= zone.from) {\n            currentExclusionIndex++;\n        }\n        if (currentExclusionIndex === normalizedExclusions.length) {\n            // we analysed all the exclusion zones\n            results.push(zone);\n            continue;\n        }\n        if (zone.to < normalizedExclusions[currentExclusionIndex].from) {\n            // no problems, not yet in exclusion\n            results.push(zone);\n            continue;\n        }\n        if (normalizedExclusions[currentExclusionIndex].to >= zone.to) {\n            // could be totally excluded\n            if (normalizedExclusions[currentExclusionIndex].from <= zone.from) {\n                continue;\n            }\n            results.push({\n                from: normalizedExclusions[currentExclusionIndex].to,\n                to: zone.to,\n            });\n        }\n        // we cut in the middle, we need to create more zones, annoying !\n        if (normalizedExclusions[currentExclusionIndex].from > zone.from) {\n            results.push({\n                from: zone.from,\n                to: normalizedExclusions[currentExclusionIndex].from,\n            });\n        }\n        zone.from = normalizedExclusions[currentExclusionIndex].to;\n        zoneIndex--;\n    }\n    return results;\n}\n//# sourceMappingURL=zonesNormalize.js.map","import { zonesNormalize } from './zonesNormalize';\n/**\n * Add the number of points per zone to reach a specified total\n *\n * @param zones - array of zones\n * @param numberOfPoints - total number of points to distribute between zones\n * @param options - options\n * @returns array of zones with points\n */\nexport function zonesWithPoints(zones = [], \n/**\n * total number of points to distribute between zones\n * @default 10\n */\nnumberOfPoints = 10, options = {}) {\n    if (zones.length === 0)\n        return zones;\n    let returnZones = zonesNormalize(zones, options);\n    const totalSize = returnZones.reduce((previous, current) => {\n        return previous + (current.to - current.from);\n    }, 0);\n    let unitsPerPoint = totalSize / numberOfPoints;\n    let currentTotal = 0;\n    for (let i = 0; i < returnZones.length - 1; i++) {\n        let zone = returnZones[i];\n        zone.numberOfPoints = Math.min(Math.round((zone.to - zone.from) / unitsPerPoint), numberOfPoints - currentTotal);\n        currentTotal += zone.numberOfPoints;\n    }\n    let zone = returnZones[returnZones.length - 1];\n    zone.numberOfPoints = numberOfPoints - currentTotal;\n    return returnZones;\n}\n//# sourceMappingURL=zonesWithPoints.js.map","/**\n * Function that calculates the integral of the line between two\n * x-coordinates, given the slope and intercept of the line.\n * @param x0\n * @param x1\n * @param slope\n * @param intercept\n * @return integral value.\n */\nexport default function integral(\n/** first coordinate of point */\nx0, \n/** second coordinate of point */\nx1, \n/** slope of the line */\nslope, \n/** intercept of the line on the y axis */\nintercept) {\n    return (0.5 * slope * x1 * x1 +\n        intercept * x1 -\n        (0.5 * slope * x0 * x0 + intercept * x0));\n}\n//# sourceMappingURL=integral.js.map","import { createFromToArray } from '../utils/createFromToArray';\nimport { zonesNormalize } from '../zones/zonesNormalize';\nimport { zonesWithPoints } from '../zones/zonesWithPoints';\nimport equallySpacedSlot from './utils/equallySpacedSlot';\nimport equallySpacedSmooth from './utils/equallySpacedSmooth';\nimport { xyCheck } from './xyCheck';\n/**\n * Function that returns a Number array of equally spaced numberOfPoints\n * containing a representation of intensities of the spectra arguments x\n * and y.\n *\n * The options parameter contains an object in the following form:\n * from: starting point\n * to: last point\n * numberOfPoints: number of points between from and to\n * variant: \"slot\" or \"smooth\" - smooth is the default option\n *\n * The slot variant consist that each point in an array is calculated\n * averaging the existing points between the slot that belongs to the current\n * value. The smooth variant is the same but takes the integral of the range\n * of the slot and divide by the step size between two points in an array.\n *\n * If exclusions zone are present, zones are ignored !\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return new object with x / y array with the equally spaced data.\n */\nexport function xyEquallySpaced(data, options = {}) {\n    let { x, y } = data;\n    let xLength = x.length;\n    const { from = x[0], to = x[xLength - 1], variant = 'smooth', numberOfPoints = 100, exclusions = [], zones = [{ from, to }], } = options;\n    if (from > to) {\n        throw new RangeError('from should be larger than to');\n    }\n    xyCheck(data);\n    if (numberOfPoints < 2) {\n        throw new RangeError(\"'numberOfPoints' option must be greater than 1\");\n    }\n    const normalizedZones = zonesNormalize(zones, { from, to, exclusions });\n    const zonesWithPointsRes = zonesWithPoints(normalizedZones, numberOfPoints, {\n        from,\n        to,\n    });\n    let xResult = [];\n    let yResult = [];\n    for (let zone of zonesWithPointsRes) {\n        if (!zone.numberOfPoints) {\n            zone.numberOfPoints = 0;\n        }\n        let zoneResult = processZone(Array.from(x), Array.from(y), zone.from, zone.to, zone.numberOfPoints, variant);\n        xResult = xResult.concat(zoneResult.x);\n        yResult = yResult.concat(zoneResult.y);\n    }\n    return { x: xResult, y: yResult };\n}\nfunction processZone(x, y, from, to, numberOfPoints, variant) {\n    if (numberOfPoints < 1) {\n        throw new RangeError('the number of points must be at least 1');\n    }\n    let output = variant === 'slot'\n        ? Array.from(equallySpacedSlot(x, y, from, to, numberOfPoints))\n        : Array.from(equallySpacedSmooth(x, y, from, to, numberOfPoints));\n    return {\n        x: Array.from(createFromToArray({\n            from,\n            to,\n            length: numberOfPoints,\n        })),\n        y: output,\n    };\n}\n//# sourceMappingURL=xyEquallySpaced.js.map","/**\n * function that retrieves the getEquallySpacedData with the variant \"slot\"\n *\n * @param x\n * @param y\n * @param from\n * @param to\n * @param numberOfPoints\n * @return Array of y's equally spaced with the variant \"slot\"\n */\nexport default function equallySpacedSlot(\n/** x coordinates */\nx, \n/** y coordinates */\ny, \n/** from value */\nfrom, \n/** to value */\nto, \n/** number of points */\nnumberOfPoints) {\n    let xLength = x.length;\n    let step = (to - from) / (numberOfPoints > 1 ? numberOfPoints - 1 : 1);\n    let halfStep = step / 2;\n    let lastStep = x[x.length - 1] - x[x.length - 2];\n    let start = from - halfStep;\n    // Changed Array to Float64Array\n    let output = new Float64Array(numberOfPoints);\n    // Init main variables\n    let min = start;\n    let max = start + step;\n    let previousX = -Number.MAX_VALUE;\n    let previousY = 0;\n    let nextX = x[0];\n    let nextY = y[0];\n    let frontOutsideSpectra = 0;\n    let backOutsideSpectra = true;\n    let currentValue = 0;\n    // for slot algorithm\n    let currentPoints = 0;\n    let i = 1; // index of input\n    let j = 0; // index of output\n    main: while (true) {\n        if (previousX >= nextX)\n            throw new Error('x must be a growing series');\n        while (previousX - max > 0) {\n            // no overlap with original point, just consume current value\n            if (backOutsideSpectra) {\n                currentPoints++;\n                backOutsideSpectra = false;\n            }\n            output[j] = currentPoints <= 0 ? 0 : currentValue / currentPoints;\n            j++;\n            if (j === numberOfPoints) {\n                break main;\n            }\n            min = max;\n            max += step;\n            currentValue = 0;\n            currentPoints = 0;\n        }\n        if (previousX > min) {\n            currentValue += previousY;\n            currentPoints++;\n        }\n        if (previousX === -Number.MAX_VALUE || frontOutsideSpectra > 1) {\n            currentPoints--;\n        }\n        previousX = nextX;\n        previousY = nextY;\n        if (i < xLength) {\n            nextX = x[i];\n            nextY = y[i];\n            i++;\n        }\n        else {\n            nextX += lastStep;\n            nextY = 0;\n            frontOutsideSpectra++;\n        }\n    }\n    return output;\n}\n//# sourceMappingURL=equallySpacedSlot.js.map","import integral from './integral';\n/**\n * function that retrieves the getEquallySpacedData with the variant \"smooth\"\n *\n * @param x\n * @param y\n * @param from\n * @param to\n * @param numberOfPoints\n * @return - Array of y's equally spaced with the variant \"smooth\"\n */\nexport default function equallySpacedSmooth(\n/** x coordinates */\nx, \n/** y coordinates */\ny, \n/** from value */\nfrom, \n/** to value */\nto, \n/** number of points */\nnumberOfPoints) {\n    let xLength = x.length;\n    let step = (to - from) / (numberOfPoints > 1 ? numberOfPoints - 1 : 1);\n    let halfStep = step / 2;\n    // Changed Array to Float64Array\n    let output = new Float64Array(numberOfPoints);\n    let initialOriginalStep = x[1] - x[0];\n    let lastOriginalStep = x[xLength - 1] - x[xLength - 2];\n    // Init main variables\n    let min = from - halfStep;\n    let max = from + halfStep;\n    let previousX = Number.MIN_SAFE_INTEGER;\n    let previousY = 0;\n    let nextX = x[0] - initialOriginalStep;\n    let nextY = 0;\n    let currentValue = 0;\n    let slope = 0;\n    let intercept = 0;\n    let sumAtMin = 0;\n    let sumAtMax = 0;\n    let i = 0; // index of input\n    let j = 0; // index of output\n    function getSlope(x0, y0, x1, y1) {\n        return (y1 - y0) / (x1 - x0);\n    }\n    let add = 0;\n    main: while (true) {\n        if (previousX >= nextX)\n            throw new Error('x must be a growing series');\n        if (previousX <= min && min <= nextX) {\n            add = integral(0, min - previousX, slope, previousY);\n            sumAtMin = currentValue + add;\n        }\n        while (nextX - max >= 0) {\n            // no overlap with original point, just consume current value\n            add = integral(0, max - previousX, slope, previousY);\n            sumAtMax = currentValue + add;\n            output[j++] = (sumAtMax - sumAtMin) / step;\n            if (j === numberOfPoints) {\n                break main;\n            }\n            min = max;\n            max += step;\n            sumAtMin = sumAtMax;\n        }\n        currentValue += integral(previousX, nextX, slope, intercept);\n        previousX = nextX;\n        previousY = nextY;\n        if (i < xLength) {\n            nextX = x[i];\n            nextY = y[i];\n            i++;\n        }\n        else if (i === xLength) {\n            nextX += lastOriginalStep;\n            nextY = 0;\n        }\n        slope = getSlope(previousX, previousY, nextX, nextY);\n        intercept = -slope * previousX + previousY;\n    }\n    return output;\n}\n//# sourceMappingURL=equallySpacedSmooth.js.map","import { zonesNormalize } from '../zones/zonesNormalize';\n/** Filter an array x/y based on various criteria x points are expected to be sorted\n *\n * @param data - points\n * @param options - options\n * @return filtered array\n */\nexport function xyFilterX(data, options = {}) {\n    const { x, y } = data;\n    const { from = x[0], to = x[x.length - 1], zones = [{ from, to }], exclusions = [], } = options;\n    let normalizedZones = zonesNormalize(zones, { from, to, exclusions });\n    let currentZoneIndex = 0;\n    let newX = [];\n    let newY = [];\n    let position = 0;\n    while (position < x.length) {\n        if (x[position] <= normalizedZones[currentZoneIndex].to &&\n            x[position] >= normalizedZones[currentZoneIndex].from) {\n            newX.push(x[position]);\n            newY.push(y[position]);\n        }\n        else {\n            if (x[position] > normalizedZones[currentZoneIndex].to) {\n                currentZoneIndex++;\n                if (!normalizedZones[currentZoneIndex])\n                    break;\n            }\n        }\n        position++;\n    }\n    return {\n        x: newX,\n        y: newY,\n    };\n}\n//# sourceMappingURL=xyFilterX.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Calculate integration\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - xyIntegration value on the specified range\n */\nexport function xyIntegration(data, options = {}) {\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    if (x.length === 1)\n        return 0;\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n    let currentxyIntegration = 0;\n    for (let i = fromIndex; i < toIndex; i++) {\n        currentxyIntegration += ((x[i + 1] - x[i]) * (y[i + 1] + y[i])) / 2;\n    }\n    return currentxyIntegration;\n}\n//# sourceMappingURL=xyIntegration.js.map","import { xGetFromToIndex } from '../x/xGetFromToIndex';\nimport { xyCheck } from './xyCheck';\n/**\n * Finds the min y value in a range and return a {x,y} point\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n */\nexport function xyMinYPoint(data, options = {}) {\n    xyCheck(data, { minLength: 1 });\n    const { x, y } = data;\n    if (x.length === 1)\n        return { x: x[0], y: y[0], index: 0 };\n    const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n    let current = { x: x[fromIndex], y: y[fromIndex], index: fromIndex };\n    for (let i = fromIndex; i <= toIndex; i++) {\n        if (y[i] < current.y)\n            current = { x: x[i], y: y[i], index: i };\n    }\n    return current;\n}\n//# sourceMappingURL=xyMinYPoint.js.map","/**\n * Center mean of columns\n *\n * @param matrix - matrix [rows][cols]\n */\nexport function matrixCenterZMean(matrix) {\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    const newMatrix = new Array(nbRows);\n    for (let row = 0; row < nbRows; row++) {\n        newMatrix[row] = new Float64Array(nbColumns);\n    }\n    for (let column = 0; column < nbColumns; column++) {\n        let mean = 0;\n        for (let row = 0; row < nbRows; row++) {\n            mean += matrix[row][column];\n        }\n        mean /= nbRows;\n        for (let row = 0; row < nbRows; row++) {\n            newMatrix[row][column] = matrix[row][column] - mean;\n        }\n    }\n    return newMatrix;\n}\n//# sourceMappingURL=matrixCenterZMean.js.map","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class BaseView extends AbstractMatrix {\n  constructor(matrix, rows, columns) {\n    super();\n    this.matrix = matrix;\n    this.rows = rows;\n    this.columns = columns;\n  }\n}\n","import BaseView from './base';\n\nexport default class MatrixTransposeView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.columns, matrix.rows);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(columnIndex, rowIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(columnIndex, rowIndex);\n  }\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n","export function hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let iter = 0;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          iter = iter + 1;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          iter = 0;\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n","import { Matrix } from 'ml-matrix';\nimport { xMedian } from '../x/xMedian';\n/**\n * Performs a Probabilistic quotient normalization (PQN) over the dataset to account dilution based in median spectrum.\n * Dieterle, F., Ross, A., Schlotterbeck, G., & Senn, H. (2006). Probabilistic quotient normalization as robust method to account for dilution of complex biological mixtures. Application in 1H NMR metabonomics. Analytical chemistry, 78(13), 4281-4290.\n * DOI: 10.1021/ac051632c\n *\n * @param matrix - matrix [rows][cols].\n * @param options - options\n * @returns - {data: Normalized dataset, medianOfQuotients: The median of quotients of each variables}\n */\nexport function matrixPQN(matrix, options = {}) {\n    const { max = 100 } = options;\n    let matrixB = new Matrix(matrix);\n    for (let i = 0; i < matrixB.rows; i++) {\n        const normalizationFactor = matrixB.getRowVector(i).norm('frobenius') / max;\n        const row = matrixB.getRowVector(i).div(normalizationFactor);\n        matrixB.setRow(i, row);\n    }\n    let referenceSpectrum = [];\n    for (let i = 0; i < matrixB.columns; i++) {\n        const currentVariable = matrixB.getColumn(i);\n        referenceSpectrum.push(xMedian(currentVariable));\n    }\n    let medianOfQuotients = [];\n    for (let i = 0; i < matrixB.columns; i++) {\n        let quotients = matrixB.getColumnVector(i).div(referenceSpectrum[i]);\n        medianOfQuotients.push(xMedian(quotients.getColumn(0)));\n    }\n    for (let i = 0; i < matrixB.rows; i++) {\n        matrixB.mulRow(i, 1 / medianOfQuotients[i]);\n    }\n    return {\n        data: matrixB.to2DArray(),\n        medianOfQuotients: medianOfQuotients,\n    };\n}\n//# sourceMappingURL=matrixPQN.js.map","/**\n * Rescale columns\n *\n * @param matrix - matrix [rows][cols].\n * @param options - Options\n */\nexport function matrixZRescale(matrix, options = {}) {\n    const { min = 0, max = 1 } = options;\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    const newMatrix = new Array(nbRows);\n    for (let row = 0; row < nbRows; row++) {\n        newMatrix[row] = new Float64Array(nbColumns);\n    }\n    for (let column = 0; column < nbColumns; column++) {\n        let currentMin = matrix[0][column];\n        let currentMax = matrix[0][column];\n        for (let row = 1; row < nbRows; row++) {\n            if (matrix[row][column] < currentMin)\n                currentMin = matrix[row][column];\n            if (matrix[row][column] > currentMax)\n                currentMax = matrix[row][column];\n        }\n        const factor = (max - min) / (currentMax - currentMin);\n        for (let row = 0; row < nbRows; row++) {\n            newMatrix[row][column] =\n                (matrix[row][column] - currentMin) * factor + min;\n        }\n    }\n    return newMatrix;\n}\n//# sourceMappingURL=matrixZRescale.js.map","/**\n * chroma.js - JavaScript library for color conversions\n *\n * Copyright (c) 2011-2019, Gregor Aisch\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. The name Gregor Aisch may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * -------------------------------------------------------\n *\n * chroma.js includes colors from colorbrewer2.org, which are released under\n * the following license:\n *\n * Copyright (c) 2002 Cynthia Brewer, Mark Harrower,\n * and The Pennsylvania State University.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n * either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * ------------------------------------------------------\n *\n * Named colors are taken from X11 Color Names.\n * http://www.w3.org/TR/css3-color/#svg-color\n *\n * @preserve\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.chroma = factory());\n})(this, (function () { 'use strict';\n\n    var limit$2 = function (x, min, max) {\n        if ( min === void 0 ) min=0;\n        if ( max === void 0 ) max=1;\n\n        return x < min ? min : x > max ? max : x;\n    };\n\n    var limit$1 = limit$2;\n\n    var clip_rgb$3 = function (rgb) {\n        rgb._clipped = false;\n        rgb._unclipped = rgb.slice(0);\n        for (var i=0; i<=3; i++) {\n            if (i < 3) {\n                if (rgb[i] < 0 || rgb[i] > 255) { rgb._clipped = true; }\n                rgb[i] = limit$1(rgb[i], 0, 255);\n            } else if (i === 3) {\n                rgb[i] = limit$1(rgb[i], 0, 1);\n            }\n        }\n        return rgb;\n    };\n\n    // ported from jQuery's $.type\n    var classToType = {};\n    for (var i$1 = 0, list$1 = ['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Undefined', 'Null']; i$1 < list$1.length; i$1 += 1) {\n        var name = list$1[i$1];\n\n        classToType[(\"[object \" + name + \"]\")] = name.toLowerCase();\n    }\n    var type$p = function(obj) {\n        return classToType[Object.prototype.toString.call(obj)] || \"object\";\n    };\n\n    var type$o = type$p;\n\n    var unpack$B = function (args, keyOrder) {\n        if ( keyOrder === void 0 ) keyOrder=null;\n\n    \t// if called with more than 3 arguments, we return the arguments\n        if (args.length >= 3) { return Array.prototype.slice.call(args); }\n        // with less than 3 args we check if first arg is object\n        // and use the keyOrder string to extract and sort properties\n    \tif (type$o(args[0]) == 'object' && keyOrder) {\n    \t\treturn keyOrder.split('')\n    \t\t\t.filter(function (k) { return args[0][k] !== undefined; })\n    \t\t\t.map(function (k) { return args[0][k]; });\n    \t}\n    \t// otherwise we just return the first argument\n    \t// (which we suppose is an array of args)\n        return args[0];\n    };\n\n    var type$n = type$p;\n\n    var last$4 = function (args) {\n        if (args.length < 2) { return null; }\n        var l = args.length-1;\n        if (type$n(args[l]) == 'string') { return args[l].toLowerCase(); }\n        return null;\n    };\n\n    var PI$2 = Math.PI;\n\n    var utils = {\n    \tclip_rgb: clip_rgb$3,\n    \tlimit: limit$2,\n    \ttype: type$p,\n    \tunpack: unpack$B,\n    \tlast: last$4,\n    \tPI: PI$2,\n    \tTWOPI: PI$2*2,\n    \tPITHIRD: PI$2/3,\n    \tDEG2RAD: PI$2 / 180,\n    \tRAD2DEG: 180 / PI$2\n    };\n\n    var input$h = {\n    \tformat: {},\n    \tautodetect: []\n    };\n\n    var last$3 = utils.last;\n    var clip_rgb$2 = utils.clip_rgb;\n    var type$m = utils.type;\n    var _input = input$h;\n\n    var Color$D = function Color() {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var me = this;\n        if (type$m(args[0]) === 'object' &&\n            args[0].constructor &&\n            args[0].constructor === this.constructor) {\n            // the argument is already a Color instance\n            return args[0];\n        }\n\n        // last argument could be the mode\n        var mode = last$3(args);\n        var autodetect = false;\n\n        if (!mode) {\n            autodetect = true;\n            if (!_input.sorted) {\n                _input.autodetect = _input.autodetect.sort(function (a,b) { return b.p - a.p; });\n                _input.sorted = true;\n            }\n            // auto-detect format\n            for (var i = 0, list = _input.autodetect; i < list.length; i += 1) {\n                var chk = list[i];\n\n                mode = chk.test.apply(chk, args);\n                if (mode) { break; }\n            }\n        }\n\n        if (_input.format[mode]) {\n            var rgb = _input.format[mode].apply(null, autodetect ? args : args.slice(0,-1));\n            me._rgb = clip_rgb$2(rgb);\n        } else {\n            throw new Error('unknown format: '+args);\n        }\n\n        // add alpha channel\n        if (me._rgb.length === 3) { me._rgb.push(1); }\n    };\n\n    Color$D.prototype.toString = function toString () {\n        if (type$m(this.hex) == 'function') { return this.hex(); }\n        return (\"[\" + (this._rgb.join(',')) + \"]\");\n    };\n\n    var Color_1 = Color$D;\n\n    var chroma$k = function () {\n    \tvar args = [], len = arguments.length;\n    \twhile ( len-- ) args[ len ] = arguments[ len ];\n\n    \treturn new (Function.prototype.bind.apply( chroma$k.Color, [ null ].concat( args) ));\n    };\n\n    chroma$k.Color = Color_1;\n    chroma$k.version = '2.4.2';\n\n    var chroma_1 = chroma$k;\n\n    var unpack$A = utils.unpack;\n    var max$2 = Math.max;\n\n    var rgb2cmyk$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$A(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        r = r / 255;\n        g = g / 255;\n        b = b / 255;\n        var k = 1 - max$2(r,max$2(g,b));\n        var f = k < 1 ? 1 / (1-k) : 0;\n        var c = (1-r-k) * f;\n        var m = (1-g-k) * f;\n        var y = (1-b-k) * f;\n        return [c,m,y,k];\n    };\n\n    var rgb2cmyk_1 = rgb2cmyk$1;\n\n    var unpack$z = utils.unpack;\n\n    var cmyk2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$z(args, 'cmyk');\n        var c = args[0];\n        var m = args[1];\n        var y = args[2];\n        var k = args[3];\n        var alpha = args.length > 4 ? args[4] : 1;\n        if (k === 1) { return [0,0,0,alpha]; }\n        return [\n            c >= 1 ? 0 : 255 * (1-c) * (1-k), // r\n            m >= 1 ? 0 : 255 * (1-m) * (1-k), // g\n            y >= 1 ? 0 : 255 * (1-y) * (1-k), // b\n            alpha\n        ];\n    };\n\n    var cmyk2rgb_1 = cmyk2rgb;\n\n    var chroma$j = chroma_1;\n    var Color$C = Color_1;\n    var input$g = input$h;\n    var unpack$y = utils.unpack;\n    var type$l = utils.type;\n\n    var rgb2cmyk = rgb2cmyk_1;\n\n    Color$C.prototype.cmyk = function() {\n        return rgb2cmyk(this._rgb);\n    };\n\n    chroma$j.cmyk = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$C, [ null ].concat( args, ['cmyk']) ));\n    };\n\n    input$g.format.cmyk = cmyk2rgb_1;\n\n    input$g.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$y(args, 'cmyk');\n            if (type$l(args) === 'array' && args.length === 4) {\n                return 'cmyk';\n            }\n        }\n    });\n\n    var unpack$x = utils.unpack;\n    var last$2 = utils.last;\n    var rnd = function (a) { return Math.round(a*100)/100; };\n\n    /*\n     * supported arguments:\n     * - hsl2css(h,s,l)\n     * - hsl2css(h,s,l,a)\n     * - hsl2css([h,s,l], mode)\n     * - hsl2css([h,s,l,a], mode)\n     * - hsl2css({h,s,l,a}, mode)\n     */\n    var hsl2css$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var hsla = unpack$x(args, 'hsla');\n        var mode = last$2(args) || 'lsa';\n        hsla[0] = rnd(hsla[0] || 0);\n        hsla[1] = rnd(hsla[1]*100) + '%';\n        hsla[2] = rnd(hsla[2]*100) + '%';\n        if (mode === 'hsla' || (hsla.length > 3 && hsla[3]<1)) {\n            hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n            mode = 'hsla';\n        } else {\n            hsla.length = 3;\n        }\n        return (mode + \"(\" + (hsla.join(',')) + \")\");\n    };\n\n    var hsl2css_1 = hsl2css$1;\n\n    var unpack$w = utils.unpack;\n\n    /*\n     * supported arguments:\n     * - rgb2hsl(r,g,b)\n     * - rgb2hsl(r,g,b,a)\n     * - rgb2hsl([r,g,b])\n     * - rgb2hsl([r,g,b,a])\n     * - rgb2hsl({r,g,b,a})\n     */\n    var rgb2hsl$3 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$w(args, 'rgba');\n        var r = args[0];\n        var g = args[1];\n        var b = args[2];\n\n        r /= 255;\n        g /= 255;\n        b /= 255;\n\n        var min = Math.min(r, g, b);\n        var max = Math.max(r, g, b);\n\n        var l = (max + min) / 2;\n        var s, h;\n\n        if (max === min){\n            s = 0;\n            h = Number.NaN;\n        } else {\n            s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n        }\n\n        if (r == max) { h = (g - b) / (max - min); }\n        else if (g == max) { h = 2 + (b - r) / (max - min); }\n        else if (b == max) { h = 4 + (r - g) / (max - min); }\n\n        h *= 60;\n        if (h < 0) { h += 360; }\n        if (args.length>3 && args[3]!==undefined) { return [h,s,l,args[3]]; }\n        return [h,s,l];\n    };\n\n    var rgb2hsl_1 = rgb2hsl$3;\n\n    var unpack$v = utils.unpack;\n    var last$1 = utils.last;\n    var hsl2css = hsl2css_1;\n    var rgb2hsl$2 = rgb2hsl_1;\n    var round$6 = Math.round;\n\n    /*\n     * supported arguments:\n     * - rgb2css(r,g,b)\n     * - rgb2css(r,g,b,a)\n     * - rgb2css([r,g,b], mode)\n     * - rgb2css([r,g,b,a], mode)\n     * - rgb2css({r,g,b,a}, mode)\n     */\n    var rgb2css$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgba = unpack$v(args, 'rgba');\n        var mode = last$1(args) || 'rgb';\n        if (mode.substr(0,3) == 'hsl') {\n            return hsl2css(rgb2hsl$2(rgba), mode);\n        }\n        rgba[0] = round$6(rgba[0]);\n        rgba[1] = round$6(rgba[1]);\n        rgba[2] = round$6(rgba[2]);\n        if (mode === 'rgba' || (rgba.length > 3 && rgba[3]<1)) {\n            rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n            mode = 'rgba';\n        }\n        return (mode + \"(\" + (rgba.slice(0,mode==='rgb'?3:4).join(',')) + \")\");\n    };\n\n    var rgb2css_1 = rgb2css$1;\n\n    var unpack$u = utils.unpack;\n    var round$5 = Math.round;\n\n    var hsl2rgb$1 = function () {\n        var assign;\n\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n        args = unpack$u(args, 'hsl');\n        var h = args[0];\n        var s = args[1];\n        var l = args[2];\n        var r,g,b;\n        if (s === 0) {\n            r = g = b = l*255;\n        } else {\n            var t3 = [0,0,0];\n            var c = [0,0,0];\n            var t2 = l < 0.5 ? l * (1+s) : l+s-l*s;\n            var t1 = 2 * l - t2;\n            var h_ = h / 360;\n            t3[0] = h_ + 1/3;\n            t3[1] = h_;\n            t3[2] = h_ - 1/3;\n            for (var i=0; i<3; i++) {\n                if (t3[i] < 0) { t3[i] += 1; }\n                if (t3[i] > 1) { t3[i] -= 1; }\n                if (6 * t3[i] < 1)\n                    { c[i] = t1 + (t2 - t1) * 6 * t3[i]; }\n                else if (2 * t3[i] < 1)\n                    { c[i] = t2; }\n                else if (3 * t3[i] < 2)\n                    { c[i] = t1 + (t2 - t1) * ((2 / 3) - t3[i]) * 6; }\n                else\n                    { c[i] = t1; }\n            }\n            (assign = [round$5(c[0]*255),round$5(c[1]*255),round$5(c[2]*255)], r = assign[0], g = assign[1], b = assign[2]);\n        }\n        if (args.length > 3) {\n            // keep alpha channel\n            return [r,g,b,args[3]];\n        }\n        return [r,g,b,1];\n    };\n\n    var hsl2rgb_1 = hsl2rgb$1;\n\n    var hsl2rgb = hsl2rgb_1;\n    var input$f = input$h;\n\n    var RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\n    var RE_RGBA = /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n    var RE_RGB_PCT = /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n    var RE_RGBA_PCT = /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n    var RE_HSL = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n    var RE_HSLA = /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\n    var round$4 = Math.round;\n\n    var css2rgb$1 = function (css) {\n        css = css.toLowerCase().trim();\n        var m;\n\n        if (input$f.format.named) {\n            try {\n                return input$f.format.named(css);\n            } catch (e) {\n                // eslint-disable-next-line\n            }\n        }\n\n        // rgb(250,20,0)\n        if ((m = css.match(RE_RGB))) {\n            var rgb = m.slice(1,4);\n            for (var i=0; i<3; i++) {\n                rgb[i] = +rgb[i];\n            }\n            rgb[3] = 1;  // default alpha\n            return rgb;\n        }\n\n        // rgba(250,20,0,0.4)\n        if ((m = css.match(RE_RGBA))) {\n            var rgb$1 = m.slice(1,5);\n            for (var i$1=0; i$1<4; i$1++) {\n                rgb$1[i$1] = +rgb$1[i$1];\n            }\n            return rgb$1;\n        }\n\n        // rgb(100%,0%,0%)\n        if ((m = css.match(RE_RGB_PCT))) {\n            var rgb$2 = m.slice(1,4);\n            for (var i$2=0; i$2<3; i$2++) {\n                rgb$2[i$2] = round$4(rgb$2[i$2] * 2.55);\n            }\n            rgb$2[3] = 1;  // default alpha\n            return rgb$2;\n        }\n\n        // rgba(100%,0%,0%,0.4)\n        if ((m = css.match(RE_RGBA_PCT))) {\n            var rgb$3 = m.slice(1,5);\n            for (var i$3=0; i$3<3; i$3++) {\n                rgb$3[i$3] = round$4(rgb$3[i$3] * 2.55);\n            }\n            rgb$3[3] = +rgb$3[3];\n            return rgb$3;\n        }\n\n        // hsl(0,100%,50%)\n        if ((m = css.match(RE_HSL))) {\n            var hsl = m.slice(1,4);\n            hsl[1] *= 0.01;\n            hsl[2] *= 0.01;\n            var rgb$4 = hsl2rgb(hsl);\n            rgb$4[3] = 1;\n            return rgb$4;\n        }\n\n        // hsla(0,100%,50%,0.5)\n        if ((m = css.match(RE_HSLA))) {\n            var hsl$1 = m.slice(1,4);\n            hsl$1[1] *= 0.01;\n            hsl$1[2] *= 0.01;\n            var rgb$5 = hsl2rgb(hsl$1);\n            rgb$5[3] = +m[4];  // default alpha = 1\n            return rgb$5;\n        }\n    };\n\n    css2rgb$1.test = function (s) {\n        return RE_RGB.test(s) ||\n            RE_RGBA.test(s) ||\n            RE_RGB_PCT.test(s) ||\n            RE_RGBA_PCT.test(s) ||\n            RE_HSL.test(s) ||\n            RE_HSLA.test(s);\n    };\n\n    var css2rgb_1 = css2rgb$1;\n\n    var chroma$i = chroma_1;\n    var Color$B = Color_1;\n    var input$e = input$h;\n    var type$k = utils.type;\n\n    var rgb2css = rgb2css_1;\n    var css2rgb = css2rgb_1;\n\n    Color$B.prototype.css = function(mode) {\n        return rgb2css(this._rgb, mode);\n    };\n\n    chroma$i.css = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$B, [ null ].concat( args, ['css']) ));\n    };\n\n    input$e.format.css = css2rgb;\n\n    input$e.autodetect.push({\n        p: 5,\n        test: function (h) {\n            var rest = [], len = arguments.length - 1;\n            while ( len-- > 0 ) rest[ len ] = arguments[ len + 1 ];\n\n            if (!rest.length && type$k(h) === 'string' && css2rgb.test(h)) {\n                return 'css';\n            }\n        }\n    });\n\n    var Color$A = Color_1;\n    var chroma$h = chroma_1;\n    var input$d = input$h;\n    var unpack$t = utils.unpack;\n\n    input$d.format.gl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgb = unpack$t(args, 'rgba');\n        rgb[0] *= 255;\n        rgb[1] *= 255;\n        rgb[2] *= 255;\n        return rgb;\n    };\n\n    chroma$h.gl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$A, [ null ].concat( args, ['gl']) ));\n    };\n\n    Color$A.prototype.gl = function() {\n        var rgb = this._rgb;\n        return [rgb[0]/255, rgb[1]/255, rgb[2]/255, rgb[3]];\n    };\n\n    var unpack$s = utils.unpack;\n\n    var rgb2hcg$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$s(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var min = Math.min(r, g, b);\n        var max = Math.max(r, g, b);\n        var delta = max - min;\n        var c = delta * 100 / 255;\n        var _g = min / (255 - delta) * 100;\n        var h;\n        if (delta === 0) {\n            h = Number.NaN;\n        } else {\n            if (r === max) { h = (g - b) / delta; }\n            if (g === max) { h = 2+(b - r) / delta; }\n            if (b === max) { h = 4+(r - g) / delta; }\n            h *= 60;\n            if (h < 0) { h += 360; }\n        }\n        return [h, c, _g];\n    };\n\n    var rgb2hcg_1 = rgb2hcg$1;\n\n    var unpack$r = utils.unpack;\n    var floor$3 = Math.floor;\n\n    /*\n     * this is basically just HSV with some minor tweaks\n     *\n     * hue.. [0..360]\n     * chroma .. [0..1]\n     * grayness .. [0..1]\n     */\n\n    var hcg2rgb = function () {\n        var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n        args = unpack$r(args, 'hcg');\n        var h = args[0];\n        var c = args[1];\n        var _g = args[2];\n        var r,g,b;\n        _g = _g * 255;\n        var _c = c * 255;\n        if (c === 0) {\n            r = g = b = _g;\n        } else {\n            if (h === 360) { h = 0; }\n            if (h > 360) { h -= 360; }\n            if (h < 0) { h += 360; }\n            h /= 60;\n            var i = floor$3(h);\n            var f = h - i;\n            var p = _g * (1 - c);\n            var q = p + _c * (1 - f);\n            var t = p + _c * f;\n            var v = p + _c;\n            switch (i) {\n                case 0: (assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2]); break\n                case 1: (assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2]); break\n                case 2: (assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2]); break\n                case 3: (assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2]); break\n                case 4: (assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2]); break\n                case 5: (assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2]); break\n            }\n        }\n        return [r, g, b, args.length > 3 ? args[3] : 1];\n    };\n\n    var hcg2rgb_1 = hcg2rgb;\n\n    var unpack$q = utils.unpack;\n    var type$j = utils.type;\n    var chroma$g = chroma_1;\n    var Color$z = Color_1;\n    var input$c = input$h;\n\n    var rgb2hcg = rgb2hcg_1;\n\n    Color$z.prototype.hcg = function() {\n        return rgb2hcg(this._rgb);\n    };\n\n    chroma$g.hcg = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$z, [ null ].concat( args, ['hcg']) ));\n    };\n\n    input$c.format.hcg = hcg2rgb_1;\n\n    input$c.autodetect.push({\n        p: 1,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$q(args, 'hcg');\n            if (type$j(args) === 'array' && args.length === 3) {\n                return 'hcg';\n            }\n        }\n    });\n\n    var unpack$p = utils.unpack;\n    var last = utils.last;\n    var round$3 = Math.round;\n\n    var rgb2hex$2 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$p(args, 'rgba');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var a = ref[3];\n        var mode = last(args) || 'auto';\n        if (a === undefined) { a = 1; }\n        if (mode === 'auto') {\n            mode = a < 1 ? 'rgba' : 'rgb';\n        }\n        r = round$3(r);\n        g = round$3(g);\n        b = round$3(b);\n        var u = r << 16 | g << 8 | b;\n        var str = \"000000\" + u.toString(16); //#.toUpperCase();\n        str = str.substr(str.length - 6);\n        var hxa = '0' + round$3(a * 255).toString(16);\n        hxa = hxa.substr(hxa.length - 2);\n        switch (mode.toLowerCase()) {\n            case 'rgba': return (\"#\" + str + hxa);\n            case 'argb': return (\"#\" + hxa + str);\n            default: return (\"#\" + str);\n        }\n    };\n\n    var rgb2hex_1 = rgb2hex$2;\n\n    var RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n    var RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\n    var hex2rgb$1 = function (hex) {\n        if (hex.match(RE_HEX)) {\n            // remove optional leading #\n            if (hex.length === 4 || hex.length === 7) {\n                hex = hex.substr(1);\n            }\n            // expand short-notation to full six-digit\n            if (hex.length === 3) {\n                hex = hex.split('');\n                hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];\n            }\n            var u = parseInt(hex, 16);\n            var r = u >> 16;\n            var g = u >> 8 & 0xFF;\n            var b = u & 0xFF;\n            return [r,g,b,1];\n        }\n\n        // match rgba hex format, eg #FF000077\n        if (hex.match(RE_HEXA)) {\n            if (hex.length === 5 || hex.length === 9) {\n                // remove optional leading #\n                hex = hex.substr(1);\n            }\n            // expand short-notation to full eight-digit\n            if (hex.length === 4) {\n                hex = hex.split('');\n                hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]+hex[3]+hex[3];\n            }\n            var u$1 = parseInt(hex, 16);\n            var r$1 = u$1 >> 24 & 0xFF;\n            var g$1 = u$1 >> 16 & 0xFF;\n            var b$1 = u$1 >> 8 & 0xFF;\n            var a = Math.round((u$1 & 0xFF) / 0xFF * 100) / 100;\n            return [r$1,g$1,b$1,a];\n        }\n\n        // we used to check for css colors here\n        // if _input.css? and rgb = _input.css hex\n        //     return rgb\n\n        throw new Error((\"unknown hex color: \" + hex));\n    };\n\n    var hex2rgb_1 = hex2rgb$1;\n\n    var chroma$f = chroma_1;\n    var Color$y = Color_1;\n    var type$i = utils.type;\n    var input$b = input$h;\n\n    var rgb2hex$1 = rgb2hex_1;\n\n    Color$y.prototype.hex = function(mode) {\n        return rgb2hex$1(this._rgb, mode);\n    };\n\n    chroma$f.hex = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$y, [ null ].concat( args, ['hex']) ));\n    };\n\n    input$b.format.hex = hex2rgb_1;\n    input$b.autodetect.push({\n        p: 4,\n        test: function (h) {\n            var rest = [], len = arguments.length - 1;\n            while ( len-- > 0 ) rest[ len ] = arguments[ len + 1 ];\n\n            if (!rest.length && type$i(h) === 'string' && [3,4,5,6,7,8,9].indexOf(h.length) >= 0) {\n                return 'hex';\n            }\n        }\n    });\n\n    var unpack$o = utils.unpack;\n    var TWOPI$2 = utils.TWOPI;\n    var min$2 = Math.min;\n    var sqrt$4 = Math.sqrt;\n    var acos = Math.acos;\n\n    var rgb2hsi$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        /*\n        borrowed from here:\n        http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n        */\n        var ref = unpack$o(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        r /= 255;\n        g /= 255;\n        b /= 255;\n        var h;\n        var min_ = min$2(r,g,b);\n        var i = (r+g+b) / 3;\n        var s = i > 0 ? 1 - min_/i : 0;\n        if (s === 0) {\n            h = NaN;\n        } else {\n            h = ((r-g)+(r-b)) / 2;\n            h /= sqrt$4((r-g)*(r-g) + (r-b)*(g-b));\n            h = acos(h);\n            if (b > g) {\n                h = TWOPI$2 - h;\n            }\n            h /= TWOPI$2;\n        }\n        return [h*360,s,i];\n    };\n\n    var rgb2hsi_1 = rgb2hsi$1;\n\n    var unpack$n = utils.unpack;\n    var limit = utils.limit;\n    var TWOPI$1 = utils.TWOPI;\n    var PITHIRD = utils.PITHIRD;\n    var cos$4 = Math.cos;\n\n    /*\n     * hue [0..360]\n     * saturation [0..1]\n     * intensity [0..1]\n     */\n    var hsi2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        /*\n        borrowed from here:\n        http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n        */\n        args = unpack$n(args, 'hsi');\n        var h = args[0];\n        var s = args[1];\n        var i = args[2];\n        var r,g,b;\n\n        if (isNaN(h)) { h = 0; }\n        if (isNaN(s)) { s = 0; }\n        // normalize hue\n        if (h > 360) { h -= 360; }\n        if (h < 0) { h += 360; }\n        h /= 360;\n        if (h < 1/3) {\n            b = (1-s)/3;\n            r = (1+s*cos$4(TWOPI$1*h)/cos$4(PITHIRD-TWOPI$1*h))/3;\n            g = 1 - (b+r);\n        } else if (h < 2/3) {\n            h -= 1/3;\n            r = (1-s)/3;\n            g = (1+s*cos$4(TWOPI$1*h)/cos$4(PITHIRD-TWOPI$1*h))/3;\n            b = 1 - (r+g);\n        } else {\n            h -= 2/3;\n            g = (1-s)/3;\n            b = (1+s*cos$4(TWOPI$1*h)/cos$4(PITHIRD-TWOPI$1*h))/3;\n            r = 1 - (g+b);\n        }\n        r = limit(i*r*3);\n        g = limit(i*g*3);\n        b = limit(i*b*3);\n        return [r*255, g*255, b*255, args.length > 3 ? args[3] : 1];\n    };\n\n    var hsi2rgb_1 = hsi2rgb;\n\n    var unpack$m = utils.unpack;\n    var type$h = utils.type;\n    var chroma$e = chroma_1;\n    var Color$x = Color_1;\n    var input$a = input$h;\n\n    var rgb2hsi = rgb2hsi_1;\n\n    Color$x.prototype.hsi = function() {\n        return rgb2hsi(this._rgb);\n    };\n\n    chroma$e.hsi = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$x, [ null ].concat( args, ['hsi']) ));\n    };\n\n    input$a.format.hsi = hsi2rgb_1;\n\n    input$a.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$m(args, 'hsi');\n            if (type$h(args) === 'array' && args.length === 3) {\n                return 'hsi';\n            }\n        }\n    });\n\n    var unpack$l = utils.unpack;\n    var type$g = utils.type;\n    var chroma$d = chroma_1;\n    var Color$w = Color_1;\n    var input$9 = input$h;\n\n    var rgb2hsl$1 = rgb2hsl_1;\n\n    Color$w.prototype.hsl = function() {\n        return rgb2hsl$1(this._rgb);\n    };\n\n    chroma$d.hsl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$w, [ null ].concat( args, ['hsl']) ));\n    };\n\n    input$9.format.hsl = hsl2rgb_1;\n\n    input$9.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$l(args, 'hsl');\n            if (type$g(args) === 'array' && args.length === 3) {\n                return 'hsl';\n            }\n        }\n    });\n\n    var unpack$k = utils.unpack;\n    var min$1 = Math.min;\n    var max$1 = Math.max;\n\n    /*\n     * supported arguments:\n     * - rgb2hsv(r,g,b)\n     * - rgb2hsv([r,g,b])\n     * - rgb2hsv({r,g,b})\n     */\n    var rgb2hsl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$k(args, 'rgb');\n        var r = args[0];\n        var g = args[1];\n        var b = args[2];\n        var min_ = min$1(r, g, b);\n        var max_ = max$1(r, g, b);\n        var delta = max_ - min_;\n        var h,s,v;\n        v = max_ / 255.0;\n        if (max_ === 0) {\n            h = Number.NaN;\n            s = 0;\n        } else {\n            s = delta / max_;\n            if (r === max_) { h = (g - b) / delta; }\n            if (g === max_) { h = 2+(b - r) / delta; }\n            if (b === max_) { h = 4+(r - g) / delta; }\n            h *= 60;\n            if (h < 0) { h += 360; }\n        }\n        return [h, s, v]\n    };\n\n    var rgb2hsv$1 = rgb2hsl;\n\n    var unpack$j = utils.unpack;\n    var floor$2 = Math.floor;\n\n    var hsv2rgb = function () {\n        var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n        args = unpack$j(args, 'hsv');\n        var h = args[0];\n        var s = args[1];\n        var v = args[2];\n        var r,g,b;\n        v *= 255;\n        if (s === 0) {\n            r = g = b = v;\n        } else {\n            if (h === 360) { h = 0; }\n            if (h > 360) { h -= 360; }\n            if (h < 0) { h += 360; }\n            h /= 60;\n\n            var i = floor$2(h);\n            var f = h - i;\n            var p = v * (1 - s);\n            var q = v * (1 - s * f);\n            var t = v * (1 - s * (1 - f));\n\n            switch (i) {\n                case 0: (assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2]); break\n                case 1: (assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2]); break\n                case 2: (assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2]); break\n                case 3: (assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2]); break\n                case 4: (assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2]); break\n                case 5: (assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2]); break\n            }\n        }\n        return [r,g,b,args.length > 3?args[3]:1];\n    };\n\n    var hsv2rgb_1 = hsv2rgb;\n\n    var unpack$i = utils.unpack;\n    var type$f = utils.type;\n    var chroma$c = chroma_1;\n    var Color$v = Color_1;\n    var input$8 = input$h;\n\n    var rgb2hsv = rgb2hsv$1;\n\n    Color$v.prototype.hsv = function() {\n        return rgb2hsv(this._rgb);\n    };\n\n    chroma$c.hsv = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$v, [ null ].concat( args, ['hsv']) ));\n    };\n\n    input$8.format.hsv = hsv2rgb_1;\n\n    input$8.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$i(args, 'hsv');\n            if (type$f(args) === 'array' && args.length === 3) {\n                return 'hsv';\n            }\n        }\n    });\n\n    var labConstants = {\n        // Corresponds roughly to RGB brighter/darker\n        Kn: 18,\n\n        // D65 standard referent\n        Xn: 0.950470,\n        Yn: 1,\n        Zn: 1.088830,\n\n        t0: 0.137931034,  // 4 / 29\n        t1: 0.206896552,  // 6 / 29\n        t2: 0.12841855,   // 3 * t1 * t1\n        t3: 0.008856452,  // t1 * t1 * t1\n    };\n\n    var LAB_CONSTANTS$3 = labConstants;\n    var unpack$h = utils.unpack;\n    var pow$a = Math.pow;\n\n    var rgb2lab$2 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$h(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var ref$1 = rgb2xyz(r,g,b);\n        var x = ref$1[0];\n        var y = ref$1[1];\n        var z = ref$1[2];\n        var l = 116 * y - 16;\n        return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n    };\n\n    var rgb_xyz = function (r) {\n        if ((r /= 255) <= 0.04045) { return r / 12.92; }\n        return pow$a((r + 0.055) / 1.055, 2.4);\n    };\n\n    var xyz_lab = function (t) {\n        if (t > LAB_CONSTANTS$3.t3) { return pow$a(t, 1 / 3); }\n        return t / LAB_CONSTANTS$3.t2 + LAB_CONSTANTS$3.t0;\n    };\n\n    var rgb2xyz = function (r,g,b) {\n        r = rgb_xyz(r);\n        g = rgb_xyz(g);\n        b = rgb_xyz(b);\n        var x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS$3.Xn);\n        var y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / LAB_CONSTANTS$3.Yn);\n        var z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / LAB_CONSTANTS$3.Zn);\n        return [x,y,z];\n    };\n\n    var rgb2lab_1 = rgb2lab$2;\n\n    var LAB_CONSTANTS$2 = labConstants;\n    var unpack$g = utils.unpack;\n    var pow$9 = Math.pow;\n\n    /*\n     * L* [0..100]\n     * a [-100..100]\n     * b [-100..100]\n     */\n    var lab2rgb$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$g(args, 'lab');\n        var l = args[0];\n        var a = args[1];\n        var b = args[2];\n        var x,y,z, r,g,b_;\n\n        y = (l + 16) / 116;\n        x = isNaN(a) ? y : y + a / 500;\n        z = isNaN(b) ? y : y - b / 200;\n\n        y = LAB_CONSTANTS$2.Yn * lab_xyz(y);\n        x = LAB_CONSTANTS$2.Xn * lab_xyz(x);\n        z = LAB_CONSTANTS$2.Zn * lab_xyz(z);\n\n        r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z);  // D65 -> sRGB\n        g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z);\n        b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n\n        return [r,g,b_,args.length > 3 ? args[3] : 1];\n    };\n\n    var xyz_rgb = function (r) {\n        return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow$9(r, 1 / 2.4) - 0.055)\n    };\n\n    var lab_xyz = function (t) {\n        return t > LAB_CONSTANTS$2.t1 ? t * t * t : LAB_CONSTANTS$2.t2 * (t - LAB_CONSTANTS$2.t0)\n    };\n\n    var lab2rgb_1 = lab2rgb$1;\n\n    var unpack$f = utils.unpack;\n    var type$e = utils.type;\n    var chroma$b = chroma_1;\n    var Color$u = Color_1;\n    var input$7 = input$h;\n\n    var rgb2lab$1 = rgb2lab_1;\n\n    Color$u.prototype.lab = function() {\n        return rgb2lab$1(this._rgb);\n    };\n\n    chroma$b.lab = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$u, [ null ].concat( args, ['lab']) ));\n    };\n\n    input$7.format.lab = lab2rgb_1;\n\n    input$7.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$f(args, 'lab');\n            if (type$e(args) === 'array' && args.length === 3) {\n                return 'lab';\n            }\n        }\n    });\n\n    var unpack$e = utils.unpack;\n    var RAD2DEG = utils.RAD2DEG;\n    var sqrt$3 = Math.sqrt;\n    var atan2$2 = Math.atan2;\n    var round$2 = Math.round;\n\n    var lab2lch$2 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$e(args, 'lab');\n        var l = ref[0];\n        var a = ref[1];\n        var b = ref[2];\n        var c = sqrt$3(a * a + b * b);\n        var h = (atan2$2(b, a) * RAD2DEG + 360) % 360;\n        if (round$2(c*10000) === 0) { h = Number.NaN; }\n        return [l, c, h];\n    };\n\n    var lab2lch_1 = lab2lch$2;\n\n    var unpack$d = utils.unpack;\n    var rgb2lab = rgb2lab_1;\n    var lab2lch$1 = lab2lch_1;\n\n    var rgb2lch$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$d(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var ref$1 = rgb2lab(r,g,b);\n        var l = ref$1[0];\n        var a = ref$1[1];\n        var b_ = ref$1[2];\n        return lab2lch$1(l,a,b_);\n    };\n\n    var rgb2lch_1 = rgb2lch$1;\n\n    var unpack$c = utils.unpack;\n    var DEG2RAD = utils.DEG2RAD;\n    var sin$3 = Math.sin;\n    var cos$3 = Math.cos;\n\n    var lch2lab$2 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        /*\n        Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n        These formulas were invented by David Dalrymple to obtain maximum contrast without going\n        out of gamut if the parameters are in the range 0-1.\n\n        A saturation multiplier was added by Gregor Aisch\n        */\n        var ref = unpack$c(args, 'lch');\n        var l = ref[0];\n        var c = ref[1];\n        var h = ref[2];\n        if (isNaN(h)) { h = 0; }\n        h = h * DEG2RAD;\n        return [l, cos$3(h) * c, sin$3(h) * c]\n    };\n\n    var lch2lab_1 = lch2lab$2;\n\n    var unpack$b = utils.unpack;\n    var lch2lab$1 = lch2lab_1;\n    var lab2rgb = lab2rgb_1;\n\n    var lch2rgb$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$b(args, 'lch');\n        var l = args[0];\n        var c = args[1];\n        var h = args[2];\n        var ref = lch2lab$1 (l,c,h);\n        var L = ref[0];\n        var a = ref[1];\n        var b_ = ref[2];\n        var ref$1 = lab2rgb (L,a,b_);\n        var r = ref$1[0];\n        var g = ref$1[1];\n        var b = ref$1[2];\n        return [r, g, b, args.length > 3 ? args[3] : 1];\n    };\n\n    var lch2rgb_1 = lch2rgb$1;\n\n    var unpack$a = utils.unpack;\n    var lch2rgb = lch2rgb_1;\n\n    var hcl2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var hcl = unpack$a(args, 'hcl').reverse();\n        return lch2rgb.apply(void 0, hcl);\n    };\n\n    var hcl2rgb_1 = hcl2rgb;\n\n    var unpack$9 = utils.unpack;\n    var type$d = utils.type;\n    var chroma$a = chroma_1;\n    var Color$t = Color_1;\n    var input$6 = input$h;\n\n    var rgb2lch = rgb2lch_1;\n\n    Color$t.prototype.lch = function() { return rgb2lch(this._rgb); };\n    Color$t.prototype.hcl = function() { return rgb2lch(this._rgb).reverse(); };\n\n    chroma$a.lch = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$t, [ null ].concat( args, ['lch']) ));\n    };\n    chroma$a.hcl = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$t, [ null ].concat( args, ['hcl']) ));\n    };\n\n    input$6.format.lch = lch2rgb_1;\n    input$6.format.hcl = hcl2rgb_1;\n\n    ['lch','hcl'].forEach(function (m) { return input$6.autodetect.push({\n        p: 2,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$9(args, m);\n            if (type$d(args) === 'array' && args.length === 3) {\n                return m;\n            }\n        }\n    }); });\n\n    /**\n    \tX11 color names\n\n    \thttp://www.w3.org/TR/css3-color/#svg-color\n    */\n\n    var w3cx11$1 = {\n        aliceblue: '#f0f8ff',\n        antiquewhite: '#faebd7',\n        aqua: '#00ffff',\n        aquamarine: '#7fffd4',\n        azure: '#f0ffff',\n        beige: '#f5f5dc',\n        bisque: '#ffe4c4',\n        black: '#000000',\n        blanchedalmond: '#ffebcd',\n        blue: '#0000ff',\n        blueviolet: '#8a2be2',\n        brown: '#a52a2a',\n        burlywood: '#deb887',\n        cadetblue: '#5f9ea0',\n        chartreuse: '#7fff00',\n        chocolate: '#d2691e',\n        coral: '#ff7f50',\n        cornflower: '#6495ed',\n        cornflowerblue: '#6495ed',\n        cornsilk: '#fff8dc',\n        crimson: '#dc143c',\n        cyan: '#00ffff',\n        darkblue: '#00008b',\n        darkcyan: '#008b8b',\n        darkgoldenrod: '#b8860b',\n        darkgray: '#a9a9a9',\n        darkgreen: '#006400',\n        darkgrey: '#a9a9a9',\n        darkkhaki: '#bdb76b',\n        darkmagenta: '#8b008b',\n        darkolivegreen: '#556b2f',\n        darkorange: '#ff8c00',\n        darkorchid: '#9932cc',\n        darkred: '#8b0000',\n        darksalmon: '#e9967a',\n        darkseagreen: '#8fbc8f',\n        darkslateblue: '#483d8b',\n        darkslategray: '#2f4f4f',\n        darkslategrey: '#2f4f4f',\n        darkturquoise: '#00ced1',\n        darkviolet: '#9400d3',\n        deeppink: '#ff1493',\n        deepskyblue: '#00bfff',\n        dimgray: '#696969',\n        dimgrey: '#696969',\n        dodgerblue: '#1e90ff',\n        firebrick: '#b22222',\n        floralwhite: '#fffaf0',\n        forestgreen: '#228b22',\n        fuchsia: '#ff00ff',\n        gainsboro: '#dcdcdc',\n        ghostwhite: '#f8f8ff',\n        gold: '#ffd700',\n        goldenrod: '#daa520',\n        gray: '#808080',\n        green: '#008000',\n        greenyellow: '#adff2f',\n        grey: '#808080',\n        honeydew: '#f0fff0',\n        hotpink: '#ff69b4',\n        indianred: '#cd5c5c',\n        indigo: '#4b0082',\n        ivory: '#fffff0',\n        khaki: '#f0e68c',\n        laserlemon: '#ffff54',\n        lavender: '#e6e6fa',\n        lavenderblush: '#fff0f5',\n        lawngreen: '#7cfc00',\n        lemonchiffon: '#fffacd',\n        lightblue: '#add8e6',\n        lightcoral: '#f08080',\n        lightcyan: '#e0ffff',\n        lightgoldenrod: '#fafad2',\n        lightgoldenrodyellow: '#fafad2',\n        lightgray: '#d3d3d3',\n        lightgreen: '#90ee90',\n        lightgrey: '#d3d3d3',\n        lightpink: '#ffb6c1',\n        lightsalmon: '#ffa07a',\n        lightseagreen: '#20b2aa',\n        lightskyblue: '#87cefa',\n        lightslategray: '#778899',\n        lightslategrey: '#778899',\n        lightsteelblue: '#b0c4de',\n        lightyellow: '#ffffe0',\n        lime: '#00ff00',\n        limegreen: '#32cd32',\n        linen: '#faf0e6',\n        magenta: '#ff00ff',\n        maroon: '#800000',\n        maroon2: '#7f0000',\n        maroon3: '#b03060',\n        mediumaquamarine: '#66cdaa',\n        mediumblue: '#0000cd',\n        mediumorchid: '#ba55d3',\n        mediumpurple: '#9370db',\n        mediumseagreen: '#3cb371',\n        mediumslateblue: '#7b68ee',\n        mediumspringgreen: '#00fa9a',\n        mediumturquoise: '#48d1cc',\n        mediumvioletred: '#c71585',\n        midnightblue: '#191970',\n        mintcream: '#f5fffa',\n        mistyrose: '#ffe4e1',\n        moccasin: '#ffe4b5',\n        navajowhite: '#ffdead',\n        navy: '#000080',\n        oldlace: '#fdf5e6',\n        olive: '#808000',\n        olivedrab: '#6b8e23',\n        orange: '#ffa500',\n        orangered: '#ff4500',\n        orchid: '#da70d6',\n        palegoldenrod: '#eee8aa',\n        palegreen: '#98fb98',\n        paleturquoise: '#afeeee',\n        palevioletred: '#db7093',\n        papayawhip: '#ffefd5',\n        peachpuff: '#ffdab9',\n        peru: '#cd853f',\n        pink: '#ffc0cb',\n        plum: '#dda0dd',\n        powderblue: '#b0e0e6',\n        purple: '#800080',\n        purple2: '#7f007f',\n        purple3: '#a020f0',\n        rebeccapurple: '#663399',\n        red: '#ff0000',\n        rosybrown: '#bc8f8f',\n        royalblue: '#4169e1',\n        saddlebrown: '#8b4513',\n        salmon: '#fa8072',\n        sandybrown: '#f4a460',\n        seagreen: '#2e8b57',\n        seashell: '#fff5ee',\n        sienna: '#a0522d',\n        silver: '#c0c0c0',\n        skyblue: '#87ceeb',\n        slateblue: '#6a5acd',\n        slategray: '#708090',\n        slategrey: '#708090',\n        snow: '#fffafa',\n        springgreen: '#00ff7f',\n        steelblue: '#4682b4',\n        tan: '#d2b48c',\n        teal: '#008080',\n        thistle: '#d8bfd8',\n        tomato: '#ff6347',\n        turquoise: '#40e0d0',\n        violet: '#ee82ee',\n        wheat: '#f5deb3',\n        white: '#ffffff',\n        whitesmoke: '#f5f5f5',\n        yellow: '#ffff00',\n        yellowgreen: '#9acd32'\n    };\n\n    var w3cx11_1 = w3cx11$1;\n\n    var Color$s = Color_1;\n    var input$5 = input$h;\n    var type$c = utils.type;\n\n    var w3cx11 = w3cx11_1;\n    var hex2rgb = hex2rgb_1;\n    var rgb2hex = rgb2hex_1;\n\n    Color$s.prototype.name = function() {\n        var hex = rgb2hex(this._rgb, 'rgb');\n        for (var i = 0, list = Object.keys(w3cx11); i < list.length; i += 1) {\n            var n = list[i];\n\n            if (w3cx11[n] === hex) { return n.toLowerCase(); }\n        }\n        return hex;\n    };\n\n    input$5.format.named = function (name) {\n        name = name.toLowerCase();\n        if (w3cx11[name]) { return hex2rgb(w3cx11[name]); }\n        throw new Error('unknown color name: '+name);\n    };\n\n    input$5.autodetect.push({\n        p: 5,\n        test: function (h) {\n            var rest = [], len = arguments.length - 1;\n            while ( len-- > 0 ) rest[ len ] = arguments[ len + 1 ];\n\n            if (!rest.length && type$c(h) === 'string' && w3cx11[h.toLowerCase()]) {\n                return 'named';\n            }\n        }\n    });\n\n    var unpack$8 = utils.unpack;\n\n    var rgb2num$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$8(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        return (r << 16) + (g << 8) + b;\n    };\n\n    var rgb2num_1 = rgb2num$1;\n\n    var type$b = utils.type;\n\n    var num2rgb = function (num) {\n        if (type$b(num) == \"number\" && num >= 0 && num <= 0xFFFFFF) {\n            var r = num >> 16;\n            var g = (num >> 8) & 0xFF;\n            var b = num & 0xFF;\n            return [r,g,b,1];\n        }\n        throw new Error(\"unknown num color: \"+num);\n    };\n\n    var num2rgb_1 = num2rgb;\n\n    var chroma$9 = chroma_1;\n    var Color$r = Color_1;\n    var input$4 = input$h;\n    var type$a = utils.type;\n\n    var rgb2num = rgb2num_1;\n\n    Color$r.prototype.num = function() {\n        return rgb2num(this._rgb);\n    };\n\n    chroma$9.num = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$r, [ null ].concat( args, ['num']) ));\n    };\n\n    input$4.format.num = num2rgb_1;\n\n    input$4.autodetect.push({\n        p: 5,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            if (args.length === 1 && type$a(args[0]) === 'number' && args[0] >= 0 && args[0] <= 0xFFFFFF) {\n                return 'num';\n            }\n        }\n    });\n\n    var chroma$8 = chroma_1;\n    var Color$q = Color_1;\n    var input$3 = input$h;\n    var unpack$7 = utils.unpack;\n    var type$9 = utils.type;\n    var round$1 = Math.round;\n\n    Color$q.prototype.rgb = function(rnd) {\n        if ( rnd === void 0 ) rnd=true;\n\n        if (rnd === false) { return this._rgb.slice(0,3); }\n        return this._rgb.slice(0,3).map(round$1);\n    };\n\n    Color$q.prototype.rgba = function(rnd) {\n        if ( rnd === void 0 ) rnd=true;\n\n        return this._rgb.slice(0,4).map(function (v,i) {\n            return i<3 ? (rnd === false ? v : round$1(v)) : v;\n        });\n    };\n\n    chroma$8.rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$q, [ null ].concat( args, ['rgb']) ));\n    };\n\n    input$3.format.rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgba = unpack$7(args, 'rgba');\n        if (rgba[3] === undefined) { rgba[3] = 1; }\n        return rgba;\n    };\n\n    input$3.autodetect.push({\n        p: 3,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$7(args, 'rgba');\n            if (type$9(args) === 'array' && (args.length === 3 ||\n                args.length === 4 && type$9(args[3]) == 'number' && args[3] >= 0 && args[3] <= 1)) {\n                return 'rgb';\n            }\n        }\n    });\n\n    /*\n     * Based on implementation by Neil Bartlett\n     * https://github.com/neilbartlett/color-temperature\n     */\n\n    var log$1 = Math.log;\n\n    var temperature2rgb$1 = function (kelvin) {\n        var temp = kelvin / 100;\n        var r,g,b;\n        if (temp < 66) {\n            r = 255;\n            g = temp < 6 ? 0 : -155.25485562709179 - 0.44596950469579133 * (g = temp-2) + 104.49216199393888 * log$1(g);\n            b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp-10) + 115.67994401066147 * log$1(b);\n        } else {\n            r = 351.97690566805693 + 0.114206453784165 * (r = temp-55) - 40.25366309332127 * log$1(r);\n            g = 325.4494125711974 + 0.07943456536662342 * (g = temp-50) - 28.0852963507957 * log$1(g);\n            b = 255;\n        }\n        return [r,g,b,1];\n    };\n\n    var temperature2rgb_1 = temperature2rgb$1;\n\n    /*\n     * Based on implementation by Neil Bartlett\n     * https://github.com/neilbartlett/color-temperature\n     **/\n\n    var temperature2rgb = temperature2rgb_1;\n    var unpack$6 = utils.unpack;\n    var round = Math.round;\n\n    var rgb2temperature$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var rgb = unpack$6(args, 'rgb');\n        var r = rgb[0], b = rgb[2];\n        var minTemp = 1000;\n        var maxTemp = 40000;\n        var eps = 0.4;\n        var temp;\n        while (maxTemp - minTemp > eps) {\n            temp = (maxTemp + minTemp) * 0.5;\n            var rgb$1 = temperature2rgb(temp);\n            if ((rgb$1[2] / rgb$1[0]) >= (b / r)) {\n                maxTemp = temp;\n            } else {\n                minTemp = temp;\n            }\n        }\n        return round(temp);\n    };\n\n    var rgb2temperature_1 = rgb2temperature$1;\n\n    var chroma$7 = chroma_1;\n    var Color$p = Color_1;\n    var input$2 = input$h;\n\n    var rgb2temperature = rgb2temperature_1;\n\n    Color$p.prototype.temp =\n    Color$p.prototype.kelvin =\n    Color$p.prototype.temperature = function() {\n        return rgb2temperature(this._rgb);\n    };\n\n    chroma$7.temp =\n    chroma$7.kelvin =\n    chroma$7.temperature = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$p, [ null ].concat( args, ['temp']) ));\n    };\n\n    input$2.format.temp =\n    input$2.format.kelvin =\n    input$2.format.temperature = temperature2rgb_1;\n\n    var unpack$5 = utils.unpack;\n    var cbrt = Math.cbrt;\n    var pow$8 = Math.pow;\n    var sign$1 = Math.sign;\n\n    var rgb2oklab$2 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        // OKLab color space implementation taken from\n        // https://bottosson.github.io/posts/oklab/\n        var ref = unpack$5(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var ref$1 = [rgb2lrgb(r / 255), rgb2lrgb(g / 255), rgb2lrgb(b / 255)];\n        var lr = ref$1[0];\n        var lg = ref$1[1];\n        var lb = ref$1[2];\n        var l = cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n        var m = cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n        var s = cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n        return [\n            0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n            1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n            0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s\n        ];\n    };\n\n    var rgb2oklab_1 = rgb2oklab$2;\n\n    function rgb2lrgb(c) {\n        var abs = Math.abs(c);\n        if (abs < 0.04045) {\n            return c / 12.92;\n        }\n        return (sign$1(c) || 1) * pow$8((abs + 0.055) / 1.055, 2.4);\n    }\n\n    var unpack$4 = utils.unpack;\n    var pow$7 = Math.pow;\n    var sign = Math.sign;\n\n    /*\n     * L* [0..100]\n     * a [-100..100]\n     * b [-100..100]\n     */\n    var oklab2rgb$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$4(args, 'lab');\n        var L = args[0];\n        var a = args[1];\n        var b = args[2];\n\n        var l = pow$7(L + 0.3963377774 * a + 0.2158037573 * b, 3);\n        var m = pow$7(L - 0.1055613458 * a - 0.0638541728 * b, 3);\n        var s = pow$7(L - 0.0894841775 * a - 1.291485548 * b, 3);\n\n        return [\n            255 * lrgb2rgb(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n            255 * lrgb2rgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n            255 * lrgb2rgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n            args.length > 3 ? args[3] : 1\n        ];\n    };\n\n    var oklab2rgb_1 = oklab2rgb$1;\n\n    function lrgb2rgb(c) {\n        var abs = Math.abs(c);\n        if (abs > 0.0031308) {\n            return (sign(c) || 1) * (1.055 * pow$7(abs, 1 / 2.4) - 0.055);\n        }\n        return c * 12.92;\n    }\n\n    var unpack$3 = utils.unpack;\n    var type$8 = utils.type;\n    var chroma$6 = chroma_1;\n    var Color$o = Color_1;\n    var input$1 = input$h;\n\n    var rgb2oklab$1 = rgb2oklab_1;\n\n    Color$o.prototype.oklab = function () {\n        return rgb2oklab$1(this._rgb);\n    };\n\n    chroma$6.oklab = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$o, [ null ].concat( args, ['oklab']) ));\n    };\n\n    input$1.format.oklab = oklab2rgb_1;\n\n    input$1.autodetect.push({\n        p: 3,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack$3(args, 'oklab');\n            if (type$8(args) === 'array' && args.length === 3) {\n                return 'oklab';\n            }\n        }\n    });\n\n    var unpack$2 = utils.unpack;\n    var rgb2oklab = rgb2oklab_1;\n    var lab2lch = lab2lch_1;\n\n    var rgb2oklch$1 = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        var ref = unpack$2(args, 'rgb');\n        var r = ref[0];\n        var g = ref[1];\n        var b = ref[2];\n        var ref$1 = rgb2oklab(r, g, b);\n        var l = ref$1[0];\n        var a = ref$1[1];\n        var b_ = ref$1[2];\n        return lab2lch(l, a, b_);\n    };\n\n    var rgb2oklch_1 = rgb2oklch$1;\n\n    var unpack$1 = utils.unpack;\n    var lch2lab = lch2lab_1;\n    var oklab2rgb = oklab2rgb_1;\n\n    var oklch2rgb = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        args = unpack$1(args, 'lch');\n        var l = args[0];\n        var c = args[1];\n        var h = args[2];\n        var ref = lch2lab(l, c, h);\n        var L = ref[0];\n        var a = ref[1];\n        var b_ = ref[2];\n        var ref$1 = oklab2rgb(L, a, b_);\n        var r = ref$1[0];\n        var g = ref$1[1];\n        var b = ref$1[2];\n        return [r, g, b, args.length > 3 ? args[3] : 1];\n    };\n\n    var oklch2rgb_1 = oklch2rgb;\n\n    var unpack = utils.unpack;\n    var type$7 = utils.type;\n    var chroma$5 = chroma_1;\n    var Color$n = Color_1;\n    var input = input$h;\n\n    var rgb2oklch = rgb2oklch_1;\n\n    Color$n.prototype.oklch = function () {\n        return rgb2oklch(this._rgb);\n    };\n\n    chroma$5.oklch = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return new (Function.prototype.bind.apply( Color$n, [ null ].concat( args, ['oklch']) ));\n    };\n\n    input.format.oklch = oklch2rgb_1;\n\n    input.autodetect.push({\n        p: 3,\n        test: function () {\n            var args = [], len = arguments.length;\n            while ( len-- ) args[ len ] = arguments[ len ];\n\n            args = unpack(args, 'oklch');\n            if (type$7(args) === 'array' && args.length === 3) {\n                return 'oklch';\n            }\n        }\n    });\n\n    var Color$m = Color_1;\n    var type$6 = utils.type;\n\n    Color$m.prototype.alpha = function(a, mutate) {\n        if ( mutate === void 0 ) mutate=false;\n\n        if (a !== undefined && type$6(a) === 'number') {\n            if (mutate) {\n                this._rgb[3] = a;\n                return this;\n            }\n            return new Color$m([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n        }\n        return this._rgb[3];\n    };\n\n    var Color$l = Color_1;\n\n    Color$l.prototype.clipped = function() {\n        return this._rgb._clipped || false;\n    };\n\n    var Color$k = Color_1;\n    var LAB_CONSTANTS$1 = labConstants;\n\n    Color$k.prototype.darken = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \tvar me = this;\n    \tvar lab = me.lab();\n    \tlab[0] -= LAB_CONSTANTS$1.Kn * amount;\n    \treturn new Color$k(lab, 'lab').alpha(me.alpha(), true);\n    };\n\n    Color$k.prototype.brighten = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \treturn this.darken(-amount);\n    };\n\n    Color$k.prototype.darker = Color$k.prototype.darken;\n    Color$k.prototype.brighter = Color$k.prototype.brighten;\n\n    var Color$j = Color_1;\n\n    Color$j.prototype.get = function (mc) {\n        var ref = mc.split('.');\n        var mode = ref[0];\n        var channel = ref[1];\n        var src = this[mode]();\n        if (channel) {\n            var i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n            if (i > -1) { return src[i]; }\n            throw new Error((\"unknown channel \" + channel + \" in mode \" + mode));\n        } else {\n            return src;\n        }\n    };\n\n    var Color$i = Color_1;\n    var type$5 = utils.type;\n    var pow$6 = Math.pow;\n\n    var EPS = 1e-7;\n    var MAX_ITER = 20;\n\n    Color$i.prototype.luminance = function(lum) {\n        if (lum !== undefined && type$5(lum) === 'number') {\n            if (lum === 0) {\n                // return pure black\n                return new Color$i([0,0,0,this._rgb[3]], 'rgb');\n            }\n            if (lum === 1) {\n                // return pure white\n                return new Color$i([255,255,255,this._rgb[3]], 'rgb');\n            }\n            // compute new color using...\n            var cur_lum = this.luminance();\n            var mode = 'rgb';\n            var max_iter = MAX_ITER;\n\n            var test = function (low, high) {\n                var mid = low.interpolate(high, 0.5, mode);\n                var lm = mid.luminance();\n                if (Math.abs(lum - lm) < EPS || !max_iter--) {\n                    // close enough\n                    return mid;\n                }\n                return lm > lum ? test(low, mid) : test(mid, high);\n            };\n\n            var rgb = (cur_lum > lum ? test(new Color$i([0,0,0]), this) : test(this, new Color$i([255,255,255]))).rgb();\n            return new Color$i(rgb.concat( [this._rgb[3]]));\n        }\n        return rgb2luminance.apply(void 0, (this._rgb).slice(0,3));\n    };\n\n\n    var rgb2luminance = function (r,g,b) {\n        // relative luminance\n        // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n        r = luminance_x(r);\n        g = luminance_x(g);\n        b = luminance_x(b);\n        return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n    };\n\n    var luminance_x = function (x) {\n        x /= 255;\n        return x <= 0.03928 ? x/12.92 : pow$6((x+0.055)/1.055, 2.4);\n    };\n\n    var interpolator$1 = {};\n\n    var Color$h = Color_1;\n    var type$4 = utils.type;\n    var interpolator = interpolator$1;\n\n    var mix$1 = function (col1, col2, f) {\n        if ( f === void 0 ) f=0.5;\n        var rest = [], len = arguments.length - 3;\n        while ( len-- > 0 ) rest[ len ] = arguments[ len + 3 ];\n\n        var mode = rest[0] || 'lrgb';\n        if (!interpolator[mode] && !rest.length) {\n            // fall back to the first supported mode\n            mode = Object.keys(interpolator)[0];\n        }\n        if (!interpolator[mode]) {\n            throw new Error((\"interpolation mode \" + mode + \" is not defined\"));\n        }\n        if (type$4(col1) !== 'object') { col1 = new Color$h(col1); }\n        if (type$4(col2) !== 'object') { col2 = new Color$h(col2); }\n        return interpolator[mode](col1, col2, f)\n            .alpha(col1.alpha() + f * (col2.alpha() - col1.alpha()));\n    };\n\n    var Color$g = Color_1;\n    var mix = mix$1;\n\n    Color$g.prototype.mix =\n    Color$g.prototype.interpolate = function(col2, f) {\n    \tif ( f === void 0 ) f=0.5;\n    \tvar rest = [], len = arguments.length - 2;\n    \twhile ( len-- > 0 ) rest[ len ] = arguments[ len + 2 ];\n\n    \treturn mix.apply(void 0, [ this, col2, f ].concat( rest ));\n    };\n\n    var Color$f = Color_1;\n\n    Color$f.prototype.premultiply = function(mutate) {\n    \tif ( mutate === void 0 ) mutate=false;\n\n    \tvar rgb = this._rgb;\n    \tvar a = rgb[3];\n    \tif (mutate) {\n    \t\tthis._rgb = [rgb[0]*a, rgb[1]*a, rgb[2]*a, a];\n    \t\treturn this;\n    \t} else {\n    \t\treturn new Color$f([rgb[0]*a, rgb[1]*a, rgb[2]*a, a], 'rgb');\n    \t}\n    };\n\n    var Color$e = Color_1;\n    var LAB_CONSTANTS = labConstants;\n\n    Color$e.prototype.saturate = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \tvar me = this;\n    \tvar lch = me.lch();\n    \tlch[1] += LAB_CONSTANTS.Kn * amount;\n    \tif (lch[1] < 0) { lch[1] = 0; }\n    \treturn new Color$e(lch, 'lch').alpha(me.alpha(), true);\n    };\n\n    Color$e.prototype.desaturate = function(amount) {\n    \tif ( amount === void 0 ) amount=1;\n\n    \treturn this.saturate(-amount);\n    };\n\n    var Color$d = Color_1;\n    var type$3 = utils.type;\n\n    Color$d.prototype.set = function (mc, value, mutate) {\n        if ( mutate === void 0 ) mutate = false;\n\n        var ref = mc.split('.');\n        var mode = ref[0];\n        var channel = ref[1];\n        var src = this[mode]();\n        if (channel) {\n            var i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n            if (i > -1) {\n                if (type$3(value) == 'string') {\n                    switch (value.charAt(0)) {\n                        case '+':\n                            src[i] += +value;\n                            break;\n                        case '-':\n                            src[i] += +value;\n                            break;\n                        case '*':\n                            src[i] *= +value.substr(1);\n                            break;\n                        case '/':\n                            src[i] /= +value.substr(1);\n                            break;\n                        default:\n                            src[i] = +value;\n                    }\n                } else if (type$3(value) === 'number') {\n                    src[i] = value;\n                } else {\n                    throw new Error(\"unsupported value for Color.set\");\n                }\n                var out = new Color$d(src, mode);\n                if (mutate) {\n                    this._rgb = out._rgb;\n                    return this;\n                }\n                return out;\n            }\n            throw new Error((\"unknown channel \" + channel + \" in mode \" + mode));\n        } else {\n            return src;\n        }\n    };\n\n    var Color$c = Color_1;\n\n    var rgb = function (col1, col2, f) {\n        var xyz0 = col1._rgb;\n        var xyz1 = col2._rgb;\n        return new Color$c(\n            xyz0[0] + f * (xyz1[0]-xyz0[0]),\n            xyz0[1] + f * (xyz1[1]-xyz0[1]),\n            xyz0[2] + f * (xyz1[2]-xyz0[2]),\n            'rgb'\n        )\n    };\n\n    // register interpolator\n    interpolator$1.rgb = rgb;\n\n    var Color$b = Color_1;\n    var sqrt$2 = Math.sqrt;\n    var pow$5 = Math.pow;\n\n    var lrgb = function (col1, col2, f) {\n        var ref = col1._rgb;\n        var x1 = ref[0];\n        var y1 = ref[1];\n        var z1 = ref[2];\n        var ref$1 = col2._rgb;\n        var x2 = ref$1[0];\n        var y2 = ref$1[1];\n        var z2 = ref$1[2];\n        return new Color$b(\n            sqrt$2(pow$5(x1,2) * (1-f) + pow$5(x2,2) * f),\n            sqrt$2(pow$5(y1,2) * (1-f) + pow$5(y2,2) * f),\n            sqrt$2(pow$5(z1,2) * (1-f) + pow$5(z2,2) * f),\n            'rgb'\n        )\n    };\n\n    // register interpolator\n    interpolator$1.lrgb = lrgb;\n\n    var Color$a = Color_1;\n\n    var lab = function (col1, col2, f) {\n        var xyz0 = col1.lab();\n        var xyz1 = col2.lab();\n        return new Color$a(\n            xyz0[0] + f * (xyz1[0]-xyz0[0]),\n            xyz0[1] + f * (xyz1[1]-xyz0[1]),\n            xyz0[2] + f * (xyz1[2]-xyz0[2]),\n            'lab'\n        )\n    };\n\n    // register interpolator\n    interpolator$1.lab = lab;\n\n    var Color$9 = Color_1;\n\n    var _hsx = function (col1, col2, f, m) {\n        var assign, assign$1;\n\n        var xyz0, xyz1;\n        if (m === 'hsl') {\n            xyz0 = col1.hsl();\n            xyz1 = col2.hsl();\n        } else if (m === 'hsv') {\n            xyz0 = col1.hsv();\n            xyz1 = col2.hsv();\n        } else if (m === 'hcg') {\n            xyz0 = col1.hcg();\n            xyz1 = col2.hcg();\n        } else if (m === 'hsi') {\n            xyz0 = col1.hsi();\n            xyz1 = col2.hsi();\n        } else if (m === 'lch' || m === 'hcl') {\n            m = 'hcl';\n            xyz0 = col1.hcl();\n            xyz1 = col2.hcl();\n        } else if (m === 'oklch') {\n            xyz0 = col1.oklch().reverse();\n            xyz1 = col2.oklch().reverse();\n        }\n\n        var hue0, hue1, sat0, sat1, lbv0, lbv1;\n        if (m.substr(0, 1) === 'h' || m === 'oklch') {\n            (assign = xyz0, hue0 = assign[0], sat0 = assign[1], lbv0 = assign[2]);\n            (assign$1 = xyz1, hue1 = assign$1[0], sat1 = assign$1[1], lbv1 = assign$1[2]);\n        }\n\n        var sat, hue, lbv, dh;\n\n        if (!isNaN(hue0) && !isNaN(hue1)) {\n            // both colors have hue\n            if (hue1 > hue0 && hue1 - hue0 > 180) {\n                dh = hue1 - (hue0 + 360);\n            } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n                dh = hue1 + 360 - hue0;\n            } else {\n                dh = hue1 - hue0;\n            }\n            hue = hue0 + f * dh;\n        } else if (!isNaN(hue0)) {\n            hue = hue0;\n            if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') { sat = sat0; }\n        } else if (!isNaN(hue1)) {\n            hue = hue1;\n            if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') { sat = sat1; }\n        } else {\n            hue = Number.NaN;\n        }\n\n        if (sat === undefined) { sat = sat0 + f * (sat1 - sat0); }\n        lbv = lbv0 + f * (lbv1 - lbv0);\n        return m === 'oklch' ? new Color$9([lbv, sat, hue], m) : new Color$9([hue, sat, lbv], m);\n    };\n\n    var interpolate_hsx$5 = _hsx;\n\n    var lch = function (col1, col2, f) {\n    \treturn interpolate_hsx$5(col1, col2, f, 'lch');\n    };\n\n    // register interpolator\n    interpolator$1.lch = lch;\n    interpolator$1.hcl = lch;\n\n    var Color$8 = Color_1;\n\n    var num = function (col1, col2, f) {\n        var c1 = col1.num();\n        var c2 = col2.num();\n        return new Color$8(c1 + f * (c2-c1), 'num')\n    };\n\n    // register interpolator\n    interpolator$1.num = num;\n\n    var interpolate_hsx$4 = _hsx;\n\n    var hcg = function (col1, col2, f) {\n    \treturn interpolate_hsx$4(col1, col2, f, 'hcg');\n    };\n\n    // register interpolator\n    interpolator$1.hcg = hcg;\n\n    var interpolate_hsx$3 = _hsx;\n\n    var hsi = function (col1, col2, f) {\n    \treturn interpolate_hsx$3(col1, col2, f, 'hsi');\n    };\n\n    // register interpolator\n    interpolator$1.hsi = hsi;\n\n    var interpolate_hsx$2 = _hsx;\n\n    var hsl = function (col1, col2, f) {\n    \treturn interpolate_hsx$2(col1, col2, f, 'hsl');\n    };\n\n    // register interpolator\n    interpolator$1.hsl = hsl;\n\n    var interpolate_hsx$1 = _hsx;\n\n    var hsv = function (col1, col2, f) {\n    \treturn interpolate_hsx$1(col1, col2, f, 'hsv');\n    };\n\n    // register interpolator\n    interpolator$1.hsv = hsv;\n\n    var Color$7 = Color_1;\n\n    var oklab = function (col1, col2, f) {\n        var xyz0 = col1.oklab();\n        var xyz1 = col2.oklab();\n        return new Color$7(\n            xyz0[0] + f * (xyz1[0] - xyz0[0]),\n            xyz0[1] + f * (xyz1[1] - xyz0[1]),\n            xyz0[2] + f * (xyz1[2] - xyz0[2]),\n            'oklab'\n        );\n    };\n\n    // register interpolator\n    interpolator$1.oklab = oklab;\n\n    var interpolate_hsx = _hsx;\n\n    var oklch = function (col1, col2, f) {\n        return interpolate_hsx(col1, col2, f, 'oklch');\n    };\n\n    // register interpolator\n    interpolator$1.oklch = oklch;\n\n    var Color$6 = Color_1;\n    var clip_rgb$1 = utils.clip_rgb;\n    var pow$4 = Math.pow;\n    var sqrt$1 = Math.sqrt;\n    var PI$1 = Math.PI;\n    var cos$2 = Math.cos;\n    var sin$2 = Math.sin;\n    var atan2$1 = Math.atan2;\n\n    var average = function (colors, mode, weights) {\n        if ( mode === void 0 ) mode='lrgb';\n        if ( weights === void 0 ) weights=null;\n\n        var l = colors.length;\n        if (!weights) { weights = Array.from(new Array(l)).map(function () { return 1; }); }\n        // normalize weights\n        var k = l / weights.reduce(function(a, b) { return a + b; });\n        weights.forEach(function (w,i) { weights[i] *= k; });\n        // convert colors to Color objects\n        colors = colors.map(function (c) { return new Color$6(c); });\n        if (mode === 'lrgb') {\n            return _average_lrgb(colors, weights)\n        }\n        var first = colors.shift();\n        var xyz = first.get(mode);\n        var cnt = [];\n        var dx = 0;\n        var dy = 0;\n        // initial color\n        for (var i=0; i<xyz.length; i++) {\n            xyz[i] = (xyz[i] || 0) * weights[0];\n            cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n            if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n                var A = xyz[i] / 180 * PI$1;\n                dx += cos$2(A) * weights[0];\n                dy += sin$2(A) * weights[0];\n            }\n        }\n\n        var alpha = first.alpha() * weights[0];\n        colors.forEach(function (c,ci) {\n            var xyz2 = c.get(mode);\n            alpha += c.alpha() * weights[ci+1];\n            for (var i=0; i<xyz.length; i++) {\n                if (!isNaN(xyz2[i])) {\n                    cnt[i] += weights[ci+1];\n                    if (mode.charAt(i) === 'h') {\n                        var A = xyz2[i] / 180 * PI$1;\n                        dx += cos$2(A) * weights[ci+1];\n                        dy += sin$2(A) * weights[ci+1];\n                    } else {\n                        xyz[i] += xyz2[i] * weights[ci+1];\n                    }\n                }\n            }\n        });\n\n        for (var i$1=0; i$1<xyz.length; i$1++) {\n            if (mode.charAt(i$1) === 'h') {\n                var A$1 = atan2$1(dy / cnt[i$1], dx / cnt[i$1]) / PI$1 * 180;\n                while (A$1 < 0) { A$1 += 360; }\n                while (A$1 >= 360) { A$1 -= 360; }\n                xyz[i$1] = A$1;\n            } else {\n                xyz[i$1] = xyz[i$1]/cnt[i$1];\n            }\n        }\n        alpha /= l;\n        return (new Color$6(xyz, mode)).alpha(alpha > 0.99999 ? 1 : alpha, true);\n    };\n\n\n    var _average_lrgb = function (colors, weights) {\n        var l = colors.length;\n        var xyz = [0,0,0,0];\n        for (var i=0; i < colors.length; i++) {\n            var col = colors[i];\n            var f = weights[i] / l;\n            var rgb = col._rgb;\n            xyz[0] += pow$4(rgb[0],2) * f;\n            xyz[1] += pow$4(rgb[1],2) * f;\n            xyz[2] += pow$4(rgb[2],2) * f;\n            xyz[3] += rgb[3] * f;\n        }\n        xyz[0] = sqrt$1(xyz[0]);\n        xyz[1] = sqrt$1(xyz[1]);\n        xyz[2] = sqrt$1(xyz[2]);\n        if (xyz[3] > 0.9999999) { xyz[3] = 1; }\n        return new Color$6(clip_rgb$1(xyz));\n    };\n\n    // minimal multi-purpose interface\n\n    // @requires utils color analyze\n\n    var chroma$4 = chroma_1;\n    var type$2 = utils.type;\n\n    var pow$3 = Math.pow;\n\n    var scale$2 = function(colors) {\n\n        // constructor\n        var _mode = 'rgb';\n        var _nacol = chroma$4('#ccc');\n        var _spread = 0;\n        // const _fixed = false;\n        var _domain = [0, 1];\n        var _pos = [];\n        var _padding = [0,0];\n        var _classes = false;\n        var _colors = [];\n        var _out = false;\n        var _min = 0;\n        var _max = 1;\n        var _correctLightness = false;\n        var _colorCache = {};\n        var _useCache = true;\n        var _gamma = 1;\n\n        // private methods\n\n        var setColors = function(colors) {\n            colors = colors || ['#fff', '#000'];\n            if (colors && type$2(colors) === 'string' && chroma$4.brewer &&\n                chroma$4.brewer[colors.toLowerCase()]) {\n                colors = chroma$4.brewer[colors.toLowerCase()];\n            }\n            if (type$2(colors) === 'array') {\n                // handle single color\n                if (colors.length === 1) {\n                    colors = [colors[0], colors[0]];\n                }\n                // make a copy of the colors\n                colors = colors.slice(0);\n                // convert to chroma classes\n                for (var c=0; c<colors.length; c++) {\n                    colors[c] = chroma$4(colors[c]);\n                }\n                // auto-fill color position\n                _pos.length = 0;\n                for (var c$1=0; c$1<colors.length; c$1++) {\n                    _pos.push(c$1/(colors.length-1));\n                }\n            }\n            resetCache();\n            return _colors = colors;\n        };\n\n        var getClass = function(value) {\n            if (_classes != null) {\n                var n = _classes.length-1;\n                var i = 0;\n                while (i < n && value >= _classes[i]) {\n                    i++;\n                }\n                return i-1;\n            }\n            return 0;\n        };\n\n        var tMapLightness = function (t) { return t; };\n        var tMapDomain = function (t) { return t; };\n\n        // const classifyValue = function(value) {\n        //     let val = value;\n        //     if (_classes.length > 2) {\n        //         const n = _classes.length-1;\n        //         const i = getClass(value);\n        //         const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5)));  // center of 1st class\n        //         const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5)));  // center of last class\n        //         val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n        //     }\n        //     return val;\n        // };\n\n        var getColor = function(val, bypassMap) {\n            var col, t;\n            if (bypassMap == null) { bypassMap = false; }\n            if (isNaN(val) || (val === null)) { return _nacol; }\n            if (!bypassMap) {\n                if (_classes && (_classes.length > 2)) {\n                    // find the class\n                    var c = getClass(val);\n                    t = c / (_classes.length-2);\n                } else if (_max !== _min) {\n                    // just interpolate between min/max\n                    t = (val - _min) / (_max - _min);\n                } else {\n                    t = 1;\n                }\n            } else {\n                t = val;\n            }\n\n            // domain map\n            t = tMapDomain(t);\n\n            if (!bypassMap) {\n                t = tMapLightness(t);  // lightness correction\n            }\n\n            if (_gamma !== 1) { t = pow$3(t, _gamma); }\n\n            t = _padding[0] + (t * (1 - _padding[0] - _padding[1]));\n\n            t = Math.min(1, Math.max(0, t));\n\n            var k = Math.floor(t * 10000);\n\n            if (_useCache && _colorCache[k]) {\n                col = _colorCache[k];\n            } else {\n                if (type$2(_colors) === 'array') {\n                    //for i in [0.._pos.length-1]\n                    for (var i=0; i<_pos.length; i++) {\n                        var p = _pos[i];\n                        if (t <= p) {\n                            col = _colors[i];\n                            break;\n                        }\n                        if ((t >= p) && (i === (_pos.length-1))) {\n                            col = _colors[i];\n                            break;\n                        }\n                        if (t > p && t < _pos[i+1]) {\n                            t = (t-p)/(_pos[i+1]-p);\n                            col = chroma$4.interpolate(_colors[i], _colors[i+1], t, _mode);\n                            break;\n                        }\n                    }\n                } else if (type$2(_colors) === 'function') {\n                    col = _colors(t);\n                }\n                if (_useCache) { _colorCache[k] = col; }\n            }\n            return col;\n        };\n\n        var resetCache = function () { return _colorCache = {}; };\n\n        setColors(colors);\n\n        // public interface\n\n        var f = function(v) {\n            var c = chroma$4(getColor(v));\n            if (_out && c[_out]) { return c[_out](); } else { return c; }\n        };\n\n        f.classes = function(classes) {\n            if (classes != null) {\n                if (type$2(classes) === 'array') {\n                    _classes = classes;\n                    _domain = [classes[0], classes[classes.length-1]];\n                } else {\n                    var d = chroma$4.analyze(_domain);\n                    if (classes === 0) {\n                        _classes = [d.min, d.max];\n                    } else {\n                        _classes = chroma$4.limits(d, 'e', classes);\n                    }\n                }\n                return f;\n            }\n            return _classes;\n        };\n\n\n        f.domain = function(domain) {\n            if (!arguments.length) {\n                return _domain;\n            }\n            _min = domain[0];\n            _max = domain[domain.length-1];\n            _pos = [];\n            var k = _colors.length;\n            if ((domain.length === k) && (_min !== _max)) {\n                // update positions\n                for (var i = 0, list = Array.from(domain); i < list.length; i += 1) {\n                    var d = list[i];\n\n                  _pos.push((d-_min) / (_max-_min));\n                }\n            } else {\n                for (var c=0; c<k; c++) {\n                    _pos.push(c/(k-1));\n                }\n                if (domain.length > 2) {\n                    // set domain map\n                    var tOut = domain.map(function (d,i) { return i/(domain.length-1); });\n                    var tBreaks = domain.map(function (d) { return (d - _min) / (_max - _min); });\n                    if (!tBreaks.every(function (val, i) { return tOut[i] === val; })) {\n                        tMapDomain = function (t) {\n                            if (t <= 0 || t >= 1) { return t; }\n                            var i = 0;\n                            while (t >= tBreaks[i+1]) { i++; }\n                            var f = (t - tBreaks[i]) / (tBreaks[i+1] - tBreaks[i]);\n                            var out = tOut[i] + f * (tOut[i+1] - tOut[i]);\n                            return out;\n                        };\n                    }\n\n                }\n            }\n            _domain = [_min, _max];\n            return f;\n        };\n\n        f.mode = function(_m) {\n            if (!arguments.length) {\n                return _mode;\n            }\n            _mode = _m;\n            resetCache();\n            return f;\n        };\n\n        f.range = function(colors, _pos) {\n            setColors(colors);\n            return f;\n        };\n\n        f.out = function(_o) {\n            _out = _o;\n            return f;\n        };\n\n        f.spread = function(val) {\n            if (!arguments.length) {\n                return _spread;\n            }\n            _spread = val;\n            return f;\n        };\n\n        f.correctLightness = function(v) {\n            if (v == null) { v = true; }\n            _correctLightness = v;\n            resetCache();\n            if (_correctLightness) {\n                tMapLightness = function(t) {\n                    var L0 = getColor(0, true).lab()[0];\n                    var L1 = getColor(1, true).lab()[0];\n                    var pol = L0 > L1;\n                    var L_actual = getColor(t, true).lab()[0];\n                    var L_ideal = L0 + ((L1 - L0) * t);\n                    var L_diff = L_actual - L_ideal;\n                    var t0 = 0;\n                    var t1 = 1;\n                    var max_iter = 20;\n                    while ((Math.abs(L_diff) > 1e-2) && (max_iter-- > 0)) {\n                        (function() {\n                            if (pol) { L_diff *= -1; }\n                            if (L_diff < 0) {\n                                t0 = t;\n                                t += (t1 - t) * 0.5;\n                            } else {\n                                t1 = t;\n                                t += (t0 - t) * 0.5;\n                            }\n                            L_actual = getColor(t, true).lab()[0];\n                            return L_diff = L_actual - L_ideal;\n                        })();\n                    }\n                    return t;\n                };\n            } else {\n                tMapLightness = function (t) { return t; };\n            }\n            return f;\n        };\n\n        f.padding = function(p) {\n            if (p != null) {\n                if (type$2(p) === 'number') {\n                    p = [p,p];\n                }\n                _padding = p;\n                return f;\n            } else {\n                return _padding;\n            }\n        };\n\n        f.colors = function(numColors, out) {\n            // If no arguments are given, return the original colors that were provided\n            if (arguments.length < 2) { out = 'hex'; }\n            var result = [];\n\n            if (arguments.length === 0) {\n                result = _colors.slice(0);\n\n            } else if (numColors === 1) {\n                result = [f(0.5)];\n\n            } else if (numColors > 1) {\n                var dm = _domain[0];\n                var dd = _domain[1] - dm;\n                result = __range__(0, numColors, false).map(function (i) { return f( dm + ((i/(numColors-1)) * dd) ); });\n\n            } else { // returns all colors based on the defined classes\n                colors = [];\n                var samples = [];\n                if (_classes && (_classes.length > 2)) {\n                    for (var i = 1, end = _classes.length, asc = 1 <= end; asc ? i < end : i > end; asc ? i++ : i--) {\n                        samples.push((_classes[i-1]+_classes[i])*0.5);\n                    }\n                } else {\n                    samples = _domain;\n                }\n                result = samples.map(function (v) { return f(v); });\n            }\n\n            if (chroma$4[out]) {\n                result = result.map(function (c) { return c[out](); });\n            }\n            return result;\n        };\n\n        f.cache = function(c) {\n            if (c != null) {\n                _useCache = c;\n                return f;\n            } else {\n                return _useCache;\n            }\n        };\n\n        f.gamma = function(g) {\n            if (g != null) {\n                _gamma = g;\n                return f;\n            } else {\n                return _gamma;\n            }\n        };\n\n        f.nodata = function(d) {\n            if (d != null) {\n                _nacol = chroma$4(d);\n                return f;\n            } else {\n                return _nacol;\n            }\n        };\n\n        return f;\n    };\n\n    function __range__(left, right, inclusive) {\n      var range = [];\n      var ascending = left < right;\n      var end = !inclusive ? right : ascending ? right + 1 : right - 1;\n      for (var i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n        range.push(i);\n      }\n      return range;\n    }\n\n    //\n    // interpolates between a set of colors uzing a bezier spline\n    //\n\n    // @requires utils lab\n    var Color$5 = Color_1;\n\n    var scale$1 = scale$2;\n\n    // nth row of the pascal triangle\n    var binom_row = function(n) {\n        var row = [1, 1];\n        for (var i = 1; i < n; i++) {\n            var newrow = [1];\n            for (var j = 1; j <= row.length; j++) {\n                newrow[j] = (row[j] || 0) + row[j - 1];\n            }\n            row = newrow;\n        }\n        return row;\n    };\n\n    var bezier = function(colors) {\n        var assign, assign$1, assign$2;\n\n        var I, lab0, lab1, lab2;\n        colors = colors.map(function (c) { return new Color$5(c); });\n        if (colors.length === 2) {\n            // linear interpolation\n            (assign = colors.map(function (c) { return c.lab(); }), lab0 = assign[0], lab1 = assign[1]);\n            I = function(t) {\n                var lab = ([0, 1, 2].map(function (i) { return lab0[i] + (t * (lab1[i] - lab0[i])); }));\n                return new Color$5(lab, 'lab');\n            };\n        } else if (colors.length === 3) {\n            // quadratic bezier interpolation\n            (assign$1 = colors.map(function (c) { return c.lab(); }), lab0 = assign$1[0], lab1 = assign$1[1], lab2 = assign$1[2]);\n            I = function(t) {\n                var lab = ([0, 1, 2].map(function (i) { return ((1-t)*(1-t) * lab0[i]) + (2 * (1-t) * t * lab1[i]) + (t * t * lab2[i]); }));\n                return new Color$5(lab, 'lab');\n            };\n        } else if (colors.length === 4) {\n            // cubic bezier interpolation\n            var lab3;\n            (assign$2 = colors.map(function (c) { return c.lab(); }), lab0 = assign$2[0], lab1 = assign$2[1], lab2 = assign$2[2], lab3 = assign$2[3]);\n            I = function(t) {\n                var lab = ([0, 1, 2].map(function (i) { return ((1-t)*(1-t)*(1-t) * lab0[i]) + (3 * (1-t) * (1-t) * t * lab1[i]) + (3 * (1-t) * t * t * lab2[i]) + (t*t*t * lab3[i]); }));\n                return new Color$5(lab, 'lab');\n            };\n        } else if (colors.length >= 5) {\n            // general case (degree n bezier)\n            var labs, row, n;\n            labs = colors.map(function (c) { return c.lab(); });\n            n = colors.length - 1;\n            row = binom_row(n);\n            I = function (t) {\n                var u = 1 - t;\n                var lab = ([0, 1, 2].map(function (i) { return labs.reduce(function (sum, el, j) { return (sum + row[j] * Math.pow( u, (n - j) ) * Math.pow( t, j ) * el[i]); }, 0); }));\n                return new Color$5(lab, 'lab');\n            };\n        } else {\n            throw new RangeError(\"No point in running bezier with only one color.\")\n        }\n        return I;\n    };\n\n    var bezier_1 = function (colors) {\n        var f = bezier(colors);\n        f.scale = function () { return scale$1(f); };\n        return f;\n    };\n\n    /*\n     * interpolates between a set of colors uzing a bezier spline\n     * blend mode formulas taken from http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n     */\n\n    var chroma$3 = chroma_1;\n\n    var blend = function (bottom, top, mode) {\n        if (!blend[mode]) {\n            throw new Error('unknown blend mode ' + mode);\n        }\n        return blend[mode](bottom, top);\n    };\n\n    var blend_f = function (f) { return function (bottom,top) {\n            var c0 = chroma$3(top).rgb();\n            var c1 = chroma$3(bottom).rgb();\n            return chroma$3.rgb(f(c0, c1));\n        }; };\n\n    var each = function (f) { return function (c0, c1) {\n            var out = [];\n            out[0] = f(c0[0], c1[0]);\n            out[1] = f(c0[1], c1[1]);\n            out[2] = f(c0[2], c1[2]);\n            return out;\n        }; };\n\n    var normal = function (a) { return a; };\n    var multiply = function (a,b) { return a * b / 255; };\n    var darken = function (a,b) { return a > b ? b : a; };\n    var lighten = function (a,b) { return a > b ? a : b; };\n    var screen = function (a,b) { return 255 * (1 - (1-a/255) * (1-b/255)); };\n    var overlay = function (a,b) { return b < 128 ? 2 * a * b / 255 : 255 * (1 - 2 * (1 - a / 255 ) * ( 1 - b / 255 )); };\n    var burn = function (a,b) { return 255 * (1 - (1 - b / 255) / (a/255)); };\n    var dodge = function (a,b) {\n        if (a === 255) { return 255; }\n        a = 255 * (b / 255) / (1 - a / 255);\n        return a > 255 ? 255 : a\n    };\n\n    // # add = (a,b) ->\n    // #     if (a + b > 255) then 255 else a + b\n\n    blend.normal = blend_f(each(normal));\n    blend.multiply = blend_f(each(multiply));\n    blend.screen = blend_f(each(screen));\n    blend.overlay = blend_f(each(overlay));\n    blend.darken = blend_f(each(darken));\n    blend.lighten = blend_f(each(lighten));\n    blend.dodge = blend_f(each(dodge));\n    blend.burn = blend_f(each(burn));\n    // blend.add = blend_f(each(add));\n\n    var blend_1 = blend;\n\n    // cubehelix interpolation\n    // based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n    // http://astron-soc.in/bulletin/11June/289392011.pdf\n\n    var type$1 = utils.type;\n    var clip_rgb = utils.clip_rgb;\n    var TWOPI = utils.TWOPI;\n    var pow$2 = Math.pow;\n    var sin$1 = Math.sin;\n    var cos$1 = Math.cos;\n    var chroma$2 = chroma_1;\n\n    var cubehelix = function(start, rotations, hue, gamma, lightness) {\n        if ( start === void 0 ) start=300;\n        if ( rotations === void 0 ) rotations=-1.5;\n        if ( hue === void 0 ) hue=1;\n        if ( gamma === void 0 ) gamma=1;\n        if ( lightness === void 0 ) lightness=[0,1];\n\n        var dh = 0, dl;\n        if (type$1(lightness) === 'array') {\n            dl = lightness[1] - lightness[0];\n        } else {\n            dl = 0;\n            lightness = [lightness, lightness];\n        }\n\n        var f = function(fract) {\n            var a = TWOPI * (((start+120)/360) + (rotations * fract));\n            var l = pow$2(lightness[0] + (dl * fract), gamma);\n            var h = dh !== 0 ? hue[0] + (fract * dh) : hue;\n            var amp = (h * l * (1-l)) / 2;\n            var cos_a = cos$1(a);\n            var sin_a = sin$1(a);\n            var r = l + (amp * ((-0.14861 * cos_a) + (1.78277* sin_a)));\n            var g = l + (amp * ((-0.29227 * cos_a) - (0.90649* sin_a)));\n            var b = l + (amp * (+1.97294 * cos_a));\n            return chroma$2(clip_rgb([r*255,g*255,b*255,1]));\n        };\n\n        f.start = function(s) {\n            if ((s == null)) { return start; }\n            start = s;\n            return f;\n        };\n\n        f.rotations = function(r) {\n            if ((r == null)) { return rotations; }\n            rotations = r;\n            return f;\n        };\n\n        f.gamma = function(g) {\n            if ((g == null)) { return gamma; }\n            gamma = g;\n            return f;\n        };\n\n        f.hue = function(h) {\n            if ((h == null)) { return hue; }\n            hue = h;\n            if (type$1(hue) === 'array') {\n                dh = hue[1] - hue[0];\n                if (dh === 0) { hue = hue[1]; }\n            } else {\n                dh = 0;\n            }\n            return f;\n        };\n\n        f.lightness = function(h) {\n            if ((h == null)) { return lightness; }\n            if (type$1(h) === 'array') {\n                lightness = h;\n                dl = h[1] - h[0];\n            } else {\n                lightness = [h,h];\n                dl = 0;\n            }\n            return f;\n        };\n\n        f.scale = function () { return chroma$2.scale(f); };\n\n        f.hue(hue);\n\n        return f;\n    };\n\n    var Color$4 = Color_1;\n    var digits = '0123456789abcdef';\n\n    var floor$1 = Math.floor;\n    var random = Math.random;\n\n    var random_1 = function () {\n        var code = '#';\n        for (var i=0; i<6; i++) {\n            code += digits.charAt(floor$1(random() * 16));\n        }\n        return new Color$4(code, 'hex');\n    };\n\n    var type = type$p;\n    var log = Math.log;\n    var pow$1 = Math.pow;\n    var floor = Math.floor;\n    var abs$1 = Math.abs;\n\n\n    var analyze = function (data, key) {\n        if ( key === void 0 ) key=null;\n\n        var r = {\n            min: Number.MAX_VALUE,\n            max: Number.MAX_VALUE*-1,\n            sum: 0,\n            values: [],\n            count: 0\n        };\n        if (type(data) === 'object') {\n            data = Object.values(data);\n        }\n        data.forEach(function (val) {\n            if (key && type(val) === 'object') { val = val[key]; }\n            if (val !== undefined && val !== null && !isNaN(val)) {\n                r.values.push(val);\n                r.sum += val;\n                if (val < r.min) { r.min = val; }\n                if (val > r.max) { r.max = val; }\n                r.count += 1;\n            }\n        });\n\n        r.domain = [r.min, r.max];\n\n        r.limits = function (mode, num) { return limits(r, mode, num); };\n\n        return r;\n    };\n\n\n    var limits = function (data, mode, num) {\n        if ( mode === void 0 ) mode='equal';\n        if ( num === void 0 ) num=7;\n\n        if (type(data) == 'array') {\n            data = analyze(data);\n        }\n        var min = data.min;\n        var max = data.max;\n        var values = data.values.sort(function (a,b) { return a-b; });\n\n        if (num === 1) { return [min,max]; }\n\n        var limits = [];\n\n        if (mode.substr(0,1) === 'c') { // continuous\n            limits.push(min);\n            limits.push(max);\n        }\n\n        if (mode.substr(0,1) === 'e') { // equal interval\n            limits.push(min);\n            for (var i=1; i<num; i++) {\n                limits.push(min+((i/num)*(max-min)));\n            }\n            limits.push(max);\n        }\n\n        else if (mode.substr(0,1) === 'l') { // log scale\n            if (min <= 0) {\n                throw new Error('Logarithmic scales are only possible for values > 0');\n            }\n            var min_log = Math.LOG10E * log(min);\n            var max_log = Math.LOG10E * log(max);\n            limits.push(min);\n            for (var i$1=1; i$1<num; i$1++) {\n                limits.push(pow$1(10, min_log + ((i$1/num) * (max_log - min_log))));\n            }\n            limits.push(max);\n        }\n\n        else if (mode.substr(0,1) === 'q') { // quantile scale\n            limits.push(min);\n            for (var i$2=1; i$2<num; i$2++) {\n                var p = ((values.length-1) * i$2)/num;\n                var pb = floor(p);\n                if (pb === p) {\n                    limits.push(values[pb]);\n                } else { // p > pb\n                    var pr = p - pb;\n                    limits.push((values[pb]*(1-pr)) + (values[pb+1]*pr));\n                }\n            }\n            limits.push(max);\n\n        }\n\n        else if (mode.substr(0,1) === 'k') { // k-means clustering\n            /*\n            implementation based on\n            http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n            simplified for 1-d input values\n            */\n            var cluster;\n            var n = values.length;\n            var assignments = new Array(n);\n            var clusterSizes = new Array(num);\n            var repeat = true;\n            var nb_iters = 0;\n            var centroids = null;\n\n            // get seed values\n            centroids = [];\n            centroids.push(min);\n            for (var i$3=1; i$3<num; i$3++) {\n                centroids.push(min + ((i$3/num) * (max-min)));\n            }\n            centroids.push(max);\n\n            while (repeat) {\n                // assignment step\n                for (var j=0; j<num; j++) {\n                    clusterSizes[j] = 0;\n                }\n                for (var i$4=0; i$4<n; i$4++) {\n                    var value = values[i$4];\n                    var mindist = Number.MAX_VALUE;\n                    var best = (void 0);\n                    for (var j$1=0; j$1<num; j$1++) {\n                        var dist = abs$1(centroids[j$1]-value);\n                        if (dist < mindist) {\n                            mindist = dist;\n                            best = j$1;\n                        }\n                        clusterSizes[best]++;\n                        assignments[i$4] = best;\n                    }\n                }\n\n                // update centroids step\n                var newCentroids = new Array(num);\n                for (var j$2=0; j$2<num; j$2++) {\n                    newCentroids[j$2] = null;\n                }\n                for (var i$5=0; i$5<n; i$5++) {\n                    cluster = assignments[i$5];\n                    if (newCentroids[cluster] === null) {\n                        newCentroids[cluster] = values[i$5];\n                    } else {\n                        newCentroids[cluster] += values[i$5];\n                    }\n                }\n                for (var j$3=0; j$3<num; j$3++) {\n                    newCentroids[j$3] *= 1/clusterSizes[j$3];\n                }\n\n                // check convergence\n                repeat = false;\n                for (var j$4=0; j$4<num; j$4++) {\n                    if (newCentroids[j$4] !== centroids[j$4]) {\n                        repeat = true;\n                        break;\n                    }\n                }\n\n                centroids = newCentroids;\n                nb_iters++;\n\n                if (nb_iters > 200) {\n                    repeat = false;\n                }\n            }\n\n            // finished k-means clustering\n            // the next part is borrowed from gabrielflor.it\n            var kClusters = {};\n            for (var j$5=0; j$5<num; j$5++) {\n                kClusters[j$5] = [];\n            }\n            for (var i$6=0; i$6<n; i$6++) {\n                cluster = assignments[i$6];\n                kClusters[cluster].push(values[i$6]);\n            }\n            var tmpKMeansBreaks = [];\n            for (var j$6=0; j$6<num; j$6++) {\n                tmpKMeansBreaks.push(kClusters[j$6][0]);\n                tmpKMeansBreaks.push(kClusters[j$6][kClusters[j$6].length-1]);\n            }\n            tmpKMeansBreaks = tmpKMeansBreaks.sort(function (a,b){ return a-b; });\n            limits.push(tmpKMeansBreaks[0]);\n            for (var i$7=1; i$7 < tmpKMeansBreaks.length; i$7+= 2) {\n                var v = tmpKMeansBreaks[i$7];\n                if (!isNaN(v) && (limits.indexOf(v) === -1)) {\n                    limits.push(v);\n                }\n            }\n        }\n        return limits;\n    };\n\n    var analyze_1 = {analyze: analyze, limits: limits};\n\n    var Color$3 = Color_1;\n\n\n    var contrast = function (a, b) {\n        // WCAG contrast ratio\n        // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n        a = new Color$3(a);\n        b = new Color$3(b);\n        var l1 = a.luminance();\n        var l2 = b.luminance();\n        return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n    };\n\n    var Color$2 = Color_1;\n    var sqrt = Math.sqrt;\n    var pow = Math.pow;\n    var min = Math.min;\n    var max = Math.max;\n    var atan2 = Math.atan2;\n    var abs = Math.abs;\n    var cos = Math.cos;\n    var sin = Math.sin;\n    var exp = Math.exp;\n    var PI = Math.PI;\n\n    var deltaE = function(a, b, Kl, Kc, Kh) {\n        if ( Kl === void 0 ) Kl=1;\n        if ( Kc === void 0 ) Kc=1;\n        if ( Kh === void 0 ) Kh=1;\n\n        // Delta E (CIE 2000)\n        // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n        var rad2deg = function(rad) {\n            return 360 * rad / (2 * PI);\n        };\n        var deg2rad = function(deg) {\n            return (2 * PI * deg) / 360;\n        };\n        a = new Color$2(a);\n        b = new Color$2(b);\n        var ref = Array.from(a.lab());\n        var L1 = ref[0];\n        var a1 = ref[1];\n        var b1 = ref[2];\n        var ref$1 = Array.from(b.lab());\n        var L2 = ref$1[0];\n        var a2 = ref$1[1];\n        var b2 = ref$1[2];\n        var avgL = (L1 + L2)/2;\n        var C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n        var C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n        var avgC = (C1 + C2)/2;\n        var G = 0.5*(1-sqrt(pow(avgC, 7)/(pow(avgC, 7) + pow(25, 7))));\n        var a1p = a1*(1+G);\n        var a2p = a2*(1+G);\n        var C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n        var C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n        var avgCp = (C1p + C2p)/2;\n        var arctan1 = rad2deg(atan2(b1, a1p));\n        var arctan2 = rad2deg(atan2(b2, a2p));\n        var h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n        var h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n        var avgHp = abs(h1p - h2p) > 180 ? (h1p + h2p + 360)/2 : (h1p + h2p)/2;\n        var T = 1 - 0.17*cos(deg2rad(avgHp - 30)) + 0.24*cos(deg2rad(2*avgHp)) + 0.32*cos(deg2rad(3*avgHp + 6)) - 0.2*cos(deg2rad(4*avgHp - 63));\n        var deltaHp = h2p - h1p;\n        deltaHp = abs(deltaHp) <= 180 ? deltaHp : h2p <= h1p ? deltaHp + 360 : deltaHp - 360;\n        deltaHp = 2*sqrt(C1p*C2p)*sin(deg2rad(deltaHp)/2);\n        var deltaL = L2 - L1;\n        var deltaCp = C2p - C1p;    \n        var sl = 1 + (0.015*pow(avgL - 50, 2))/sqrt(20 + pow(avgL - 50, 2));\n        var sc = 1 + 0.045*avgCp;\n        var sh = 1 + 0.015*avgCp*T;\n        var deltaTheta = 30*exp(-pow((avgHp - 275)/25, 2));\n        var Rc = 2*sqrt(pow(avgCp, 7)/(pow(avgCp, 7) + pow(25, 7)));\n        var Rt = -Rc*sin(2*deg2rad(deltaTheta));\n        var result = sqrt(pow(deltaL/(Kl*sl), 2) + pow(deltaCp/(Kc*sc), 2) + pow(deltaHp/(Kh*sh), 2) + Rt*(deltaCp/(Kc*sc))*(deltaHp/(Kh*sh)));\n        return max(0, min(100, result));\n    };\n\n    var Color$1 = Color_1;\n\n    // simple Euclidean distance\n    var distance = function(a, b, mode) {\n        if ( mode === void 0 ) mode='lab';\n\n        // Delta E (CIE 1976)\n        // see http://www.brucelindbloom.com/index.html?Equations.html\n        a = new Color$1(a);\n        b = new Color$1(b);\n        var l1 = a.get(mode);\n        var l2 = b.get(mode);\n        var sum_sq = 0;\n        for (var i in l1) {\n            var d = (l1[i] || 0) - (l2[i] || 0);\n            sum_sq += d*d;\n        }\n        return Math.sqrt(sum_sq);\n    };\n\n    var Color = Color_1;\n\n    var valid = function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        try {\n            new (Function.prototype.bind.apply( Color, [ null ].concat( args) ));\n            return true;\n        } catch (e) {\n            return false;\n        }\n    };\n\n    // some pre-defined color scales:\n    var chroma$1 = chroma_1;\n\n    var scale = scale$2;\n\n    var scales = {\n    \tcool: function cool() { return scale([chroma$1.hsl(180,1,.9), chroma$1.hsl(250,.7,.4)]) },\n    \thot: function hot() { return scale(['#000','#f00','#ff0','#fff']).mode('rgb') }\n    };\n\n    /**\n        ColorBrewer colors for chroma.js\n\n        Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n        Pennsylvania State University.\n\n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at\n        http://www.apache.org/licenses/LICENSE-2.0\n\n        Unless required by applicable law or agreed to in writing, software distributed\n        under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n        CONDITIONS OF ANY KIND, either express or implied. See the License for the\n        specific language governing permissions and limitations under the License.\n    */\n\n    var colorbrewer = {\n        // sequential\n        OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n        PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n        BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n        Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n        BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n        YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n        YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n        Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n        RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n        Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n        YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n        Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n        GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n        Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n        YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n        PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n        Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n        PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n        Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n        // diverging\n\n        Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n        RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n        RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n        PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n        PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n        RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n        BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n        RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n        PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n        // qualitative\n\n        Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n        Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n        Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n        Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n        Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n        Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n        Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n        Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2'],\n    };\n\n    // add lowercase aliases for case-insensitive matches\n    for (var i = 0, list = Object.keys(colorbrewer); i < list.length; i += 1) {\n        var key = list[i];\n\n        colorbrewer[key.toLowerCase()] = colorbrewer[key];\n    }\n\n    var colorbrewer_1 = colorbrewer;\n\n    var chroma = chroma_1;\n\n    // feel free to comment out anything to rollup\n    // a smaller chroma.js built\n\n    // io --> convert colors\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    // operators --> modify existing Colors\n\n\n\n\n\n\n\n\n\n\n    // interpolators\n\n\n\n\n\n\n\n\n\n\n\n\n    // generators -- > create new colors\n    chroma.average = average;\n    chroma.bezier = bezier_1;\n    chroma.blend = blend_1;\n    chroma.cubehelix = cubehelix;\n    chroma.mix = chroma.interpolate = mix$1;\n    chroma.random = random_1;\n    chroma.scale = scale$2;\n\n    // other utility methods\n    chroma.analyze = analyze_1.analyze;\n    chroma.contrast = contrast;\n    chroma.deltaE = deltaE;\n    chroma.distance = distance;\n    chroma.limits = analyze_1.limits;\n    chroma.valid = valid;\n\n    // scale\n    chroma.scales = scales;\n\n    // colors\n    chroma.colors = w3cx11_1;\n    chroma.brewer = colorbrewer_1;\n\n    var chroma_js = chroma;\n\n    return chroma_js;\n\n}));\n","import { xBoxPlot } from 'ml-spectra-processing';\n\n/**\n * @private\n * @param {object} normalizedData\n * @returns {x:[],q1:[],q3:[],media:[],min:[],max:[]}\n */\n\nexport function getBoxPlotData(normalizedData) {\n  const { x, matrix } = normalizedData;\n  let nbRow = matrix.length;\n  let nbColumn = matrix[0].length;\n  let result;\n  let aColumn = new Float64Array(nbRow);\n  for (let column = 0; column < nbColumn; column++) {\n    for (let row = 0; row < nbRow; row++) {\n      aColumn[row] = matrix[row][column];\n    }\n    let info = xBoxPlot(aColumn);\n    if (!result) {\n      result = { x };\n      for (let key in info) {\n        result[key] = [];\n      }\n    }\n    for (let key in info) {\n      result[key].push(info[key]);\n    }\n  }\n  return result;\n}\n","import chroma from 'chroma-js';\nimport { Matrix } from 'ml-matrix';\nimport { xMinMaxValues } from 'ml-spectra-processing';\n\nimport { getBoxPlotData } from '../spectra/getBoxPlotData';\n\nexport function getBoxPlotChart(normalizedData, options = {}) {\n  const {\n    q13FillColor = '#000',\n    q13FillOpacity = 0.3,\n    medianStrokeColor = '',\n    medianStrokeWidth = 3,\n    minMaxFillColor = '#000',\n    minMaxFillOpacity = 0.15,\n  } = options;\n  let annotations = [];\n\n  const boxPlotData = getBoxPlotData(normalizedData);\n\n  if (q13FillOpacity && q13FillColor) {\n    let q13 = [];\n    for (let i = 0; i < boxPlotData.x.length; i++) {\n      q13.push({\n        x: boxPlotData.x[i],\n        y: boxPlotData.q1[i],\n      });\n    }\n    for (let i = boxPlotData.x.length - 1; i >= 0; i--) {\n      q13.push({\n        x: boxPlotData.x[i],\n        y: boxPlotData.q3[i],\n      });\n    }\n    annotations.push({\n      type: 'polygon',\n      layer: 0,\n      properties: {\n        fillColor: q13FillColor,\n        fillOpacity: q13FillOpacity,\n        strokeWidth: 0.0000001,\n        position: q13,\n      },\n    });\n  }\n\n  if (minMaxFillColor && minMaxFillOpacity) {\n    let minMax = [];\n    for (let i = 0; i < boxPlotData.x.length; i++) {\n      minMax.push({\n        x: boxPlotData.x[i],\n        y: boxPlotData.min[i],\n      });\n    }\n    for (let i = boxPlotData.x.length - 1; i >= 0; i--) {\n      minMax.push({\n        x: boxPlotData.x[i],\n        y: boxPlotData.max[i],\n      });\n    }\n\n    annotations.push({\n      type: 'polygon',\n      layer: 0,\n      properties: {\n        fillColor: minMaxFillColor,\n        fillOpacity: minMaxFillOpacity,\n        strokeWidth: 0.0000001,\n        strokeColor: '#FFF',\n        position: minMax,\n      },\n    });\n  }\n\n  let colorSpectrum = {\n    type: 'color',\n    data: {\n      x: boxPlotData.x,\n      y: boxPlotData.median,\n      color: medianStrokeColor\n        ? new Array(boxPlotData.x.length).fill(medianStrokeColor)\n        : getColors(normalizedData.matrix),\n    },\n    styles: {\n      unselected: {\n        lineWidth: medianStrokeWidth,\n        lineStyle: 1,\n      },\n      selected: {\n        lineWidth: medianStrokeWidth,\n        lineStyle: 1,\n      },\n    },\n    annotations,\n  };\n\n  return colorSpectrum;\n}\n\nfunction getColors(dataset) {\n  const matrix = new Matrix(dataset);\n  const stdevs = matrix.standardDeviation('column');\n  const { min, max } = xMinMaxValues(stdevs);\n  const colorCallback = chroma\n    .scale(['blue', 'cyan', 'yellow', 'red'])\n    .domain([min, max])\n    .mode('lch');\n\n  const colors = stdevs.map((y) => `rgb(${colorCallback(y).rgb().join()})`);\n  return colors;\n}\n","export function addChartDataStyle(data, spectrum) {\n  data.styles = {\n    unselected: {\n      lineColor: spectrum.meta.color || 'darkgrey',\n      lineWidth: 1,\n      lineStyle: 1,\n    },\n    selected: {\n      lineColor: spectrum.meta.color || 'darkgrey',\n      lineWidth: 3,\n      lineStyle: 1,\n    },\n  };\n  data.label = spectrum.meta.id || spectrum.id;\n}\n","/**\n * @private\n * @param {*} spectra\n * @param {object} [options={}]\n * @param {Array} [options.ids] ids of selected spectra\n */\n\nexport function getNormalizedData(spectra, options = {}) {\n  const { ids } = options;\n\n  let matrix = [];\n  let meta = [];\n  let currentIDs = [];\n  let x = [];\n\n  if (Array.isArray(spectra) && spectra.length > 0) {\n    for (let spectrum of spectra) {\n      if (!ids || ids.includes(spectrum.id)) {\n        currentIDs.push(spectrum.id);\n        matrix.push(spectrum.normalized.y);\n        meta.push(spectrum.meta);\n      }\n    }\n    x = spectra[0].normalized.x;\n  }\n\n  return { ids: currentIDs, matrix, meta, x };\n}\n","/**\n * @private\n * @param {Array<object>} [metadata]\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {string} [options.propertyName=\"category\"]\n */\n\nexport function getCategoriesStats(metadata, options = {}) {\n  const { propertyName = 'category' } = options;\n  let categories = {};\n  let classNumber = 0;\n  for (let metadatum of metadata) {\n    let value = metadatum[propertyName];\n    if (!categories[value]) {\n      categories[value] = {\n        classNumber: classNumber++,\n        counter: 0,\n      };\n    }\n    categories[value].counter++;\n  }\n  return categories;\n}\n","import isutf8 from 'isutf8';\n/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        const { encoding = guessEncoding(blob) } = options;\n        const decoder = new TextDecoder(encoding);\n        return decoder.decode(blob);\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction guessEncoding(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return 'utf-16be';\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return 'utf-16le';\n        }\n    }\n    //@ts-expect-error an ArrayBuffer is also ok\n    if (!isutf8(blob))\n        return 'latin1';\n    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","/*\n    https://tools.ietf.org/html/rfc3629\n\n    UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4\n\n    UTF8-1    = %x00-7F\n\n    UTF8-2    = %xC2-DF UTF8-tail\n\n    UTF8-3    = %xE0 %xA0-BF UTF8-tail\n                %xE1-EC 2( UTF8-tail )\n                %xED %x80-9F UTF8-tail\n                %xEE-EF 2( UTF8-tail )\n\n    UTF8-4    = %xF0 %x90-BF 2( UTF8-tail )\n                %xF1-F3 3( UTF8-tail )\n                %xF4 %x80-8F 2( UTF8-tail )\n\n    UTF8-tail = %x80-BF\n*/\n/**\n * Check if a Node.js Buffer or Uint8Array is UTF-8.\n */\nfunction isUtf8(buf) {\n    if (!buf) {\n        return false;\n    }\n    var i = 0;\n    var len = buf.length;\n    while (i < len) {\n        // UTF8-1 = %x00-7F\n        if (buf[i] <= 0x7F) {\n            i++;\n            continue;\n        }\n        // UTF8-2 = %xC2-DF UTF8-tail\n        if (buf[i] >= 0xC2 && buf[i] <= 0xDF) {\n            // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n            if (buf[i + 1] >> 6 === 2) {\n                i += 2;\n                continue;\n            }\n            else {\n                return false;\n            }\n        }\n        // UTF8-3 = %xE0 %xA0-BF UTF8-tail\n        // UTF8-3 = %xED %x80-9F UTF8-tail\n        if (((buf[i] === 0xE0 && buf[i + 1] >= 0xA0 && buf[i + 1] <= 0xBF) ||\n            (buf[i] === 0xED && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x9F)) && buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-3 = %xE1-EC 2( UTF8-tail )\n        // UTF8-3 = %xEE-EF 2( UTF8-tail )\n        if (((buf[i] >= 0xE1 && buf[i] <= 0xEC) ||\n            (buf[i] >= 0xEE && buf[i] <= 0xEF)) &&\n            buf[i + 1] >> 6 === 2 &&\n            buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n        //          %xF1-F3 3( UTF8-tail )\n        //          %xF4 %x80-8F 2( UTF8-tail )\n        if (((buf[i] === 0xF0 && buf[i + 1] >= 0x90 && buf[i + 1] <= 0xBF) ||\n            (buf[i] >= 0xF1 && buf[i] <= 0xF3 && buf[i + 1] >> 6 === 2) ||\n            (buf[i] === 0xF4 && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x8F)) &&\n            buf[i + 2] >> 6 === 2 &&\n            buf[i + 3] >> 6 === 2) {\n            i += 4;\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\n\nexport { isUtf8 as default };\n","/**\n * Dynamically type a string\n * @param {string} value String to dynamically type\n * @returns {boolean|string|number}\n */\nexport function parseString(value) {\n  if (value.length === 4 || value.length === 5) {\n    let lowercase = value.toLowerCase();\n\n    if (lowercase === 'true') return true;\n    if (lowercase === 'false') return false;\n  }\n  let number = Number(value);\n  if (number === 0 && !value.includes('0')) {\n    return value;\n  }\n  if (!Number.isNaN(number)) return number;\n  return value;\n}\n","const GC_MS_FIELDS = ['TIC', '.RIC', 'SCANNUMBER'];\nexport function complexChromatogram(result) {\n    let spectra = result.spectra;\n    let length = spectra.length;\n    let chromatogram = {\n        times: new Array(length),\n        series: {\n            ms: {\n                dimension: 2,\n                data: new Array(length),\n            },\n        },\n    };\n    let existingGCMSFields = [];\n    for (let i = 0; i < GC_MS_FIELDS.length; i++) {\n        let label = convertMSFieldToLabel(GC_MS_FIELDS[i]);\n        if (spectra[0][label]) {\n            existingGCMSFields.push(label);\n            chromatogram.series[label] = {\n                dimension: 1,\n                data: new Array(length),\n            };\n        }\n    }\n    for (let i = 0; i < length; i++) {\n        let spectrum = spectra[i];\n        chromatogram.times[i] = spectrum.pageValue;\n        for (let j = 0; j < existingGCMSFields.length; j++) {\n            chromatogram.series[existingGCMSFields[j]].data[i] = Number(spectrum[existingGCMSFields[j]]);\n        }\n        if (spectrum.data) {\n            chromatogram.series.ms.data[i] = [spectrum.data.x, spectrum.data.y];\n        }\n    }\n    result.chromatogram = chromatogram;\n}\nexport function isMSField(canonicDataLabel) {\n    return GC_MS_FIELDS.indexOf(canonicDataLabel) !== -1;\n}\nexport function convertMSFieldToLabel(value) {\n    return value.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n//# sourceMappingURL=complexChromatogram.js.map","export default function convertToFloatArray(stringArray) {\n    let floatArray = [];\n    for (let i = 0; i < stringArray.length; i++) {\n        floatArray.push(Number(stringArray[i]));\n    }\n    return floatArray;\n}\n//# sourceMappingURL=convertToFloatArray.js.map","export default function fastParseXYData(spectrum, value) {\n    // TODO need to deal with result\n    //  console.log(value);\n    // we check if deltaX is defined otherwise we calculate it\n    let yFactor = spectrum.yFactor;\n    let deltaX = spectrum.deltaX;\n    spectrum.isXYdata = true;\n    let currentData = { x: [], y: [] };\n    spectrum.data = currentData;\n    let currentX = spectrum.firstX;\n    let currentY = spectrum.firstY;\n    // we skip the first line\n    //\n    let endLine = false;\n    let ascii;\n    let i = 0;\n    for (; i < value.length; i++) {\n        ascii = value.charCodeAt(i);\n        if (ascii === 13 || ascii === 10) {\n            endLine = true;\n        }\n        else {\n            if (endLine)\n                break;\n        }\n    }\n    // we proceed taking the i after the first line\n    let newLine = true;\n    let isDifference = false;\n    let isLastDifference = false;\n    let lastDifference = 0;\n    let isDuplicate = false;\n    let inComment = false;\n    let currentValue = 0; // can be a difference or a duplicate\n    let lastValue = 0; // must be the real last value\n    let isNegative = false;\n    let inValue = false;\n    let skipFirstValue = false;\n    let decimalPosition = 0;\n    for (; i <= value.length; i++) {\n        if (i === value.length)\n            ascii = 13;\n        else\n            ascii = value.charCodeAt(i);\n        if (inComment) {\n            // we should ignore the text if we are after $$\n            if (ascii === 13 || ascii === 10) {\n                newLine = true;\n                inComment = false;\n            }\n        }\n        else {\n            // when is it a new value ?\n            // when it is not a digit, . or comma\n            // it is a number that is either new or we continue\n            if (ascii <= 57 && ascii >= 48) {\n                // a number\n                inValue = true;\n                if (decimalPosition > 0) {\n                    currentValue += (ascii - 48) / Math.pow(10, decimalPosition++);\n                }\n                else {\n                    currentValue *= 10;\n                    currentValue += ascii - 48;\n                }\n            }\n            else if (ascii === 44 || ascii === 46) {\n                // a \",\" or \".\"\n                inValue = true;\n                decimalPosition++;\n            }\n            else {\n                if (inValue) {\n                    // need to process the previous value\n                    if (newLine) {\n                        newLine = false; // we don't check the X value\n                        // console.log(\"NEW LINE\",isDifference, lastDifference);\n                        // if new line and lastDifference, the first value is just a check !\n                        // that we don't check ...\n                        if (isLastDifference)\n                            skipFirstValue = true;\n                    }\n                    else {\n                        // need to deal with duplicate and differences\n                        if (skipFirstValue) {\n                            skipFirstValue = false;\n                        }\n                        else {\n                            if (isDifference) {\n                                lastDifference = isNegative ? 0 - currentValue : currentValue;\n                                isLastDifference = true;\n                                isDifference = false;\n                            }\n                            else if (!isDuplicate) {\n                                lastValue = isNegative ? 0 - currentValue : currentValue;\n                            }\n                            let duplicate = isDuplicate ? currentValue - 1 : 1;\n                            for (let j = 0; j < duplicate; j++) {\n                                if (isLastDifference) {\n                                    currentY += lastDifference;\n                                }\n                                else {\n                                    currentY = lastValue;\n                                }\n                                currentData.x.push(currentX);\n                                currentData.y.push(currentY * yFactor);\n                                currentX += deltaX;\n                            }\n                        }\n                    }\n                    isNegative = false;\n                    currentValue = 0;\n                    decimalPosition = 0;\n                    inValue = false;\n                    isDuplicate = false;\n                }\n                // positive SQZ digits @ A B C D E F G H I (ascii 64-73)\n                if (ascii < 74 && ascii > 63) {\n                    inValue = true;\n                    isLastDifference = false;\n                    currentValue = ascii - 64;\n                }\n                else if (ascii > 96 && ascii < 106) {\n                    // negative SQZ digits a b c d e f g h i (ascii 97-105)\n                    inValue = true;\n                    isLastDifference = false;\n                    currentValue = ascii - 96;\n                    isNegative = true;\n                }\n                else if (ascii === 115) {\n                    // DUP digits S T U V W X Y Z s (ascii 83-90, 115)\n                    inValue = true;\n                    isDuplicate = true;\n                    currentValue = 9;\n                }\n                else if (ascii > 82 && ascii < 91) {\n                    inValue = true;\n                    isDuplicate = true;\n                    currentValue = ascii - 82;\n                }\n                else if (ascii > 73 && ascii < 83) {\n                    // positive DIF digits % J K L M N O P Q R (ascii 37, 74-82)\n                    inValue = true;\n                    isDifference = true;\n                    currentValue = ascii - 73;\n                }\n                else if (ascii > 105 && ascii < 115) {\n                    // negative DIF digits j k l m n o p q r (ascii 106-114)\n                    inValue = true;\n                    isDifference = true;\n                    currentValue = ascii - 105;\n                    isNegative = true;\n                }\n                else if (ascii === 36 && value.charCodeAt(i + 1) === 36) {\n                    // $ sign, we need to check the next one\n                    inValue = true;\n                    inComment = true;\n                }\n                else if (ascii === 37) {\n                    // positive DIF digits % J K L M N O P Q R (ascii 37, 74-82)\n                    inValue = true;\n                    isDifference = true;\n                    currentValue = 0;\n                    isNegative = false;\n                }\n                else if (ascii === 45) {\n                    // a \"-\"\n                    // check if after there is a number, decimal or comma\n                    let ascii2 = value.charCodeAt(i + 1);\n                    if ((ascii2 >= 48 && ascii2 <= 57) ||\n                        ascii2 === 44 ||\n                        ascii2 === 46) {\n                        inValue = true;\n                        if (!newLine)\n                            isLastDifference = false;\n                        isNegative = true;\n                    }\n                }\n                else if (ascii === 13 || ascii === 10) {\n                    newLine = true;\n                    inComment = false;\n                }\n                // and now analyse the details ... space or tabulation\n                // if \"+\" we just don't care\n            }\n        }\n    }\n}\n//# sourceMappingURL=fastParseXYData.js.map","const removeCommentRegExp = /\\$\\$.*/;\nconst peakTableSplitRegExp = /[,\\t ]+/;\nexport default function parsePeakTable(spectrum, value, result) {\n    spectrum.isPeaktable = true;\n    if (!spectrum.variables || Object.keys(spectrum.variables) === 2) {\n        parseXY(spectrum, value, result);\n    }\n    else {\n        parseXYZ(spectrum, value, result);\n    }\n    // we will add the data in the variables\n    if (spectrum.variables) {\n        for (let key in spectrum.variables) {\n            spectrum.variables[key].data = spectrum.data[key];\n        }\n    }\n}\nfunction parseXY(spectrum, value, result) {\n    let currentData = { x: [], y: [] };\n    spectrum.data = currentData;\n    // counts for around 20% of the time\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n    for (let i = 1; i < lines.length; i++) {\n        let values = lines[i]\n            .trim()\n            .replace(removeCommentRegExp, '')\n            .split(peakTableSplitRegExp);\n        if (values.length % 2 === 0) {\n            for (let j = 0; j < values.length; j = j + 2) {\n                // takes around 40% of the time to add and parse the 2 values nearly exclusively because of Number\n                currentData.x.push(Number(values[j]) * spectrum.xFactor);\n                currentData.y.push(Number(values[j + 1]) * spectrum.yFactor);\n            }\n        }\n        else {\n            result.logs.push(`Format error: ${values}`);\n        }\n    }\n}\nfunction parseXYZ(spectrum, value, result) {\n    let currentData = {};\n    let variables = Object.keys(spectrum.variables);\n    let numberOfVariables = variables.length;\n    variables.forEach((variable) => (currentData[variable] = []));\n    spectrum.data = currentData;\n    // counts for around 20% of the time\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n    for (let i = 1; i < lines.length; i++) {\n        let values = lines[i]\n            .trim()\n            .replace(removeCommentRegExp, '')\n            .split(peakTableSplitRegExp);\n        if (values.length % numberOfVariables === 0) {\n            for (let j = 0; j < values.length; j++) {\n                // todo should try to find a xFactor (y, ...)\n                currentData[variables[j % numberOfVariables]].push(Number(values[j]));\n            }\n        }\n        else {\n            result.logs.push(`Format error: ${values}`);\n        }\n    }\n}\n//# sourceMappingURL=parsePeakTable.js.map","export default function parseXYA(spectrum, value) {\n    let removeSymbolRegExp = /(\\(+|\\)+|<+|>+|\\s+)/g;\n    spectrum.isXYAdata = true;\n    let values;\n    let currentData = { x: [], y: [] };\n    spectrum.data = currentData;\n    let lines = value.split(/,? *,?[;\\r\\n]+ */);\n    for (let i = 1; i < lines.length; i++) {\n        values = lines[i].trim().replace(removeSymbolRegExp, '').split(',');\n        currentData.x.push(Number(values[0]));\n        currentData.y.push(Number(values[1]));\n    }\n}\n//# sourceMappingURL=parseXYA.js.map","import { isAnyArray } from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n\nfunction median(input) {\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  return quickSelectMedian(input.slice());\n}\n\nexport { median as default };\n","import convertTo3DZ from './convertTo3DZ';\nimport generateContourLines from './generateContourLines';\nexport default function add2D(result, options) {\n    let zData = convertTo3DZ(result.spectra);\n    if (!options.noContour) {\n        result.contourLines = generateContourLines(zData, options);\n        delete zData.z;\n    }\n    result.minMax = zData;\n}\n//# sourceMappingURL=add2D.js.map","import getMedian from 'ml-array-median';\nexport default function convertTo3DZ(spectra) {\n    let minZ = spectra[0].data.y[0];\n    let maxZ = minZ;\n    let ySize = spectra.length;\n    let xSize = spectra[0].data.x.length;\n    let z = new Array(ySize);\n    for (let i = 0; i < ySize; i++) {\n        z[i] = spectra[i].data.y;\n        for (let j = 0; j < xSize; j++) {\n            let value = z[i][j];\n            if (value < minZ)\n                minZ = value;\n            if (value > maxZ)\n                maxZ = value;\n        }\n    }\n    const firstX = spectra[0].data.x[0];\n    const lastX = spectra[0].data.x[spectra[0].data.x.length - 1]; // has to be -2 because it is a 1D array [x,y,x,y,...]\n    const firstY = spectra[0].pageValue;\n    const lastY = spectra[ySize - 1].pageValue;\n    // Because the min / max value are the only information about the matrix if we invert\n    // min and max we need to invert the array\n    if (firstX > lastX) {\n        for (let spectrum of z) {\n            spectrum.reverse();\n        }\n    }\n    if (firstY > lastY) {\n        z.reverse();\n    }\n    const medians = [];\n    for (let i = 0; i < z.length; i++) {\n        const row = Float64Array.from(z[i]);\n        for (let i = 0; i < row.length; i++) {\n            if (row[i] < 0)\n                row[i] = -row[i];\n        }\n        medians.push(getMedian(row));\n    }\n    const median = getMedian(medians);\n    return {\n        z: z,\n        minX: Math.min(firstX, lastX),\n        maxX: Math.max(firstX, lastX),\n        minY: Math.min(firstY, lastY),\n        maxY: Math.max(firstY, lastY),\n        minZ: minZ,\n        maxZ: maxZ,\n        noise: median,\n    };\n}\n//# sourceMappingURL=convertTo3DZ.js.map","export default function generateContourLines(zData, options) {\n    let noise = zData.noise;\n    let z = zData.z;\n    let povarHeight0, povarHeight1, povarHeight2, povarHeight3;\n    let isOver0, isOver1, isOver2, isOver3;\n    let nbSubSpectra = z.length;\n    let nbPovars = z[0].length;\n    let pAx, pAy, pBx, pBy;\n    let x0 = zData.minX;\n    let xN = zData.maxX;\n    let dx = (xN - x0) / (nbPovars - 1);\n    let y0 = zData.minY;\n    let yN = zData.maxY;\n    let dy = (yN - y0) / (nbSubSpectra - 1);\n    let minZ = zData.minZ;\n    let maxZ = zData.maxZ;\n    // System.out.prvarln('y0 '+y0+' yN '+yN);\n    // -------------------------\n    // Povars attribution\n    //\n    // 0----1\n    // |  / |\n    // | /  |\n    // 2----3\n    //\n    // ---------------------d------\n    let iter = options.nbContourLevels * 2;\n    let contourLevels = new Array(iter);\n    let lineZValue;\n    for (let level = 0; level < iter; level++) {\n        // multiply by 2 for positif and negatif\n        let contourLevel = {};\n        contourLevels[level] = contourLevel;\n        let side = level % 2;\n        let factor = (maxZ - options.noiseMultiplier * noise) *\n            Math.exp((level >> 1) - options.nbContourLevels);\n        if (side === 0) {\n            lineZValue = factor + options.noiseMultiplier * noise;\n        }\n        else {\n            lineZValue = 0 - factor - options.noiseMultiplier * noise;\n        }\n        let lines = [];\n        contourLevel.zValue = lineZValue;\n        contourLevel.lines = lines;\n        if (lineZValue <= minZ || lineZValue >= maxZ)\n            continue;\n        for (let iSubSpectra = 0; iSubSpectra < nbSubSpectra - 1; iSubSpectra++) {\n            let subSpectra = z[iSubSpectra];\n            let subSpectraAfter = z[iSubSpectra + 1];\n            for (let povar = 0; povar < nbPovars - 1; povar++) {\n                povarHeight0 = subSpectra[povar];\n                povarHeight1 = subSpectra[povar + 1];\n                povarHeight2 = subSpectraAfter[povar];\n                povarHeight3 = subSpectraAfter[povar + 1];\n                isOver0 = povarHeight0 > lineZValue;\n                isOver1 = povarHeight1 > lineZValue;\n                isOver2 = povarHeight2 > lineZValue;\n                isOver3 = povarHeight3 > lineZValue;\n                // Example povar0 is over the plane and povar1 and\n                // povar2 are below, we find the varersections and add\n                // the segment\n                if (isOver0 !== isOver1 && isOver0 !== isOver2) {\n                    pAx =\n                        povar + (lineZValue - povarHeight0) / (povarHeight1 - povarHeight0);\n                    pAy = iSubSpectra;\n                    pBx = povar;\n                    pBy =\n                        iSubSpectra +\n                            (lineZValue - povarHeight0) / (povarHeight2 - povarHeight0);\n                    lines.push(pAx * dx + x0);\n                    lines.push(pAy * dy + y0);\n                    lines.push(pBx * dx + x0);\n                    lines.push(pBy * dy + y0);\n                }\n                // remove push does not help !!!!\n                if (isOver3 !== isOver1 && isOver3 !== isOver2) {\n                    pAx = povar + 1;\n                    pAy =\n                        iSubSpectra +\n                            1 -\n                            (lineZValue - povarHeight3) / (povarHeight1 - povarHeight3);\n                    pBx =\n                        povar +\n                            1 -\n                            (lineZValue - povarHeight3) / (povarHeight2 - povarHeight3);\n                    pBy = iSubSpectra + 1;\n                    lines.push(pAx * dx + x0);\n                    lines.push(pAy * dy + y0);\n                    lines.push(pBx * dx + x0);\n                    lines.push(pBy * dy + y0);\n                }\n                // test around the diagonal\n                if (isOver1 !== isOver2) {\n                    pAx =\n                        (povar +\n                            1 -\n                            (lineZValue - povarHeight1) / (povarHeight2 - povarHeight1)) *\n                            dx +\n                            x0;\n                    pAy =\n                        (iSubSpectra +\n                            (lineZValue - povarHeight1) / (povarHeight2 - povarHeight1)) *\n                            dy +\n                            y0;\n                    if (isOver1 !== isOver0) {\n                        pBx =\n                            povar +\n                                1 -\n                                (lineZValue - povarHeight1) / (povarHeight0 - povarHeight1);\n                        pBy = iSubSpectra;\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                    if (isOver2 !== isOver0) {\n                        pBx = povar;\n                        pBy =\n                            iSubSpectra +\n                                1 -\n                                (lineZValue - povarHeight2) / (povarHeight0 - povarHeight2);\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                    if (isOver1 !== isOver3) {\n                        pBx = povar + 1;\n                        pBy =\n                            iSubSpectra +\n                                (lineZValue - povarHeight1) / (povarHeight3 - povarHeight1);\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                    if (isOver2 !== isOver3) {\n                        pBx =\n                            povar +\n                                (lineZValue - povarHeight2) / (povarHeight3 - povarHeight2);\n                        pBy = iSubSpectra + 1;\n                        lines.push(pAx);\n                        lines.push(pAy);\n                        lines.push(pBx * dx + x0);\n                        lines.push(pBy * dy + y0);\n                    }\n                }\n            }\n        }\n    }\n    return {\n        minX: zData.minX,\n        maxX: zData.maxX,\n        minY: zData.minY,\n        maxY: zData.maxY,\n        segments: contourLevels,\n    };\n}\n//# sourceMappingURL=generateContourLines.js.map","export const gyromagneticRatio = {\n    '1H': 267.52218744e6,\n    '2H': 41.065e6,\n    '3H': 285.3508e6,\n    '3He': -203.789e6,\n    '7Li': 103.962e6,\n    '13C': 67.28284e6,\n    '14N': 19.331e6,\n    '15N': -27.116e6,\n    '17O': -36.264e6,\n    '19F': 251.662e6,\n    '23Na': 70.761e6,\n    '27Al': 69.763e6,\n    '29Si': -53.19e6,\n    '31P': 108.291e6,\n    '57Fe': 8.681e6,\n    '63Cu': 71.118e6,\n    '67Zn': 16.767e6,\n    '129Xe': -73.997e6,\n};\n//# sourceMappingURL=index.js.map","export default function profiling(result, action, options) {\n    if (result.profiling) {\n        result.profiling.push({\n            action,\n            time: Date.now() - options.start,\n        });\n    }\n}\n//# sourceMappingURL=profiling.js.map","export default function simpleChromatogram(result) {\n    let data = result.spectra[0].data;\n    result.chromatogram = {\n        times: data.x.slice(),\n        series: {\n            intensity: {\n                dimension: 1,\n                data: data.y.slice(),\n            },\n        },\n    };\n}\n//# sourceMappingURL=simpleChromatogram.js.map","import add2D from './2d/add2D';\nimport { complexChromatogram } from './complexChromatogram';\nimport postProcessingNMR from './postProcessingNMR';\nimport profiling from './profiling';\nimport simpleChromatogram from './simpleChromatogram';\nexport default function postProcessing(entriesFlat, result, options) {\n    // converting Hz to ppm\n    postProcessingNMR(entriesFlat);\n    for (let entry of entriesFlat) {\n        if (Object.keys(entry.ntuples).length > 0) {\n            let newNtuples = [];\n            let keys = Object.keys(entry.ntuples);\n            for (let i = 0; i < keys.length; i++) {\n                let key = keys[i];\n                let values = entry.ntuples[key];\n                for (let j = 0; j < values.length; j++) {\n                    if (!newNtuples[j])\n                        newNtuples[j] = {};\n                    newNtuples[j][key] = values[j];\n                }\n            }\n            entry.ntuples = newNtuples;\n        }\n        if (entry.twoD && options.wantXY) {\n            add2D(entry, options);\n            profiling(result, 'Finished countour plot calculation', options);\n            if (!options.keepSpectra) {\n                delete entry.spectra;\n            }\n        }\n        // maybe it is a GC (HPLC) / MS. In this case we add a new format\n        if (options.chromatogram) {\n            if (entry.spectra.length > 1) {\n                complexChromatogram(entry);\n            }\n            else {\n                simpleChromatogram(entry);\n            }\n            profiling(result, 'Finished chromatogram calculation', options);\n        }\n        delete entry.tmp;\n    }\n}\n//# sourceMappingURL=postProcessing.js.map","import { gyromagneticRatio } from 'gyromagnetic-ratio';\nexport default function postProcessingNMR(entriesFlat) {\n    // specific NMR functions\n    for (let entry of entriesFlat) {\n        let observeFrequency = 0;\n        let shiftOffsetVal = 0;\n        for (let spectrum of entry.spectra) {\n            if (entry.ntuples && entry.ntuples.symbol) {\n                if (!observeFrequency && spectrum.observeFrequency) {\n                    observeFrequency = spectrum.observeFrequency;\n                }\n                if (!shiftOffsetVal && spectrum.shiftOffsetVal) {\n                    shiftOffsetVal = spectrum.shiftOffsetVal;\n                }\n            }\n            else {\n                observeFrequency = spectrum.observeFrequency;\n                shiftOffsetVal = spectrum.shiftOffsetVal;\n            }\n            if (observeFrequency) {\n                if (spectrum.xUnits && spectrum.xUnits.toUpperCase().includes('HZ')) {\n                    spectrum.xUnits = 'PPM';\n                    spectrum.xFactor = spectrum.xFactor / observeFrequency;\n                    spectrum.firstX = spectrum.firstX / observeFrequency;\n                    spectrum.lastX = spectrum.lastX / observeFrequency;\n                    spectrum.deltaX = spectrum.deltaX / observeFrequency;\n                    for (let i = 0; i < spectrum.data.x.length; i++) {\n                        spectrum.data.x[i] /= observeFrequency;\n                    }\n                }\n            }\n            if (shiftOffsetVal) {\n                let shift = spectrum.firstX - shiftOffsetVal;\n                spectrum.firstX = spectrum.firstX - shift;\n                spectrum.lastX = spectrum.lastX - shift;\n                for (let i = 0; i < spectrum.data.x.length; i++) {\n                    spectrum.data.x[i] -= shift;\n                }\n            }\n            // we will check if some nucleus are missing ...\n            if (entry.ntuples && entry.ntuples.nucleus && entry.ntuples.symbol) {\n                for (let i = 0; i < entry.ntuples.nucleus.length; i++) {\n                    let symbol = entry.ntuples.symbol[i];\n                    let nucleus = entry.ntuples.nucleus[i];\n                    if (symbol.startsWith('F') && !nucleus) {\n                        if (symbol === 'F1') {\n                            // if F1 is defined we will use F2\n                            if (entry.tmp.$NUC2) {\n                                entry.ntuples.nucleus[i] = entry.tmp.$NUC2;\n                            }\n                            else {\n                                let f2index = entry.ntuples.symbol.indexOf('F2');\n                                if (f2index && entry.ntuples.nucleus[f2index]) {\n                                    entry.ntuples.nucleus[i] = entry.ntuples.nucleus[f2index];\n                                }\n                            }\n                        }\n                        if (symbol === 'F2')\n                            entry.ntuples.nucleus[i] = entry.tmp.$NUC1;\n                    }\n                    if (symbol === 'F2') {\n                        entry.yType = entry.ntuples.nucleus[0];\n                    }\n                }\n            }\n            if (observeFrequency &&\n                entry.ntuples &&\n                entry.ntuples.symbol &&\n                entry.ntuples.nucleus) {\n                let unit = '';\n                let pageSymbolIndex = entry.ntuples.symbol.indexOf(spectrum.pageSymbol);\n                if (entry.ntuples.units && entry.ntuples.units[pageSymbolIndex]) {\n                    unit = entry.ntuples.units[pageSymbolIndex];\n                }\n                if (unit !== 'PPM') {\n                    if (pageSymbolIndex !== 0) {\n                        throw Error('Not sure about this ntuples format');\n                    }\n                    let ratio0 = gyromagneticRatio[entry.ntuples.nucleus[0]];\n                    let ratio1 = gyromagneticRatio[entry.ntuples.nucleus[1]];\n                    if (!ratio0 || !ratio1) {\n                        throw Error('Problem with determination of gyromagnetic ratio');\n                    }\n                    let ratio = (ratio0 / ratio1) * observeFrequency;\n                    spectrum.pageValue /= ratio;\n                }\n            }\n        }\n    }\n}\n//# sourceMappingURL=postProcessingNMR.js.map","export default function prepareNtuplesDatatable(currentEntry, spectrum, kind) {\n    let xIndex = -1;\n    let yIndex = -1;\n    let firstVariable = '';\n    let secondVariable = '';\n    if (kind.indexOf('++') > 0) {\n        firstVariable = kind.replace(/.*\\(([a-zA-Z0-9]+)\\+\\+.*/, '$1');\n        secondVariable = kind.replace(/.*\\.\\.([a-zA-Z0-9]+).*/, '$1');\n    }\n    else {\n        kind = kind.replace(/[^a-zA-Z]/g, '');\n        firstVariable = kind.charAt(0);\n        secondVariable = kind.charAt(1);\n        spectrum.variables = {};\n        for (let symbol of kind) {\n            let lowerCaseSymbol = symbol.toLowerCase();\n            let index = currentEntry.ntuples.symbol.indexOf(symbol);\n            if (index === -1)\n                throw Error(`Symbol undefined: ${symbol}`);\n            spectrum.variables[lowerCaseSymbol] = {};\n            for (let key in currentEntry.ntuples) {\n                if (currentEntry.ntuples[key][index]) {\n                    spectrum.variables[lowerCaseSymbol][key.replace(/^var/, '')] =\n                        currentEntry.ntuples[key][index];\n                }\n            }\n        }\n    }\n    xIndex = currentEntry.ntuples.symbol.indexOf(firstVariable);\n    yIndex = currentEntry.ntuples.symbol.indexOf(secondVariable);\n    if (xIndex === -1)\n        xIndex = 0;\n    if (yIndex === -1)\n        yIndex = 0;\n    if (currentEntry.ntuples.first) {\n        if (currentEntry.ntuples.first.length > xIndex) {\n            spectrum.firstX = currentEntry.ntuples.first[xIndex];\n        }\n        if (currentEntry.ntuples.first.length > yIndex) {\n            spectrum.firstY = currentEntry.ntuples.first[yIndex];\n        }\n    }\n    if (currentEntry.ntuples.last) {\n        if (currentEntry.ntuples.last.length > xIndex) {\n            spectrum.lastX = currentEntry.ntuples.last[xIndex];\n        }\n        if (currentEntry.ntuples.last.length > yIndex) {\n            spectrum.lastY = currentEntry.ntuples.last[yIndex];\n        }\n    }\n    if (currentEntry.ntuples.vardim &&\n        currentEntry.ntuples.vardim.length > xIndex) {\n        spectrum.nbPoints = currentEntry.ntuples.vardim[xIndex];\n    }\n    if (currentEntry.ntuples.factor) {\n        if (currentEntry.ntuples.factor.length > xIndex) {\n            spectrum.xFactor = currentEntry.ntuples.factor[xIndex];\n        }\n        if (currentEntry.ntuples.factor.length > yIndex) {\n            spectrum.yFactor = currentEntry.ntuples.factor[yIndex];\n        }\n    }\n    if (currentEntry.ntuples.units) {\n        if (currentEntry.ntuples.units.length > xIndex) {\n            if (currentEntry.ntuples.varname &&\n                currentEntry.ntuples.varname[xIndex]) {\n                spectrum.xUnits = `${currentEntry.ntuples.varname[xIndex]} [${currentEntry.ntuples.units[xIndex]}]`;\n            }\n            else {\n                spectrum.xUnits = currentEntry.ntuples.units[xIndex];\n            }\n        }\n        if (currentEntry.ntuples.units.length > yIndex) {\n            if (currentEntry.ntuples.varname &&\n                currentEntry.ntuples.varname[yIndex]) {\n                spectrum.yUnits = `${currentEntry.ntuples.varname[yIndex]} [${currentEntry.ntuples.units[yIndex]}]`;\n            }\n            else {\n                spectrum.yUnits = currentEntry.ntuples.units[yIndex];\n            }\n        }\n    }\n}\n//# sourceMappingURL=prepareNtuplesDatatable.js.map","export default function prepareSpectrum(spectrum) {\n    if (!spectrum.xFactor)\n        spectrum.xFactor = 1;\n    if (!spectrum.yFactor)\n        spectrum.yFactor = 1;\n}\n//# sourceMappingURL=prepareSpectrum.js.map","import { parseString } from 'dynamic-typing';\nimport { ensureString } from 'ensure-string';\nimport { isMSField, convertMSFieldToLabel } from './complexChromatogram';\nimport convertToFloatArray from './convertToFloatArray';\nimport fastParseXYData from './parse/fastParseXYData';\nimport parsePeakTable from './parse/parsePeakTable';\nimport parseXYA from './parse/parseXYA';\nimport postProcessing from './postProcessing';\nimport prepareNtuplesDatatable from './prepareNtuplesDatatable';\nimport prepareSpectrum from './prepareSpectrum';\nimport profiling from './profiling';\n// the following RegExp can only be used for XYdata, some peakTables have values with a \"E-5\" ...\nconst ntuplesSeparatorRegExp = /[ \\t]*,[ \\t]*/;\nconst defaultOptions = {\n    keepRecordsRegExp: /^$/,\n    canonicDataLabels: true,\n    canonicMetadataLabels: false,\n    dynamicTyping: true,\n    withoutXY: false,\n    chromatogram: false,\n    keepSpectra: false,\n    noContour: false,\n    nbContourLevels: 7,\n    noiseMultiplier: 5,\n    profiling: false,\n};\n/**\n *\n * @typedef {object} ConvertOptions\n * @property {RegExp} [options.keepRecordsRegExp=/^$/] - By default we don't keep meta information.\n * @property {boolean} [options.canonicDataLabels=true] - Canonize the Labels (uppercase without symbol).\n * @property {boolean} [options.canonicMetadataLabels=false] - Canonize the metadata Labels (uppercase without symbol).\n * @property {boolean} [options.dynamicTyping=false] - Convert numbers to Number.\n * @property {boolean} [options.withoutXY=false] - Remove the XY data.\n * @property {boolean} [options.chromatogram=false] - Special post-processing for GC / HPLC / MS.\n * @property {boolean} [options.keepSpectra=false] - Force to keep the spectra in case of 2D.\n * @property {boolean} [options.noContour=false] - Don't calculate countour in case of 2D.\n * @property {number} [options.nbContourLevels=7] - Number of positive / negative contour levels to calculate.\n * @property {number} [options.noiseMultiplier=5] - Define for 2D the level as 5 times the median as default.\n * @property {boolean} [options.profiling=false] - Add profiling information.\n */\n/**\n *\n * @typedef {object} Ntuples\n * @property {string[]} [varname]\n * @property {string[]} [symbol]\n * @property {string[]} [vartype]\n * @property {string[]} [varform]\n * @property {number[]} [vardim]\n * @property {string[]} [units]\n * @property {number[]} [factor]\n * @property {number[]} [first]\n * @property {number[]} [last]\n * @property {number[]} [min]\n * @property {number[]} [max]\n * @property {string[]} [nucleus]\n */\n/**\n * @typedef { Record<string, any> } Spectrum\n * @property {Record<string, number[]>} [data]\n * @property {number} [firstX]\n * @property {number} [lastX]\n * @property {number} [deltaX]\n * @property {number} [yFactor]\n * @property {number} [xFactor]\n * @property {number} [nbPoints]\n */\n/**\n *\n * @typedef {object} Entry\n * @property {Spectrum[]} spectra\n * @property {Ntuples} ntuples\n * @property {object} meta\n * @property {object} tmp\n * @property {string} [title]\n * @property {string} [dataType]\n * @property {string} [dataClass]\n * @property {boolean} [twoD]\n */\n/**\n *\n * @typedef { object } ConvertResult\n * @property { object[] | boolean } profiling\n * @property { string[] } logs\n * @property { object[] } entries\n * @property { Entry[] } flatten\n */\n/**\n * Parse a jcamp.\n *\n * @param {string|ArrayBuffer|Uint8Array} jcamp\n * @param {ConvertOptions} [options]\n * @returns {ConvertResult}\n */\nexport function convert(jcamp, options = {}) {\n    jcamp = ensureString(jcamp);\n    options = { ...defaultOptions, ...options };\n    options.wantXY = !options.withoutXY;\n    options.start = Date.now();\n    let entriesFlat = [];\n    let result = {\n        profiling: options.profiling ? [] : false,\n        logs: [],\n        entries: [],\n    };\n    let tmpResult = { children: [] };\n    let currentEntry = tmpResult;\n    let parentsStack = [];\n    let spectrum = {};\n    if (typeof jcamp !== 'string') {\n        throw new TypeError('the JCAMP should be a string');\n    }\n    profiling(result, 'Before split to LDRS', options);\n    let ldrs = jcamp.replace(/[\\r\\n]+##/g, '\\n##').split('\\n##');\n    profiling(result, 'Split to LDRS', options);\n    if (ldrs[0])\n        ldrs[0] = ldrs[0].replace(/^[\\r\\n ]*##/, '');\n    for (let ldr of ldrs) {\n        // This is a new LDR\n        let position = ldr.indexOf('=');\n        let dataLabel = position > 0 ? ldr.substring(0, position) : ldr;\n        let dataValue = position > 0 ? ldr.substring(position + 1).trim() : '';\n        let canonicDataLabel = dataLabel.replace(/[_ -]/g, '').toUpperCase();\n        if (canonicDataLabel === 'DATATABLE') {\n            let endLine = dataValue.indexOf('\\n');\n            if (endLine === -1)\n                endLine = dataValue.indexOf('\\r');\n            if (endLine > 0) {\n                // ##DATA TABLE= (X++(I..I)), XYDATA\n                // We need to find the variables\n                let infos = dataValue.substring(0, endLine).split(/[ ,;\\t]+/);\n                prepareNtuplesDatatable(currentEntry, spectrum, infos[0]);\n                spectrum.datatable = infos[0];\n                if (infos[1] && infos[1].indexOf('PEAKS') > -1) {\n                    canonicDataLabel = 'PEAKTABLE';\n                }\n                else if (infos[1] &&\n                    (infos[1].indexOf('XYDATA') || infos[0].indexOf('++') > 0)) {\n                    canonicDataLabel = 'XYDATA';\n                    if (spectrum.nbPoints) {\n                        spectrum.deltaX =\n                            (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n                    }\n                }\n            }\n        }\n        if (canonicDataLabel === 'XYDATA') {\n            if (options.wantXY) {\n                prepareSpectrum(spectrum);\n                // well apparently we should still consider it is a PEAK TABLE if there are no '++' after\n                if (dataValue.match(/.*\\+\\+.*/)) {\n                    // ex: (X++(Y..Y))\n                    if (spectrum.nbPoints) {\n                        spectrum.deltaX =\n                            (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n                    }\n                    fastParseXYData(spectrum, dataValue, result);\n                }\n                else {\n                    parsePeakTable(spectrum, dataValue, result);\n                }\n                currentEntry.spectra.push(spectrum);\n                spectrum = {};\n            }\n            continue;\n        }\n        else if (canonicDataLabel === 'PEAKTABLE') {\n            if (options.wantXY) {\n                prepareSpectrum(spectrum);\n                parsePeakTable(spectrum, dataValue, result);\n                currentEntry.spectra.push(spectrum);\n                spectrum = {};\n            }\n            continue;\n        }\n        if (canonicDataLabel === 'PEAKASSIGNMENTS') {\n            if (options.wantXY) {\n                if (dataValue.match(/.*(XYA).*/)) {\n                    // ex: (XYA)\n                    parseXYA(spectrum, dataValue);\n                }\n                currentEntry.spectra.push(spectrum);\n                spectrum = {};\n            }\n            continue;\n        }\n        if (canonicDataLabel === 'TITLE') {\n            let parentEntry = currentEntry;\n            if (!parentEntry.children) {\n                parentEntry.children = [];\n            }\n            currentEntry = {\n                spectra: [],\n                ntuples: {},\n                info: {},\n                meta: {},\n                tmp: {}, // tmp information we need to keep for postprocessing\n            };\n            parentEntry.children.push(currentEntry);\n            parentsStack.push(parentEntry);\n            entriesFlat.push(currentEntry);\n            currentEntry.title = dataValue;\n        }\n        else if (canonicDataLabel === 'DATATYPE') {\n            currentEntry.dataType = dataValue;\n            if (dataValue.match(/(^nd|\\snd\\s)/i)) {\n                currentEntry.twoD = true;\n            }\n        }\n        else if (canonicDataLabel === 'NTUPLES') {\n            if (dataValue.match(/(^nd|\\snd\\s)/i)) {\n                currentEntry.twoD = true;\n            }\n        }\n        else if (canonicDataLabel === 'DATACLASS') {\n            currentEntry.dataClass = dataValue;\n        }\n        else if (canonicDataLabel === 'XUNITS') {\n            spectrum.xUnits = dataValue;\n        }\n        else if (canonicDataLabel === 'YUNITS') {\n            spectrum.yUnits = dataValue;\n        }\n        else if (canonicDataLabel === 'FIRSTX') {\n            spectrum.firstX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'LASTX') {\n            spectrum.lastX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'FIRSTY') {\n            spectrum.firstY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'LASTY') {\n            spectrum.lastY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'NPOINTS') {\n            spectrum.nbPoints = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'XFACTOR') {\n            spectrum.xFactor = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'YFACTOR') {\n            spectrum.yFactor = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MAXX') {\n            spectrum.maxX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MINX') {\n            spectrum.minX = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MAXY') {\n            spectrum.maxY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'MINY') {\n            spectrum.minY = Number(dataValue);\n        }\n        else if (canonicDataLabel === 'DELTAX') {\n            spectrum.deltaX = Number(dataValue);\n        }\n        else if (canonicDataLabel === '.OBSERVEFREQUENCY' ||\n            canonicDataLabel === '$SFO1') {\n            if (!spectrum.observeFrequency) {\n                spectrum.observeFrequency = Number(dataValue);\n            }\n        }\n        else if (canonicDataLabel === '.OBSERVENUCLEUS') {\n            if (!spectrum.xType) {\n                currentEntry.xType = dataValue.replace(/[^a-zA-Z0-9]/g, '');\n            }\n        }\n        else if (canonicDataLabel === '$OFFSET') {\n            // OFFSET for Bruker spectra\n            currentEntry.shiftOffsetNum = 0;\n            if (!spectrum.shiftOffsetVal) {\n                spectrum.shiftOffsetVal = Number(dataValue);\n            }\n        }\n        else if (canonicDataLabel === '$REFERENCEPOINT') {\n            // OFFSET for Varian spectra\n            // if we activate this part it does not work for ACD specmanager\n            //         } else if (canonicDataLabel=='.SHIFTREFERENCE') {   // OFFSET FOR Bruker Spectra\n            //                 var parts = dataValue.split(/ *, */);\n            //                 currentEntry.shiftOffsetNum = parseInt(parts[2].trim());\n            //                 spectrum.shiftOffsetVal = Number(parts[3].trim());\n        }\n        else if (canonicDataLabel === 'VARNAME') {\n            currentEntry.ntuples.varname = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'SYMBOL') {\n            currentEntry.ntuples.symbol = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'VARTYPE') {\n            currentEntry.ntuples.vartype = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'VARFORM') {\n            currentEntry.ntuples.varform = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'VARDIM') {\n            currentEntry.ntuples.vardim = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'UNITS') {\n            currentEntry.ntuples.units = dataValue.split(ntuplesSeparatorRegExp);\n        }\n        else if (canonicDataLabel === 'FACTOR') {\n            currentEntry.ntuples.factor = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'FIRST') {\n            currentEntry.ntuples.first = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'LAST') {\n            currentEntry.ntuples.last = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'MIN') {\n            currentEntry.ntuples.min = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === 'MAX') {\n            currentEntry.ntuples.max = convertToFloatArray(dataValue.split(ntuplesSeparatorRegExp));\n        }\n        else if (canonicDataLabel === '.NUCLEUS') {\n            if (currentEntry.ntuples) {\n                currentEntry.ntuples.nucleus = dataValue.split(ntuplesSeparatorRegExp);\n            }\n        }\n        else if (canonicDataLabel === 'PAGE') {\n            spectrum.page = dataValue.trim();\n            spectrum.pageValue = Number(dataValue.replace(/^.*=/, ''));\n            spectrum.pageSymbol = spectrum.page.replace(/[=].*/, '');\n        }\n        else if (canonicDataLabel === 'RETENTIONTIME') {\n            spectrum.pageValue = Number(dataValue);\n        }\n        else if (isMSField(canonicDataLabel)) {\n            spectrum[convertMSFieldToLabel(canonicDataLabel)] = dataValue;\n        }\n        else if (canonicDataLabel === 'SAMPLEDESCRIPTION') {\n            spectrum.sampleDescription = dataValue;\n        }\n        else if (canonicDataLabel.startsWith('$NUC')) {\n            if (!currentEntry.tmp[canonicDataLabel] && !dataValue.includes('off')) {\n                currentEntry.tmp[canonicDataLabel] = dataValue.replace(/[<>]/g, '');\n            }\n        }\n        else if (canonicDataLabel === 'END') {\n            currentEntry = parentsStack.pop();\n        }\n        if (currentEntry &&\n            currentEntry.info &&\n            currentEntry.meta &&\n            canonicDataLabel.match(options.keepRecordsRegExp)) {\n            let value = dataValue.trim();\n            let target, label;\n            if (dataLabel.startsWith('$')) {\n                label = options.canonicMetadataLabels\n                    ? canonicDataLabel.substring(1)\n                    : dataLabel.substring(1);\n                target = currentEntry.meta;\n            }\n            else {\n                label = options.canonicDataLabels ? canonicDataLabel : dataLabel;\n                target = currentEntry.info;\n            }\n            if (options.dynamicTyping) {\n                value = parseString(value);\n            }\n            if (target[label]) {\n                if (!Array.isArray(target[label])) {\n                    target[label] = [target[label]];\n                }\n                target[label].push(value);\n            }\n            else {\n                target[label] = value;\n            }\n        }\n    }\n    profiling(result, 'Finished parsing', options);\n    postProcessing(entriesFlat, result, options);\n    profiling(result, 'Total time', options);\n    /*\n    if (result.children && result.children.length>0) {\n      result = { ...result, ...result.children[0] };\n    }\n    */\n    result.entries = tmpResult.children;\n    result.flatten = entriesFlat;\n    return result;\n}\n//# sourceMappingURL=convert.js.map","export function getJcampKind(data) {\n  let dataType = data.dataType.toLowerCase();\n  let yUnits = data.spectra[0].yUnits.toLowerCase();\n\n  if (dataType.match(/infrared/)) {\n    if (yUnits.match(/absorbance/)) {\n      return IR_ABSORBANCE;\n    } else {\n      return IR_TRANSMITTANCE;\n    }\n  }\n  return undefined;\n}\n\nexport const IR_TRANSMITTANCE = {\n  normalization: {},\n  importation: {\n    converter: (transmittance) => -Math.log10(transmittance),\n  },\n  kind: 'Infrared',\n  display: {\n    xLabel: 'wavelength [cm-1]',\n    xInverted: true,\n    yLabel: 'Absorbance',\n  },\n};\n\nexport const IR_ABSORBANCE = {\n  normalization: {},\n  kind: 'Infrared',\n  display: {\n    xLabel: 'wavelength [cm-1]',\n    xInverted: true,\n    yLabel: 'Absorbance',\n  },\n};\n\nexport const nmr1H = {\n  display: {\n    xLabel: 'δ [ppm]',\n    xInverted: true,\n    yLabel: 'Intensity',\n  },\n};\n\nexport const nmr13C = {\n  display: {\n    xLabel: 'δ [ppm]',\n    xInverted: true,\n    yLabel: 'Intensity',\n  },\n};\n","import { convert } from 'jcampconverter';\n\nimport { getJcampKind } from '../Kinds';\n/**\n * Create a spectrum from a jcamp\n * @param {string} jcampText - String containing the JCAMP data\n * @return {Spectrum} - new instance of Spectrum with the provided data\n */\nexport default function jcamp(jcampText) {\n  const parsed = convert(jcampText, { xy: true, keepRecordsRegExp: /TITLE/ })\n    .flatten[0];\n  const kind = getJcampKind(parsed);\n  const data = parsed.spectra[0].data;\n  const meta = parsed.info;\n  // we convert the data\n  if (kind && kind.importation && kind.importation.converter) {\n    data.y = data.y.map(kind.importation.converter);\n  }\n\n  return { data, kind, meta };\n}\n","/**\n * In place modification of the 2 arrays to make X unique and sum the Y if X has the same value\n * @param {object} [points={}] : Object of points contains property x (an array) and y (an array)\n * @return points\n */\n\nexport default function uniqueX(points = {}) {\n  const { x, y } = points;\n  if (x.length < 2) return;\n  if (x.length !== y.length) {\n    throw new Error('The X and Y arrays mush have the same length');\n  }\n\n  let current = x[0];\n  let counter = 0;\n\n  for (let i = 1; i < x.length; i++) {\n    if (current !== x[i]) {\n      counter++;\n      current = x[i];\n      x[counter] = x[i];\n      if (i !== counter) {\n        y[counter] = 0;\n      }\n    }\n    if (i !== counter) {\n      y[counter] += y[i];\n    }\n  }\n\n  x.length = counter + 1;\n  y.length = counter + 1;\n}\n","import { ensureString } from 'ensure-string';\nimport mlArrayMax from 'ml-array-max';\nimport uniqueXFunction from 'ml-arrayxy-uniquex';\nimport { xIsMonotone } from 'ml-spectra-processing';\n/**\n * General internal parsing function\n *\n * @param text - Csv or tsv strings.\n * @param options - Parsing options\n * @returns parsed text file with column information\n */\nexport function parse(text, options = {}) {\n    let { rescale = false, uniqueX = false, xColumn = 0, yColumn = 1, bestGuess = false, \n    //@ts-expect-error old library used this property and we want to throw an error so that people are forced to migrate\n    keepInfo, numberColumns = Number.MAX_SAFE_INTEGER, maxNumberColumns = Number.MAX_SAFE_INTEGER, minNumberColumns = 2, } = options;\n    if (keepInfo !== undefined) {\n        throw new Error('keepInfo has been deprecated, pelase use the new method parseXYAndKeepInfo');\n    }\n    text = ensureString(text);\n    maxNumberColumns = Math.max(maxNumberColumns, xColumn + 1, yColumn + 1);\n    minNumberColumns = Math.max(xColumn + 1, yColumn + 1, minNumberColumns);\n    let lines = text.split(/[\\r\\n]+/);\n    let matrix = [];\n    let info = [];\n    let position = 0;\n    lines.forEach((line) => {\n        line = line.trim();\n        // we will consider only lines that contains only numbers\n        if (/[0-9]+/.test(line) && /^[0-9eE,;. \\t+-]+$/.test(line)) {\n            let fields = line.split(/,[; \\t]+|[; \\t]+/);\n            if (fields.length === 1) {\n                fields = line.split(/[,; \\t]+/);\n            }\n            if (fields &&\n                fields.length >= minNumberColumns && // we filter lines that have not enough or too many columns\n                fields.length <= maxNumberColumns) {\n                matrix.push(fields.map((value) => parseFloat(value.replace(',', '.'))));\n                position++;\n            }\n        }\n        else if (line) {\n            info.push({ position, value: line });\n        }\n    });\n    if (bestGuess) {\n        if (matrix[0] &&\n            matrix[0].length === 3 &&\n            options.xColumn === undefined &&\n            options.yColumn === undefined) {\n            // is the first column a seuqnetial number ?\n            let skipFirstColumn = true;\n            for (let i = 0; i < matrix.length - 1; i++) {\n                if (Math.abs(matrix[i][0] - matrix[i + 1][0]) !== 1) {\n                    skipFirstColumn = false;\n                }\n            }\n            if (skipFirstColumn) {\n                xColumn = 1;\n                yColumn = 2;\n            }\n        }\n        if (matrix[0] && matrix[0].length > 3) {\n            const xs = [];\n            for (let row of matrix) {\n                for (let i = xColumn; i < row.length; i += 2) {\n                    xs.push(row[i]);\n                }\n            }\n            if (xIsMonotone(xs)) {\n                numberColumns = 2;\n            }\n        }\n    }\n    if (numberColumns) {\n        const newMatrix = [];\n        for (const row of matrix) {\n            for (let i = 0; i < row.length; i += numberColumns) {\n                newMatrix.push(row.slice(i, i + numberColumns));\n            }\n        }\n        matrix = newMatrix;\n    }\n    const result = {\n        x: matrix.map((row) => row[xColumn]),\n        y: matrix.map((row) => row[yColumn]),\n    };\n    if (uniqueX) {\n        uniqueXFunction(result);\n    }\n    if (rescale) {\n        let maxY = mlArrayMax(result.y);\n        for (let i = 0; i < result.y.length; i++) {\n            result.y[i] /= maxY;\n        }\n    }\n    return {\n        info,\n        data: result,\n    };\n}\n//# sourceMappingURL=parse.js.map","import { parse } from './parse';\nexport * from './ParseXYOptions';\n/**\n * Parse a text-file and convert it to an object {x:[], y:[]}\n *\n * @param text - Csv or tsv strings.\n * @param options - Parsing options\n * @returns - The parsed data\n */\nexport function parseXY(text, options = {}) {\n    return parse(text, options).data;\n}\n/**\n * Parse a text-file and returns the parsed data and information about the columns\n *\n * @param text - Csv or tsv strings.\n * @param options - Parsing options\n * @returns - The parsed data with information about the columns\n */\nexport function parseXYAndKeepInfo(text, options = {}) {\n    return parse(text, options);\n}\n//# sourceMappingURL=index.js.map","export function convertToText(data, options = {}) {\n  let { fs = '\\t', rs = '\\n' } = options;\n  let { matrix, meta, ids, x } = data;\n  let allKeysObject = {};\n  for (let metum of meta) {\n    if (metum) {\n      for (let key of Object.keys(metum)) {\n        let type = typeof metum[key];\n        if (type === 'number' || type === 'string' || type === 'boolean') {\n          allKeysObject[key] = true;\n        }\n      }\n    }\n  }\n  let allKeys = Object.keys(allKeysObject);\n\n  let lines = [];\n  let line = [];\n  line.push('id', ...allKeys, ...x);\n  lines.push(line.join(fs));\n\n  for (let i = 0; i < ids.length; i++) {\n    line = [];\n    line.push(ids[i]);\n    for (let key of allKeys) {\n      line.push(meta[i][key]);\n    }\n    line.push(...matrix[i]);\n    lines.push(line.join(fs));\n  }\n  return lines.join(rs);\n}\n","!function(e){var t;\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(\"undefined\"!=typeof window?t=window:\"undefined\"!=typeof global?t=global:\"undefined\"!=typeof self&&(t=self),t.objectHash=e())}(function(){return function r(o,i,u){function s(n,e){if(!i[n]){if(!o[n]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(n,!0);if(a)return a(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}e=i[n]={exports:{}};o[n][0].call(e.exports,function(e){var t=o[n][1][e];return s(t||e)},e,e.exports,r,o,i,u)}return i[n].exports}for(var a=\"function\"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(w,b,m){!function(e,n,s,c,d,h,p,g,y){\"use strict\";var r=w(\"crypto\");function t(e,t){t=u(e,t);var n;return void 0===(n=\"passthrough\"!==t.algorithm?r.createHash(t.algorithm):new l).write&&(n.write=n.update,n.end=n.update),f(t,n).dispatch(e),n.update||n.end(\"\"),n.digest?n.digest(\"buffer\"===t.encoding?void 0:t.encoding):(e=n.read(),\"buffer\"!==t.encoding?e.toString(t.encoding):e)}(m=b.exports=t).sha1=function(e){return t(e)},m.keys=function(e){return t(e,{excludeValues:!0,algorithm:\"sha1\",encoding:\"hex\"})},m.MD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\"})},m.keysMD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\",excludeValues:!0})};var o=r.getHashes?r.getHashes().slice():[\"sha1\",\"md5\"],i=(o.push(\"passthrough\"),[\"buffer\",\"hex\",\"binary\",\"base64\"]);function u(e,t){var n={};if(n.algorithm=(t=t||{}).algorithm||\"sha1\",n.encoding=t.encoding||\"hex\",n.excludeValues=!!t.excludeValues,n.algorithm=n.algorithm.toLowerCase(),n.encoding=n.encoding.toLowerCase(),n.ignoreUnknown=!0===t.ignoreUnknown,n.respectType=!1!==t.respectType,n.respectFunctionNames=!1!==t.respectFunctionNames,n.respectFunctionProperties=!1!==t.respectFunctionProperties,n.unorderedArrays=!0===t.unorderedArrays,n.unorderedSets=!1!==t.unorderedSets,n.unorderedObjects=!1!==t.unorderedObjects,n.replacer=t.replacer||void 0,n.excludeKeys=t.excludeKeys||void 0,void 0===e)throw new Error(\"Object argument required.\");for(var r=0;r<o.length;++r)o[r].toLowerCase()===n.algorithm.toLowerCase()&&(n.algorithm=o[r]);if(-1===o.indexOf(n.algorithm))throw new Error('Algorithm \"'+n.algorithm+'\"  not supported. supported values: '+o.join(\", \"));if(-1===i.indexOf(n.encoding)&&\"passthrough\"!==n.algorithm)throw new Error('Encoding \"'+n.encoding+'\"  not supported. supported values: '+i.join(\", \"));return n}function a(e){if(\"function\"==typeof e)return null!=/^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i.exec(Function.prototype.toString.call(e))}function f(o,t,i){i=i||[];function u(e){return t.update?t.update(e,\"utf8\"):t.write(e,\"utf8\")}return{dispatch:function(e){return this[\"_\"+(null===(e=o.replacer?o.replacer(e):e)?\"null\":typeof e)](e)},_object:function(t){var n,e=Object.prototype.toString.call(t),r=/\\[object (.*)\\]/i.exec(e);r=(r=r?r[1]:\"unknown:[\"+e+\"]\").toLowerCase();if(0<=(e=i.indexOf(t)))return this.dispatch(\"[CIRCULAR:\"+e+\"]\");if(i.push(t),void 0!==s&&s.isBuffer&&s.isBuffer(t))return u(\"buffer:\"),u(t);if(\"object\"===r||\"function\"===r||\"asyncfunction\"===r)return e=Object.keys(t),o.unorderedObjects&&(e=e.sort()),!1===o.respectType||a(t)||e.splice(0,0,\"prototype\",\"__proto__\",\"constructor\"),o.excludeKeys&&(e=e.filter(function(e){return!o.excludeKeys(e)})),u(\"object:\"+e.length+\":\"),n=this,e.forEach(function(e){n.dispatch(e),u(\":\"),o.excludeValues||n.dispatch(t[e]),u(\",\")});if(!this[\"_\"+r]){if(o.ignoreUnknown)return u(\"[\"+r+\"]\");throw new Error('Unknown object type \"'+r+'\"')}this[\"_\"+r](t)},_array:function(e,t){t=void 0!==t?t:!1!==o.unorderedArrays;var n=this;if(u(\"array:\"+e.length+\":\"),!t||e.length<=1)return e.forEach(function(e){return n.dispatch(e)});var r=[],t=e.map(function(e){var t=new l,n=i.slice();return f(o,t,n).dispatch(e),r=r.concat(n.slice(i.length)),t.read().toString()});return i=i.concat(r),t.sort(),this._array(t,!1)},_date:function(e){return u(\"date:\"+e.toJSON())},_symbol:function(e){return u(\"symbol:\"+e.toString())},_error:function(e){return u(\"error:\"+e.toString())},_boolean:function(e){return u(\"bool:\"+e.toString())},_string:function(e){u(\"string:\"+e.length+\":\"),u(e.toString())},_function:function(e){u(\"fn:\"),a(e)?this.dispatch(\"[native]\"):this.dispatch(e.toString()),!1!==o.respectFunctionNames&&this.dispatch(\"function-name:\"+String(e.name)),o.respectFunctionProperties&&this._object(e)},_number:function(e){return u(\"number:\"+e.toString())},_xml:function(e){return u(\"xml:\"+e.toString())},_null:function(){return u(\"Null\")},_undefined:function(){return u(\"Undefined\")},_regexp:function(e){return u(\"regex:\"+e.toString())},_uint8array:function(e){return u(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return u(\"uint8clampedarray:\"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return u(\"int8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return u(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return u(\"int16array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return u(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return u(\"int32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return u(\"float32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return u(\"float64array:\"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return u(\"arraybuffer:\"),this.dispatch(new Uint8Array(e))},_url:function(e){return u(\"url:\"+e.toString())},_map:function(e){u(\"map:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_set:function(e){u(\"set:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_file:function(e){return u(\"file:\"),this.dispatch([e.name,e.size,e.type,e.lastModfied])},_blob:function(){if(o.ignoreUnknown)return u(\"[blob]\");throw Error('Hashing Blob objects is currently not supported\\n(see https://github.com/puleos/object-hash/issues/26)\\nUse \"options.replacer\" or \"options.ignoreUnknown\"\\n')},_domwindow:function(){return u(\"domwindow\")},_bigint:function(e){return u(\"bigint:\"+e.toString())},_process:function(){return u(\"process\")},_timer:function(){return u(\"timer\")},_pipe:function(){return u(\"pipe\")},_tcp:function(){return u(\"tcp\")},_udp:function(){return u(\"udp\")},_tty:function(){return u(\"tty\")},_statwatcher:function(){return u(\"statwatcher\")},_securecontext:function(){return u(\"securecontext\")},_connection:function(){return u(\"connection\")},_zlib:function(){return u(\"zlib\")},_context:function(){return u(\"context\")},_nodescript:function(){return u(\"nodescript\")},_httpparser:function(){return u(\"httpparser\")},_dataview:function(){return u(\"dataview\")},_signal:function(){return u(\"signal\")},_fsevent:function(){return u(\"fsevent\")},_tlswrap:function(){return u(\"tlswrap\")}}}function l(){return{buf:\"\",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}m.writeToStream=function(e,t,n){return void 0===n&&(n=t,t={}),f(t=u(e,t),n).dispatch(e)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/fake_9a5aa49d.js\",\"/\")},{buffer:3,crypto:5,lYpoI2:11}],2:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){!function(e){\"use strict\";var a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,t=\"+\".charCodeAt(0),n=\"/\".charCodeAt(0),r=\"0\".charCodeAt(0),o=\"a\".charCodeAt(0),i=\"A\".charCodeAt(0),u=\"-\".charCodeAt(0),s=\"_\".charCodeAt(0);function f(e){e=e.charCodeAt(0);return e===t||e===u?62:e===n||e===s?63:e<r?-1:e<r+10?e-r+26+26:e<i+26?e-i:e<o+26?e-o+26:void 0}e.toByteArray=function(e){var t,n;if(0<e.length%4)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=e.length,r=\"=\"===e.charAt(r-2)?2:\"=\"===e.charAt(r-1)?1:0,o=new a(3*e.length/4-r),i=0<r?e.length-4:e.length,u=0;function s(e){o[u++]=e}for(t=0;t<i;t+=4,0)s((16711680&(n=f(e.charAt(t))<<18|f(e.charAt(t+1))<<12|f(e.charAt(t+2))<<6|f(e.charAt(t+3))))>>16),s((65280&n)>>8),s(255&n);return 2==r?s(255&(n=f(e.charAt(t))<<2|f(e.charAt(t+1))>>4)):1==r&&(s((n=f(e.charAt(t))<<10|f(e.charAt(t+1))<<4|f(e.charAt(t+2))>>2)>>8&255),s(255&n)),o},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,u=\"\";function s(e){return\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(e)}for(t=0,r=e.length-i;t<r;t+=3)n=(e[t]<<16)+(e[t+1]<<8)+e[t+2],u+=s((o=n)>>18&63)+s(o>>12&63)+s(o>>6&63)+s(63&o);switch(i){case 1:u=(u+=s((n=e[e.length-1])>>2))+s(n<<4&63)+\"==\";break;case 2:u=(u=(u+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10))+s(n>>4&63))+s(n<<2&63)+\"=\"}return u}}(void 0===f?this.base64js={}:f)}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js\",\"/node_modules/gulp-browserify/node_modules/base64-js/lib\")},{buffer:3,lYpoI2:11}],3:[function(O,e,H){!function(e,n,f,r,h,p,g,y,w){var a=O(\"base64-js\"),i=O(\"ieee754\");function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var r,o,i,u,s=typeof e;if(\"base64\"===t&&\"string\"==s)for(e=(u=e).trim?u.trim():u.replace(/^\\s+|\\s+$/g,\"\");e.length%4!=0;)e+=\"=\";if(\"number\"==s)r=j(e);else if(\"string\"==s)r=f.byteLength(e,t);else{if(\"object\"!=s)throw new Error(\"First argument needs to be a number, array or string.\");r=j(e.length)}if(f._useTypedArrays?o=f._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),f._useTypedArrays&&\"number\"==typeof e.byteLength)o._set(e);else if(C(u=e)||f.isBuffer(u)||u&&\"object\"==typeof u&&\"number\"==typeof u.length)for(i=0;i<r;i++)f.isBuffer(e)?o[i]=e.readUInt8(i):o[i]=e[i];else if(\"string\"==s)o.write(e,0,t);else if(\"number\"==s&&!f._useTypedArrays&&!n)for(i=0;i<r;i++)o[i]=0;return o}function b(e,t,n,r){return f._charsWritten=c(function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function m(e,t,n,r){return f._charsWritten=c(function(e){for(var t,n,r=[],o=0;o<e.length;o++)n=e.charCodeAt(o),t=n>>8,n=n%256,r.push(n),r.push(t);return r}(t),e,n,r)}function v(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;o++)r+=String.fromCharCode(e[o]);return r}function o(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(o=e[t],t+1<r&&(o|=e[t+1]<<8)):(o=e[t]<<8,t+1<r&&(o|=e[t+1])),o}function u(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(t+2<r&&(o=e[t+2]<<16),t+1<r&&(o|=e[t+1]<<8),o|=e[t],t+3<r&&(o+=e[t+3]<<24>>>0)):(t+1<r&&(o=e[t+1]<<16),t+2<r&&(o|=e[t+2]<<8),t+3<r&&(o|=e[t+3]),o+=e[t]<<24>>>0),o}function _(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=o(e,t,n,!0),32768&r?-1*(65535-r+1):r}function E(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=u(e,t,n,!0),2147483648&r?-1*(4294967295-r+1):r}function I(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,23,4)}function A(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+7<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,52,8)}function s(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"trying to write beyond buffer length\"),Y(t,65535));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,2);i<u;i++)e[n+i]=(t&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function l(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"trying to write beyond buffer length\"),Y(t,4294967295));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,4);i<u;i++)e[n+i]=t>>>8*(r?i:3-i)&255}function B(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"Trying to write beyond buffer length\"),F(t,32767,-32768)),e.length<=n||s(e,0<=t?t:65535+t+1,n,r,o)}function L(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),F(t,2147483647,-2147483648)),e.length<=n||l(e,0<=t?t:4294967295+t+1,n,r,o)}function U(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),D(t,34028234663852886e22,-34028234663852886e22)),e.length<=n||i.write(e,t,n,r,23,4)}function x(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+7<e.length,\"Trying to write beyond buffer length\"),D(t,17976931348623157e292,-17976931348623157e292)),e.length<=n||i.write(e,t,n,r,52,8)}H.Buffer=f,H.SlowBuffer=f,H.INSPECT_MAX_BYTES=50,f.poolSize=8192,f._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&\"function\"==typeof t.subarray}catch(e){return!1}}(),f.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"raw\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},f.isBuffer=function(e){return!(null==e||!e._isBuffer)},f.byteLength=function(e,t){var n;switch(e+=\"\",t||\"utf8\"){case\"hex\":n=e.length/2;break;case\"utf8\":case\"utf-8\":n=T(e).length;break;case\"ascii\":case\"binary\":case\"raw\":n=e.length;break;case\"base64\":n=M(e).length;break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":n=2*e.length;break;default:throw new Error(\"Unknown encoding\")}return n},f.concat=function(e,t){if(d(C(e),\"Usage: Buffer.concat(list, [totalLength])\\nlist should be an Array.\"),0===e.length)return new f(0);if(1===e.length)return e[0];if(\"number\"!=typeof t)for(o=t=0;o<e.length;o++)t+=e[o].length;for(var n=new f(t),r=0,o=0;o<e.length;o++){var i=e[o];i.copy(n,r),r+=i.length}return n},f.prototype.write=function(e,t,n,r){isFinite(t)?isFinite(n)||(r=n,n=void 0):(a=r,r=t,t=n,n=a),t=Number(t)||0;var o,i,u,s,a=this.length-t;switch((!n||a<(n=Number(n)))&&(n=a),r=String(r||\"utf8\").toLowerCase()){case\"hex\":o=function(e,t,n,r){n=Number(n)||0;var o=e.length-n;(!r||o<(r=Number(r)))&&(r=o),d((o=t.length)%2==0,\"Invalid hex string\"),o/2<r&&(r=o/2);for(var i=0;i<r;i++){var u=parseInt(t.substr(2*i,2),16);d(!isNaN(u),\"Invalid hex string\"),e[n+i]=u}return f._charsWritten=2*i,i}(this,e,t,n);break;case\"utf8\":case\"utf-8\":i=this,u=t,s=n,o=f._charsWritten=c(T(e),i,u,s);break;case\"ascii\":case\"binary\":o=b(this,e,t,n);break;case\"base64\":i=this,u=t,s=n,o=f._charsWritten=c(M(e),i,u,s);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":o=m(this,e,t,n);break;default:throw new Error(\"Unknown encoding\")}return o},f.prototype.toString=function(e,t,n){var r,o,i,u,s=this;if(e=String(e||\"utf8\").toLowerCase(),t=Number(t)||0,(n=void 0!==n?Number(n):s.length)===t)return\"\";switch(e){case\"hex\":r=function(e,t,n){var r=e.length;(!t||t<0)&&(t=0);(!n||n<0||r<n)&&(n=r);for(var o=\"\",i=t;i<n;i++)o+=k(e[i]);return o}(s,t,n);break;case\"utf8\":case\"utf-8\":r=function(e,t,n){var r=\"\",o=\"\";n=Math.min(e.length,n);for(var i=t;i<n;i++)e[i]<=127?(r+=N(o)+String.fromCharCode(e[i]),o=\"\"):o+=\"%\"+e[i].toString(16);return r+N(o)}(s,t,n);break;case\"ascii\":case\"binary\":r=v(s,t,n);break;case\"base64\":o=s,u=n,r=0===(i=t)&&u===o.length?a.fromByteArray(o):a.fromByteArray(o.slice(i,u));break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":r=function(e,t,n){for(var r=e.slice(t,n),o=\"\",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}(s,t,n);break;default:throw new Error(\"Unknown encoding\")}return r},f.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}},f.prototype.copy=function(e,t,n,r){if(t=t||0,(r=r||0===r?r:this.length)!==(n=n||0)&&0!==e.length&&0!==this.length){d(n<=r,\"sourceEnd < sourceStart\"),d(0<=t&&t<e.length,\"targetStart out of bounds\"),d(0<=n&&n<this.length,\"sourceStart out of bounds\"),d(0<=r&&r<=this.length,\"sourceEnd out of bounds\"),r>this.length&&(r=this.length);var o=(r=e.length-t<r-n?e.length-t+n:r)-n;if(o<100||!f._useTypedArrays)for(var i=0;i<o;i++)e[i+t]=this[i+n];else e._set(this.subarray(n,n+o),t)}},f.prototype.slice=function(e,t){var n=this.length;if(e=S(e,n,0),t=S(t,n,n),f._useTypedArrays)return f._augment(this.subarray(e,t));for(var r=t-e,o=new f(r,void 0,!0),i=0;i<r;i++)o[i]=this[i+e];return o},f.prototype.get=function(e){return console.log(\".get() is deprecated. Access using array indexes instead.\"),this.readUInt8(e)},f.prototype.set=function(e,t){return console.log(\".set() is deprecated. Access using array indexes instead.\"),this.writeUInt8(e,t)},f.prototype.readUInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return this[e]},f.prototype.readUInt16LE=function(e,t){return o(this,e,!0,t)},f.prototype.readUInt16BE=function(e,t){return o(this,e,!1,t)},f.prototype.readUInt32LE=function(e,t){return u(this,e,!0,t)},f.prototype.readUInt32BE=function(e,t){return u(this,e,!1,t)},f.prototype.readInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return 128&this[e]?-1*(255-this[e]+1):this[e]},f.prototype.readInt16LE=function(e,t){return _(this,e,!0,t)},f.prototype.readInt16BE=function(e,t){return _(this,e,!1,t)},f.prototype.readInt32LE=function(e,t){return E(this,e,!0,t)},f.prototype.readInt32BE=function(e,t){return E(this,e,!1,t)},f.prototype.readFloatLE=function(e,t){return I(this,e,!0,t)},f.prototype.readFloatBE=function(e,t){return I(this,e,!1,t)},f.prototype.readDoubleLE=function(e,t){return A(this,e,!0,t)},f.prototype.readDoubleBE=function(e,t){return A(this,e,!1,t)},f.prototype.writeUInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"trying to write beyond buffer length\"),Y(e,255)),t>=this.length||(this[t]=e)},f.prototype.writeUInt16LE=function(e,t,n){s(this,e,t,!0,n)},f.prototype.writeUInt16BE=function(e,t,n){s(this,e,t,!1,n)},f.prototype.writeUInt32LE=function(e,t,n){l(this,e,t,!0,n)},f.prototype.writeUInt32BE=function(e,t,n){l(this,e,t,!1,n)},f.prototype.writeInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"Trying to write beyond buffer length\"),F(e,127,-128)),t>=this.length||(0<=e?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},f.prototype.writeInt16LE=function(e,t,n){B(this,e,t,!0,n)},f.prototype.writeInt16BE=function(e,t,n){B(this,e,t,!1,n)},f.prototype.writeInt32LE=function(e,t,n){L(this,e,t,!0,n)},f.prototype.writeInt32BE=function(e,t,n){L(this,e,t,!1,n)},f.prototype.writeFloatLE=function(e,t,n){U(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){U(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){x(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){x(this,e,t,!1,n)},f.prototype.fill=function(e,t,n){if(t=t||0,n=n||this.length,d(\"number\"==typeof(e=\"string\"==typeof(e=e||0)?e.charCodeAt(0):e)&&!isNaN(e),\"value is not a number\"),d(t<=n,\"end < start\"),n!==t&&0!==this.length){d(0<=t&&t<this.length,\"start out of bounds\"),d(0<=n&&n<=this.length,\"end out of bounds\");for(var r=t;r<n;r++)this[r]=e}},f.prototype.inspect=function(){for(var e=[],t=this.length,n=0;n<t;n++)if(e[n]=k(this[n]),n===H.INSPECT_MAX_BYTES){e[n+1]=\"...\";break}return\"<Buffer \"+e.join(\" \")+\">\"},f.prototype.toArrayBuffer=function(){if(\"undefined\"==typeof Uint8Array)throw new Error(\"Buffer.toArrayBuffer not supported in this browser\");if(f._useTypedArrays)return new f(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer};var t=f.prototype;function S(e,t,n){return\"number\"!=typeof e?n:t<=(e=~~e)?t:0<=e||0<=(e+=t)?e:0}function j(e){return(e=~~Math.ceil(+e))<0?0:e}function C(e){return(Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)})(e)}function k(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function T(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else for(var o=n,i=(55296<=r&&r<=57343&&n++,encodeURIComponent(e.slice(o,n+1)).substr(1).split(\"%\")),u=0;u<i.length;u++)t.push(parseInt(i[u],16))}return t}function M(e){return a.toByteArray(e)}function c(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function N(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function Y(e,t){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(0<=e,\"specified a negative value for writing an unsigned value\"),d(e<=t,\"value is larger than maximum value for type\"),d(Math.floor(e)===e,\"value has a fractional component\")}function F(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\"),d(Math.floor(e)===e,\"value has a fractional component\")}function D(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\")}function d(e,t){if(!e)throw new Error(t||\"Failed assertion\")}f._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=t.get,e.set=t.set,e.write=t.write,e.toString=t.toString,e.toLocaleString=t.toString,e.toJSON=t.toJSON,e.copy=t.copy,e.slice=t.slice,e.readUInt8=t.readUInt8,e.readUInt16LE=t.readUInt16LE,e.readUInt16BE=t.readUInt16BE,e.readUInt32LE=t.readUInt32LE,e.readUInt32BE=t.readUInt32BE,e.readInt8=t.readInt8,e.readInt16LE=t.readInt16LE,e.readInt16BE=t.readInt16BE,e.readInt32LE=t.readInt32LE,e.readInt32BE=t.readInt32BE,e.readFloatLE=t.readFloatLE,e.readFloatBE=t.readFloatBE,e.readDoubleLE=t.readDoubleLE,e.readDoubleBE=t.readDoubleBE,e.writeUInt8=t.writeUInt8,e.writeUInt16LE=t.writeUInt16LE,e.writeUInt16BE=t.writeUInt16BE,e.writeUInt32LE=t.writeUInt32LE,e.writeUInt32BE=t.writeUInt32BE,e.writeInt8=t.writeInt8,e.writeInt16LE=t.writeInt16LE,e.writeInt16BE=t.writeInt16BE,e.writeInt32LE=t.writeInt32LE,e.writeInt32BE=t.writeInt32BE,e.writeFloatLE=t.writeFloatLE,e.writeFloatBE=t.writeFloatBE,e.writeDoubleLE=t.writeDoubleLE,e.writeDoubleBE=t.writeDoubleBE,e.fill=t.fill,e.inspect=t.inspect,e.toArrayBuffer=t.toArrayBuffer,e}}.call(this,O(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},O(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/buffer/index.js\",\"/node_modules/gulp-browserify/node_modules/buffer\")},{\"base64-js\":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(c,d,e){!function(e,t,a,n,r,o,i,u,s){var a=c(\"buffer\").Buffer,f=4,l=new a(f);l.fill(0);d.exports={hash:function(e,t,n,r){for(var o=t(function(e,t){e.length%f!=0&&(n=e.length+(f-e.length%f),e=a.concat([e,l],n));for(var n,r=[],o=t?e.readInt32BE:e.readInt32LE,i=0;i<e.length;i+=f)r.push(o.call(e,i));return r}(e=a.isBuffer(e)?e:new a(e),r),8*e.length),t=r,i=new a(n),u=t?i.writeInt32BE:i.writeInt32LE,s=0;s<o.length;s++)u.call(i,o[s],4*s,!0);return i}}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],5:[function(v,e,_){!function(l,c,u,d,h,p,g,y,w){var u=v(\"buffer\").Buffer,e=v(\"./sha\"),t=v(\"./sha256\"),n=v(\"./rng\"),b={sha1:e,sha256:t,md5:v(\"./md5\")},s=64,a=new u(s);function r(e,n){var r=b[e=e||\"sha1\"],o=[];return r||i(\"algorithm:\",e,\"is not yet supported\"),{update:function(e){return u.isBuffer(e)||(e=new u(e)),o.push(e),e.length,this},digest:function(e){var t=u.concat(o),t=n?function(e,t,n){u.isBuffer(t)||(t=new u(t)),u.isBuffer(n)||(n=new u(n)),t.length>s?t=e(t):t.length<s&&(t=u.concat([t,a],s));for(var r=new u(s),o=new u(s),i=0;i<s;i++)r[i]=54^t[i],o[i]=92^t[i];return n=e(u.concat([r,n])),e(u.concat([o,n]))}(r,n,t):r(t);return o=null,e?t.toString(e):t}}}function i(){var e=[].slice.call(arguments).join(\" \");throw new Error([e,\"we accept pull requests\",\"http://github.com/dominictarr/crypto-browserify\"].join(\"\\n\"))}a.fill(0),_.createHash=function(e){return r(e)},_.createHmac=r,_.randomBytes=function(e,t){if(!t||!t.call)return new u(n(e));try{t.call(this,void 0,new u(n(e)))}catch(e){t(e)}};var o,f=[\"createCredentials\",\"createCipher\",\"createCipheriv\",\"createDecipher\",\"createDecipheriv\",\"createSign\",\"createVerify\",\"createDiffieHellman\",\"pbkdf2\"],m=function(e){_[e]=function(){i(\"sorry,\",e,\"is not implemented yet\")}};for(o in f)m(f[o],o)}.call(this,v(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},v(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./md5\":6,\"./rng\":7,\"./sha\":8,\"./sha256\":9,buffer:3,lYpoI2:11}],6:[function(w,b,e){!function(e,r,o,i,u,a,f,l,y){var t=w(\"./helpers\");function n(e,t){e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u<e.length;u+=16){var s=n,a=r,f=o,l=i,n=c(n,r,o,i,e[u+0],7,-680876936),i=c(i,n,r,o,e[u+1],12,-389564586),o=c(o,i,n,r,e[u+2],17,606105819),r=c(r,o,i,n,e[u+3],22,-1044525330);n=c(n,r,o,i,e[u+4],7,-176418897),i=c(i,n,r,o,e[u+5],12,1200080426),o=c(o,i,n,r,e[u+6],17,-1473231341),r=c(r,o,i,n,e[u+7],22,-45705983),n=c(n,r,o,i,e[u+8],7,1770035416),i=c(i,n,r,o,e[u+9],12,-1958414417),o=c(o,i,n,r,e[u+10],17,-42063),r=c(r,o,i,n,e[u+11],22,-1990404162),n=c(n,r,o,i,e[u+12],7,1804603682),i=c(i,n,r,o,e[u+13],12,-40341101),o=c(o,i,n,r,e[u+14],17,-1502002290),n=d(n,r=c(r,o,i,n,e[u+15],22,1236535329),o,i,e[u+1],5,-165796510),i=d(i,n,r,o,e[u+6],9,-1069501632),o=d(o,i,n,r,e[u+11],14,643717713),r=d(r,o,i,n,e[u+0],20,-373897302),n=d(n,r,o,i,e[u+5],5,-701558691),i=d(i,n,r,o,e[u+10],9,38016083),o=d(o,i,n,r,e[u+15],14,-660478335),r=d(r,o,i,n,e[u+4],20,-405537848),n=d(n,r,o,i,e[u+9],5,568446438),i=d(i,n,r,o,e[u+14],9,-1019803690),o=d(o,i,n,r,e[u+3],14,-187363961),r=d(r,o,i,n,e[u+8],20,1163531501),n=d(n,r,o,i,e[u+13],5,-1444681467),i=d(i,n,r,o,e[u+2],9,-51403784),o=d(o,i,n,r,e[u+7],14,1735328473),n=h(n,r=d(r,o,i,n,e[u+12],20,-1926607734),o,i,e[u+5],4,-378558),i=h(i,n,r,o,e[u+8],11,-2022574463),o=h(o,i,n,r,e[u+11],16,1839030562),r=h(r,o,i,n,e[u+14],23,-35309556),n=h(n,r,o,i,e[u+1],4,-1530992060),i=h(i,n,r,o,e[u+4],11,1272893353),o=h(o,i,n,r,e[u+7],16,-155497632),r=h(r,o,i,n,e[u+10],23,-1094730640),n=h(n,r,o,i,e[u+13],4,681279174),i=h(i,n,r,o,e[u+0],11,-358537222),o=h(o,i,n,r,e[u+3],16,-722521979),r=h(r,o,i,n,e[u+6],23,76029189),n=h(n,r,o,i,e[u+9],4,-640364487),i=h(i,n,r,o,e[u+12],11,-421815835),o=h(o,i,n,r,e[u+15],16,530742520),n=p(n,r=h(r,o,i,n,e[u+2],23,-995338651),o,i,e[u+0],6,-198630844),i=p(i,n,r,o,e[u+7],10,1126891415),o=p(o,i,n,r,e[u+14],15,-1416354905),r=p(r,o,i,n,e[u+5],21,-57434055),n=p(n,r,o,i,e[u+12],6,1700485571),i=p(i,n,r,o,e[u+3],10,-1894986606),o=p(o,i,n,r,e[u+10],15,-1051523),r=p(r,o,i,n,e[u+1],21,-2054922799),n=p(n,r,o,i,e[u+8],6,1873313359),i=p(i,n,r,o,e[u+15],10,-30611744),o=p(o,i,n,r,e[u+6],15,-1560198380),r=p(r,o,i,n,e[u+13],21,1309151649),n=p(n,r,o,i,e[u+4],6,-145523070),i=p(i,n,r,o,e[u+11],10,-1120210379),o=p(o,i,n,r,e[u+2],15,718787259),r=p(r,o,i,n,e[u+9],21,-343485551),n=g(n,s),r=g(r,a),o=g(o,f),i=g(i,l)}return Array(n,r,o,i)}function s(e,t,n,r,o,i){return g((t=g(g(t,e),g(r,i)))<<o|t>>>32-o,n)}function c(e,t,n,r,o,i,u){return s(t&n|~t&r,e,t,o,i,u)}function d(e,t,n,r,o,i,u){return s(t&r|n&~r,e,t,o,i,u)}function h(e,t,n,r,o,i,u){return s(t^n^r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return s(n^(t|~r),e,t,o,i,u)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}b.exports=function(e){return t.hash(e,n,16)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],7:[function(e,l,t){!function(e,t,n,r,o,i,u,s,f){var a;l.exports=a||function(e){for(var t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],8:[function(c,d,e){!function(e,t,n,r,o,s,a,f,l){var i=c(\"./helpers\");function u(l,c){l[c>>5]|=128<<24-c%32,l[15+(c+64>>9<<4)]=c;for(var e,t,n,r=Array(80),o=1732584193,i=-271733879,u=-1732584194,s=271733878,d=-1009589776,h=0;h<l.length;h+=16){for(var p=o,g=i,y=u,w=s,b=d,a=0;a<80;a++){r[a]=a<16?l[h+a]:v(r[a-3]^r[a-8]^r[a-14]^r[a-16],1);var f=m(m(v(o,5),(f=i,t=u,n=s,(e=a)<20?f&t|~f&n:!(e<40)&&e<60?f&t|f&n|t&n:f^t^n)),m(m(d,r[a]),(e=a)<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514)),d=s,s=u,u=v(i,30),i=o,o=f}o=m(o,p),i=m(i,g),u=m(u,y),s=m(s,w),d=m(d,b)}return Array(o,i,u,s,d)}function m(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function v(e,t){return e<<t|e>>>32-t}d.exports=function(e){return i.hash(e,u,20,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],9:[function(c,d,e){!function(e,t,n,r,u,s,a,f,l){function b(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function o(e,l){var c,d=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),t=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),n=new Array(64);e[l>>5]|=128<<24-l%32,e[15+(l+64>>9<<4)]=l;for(var r,o,h=0;h<e.length;h+=16){for(var i=t[0],u=t[1],s=t[2],p=t[3],a=t[4],g=t[5],y=t[6],w=t[7],f=0;f<64;f++)n[f]=f<16?e[f+h]:b(b(b((o=n[f-2],m(o,17)^m(o,19)^v(o,10)),n[f-7]),(o=n[f-15],m(o,7)^m(o,18)^v(o,3))),n[f-16]),c=b(b(b(b(w,m(o=a,6)^m(o,11)^m(o,25)),a&g^~a&y),d[f]),n[f]),r=b(m(r=i,2)^m(r,13)^m(r,22),i&u^i&s^u&s),w=y,y=g,g=a,a=b(p,c),p=s,s=u,u=i,i=b(c,r);t[0]=b(i,t[0]),t[1]=b(u,t[1]),t[2]=b(s,t[2]),t[3]=b(p,t[3]),t[4]=b(a,t[4]),t[5]=b(g,t[5]),t[6]=b(y,t[6]),t[7]=b(w,t[7])}return t}var i=c(\"./helpers\"),m=function(e,t){return e>>>t|e<<32-t},v=function(e,t){return e>>>t};d.exports=function(e){return i.hash(e,o,32,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],10:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){f.read=function(e,t,n,r,o){var i,u,l=8*o-r-1,c=(1<<l)-1,d=c>>1,s=-7,a=n?o-1:0,f=n?-1:1,o=e[t+a];for(a+=f,i=o&(1<<-s)-1,o>>=-s,s+=l;0<s;i=256*i+e[t+a],a+=f,s-=8);for(u=i&(1<<-s)-1,i>>=-s,s+=r;0<s;u=256*u+e[t+a],a+=f,s-=8);if(0===i)i=1-d;else{if(i===c)return u?NaN:1/0*(o?-1:1);u+=Math.pow(2,r),i-=d}return(o?-1:1)*u*Math.pow(2,i-r)},f.write=function(e,t,l,n,r,c){var o,i,u=8*c-r-1,s=(1<<u)-1,a=s>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:c-1,h=n?1:-1,c=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(i=isNaN(t)?1:0,o=s):(o=Math.floor(Math.log(t)/Math.LN2),t*(n=Math.pow(2,-o))<1&&(o--,n*=2),2<=(t+=1<=o+a?d/n:d*Math.pow(2,1-a))*n&&(o++,n/=2),s<=o+a?(i=0,o=s):1<=o+a?(i=(t*n-1)*Math.pow(2,r),o+=a):(i=t*Math.pow(2,a-1)*Math.pow(2,r),o=0));8<=r;e[l+f]=255&i,f+=h,i/=256,r-=8);for(o=o<<r|i,u+=r;0<u;e[l+f]=255&o,f+=h,o/=256,u-=8);e[l+f-h]|=128*c}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/ieee754/index.js\",\"/node_modules/gulp-browserify/node_modules/ieee754\")},{buffer:3,lYpoI2:11}],11:[function(e,h,t){!function(e,t,n,r,o,f,l,c,d){var i,u,s;function a(){}(e=h.exports={}).nextTick=(u=\"undefined\"!=typeof window&&window.setImmediate,s=\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener,u?function(e){return window.setImmediate(e)}:s?(i=[],window.addEventListener(\"message\",function(e){var t=e.source;t!==window&&null!==t||\"process-tick\"!==e.data||(e.stopPropagation(),0<i.length&&i.shift()())},!0),function(e){i.push(e),window.postMessage(\"process-tick\",\"*\")}):function(e){setTimeout(e,0)}),e.title=\"browser\",e.browser=!0,e.env={},e.argv=[],e.on=a,e.addListener=a,e.once=a,e.off=a,e.removeListener=a,e.removeAllListeners=a,e.emit=a,e.binding=function(e){throw new Error(\"process.binding is not supported\")},e.cwd=function(){return\"/\"},e.chdir=function(e){throw new Error(\"process.chdir is not supported\")}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/process/browser.js\",\"/node_modules/gulp-browserify/node_modules/process\")},{buffer:3,lYpoI2:11}]},{},[1])(1)});","import { xFindClosestIndex } from 'ml-spectra-processing';\n\nexport function getFromToIndex(xs, range) {\n  let { from, to } = range;\n  if (from === undefined) {\n    from = xs[0];\n  }\n  if (to === undefined) {\n    to = xs[xs.length - 1];\n  }\n\n  return {\n    fromIndex: xFindClosestIndex(xs, from),\n    toIndex: xFindClosestIndex(xs, to),\n  };\n}\n","import { xSum, xMultiply } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function integration(matrix, normalizedTarget, range = {}) {\n  let fromToIndex = getFromToIndex(normalizedTarget.x, range);\n\n  let targetValue = xSum(normalizedTarget.y, fromToIndex);\n  let values = matrix.map((row) => xSum(row, fromToIndex));\n\n  for (let i = 0; i < matrix.length; i++) {\n    let factor = targetValue / values[i];\n    matrix[i] = xMultiply(matrix[i], factor);\n  }\n}\n","import { xMaxValue, xMultiply } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function max(matrix, normalizedTarget, range = {}) {\n  let fromToIndex = getFromToIndex(normalizedTarget.x, range);\n\n  let targetValue = xMaxValue(normalizedTarget.y, fromToIndex);\n  let values = matrix.map((row) => xMaxValue(row, fromToIndex));\n\n  for (let i = 0; i < matrix.length; i++) {\n    let factor = targetValue / values[i];\n    matrix[i] = xMultiply(matrix[i], factor);\n  }\n}\n","import { xMinValue, xMultiply } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function min(matrix, normalizedTarget, range = {}) {\n  let fromToIndex = getFromToIndex(normalizedTarget.x, range);\n\n  let targetValue = xMinValue(normalizedTarget.y, fromToIndex);\n  let values = matrix.map((row) => xMinValue(row, fromToIndex));\n\n  for (let i = 0; i < matrix.length; i++) {\n    let factor = targetValue / values[i];\n    matrix[i] = xMultiply(matrix[i], factor);\n  }\n}\n","import { xMinValue, xMaxValue } from 'ml-spectra-processing';\n\nimport { getFromToIndex } from './getFromToIndex';\n\nexport function minMax(matrix, normalizedTarget, range = {}) {\n  let fromToIndex = getFromToIndex(normalizedTarget.x, range);\n  let targetValue = {\n    min: xMinValue(normalizedTarget.y, fromToIndex),\n    max: xMaxValue(normalizedTarget.y, fromToIndex),\n  };\n\n  let deltaTarget = targetValue.max - targetValue.min;\n  let minTarget = targetValue.min;\n\n  let values = matrix.map((row) => {\n    return {\n      min: xMinValue(row, fromToIndex),\n      max: xMaxValue(row, fromToIndex),\n    };\n  });\n  for (let i = 0; i < matrix.length; i++) {\n    let deltaSource = values[i].max - values[i].min;\n    let minSource = values[i].min;\n    let newData = [];\n    for (let j = 0; j < normalizedTarget.y.length; j++) {\n      newData.push(\n        ((matrix[i][j] - minSource) / deltaSource) * deltaTarget + minTarget,\n      );\n    }\n    matrix[i] = newData;\n  }\n}\n","import {\n  xSubtract,\n  xyMaxYPoint,\n  xSum,\n  matrixPQN,\n  matrixZRescale,\n  matrixCenterZMean,\n} from 'ml-spectra-processing';\nimport hash from 'object-hash';\n\nimport { getNormalizedData } from './getNormalizedData';\nimport { getFromToIndex } from './scaled/getFromToIndex';\nimport { integration } from './scaled/integration';\nimport { max } from './scaled/max';\nimport { min } from './scaled/min';\nimport { minMax } from './scaled/minMax';\n/**\n * Allows to calculate relative intensity between normalized spectra\n * @param {SpectraProcessor} spectraProcessor\n * @param {object}   [options={}] scale spectra based on various parameters\n * @param {Array}    [options.ids] ids of selected spectra\n * @param {Array}    [options.filters=[]] Array of object containing {name:'', options:''}\n * @param {object}   [options.scale={}] object containing the options for rescaling\n * @param {string}   [options.scale.targetID=spectra[0].id]\n * @param {string}   [options.scale.method='max'] min, max, integration, minMax\n * @param {Array}    [options.scale.range] from - to to apply the method and rescale\n * @param {boolean}  [options.scale.relative=false]\n * @param {Array}    [options.ranges] Array of object containing {from:'', to:'', label:''}\n * @param {Array}    [options.calculations] Array of object containing {label:'', formula:''}\n * @returns {object} { ids:[], matrix:[Array], meta:[object], x:[], ranges:[object] }\n */\n\nlet cache = {};\n\nexport function getPostProcessedData(spectraProcessor, options = {}) {\n  /**\n   * could implement a cache if all the options are identical and the normalized data is identical as well\n   * in order ot check if the normalized data are identical we should check if the normalized array of all the spectra are identical\n   * Because we don't make in-place modification when creating normalized array we can check if the 'pointer' to the object\n   * is identical\n   */\n\n  const optionsHash = hash(options);\n\n  if (!spectraProcessor.spectra || !spectraProcessor.spectra[0]) return {};\n  const { scale = {}, ids, ranges, calculations, filters = [] } = options;\n\n  const { range, targetID, relative, method = '' } = scale;\n\n  let spectra = spectraProcessor.getSpectra(ids);\n\n  // are we able to reuse the cache ?\n  // we can if the normalized information didn't change and optionsHash is the same\n  if (cache.optionsHash === optionsHash) {\n    let validCache = true;\n    for (let spectrum of spectra) {\n      if (!cache.weakMap.get(spectrum.normalized)) validCache = false;\n    }\n    if (validCache) return cache;\n  }\n  const weakMap = new WeakMap();\n  for (let spectrum of spectra) {\n    weakMap.set(spectrum.normalized, true);\n  }\n\n  let normalizedData = getNormalizedData(spectra);\n\n  for (let filter of filters) {\n    switch (filter.name) {\n      case 'pqn': {\n        normalizedData.matrix = matrixPQN(\n          normalizedData.matrix,\n          filter.options,\n        ).data;\n        break;\n      }\n      case 'centerMean': {\n        normalizedData.matrix = matrixCenterZMean(normalizedData.matrix);\n        break;\n      }\n      case 'rescale': {\n        normalizedData.matrix = matrixZRescale(\n          normalizedData.matrix,\n          filter.options,\n        );\n        break;\n      }\n      case '':\n      case undefined:\n        break;\n      default:\n        throw new Error(`Unknown matrix filter name: ${filter.name}`);\n    }\n  }\n\n  let normalizedTarget = targetID\n    ? spectraProcessor.getSpectrum(targetID).normalized\n    : spectraProcessor.spectra[0].normalized;\n\n  if (method) {\n    switch (method.toLowerCase()) {\n      case 'min':\n        min(normalizedData.matrix, normalizedTarget, range);\n        break;\n      case 'max':\n        max(normalizedData.matrix, normalizedTarget, range);\n        break;\n      case 'minmax':\n        minMax(normalizedData.matrix, normalizedTarget, range);\n        break;\n      case 'integration':\n        integration(normalizedData.matrix, normalizedTarget, range);\n        break;\n      default:\n        throw new Error(`getPostProcessedData: unknown method: ${method}`);\n    }\n  }\n\n  if (relative) {\n    for (let i = 0; i < normalizedData.matrix.length; i++) {\n      normalizedData.matrix[i] = xSubtract(\n        normalizedData.matrix[i],\n        normalizedTarget.y,\n      );\n    }\n  }\n\n  if (ranges) {\n    normalizedData.ranges = [];\n    for (let i = 0; i < normalizedData.matrix.length; i++) {\n      let rangesCopy = JSON.parse(JSON.stringify(ranges));\n      let yNormalized = normalizedData.matrix[i];\n      let resultRanges = {};\n      normalizedData.ranges.push(resultRanges);\n      for (let currentRange of rangesCopy) {\n        if (currentRange.label) {\n          let fromToIndex = getFromToIndex(normalizedTarget.x, currentRange);\n\n          let deltaX = normalizedTarget.x[1] - normalizedTarget.x[0];\n\n          currentRange.integration = xSum(yNormalized, fromToIndex) * deltaX;\n          currentRange.maxPoint = xyMaxYPoint(\n            { x: normalizedData.x, y: yNormalized },\n            fromToIndex,\n          );\n          resultRanges[currentRange.label] = currentRange;\n        }\n      }\n    }\n  }\n\n  if (calculations && normalizedData.ranges) {\n    normalizedData.calculations = normalizedData.ranges.map(() => {\n      return {};\n    });\n    const parameters = Object.keys(normalizedData.ranges[0]);\n    for (let calculation of calculations) {\n      // eslint-disable-next-line no-new-func\n      const callback = new Function(\n        ...parameters,\n        `return ${calculation.formula}`,\n      );\n      for (let i = 0; i < normalizedData.ranges.length; i++) {\n        let oneRanges = normalizedData.ranges[i];\n        let values = parameters.map((key) => oneRanges[key].integration);\n        normalizedData.calculations[i][calculation.label] = callback(...values);\n      }\n    }\n  }\n\n  cache = { ...normalizedData, optionsHash, weakMap };\n  return cache;\n}\n","// Based on https://github.com/scijs/cholesky-solve\r\n\r\n/*\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2013 Eric Arnebäck\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nfunction ldlSymbolic(\r\n  n /* A and L are n-by-n, where n >= 0 */,\r\n  Ap /* input of size n + 1, not modified */,\r\n  Ai /* input of size nz=Ap[n], not modified */,\r\n  Lp /* output of size n + 1, not defined on input */,\r\n  Parent /* output of size n, not defined on input */,\r\n  Lnz /* output of size n, not defined on input */,\r\n  Flag /* workspace of size n, not defn. on input or output */,\r\n) {\r\n  let i, k, p, kk, p2;\r\n\r\n  for (k = 0; k < n; k++) {\r\n    /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */\r\n    Parent[k] = -1; /* parent of k is not yet known */\r\n    Flag[k] = k; /* mark node k as visited */\r\n    Lnz[k] = 0; /* count of nonzeros in column k of L */\r\n    kk = k; /* kth original, or permuted, column */\r\n    p2 = Ap[kk + 1];\r\n    for (p = Ap[kk]; p < p2; p++) {\r\n      /* A (i,k) is nonzero (original or permuted A) */\r\n      i = Ai[p];\r\n\r\n      if (i < k) {\r\n        /* follow path from i to root of etree, stop at flagged node */\r\n        for (; Flag[i] !== k; i = Parent[i]) {\r\n          /* find parent of i if not yet determined */\r\n          if (Parent[i] === -1) Parent[i] = k;\r\n          Lnz[i]++; /* L (k,i) is nonzero */\r\n          Flag[i] = k; /* mark i as visited */\r\n        }\r\n      }\r\n    }\r\n  }\r\n  /* construct Lp index array from Lnz column counts */\r\n  Lp[0] = 0;\r\n  for (k = 0; k < n; k++) {\r\n    Lp[k + 1] = Lp[k] + Lnz[k];\r\n  }\r\n}\r\n\r\nfunction ldlNumeric(\r\n  n /* A and L are n-by-n, where n >= 0 */,\r\n  Ap /* input of size n+1, not modified */,\r\n  Ai /* input of size nz=Ap[n], not modified */,\r\n  Ax /* input of size nz=Ap[n], not modified */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Parent /* input of size n, not modified */,\r\n  Lnz /* output of size n, not defn. on input */,\r\n  Li /* output of size lnz=Lp[n], not defined on input */,\r\n  Lx /* output of size lnz=Lp[n], not defined on input */,\r\n  D /* output of size n, not defined on input */,\r\n  Y /* workspace of size n, not defn. on input or output */,\r\n  Pattern /* workspace of size n, not defn. on input or output */,\r\n  Flag /* workspace of size n, not defn. on input or output */,\r\n) {\r\n  let yi, lKi;\r\n  let i, k, p, kk, p2, len, top;\r\n  for (k = 0; k < n; k++) {\r\n    /* compute nonzero Pattern of kth row of L, in topological order */\r\n    Y[k] = 0.0; /* Y(0:k) is now all zero */\r\n    top = n; /* stack for pattern is empty */\r\n    Flag[k] = k; /* mark node k as visited */\r\n    Lnz[k] = 0; /* count of nonzeros in column k of L */\r\n    kk = k; /* kth original, or permuted, column */\r\n    p2 = Ap[kk + 1];\r\n    for (p = Ap[kk]; p < p2; p++) {\r\n      i = Ai[p]; /* get A(i,k) */\r\n      if (i <= k) {\r\n        Y[i] += Ax[p]; /* scatter A(i,k) into Y (sum duplicates) */\r\n        for (len = 0; Flag[i] !== k; i = Parent[i]) {\r\n          Pattern[len++] = i; /* L(k,i) is nonzero */\r\n          Flag[i] = k; /* mark i as visited */\r\n        }\r\n        while (len > 0) Pattern[--top] = Pattern[--len];\r\n      }\r\n    }\r\n    /* compute numerical values kth row of L (a sparse triangular solve) */\r\n    D[k] = Y[k]; /* get D(k,k) and clear Y(k) */\r\n    Y[k] = 0.0;\r\n    for (; top < n; top++) {\r\n      i = Pattern[top]; /* Pattern[top:n-1] is pattern of L(:,k) */\r\n      yi = Y[i]; /* get and clear Y(i) */\r\n      Y[i] = 0.0;\r\n      p2 = Lp[i] + Lnz[i];\r\n      for (p = Lp[i]; p < p2; p++) {\r\n        Y[Li[p]] -= Lx[p] * yi;\r\n      }\r\n      lKi = yi / D[i]; /* the nonzero entry L(k,i) */\r\n      D[k] -= lKi * yi;\r\n      Li[p] = k; /* store L(k,i) in column form of L */\r\n      Lx[p] = lKi;\r\n      Lnz[i]++; /* increment count of nonzeros in col i */\r\n    }\r\n\r\n    if (D[k] === 0.0) return k; /* failure, D(k,k) is zero */\r\n  }\r\n\r\n  return n; /* success, diagonal of D is all nonzero */\r\n}\r\n\r\nfunction ldlLsolve(\r\n  n /* L is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Li /* input of size lnz=Lp[n], not modified */,\r\n  Lx /* input of size lnz=Lp[n], not modified */,\r\n) {\r\n  let j, p, p2;\r\n  for (j = 0; j < n; j++) {\r\n    p2 = Lp[j + 1];\r\n    for (p = Lp[j]; p < p2; p++) {\r\n      X[Li[p]] -= Lx[p] * X[j];\r\n    }\r\n  }\r\n}\r\nfunction ldlDsolve(\r\n  n /* D is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  D /* input of size n, not modified */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[j] /= D[j];\r\n  }\r\n}\r\nfunction ldlLTsolve(\r\n  n /* L is n-by-n, where n >= 0 */,\r\n  X /* size n. right-hand-side on input, soln. on output */,\r\n  Lp /* input of size n+1, not modified */,\r\n  Li /* input of size lnz=Lp[n], not modified */,\r\n  Lx /* input of size lnz=Lp[n], not modified */,\r\n) {\r\n  let j, p, p2;\r\n  for (j = n - 1; j >= 0; j--) {\r\n    p2 = Lp[j + 1];\r\n    for (p = Lp[j]; p < p2; p++) {\r\n      X[j] -= Lx[p] * X[Li[p]];\r\n    }\r\n  }\r\n}\r\n\r\nfunction ldlPerm(\r\n  n /* size of X, B, and P */,\r\n  X /* output of size n. */,\r\n  B /* input of size n. */,\r\n  P /* input permutation array of size n. */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[j] = B[P[j]];\r\n  }\r\n}\r\n\r\nfunction ldlPermt(\r\n  n /* size of X, B, and P */,\r\n  X /* output of size n. */,\r\n  B /* input of size n. */,\r\n  P /* input permutation array of size n. */,\r\n) {\r\n  let j;\r\n  for (j = 0; j < n; j++) {\r\n    X[P[j]] = B[j];\r\n  }\r\n}\r\n\r\nfunction prepare(M, n, P) {\r\n  // if a permutation was specified, apply it.\r\n  if (P) {\r\n    let Pinv = new Array(n);\r\n\r\n    for (let k = 0; k < n; k++) {\r\n      Pinv[P[k]] = k;\r\n    }\r\n\r\n    let Mt = []; // scratch memory\r\n    // Apply permutation. We make M into P*M*P^T\r\n    for (let a = 0; a < M.length; ++a) {\r\n      let ar = Pinv[M[a][0]];\r\n      let ac = Pinv[M[a][1]];\r\n\r\n      // we only store the upper-diagonal elements(since we assume matrix is symmetric, we only need to store these)\r\n      // if permuted element is below diagonal, we simply transpose it.\r\n      if (ac < ar) {\r\n        let t = ac;\r\n        ac = ar;\r\n        ar = t;\r\n      }\r\n\r\n      Mt[a] = [];\r\n      Mt[a][0] = ar;\r\n      Mt[a][1] = ac;\r\n      Mt[a][2] = M[a][2];\r\n    }\r\n\r\n    M = Mt; // copy scratch memory.\r\n  } else {\r\n    // if P argument is null, we just use an identity permutation.\r\n    P = [];\r\n    for (let i = 0; i < n; ++i) {\r\n      P[i] = i;\r\n    }\r\n  }\r\n\r\n  // The sparse matrix we are decomposing is A.\r\n  // Now we shall create A from M.\r\n  let Ap = new Array(n + 1);\r\n  let Ai = new Array(M.length);\r\n  let Ax = new Array(M.length);\r\n\r\n  // count number of non-zero elements in columns.\r\n  let LNZ = [];\r\n  for (let i = 0; i < n; ++i) {\r\n    LNZ[i] = 0;\r\n  }\r\n  for (let a = 0; a < M.length; ++a) {\r\n    LNZ[M[a][1]]++;\r\n  }\r\n\r\n  Ap[0] = 0;\r\n  for (let i = 0; i < n; ++i) {\r\n    Ap[i + 1] = Ap[i] + LNZ[i];\r\n  }\r\n\r\n  let coloffset = [];\r\n  for (let a = 0; a < n; ++a) {\r\n    coloffset[a] = 0;\r\n  }\r\n\r\n  // go through all elements in M, and add them to sparse matrix A.\r\n  for (let i = 0; i < M.length; ++i) {\r\n    let e = M[i];\r\n    let col = e[1];\r\n\r\n    let adr = Ap[col] + coloffset[col];\r\n    Ai[adr] = e[0];\r\n    Ax[adr] = e[2];\r\n\r\n    coloffset[col]++;\r\n  }\r\n\r\n  let D = new Array(n);\r\n  let Y = new Array(n);\r\n  let Lp = new Array(n + 1);\r\n  let Parent = new Array(n);\r\n  let Lnz = new Array(n);\r\n  let Flag = new Array(n);\r\n  let Pattern = new Array(n);\r\n  let bp1 = new Array(n);\r\n  let x = new Array(n);\r\n  let d;\r\n\r\n  ldlSymbolic(n, Ap, Ai, Lp, Parent, Lnz, Flag);\r\n\r\n  let Lx = new Array(Lp[n]);\r\n  let Li = new Array(Lp[n]);\r\n\r\n  d = ldlNumeric(n, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Pattern, Flag);\r\n\r\n  if (d === n) {\r\n    return function (b) {\r\n      ldlPerm(n, bp1, b, P);\r\n      ldlLsolve(n, bp1, Lp, Li, Lx);\r\n      ldlDsolve(n, bp1, D);\r\n      ldlLTsolve(n, bp1, Lp, Li, Lx);\r\n      ldlPermt(n, x, bp1, P);\r\n\r\n      return x;\r\n    };\r\n  } else {\r\n    return null;\r\n  }\r\n}\r\n\r\nexport { prepare as default };\r\n","'use strict'\n\nmodule.exports = cuthillMckee\n\nfunction compareNum(a, b) { return a - b }\n\nfunction cuthillMckee(list, n) {\n  var adj = new Array(n)\n  var visited = new Array(n)\n  for(var i=0; i<n; ++i) {\n    adj[i]     = []\n    visited[i] = false\n  }\n\n  for(var i=0; i<list.length; ++i) {\n    var l = list[i]\n    adj[l[0]].push(l[1])\n  }\n\n  var toVisit = new Array(n)\n  var eol = 0\n  var ptr = 0\n  for(var i=0; i<n; ++i) {\n    if(visited[i]) {\n      continue\n    }\n    toVisit[eol++] = i\n    visited[i] = true\n    while(ptr < eol) {\n      var v = toVisit[ptr++]\n      var nbhd = adj[v]\n      nbhd.sort(compareNum)\n      for(var j=0; j<nbhd.length; ++j) {\n        var u = nbhd[j]\n        if(visited[u]) {\n          continue\n        }\n        visited[u] = true\n        toVisit[eol++] = u\n      }\n    }\n  }\n\n  var result = new Array(n)\n  for(var i=0; i<n; ++i) {\n    result[toVisit[i]] = i\n  }\n\n  return result\n}\n","import cuthillMckee from 'cuthill-mckee';\r\n\r\nconst getClosestNumber = (array = [], goal = 0) => {\r\n  const closest = array.reduce((prev, curr) => {\r\n    return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev;\r\n  });\r\n  return closest;\r\n};\r\n\r\nconst getCloseIndex = (array = [], goal = 0) => {\r\n  const closest = getClosestNumber(array, goal);\r\n  return array.indexOf(closest);\r\n};\r\n\r\nconst updateSystem = (matrix, y, weights) => {\r\n  let nbPoints = y.length;\r\n  let l = nbPoints - 1;\r\n  let newMatrix = new Array(matrix.length);\r\n  let newVector = new Float64Array(nbPoints);\r\n  for (let i = 0; i < l; i++) {\r\n    let w = weights[i];\r\n    let diag = i * 2;\r\n    let next = diag + 1;\r\n    newMatrix[diag] = matrix[diag].slice();\r\n    newMatrix[next] = matrix[next].slice();\r\n    if (w === 0) {\r\n      newVector[i] = 0;\r\n    } else {\r\n      newVector[i] = y[i] * w;\r\n      newMatrix[diag][2] += w;\r\n    }\r\n  }\r\n  newVector[l] = y[l] * weights[l];\r\n  newMatrix[l * 2] = matrix[l * 2].slice();\r\n  newMatrix[l * 2][2] += weights[l];\r\n\r\n  return [newMatrix, newVector];\r\n};\r\n\r\nconst getDeltaMatrix = (nbPoints, lambda) => {\r\n  let matrix = [];\r\n  let last = nbPoints - 1;\r\n  for (let i = 0; i < last; i++) {\r\n    matrix.push([i, i, lambda * 2]);\r\n    matrix.push([i + 1, i, -1 * lambda]);\r\n  }\r\n  matrix[0][2] = lambda;\r\n  matrix.push([last, last, lambda]);\r\n  return {\r\n    lowerTriangularNonZeros: matrix,\r\n    permutationEncodedArray: cuthillMckee(matrix, nbPoints),\r\n  };\r\n};\r\n\r\nexport { updateSystem, getDeltaMatrix, getCloseIndex, getClosestNumber };\r\n","import Cholesky from './choleskySolver';\r\nimport { updateSystem, getDeltaMatrix, getCloseIndex } from './utils';\r\n\r\n/**\r\n * Fit the baseline drift by iteratively changing weights of sum square error between the fitted baseline and original signals,\r\n * for further information about the parameters you can get the [paper of airPLS](https://github.com/zmzhang/airPLS/blob/master/airPLS_manuscript.pdf)\r\n * @param {Array<number>} x - x axis data useful when control points or zones are submitted\r\n * @param {Array<number>} y - Original data\r\n * @param {object} [options={}] - Options object\r\n * @param {number} [options.maxIterations = 100] - Maximal number of iterations if the method does not reach the stop criterion\r\n * @param {number} [options.factorCriterion = 0.001] - Factor of the sum of absolute value of original data, to compute stop criterion\r\n * @param {Array<number>} [options.weights = [1,1,...]] - Initial weights vector, default each point has the same weight\r\n * @param {number} [options.lambda = 100] - Factor of weights matrix in -> [I + lambda D'D]z = x\r\n * @param {Array<number>} [options.controlPoints = []] - Array of x axis values to force that baseline cross those points.\r\n * @param {Array<number>} [options.baseLineZones = []] - Array of x axis values (as from - to), to force that baseline cross those zones.\r\n * @returns {{corrected: Array<number>, error: number, iteration: number, baseline: Array<number>}}\r\n */\r\nfunction airPLS(x, y, options = {}) {\r\n  let {\r\n    maxIterations = 100,\r\n    lambda = 100,\r\n    factorCriterion = 0.001,\r\n    weights = new Array(y.length).fill(1),\r\n    controlPoints = [],\r\n    baseLineZones = [],\r\n  } = options;\r\n\r\n  if (controlPoints.length > 0) {\r\n    controlPoints.forEach((e, i, arr) => (arr[i] = getCloseIndex(x, e)));\r\n  }\r\n  if (baseLineZones.length > 0) {\r\n    baseLineZones.forEach((range) => {\r\n      let indexFrom = getCloseIndex(x, range.from);\r\n      let indexTo = getCloseIndex(x, range.to);\r\n      if (indexFrom > indexTo) [indexFrom, indexTo] = [indexTo, indexFrom];\r\n      for (let i = indexFrom; i < indexTo; i++) {\r\n        controlPoints.push(i);\r\n      }\r\n    });\r\n  }\r\n\r\n  let baseline, iteration;\r\n  let nbPoints = y.length;\r\n  let l = nbPoints - 1;\r\n  let sumNegDifferences = Number.MAX_SAFE_INTEGER;\r\n  let stopCriterion =\r\n    factorCriterion * y.reduce((sum, e) => Math.abs(e) + sum, 0);\r\n\r\n  let { lowerTriangularNonZeros, permutationEncodedArray } = getDeltaMatrix(\r\n    nbPoints,\r\n    lambda,\r\n  );\r\n\r\n  for (\r\n    iteration = 0;\r\n    iteration < maxIterations && Math.abs(sumNegDifferences) > stopCriterion;\r\n    iteration++\r\n  ) {\r\n    let [leftHandSide, rightHandSide] = updateSystem(\r\n      lowerTriangularNonZeros,\r\n      y,\r\n      weights,\r\n    );\r\n\r\n    let cho = Cholesky(leftHandSide, nbPoints, permutationEncodedArray);\r\n\r\n    baseline = cho(rightHandSide);\r\n\r\n    sumNegDifferences = 0;\r\n\r\n    let difference = y.map(calculateError);\r\n\r\n    let maxNegativeDiff = -1 * Number.MAX_SAFE_INTEGER;\r\n    for (let i = 1; i < l; i++) {\r\n      let diff = difference[i];\r\n      if (diff >= 0) {\r\n        weights[i] = 0;\r\n      } else {\r\n        weights[i] = Math.exp((iteration * diff) / sumNegDifferences);\r\n        if (maxNegativeDiff < diff) maxNegativeDiff = diff;\r\n      }\r\n    }\r\n\r\n    let value = Math.exp((iteration * maxNegativeDiff) / sumNegDifferences);\r\n    weights[0] = value;\r\n    weights[l] = value;\r\n    controlPoints.forEach((i) => (weights[i] = value));\r\n  }\r\n\r\n  return {\r\n    corrected: y.map((e, i) => e - baseline[i]),\r\n    baseline,\r\n    iteration,\r\n    error: sumNegDifferences,\r\n  };\r\n\r\n  function calculateError(e, i) {\r\n    let diff = e - baseline[i];\r\n    if (diff < 0) sumNegDifferences += diff;\r\n    return diff;\r\n  }\r\n}\r\n\r\nexport { airPLS as default };\r\n","import { isAnyArray } from 'is-any-array';\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n/**\n * Fill an array with sequential numbers\n * @param {Array<number>} [input] - optional destination array (if not provided a new array will be created)\n * @param {object} [options={}]\n * @param {number} [options.from=0] - first value in the array\n * @param {number} [options.to=10] - last value in the array\n * @param {number} [options.size=input.length] - size of the array (if not provided calculated from step)\n * @param {number} [options.step] - if not provided calculated from size\n * @return {Array<number>}\n */\n\nfunction sequentialFill() {\n  var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (_typeof(input) === 'object' && !isAnyArray(input)) {\n    options = input;\n    input = [];\n  }\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  var _options = options,\n      _options$from = _options.from,\n      from = _options$from === void 0 ? 0 : _options$from,\n      _options$to = _options.to,\n      to = _options$to === void 0 ? 10 : _options$to,\n      _options$size = _options.size,\n      size = _options$size === void 0 ? input.length : _options$size,\n      step = _options.step;\n\n  if (size !== 0 && step) {\n    throw new Error('step is defined by the array size');\n  }\n\n  if (!size) {\n    if (step) {\n      size = Math.floor((to - from) / step) + 1;\n    } else {\n      size = to - from + 1;\n    }\n  }\n\n  if (!step && size) {\n    step = (to - from) / (size - 1);\n  }\n\n  if (Array.isArray(input)) {\n    // only works with normal array\n    input.length = 0;\n\n    for (var i = 0; i < size; i++) {\n      input.push(from);\n      from += step;\n    }\n  } else {\n    if (input.length !== size) {\n      throw new Error('sequentialFill typed array must have the correct length');\n    }\n\n    for (var _i = 0; _i < size; _i++) {\n      input[_i] = from;\n      from += step;\n    }\n  }\n\n  return input;\n}\n\nexport { sequentialFill as default };\n","export default function maybeToPrecision(value, digits) {\n  if (value < 0) {\n    value = 0 - value;\n    if (typeof digits === 'number') {\n      return `- ${value.toPrecision(digits)}`;\n    } else {\n      return `- ${value.toString()}`;\n    }\n  } else {\n    if (typeof digits === 'number') {\n      return value.toPrecision(digits);\n    } else {\n      return value.toString();\n    }\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport { default as maybeToPrecision } from './maybeToPrecision';\nexport { default as checkArrayLength } from './checkArrayLength';\n\nexport default class BaseRegression {\n  constructor() {\n    if (new.target === BaseRegression) {\n      throw new Error('BaseRegression must be subclassed');\n    }\n  }\n\n  predict(x) {\n    if (typeof x === 'number') {\n      return this._predict(x);\n    } else if (isAnyArray(x)) {\n      const y = [];\n      for (let i = 0; i < x.length; i++) {\n        y.push(this._predict(x[i]));\n      }\n      return y;\n    } else {\n      throw new TypeError('x must be a number or array');\n    }\n  }\n\n  _predict() {\n    throw new Error('_predict must be implemented');\n  }\n\n  train() {\n    // Do nothing for this package\n  }\n\n  toString() {\n    return '';\n  }\n\n  toLaTeX() {\n    return '';\n  }\n\n  /**\n   * Return the correlation coefficient of determination (r) and chi-square.\n   * @param {Array<number>} x\n   * @param {Array<number>} y\n   * @return {object}\n   */\n  score(x, y) {\n    if (!isAnyArray(x) || !isAnyArray(y) || x.length !== y.length) {\n      throw new Error('x and y must be arrays of the same length');\n    }\n\n    const n = x.length;\n    const y2 = new Array(n);\n    for (let i = 0; i < n; i++) {\n      y2[i] = this._predict(x[i]);\n    }\n\n    let xSum = 0;\n    let ySum = 0;\n    let chi2 = 0;\n    let rmsd = 0;\n    let xSquared = 0;\n    let ySquared = 0;\n    let xY = 0;\n    for (let i = 0; i < n; i++) {\n      xSum += y2[i];\n      ySum += y[i];\n      xSquared += y2[i] * y2[i];\n      ySquared += y[i] * y[i];\n      xY += y2[i] * y[i];\n      if (y[i] !== 0) {\n        chi2 += ((y[i] - y2[i]) * (y[i] - y2[i])) / y[i];\n      }\n      rmsd += (y[i] - y2[i]) * (y[i] - y2[i]);\n    }\n\n    const r =\n      (n * xY - xSum * ySum) /\n      Math.sqrt((n * xSquared - xSum * xSum) * (n * ySquared - ySum * ySum));\n\n    return {\n      r: r,\n      r2: r * r,\n      chi2: chi2,\n      rmsd: Math.sqrt(rmsd / n),\n    };\n  }\n}\n","import { Matrix, MatrixTransposeView, solve } from 'ml-matrix';\nimport BaseRegression, {\n  checkArrayLength,\n  maybeToPrecision,\n} from 'ml-regression-base';\n\nexport default class PolynomialRegression extends BaseRegression {\n  constructor(x, y, degree) {\n    super();\n    if (x === true) {\n      this.degree = y.degree;\n      this.powers = y.powers;\n      this.coefficients = y.coefficients;\n    } else {\n      checkArrayLength(x, y);\n      regress(this, x, y, degree);\n    }\n  }\n\n  _predict(x) {\n    let y = 0;\n    for (let k = 0; k < this.powers.length; k++) {\n      y += this.coefficients[k] * Math.pow(x, this.powers[k]);\n    }\n    return y;\n  }\n\n  toJSON() {\n    return {\n      name: 'polynomialRegression',\n      degree: this.degree,\n      powers: this.powers,\n      coefficients: this.coefficients,\n    };\n  }\n\n  toString(precision) {\n    return this._toFormula(precision, false);\n  }\n\n  toLaTeX(precision) {\n    return this._toFormula(precision, true);\n  }\n\n  _toFormula(precision, isLaTeX) {\n    let sup = '^';\n    let closeSup = '';\n    let times = ' * ';\n    if (isLaTeX) {\n      sup = '^{';\n      closeSup = '}';\n      times = '';\n    }\n\n    let fn = '';\n    let str = '';\n    for (let k = 0; k < this.coefficients.length; k++) {\n      str = '';\n      if (this.coefficients[k] !== 0) {\n        if (this.powers[k] === 0) {\n          str = maybeToPrecision(this.coefficients[k], precision);\n        } else {\n          if (this.powers[k] === 1) {\n            str = `${maybeToPrecision(this.coefficients[k], precision) +\n              times}x`;\n          } else {\n            str = `${maybeToPrecision(this.coefficients[k], precision) +\n              times}x${sup}${this.powers[k]}${closeSup}`;\n          }\n        }\n\n        if (this.coefficients[k] > 0 && k !== this.coefficients.length - 1) {\n          str = ` + ${str}`;\n        } else if (k !== this.coefficients.length - 1) {\n          str = ` ${str}`;\n        }\n      }\n      fn = str + fn;\n    }\n    if (fn.charAt(0) === '+') {\n      fn = fn.slice(1);\n    }\n\n    return `f(x) = ${fn}`;\n  }\n\n  static load(json) {\n    if (json.name !== 'polynomialRegression') {\n      throw new TypeError('not a polynomial regression model');\n    }\n    return new PolynomialRegression(true, json);\n  }\n}\n\nfunction regress(pr, x, y, degree) {\n  const n = x.length;\n  let powers;\n  if (Array.isArray(degree)) {\n    powers = degree;\n    degree = powers.length;\n  } else {\n    degree++;\n    powers = new Array(degree);\n    for (let k = 0; k < degree; k++) {\n      powers[k] = k;\n    }\n  }\n  const F = new Matrix(n, degree);\n  const Y = new Matrix([y]);\n  for (let k = 0; k < degree; k++) {\n    for (let i = 0; i < n; i++) {\n      if (powers[k] === 0) {\n        F.set(i, k, 1);\n      } else {\n        F.set(i, k, Math.pow(x[i], powers[k]));\n      }\n    }\n  }\n\n  const FT = new MatrixTransposeView(F);\n  const A = FT.mmul(F);\n  const B = FT.mmul(new MatrixTransposeView(Y));\n\n  pr.degree = degree - 1;\n  pr.powers = powers;\n  pr.coefficients = solve(A, B).to1DArray();\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport default function checkArraySize(x, y) {\n  if (!isAnyArray(x) || !isAnyArray(y)) {\n    throw new TypeError('x and y must be arrays');\n  }\n  if (x.length !== y.length) {\n    throw new RangeError('x and y arrays must have the same length');\n  }\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n","import PolynomialRegression from 'ml-regression-polynomial';\r\n\r\n/**\r\n * Iterative regression-based baseline correction\r\n * @param {Array<number>} x - Independent axis variable\r\n * @param {Array<number>} y - Dependent axis variable\r\n * @param {object} [options] - Options object\r\n * @param {number} [options.maxIterations = 100] - Maximum number of allowed iterations\r\n * @param {function} [options.Regression = PolynomialRegression] - Regression class with a predict method\r\n * @param {*} [options.regressionOptions] - Options for regressionFunction\r\n * @param {number} [options.tolerance = 0.001] - Convergence error tolerance\r\n * @return {{corrected: Array<number>, delta: number, iteration: number, baseline: Array<number>}}\r\n */\r\nexport default function baselineCorrectionRegression(x, y, options = {}) {\r\n  let {\r\n    maxIterations = 100,\r\n    Regression = PolynomialRegression,\r\n    regressionOptions,\r\n    tolerance = 0.001,\r\n  } = options;\r\n\r\n  if (!regressionOptions && Regression === PolynomialRegression) {\r\n    regressionOptions = 3;\r\n  }\r\n\r\n  let baseline = y.slice();\r\n  let fitting = y.slice();\r\n  let oldFitting = y;\r\n  let iteration = 0;\r\n  let delta;\r\n  let regression;\r\n  while (iteration < maxIterations) {\r\n    // Calculate the fitting result\r\n    regression = new Regression(x, baseline, regressionOptions);\r\n\r\n    delta = 0;\r\n    for (let i = 0; i < baseline.length; i++) {\r\n      fitting[i] = regression.predict(x[i]);\r\n      if (baseline[i] > fitting[i]) {\r\n        baseline[i] = fitting[i];\r\n      }\r\n\r\n      delta += Math.abs((fitting[i] - oldFitting[i]) / oldFitting[i]);\r\n    }\r\n\r\n    // Stop criterion\r\n    if (delta < tolerance) {\r\n      break;\r\n    } else {\r\n      oldFitting = fitting.slice();\r\n      iteration++;\r\n    }\r\n  }\r\n\r\n  // removes baseline\r\n  let corrected = new Array(baseline.length);\r\n  for (let j = 0; j < baseline.length; j++) {\r\n    corrected[j] = y[j] - baseline[j];\r\n  }\r\n\r\n  return {\r\n    corrected,\r\n    delta,\r\n    iteration,\r\n    baseline,\r\n    regression: regression,\r\n  };\r\n}\r\n","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is valdi\n *\n * @param input - input\n */\nexport function xCheck(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n}\n/**\n * XCheckLengths.\n *\n * @param array1 - First array.\n * @param array2 - Second array.\n */\nexport function xCheckLengths(array1, array2) {\n    if (array1.length !== array2.length) {\n        throw new TypeError('Length of array1 and array2 must be identical');\n    }\n}\n//# sourceMappingURL=xCheck.js.map","import sum from 'ml-array-sum';\n\nfunction mean(input) {\n  return sum(input) / input.length;\n}\n\nexport { mean as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction sum(input) {\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport { sum as default };\n","import { xCheck } from './xCheck';\n/**\n * This function pads an array\n *\n *\n * @param array - the array that will be padded\n * @param options - options\n */\nexport function xPadding(array, options = {}) {\n    const { size = 0, value = 0, algorithm = '' } = options;\n    xCheck(array);\n    if (!algorithm) {\n        if (array instanceof Float64Array) {\n            return array.slice();\n        }\n        else {\n            return Float64Array.from(array);\n        }\n    }\n    let result = new Float64Array(array.length + size * 2);\n    for (let i = 0; i < array.length; i++) {\n        result[i + size] = array[i];\n    }\n    let fromEnd = size + array.length;\n    let toEnd = 2 * size + array.length;\n    switch (algorithm.toLowerCase()) {\n        case 'value':\n            for (let i = 0; i < size; i++) {\n                result[i] = value;\n            }\n            for (let i = fromEnd; i < toEnd; i++) {\n                result[i] = value;\n            }\n            break;\n        case 'duplicate':\n            for (let i = 0; i < size; i++) {\n                result[i] = array[0];\n            }\n            for (let i = fromEnd; i < toEnd; i++) {\n                result[i] = array[array.length - 1];\n            }\n            break;\n        case 'circular':\n            for (let i = 0; i < size; i++) {\n                result[i] =\n                    array[(array.length - (size % array.length) + i) % array.length];\n            }\n            for (let i = 0; i < size; i++) {\n                result[i + fromEnd] = array[i % array.length];\n            }\n            break;\n        default:\n            throw Error('xPadding: unknown algorithm');\n    }\n    return result;\n}\n//# sourceMappingURL=xPadding.js.map","import { xCheck } from './xCheck';\nimport { xPadding } from './xPadding';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param fct - callback function that from an array returns a value.\n * @param options - options\n */\nexport function xRolling(array, fct, options = {}) {\n    xCheck(array);\n    if (typeof fct !== 'function')\n        throw Error('fct has to be a function');\n    const { window = 5, padding = {} } = options;\n    const { size = window - 1, algorithm, value } = padding;\n    array = xPadding(array, { size, algorithm, value }); // ensure we get a copy and it is float64\n    const newArray = [];\n    for (let i = 0; i < array.length - window + 1; i++) {\n        let subArray = new Float64Array(array.buffer, i * 8, window);\n        // we will send a view to the original buffer\n        newArray.push(fct(subArray));\n    }\n    return newArray;\n}\n//# sourceMappingURL=xRolling.js.map","import mean from 'ml-array-mean';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param options - option\n */\nexport function xRollingAverage(array, options = {}) {\n    return xRolling(array, mean, options);\n}\n//# sourceMappingURL=xRollingAverage.js.map","import median from 'ml-array-median';\nimport { xRolling } from './xRolling';\n/**\n * This function calculates a rolling average\n *\n * @param array - the array that will be rotated\n * @param options - options\n */\nexport function xRollingMedian(array, options = {}) {\n    return xRolling(array, median, options);\n}\n//# sourceMappingURL=xRollingMedian.js.map","import { isAnyArray } from 'is-any-array';\nimport { xMean, xMaxValue, xMinValue } from 'ml-spectra-processing';\n\n/**\n * Rolling ball baseline correction algorithm.\n * From the abstract of (1):\n * \"This algorithm behaves equivalently to traditional polynomial backgrounds in simple spectra,\n * [...] and is considerably more robust for multiple overlapping peaks, rapidly varying background [...]\n *\n * The baseline is the trace one gets by rolling a ball below a spectrum. Algorithm has three steps:\n * Finding the minima in each window, find maxima among minima and then smooth over them by averaging.\n *\n * Reference:\n * (1) Kneen, M. A.; Annegarn, H. J.\n *     Algorithm for Fitting XRF, SEM and PIXE X-Ray Spectra Backgrounds.\n *     Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms 1996, 109–110, 209–213.\n *     https://doi.org/10.1016/0168-583X(95)00908-6.\n * (2) Kristian Hovde Liland, Bjørn-Helge Mevik, Roberto Canteri: baseline.\n *     https://cran.r-project.org/web/packages/baseline/index.html\n * @export\n * @param {Array} spectrum\n * @param {Object} [options={}]\n * @param {Number} [options.windowM] - width of local window for minimization/maximization, defaults to 4% of the spectrum length\n * @param {Number} [options.windowS] - width of local window for smoothing, defaults to 8% of the spectrum length\n */\nexport function rollingBall(spectrum, options = {}) {\n  if (!isAnyArray(spectrum)) {\n    throw new Error('Spectrum must be an array');\n  }\n\n  if (spectrum.length === 0) {\n    throw new TypeError('Spectrum must not be empty');\n  }\n\n  const numberPoints = spectrum.length;\n  const maxima = new Float64Array(numberPoints);\n  const minima = new Float64Array(numberPoints);\n  const baseline = new Float64Array(numberPoints);\n\n  // windowM 4 percent of spectrum length\n  // windowS 8 percent of spectrum length\n  const {\n    windowM = Math.round(numberPoints * 0.04),\n    windowS = Math.round(numberPoints * 0.08),\n  } = options;\n\n  // fi(1) in original paper\n  for (let i = 0; i < spectrum.length; i++) {\n    let windowLeft = Math.max(0, i - windowM);\n    let windowRight = Math.min(i + windowM + 1, spectrum.length);\n\n    minima[i] = xMinValue(spectrum, {\n      fromIndex: windowLeft,\n      toIndex: windowRight,\n    });\n  }\n\n  // fi in original paper\n  for (let i = 0; i < minima.length; i++) {\n    let windowLeft = Math.max(0, i - windowM);\n    let windowRight = Math.min(i + windowM + 1, minima.length);\n    maxima[i] = xMaxValue(minima, {\n      fromIndex: windowLeft,\n      toIndex: windowRight,\n    });\n  }\n\n  for (let i = 0; i < minima.length; i++) {\n    let windowLeft = Math.max(0, i - windowS);\n    let windowRight = Math.min(i + windowS + 1, maxima.length);\n    baseline[i] = xMean(maxima.subarray(windowLeft, windowRight));\n  }\n\n  return baseline;\n}\n","import { isAnyArray } from 'is-any-array';\n/**\n * Apply Savitzky Golay algorithm\n * @param [ys] Array of y values\n * @param [xs] Array of X or deltaX\n * @return  Array containing the new ys (same length)\n */\nexport function sgg(ys, xs, options = {}) {\n    let { windowSize = 9, derivative = 0, polynomial = 3 } = options;\n    if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n        throw new RangeError('Invalid window size (should be odd and at least 5 integer number)');\n    }\n    if (!isAnyArray(ys)) {\n        throw new TypeError('Y values must be an array');\n    }\n    if (typeof xs === 'undefined') {\n        throw new TypeError('X must be defined');\n    }\n    if (windowSize > ys.length) {\n        throw new RangeError(`Window size is higher than the data length ${windowSize}>${ys.length}`);\n    }\n    if (derivative < 0 || !Number.isInteger(derivative)) {\n        throw new RangeError('Derivative should be a positive integer');\n    }\n    if (polynomial < 1 || !Number.isInteger(polynomial)) {\n        throw new RangeError('Polynomial should be a positive integer');\n    }\n    if (polynomial >= 6) {\n        // eslint-disable-next-line no-console\n        console.warn('You should not use polynomial grade higher than 5 if you are' +\n            ' not sure that your data arises from such a model. Possible polynomial oscillation problems');\n    }\n    let half = Math.floor(windowSize / 2);\n    let np = ys.length;\n    let ans = new Float64Array(np);\n    let weights = fullWeights(windowSize, polynomial, derivative);\n    let hs = 0;\n    let constantH = true;\n    if (isAnyArray(xs)) {\n        constantH = false;\n    }\n    else {\n        hs = Math.pow(xs, derivative);\n    }\n    //For the borders\n    for (let i = 0; i < half; i++) {\n        let wg1 = weights[half - i - 1];\n        let wg2 = weights[half + i + 1];\n        let d1 = 0;\n        let d2 = 0;\n        for (let l = 0; l < windowSize; l++) {\n            d1 += wg1[l] * ys[l];\n            d2 += wg2[l] * ys[np - windowSize + l];\n        }\n        if (constantH) {\n            ans[half - i - 1] = d1 / hs;\n            ans[np - half + i] = d2 / hs;\n        }\n        else {\n            hs = getHs(xs, half - i - 1, half, derivative);\n            ans[half - i - 1] = d1 / hs;\n            hs = getHs(xs, np - half + i, half, derivative);\n            ans[np - half + i] = d2 / hs;\n        }\n    }\n    //For the internal points\n    let wg = weights[half];\n    for (let i = windowSize; i <= np; i++) {\n        let d = 0;\n        for (let l = 0; l < windowSize; l++)\n            d += wg[l] * ys[l + i - windowSize];\n        if (!constantH) {\n            hs = getHs(xs, i - half - 1, half, derivative);\n        }\n        ans[i - half - 1] = d / hs;\n    }\n    return ans;\n}\nfunction getHs(h, center, half, derivative) {\n    let hs = 0;\n    let count = 0;\n    for (let i = center - half; i < center + half; i++) {\n        if (i >= 0 && i < h.length - 1) {\n            hs += h[i + 1] - h[i];\n            count++;\n        }\n    }\n    return Math.pow(hs / count, derivative);\n}\nfunction gramPoly(i, m, k, s) {\n    let Grampoly = 0;\n    if (k > 0) {\n        Grampoly =\n            ((4 * k - 2) / (k * (2 * m - k + 1))) *\n                (i * gramPoly(i, m, k - 1, s) + s * gramPoly(i, m, k - 1, s - 1)) -\n                (((k - 1) * (2 * m + k)) / (k * (2 * m - k + 1))) *\n                    gramPoly(i, m, k - 2, s);\n    }\n    else {\n        if (k === 0 && s === 0) {\n            Grampoly = 1;\n        }\n        else {\n            Grampoly = 0;\n        }\n    }\n    return Grampoly;\n}\nfunction genFact(a, b) {\n    let gf = 1;\n    if (a >= b) {\n        for (let j = a - b + 1; j <= a; j++) {\n            gf *= j;\n        }\n    }\n    return gf;\n}\nfunction weight(i, t, m, n, s) {\n    let sum = 0;\n    for (let k = 0; k <= n; k++) {\n        sum +=\n            (2 * k + 1) *\n                (genFact(2 * m, k) / genFact(2 * m + k + 1, k + 1)) *\n                gramPoly(i, m, k, 0) *\n                gramPoly(t, m, k, s);\n    }\n    return sum;\n}\n/**\n * @private\n * @param m  Number of points\n * @param n  Polynomial grade\n * @param s  Derivative\n */\nfunction fullWeights(m, n, s) {\n    let weights = new Array(m);\n    let np = Math.floor(m / 2);\n    for (let t = -np; t <= np; t++) {\n        weights[t + np] = new Float64Array(m);\n        for (let j = -np; j <= np; j++) {\n            weights[t + np][j + np] = weight(j, t, np, n, s);\n        }\n    }\n    return weights;\n}\n//# sourceMappingURL=index.js.map","/**\n * Correction of the x and y coordinates using a quadratic optimizations with the peak and its 3 closest neighbors to determine the true x,y values of the peak.\n * This process is done in place and is very fast.\n * @param data\n * @param peaks\n */\nexport function optimizeTop(data, peaks) {\n    const { x, y } = data;\n    for (const peak of peaks) {\n        let currentIndex = peak.index;\n        // The detected peak could be moved 1 or 2 units to left or right.\n        if (y[currentIndex - 1] >= y[currentIndex - 2] &&\n            y[currentIndex - 1] >= y[currentIndex]) {\n            currentIndex--;\n        }\n        else {\n            if (y[currentIndex + 1] >= y[currentIndex] &&\n                y[currentIndex + 1] >= y[currentIndex + 2]) {\n                currentIndex++;\n            }\n            else {\n                if (y[currentIndex - 2] >= y[currentIndex - 3] &&\n                    y[currentIndex - 2] >= y[currentIndex - 1]) {\n                    currentIndex -= 2;\n                }\n                else {\n                    if (y[currentIndex + 2] >= y[currentIndex + 1] &&\n                        y[currentIndex + 2] >= y[currentIndex + 3]) {\n                        currentIndex += 2;\n                    }\n                }\n            }\n        }\n        // interpolation to a sin() function\n        if (y[currentIndex - 1] > 0 &&\n            y[currentIndex + 1] > 0 &&\n            y[currentIndex] >= y[currentIndex - 1] &&\n            y[currentIndex] >= y[currentIndex + 1] &&\n            (y[currentIndex] !== y[currentIndex - 1] ||\n                y[currentIndex] !== y[currentIndex + 1])) {\n            let alpha = 20 * Math.log10(y[currentIndex - 1]);\n            let beta = 20 * Math.log10(y[currentIndex]);\n            let gamma = 20 * Math.log10(y[currentIndex + 1]);\n            let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n            peak.x = x[currentIndex] + (x[currentIndex] - x[currentIndex - 1]) * p;\n            peak.y =\n                y[currentIndex] -\n                    0.25 * (y[currentIndex - 1] - y[currentIndex + 1]) * p;\n        }\n    }\n}\n//# sourceMappingURL=optimizeTop.js.map","import { sgg } from 'ml-savitzky-golay-generalized';\nimport { xIsEquallySpaced, xIsMonotoneIncreasing, xMinValue, xMaxValue, xNoiseStandardDeviation, } from 'ml-spectra-processing';\nimport { optimizeTop } from './utils/optimizeTop';\n/**\n * Global spectra deconvolution\n * @param  data - Object data with x and y arrays. Values in x has to be growing\n * @param {number} [options.broadRatio = 0.00] - If `broadRatio` is higher than 0, then all the peaks which second derivative\n * smaller than `broadRatio * maxAbsSecondDerivative` will be marked with the soft mask equal to true.\n\n */\nexport function gsd(data, options = {}) {\n    let { sgOptions = {\n        windowSize: 9,\n        polynomial: 3,\n    }, noiseLevel, smoothY = false, maxCriteria = true, minMaxRatio = 0.00025, realTopDetection = false, } = options;\n    let { x, y } = data;\n    if (!xIsMonotoneIncreasing(x)) {\n        throw new Error('GSD only accepts monotone increasing x values');\n    }\n    //rescale;\n    y = y.slice();\n    // If the max difference between delta x is less than 5%, then,\n    // we can assume it to be equally spaced variable\n    let equallySpaced = xIsEquallySpaced(x);\n    if (noiseLevel === undefined) {\n        if (equallySpaced) {\n            const noiseInfo = xNoiseStandardDeviation(y);\n            if (maxCriteria) {\n                noiseLevel = noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n            else {\n                noiseLevel = -noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n        }\n        else {\n            noiseLevel = 0;\n        }\n    }\n    else {\n        if (maxCriteria === false) {\n            noiseLevel *= -1;\n        }\n    }\n    if (maxCriteria === false) {\n        for (let i = 0; i < y.length; i++) {\n            y[i] *= -1;\n        }\n    }\n    if (noiseLevel !== undefined) {\n        for (let i = 0; i < y.length; i++) {\n            if (y[i] < noiseLevel) {\n                y[i] = noiseLevel;\n            }\n        }\n    }\n    let yData = y;\n    let dY, ddY;\n    const { windowSize, polynomial } = sgOptions;\n    if (equallySpaced) {\n        if (smoothY) {\n            yData = sgg(y, x[1] - x[0], {\n                windowSize,\n                polynomial,\n                derivative: 0,\n            });\n        }\n        dY = sgg(y, x[1] - x[0], {\n            windowSize,\n            polynomial,\n            derivative: 1,\n        });\n        ddY = sgg(y, x[1] - x[0], {\n            windowSize,\n            polynomial,\n            derivative: 2,\n        });\n    }\n    else {\n        if (smoothY) {\n            yData = sgg(y, x, {\n                windowSize,\n                polynomial,\n                derivative: 0,\n            });\n        }\n        dY = sgg(y, x, {\n            windowSize,\n            polynomial,\n            derivative: 1,\n        });\n        ddY = sgg(y, x, {\n            windowSize,\n            polynomial,\n            derivative: 2,\n        });\n    }\n    const minY = xMinValue(yData);\n    const maxY = xMaxValue(yData);\n    if (minY > maxY || minY === maxY)\n        return [];\n    const yThreshold = minY + (maxY - minY) * minMaxRatio;\n    const dX = x[1] - x[0];\n    let lastMax = null;\n    let lastMin = null;\n    let minddY = [];\n    let intervalL = [];\n    let intervalR = [];\n    // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n    for (let i = 1; i < yData.length - 1; ++i) {\n        if ((dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n            (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])) {\n            lastMin = {\n                x: x[i],\n                index: i,\n            };\n            if (dX > 0 && lastMax !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Maximum in first derivative\n        if ((dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n            (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])) {\n            lastMax = {\n                x: x[i],\n                index: i,\n            };\n            if (dX < 0 && lastMin !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Minimum in second derivative\n        if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n            minddY.push(i);\n        }\n    }\n    let lastK = -1;\n    const peaks = [];\n    for (const minddYIndex of minddY) {\n        let deltaX = x[minddYIndex];\n        let possible = -1;\n        let k = lastK + 1;\n        let minDistance = Number.POSITIVE_INFINITY;\n        let currentDistance = 0;\n        while (possible === -1 && k < intervalL.length) {\n            currentDistance = Math.abs(deltaX - (intervalL[k].x + intervalR[k].x) / 2);\n            if (currentDistance < (intervalR[k].x - intervalL[k].x) / 2) {\n                possible = k;\n                lastK = k;\n            }\n            ++k;\n            // Not getting closer?\n            if (currentDistance >= minDistance) {\n                break;\n            }\n            minDistance = currentDistance;\n        }\n        if (possible !== -1) {\n            if (yData[minddYIndex] > yThreshold) {\n                let width = Math.abs(intervalR[possible].x - intervalL[possible].x);\n                peaks.push({\n                    x: deltaX,\n                    y: yData[minddYIndex],\n                    width: width,\n                    index: minddYIndex,\n                    ddY: ddY[minddYIndex],\n                    inflectionPoints: {\n                        from: intervalL[possible],\n                        to: intervalR[possible],\n                    },\n                });\n            }\n        }\n    }\n    if (realTopDetection) {\n        optimizeTop({ x, y: yData }, peaks);\n    }\n    peaks.forEach((peak) => {\n        if (!maxCriteria) {\n            peak.y *= -1;\n            peak.ddY = peak.ddY * -1;\n        }\n    });\n    peaks.sort((a, b) => {\n        return a.x - b.x;\n    });\n    return peaks;\n}\n//# sourceMappingURL=gsd.js.map","import { xMean } from 'ml-spectra-processing';\n/**\n * Center the mean\n * @param data\n */\nexport function centerMean(data) {\n    const { y } = data;\n    const mean = xMean(y);\n    for (let i = 0; i < y.length; i++) {\n        y[i] -= mean;\n    }\n    return { data };\n}\n//# sourceMappingURL=centerMean.js.map","import { xMedian } from 'ml-spectra-processing';\n/**\n * Center the median\n * @param data\n */\nexport function centerMedian(data) {\n    const { y } = data;\n    const median = xMedian(y);\n    for (let i = 0; i < y.length; i++) {\n        y[i] -= median;\n    }\n    return { data };\n}\n//# sourceMappingURL=centerMedian.js.map","import { xGetFromToIndex } from 'ml-spectra-processing';\n/**\n * Filter that allows to\n * @param data\n * @param options\n */\nexport function fromTo(data, options = {}) {\n    const { fromIndex, toIndex } = xGetFromToIndex(data.x, options);\n    return {\n        data: {\n            x: data.x.subarray(fromIndex, toIndex + 1),\n            y: data.y.subarray(fromIndex, toIndex + 1),\n        },\n    };\n}\n//# sourceMappingURL=fromTo.js.map","import { xNormed } from 'ml-spectra-processing';\n/**\n * Norm the Y values\n * @param data\n */\nexport function normed(data, options = {}) {\n    xNormed(data.y, { ...options, output: data.y });\n    return { data };\n}\n//# sourceMappingURL=normed.js.map","import { xStandardDeviation } from 'ml-spectra-processing';\n/**\n * Center the mean\n * @param data\n */\nexport function divideBySD(data) {\n    const { y } = data;\n    const sd = xStandardDeviation(y);\n    for (let i = 0; i < y.length; i++) {\n        y[i] /= sd;\n    }\n    return { data };\n}\n//# sourceMappingURL=divideBySD.js.map","import { xRescale } from 'ml-spectra-processing';\n/**\n * Center the mean\n * @param data\n */\nexport function rescale(data, options = {}) {\n    xRescale(data.y, { ...options, output: data.y });\n    return { data };\n}\n//# sourceMappingURL=rescale.js.map","import { xParetoNormalization } from 'ml-spectra-processing';\n/**\n * Filter that allows to\n * @param data\n */\nexport function paretoNormalization(data) {\n    return {\n        data: {\n            x: data.x,\n            y: xParetoNormalization(data.y),\n        },\n    };\n}\n//# sourceMappingURL=paretoNormalization.js.map","//@ts-expect-error no type definition for baselines\nimport { airPLSBaseline as baselineFct } from 'baselines';\n/**\n * @param data\n */\nexport function airPLSBaseline(data) {\n    data.y = baselineFct(data.y).correctedSpectrum;\n    return { data };\n}\n//# sourceMappingURL=airPLSBaseline.js.map","import airpls from 'ml-airpls';\nimport sequentialFill from 'ml-array-sequential-fill';\n/**\n * Adaptive iteratively reweighted penalized least squares [1]\n *\n * This function calls ml-airpls\n *\n * References:\n * [1] Zhang, Z.-M.; Chen, S.; Liang, Y.-Z.\n * Baseline Correction Using Adaptive Iteratively Reweighted Penalized Least Squares.\n * Analyst 2010, 135 (5), 1138–1146. https://doi.org/10.1039/B922045C.\n * @export\n * @param {Array<number>} ys\n * @param {object} [options] - Options object\n * @param {Array<number>} [options.x] Optional, Independent axis variable. If not specified, we use a linear grid\n * @param {object} [options.regression] - Options for the regression\n * @param {number} [options.regression.maxIterations = 100] - Maximum number of allowed iterations\n * @param {function} [options.regression.§Regression = PolynomialRegression] - Regression class with a predict method\n * @param {*} [options.regression.regressionOptions] - Options for regressionFunction\n * @param {number} [options.regression.tolerance = 0.001] - Convergence error tolerance\n * @returns {BaselineOutput}\n */\nexport function airPLSBaseline(ys, options = {}) {\n  const numberPoints = ys.length;\n  let { x, regressionOptions } = options;\n  if (!x) {\n    x = sequentialFill({ from: 0, to: numberPoints - 1, size: numberPoints });\n  }\n  let output = airpls(x, ys, regressionOptions);\n\n  return { baseline: output.baseline, correctedSpectrum: output.corrected };\n}\n","//@ts-expect-error no type definition for baselines\nimport { iterativePolynomialBaseline as baselineFct } from 'baselines';\n/**\n * @param data\n */\nexport function iterativePolynomialBaseline(data) {\n    data.y = baselineFct(data.y).correctedSpectrum;\n    return { data };\n}\n//# sourceMappingURL=iterativePolynomialBaseline.js.map","import sequentialFill from 'ml-array-sequential-fill';\nimport baselineCorrection from 'ml-baseline-correction-regression';\n\n/**\n * Iterative polynomial fitting [1]\n *\n * Implementation based on ml-baseline-correction-regression\n *\n * References:\n * [1] Gan, F.; Ruan, G.; Mo, J.\n * Baseline Correction by Improved Iterative Polynomial Fitting with Automatic Threshold.\n *  Chemometrics and Intelligent Laboratory Systems 2006, 82 (1), 59–65.\n * https://doi.org/10.1016/j.chemolab.2005.08.009.\n * @export\n * @param {Array<number>} ys\n * @param {object} [options] - Options object\n * @param {Array<number>} [options.x] Optional, Independent axis variable. If not specified, we use a linear grid\n * @param {Object} [options.regression]\n * @param {number} [options.regression.maxIterations = 100] - Maximum number of allowed iterations\n * @param {Object} [options.regression]\n * @param {function} [options.regression.Regression = PolynomialRegression] - Regression class with a predict method\n * @param {Object} [options.regression.regressionOptions] - Options for regressionFunction\n * @param {number} [options.regression.tolerance = 0.001] - Convergence error tolerance\n * @returns {BaselineOutput}\n */\nexport function iterativePolynomialBaseline(ys, options = {}) {\n  const numberPoints = ys.length;\n  let { x, regressionOptions } = options;\n  if (!x) {\n    x = sequentialFill({ from: 0, to: numberPoints - 1, size: numberPoints });\n  }\n\n  let output = baselineCorrection(x, ys, regressionOptions);\n\n  return { baseline: output.baseline, correctedSpectrum: output.corrected };\n}\n","//@ts-expect-error no type definition for baselines\nimport { rollingAverageBaseline as baselineFct } from 'baselines';\n/**\n * @param data\n */\nexport function rollingAverageBaseline(data) {\n    data.y = baselineFct(data.y).correctedSpectrum;\n    return { data };\n}\n//# sourceMappingURL=rollingAverageBaseline.js.map","import { xRollingAverage } from 'ml-spectra-processing';\n\n/**\n\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @returns {BaselineOutput}\n */\nexport function rollingAverageBaseline(ys, options = {}) {\n  let window = Math.max(Math.round(ys.length * 0.1), 2);\n  let defaults = {\n    window: window,\n    padding: {\n      size: window - 1,\n      algorithm: 'duplicate',\n      value: 0,\n    },\n  };\n  let actualOptions = Object.assign({}, defaults, options);\n  let baseline = xRollingAverage(ys, actualOptions);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline: baseline, correctedSpectrum: corrected };\n}\n","//@ts-expect-error no type definition for baselines\nimport { rollingBallBaseline as baselineFct } from 'baselines';\n/**\n * @param data\n */\nexport function rollingBallBaseline(data) {\n    data.y = baselineFct(data.y).correctedSpectrum;\n    return { data };\n}\n//# sourceMappingURL=rollingBallBaseline.js.map","import { rollingBall } from 'ml-rolling-ball-baseline';\n\n/**\n * Rolling ball baseline correction algorithm.\n * From the abstract of (1):\n * \"This algorithm behaves equivalently to traditional polynomial backgrounds in simple spectra,\n * [...] and is considerably more robust for multiple overlapping peaks, rapidly varying background [...]\n *\n * The baseline is the trace one gets by rolling a ball below a spectrum. Algorithm has three steps:\n * Finding the minima in each window, find maxima among minima and then smooth over them by averaging.\n *\n * Algorithm described in (1), but in the implementation here the window width does not change.\n *\n * Reference:\n * (1) Kneen, M. A.; Annegarn, H. J.\n *     Algorithm for Fitting XRF, SEM and PIXE X-Ray Spectra Backgrounds.\n *     Nuclear Instruments and Methods in Physics Research Section B: Beam Interactions with Materials and Atoms 1996, 109–110, 209–213.\n *     https://doi.org/10.1016/0168-583X(95)00908-6.\n * (2) Kristian Hovde Liland, Bjørn-Helge Mevik, Roberto Canteri: baseline.\n *     https://cran.r-project.org/web/packages/baseline/index.html\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {Number} [options.windowM] - width of local window for minimization/maximization, defaults to 4% of the spectrum length\n * @param {Number} [options.windowS] - width of local window for smoothing, defaults to 8% of the specturm length\n * @returns {BaselineOutput}\n */\nexport function rollingBallBaseline(ys, options = {}) {\n  const baseline = rollingBall(ys, options);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline: baseline, correctedSpectrum: corrected };\n}\n","//@ts-expect-error no type definition for baselines\nimport { rollingMedianBaseline as baselineFct } from 'baselines';\n/**\n * @param data\n */\nexport function rollingMedianBaseline(data) {\n    data.y = baselineFct(data.y).correctedSpectrum;\n    return { data };\n}\n//# sourceMappingURL=rollingMedianBaseline.js.map","import { xRollingMedian } from 'ml-spectra-processing';\n\n/**\n\n *\n * @export\n * @param {Array<number>} ys\n * @param {Object} [options={}]\n * @param {number} [options.window] rolling window size, defaults to 10% of the length of the spectrum\n * @param {string} [options.padding.size=window-1] none, value, circular, duplicate\n * @param {string} [options.padding.algorithm='duplicate'] none, value, circular, duplicate\n * @param {number} [options.padding.value=0] value to use for padding (if algorithm='value')\n * @returns {BaselineOutput}\n */\nexport function rollingMedianBaseline(ys, options = {}) {\n  let window = Math.max(Math.round(ys.length * 0.1), 2);\n  let defaults = {\n    window: window,\n    padding: {\n      size: window - 1,\n      algorithm: 'duplicate',\n      value: 0,\n    },\n  };\n  let actualOptions = Object.assign({}, defaults, options);\n  let baseline = xRollingMedian(ys, actualOptions);\n  let corrected = new Float64Array(ys.length);\n  for (let i = 0; i < corrected.length; i++) {\n    corrected[i] = ys[i] - baseline[i];\n  }\n\n  return { baseline: baseline, correctedSpectrum: corrected };\n}\n","import { sgg } from 'ml-savitzky-golay-generalized';\n/**\n * Calculate the first derivative using Savitzky–Golay filter.\n * @param data\n */\nexport function firstDerivative(data, options = {}) {\n    const { x, y } = data;\n    return { data: { x, y: sgg(y, x, { ...options, derivative: 1 }) } };\n}\n//# sourceMappingURL=firstDerivative.js.map","import { sgg } from 'ml-savitzky-golay-generalized';\n/**\n * Calculate the second derivative using Savitzky–Golay filter.\n * @param data\n */\nexport function secondDerivative(data, options = {}) {\n    const { x, y } = data;\n    return { data: { x, y: sgg(y, x, { ...options, derivative: 2 }) } };\n}\n//# sourceMappingURL=secondDerivative.js.map","import { sgg } from 'ml-savitzky-golay-generalized';\n/**\n * Calculate the third derivative using Savitzky–Golay filter.\n * @param data\n */\nexport function thirdDerivative(data, options = {}) {\n    const { x, y } = data;\n    return { data: { x, y: sgg(y, x, { ...options, derivative: 3 }) } };\n}\n//# sourceMappingURL=thirdDerivative.js.map","import { sgg } from 'ml-savitzky-golay-generalized';\n/**\n * Apply the Savitzky Golay Generalized Filter\n * @param data\n */\nexport function savitzkyGolay(data, options = {}) {\n    const { x, y } = data;\n    return { data: { x, y: sgg(y, x, options) } };\n}\n//# sourceMappingURL=savitzkyGolay.js.map","import { xyEnsureGrowingX } from 'ml-spectra-processing';\n/**\n * Ensure X values are strictly monotonic increasing\n * http://www-groups.mcs.st-andrews.ac.uk/~john/analysis/Lectures/L8.html\n * @param data\n */\nexport function ensureGrowing(data) {\n    return { data: xyEnsureGrowingX(data) };\n}\n//# sourceMappingURL=ensureGrowing.js.map","import { xyEquallySpaced } from 'ml-spectra-processing';\n/**\n * Filter that allows to\n * @param data\n * @param options\n */\nexport function equallySpaced(data, options = {}) {\n    return { data: xyEquallySpaced(data, options) };\n}\n//# sourceMappingURL=equallySpaced.js.map","import { xyFilterX } from 'ml-spectra-processing';\n/**\n * Filter that allows to\n * @param data\n * @param options\n */\nexport function filterX(data, options = {}) {\n    return {\n        data: xyFilterX(data, options),\n    };\n}\n//# sourceMappingURL=filterX.js.map","import { gsd } from 'ml-gsd';\nimport { xFindClosestIndex, xMean, xAdd } from 'ml-spectra-processing';\n/**\n * Filter that allows to calibrateX the x axis based on the presence of peaks\n */\nexport function calibrateX(data, options = {}) {\n    const { targetX = 0, nbPeaks = 1, from = data.x[0], to = data.x[data.x.length - 1], gsd: gsdOptions = {\n        minMaxRatio: 0.1,\n        realTopDetection: true,\n        smoothY: true,\n        sgOptions: {\n            windowSize: 7,\n            polynomial: 3,\n        },\n    }, } = options;\n    const fromIndex = xFindClosestIndex(data.x, from);\n    const toIndex = xFindClosestIndex(data.x, to);\n    let peaks = gsd({\n        x: data.x.subarray(fromIndex, toIndex),\n        y: data.y.subarray(fromIndex, toIndex),\n    }, gsdOptions)\n        .sort((a, b) => b.y - a.y)\n        .slice(0, nbPeaks);\n    if (peaks.length === 0)\n        return { data };\n    const middle = xMean(peaks.map((peak) => peak.x));\n    return { data: { x: xAdd(data.x, targetX - middle), y: data.y } };\n}\n//# sourceMappingURL=calibrateX.js.map","import { xApplyFunctionStr } from 'ml-spectra-processing';\n/**\n * Filter that allows to\n * @param data\n * @param options\n */\nexport function xFunction(data, options = {}) {\n    return {\n        data: {\n            x: xApplyFunctionStr(data.x, {\n                variableLabel: 'x',\n                fctString: options.function,\n            }),\n            y: data.y,\n        },\n    };\n}\n//# sourceMappingURL=xFunction.js.map","import { xApplyFunctionStr } from 'ml-spectra-processing';\n/**\n * Filter that allows to\n * @param data\n * @param options\n */\nexport function yFunction(data, options = {}) {\n    return {\n        data: {\n            x: data.x,\n            y: xApplyFunctionStr(data.y, {\n                variableLabel: 'y',\n                fctString: options.function,\n            }),\n        },\n    };\n}\n//# sourceMappingURL=yFunction.js.map","import { xEnsureFloat64 } from 'ml-spectra-processing';\nimport * as Filters from './filters/filters';\n/**\n * Apply filters on {x:[], y:[]}\n * @returns A very important number\n */\nexport function filterXY(data, filters) {\n    let result = {\n        data: { x: xEnsureFloat64(data.x), y: xEnsureFloat64(data.y) },\n    };\n    const logs = [];\n    for (let filter of filters) {\n        const start = Date.now();\n        // eslint-disable-next-line import/namespace\n        const filterFct = Filters[filter.name];\n        if (!filterFct) {\n            throw new Error(`Unknown filter: ${filter.name}`);\n        }\n        // @ts-expect-error some method have options and some other ones don't have any options\n        result = filterFct(result.data, filter.options);\n        logs.push({\n            name: filter.name,\n            time: Date.now() - start,\n        });\n    }\n    return { logs, data: result.data };\n}\n//# sourceMappingURL=filterXY.js.map","import { xMinMaxValues } from 'ml-spectra-processing';\n\nimport { getData } from './getData';\nimport { getNormalized } from './getNormalized';\nimport { updateRangesInfo } from './updateRangesInfo';\n\n/**\n * Class allowing manipulate one IR spectrum\n * @class spectrum\n * @param {object} [json={}] - object containing a spectrum\n * @param {Array} [json.x=[]] - x values\n * @param {Array} [json.y=[]] - y values\n */\nexport class Spectrum {\n  /**\n   *\n   * @param {array} x\n   * @param {array} y\n   * @param {string} id\n   * @param {object} [options={}]\n   * @param {object} [options.meta={}]\n   * @param {object} [options.normalization]\n   * @param {object} [options.normalized]\n   */\n  constructor(x, y, id, options = {}) {\n    const { meta = {}, normalization = {}, normalized } = options;\n\n    if (x && x.length > 1 && x[0] > x[x.length - 1]) {\n      this.x = x.slice().reverse();\n      this.y = y.slice().reverse();\n    } else {\n      this.x = x || [];\n      this.y = y || [];\n    }\n    this.id = id;\n    this.meta = meta;\n    this.normalizedBoundary = { x: { min: 0, max: 0 }, y: { min: 0, max: 0 } };\n    if (normalized) {\n      this.normalized = normalized;\n      this.updateNormalizedBoundary();\n      this.normalizedAllowedBoundary = this.normalizedBoundary;\n    } else {\n      this.updateNormalization(normalization);\n    }\n\n    this.updateMemory();\n  }\n\n  get minX() {\n    return this.x[0];\n  }\n\n  get maxX() {\n    return this.x[this.x.length - 1];\n  }\n\n  updateMemory() {\n    let original = ((this.x && this.x.length) || 0) * 16;\n    let normalized = this.normalized.x.length * 16;\n    this.memory = { original, normalized, total: original + normalized };\n  }\n\n  removeOriginal() {\n    this.x = undefined;\n    this.y = undefined;\n    this.updateMemory();\n  }\n\n  getXY() {\n    if (!Array.isArray(this.x) || !Array.isArray(this.y)) {\n      throw new Error('Can not get normalized data');\n    }\n    return { x: this.x, y: this.y };\n  }\n\n  updateRangesInfo(ranges) {\n    updateRangesInfo(this, ranges);\n  }\n\n  updateNormalization(normalization) {\n    const result = getNormalized(this, normalization);\n    this.normalized = result.data;\n    this.normalizedAllowedBoundary = result.allowedBoundary;\n    this.ranges = {};\n    this.updateMemory();\n    this.updateNormalizedBoundary();\n  }\n\n  getData(options) {\n    return getData(this, options);\n  }\n\n  updateNormalizedBoundary() {\n    this.normalizedBoundary.x = {\n      min: this.normalized.x[0],\n      max: this.normalized.x[this.normalized.x.length - 1],\n    };\n    this.normalizedBoundary.y = xMinMaxValues(this.normalized.y);\n  }\n}\n","import {\n  xyIntegration,\n  xyMaxYPoint,\n  xyMinYPoint,\n  xFindClosestIndex,\n} from 'ml-spectra-processing';\n\n/**\n * @private\n * @param {*} spectrum\n * @param {*} ranges\n */\nexport function updateRangesInfo(spectrum, ranges = []) {\n  spectrum.ranges = {};\n  for (let range of ranges) {\n    range = JSON.parse(JSON.stringify(range));\n    spectrum.ranges[range.label] = range;\n    let fromToIndex = {\n      fromIndex: xFindClosestIndex(spectrum.normalized.x, range.from),\n      toIndex: xFindClosestIndex(spectrum.normalized.x, range.to),\n    };\n    range.integration = xyIntegration(spectrum.normalized, fromToIndex);\n    range.maxPoint = xyMaxYPoint(spectrum.normalized, fromToIndex);\n    range.minPoint = xyMinYPoint(spectrum.normalized, fromToIndex);\n    range.x = spectrum.normalized.x.slice(\n      fromToIndex.fromIndex,\n      fromToIndex.toIndex + 1,\n    );\n    range.y = spectrum.normalized.y.slice(\n      fromToIndex.fromIndex,\n      fromToIndex.toIndex + 1,\n    );\n  }\n}\n","import { filterXY } from 'ml-signal-processing';\nimport { xMinMaxValues, xyCheck } from 'ml-spectra-processing';\n/**\n *\n * @private\n * @param {DataXY} input\n * @param {object} [options={}]\n * @param {number} [options.from=x[0]]\n * @param {number} [options.to=x[x.length-1]]\n * @param {number} [options.numberOfPoints=1024]\n * @param {array} [options.filters=[]]\n * @param {array} [options.exclusions=[]]\n */\nexport function getNormalized(input, options = {}) {\n  xyCheck(input);\n\n  let {\n    from = input.x[0],\n    to = input.x[input.x.length - 1],\n    numberOfPoints = 1024,\n    filters = [],\n    exclusions = [],\n  } = options;\n\n  // we will add a get\n  const equallySpacedFilter = {\n    name: 'equallySpaced',\n    options: {\n      from,\n      to,\n      numberOfPoints,\n      exclusions,\n    },\n  };\n  const output = filterXY(input, filters.concat(equallySpacedFilter)).data;\n\n  const allowedBoundary = {\n    x: {\n      min: output.x[0],\n      max: output.x[output.x.length - 1],\n    },\n    y: xMinMaxValues(output.y),\n  };\n\n  return {\n    data: output,\n    allowedBoundary,\n  };\n}\n","import { xyFilterX } from 'ml-spectra-processing';\n/**\n *\n * @private\n * @param {Spectrum} spectrum\n * @param {object} [options={}]\n * @param {object} [options.xFilter={}]\n * @param {number} [options.xFilter.from]\n * @param {number} [options.xFilter.to]\n * @param {array} [options.xFilter.exclusions=[]]\n * @param {number} [options.yFactor=1]\n */\n\nexport function getData(spectrum, options = {}) {\n  const { xFilter = {}, yFactor = 1 } = options;\n  let data = { x: spectrum.x, y: spectrum.y };\n\n  if (xFilter) {\n    data = xyFilterX(spectrum, xFilter);\n  }\n  if (yFactor && yFactor !== 1) {\n    data.y = data.y.map((y) => y * yFactor);\n  }\n  return data;\n}\n","import { xFindClosestIndex } from 'ml-spectra-processing';\n\nimport { getAutocorrelationChart } from './jsgraph/getAutocorrelationChart';\nimport { getBoxPlotChart } from './jsgraph/getBoxPlotChart';\nimport { getChart } from './jsgraph/getChart';\nimport { getNormalizationAnnotations } from './jsgraph/getNormalizationAnnotations';\nimport { getNormalizedChart } from './jsgraph/getNormalizedChart';\nimport { getPostProcessedChart } from './jsgraph/getPostProcessedChart';\nimport { getTrackAnnotation } from './jsgraph/getTrackAnnotation';\nimport { getCategoriesStats } from './metadata/getCategoriesStats';\nimport { getClassLabels } from './metadata/getClassLabels';\nimport { getClasses } from './metadata/getClasses';\nimport { getMetadata } from './metadata/getMetadata';\nimport parseJcamp from './parser/jcamp';\nimport parseMatrix from './parser/matrix';\nimport parseText from './parser/text';\nimport { getAutocorrelation } from './spectra/getAutocorrelation';\nimport { getBoxPlotData } from './spectra/getBoxPlotData';\nimport { getMeanData } from './spectra/getMeanData';\nimport { getNormalizedData } from './spectra/getNormalizedData';\nimport { getNormalizedText } from './spectra/getNormalizedText';\nimport { getPostProcessedData } from './spectra/getPostProcessedData';\nimport { getPostProcessedText } from './spectra/getPostProcessedText';\nimport { Spectrum } from './spectrum/Spectrum';\n\nexport class SpectraProcessor {\n  /**\n   * Manager a large number of spectra with the possibility to normalize the data\n   * and skip the original data.\n   * @param {object} [options={}]\n   * @param {boolean} [options.maxMemory=64M]\n   * @param {object} [options.normalization={}] options to normalize the spectra before comparison\n   * @param {number} [options.normalization.from]\n   * @param {number} [options.normalization.to]\n   * @param {number} [options.normalization.numberOfPoints]\n   * @param {array<object>} [options.normalization.filters]\n   * @param {string} [options.normalization.filters.X.name]\n   * @param {object} [options.normalization.filters.X.options]\n   * @param {array<object>} [options.normalization.exclusions]\n   * @param {string} [options.normalization.exclusions.X.from]\n   * @param {object} [options.normalization.exclusions.X.to]\n   */\n  constructor(options = {}) {\n    this.normalization = options.normalization;\n    this.maxMemory = options.maxMemory || 256 * 1024 * 1024;\n    this.keepOriginal = true;\n    this.spectra = [];\n  }\n\n  getNormalizationAnnotations() {\n    return getNormalizationAnnotations(\n      this.normalization,\n      this.getNormalizedBoundary(),\n    );\n  }\n\n  /**\n   * Recalculate the normalized data using the stored original data if available\n   * This will throw an error in the original data is not present\n   * @param {number} [normalization.from]\n   * @param {number} [normalization.to]\n   * @param {number} [normalization.numberOfPoints]\n   * @param {array<object>} [normalization.filters]\n   * @param {string} [normalization.filters.X.name]\n   * @param {object} [normalization.filters.X.options]\n   * @param {array<object>} [normalization.exclusions]\n   * @param {string} [normalization.exclusions.X.from]\n   * @param {object} [normalization.exclusions.X.to]\n   */\n  setNormalization(normalization = {}) {\n    if (JSON.stringify(this.normalization) === JSON.stringify(normalization)) {\n      return;\n    }\n    this.normalization = normalization;\n    for (let spectrum of this.spectra) {\n      spectrum.updateNormalization(this.normalization);\n    }\n  }\n\n  getNormalization() {\n    return this.normalization;\n  }\n\n  /**\n   * Returns an object {x:[], y:[]} containing the autocorrelation for the\n   * specified index\n   * @param {integer} [index|undefined] x index of the spectrum to autocorrelate\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]] list of ids, by default all spectra\n   * @param {array} [options.x] x value if index is undefined\n   */\n  getAutocorrelation(index, options = {}) {\n    const { x } = options;\n    const normalizedData = this.getNormalizedData(options);\n\n    if (index === undefined && x !== undefined) {\n      index = xFindClosestIndex(normalizedData.x, x);\n    }\n\n    return getAutocorrelation(normalizedData, index);\n  }\n\n  /**\n   * Returns a {x:[], y:[]} containg the average of specified spectra\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]] list of ids, by default all spectra\n   */\n  getMeanData(options) {\n    return getMeanData(this.getNormalizedData(options));\n  }\n\n  /**\n   * Returns an object contains 4 parameters with the normalized data\n   * @returns {object} { ids:[], matrix:[Array], meta:[object], x:[] }\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] List of spectra ids to export, by default all\n   */\n  getNormalizedData(options = {}) {\n    const { ids } = options;\n    let spectra = this.getSpectra(ids);\n    return getNormalizedData(spectra);\n  }\n\n  /**\n   * Returns a tab separated value containing the normalized data\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] List of spectra ids to export, by default all\n   * @param {string} [options.fs='\\t'] field separator\n   * @param {string} [options.rs='\\n'] record (line) separator\n   * @returns {string}\n   */\n  getNormalizedText(options = {}) {\n    const { ids } = options;\n    let spectra = this.getSpectra(ids);\n    return getNormalizedText(spectra, options);\n  }\n\n  /**\n   * Returns a tab separated value containing the post processed data\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] List of spectra ids to export, by default all\n   * @param {string} [options.fs='\\t'] field separator\n   * @param {string} [options.rs='\\n'] record (line) separator\n   * @param {object} [postProcessing={}]\n   * @returns {string}\n   */\n  getPostProcessedText(options = {}) {\n    return getPostProcessedText(this, options);\n  }\n\n  getMinMaxX() {\n    let min = Number.MAX_VALUE;\n    let max = Number.MIN_VALUE;\n    for (let spectrum of this.spectra) {\n      if (spectrum.minX < min) min = spectrum.minX;\n      if (spectrum.maxX > max) max = spectrum.maxX;\n    }\n    return { min, max };\n  }\n\n  /**\n\n   * Returns an object contains 4 parameters with the scaled data\n   * @param {object} [options={}] scale spectra based on various parameters\n   * @param {object} [options.range] from - to\n   * @param {Array} [options.ids] ids of selected spectra, by default all\n   * @param {string} [options.targetID=spectra[0].id]\n   * @param {string} [options.method='max'] min, max, range, minMax\n   * @param {boolean} [options.relative=false]\n   * @returns {object} { ids:[], matrix:[Array], meta:[object], x:[] }\n   */\n  getPostProcessedData(options) {\n    return getPostProcessedData(this, options);\n  }\n\n  /**\n   * Add from text\n   * By default TITLE from the jcamp will be in the meta information\n   * @param {string} text\n   * @param {object} [options={}]\n   * @param {object} [options.parserOptions={}] XY parser options\n   * @param {object} [options.meta={}]\n   * @param {string} [options.meta.color]\n   * @param {object} [options.id={}]\n   * @param {object} [options.kind]\n   * @param {boolean} [options.force=false] replace existing spectrum (same ID)\n   */\n\n  addFromText(text, options = {}) {\n    if (options.force !== true && options.id && this.contains(options.id)) {\n      return;\n    }\n    let parsed = parseText(text, options);\n    let meta = { ...parsed.meta, ...(options.meta || {}) };\n    this.addFromData(parsed.data, { meta, id: options.id });\n  }\n\n  /**\n   * Add jcamp\n   * By default TITLE from the jcamp will be in the meta information\n   * @param {string} jcamp\n   * @param {object} [options={}]\n   * @param {object} [options.meta={}]\n   * @param {string} [options.meta.color]\n   * @param {object} [options.id={}]\n   * @param {boolean} [options.force=false] replace existing spectrum (same ID)\n   */\n\n  addFromJcamp(jcamp, options = {}) {\n    if (options.force !== true && options.id && this.contains(options.id)) {\n      return;\n    }\n    let parsed = parseJcamp(jcamp);\n    let meta = { ...parsed.meta, ...(options.meta || {}) };\n    this.addFromData(parsed.data, { meta, id: options.id });\n  }\n\n  updateRangesInfo(options) {\n    for (let spectrum of this.spectra) {\n      spectrum.updateRangesInfo(options);\n    }\n  }\n\n  /**\n   * Returns the metadata for a set of spectra\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @returns {object}\n   */\n  getMetadata(options = {}) {\n    const { ids } = options;\n    return getMetadata(this.getSpectra(ids));\n  }\n\n  /**\n   *\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @param {string} [options.propertyName=\"category\"]\n   */\n  getClasses(options) {\n    return getClasses(this.getMetadata(options), options);\n  }\n\n  /**\n   *\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @param {string} [options.propertyName=\"category\"]\n   */\n  getClassLabels(options) {\n    return getClassLabels(this.getMetadata(options), options);\n  }\n\n  /**\n   *\n   * @param {object} [options={}]\n   * @param {string} [options.propertyName=\"category\"]\n   */\n  getCategoriesStats(options) {\n    return getCategoriesStats(this.getMetadata(), options);\n  }\n\n  /**\n   * Add a spectrum based on the data\n   * @param {object} data {x, y}}\n   * @param {object} [options={}]\n   * @param {object} [options.meta={}]\n   * @param {object} [options.id]\n   * @param {object} [options.normalization={}]\n   * @param {object} [options.normalized]\n   * @return {Spectrum}\n   */\n\n  addFromData(data, options = {}) {\n    if (this.spectra.length === 0) this.keepOriginal = true;\n    const id = options.id || Math.random().toString(36).substring(2, 10);\n    let index = this.getSpectrumIndex(id);\n    if (index === undefined) index = this.spectra.length;\n    let spectrum = new Spectrum(data.x, data.y, id, {\n      meta: options.meta,\n      normalized: options.normalized,\n      normalization: this.normalization,\n    });\n    this.spectra[index] = spectrum;\n    if (!this.keepOriginal) {\n      spectrum.removeOriginal();\n    } else {\n      let memoryInfo = this.getMemoryInfo();\n      if (memoryInfo.total > this.maxMemory) {\n        this.keepOriginal = false;\n        this.removeOriginals();\n      }\n    }\n  }\n\n  removeOriginals() {\n    for (let spectrum of this.spectra) {\n      spectrum.removeOriginal();\n    }\n  }\n\n  /**\n   * Remove the spectrum from the SpectraProcessor for the specified id\n   * @param {string} id\n   */\n  removeSpectrum(id) {\n    let index = this.getSpectrumIndex(id);\n    if (index === undefined) return undefined;\n    return this.spectra.splice(index, 1);\n  }\n\n  /**\n   * Remove all the spectra not present in the list\n   * @param {Array} [ids] Array of ids of the spectra to keep\n   */\n  removeSpectraNotIn(ids) {\n    let currentIDs = this.spectra.map((spectrum) => spectrum.id);\n    for (let id of currentIDs) {\n      if (!ids.includes(id)) {\n        this.removeSpectrum(id);\n      }\n    }\n  }\n\n  /**\n   * Checks if the ID of a spectrum exists in the SpectraProcessor\n   * @param {string} id\n   */\n  contains(id) {\n    return !isNaN(this.getSpectrumIndex(id));\n  }\n\n  /**\n   * Returns the index of the spectrum in the spectra array\n   * @param {string} id\n   * @returns {number}\n   */\n  getSpectrumIndex(id) {\n    if (!id) return undefined;\n    for (let i = 0; i < this.spectra.length; i++) {\n      let spectrum = this.spectra[i];\n      if (spectrum.id === id) return i;\n    }\n    return undefined;\n  }\n\n  /**\n   * Returns an array of all the ids\n   * @returns {array}\n   */\n  getIDs() {\n    return this.spectra.map((spectrum) => spectrum.id);\n  }\n\n  /**\n   * Returns an array of spectrum from their ids\n   * @param {Array} ids\n   * @returns {Array<Spectrum}\n   */\n  getSpectra(ids) {\n    if (!ids || !Array.isArray(ids)) return this.spectra;\n    let spectra = [];\n    for (let id of ids) {\n      let index = this.getSpectrumIndex(id);\n      if (index !== undefined) {\n        spectra.push(this.spectra[index]);\n      }\n    }\n    return spectra;\n  }\n\n  /**\n   * Returns the index of the spectrum in the spectra array\n   * @param {string} id\n   * @returns {number}\n   */\n  getSpectrum(id) {\n    let index = this.getSpectrumIndex(id);\n    if (index === undefined) return undefined;\n    return this.spectra[index];\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the spectra\n   * @returns {object}\n   */\n  getChart(options) {\n    return getChart(this.spectra, options);\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the spectra\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @returns {object}\n   */\n  getAutocorrelationChart(index, options) {\n    return getAutocorrelationChart(this, index, options);\n  }\n\n  /**\n   * Returns a JSGraph annotation object for the specified index\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]]\n   * @param {array} [options.showSpectrumID=true]\n   * @param {array} [options.sortY=true]\n   * @param {object} [options.limit=20]\n   * ids, showSpectrumID = true, sort = true, limit = 20\n   * @returns {object}\n   */\n  getTrackAnnotation(index, options) {\n    return getTrackAnnotation(this.spectra, index, options);\n  }\n\n  /**\n   * Returns a JSGraph annotation object for box plot\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]] list of ids, by default all spectra\n   * @returns {object}\n   */\n  getBoxPlotChart(options = {}) {\n    const normalizedData = this.getNormalizedData(options);\n    return getBoxPlotChart(normalizedData, options);\n  }\n\n  /**\n   * Returns boxplot information\n   * @param {object} [options={}]\n   * @param {array} [options.ids=[]] list of ids, by default all spectra\n   * @returns {object}\n   */\n  getBoxPlotData(options = {}) {\n    const normalizedData = this.getNormalizedData(options);\n    return getBoxPlotData(normalizedData, options);\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the normalized spectra\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @param {object} [options.xFilter={}]\n   * @param {array} [options.xFilter.from]\n   * @param {array} [options.xFilter.to]\n   * @param {array} [options.xFilter.exclusions=[]]\n   * @returns {object}\n   */\n  getNormalizedChart(options = {}) {\n    const { ids } = options;\n    let spectra = this.getSpectra(ids);\n    return getNormalizedChart(spectra, options);\n  }\n\n  /**\n   * Returns a JSGraph chart object for all the scaled normalized spectra\n   * @param {object} [options={}]\n   * @param {Array} [options.ids] ids of the spectra to select, by default all\n   * @param {object} [options.range] from - to\n   * @param {string} [options.targetID=spectra[0].id]\n   * @param {string} [options.method='max'] min, max, range, minMax\n   * @param {boolean} [options.relative=false]\n   * @returns {object}\n   */\n  getPostProcessedChart(options) {\n    return getPostProcessedChart(this, options);\n  }\n\n  getMemoryInfo() {\n    let memoryInfo = { original: 0, normalized: 0, total: 0 };\n    this.spectra.forEach((spectrum) => {\n      let memory = spectrum.memory;\n      memoryInfo.original += memory.original;\n      memoryInfo.normalized += memory.normalized;\n      memoryInfo.total += memory.total;\n    });\n    memoryInfo.keepOriginal = this.keepOriginal;\n    memoryInfo.maxMemory = this.maxMemory;\n    return memoryInfo;\n  }\n\n  getNormalizedBoundary() {\n    let boundary = {\n      x: { min: Number.MAX_VALUE, max: Number.MIN_VALUE },\n      y: { min: Number.MAX_VALUE, max: Number.MIN_VALUE },\n    };\n    for (let spectrum of this.spectra) {\n      if (spectrum.normalizedBoundary.x.min < boundary.x.min) {\n        boundary.x.min = spectrum.normalizedBoundary.x.min;\n      }\n      if (spectrum.normalizedBoundary.x.max > boundary.x.max) {\n        boundary.x.max = spectrum.normalizedBoundary.x.max;\n      }\n      if (spectrum.normalizedBoundary.y.min < boundary.y.min) {\n        boundary.y.min = spectrum.normalizedBoundary.y.min;\n      }\n      if (spectrum.normalizedBoundary.y.max > boundary.y.max) {\n        boundary.y.max = spectrum.normalizedBoundary.y.max;\n      }\n    }\n    return boundary;\n  }\n\n  /**\n   * We provide the allowed from / to after normalization\n   * For the X axis we return the smallest common values\n   * For the Y axis we return the largest min / max\n   */\n  getNormalizedCommonBoundary() {\n    let boundary = {\n      x: { min: Number.NEGATIVE_INFINITY, max: Number.POSITIVE_INFINITY },\n      y: { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY },\n    };\n    for (let spectrum of this.spectra) {\n      if (spectrum.normalizedAllowedBoundary.x.min > boundary.x.min) {\n        boundary.x.min = spectrum.normalizedAllowedBoundary.x.min;\n      }\n      if (spectrum.normalizedAllowedBoundary.x.max < boundary.x.max) {\n        boundary.x.max = spectrum.normalizedAllowedBoundary.x.max;\n      }\n      if (spectrum.normalizedAllowedBoundary.y.min < boundary.y.min) {\n        boundary.y.min = spectrum.normalizedAllowedBoundary.y.min;\n      }\n      if (spectrum.normalizedAllowedBoundary.y.max > boundary.y.max) {\n        boundary.y.max = spectrum.normalizedAllowedBoundary.y.max;\n      }\n    }\n    return boundary;\n  }\n\n  /**\n   * Create SpectraProcessor from normalized TSV\n   * @param {string} text\n   * @param {object} [options={}]\n   * @param {object} [options.separator='\\t']\n   */\n  static fromNormalizedMatrix(text, options = {}) {\n    let parsed = parseMatrix(text, options);\n    if (!parsed) {\n      throw new Error('Can not parse TSV file');\n    }\n    let spectraProcessor = new SpectraProcessor();\n\n    spectraProcessor.setNormalization({\n      from: parsed.x[0],\n      to: parsed.x[parsed.x.length - 1],\n      numberOfPoints: parsed.x.length,\n    });\n\n    for (let i = 0; i < parsed.ids.length; i++) {\n      spectraProcessor.addFromData(\n        { x: [], y: [] },\n        {\n          normalized: {\n            x: parsed.x,\n            y: parsed.matrix[i],\n          },\n          id: parsed.ids[i],\n          meta: parsed.meta[i],\n        },\n      );\n    }\n\n    spectraProcessor.keepOriginal = false;\n\n    return spectraProcessor;\n  }\n}\n","export function getNormalizationAnnotations(filter = {}) {\n  let { exclusions = [] } = filter;\n  let annotations = [];\n  exclusions = exclusions.filter((exclusion) => !exclusion.ignore);\n  annotations = exclusions.map((exclusion) => {\n    let annotation = {\n      type: 'rect',\n      position: [\n        { x: exclusion.from, y: '0px' },\n        { x: exclusion.to, y: '2000px' },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    };\n    return annotation;\n  });\n  if (filter.from !== undefined) {\n    annotations.push({\n      type: 'rect',\n      position: [\n        { x: Number.MIN_SAFE_INTEGER, y: '0px' },\n        { x: filter.from, y: '2000px' },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    });\n  }\n  if (filter.to !== undefined) {\n    annotations.push({\n      type: 'rect',\n      position: [\n        { x: filter.to, y: '0px' },\n        { x: Number.MAX_SAFE_INTEGER, y: '2000px' },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    });\n  }\n  return annotations;\n}\n","import { xCorrelation } from 'ml-spectra-processing';\n\n/**\n * @private\n */\n\nexport function getAutocorrelation(normalized, index) {\n  let matrix = normalized.matrix;\n  let nbRow = matrix.length;\n  let nbColumn = matrix[0].length;\n  let array1 = new Float64Array(nbRow);\n  let array2 = new Float64Array(nbRow);\n  let result = new Array(nbColumn);\n  for (let j = 0; j < nbRow; j++) {\n    array1[j] = matrix[j][index];\n  }\n  for (let i = 0; i < nbColumn; i++) {\n    for (let j = 0; j < nbRow; j++) {\n      array2[j] = matrix[j][i];\n    }\n    result[i] = xCorrelation(array1, array2);\n  }\n  return {\n    x: normalized.x,\n    y: result,\n  };\n}\n","import { Matrix } from 'ml-matrix';\n\n/**\n * @private\n */\n\nexport function getMeanData(normalized) {\n  let matrix = new Matrix(normalized.matrix);\n  return {\n    x: normalized.x,\n    y: matrix.mean('column'),\n  };\n}\n","import { getNormalizedData } from './getNormalizedData.js';\nimport { convertToText } from './util/convertToText.js';\n/**\n * @private\n * @param {*} spectra\n * @param {object} [options={}]\n * @param {string} [options.fs='\\t'] field separator\n * @param {string} [options.rs='\\n'] record (line) separator\n */\n\nexport function getNormalizedText(spectra, options = {}) {\n  let { fs = '\\t', rs = '\\n' } = options;\n\n  return convertToText(getNormalizedData(spectra), {\n    rs,\n    fs,\n  });\n}\n","import { getPostProcessedData } from './getPostProcessedData.js';\nimport { convertToText } from './util/convertToText.js';\n\n/**\n * @private\n * @param {SpectraProcessor} spectraProcessor\n * @param {object} [options={}]\n * @param {string} [options.fs='\\t'] field separator\n * @param {string} [options.rs='\\n'] record (line) separator\n * @param {object} [options.postProcessing={}] post processing options\n */\n\nexport function getPostProcessedText(spectraProcessor, options = {}) {\n  let {\n    fs = '\\t',\n    rs = '\\n',\n    postProcessing: postProcessingOptions = {},\n  } = options;\n  return convertToText(\n    getPostProcessedData(spectraProcessor, postProcessingOptions),\n    {\n      rs,\n      fs,\n    },\n  );\n}\n","import { parseXY } from 'xy-parser';\n\n/**\n * Create a spectrum from a text file\n * @param {string} value - String containing the JCAMP data\n * @return {Spectrum} - new instance of Spectrum with the provided data\n */\nexport default function text(value, options = {}) {\n  const { kind, parserOptions = {} } = options;\n\n  const data = parseXY(value, parserOptions);\n\n  // we convert the data\n  if (kind && kind.importation && kind.importation.converter) {\n    data.y = data.y.map(kind.importation.converter);\n  }\n\n  return { data };\n}\n","/**\n * @private\n * @param {*} spectra\n * @param {object} options\n */\n\nexport function getMetadata(spectra, options = {}) {\n  const { ids } = options;\n\n  let metadata = [];\n\n  if (Array.isArray(spectra) && spectra.length > 0) {\n    for (let spectrum of spectra) {\n      if (!ids || ids.includes(spectrum.id)) {\n        metadata.push(spectrum.meta);\n      }\n    }\n  }\n\n  return metadata;\n}\n","import { getCategoriesStats } from './getCategoriesStats';\n\n/**\n * @private\n * @param {Array<object>} [metadata]\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {string} [options.propertyName=\"category\"]\n */\n\nexport function getClasses(metadata, options = {}) {\n  const { propertyName = 'category' } = options;\n  const categoriesStats = getCategoriesStats(metadata, options);\n  const result = new Array(metadata.length);\n  for (let i = 0; i < metadata.length; i++) {\n    result[i] = categoriesStats[metadata[i][propertyName]].classNumber;\n  }\n  return result;\n}\n","/**\n * @private\n * @param {Array<object>} [metadata]\n * @param {object} [options={}] scale spectra based on various parameters\n * @param {string} [options.propertyName=\"category\"]\n */\n\nexport function getClassLabels(metadata, options = {}) {\n  const { propertyName = 'category' } = options;\n  const categories = [];\n  for (const metadatum of metadata) {\n    categories.push(metadatum[propertyName]);\n  }\n  return categories;\n}\n","import { addChartDataStyle } from './addChartDataStyle';\n/**\n * Retrieve a chart with selected original data\n * @param {object} [options={}]\n * @param {Array} [options.ids] List of spectra ids, by default all\n * @param {Array} [options.yFactor=1]\n */\nexport function getChart(spectra, options = {}) {\n  const { ids, yFactor, xFilter = {} } = options;\n  let chart = {\n    data: [],\n  };\n\n  for (let spectrum of spectra) {\n    if (!ids || ids.includes(spectrum.id)) {\n      let data = spectrum.getData({ yFactor, xFilter });\n      addChartDataStyle(data, spectrum);\n      chart.data.push(data);\n    }\n  }\n  return chart;\n}\n","import chroma from 'chroma-js';\nimport { xMinMaxValues, xyFilterX } from 'ml-spectra-processing';\n\n/**\n * Retrieve a chart with autocorrelation color\n * @param {SpectraProcessor} [spectraProcessor]\n * @param {number} [index]\n * @param {object} [options={}]\n * @param {Array} [options.autocorrelation] precalculated autocorrelation {x,y}\n * @param {Array} [options.maxDataPoints=]\n * @param {Array} [options.ids] ids of the spectra to select, by default all\n * @param {object} [options.xFilter={}]\n * @param {number} [options.xFilter.from]\n * @param {number} [options.xFilter.to]\n * @param {array} [options.xFilter.exclusions=[]]\n */\nexport function getAutocorrelationChart(spectraProcessor, index, options = {}) {\n  const {\n    autocorrelation = spectraProcessor.getAutocorrelation(index, options),\n    xFilter,\n    ids,\n  } = options;\n\n  const { min, max } = xMinMaxValues(autocorrelation.y);\n  let colorCallback = chroma\n    .scale(['blue', 'cyan', 'yellow', 'red'])\n    .domain([min, max])\n    .mode('lch');\n\n  let colorScale = autocorrelation.y.map(\n    (y) => `rgb(${colorCallback(y).rgb().join()})`,\n  );\n\n  let mean = spectraProcessor.getMeanData({ ids });\n  if (xFilter) {\n    mean = xyFilterX({ x: mean.x, y: mean.y }, xFilter);\n  }\n\n  let colorSpectrum = {\n    type: 'color',\n    x: mean.x,\n    y: mean.y,\n    color: colorScale,\n    styles: {\n      unselected: {\n        lineWidth: 1,\n        lineStyle: 1,\n      },\n      selected: {\n        lineWidth: 3,\n        lineStyle: 1,\n      },\n    },\n  };\n\n  return colorSpectrum;\n}\n","import { getNormalizedData } from '../spectra/getNormalizedData';\n\nexport function getTrackAnnotation(spectra, index, options = {}) {\n  const { ids, showSpectrumID = true, sortY = true, limit = 20 } = options;\n  let annotations = [];\n\n  let normalized = getNormalizedData(spectra, { ids });\n\n  if (normalized.ids.length === 0) return annotations;\n  let line = 0;\n\n  // header containing X coordinate\n  annotations.push({\n    type: 'line',\n    position: [\n      { x: `${70}px`, y: `${15 + 15 * line}px` },\n      { x: `${85}px`, y: `${15 + 15 * line}px` },\n    ],\n    strokeWidth: 0.0000001,\n    label: {\n      size: 16,\n      text: `x: ${normalized.x[index].toPrecision(6)}`,\n      position: { x: `${130}px`, y: `${20 + 15 * line}px` },\n    },\n  });\n  line++;\n\n  let peaks = [];\n  for (let i = 0; i < normalized.ids.length; i++) {\n    peaks.push({\n      id: normalized.ids[i],\n      meta: normalized.meta[i],\n      y: normalized.matrix[i][index],\n    });\n  }\n\n  if (sortY) {\n    peaks = peaks.sort((a, b) => b.y - a.y);\n  }\n  if (limit) {\n    peaks = peaks.slice(0, limit);\n  }\n\n  for (let { id, meta, y } of peaks) {\n    annotations.push({\n      type: 'line',\n      position: [\n        { x: `${70}px`, y: `${15 + 15 * line}px` },\n        { x: `${85}px`, y: `${15 + 15 * line}px` },\n      ],\n      strokeColor: meta.color,\n      strokeWidth: 2,\n      label: {\n        text: `${y.toPrecision(4)}${showSpectrumID ? ` - ${id}` : ''}`,\n        position: { x: `${90}px`, y: `${20 + 15 * line}px` },\n      },\n    });\n    line++;\n  }\n\n  return annotations;\n}\n","import { xyFilterX } from 'ml-spectra-processing';\n\nimport { addChartDataStyle } from './addChartDataStyle';\n\n/**\n * @param {Array<Spectrum>} spectra\n * @param {object} [options={}]\n * @param {object} [options.xFilter={}]\n * @param {number} [options.xFilter.from]\n * @param {number} [options.xFilter.to]\n * @param {array} [options.xFilter.exclusions=[]]\n */\n\nexport function getNormalizedChart(spectra, options = {}) {\n  const { xFilter } = options;\n  let chart = {\n    data: [],\n  };\n  for (let spectrum of spectra) {\n    let data = spectrum.normalized;\n    if (xFilter) {\n      data = xyFilterX(data, xFilter);\n    }\n    addChartDataStyle(data, spectrum);\n    chart.data.push(data);\n  }\n  return chart;\n}\n","import { addChartDataStyle } from './addChartDataStyle';\n/**\n *\n * @param {SpectraProcessor} spectraProcessor\n * @param {object}   [options={}] scale spectra based on various parameters\n * @param {Array}    [options.ids] ids of selected spectra\n * @param {Array}    [options.filters=[]] Array of object containing {name:'', options:''}\n * @param {object}   [options.scale={}] object containing the options for rescaling\n * @param {string}   [options.scale.targetID=spectra[0].id]\n * @param {string}   [options.scale.method='max'] min, max, integration, minMax\n * @param {Array}    [options.scale.range] from - to to apply the method and rescale\n * @param {boolean}  [options.scale.relative=false]\n */\nexport function getPostProcessedChart(spectraProcessor, options = {}) {\n  let scaled = spectraProcessor.getPostProcessedData(options);\n\n  let chart = {\n    data: [],\n  };\n  if (!scaled || !scaled.matrix) return chart;\n\n  for (let i = 0; i < scaled.matrix.length; i++) {\n    let data = {\n      x: scaled.x,\n      y: Array.from(scaled.matrix[i]), // need to ensure not a typed array\n    };\n    addChartDataStyle(data, { meta: scaled.meta[i], id: scaled.ids[i] });\n    chart.data.push(data);\n  }\n\n  return chart;\n}\n","/**\n * Creates a g\n * @param {string} text - String containing the text data\n * @param {object} [options={}]\n * @param {string} [options.fs='\\t'] Field separator\n * @return {object} - {matrix, data, x, ids}\n */\nexport default function matrix(text, options = {}) {\n  const lines = text.split(/[\\r\\n]+/).filter((value) => value);\n  const { fs = '\\t' } = options;\n  let currentMatrix = [];\n  let ids = [];\n  let meta = [];\n  let x = [];\n\n  let headers = lines[0].split(fs);\n  let labels = [];\n\n  for (let i = 0; i < headers.length; i++) {\n    let header = headers[i];\n    if (isNaN(header)) {\n      labels[i] = header;\n    } else {\n      x = headers.slice(i).map((value) => Number(value));\n      break;\n    }\n  }\n\n  for (let i = 1; i < lines.length; i++) {\n    let line = lines[i];\n    let parts = line.split('\\t');\n    ids.push(parts[0]);\n    let oneMeta = {};\n    meta.push(oneMeta);\n    for (let j = 1; j < parts.length; j++) {\n      if (j < labels.length) {\n        oneMeta[labels[j]] = parts[j];\n      } else {\n        currentMatrix.push(\n          parts.slice(labels.length).map((value) => Number(value)),\n        );\n        break;\n      }\n    }\n  }\n  return { x, meta, matrix: currentMatrix, ids };\n}\n","export function getFilterAnnotations(filter = {}) {\n  let { exclusions = [] } = filter;\n  let annotations = [];\n  exclusions = exclusions.filter((exclusion) => !exclusion.ignore);\n  annotations = exclusions.map((exclusion) => {\n    let annotation = {\n      type: 'rect',\n      position: [\n        { x: exclusion.from, y: '0px' },\n        { x: exclusion.to, y: '2000px' },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,128,1)',\n    };\n    return annotation;\n  });\n  if (filter.from !== undefined) {\n    annotations.push({\n      type: 'rect',\n      position: [\n        { x: Number.MIN_SAFE_INTEGER, y: '0px' },\n        { x: filter.from, y: '2000px' },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    });\n  }\n  if (filter.to !== undefined) {\n    annotations.push({\n      type: 'rect',\n      position: [\n        { x: filter.to, y: '0px' },\n        { x: Number.MAX_SAFE_INTEGER, y: '2000px' },\n      ],\n      strokeWidth: 0,\n      fillColor: 'rgba(255,255,224,1)',\n    });\n  }\n  return annotations;\n}\n"],"names":["createFromToArray","options","from","to","length","includeFrom","includeTo","distribution","array","Float64Array","div","delta","index","Error","base","firstExponent","Math","log","toString","Object","prototype","isAnyArray","value","call","endsWith","a","d","e","f","g","h","i","j","c","b","_ref","module","exports","window","median","xMedian","input","TypeError","quickSelectMedian","slice","xAdd","array1","array2","isConstant","constant","array3","getOutputArray","output","undefined","xMultiply","Number","xBoxPlot","sort","q1max","q3min","info","q1","q3","min","max","middle","middleOver","xCheck","xCorrelation","A","B","n","sumA","sumA2","sumB","sumB2","sumAB","sqrt","xEnsureFloat64","xFindClosestIndex","target","sorted","low","high","abs","diff","POSITIVE_INFINITY","currentDiff","xGetFromToIndex","x","fromIndex","toIndex","xMaxValue","maxValue","xMinValue","minValue","xIsEquallySpaced","tolerance","maxDx","minDx","MAX_SAFE_INTEGER","absoluteDifference","xIsMonotone","xIsMonotoneIncreasing","xMean","sumValue","xMinMaxValues","xNoiseStandardDeviation","mad","averageDeviations","xMedianAbsoluteDeviation","sd","xSum","xNormed","algorithm","toLowerCase","absoluteSumValue","absoluteSum","currentMaxValue","factor","sumFactor","xVariance","values","unbiased","mean","sqrError","xStandardDeviation","xParetoNormalization","result","sqrtSD","item","push","xRescale","currentMin","currentMax","RangeError","xApplyFunctionStr","variableLabel","fctString","fct","Function","replace","toReturn","isNaN","xSubtract","xyCheck","data","minLength","y","xyMaxYPoint","current","xyEnsureGrowingX","Array","prevX","NEGATIVE_INFINITY","currentIndex","zonesNormalize","zones","exclusions","JSON","parse","stringify","map","zone","forEach","filter","currentZone","beforeExclusionsZones","normalizedExclusions","currentExclusionIndex","results","counter","zoneIndex","zonesWithPoints","numberOfPoints","returnZones","totalSize","reduce","previous","unitsPerPoint","currentTotal","round","integral","x0","x1","slope","intercept","xyEquallySpaced","xLength","variant","normalizedZones","zonesWithPointsRes","xResult","yResult","zoneResult","processZone","concat","step","halfStep","lastStep","start","previousX","MAX_VALUE","previousY","nextX","nextY","frontOutsideSpectra","backOutsideSpectra","currentValue","currentPoints","main","equallySpacedSlot","initialOriginalStep","lastOriginalStep","MIN_SAFE_INTEGER","sumAtMin","sumAtMax","add","equallySpacedSmooth","xyFilterX","currentZoneIndex","newX","newY","position","xyIntegration","currentxyIntegration","xyMinYPoint","matrixCenterZMean","matrix","nbRows","nbColumns","newMatrix","row","column","arguments","_options$fromIndex","_options$toIndex","isInteger","rescale","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","constructor","name","inspectData","rows","columns","maxI","maxJ","line","formatNumber","get","join","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","indexOf","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","Matrix","set","fill","random","interval","this","zeros","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","m","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","maxIndex","v","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","r","resultat","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","variance","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","exp","expm1","floor","fround","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","BaseView","MatrixTransposeView","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","count","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","ks","cs","sn","sp","spm1","epm1","sk","ek","shift","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","matrixPQN","matrixB","normalizationFactor","referenceSpectrum","currentVariable","medianOfQuotients","quotients","matrixZRescale","limit$2","limit$1","clip_rgb$3","rgb","_clipped","_unclipped","classToType","i$1","list$1","type$p","obj","type$o","unpack$B","args","keyOrder","split","type$n","last$4","PI$2","PI","utils","clip_rgb","limit","unpack","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","input$h","format","autodetect","last$3","clip_rgb$2","type$m","_input","Color$D","len","me","mode","list","chk","test","_rgb","hex","Color_1","chroma$k","bind","Color","version","chroma_1","unpack$A","max$2","rgb2cmyk$1","ref","rgb2cmyk_1","unpack$z","cmyk2rgb","cmyk2rgb_1","chroma$j","Color$C","input$g","unpack$y","type$l","rgb2cmyk","cmyk","unpack$x","last$2","rnd","hsl2css$1","hsla","hsl2css_1","unpack$w","rgb2hsl$3","rgb2hsl_1","unpack$v","last$1","hsl2css","rgb2hsl$2","round$6","rgb2css$1","rgba","substr","rgb2css_1","unpack$u","round$5","hsl2rgb$1","assign","t3","t2","t1","h_","hsl2rgb_1","hsl2rgb","input$f","RE_RGB","RE_RGBA","RE_RGB_PCT","RE_RGBA_PCT","RE_HSL","RE_HSLA","round$4","css2rgb$1","css","trim","named","match","rgb$1","rgb$2","i$2","rgb$3","i$3","hsl","rgb$4","hsl$1","rgb$5","css2rgb_1","chroma$i","Color$B","input$e","type$k","rgb2css","css2rgb","rest","Color$A","chroma$h","input$d","unpack$t","gl","unpack$s","rgb2hcg$1","_g","rgb2hcg_1","unpack$r","floor$3","hcg2rgb","assign$1","assign$2","assign$3","assign$4","assign$5","_c","hcg2rgb_1","unpack$q","type$j","chroma$g","Color$z","input$c","rgb2hcg","hcg","unpack$p","round$3","rgb2hex$2","str","hxa","rgb2hex_1","RE_HEX","RE_HEXA","hex2rgb_1","u","u$1","chroma$f","Color$y","type$i","input$b","rgb2hex$1","unpack$o","TWOPI$2","min$2","sqrt$4","rgb2hsi$1","min_","rgb2hsi_1","unpack$n","TWOPI$1","cos$4","hsi2rgb","hsi2rgb_1","unpack$m","type$h","chroma$e","Color$x","input$a","rgb2hsi","hsi","unpack$l","type$g","chroma$d","Color$w","input$9","rgb2hsl$1","unpack$k","min$1","max$1","rgb2hsl","max_","rgb2hsv$1","unpack$j","floor$2","hsv2rgb","hsv2rgb_1","unpack$i","type$f","chroma$c","Color$v","input$8","rgb2hsv","hsv","labConstants","Kn","Xn","Yn","Zn","t0","LAB_CONSTANTS$3","unpack$h","pow$a","rgb2lab$2","ref$1","rgb2xyz","rgb_xyz","xyz_lab","rgb2lab_1","LAB_CONSTANTS$2","unpack$g","pow$9","lab2rgb$1","z","lab_xyz","xyz_rgb","lab2rgb_1","unpack$f","type$e","chroma$b","Color$u","input$7","rgb2lab$1","lab","unpack$e","sqrt$3","atan2$2","atan2","round$2","lab2lch$2","lab2lch_1","unpack$d","rgb2lab","lab2lch$1","rgb2lch$1","b_","rgb2lch_1","unpack$c","sin$3","cos$3","lch2lab$2","lch2lab_1","unpack$b","lch2lab$1","lab2rgb","lch2rgb$1","L","lch2rgb_1","unpack$a","lch2rgb","hcl2rgb","hcl","reverse","hcl2rgb_1","unpack$9","type$d","chroma$a","Color$t","input$6","rgb2lch","lch","w3cx11_1","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflower","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","laserlemon","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrod","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","maroon2","maroon3","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","purple2","purple3","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","Color$s","input$5","type$c","w3cx11","hex2rgb","rgb2hex","keys","unpack$8","rgb2num$1","rgb2num_1","type$b","num2rgb","num2rgb_1","chroma$9","Color$r","input$4","type$a","rgb2num","chroma$8","Color$q","input$3","unpack$7","type$9","round$1","log$1","temperature2rgb_1","kelvin","temperature2rgb","unpack$6","rgb2temperature$1","minTemp","maxTemp","chroma$7","Color$p","input$2","rgb2temperature","temperature","unpack$5","pow$8","sign$1","rgb2oklab$2","rgb2lrgb","lr","lg","lb","rgb2oklab_1","unpack$4","pow$7","oklab2rgb$1","lrgb2rgb","oklab2rgb_1","unpack$3","type$8","chroma$6","Color$o","input$1","rgb2oklab$1","oklab","unpack$2","rgb2oklab","lab2lch","rgb2oklch$1","rgb2oklch_1","unpack$1","lch2lab","oklab2rgb","oklch2rgb","oklch2rgb_1","type$7","chroma$5","Color$n","rgb2oklch","oklch","Color$m","type$6","mutate","clipped","Color$k","LAB_CONSTANTS$1","darken","amount","brighten","darker","brighter","mc","channel","src","Color$i","type$5","pow$6","EPS","MAX_ITER","luminance","lum","cur_lum","max_iter","mid","interpolate","lm","rgb2luminance","luminance_x","interpolator$1","Color$h","type$4","interpolator","mix$1","col1","col2","Color$g","mix","Color$f","premultiply","Color$e","LAB_CONSTANTS","saturate","desaturate","Color$d","type$3","charAt","out","Color$c","xyz0","xyz1","Color$b","sqrt$2","pow$5","lrgb","y1","z1","x2","y2","z2","Color$a","Color$9","_hsx","hue0","hue1","sat0","sat1","lbv0","lbv1","sat","hue","lbv","interpolate_hsx$5","Color$8","interpolate_hsx$4","interpolate_hsx$3","interpolate_hsx$2","interpolate_hsx$1","Color$7","interpolate_hsx","Color$6","clip_rgb$1","pow$4","sqrt$1","PI$1","cos$2","sin$2","atan2$1","average","colors","weights","w","_average_lrgb","xyz","cnt","dx","dy","ci","xyz2","A$1","chroma$4","type$2","pow$3","scale$2","_mode","_nacol","_spread","_domain","_pos","_padding","_classes","_colors","_out","_min","_max","_correctLightness","_colorCache","_useCache","_gamma","setColors","brewer","c$1","resetCache","getClass","tMapLightness","tMapDomain","getColor","val","bypassMap","classes","analyze","limits","domain","tOut","tBreaks","every","_m","range","_o","spread","correctLightness","L0","L1","pol","L_actual","L_ideal","L_diff","padding","numColors","dm","dd","__range__","samples","end","asc","cache","gamma","nodata","left","right","inclusive","ascending","Color$5","scale$1","binom_row","newrow","bezier","I","lab0","lab1","lab2","lab3","labs","el","bezier_1","chroma$3","blend","bottom","top","blend_f","c0","each","normal","lighten","screen","overlay","burn","dodge","blend_1","type$1","pow$2","sin$1","cos$1","chroma$2","cubehelix","rotations","lightness","dl","dh","fract","amp","cos_a","sin_a","Color$4","digits","floor$1","random_1","code","pow$1","abs$1","key","min_log","LOG10E","max_log","pb","pr","cluster","assignments","clusterSizes","nb_iters","centroids","i$4","mindist","best","j$1","dist","newCentroids","j$2","i$5","j$3","j$4","kClusters","j$5","i$6","tmpKMeansBreaks","j$6","i$7","analyze_1","Color$3","contrast","l1","l2","Color$2","deltaE","Kl","Kc","Kh","rad2deg","rad","deg2rad","deg","a1","b1","L2","a2","b2","avgL","avgC","G","a1p","a2p","C1p","C2p","avgCp","arctan1","arctan2","h1p","h2p","avgHp","T","deltaHp","deltaL","deltaCp","sl","sc","sh","deltaTheta","Rt","Color$1","distance","sum_sq","valid","chroma$1","scales","cool","hot","colorbrewer","OrRd","PuBu","BuPu","Oranges","BuGn","YlOrBr","YlGn","Reds","RdPu","Greens","YlGnBu","Purples","GnBu","Greys","YlOrRd","PuRd","Blues","PuBuGn","Viridis","Spectral","RdYlGn","RdBu","PiYG","PRGn","RdYlBu","BrBG","RdGy","PuOr","Set2","Accent","Set1","Set3","Dark2","Paired","Pastel2","Pastel1","colorbrewer_1","chroma","factory","getBoxPlotData","normalizedData","nbRow","nbColumn","aColumn","getColors","dataset","stdevs","colorCallback","addChartDataStyle","spectrum","styles","unselected","lineColor","meta","color","lineWidth","lineStyle","selected","label","id","getNormalizedData","spectra","ids","currentIDs","isArray","includes","normalized","getCategoriesStats","metadata","propertyName","categories","classNumber","metadatum","ensureString","blob","ArrayBuffer","isView","encoding","guessEncoding","TextDecoder","decode","uint8","Uint8Array","buffer","byteOffset","byteLength","buf","isutf8","parseString","lowercase","number","GC_MS_FIELDS","complexChromatogram","chromatogram","times","series","ms","dimension","existingGCMSFields","convertMSFieldToLabel","pageValue","isMSField","canonicDataLabel","convertToFloatArray","stringArray","floatArray","fastParseXYData","yFactor","deltaX","isXYdata","currentData","ascii","currentX","firstX","currentY","firstY","endLine","charCodeAt","newLine","isDifference","isLastDifference","lastDifference","isDuplicate","inComment","lastValue","isNegative","inValue","skipFirstValue","decimalPosition","duplicate","ascii2","removeCommentRegExp","peakTableSplitRegExp","parsePeakTable","isPeaktable","variables","numberOfVariables","variable","lines","logs","parseXYZ","xFactor","parseXY","parseXYA","removeSymbolRegExp","isXYAdata","add2D","zData","minZ","maxZ","ySize","xSize","lastX","lastY","medians","getMedian","minX","maxX","minY","maxY","noise","convertTo3DZ","noContour","contourLines","povarHeight0","povarHeight1","povarHeight2","povarHeight3","isOver0","isOver1","isOver2","isOver3","pAx","pAy","pBx","pBy","lineZValue","nbSubSpectra","nbPovars","y0","iter","nbContourLevels","contourLevels","level","contourLevel","side","noiseMultiplier","zValue","iSubSpectra","subSpectra","subSpectraAfter","povar","segments","generateContourLines","minMax","gyromagneticRatio","profiling","action","time","Date","now","simpleChromatogram","intensity","postProcessing","entriesFlat","entry","observeFrequency","shiftOffsetVal","ntuples","symbol","xUnits","toUpperCase","nucleus","startsWith","$NUC2","f2index","$NUC1","yType","unit","pageSymbolIndex","pageSymbol","units","ratio0","ratio1","ratio","postProcessingNMR","newNtuples","twoD","wantXY","keepSpectra","prepareNtuplesDatatable","currentEntry","kind","xIndex","yIndex","firstVariable","secondVariable","lowerCaseSymbol","vardim","nbPoints","varname","yUnits","prepareSpectrum","ntuplesSeparatorRegExp","defaultOptions","keepRecordsRegExp","canonicDataLabels","canonicMetadataLabels","dynamicTyping","withoutXY","IR_TRANSMITTANCE","normalization","importation","converter","transmittance","display","xLabel","xInverted","yLabel","IR_ABSORBANCE","jcamp","jcampText","parsed","entries","tmpResult","children","parentsStack","ldrs","ldr","dataLabel","substring","dataValue","infos","datatable","parentEntry","title","dataType","dataClass","xType","shiftOffsetNum","vartype","varform","page","sampleDescription","pop","flatten","convert","xy","getJcampKind","uniqueX","points","text","xColumn","yColumn","bestGuess","keepInfo","numberColumns","maxNumberColumns","minNumberColumns","fields","parseFloat","skipFirstColumn","xs","uniqueXFunction","mlArrayMax","convertToText","fs","rs","allKeysObject","metum","allKeys","o","require","createHash","write","update","dispatch","digest","read","sha1","excludeValues","MD5","keysMD5","getHashes","ignoreUnknown","respectType","respectFunctionNames","respectFunctionProperties","unorderedArrays","unorderedSets","unorderedObjects","replacer","excludeKeys","exec","_object","isBuffer","_array","_date","_symbol","_error","_boolean","_string","_function","_number","_xml","_null","_undefined","_regexp","_uint8array","_uint8clampedarray","_int8array","_uint16array","_int16array","_uint32array","_int32array","_float32array","_float64array","_arraybuffer","_url","_map","_set","_file","lastModfied","_blob","_domwindow","_bigint","_process","_timer","_pipe","_tcp","_udp","_tty","_statwatcher","_securecontext","_connection","_zlib","_context","_nodescript","_httpparser","_dataview","_signal","_fsevent","_tlswrap","writeToStream","self","Buffer","crypto","lYpoI2","toByteArray","fromByteArray","base64js","O","H","_useTypedArrays","_augment","_isBuffer","C","readUInt8","_charsWritten","fromCharCode","_","E","F","D","SlowBuffer","INSPECT_MAX_BYTES","poolSize","foo","subarray","isEncoding","M","N","_arr","S","writeUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","inspect","toArrayBuffer","encodeURIComponent","decodeURIComponent","_get","toLocaleString","ieee754","hash","sha256","md5","createHmac","randomBytes","LN2","nextTick","setImmediate","postMessage","addEventListener","source","stopPropagation","setTimeout","browser","env","argv","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","cwd","chdir","getFromToIndex","integration","normalizedTarget","fromToIndex","targetValue","deltaTarget","minTarget","deltaSource","minSource","getPostProcessedData","spectraProcessor","optionsHash","ranges","calculations","filters","targetID","relative","method","getSpectra","validCache","weakMap","WeakMap","getSpectrum","rangesCopy","yNormalized","resultRanges","currentRange","maxPoint","parameters","calculation","formula","oneRanges","prepare","P","Pinv","Mt","ar","ac","Ap","Ai","Ax","LNZ","coloffset","adr","Lp","Parent","Lnz","Flag","Pattern","bp1","kk","p2","ldlSymbolic","Lx","Li","yi","lKi","ldlNumeric","ldlPerm","ldlLsolve","ldlDsolve","ldlLTsolve","ldlPermt","compareNum","adj","visited","toVisit","eol","ptr","nbhd","getClosestNumber","goal","closest","prev","curr","getCloseIndex","updateSystem","newVector","next","getDeltaMatrix","lambda","lowerTriangularNonZeros","permutationEncodedArray","cuthillMckee","airPLS","baseline","iteration","maxIterations","factorCriterion","controlPoints","baseLineZones","arr","indexFrom","indexTo","sumNegDifferences","stopCriterion","leftHandSide","rightHandSide","cho","Cholesky","difference","calculateError","maxNegativeDiff","corrected","error","_typeof","iterator","sequentialFill","_options","_options$from","_options$to","_options$size","_i","maybeToPrecision","BaseRegression","predict","_predict","train","toLaTeX","score","ySum","chi2","rmsd","xSquared","ySquared","xY","PolynomialRegression","degree","powers","coefficients","checkArrayLength","FT","useSVD","regress","precision","_toFormula","isLaTeX","sup","closeSup","fn","json","baselineCorrectionRegression","Regression","regressionOptions","regression","fitting","oldFitting","xPadding","fromEnd","toEnd","xRolling","subArray","xRollingAverage","xRollingMedian","rollingBall","numberPoints","maxima","minima","windowM","windowS","windowLeft","windowRight","sgg","ys","windowSize","derivative","polynomial","half","np","ans","fullWeights","hs","constantH","wg1","wg2","d1","d2","getHs","wg","gramPoly","Grampoly","genFact","gf","weight","optimizeTop","peaks","peak","beta","gsd","sgOptions","noiseLevel","smoothY","maxCriteria","minMaxRatio","realTopDetection","equallySpaced","noiseInfo","dY","ddY","yData","yThreshold","dX","lastMax","lastMin","minddY","intervalL","intervalR","lastK","minddYIndex","possible","minDistance","currentDistance","width","inflectionPoints","airpls","correctedSpectrum","baselineFct","baselineCorrection","defaults","actualOptions","targetX","nbPeaks","gsdOptions","function","filterXY","filterFct","Filters","Spectrum","normalizedBoundary","updateNormalizedBoundary","normalizedAllowedBoundary","updateNormalization","updateMemory","original","memory","total","removeOriginal","getXY","updateRangesInfo","minPoint","equallySpacedFilter","allowedBoundary","getNormalized","getData","xFilter","SpectraProcessor","maxMemory","keepOriginal","getNormalizationAnnotations","annotations","exclusion","ignore","strokeWidth","fillColor","getNormalizedBoundary","setNormalization","getNormalization","getAutocorrelation","getMeanData","getNormalizedText","getPostProcessedText","postProcessingOptions","getMinMaxX","addFromText","force","contains","parserOptions","parseText","addFromData","addFromJcamp","parseJcamp","getMetadata","getClasses","categoriesStats","getClassLabels","getSpectrumIndex","getMemoryInfo","removeOriginals","removeSpectrum","removeSpectraNotIn","getIDs","getChart","chart","getAutocorrelationChart","autocorrelation","colorScale","getTrackAnnotation","showSpectrumID","sortY","strokeColor","getBoxPlotChart","q13FillColor","q13FillOpacity","medianStrokeColor","medianStrokeWidth","minMaxFillColor","minMaxFillOpacity","boxPlotData","q13","layer","properties","fillOpacity","getNormalizedChart","getPostProcessedChart","scaled","memoryInfo","boundary","getNormalizedCommonBoundary","currentMatrix","headers","labels","header","parts","oneMeta","parseMatrix"],"mappings":"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"}