{"version":3,"file":"eln-plugin.min.js","sources":["../src/types/default.js","../src/types/reaction/general.js","../node_modules/utf8/utf8.js","../node_modules/iobuffer/lib-esm/IOBuffer.js","../node_modules/netcdfjs/src/utils.js","../node_modules/netcdfjs/src/types.js","../node_modules/netcdfjs/src/data.js","../node_modules/netcdfjs/src/header.js","../node_modules/netcdfjs/src/toString.js","../node_modules/netcdfjs/src/index.js","../node_modules/netcdf-gcms/src/agilentGCMS.js","../node_modules/netcdf-gcms/src/brukerGCMS.js","../node_modules/netcdf-gcms/src/agilentHPLC.js","../node_modules/netcdf-gcms/src/finniganGCMS.js","../node_modules/netcdf-gcms/src/shimadzuGCMS.js","../node_modules/netcdf-gcms/src/advionGCMS.js","../node_modules/netcdf-gcms/src/aiaTemplate.js","../node_modules/netcdf-gcms/src/index.js","../node_modules/atob/browser-atob.js","../node_modules/base64-js/index.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/is-any-array/lib-esm/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.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/types/common.js","../src/types/sample/chromatogram.js","../src/types/sample/cyclicVoltammetry.js","../src/types/sample/differentialCentrifugalSedimentation.js","../src/types/sample/differentialScanningCalorimetry.js","../src/types/sample/dls.js","../src/types/sample/elementAnalysis.js","../node_modules/genbank-parser/src/index.js","../node_modules/genbank-parser/src/utils/months.js","../src/types/sample/genbank.js","../src/types/sample/general.js","../src/types/sample/hgPorosimetry.js","../src/types/sample/icp.js","../src/types/sample/image.js","../src/types/sample/ir.js","../src/types/sample/isotherm.js","../src/types/sample/iv.js","../src/types/sample/mass.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/complexChromatogram.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/convertToFloatArray.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/parse/fastParseXYData.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/parse/parsePeakTable.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/parse/parseXYA.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/2d/add2D.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/2d/convertTo3DZ.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/2d/generateContourLines.js","../node_modules/nmr-metadata/node_modules/jcampconverter/node_modules/nmr-processing/lib-esm/constants/gyromagneticRatio.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/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-matrix/src/decompositions.js","../node_modules/ml-array-sequential-fill/lib-es6/index.js","../node_modules/d3-array/build/d3-array.js","../node_modules/spline-interpolator/index.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/profiling.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/simpleChromatogram.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/postProcessing.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/postProcessingNMR.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/prepareNtuplesDatatable.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/prepareSpectrum.js","../node_modules/nmr-metadata/node_modules/jcampconverter/lib-esm/convert.js","../node_modules/nmr-processing/src/constants/impurities.js","../node_modules/nmr-processing/src/peaks/peaksFilterImpurities.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/Shape1D.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/pseudoVoigt/PseudoVoigt.js","../node_modules/nmr-processing/node_modules/ml-gsd/node_modules/ml-peak-shape-generator/lib-esm/util/getShape1D.js","../node_modules/nmr-processing/node_modules/ml-savitzky-golay-generalized/src/index.js","../node_modules/nmr-processing/node_modules/ml-gsd/src/gsd.js","../node_modules/assign-symbols/index.js","../node_modules/assign-deep/index.js","../node_modules/nmr-processing/node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/nmr-processing/node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/nmr-processing/node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/nmr-processing/node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/nmr-processing/node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../node_modules/nmr-processing/node_modules/ml-spectra-fitting/src/shapes/sumOfGaussianLorentzians.js","../node_modules/nmr-processing/node_modules/ml-spectra-fitting/src/shapes/sumOfGaussians.js","../node_modules/nmr-processing/node_modules/ml-spectra-fitting/src/shapes/sumOfLorentzians.js","../node_modules/nmr-processing/node_modules/ml-spectra-fitting/src/checkInput.js","../node_modules/nmr-processing/node_modules/is-any-array/src/index.js","../node_modules/nmr-processing/node_modules/ml-levenberg-marquardt/src/checkOptions.js","../node_modules/nmr-processing/node_modules/ml-levenberg-marquardt/src/errorCalculation.js","../node_modules/nmr-processing/node_modules/ml-levenberg-marquardt/src/step.js","../node_modules/nmr-processing/node_modules/ml-levenberg-marquardt/src/gradientFunction.js","../node_modules/nmr-processing/node_modules/ml-levenberg-marquardt/src/index.js","../node_modules/nmr-processing/node_modules/ml-spectra-fitting/src/selectMethod.js","../node_modules/nmr-processing/node_modules/ml-spectra-fitting/src/index.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/xAbsoluteMedian.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/xAbsolute.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/xFindClosestIndex.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/xGetFromToIndex.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/erfcinv.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/rayleighCdf.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/xNoiseSanPlot.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/xy/xyCheck.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/zones/zonesNormalize.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/xy/xyExtract.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/xy/xyIntegration.js","../node_modules/nmr-processing/node_modules/ml-gsd/src/post/groupPeaks.js","../node_modules/nmr-processing/node_modules/ml-gsd/src/post/optimizePeaks.js","../node_modules/nmr-processing/node_modules/ml-gsd/src/post/joinBroadPeaks.js","../node_modules/nmr-processing/src/xy/xyAutoPeaksPicking.js","../node_modules/nmr-processing/src/peaks/util/jAnalyzer.js","../node_modules/nmr-processing/src/peaks/util/joinRanges.js","../node_modules/nmr-processing/src/peaks/peaksToRanges.js","../node_modules/nmr-processing/src/xy/xyAutoRangesPicking.js","../node_modules/nmr-metadata/src/getMetaData.js","../node_modules/nmr-metadata/src/getNucleusFrom2DExperiment.js","../node_modules/nmr-metadata/src/getSpectrumType.js","../node_modules/nmr-metadata/src/index.js","../src/types/sample/nmr.js","../src/types/sample/oan.js","../src/types/sample/pelletHardness.js","../src/types/sample/permeability.js","../src/types/sample/physical.js","../src/types/sample/raman.js","../src/types/sample/stock.js","../src/types/sample/thermogravimetricAnalysis.js","../src/types/sample/uv.js","../src/types/sample/video.js","../src/types/sample/voidVolume.js","../src/types/sample/xps.js","../src/types/sample/xray.js","../src/types/sample/xrd.js","../src/types/sample/xrf.js","../src/types/index.js","../src/types.js","../src/util/defaults.js","../src/index.js"],"sourcesContent":["export default {\n  process() {\n    return {};\n  },\n\n  getEmpty() {\n    return [];\n  },\n};\n","export default {\n  jpath: [],\n  getEmpty() {\n    return {\n      code: '',\n      date: Date.now(),\n      procedure: '',\n      products: [],\n      reagents: [],\n      conditions: '',\n      meta: {},\n      remarks: '',\n      title: '',\n      reactionRXN: '$RXN\\n\\n\\n\\n  0  0\\n',\n    };\n  },\n};\n","/*! https://mths.be/utf8js v3.0.0 by @mathias */\n;(function(root) {\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\n\tfunction checkScalarValue(codePoint) {\n\t\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t}\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\n\tfunction encodeCodePoint(codePoint) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tcheckScalarValue(codePoint);\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\n\tfunction utf8encode(string) {\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint);\n\t\t}\n\t\treturn byteString;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\n\t\t// If we end up here, it’s not a continuation byte\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\n\tfunction decodeSymbol() {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Read first byte\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\tcheckScalarValue(codePoint);\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\n\t\tthrow Error('Invalid UTF-8 detected');\n\t}\n\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction utf8decode(byteString) {\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol()) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\troot.version = '3.0.0';\n\troot.encode = utf8encode;\n\troot.decode = utf8decode;\n\n}(typeof exports === 'undefined' ? this.utf8 = {} : exports));\n","import { decode, encode } from 'utf8';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n    /**\n     * @param data - The data to construct the IOBuffer with.\n     * If data is a number, it will be the new buffer's length<br>\n     * If data is `undefined`, the buffer will be initialized with a default length of 8Kb<br>\n     * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n     * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n     * @param options\n     */\n    constructor(data = defaultByteLength, options = {}) {\n        let dataIsGiven = false;\n        if (typeof data === 'number') {\n            data = new ArrayBuffer(data);\n        }\n        else {\n            dataIsGiven = true;\n            this.lastWrittenByte = data.byteLength;\n        }\n        const offset = options.offset ? options.offset >>> 0 : 0;\n        const byteLength = data.byteLength - offset;\n        let dvOffset = offset;\n        if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n            if (data.byteLength !== data.buffer.byteLength) {\n                dvOffset = data.byteOffset + offset;\n            }\n            data = data.buffer;\n        }\n        if (dataIsGiven) {\n            this.lastWrittenByte = byteLength;\n        }\n        else {\n            this.lastWrittenByte = 0;\n        }\n        this.buffer = data;\n        this.length = byteLength;\n        this.byteLength = byteLength;\n        this.byteOffset = dvOffset;\n        this.offset = 0;\n        this.littleEndian = true;\n        this._data = new DataView(this.buffer, dvOffset, byteLength);\n        this._mark = 0;\n        this._marks = [];\n    }\n    /**\n     * Checks if the memory allocated to the buffer is sufficient to store more\n     * bytes after the offset.\n     * @param byteLength - The needed memory in bytes.\n     * @returns `true` if there is sufficient space and `false` otherwise.\n     */\n    available(byteLength = 1) {\n        return this.offset + byteLength <= this.length;\n    }\n    /**\n     * Check if little-endian mode is used for reading and writing multi-byte\n     * values.\n     * @returns `true` if little-endian mode is used, `false` otherwise.\n     */\n    isLittleEndian() {\n        return this.littleEndian;\n    }\n    /**\n     * Set little-endian mode for reading and writing multi-byte values.\n     */\n    setLittleEndian() {\n        this.littleEndian = true;\n        return this;\n    }\n    /**\n     * Check if big-endian mode is used for reading and writing multi-byte values.\n     * @returns `true` if big-endian mode is used, `false` otherwise.\n     */\n    isBigEndian() {\n        return !this.littleEndian;\n    }\n    /**\n     * Switches to big-endian mode for reading and writing multi-byte values.\n     */\n    setBigEndian() {\n        this.littleEndian = false;\n        return this;\n    }\n    /**\n     * Move the pointer n bytes forward.\n     * @param n - Number of bytes to skip.\n     */\n    skip(n = 1) {\n        this.offset += n;\n        return this;\n    }\n    /**\n     * Move the pointer to the given offset.\n     * @param offset\n     */\n    seek(offset) {\n        this.offset = offset;\n        return this;\n    }\n    /**\n     * Store the current pointer offset.\n     * @see {@link IOBuffer#reset}\n     */\n    mark() {\n        this._mark = this.offset;\n        return this;\n    }\n    /**\n     * Move the pointer back to the last pointer offset set by mark.\n     * @see {@link IOBuffer#mark}\n     */\n    reset() {\n        this.offset = this._mark;\n        return this;\n    }\n    /**\n     * Push the current pointer offset to the mark stack.\n     * @see {@link IOBuffer#popMark}\n     */\n    pushMark() {\n        this._marks.push(this.offset);\n        return this;\n    }\n    /**\n     * Pop the last pointer offset from the mark stack, and set the current\n     * pointer offset to the popped value.\n     * @see {@link IOBuffer#pushMark}\n     */\n    popMark() {\n        const offset = this._marks.pop();\n        if (offset === undefined) {\n            throw new Error('Mark stack empty');\n        }\n        this.seek(offset);\n        return this;\n    }\n    /**\n     * Move the pointer offset back to 0.\n     */\n    rewind() {\n        this.offset = 0;\n        return this;\n    }\n    /**\n     * Make sure the buffer has sufficient memory to write a given byteLength at\n     * the current pointer offset.\n     * If the buffer's memory is insufficient, this method will create a new\n     * buffer (a copy) with a length that is twice (byteLength + current offset).\n     * @param byteLength\n     */\n    ensureAvailable(byteLength = 1) {\n        if (!this.available(byteLength)) {\n            const lengthNeeded = this.offset + byteLength;\n            const newLength = lengthNeeded * 2;\n            const newArray = new Uint8Array(newLength);\n            newArray.set(new Uint8Array(this.buffer));\n            this.buffer = newArray.buffer;\n            this.length = this.byteLength = newLength;\n            this._data = new DataView(this.buffer);\n        }\n        return this;\n    }\n    /**\n     * Read a byte and return false if the byte's value is 0, or true otherwise.\n     * Moves pointer forward by one byte.\n     */\n    readBoolean() {\n        return this.readUint8() !== 0;\n    }\n    /**\n     * Read a signed 8-bit integer and move pointer forward by 1 byte.\n     */\n    readInt8() {\n        return this._data.getInt8(this.offset++);\n    }\n    /**\n     * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n     */\n    readUint8() {\n        return this._data.getUint8(this.offset++);\n    }\n    /**\n     * Alias for {@link IOBuffer#readUint8}.\n     */\n    readByte() {\n        return this.readUint8();\n    }\n    /**\n     * Read `n` bytes and move pointer forward by `n` bytes.\n     */\n    readBytes(n = 1) {\n        const bytes = new Uint8Array(n);\n        for (let i = 0; i < n; i++) {\n            bytes[i] = this.readByte();\n        }\n        return bytes;\n    }\n    /**\n     * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n     */\n    readInt16() {\n        const value = this._data.getInt16(this.offset, this.littleEndian);\n        this.offset += 2;\n        return value;\n    }\n    /**\n     * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n     */\n    readUint16() {\n        const value = this._data.getUint16(this.offset, this.littleEndian);\n        this.offset += 2;\n        return value;\n    }\n    /**\n     * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n     */\n    readInt32() {\n        const value = this._data.getInt32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n    /**\n     * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n     */\n    readUint32() {\n        const value = this._data.getUint32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n    /**\n     * Read a 32-bit floating number and move pointer forward by 4 bytes.\n     */\n    readFloat32() {\n        const value = this._data.getFloat32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n    /**\n     * Read a 64-bit floating number and move pointer forward by 8 bytes.\n     */\n    readFloat64() {\n        const value = this._data.getFloat64(this.offset, this.littleEndian);\n        this.offset += 8;\n        return value;\n    }\n    /**\n     * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n     */\n    readChar() {\n        return String.fromCharCode(this.readInt8());\n    }\n    /**\n     * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n     */\n    readChars(n = 1) {\n        let result = '';\n        for (let i = 0; i < n; i++) {\n            result += this.readChar();\n        }\n        return result;\n    }\n    /**\n     * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n     * forward by `n` bytes.\n     */\n    readUtf8(n = 1) {\n        const bString = this.readChars(n);\n        return decode(bString);\n    }\n    /**\n     * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n     * forward by 1 byte.\n     */\n    writeBoolean(value) {\n        this.writeUint8(value ? 0xff : 0x00);\n        return this;\n    }\n    /**\n     * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n     */\n    writeInt8(value) {\n        this.ensureAvailable(1);\n        this._data.setInt8(this.offset++, value);\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n     * byte.\n     */\n    writeUint8(value) {\n        this.ensureAvailable(1);\n        this._data.setUint8(this.offset++, value);\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * An alias for {@link IOBuffer#writeUint8}.\n     */\n    writeByte(value) {\n        return this.writeUint8(value);\n    }\n    /**\n     * Write all elements of `bytes` as uint8 values and move pointer forward by\n     * `bytes.length` bytes.\n     */\n    writeBytes(bytes) {\n        this.ensureAvailable(bytes.length);\n        for (let i = 0; i < bytes.length; i++) {\n            this._data.setUint8(this.offset++, bytes[i]);\n        }\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 16-bit signed integer and move pointer forward by 2\n     * bytes.\n     */\n    writeInt16(value) {\n        this.ensureAvailable(2);\n        this._data.setInt16(this.offset, value, this.littleEndian);\n        this.offset += 2;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n     * bytes.\n     */\n    writeUint16(value) {\n        this.ensureAvailable(2);\n        this._data.setUint16(this.offset, value, this.littleEndian);\n        this.offset += 2;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 32-bit signed integer and move pointer forward by 4\n     * bytes.\n     */\n    writeInt32(value) {\n        this.ensureAvailable(4);\n        this._data.setInt32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n     * bytes.\n     */\n    writeUint32(value) {\n        this.ensureAvailable(4);\n        this._data.setUint32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 32-bit floating number and move pointer forward by 4\n     * bytes.\n     */\n    writeFloat32(value) {\n        this.ensureAvailable(4);\n        this._data.setFloat32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write `value` as a 64-bit floating number and move pointer forward by 8\n     * bytes.\n     */\n    writeFloat64(value) {\n        this.ensureAvailable(8);\n        this._data.setFloat64(this.offset, value, this.littleEndian);\n        this.offset += 8;\n        this._updateLastWrittenByte();\n        return this;\n    }\n    /**\n     * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n     * and move pointer forward by 1 byte.\n     */\n    writeChar(str) {\n        return this.writeUint8(str.charCodeAt(0));\n    }\n    /**\n     * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n     * and move pointer forward by `str.length` bytes.\n     */\n    writeChars(str) {\n        for (let i = 0; i < str.length; i++) {\n            this.writeUint8(str.charCodeAt(i));\n        }\n        return this;\n    }\n    /**\n     * UTF-8 encode and write `str` to the current pointer offset and move pointer\n     * forward according to the encoded length.\n     */\n    writeUtf8(str) {\n        const bString = encode(str);\n        return this.writeChars(bString);\n    }\n    /**\n     * Export a Uint8Array view of the internal buffer.\n     * The view starts at the byte offset and its length\n     * is calculated to stop at the last written byte or the original length.\n     */\n    toArray() {\n        return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n    }\n    /**\n     * Update the last written byte offset\n     * @private\n     */\n    _updateLastWrittenByte() {\n        if (this.offset > this.lastWrittenByte) {\n            this.lastWrittenByte = this.offset;\n        }\n    }\n}\n//# sourceMappingURL=IOBuffer.js.map","'use strict';\n\n/**\n * Throws a non-valid NetCDF exception if the statement it's true\n * @ignore\n * @param {boolean} statement - Throws if true\n * @param {string} reason - Reason to throw\n */\nfunction notNetcdf(statement, reason) {\n  if (statement) {\n    throw new TypeError(`Not a valid NetCDF v3.x file: ${reason}`);\n  }\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction padding(buffer) {\n  if ((buffer.offset % 4) !== 0) {\n    buffer.skip(4 - (buffer.offset % 4));\n  }\n}\n\n\n/**\n * Reads the name\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {string} - Name\n */\nfunction readName(buffer) {\n  // Read name\n  var nameLength = buffer.readUint32();\n  var name = buffer.readChars(nameLength);\n\n  // validate name\n  // TODO\n\n  // Apply padding\n  padding(buffer);\n  return name;\n}\n\nmodule.exports.notNetcdf = notNetcdf;\nmodule.exports.padding = padding;\nmodule.exports.readName = readName;\n","'use strict';\n\nconst notNetcdf = require('./utils').notNetcdf;\n\nconst types = {\n  BYTE: 1,\n  CHAR: 2,\n  SHORT: 3,\n  INT: 4,\n  FLOAT: 5,\n  DOUBLE: 6\n};\n\n/**\n * Parse a number into their respective type\n * @ignore\n * @param {number} type - integer that represents the type\n * @return {string} - parsed value of the type\n */\nfunction num2str(type) {\n  switch (Number(type)) {\n    case types.BYTE:\n      return 'byte';\n    case types.CHAR:\n      return 'char';\n    case types.SHORT:\n      return 'short';\n    case types.INT:\n      return 'int';\n    case types.FLOAT:\n      return 'float';\n    case types.DOUBLE:\n      return 'double';\n      /* istanbul ignore next */\n    default:\n      return 'undefined';\n  }\n}\n\n/**\n * Parse a number type identifier to his size in bytes\n * @ignore\n * @param {number} type - integer that represents the type\n * @return {number} -size of the type\n */\nfunction num2bytes(type) {\n  switch (Number(type)) {\n    case types.BYTE:\n      return 1;\n    case types.CHAR:\n      return 1;\n    case types.SHORT:\n      return 2;\n    case types.INT:\n      return 4;\n    case types.FLOAT:\n      return 4;\n    case types.DOUBLE:\n      return 8;\n      /* istanbul ignore next */\n    default:\n      return -1;\n  }\n}\n\n/**\n * Reverse search of num2str\n * @ignore\n * @param {string} type - string that represents the type\n * @return {number} - parsed value of the type\n */\nfunction str2num(type) {\n  switch (String(type)) {\n    case 'byte':\n      return types.BYTE;\n    case 'char':\n      return types.CHAR;\n    case 'short':\n      return types.SHORT;\n    case 'int':\n      return types.INT;\n    case 'float':\n      return types.FLOAT;\n    case 'double':\n      return types.DOUBLE;\n      /* istanbul ignore next */\n    default:\n      return -1;\n  }\n}\n\n/**\n * Auxiliary function to read numeric data\n * @ignore\n * @param {number} size - Size of the element to read\n * @param {function} bufferReader - Function to read next value\n * @return {Array<number>|number}\n */\nfunction readNumber(size, bufferReader) {\n  if (size !== 1) {\n    var numbers = new Array(size);\n    for (var i = 0; i < size; i++) {\n      numbers[i] = bufferReader();\n    }\n    return numbers;\n  } else {\n    return bufferReader();\n  }\n}\n\n/**\n * Given a type and a size reads the next element\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {number} type - Type of the data to read\n * @param {number} size - Size of the element to read\n * @return {string|Array<number>|number}\n */\nfunction readType(buffer, type, size) {\n  switch (type) {\n    case types.BYTE:\n      return buffer.readBytes(size);\n    case types.CHAR:\n      return trimNull(buffer.readChars(size));\n    case types.SHORT:\n      return readNumber(size, buffer.readInt16.bind(buffer));\n    case types.INT:\n      return readNumber(size, buffer.readInt32.bind(buffer));\n    case types.FLOAT:\n      return readNumber(size, buffer.readFloat32.bind(buffer));\n    case types.DOUBLE:\n      return readNumber(size, buffer.readFloat64.bind(buffer));\n      /* istanbul ignore next */\n    default:\n      notNetcdf(true, `non valid type ${type}`);\n      return undefined;\n  }\n}\n\n/**\n * Removes null terminate value\n * @ignore\n * @param {string} value - String to trim\n * @return {string} - Trimmed string\n */\nfunction trimNull(value) {\n  if (value.charCodeAt(value.length - 1) === 0) {\n    return value.substring(0, value.length - 1);\n  }\n  return value;\n}\n\nmodule.exports = types;\nmodule.exports.num2str = num2str;\nmodule.exports.num2bytes = num2bytes;\nmodule.exports.str2num = str2num;\nmodule.exports.readType = readType;\n","'use strict';\n\nconst types = require('./types');\n\n// const STREAMING = 4294967295;\n\n/**\n * Read data for the given non-record variable\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {object} variable - Variable metadata\n * @return {Array} - Data of the element\n */\nfunction nonRecord(buffer, variable) {\n  // variable type\n  const type = types.str2num(variable.type);\n\n  // size of the data\n  var size = variable.size / types.num2bytes(type);\n\n  // iterates over the data\n  var data = new Array(size);\n  for (var i = 0; i < size; i++) {\n    data[i] = types.readType(buffer, type, 1);\n  }\n\n  return data;\n}\n\n/**\n * Read data for the given record variable\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {object} variable - Variable metadata\n * @param {object} recordDimension - Record dimension metadata\n * @return {Array} - Data of the element\n */\nfunction record(buffer, variable, recordDimension) {\n  // variable type\n  const type = types.str2num(variable.type);\n  const width = variable.size ? variable.size / types.num2bytes(type) : 1;\n\n  // size of the data\n  // TODO streaming data\n  var size = recordDimension.length;\n\n  // iterates over the data\n  var data = new Array(size);\n  const step = recordDimension.recordStep;\n\n  for (var i = 0; i < size; i++) {\n    var currentOffset = buffer.offset;\n    data[i] = types.readType(buffer, type, width);\n    buffer.seek(currentOffset + step);\n  }\n\n  return data;\n}\n\nmodule.exports.nonRecord = nonRecord;\nmodule.exports.record = record;\n","'use strict';\n\nconst utils = require('./utils');\nconst types = require('./types');\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\n/**\n * Read the header of the file\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {number} version - Version of the file\n * @return {object} - Object with the fields:\n *  * `recordDimension`: Number with the length of record dimension\n *  * `dimensions`: List of dimensions\n *  * `globalAttributes`: List of global attributes\n *  * `variables`: List of variables\n */\nfunction header(buffer, version) {\n  // Length of record dimension\n  // sum of the varSize's of all the record variables.\n  var header = { recordDimension: { length: buffer.readUint32() } };\n\n  // Version\n  header.version = version;\n\n  // List of dimensions\n  var dimList = dimensionsList(buffer);\n  header.recordDimension.id = dimList.recordId; // id of the unlimited dimension\n  header.recordDimension.name = dimList.recordName; // name of the unlimited dimension\n  header.dimensions = dimList.dimensions;\n\n  // List of global attributes\n  header.globalAttributes = attributesList(buffer);\n\n  // List of variables\n  var variables = variablesList(buffer, dimList.recordId, version);\n  header.variables = variables.variables;\n  header.recordDimension.recordStep = variables.recordStep;\n\n  return header;\n}\n\nconst NC_UNLIMITED = 0;\n\n/**\n * List of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {object} - Ojbect containing the following properties:\n *  * `dimensions` that is an array of dimension object:\n  *  * `name`: String with the name of the dimension\n  *  * `size`: Number with the size of the dimension dimensions: dimensions\n *  * `recordId`: the id of the dimension that has unlimited size or undefined,\n *  * `recordName`: name of the dimension that has unlimited size\n */\nfunction dimensionsList(buffer) {\n  var recordId, recordName;\n  const dimList = buffer.readUint32();\n  if (dimList === ZERO) {\n    utils.notNetcdf((buffer.readUint32() !== ZERO), 'wrong empty tag for list of dimensions');\n    return [];\n  } else {\n    utils.notNetcdf((dimList !== NC_DIMENSION), 'wrong tag for list of dimensions');\n\n    // Length of dimensions\n    const dimensionSize = buffer.readUint32();\n    var dimensions = new Array(dimensionSize);\n    for (var dim = 0; dim < dimensionSize; dim++) {\n      // Read name\n      var name = utils.readName(buffer);\n\n      // Read dimension size\n      const size = buffer.readUint32();\n      if (size === NC_UNLIMITED) { // in netcdf 3 one field can be of size unlimmited\n        recordId = dim;\n        recordName = name;\n      }\n\n      dimensions[dim] = {\n        name: name,\n        size: size\n      };\n    }\n  }\n  return {\n    dimensions: dimensions,\n    recordId: recordId,\n    recordName: recordName\n  };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {Array<object>} - List of attributes with:\n *  * `name`: String with the name of the attribute\n *  * `type`: String with the type of the attribute\n *  * `value`: A number or string with the value of the attribute\n */\nfunction attributesList(buffer) {\n  const gAttList = buffer.readUint32();\n  if (gAttList === ZERO) {\n    utils.notNetcdf((buffer.readUint32() !== ZERO), 'wrong empty tag for list of attributes');\n    return [];\n  } else {\n    utils.notNetcdf((gAttList !== NC_ATTRIBUTE), 'wrong tag for list of attributes');\n\n    // Length of attributes\n    const attributeSize = buffer.readUint32();\n    var attributes = new Array(attributeSize);\n    for (var gAtt = 0; gAtt < attributeSize; gAtt++) {\n      // Read name\n      var name = utils.readName(buffer);\n\n      // Read type\n      var type = buffer.readUint32();\n      utils.notNetcdf(((type < 1) || (type > 6)), `non valid type ${type}`);\n\n      // Read attribute\n      var size = buffer.readUint32();\n      var value = types.readType(buffer, type, size);\n\n      // Apply padding\n      utils.padding(buffer);\n\n      attributes[gAtt] = {\n        name: name,\n        type: types.num2str(type),\n        value: value\n      };\n    }\n  }\n  return attributes;\n}\n\n/**\n * List of variables\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {number} recordId - Id of the unlimited dimension (also called record dimension)\n *                            This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n * @return {object} - Number of recordStep and list of variables with:\n *  * `name`: String with the name of the variable\n *  * `dimensions`: Array with the dimension IDs of the variable\n *  * `attributes`: Array with the attributes of the variable\n *  * `type`: String with the type of the variable\n *  * `size`: Number with the size of the variable\n *  * `offset`: Number with the offset where of the variable begins\n *  * `record`: True if is a record variable, false otherwise (unlimited size)\n */\n\nfunction variablesList(buffer, recordId, version) {\n  const varList = buffer.readUint32();\n  var recordStep = 0;\n  if (varList === ZERO) {\n    utils.notNetcdf((buffer.readUint32() !== ZERO), 'wrong empty tag for list of variables');\n    return [];\n  } else {\n    utils.notNetcdf((varList !== NC_VARIABLE), 'wrong tag for list of variables');\n\n    // Length of variables\n    const variableSize = buffer.readUint32();\n    var variables = new Array(variableSize);\n    for (var v = 0; v < variableSize; v++) {\n      // Read name\n      var name = utils.readName(buffer);\n\n      // Read dimensionality of the variable\n      const dimensionality = buffer.readUint32();\n\n      // Index into the list of dimensions\n      var dimensionsIds = new Array(dimensionality);\n      for (var dim = 0; dim < dimensionality; dim++) {\n        dimensionsIds[dim] = buffer.readUint32();\n      }\n\n      // Read variables size\n      var attributes = attributesList(buffer);\n\n      // Read type\n      var type = buffer.readUint32();\n      utils.notNetcdf(((type < 1) && (type > 6)), `non valid type ${type}`);\n\n      // Read variable size\n      // The 32-bit varSize field is not large enough to contain the size of variables that require\n      // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n      const varSize = buffer.readUint32();\n\n      // Read offset\n      var offset = buffer.readUint32();\n      if (version === 2) {\n        utils.notNetcdf((offset > 0), 'offsets larger than 4GB not supported');\n        offset = buffer.readUint32();\n      }\n\n      let record = false;\n      // Count amount of record variables\n      if ((typeof recordId !== 'undefined') && (dimensionsIds[0] === recordId)) {\n        recordStep += varSize;\n        record = true;\n      }\n      variables[v] = {\n        name: name,\n        dimensions: dimensionsIds,\n        attributes,\n        type: types.num2str(type),\n        size: varSize,\n        offset,\n        record\n      };\n    }\n  }\n\n  return {\n    variables: variables,\n    recordStep: recordStep\n  };\n}\n\nmodule.exports = header;\n","'use strict';\n\nfunction toString() {\n  let result = [];\n\n  result.push('DIMENSIONS');\n  for (let dimension of this.dimensions) {\n    result.push(`  ${dimension.name.padEnd(30)} = size: ${dimension.size}`);\n  }\n\n  result.push('');\n  result.push('GLOBAL ATTRIBUTES');\n  for (let attribute of this.globalAttributes) {\n    result.push(`  ${attribute.name.padEnd(30)} = ${attribute.value}`);\n  }\n\n  let variables = JSON.parse(JSON.stringify(this.variables));\n  result.push('');\n  result.push('VARIABLES:');\n  for (let variable of variables) {\n    variable.value = this.getDataVariable(variable);\n    let stringify = JSON.stringify(variable.value);\n    if (stringify.length > 50) stringify = stringify.substring(0, 50);\n    if (!isNaN(variable.value.length)) {\n      stringify += ` (length: ${variable.value.length})`;\n    }\n    result.push(`  ${variable.name.padEnd(30)} = ${stringify}`);\n  }\n  return result.join('\\n');\n}\n\nmodule.exports = toString;\n","'use strict';\n\nconst { IOBuffer } = require('iobuffer');\n\nconst utils = require('./utils');\nconst data = require('./data');\nconst readHeader = require('./header');\nconst toString = require('./toString');\n\n/**\n * Reads a NetCDF v3.x file\n * https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @constructor\n */\nclass NetCDFReader {\n  constructor(data) {\n    const buffer = new IOBuffer(data);\n    buffer.setBigEndian();\n\n    // Validate that it's a NetCDF file\n    utils.notNetcdf(buffer.readChars(3) !== 'CDF', 'should start with CDF');\n\n    // Check the NetCDF format\n    const version = buffer.readByte();\n    utils.notNetcdf(version > 2, 'unknown version');\n\n    // Read the header\n    this.header = readHeader(buffer, version);\n    this.buffer = buffer;\n  }\n\n  /**\n   * @return {string} - Version for the NetCDF format\n   */\n  get version() {\n    if (this.header.version === 1) {\n      return 'classic format';\n    } else {\n      return '64-bit offset format';\n    }\n  }\n\n  /**\n   * @return {object} - Metadata for the record dimension\n   *  * `length`: Number of elements in the record dimension\n   *  * `id`: Id number in the list of dimensions for the record dimension\n   *  * `name`: String with the name of the record dimension\n   *  * `recordStep`: Number with the record variables step size\n   */\n  get recordDimension() {\n    return this.header.recordDimension;\n  }\n\n  /**\n   * @return {Array<object>} - List of dimensions with:\n   *  * `name`: String with the name of the dimension\n   *  * `size`: Number with the size of the dimension\n   */\n  get dimensions() {\n    return this.header.dimensions;\n  }\n\n  /**\n   * @return {Array<object>} - List of global attributes with:\n   *  * `name`: String with the name of the attribute\n   *  * `type`: String with the type of the attribute\n   *  * `value`: A number or string with the value of the attribute\n   */\n  get globalAttributes() {\n    return this.header.globalAttributes;\n  }\n\n  /**\n   * Returns the value of an attribute\n   * @param {string} attributeName\n   * @return {string} Value of the attributeName or null\n   */\n  getAttribute(attributeName) {\n    const attribute = this.globalAttributes.find(\n      (val) => val.name === attributeName\n    );\n    if (attribute) return attribute.value;\n    return null;\n  }\n\n  /**\n   * Returns the value of a variable as a string\n   * @param {string} variableName\n   * @return {string} Value of the variable as a string or null\n   */\n  getDataVariableAsString(variableName) {\n    const variable = this.getDataVariable(variableName);\n    if (variable) return variable.join('');\n    return null;\n  }\n\n  /**\n   * @return {Array<object>} - List of variables with:\n   *  * `name`: String with the name of the variable\n   *  * `dimensions`: Array with the dimension IDs of the variable\n   *  * `attributes`: Array with the attributes of the variable\n   *  * `type`: String with the type of the variable\n   *  * `size`: Number with the size of the variable\n   *  * `offset`: Number with the offset where of the variable begins\n   *  * `record`: True if is a record variable, false otherwise\n   */\n  get variables() {\n    return this.header.variables;\n  }\n\n  toString() {\n    return toString.call(this);\n  }\n\n  /**\n   * Retrieves the data for a given variable\n   * @param {string|object} variableName - Name of the variable to search or variable object\n   * @return {Array} - List with the variable values\n   */\n  getDataVariable(variableName) {\n    let variable;\n    if (typeof variableName === 'string') {\n      // search the variable\n      variable = this.header.variables.find(function (val) {\n        return val.name === variableName;\n      });\n    } else {\n      variable = variableName;\n    }\n\n    // throws if variable not found\n    utils.notNetcdf(\n      variable === undefined,\n      `variable not found: ${variableName}`\n    );\n\n    // go to the offset position\n    this.buffer.seek(variable.offset);\n\n    if (variable.record) {\n      // record variable case\n      return data.record(this.buffer, variable, this.header.recordDimension);\n    } else {\n      // non-record variable case\n      return data.nonRecord(this.buffer, variable);\n    }\n  }\n\n  /**\n   * Check if a dataVariable exists\n   * @param {string} variableName - Name of the variable to find\n   * @return {boolean}\n   */\n  dataVariableExists(variableName) {\n    const variable = this.header.variables.find(function (val) {\n      return val.name === variableName;\n    });\n    return variable !== undefined;\n  }\n\n  /**\n   * Check if an attribute exists\n   * @param {string} attributeName - Name of the attribute to find\n   * @return {boolean}\n   */\n  attributeExists(attributeName) {\n    const attribute = this.globalAttributes.find(\n      (val) => val.name === attributeName\n    );\n    return attribute !== undefined;\n  }\n}\n\nmodule.exports = NetCDFReader;\n","'use strict';\n\n/* reader.toString() provides the following information\n    GLOBAL ATTRIBUTES\n      dataset_completeness           = C1+C2\n      ms_template_revision           = 1.0.1\n      netcdf_revision                = 2.3.2\n      languages                      = English\n      administrative_comments        = 1% CH2Cl2\n      dataset_origin                 = Santa Clara, CA\n      netcdf_file_date_time_stamp    = 20161012052159+0200\n      experiment_title               = P071 Essence super BP\n      experiment_date_time_stamp     = 20070923040800+0200\n      operator_name                  = SC\n      external_file_ref_0            = FIRE_RTL.M\n      experiment_type                = Centroided Mass Spectrum\n      number_of_times_processed      = 1\n      number_of_times_calibrated     = 0\n      sample_state                   = Other State\n      test_separation_type           = No Chromatography\n      test_ms_inlet                  = Capillary Direct\n      test_ionization_mode           = Electron Impact\n      test_ionization_polarity       = Positive Polarity\n      test_detector_type             = Electron Multiplier\n      test_resolution_type           = Constant Resolution\n      test_scan_function             = Mass Scan\n      test_scan_direction            = Up\n      test_scan_law                  = Linear\n      raw_data_mass_format           = Float\n      raw_data_time_format           = Short\n      raw_data_intensity_format      = Float\n\n    VARIABLES:\n      error_log                      = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 64)\n      a_d_sampling_rate              = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6401)\n      a_d_coaddition_factor          = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6402)\n      scan_acquisition_time          = [5.25,5.84,6.428999999999999,7.019,7.609,8.199,8.7 (length: 6401)\n      scan_duration                  = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6401)\n      inter_scan_time                = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6401)\n      resolution                     = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6401)\n      actual_scan_number             = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 (length: 6401)\n      total_intensity                = [3134,3157,3085,3134,3093,3113,3061,3057,3030,3166 (length: 6401)\n      mass_range_min                 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 6401)\n      mass_range_max                 = [206.89999389648438,206.89999389648438,207,207.100 (length: 6401)\n      time_range_min                 = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6401)\n      time_range_max                 = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 6401)\n      scan_index                     = [0,11,22,33,44,55,66,76,88,99,111,122,134,145,156, (length: 6401)\n      point_count                    = [11,11,11,11,11,11,10,12,11,12,11,12,11,11,11,11,1 (length: 6401)\n      flag_count                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 6401)\n      mass_values                    = [16,17,18.100000381469727,28,32,35,36,38,40,44.099 (length: 157201)\n      time_values                    = [9.969209968386869e+36,9.969209968386869e+36,9.969 (length: 157201)\n      intensity_values               = [37,293,1243,737,420,45,196,72,22,35,34,28,299,123 (length: 157201)\n      instrument_name                = [\"G\",\"a\",\"s\",\" \",\"C\",\"h\",\"r\",\"o\",\"m\",\"a\",\"t\",\"o\",\" (length: 32)\n      instrument_id                  = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_mfr                 = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_model               = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_serial_no           = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_sw_version          = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_fw_version          = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_os_version          = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_app_version         = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_comments            = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n*/\n\nfunction agilentGCMS(reader) {\n  const time = reader.getDataVariable('scan_acquisition_time');\n  const tic = reader.getDataVariable('total_intensity');\n\n  // variables to get the mass-intensity values\n  const pointCount = reader.getDataVariable('point_count');\n  const massValues = reader.getDataVariable('mass_values');\n  const intensityValues = reader.getDataVariable('intensity_values');\n\n  let ms = new Array(pointCount.length);\n  let index = 0;\n  for (let i = 0; i < ms.length; i++) {\n    let size = pointCount[i];\n    ms[i] = [new Array(size), new Array(size)];\n\n    for (let j = 0; j < size; j++) {\n      ms[i][0][j] = massValues[index];\n      ms[i][1][j] = intensityValues[index++];\n    }\n  }\n\n  return {\n    times: time,\n    series: [\n      {\n        name: 'tic',\n        dimension: 1,\n        data: tic,\n      },\n      {\n        name: 'ms',\n        dimension: 2,\n        data: ms,\n      },\n    ],\n  };\n}\n\nmodule.exports = agilentGCMS;\n","'use strict';\n\n/* reader.toString() provides the following information\n    GLOBAL ATTRIBUTES\n      dataset_completeness           = C1+C2\n      ms_template_revision           = 1.0.1\n      netcdf_revision                = 2.3.2\n      languages                      = English\n      netcdf_file_date_time_stamp    = 20170428032023+0000\n      experiment_title               = MS51762A16\n    11829FC03_3__60_40\n      experiment_date_time_stamp     = 20160930202145-0001\n      operator_name                  = Begemann/Eikenberg/Roettger\n      pre_experiment_program_name    = otofControl 3.4.16.0\n      post_experiment_program_name   = Bruker Compass DataAnalysis 4.2\n      source_file_reference          = X:\\2016\\MS5\\1700\\MS51762A16.d\n      source_file_format             = Bruker Daltonics Data File\n      experiment_type                = Centroided Mass Spectrum\n      sample_state                   = Other State\n      test_separation_type           = No Chromatography\n      test_ms_inlet                  = Direct Inlet Probe\n      test_ionization_mode           = Electrospray Ionization\n      test_ionization_polarity       = Positive Polarity\n      test_detector_type             = Electron Multiplier\n      test_resolution_type           = Proportional Resolution\n      test_scan_function             = Mass Scan\n      test_scan_direction            = Up\n      test_scan_law                  = Linear\n      raw_data_mass_format           = Double\n      raw_data_time_format           = Float\n      raw_data_intensity_format      = Float\n      units                          = Seconds\n      scale_factor                   = 1\n\n    VARIABLES:\n      error_log                      = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 64)\n      a_d_sampling_rate              = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 4513)\n      a_d_coaddition_factor          = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 4514)\n      scan_acquisition_time          = [0.329,0.73,1.132,1.534,1.936,2.337,2.739,3.14,3.5 (length: 4513)\n      scan_duration                  = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 4513)\n      inter_scan_time                = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 4513)\n      resolution                     = [106.6623112889557,110.7855343519544,104.407495112 (length: 4513)\n      actual_scan_number             = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34, (length: 4513)\n      total_intensity                = [5297.4945068359375,6172.123912811279,5934.7557412 (length: 4513)\n      mass_range_min                 = [49.99999997418507,49.99999997418507,49.9999999741 (length: 4513)\n      mass_range_max                 = [1599.9999564432276,1599.9999564432276,1599.999956 (length: 4513)\n      time_range_min                 = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 4513)\n      time_range_max                 = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 4513)\n      scan_index                     = [0,60,128,195,265,324,399,472,542,596,671,738,803, (length: 4513)\n      point_count                    = [60,68,67,70,59,75,73,70,54,75,67,65,64,73,56,69,6 (length: 4513)\n      flag_count                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 4513)\n      mass_values                    = [51.53516375878996,95.32974890044508,106.334477231 (length: 1176507)\n      intensity_values               = [76.99999237060547,80,90,78.99799346923828,80.9352 (length: 1176507)\n      instrument_name                = [\"m\",\"i\",\"c\",\"r\",\"O\",\"T\",\"O\",\"F\",\"\",\" \",\" \",\" \",\"  (length: 32)\n      instrument_id                  = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_mfr                 = [\"B\",\"r\",\"u\",\"k\",\"e\",\"r\",\" \",\"D\",\"a\",\"l\",\"t\",\"o\",\" (length: 32)\n      instrument_model               = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_serial_no           = [\"2\",\"1\",\"3\",\"7\",\"5\",\"0\",\".\",\"1\",\"0\",\"3\",\"5\",\"9\",\" (length: 32)\n      instrument_sw_version          = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_fw_version          = [\"\",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\"  (length: 32)\n      instrument_os_version          = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_app_version         = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_comments            = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n*/\n\nfunction finniganGCMS(reader) {\n  const time = reader.getDataVariable('scan_acquisition_time');\n  const tic = reader.getDataVariable('total_intensity');\n\n  // variables to get the mass-intensity values\n  let scanIndex = reader.getDataVariable('scan_index');\n  const massValues = reader.getDataVariable('mass_values');\n  const intensityValues = reader.getDataVariable('intensity_values');\n  scanIndex.push(massValues.length);\n\n  let ms = new Array(time.length);\n  let index = 0;\n  for (let i = 0; i < ms.length; i++) {\n    let size = scanIndex[i + 1] - scanIndex[i];\n    ms[i] = [new Array(size), new Array(size)];\n\n    for (let j = 0; j < size; j++) {\n      ms[i][0][j] = massValues[index];\n      ms[i][1][j] = intensityValues[index++];\n    }\n  }\n\n  return {\n    times: time,\n    series: [\n      {\n        name: 'tic',\n        dimension: 1,\n        data: tic,\n      },\n      {\n        name: 'ms',\n        dimension: 2,\n        data: ms,\n      },\n    ],\n  };\n}\n\nmodule.exports = finniganGCMS;\n","'use strict';\n\n/* reader.toString() provides the following information\n    GLOBAL ATTRIBUTES\n      dataset_completeness           = C1+C2\n      aia_template_revision          = 1.0\n      netcdf_revision                = 2.3\n      languages                      = English only\n      injection_date_time_stamp      = 20181030174305+0000\n      HP_injection_time              = 30-Oct-18, 17:43:05\n      experiment_title               = SequenceLine: 1  Inj: 1\n      operator_name                  = SYSTEM\n      separation_experiment_type     = liquid chromatography\n      source_file_reference          = C:\\CHEM32\\1\\DATA\\MINGMING\\MW-1-MEO-I IC-90 2018-10-30 17-42-13\\MW-2-6-6 IC 90.D\n      sample_name                    = MW-2-6-6 IC 90\n      sample_id                      =\n      detector_unit                  = mAU\n      detection_method_name          = POS 3 IC 90-10 31 MIN.M\n      detector_name                  = DAD1 A, Sig=254,4 Ref=360,100\n      retention_unit                 = seconds\n\n   VARIABLES:\n      detector_maximum_value         = [130.9263458251953] (length: 1)\n      detector_minimum_value         = [-0.1758841574192047] (length: 1)\n      actual_run_time_length         = [1860] (length: 1)\n      actual_delay_time              = [0.012000000104308128] (length: 1)\n      actual_sampling_interval       = [0.4000000059604645] (length: 1)\n      ordinate_values                = [-0.07588416337966919,-0.07525086402893066,-0.0740 (length: 4651)\n      peak_retention_time            = [196.0651397705078,332.5663757324219,527.549865722 (length: 8)\n      peak_start_time                = [186.81199645996094,239.21200561523438,502.4119873 (length: 8)\n      peak_end_time                  = [220.81201171875,471.5176696777344,572.47869873046 (length: 8)\n      peak_width                     = [4.974428176879883,62.90694808959961,11.9328641891 (length: 8)\n      peak_area                      = [556.7650146484375,419.825439453125,66.56610107421 (length: 8)\n      peak_area_percent              = [7.0321502685546875,5.302552223205566,0.8407546877 (length: 8)\n      peak_height                    = [100.07515716552734,5.1860527992248535,4.827196121 (length: 8)\n      peak_height_percent            = [29.76352310180664,1.5423927307128906,1.4356645345 (length: 8)\n      peak_asymmetry                 = [1.4555920362472534,0.8351489901542664,1.707817316 (length: 8)\n      baseline_start_time            = [186.81199645996094,239.21200561523438,502.4119873 (length: 8)\n      baseline_start_value           = [1.9561424255371094,0.9857341647148132,1.127734780 (length: 8)\n      baseline_stop_time             = [220.81201171875,471.5176696777344,572.47869873046 (length: 8)\n      baseline_stop_value            = [1.1907591819763184,1.10896897315979,1.18347382545 (length: 8)\n      peak_start_detection_code      = [\"B\",\"\",\"B\",\"\",\"B\",\"\",\"B\",\"\",\"V\",\"\",\"B\",\"\",\"B\",\"\", (length: 16)\n      peak_stop_detection_code       = [\"B\",\"\",\"B\",\"\",\"B\",\"\",\"V\",\"\",\"B\",\"\",\"B\",\"\",\"B\",\"\", (length: 16)\n      migration_time                 = [196.0651397705078,332.5663757324219,527.549865722 (length: 8)\n      peak_area_square_root          = [23.595869064331055,20.489643096923828,8.158804893 (length: 8)\n      manually_reintegrated_peaks    = [0,0,0,0,0,0,0,0] (length: 8)\n*/\n\nfunction agilentHPLC(reader) {\n  const intensities = reader.getDataVariable('ordinate_values');\n  const numberPoints = intensities.length;\n  const detector = reader.getAttribute('detector_name');\n  let channel;\n  if (detector.match(/dad/i)) {\n    channel = `uv${Number(detector.replace(/.*Sig=([0-9]+).*/, '$1'))}`;\n  } else if (detector.match(/tic/i)) {\n    channel = 'tic';\n  } else {\n    channel = 'unknown';\n  }\n  const delayTime = reader.getDataVariable('actual_delay_time')[0];\n  const runtimeLength = reader.getDataVariable('actual_run_time_length')[0];\n  let samplingInterval;\n  if (reader.dataVariableExists('actual_sampling_interval')) {\n    samplingInterval = reader.getDataVariable('actual_sampling_interval')[0];\n\n    if (\n      Math.abs(delayTime + samplingInterval * numberPoints - runtimeLength) > 3\n    ) {\n      throw new Error(\n        'The expected last time does not correspond to the runtimeLength',\n      );\n    }\n  } else {\n    samplingInterval = (runtimeLength - delayTime) / numberPoints;\n  }\n\n  let times = [];\n  let time = delayTime;\n  for (let i = 0; i < numberPoints; i++) {\n    times.push(time);\n    time += samplingInterval;\n  }\n\n  return {\n    times,\n    series: [\n      {\n        name: channel,\n        dimension: 1,\n        data: intensities,\n      },\n    ],\n  };\n}\n\nmodule.exports = agilentHPLC;\n","'use strict';\n\n/* reader.toString() provides the following information\n    GLOBAL ATTRIBUTES\n      dataset_completeness           = C1+C2\n      ms_template_revision           = 1.0.1\n      administrative_comments        =\n      dataset_owner                  =\n      experiment_title               =\n      experiment_date_time_stamp     = 20150902041002+0100\n      netcdf_file_date_time_stamp    = 20151026063419+0000\n      experiment_type                = Centroided Mass Spectrum\n      netcdf_revision                = 2.3.2\n      operator_name                  = DSQ\n      source_file_reference          = G:\\FCO\\FCO_CIO\\K2\\MP2013\\T1 IL database 2013\\9. IL Data Entry\\12_HU_HIFS\\IL database\\RAW files\\Lukoil-Disel-150901.RAW\n      source_file_date_time_stamp    = 20150902041002+0100\n      source_file_format             = Finnigan\n      languages                      = English\n      external_file_ref_0            =\n      instrument_number              = 1\n      sample_prep_comments           =\n      sample_comments                = Lukoil Disel 0,5 % CS2 1 % inkt\n      test_separation_type           =\n      test_ms_inlet                  =\n      test_ionization_mode           =\n      test_ionization_polarity       = Positive Polarity\n      test_detector_type             = Conversion Dynode Electron Multiplier\n      test_scan_function             = Mass Scan\n      test_scan_direction            =\n      test_scan_law                  = Linear\n      number_of_scans                = 11832\n      raw_data_mass_format           = Double\n      raw_data_intensity_format      = Long\n      actual_run_time                = 3519.6410000000005\n      actual_delay_time              = 82.328\n      global_mass_min                = 0\n      global_mass_max                = 450\n      calibrated_mass_min            = 0\n      calibrated_mass_max            = 0\n      mass_axis_label                = M/Z\n      intensity_axis_label           = Abundance\n\n    VARIABLES:\n      error_log                      = [\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 64)\n      instrument_name                = [\"L\",\"C\",\"Q\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 32)\n      instrument_id                  = [\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 32)\n      instrument_mfr                 = [\"F\",\"i\",\"n\",\"n\",\"i\",\"g\",\"a\",\"n\",\"-\",\"M\",\"A\",\"T\",\" (length: 32)\n      instrument_model               = [\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 32)\n      instrument_sw_version          = [\"3\",\".\",\"1\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 32)\n      instrument_os_version          = [\"W\",\"i\",\"n\",\"d\",\"o\",\"w\",\"s\",\" \",\"V\",\"i\",\"s\",\"t\",\" (length: 32)\n      scan_index                     = [0,34,74,113,145,177,211,239,267,299,341,374,400,4 (length: 11832)\n      point_count                    = [34,40,39,32,32,34,28,28,32,42,33,26,29,34,31,28,2 (length: 11832)\n      flag_count                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 11832)\n      a_d_sampling_rate              = [1000,1000,1000,1000,1000,1000,1000,1000,1000,1000 (length: 11832)\n      scan_acquisition_time          = [82.328,82.625,82.76599999999999,83.063,83.188,83. (length: 11832)\n      scan_duration                  = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 11832)\n      mass_range_min                 = [35,16,35,16,35,16,35,16,35,16,35,16,35,16,35,16,3 (length: 11832)\n      mass_range_max                 = [450,150,450,150,450,150,450,150,450,150,450,150,4 (length: 11832)\n      scan_type                      = [65537,65537,65537,65537,65537,65537,65537,65537,6 (length: 11832)\n      resolution                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 11832)\n      total_intensity                = [375220,1054339,228245,576718,58280,288629,29815,1 (length: 11832)\n      mass_values                    = [36.3023681640625,36.98402404785156,38.08326721191 (length: 1366002)\n      intensity_values               = [335,287,331,266,2423,448,9009,833,261,661,4003,21 (length: 1366002)\n\n*/\n\nfunction finniganGCMS(reader) {\n  const time = reader.getDataVariable('scan_acquisition_time');\n  const tic = reader.getDataVariable('total_intensity');\n\n  // variables to get the mass-intensity values\n  let scanIndex = reader.getDataVariable('scan_index');\n  const massValues = reader.getDataVariable('mass_values');\n  const intensityValues = reader.getDataVariable('intensity_values');\n  scanIndex.push(massValues.length);\n\n  let ms = new Array(time.length);\n  let index = 0;\n  for (let i = 0; i < ms.length; i++) {\n    let size = scanIndex[i + 1] - scanIndex[i];\n    ms[i] = [new Array(size), new Array(size)];\n\n    for (let j = 0; j < size; j++) {\n      ms[i][0][j] = massValues[index];\n      ms[i][1][j] = intensityValues[index++];\n    }\n  }\n\n  return {\n    times: time,\n    series: [\n      {\n        name: 'tic',\n        dimension: 1,\n        data: tic,\n      },\n      {\n        name: 'ms',\n        dimension: 2,\n        data: ms,\n      },\n    ],\n  };\n}\n\nmodule.exports = finniganGCMS;\n","'use strict';\n\n/* reader.toString() provides the following information\n    GLOBAL ATTRIBUTES\n      dataset_completeness           = C1+C2\n      ms_template_revision           = 1.0.1\n      netcdf_revision                = 2.3.2\n      languages                      = English\n      administrative_comments        =\n      netcdf_file_date_time_stamp    = 20180913165502+0000\n      experiment_title               =\n      experiment_date_time_stamp     = 20180910165319+0000\n      operator_name                  = Admin\n      source_file_reference          = D:\\GCMSsolution\\Data\\Chromatograms\\Cato\\bormann_CB000_Test2.qgd\n      source_file_format             = Shimadzu GCMSsolution\n      source_file_date_time_stamp    = 20180910165319+0000\n      experiment_type                = Centroided Mass Spectrum\n      sample_internal_id             =\n      sample_comments                =\n      sample_state                   = Other State\n      test_separation_type           = Gas-Solid Chromatography\n      test_ms_inlet                  = Other Probe\n      test_ionization_mode           = Electron Impact\n      test_ionization_polarity       = Positive Polarity\n      test_electron_energy           = 70\n      test_detector_type             = Electron Multiplier\n      test_resolution_type           = Constant Resolution\n      test_scan_function             = Mass Scan\n      test_scan_direction            = Up\n      test_scan_law                  = Quadratic\n      test_scan_time                 = 0\n      raw_data_mass_format           = Double\n      raw_data_time_format           = Long\n      raw_data_intensity_format      = Long\n      units                          = Seconds\n      scale_factor                   = 1\n      long_name                      = Seconds\n      starting_scan_number           = 0\n      actual_run_time_length         = 1289\n      actual_delay_time              = 0\n      raw_data_uniform_sampling_flag = 1\n\n    VARIABLES:\n      error_log                      = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 64)\n      a_d_sampling_rate              = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      a_d_coaddition_factor          = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      scan_acquisition_time          = [144,144.3,144.6,144.9,145.2,145.5,145.8,146.1,146 (length: 3820)\n      scan_duration                  = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      inter_scan_time                = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      resolution                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      actual_scan_number             = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2 (length: 3820)\n      total_intensity                = [63566,61702,61873,59738,58321,59001,59364,59871,6 (length: 3820)\n      mass_range_min                 = [35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,3 (length: 3820)\n      mass_range_max                 = [500,500,500,500,500,500,500,500,500,500,500,500,5 (length: 3820)\n      time_range_min                 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      time_range_max                 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      scan_index                     = [0,466,932,1398,1863,2329,2795,3260,3726,4192,4658 (length: 3820)\n      point_count                    = [466,466,466,465,466,466,465,466,466,466,466,466,4 (length: 3820)\n      flag_count                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 3820)\n      mass_values                    = [35,36,37.1,38.1,39.1,40.15,41.1,42.1,43.15,44.1,4 (length: 1779397)\n      intensity_values               = [26,111,412,785,3098,485,5772,7391,11213,711,687,1 (length: 1779397)\n      instrument_name                = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_id                  = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n      instrument_mfr                 = [\"S\",\"h\",\"i\",\"m\",\"a\",\"d\",\"z\",\"u\",\" \",\"C\",\"o\",\"r\",\" (length: 32)\n      instrument_model               = [\"G\",\"C\",\"M\",\"S\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\", (length: 32)\n      instrument_serial_no           = [\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 32)\n      instrument_sw_version          = [\"4\",\".\",\"2\",\"0\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\", (length: 32)\n      instrument_fw_version          = [\"G\",\"C\",\"M\",\"S\",\"-\",\"Q\",\"P\",\"2\",\"0\",\"1\",\"0\",\"1\",\" (length: 32)\n      instrument_os_version          = [\"W\",\"i\",\"n\",\"d\",\"o\",\"w\",\"s\",\"\",\"\",\"\",\"\",\"\",\"\",\"\", (length: 32)\n      instrument_app_version         = [\"G\",\"C\",\"M\",\"S\",\"s\",\"o\",\"l\",\"u\",\"t\",\"i\",\"o\",\"n\",\" (length: 32)\n      instrument_comments            = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" (length: 32)\n*/\n\nfunction shimadzuGCMS(reader) {\n  const time = reader.getDataVariable('scan_acquisition_time');\n  const tic = reader.getDataVariable('total_intensity');\n\n  // variables to get the mass-intensity values\n  let scanIndex = reader.getDataVariable('scan_index');\n  const massValues = reader.getDataVariable('mass_values');\n  const intensityValues = reader.getDataVariable('intensity_values');\n  scanIndex.push(massValues.length);\n\n  let ms = new Array(time.length);\n  let index = 0;\n  for (let i = 0; i < ms.length; i++) {\n    let size = scanIndex[i + 1] - scanIndex[i];\n    ms[i] = [new Array(size), new Array(size)];\n\n    for (let j = 0; j < size; j++) {\n      ms[i][0][j] = massValues[index];\n      ms[i][1][j] = intensityValues[index++];\n    }\n  }\n\n  return {\n    times: time,\n    series: [\n      {\n        name: 'tic',\n        dimension: 1,\n        data: tic,\n      },\n      {\n        name: 'ms',\n        dimension: 2,\n        data: ms,\n      },\n    ],\n  };\n}\n\nmodule.exports = shimadzuGCMS;\n","'use strict';\n\n/* reader.toString() provides the following information\n    DIMENSIONS\n      point_number                   = size: 0\n      scan_number                    = size: 60\n      error_number                   = size: 1\n      _64_byte_string                = size: 64\n\n    GLOBAL ATTRIBUTES\n      dataset_completeness           = C1\n      ms_template_revision           = 1.0.1\n      netcdf_revision                = 4.2\n      languages                      = English\n      administrative_comments        =\n      netcdf_file_date_time_stamp    = 202003031432433600000\n      experiment_date_time_stamp     = 202003031432433600000\n      source_file_reference          = JC-012_cleavage test_Scan1_is1.datx 2020.03.03 14:32:43\n      source_file_format             = Advion ExpressIon Compact Mass Spectrometer Data System\n      source_file_date_time_stamp    = 202003031432433600000\n      experiment_title               =\n      experiment_type                = Continuum Mass Spectrum\n      test_ionization_mode           = Electrospray Ionization\n      test_ionization_polarity       = Positive Polarity\n      sample_state                   = Other State\n      test_separation_type           = No Chromatography\n      test_ms_inlet                  = Direct Inlet Probe\n      test_detector_type             = Electron Multiplier\n      test_resolution_type           = Constant Resolution\n      test_scan_function             = Mass Scan\n      test_scan_direction            = Up\n      test_scan_law                  = Linear\n      raw_data_mass_format           = Float\n      raw_data_time_format           = Double\n      raw_data_intensity_format      = Float\n      units                          = Seconds\n      global_mass_min                = 9.949999809265137\n      global_mass_max                = 1199.75\n      actual_run_time_length         = 133.46099853515625\n      starting_scan_number           = 1\n      actual_delay_time              = 0\n      raw_data_uniform_sampling_flag = 0\n\n    VARIABLES:\n      error_log                      = [\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\" (length: 64)\n      scan_index                     = [0,3096,6282,9865,13409,16765,20281,23603,27099,30 (length: 60)\n      point_count                    = [3096,3186,3583,3544,3356,3516,3322,3496,3351,3031 (length: 60)\n      flag_count                     = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 (length: 60)\n      actual_scan_number             = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 (length: 60)\n      a_d_coaddition_factor          = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 60)\n      a_d_sampling_rate              = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 60)\n      inter_scan_time                = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 60)\n      mass_range_min                 = [9.949999809265137,9.949999809265137,9.94999980926 (length: 60)\n      mass_range_max                 = [164.6999969482422,169.1999969482422,189.050003051 (length: 60)\n      scan_acquisition_time          = [0.08100000023841858,2.3420000076293945,4.60300016 (length: 60)\n      scan_duration                  = [2.261000007390976,2.261000156402588,2.25999975204 (length: 60)\n      resolution                     = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 60)\n      time_range_min                 = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 60)\n      time_range_max                 = [-9999,-9999,-9999,-9999,-9999,-9999,-9999,-9999,- (length: 60)\n      total_intensity                = [4498210816,4468554240,5001547264,5405233152,50000 (length: 60)\n      mass_values                    = [9.949999809265137,83.5,83.55000305175781,83.59999 (length: 199393)\n      intensity_values               = [0,818716,462148,0,735558,952901,0,165241,421829,0 (length: 199393)\n*/\n\nfunction advionGCMS(reader) {\n  const time = reader.getDataVariable('scan_acquisition_time');\n  const tic = reader.getDataVariable('total_intensity');\n\n  // variables to get the mass-intensity values\n  let scanIndex = reader.getDataVariable('scan_index');\n  const massValues = reader.getDataVariable('mass_values');\n  const intensityValues = reader.getDataVariable('intensity_values');\n  scanIndex.push(massValues.length);\n\n  let ms = new Array(time.length);\n  let index = 0;\n  for (let i = 0; i < ms.length; i++) {\n    let size = scanIndex[i + 1] - scanIndex[i];\n    ms[i] = [new Array(size), new Array(size)];\n\n    for (let j = 0; j < size; j++) {\n      ms[i][0][j] = massValues[index];\n      ms[i][1][j] = intensityValues[index++];\n    }\n  }\n\n  return {\n    times: time,\n    series: [\n      {\n        name: 'tic',\n        dimension: 1,\n        data: tic,\n      },\n      {\n        name: 'ms',\n        dimension: 2,\n        data: ms,\n      },\n    ],\n  };\n}\n\nmodule.exports = advionGCMS;\n","'use strict';\n\nfunction aiaTemplate(reader) {\n  let time = [];\n  const tic = reader.getDataVariable('ordinate_values');\n\n  // variables to get the time\n  const delayTime = Number(reader.getDataVariable('actual_delay_time'));\n  const interval = Number(reader.getDataVariable('actual_sampling_interval'));\n\n  let currentTime = delayTime;\n  for (let i = 0; i < tic.length; i++) {\n    time.push(currentTime);\n    currentTime += interval;\n  }\n\n  return {\n    times: time,\n    series: [\n      {\n        name: 'tic',\n        dimension: 1,\n        data: tic,\n      },\n    ],\n  };\n}\n\nmodule.exports = aiaTemplate;\n","'use strict';\n\nconst NetCDFReader = require('netcdfjs');\n\nconst agilentGCMS = require('./agilentGCMS');\nconst brukerGCMS = require('./brukerGCMS');\nconst agilentHPLC = require('./agilentHPLC');\nconst finniganGCMS = require('./finniganGCMS');\nconst shimadzuGCMS = require('./shimadzuGCMS');\nconst advionGCMS = require('./advionGCMS');\nconst aiaTemplate = require('./aiaTemplate');\n\n/**\n * Reads a NetCDF file and returns a formatted JSON with the data from it\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @param {object} [options={}]\n * @param {boolean} [options.meta] - add meta information\n * @param {boolean} [options.variables] -add variables information\n * @return {{times, series}} - JSON with the time, TIC and mass spectra values\n */\nfunction netcdfGcms(data, options = {}) {\n  let reader = new NetCDFReader(data);\n  const globalAttributes = reader.globalAttributes;\n\n  let instrument_mfr =\n    reader.dataVariableExists('instrument_mfr') &&\n    reader.getDataVariableAsString('instrument_mfr');\n  let dataset_origin = reader.attributeExists('dataset_origin');\n  let mass_values = reader.dataVariableExists('mass_values');\n  let detector_name = reader.getAttribute('detector_name');\n  let aia_template_revision = reader.attributeExists('aia_template_revision');\n  let source_file_format = reader.getAttribute('source_file_format');\n\n  let ans;\n\n  if (mass_values && dataset_origin) {\n    ans = agilentGCMS(reader);\n  } else if (\n    mass_values &&\n    instrument_mfr &&\n    instrument_mfr.match(/finnigan/i)\n  ) {\n    ans = finniganGCMS(reader);\n  } else if (mass_values && instrument_mfr && instrument_mfr.match(/bruker/i)) {\n    ans = brukerGCMS(reader);\n  } else if (mass_values && instrument_mfr && instrument_mfr.match(/bruker/i)) {\n    ans = brukerGCMS(reader);\n  } else if (\n    mass_values &&\n    source_file_format &&\n    source_file_format.match(/shimadzu/i)\n  ) {\n    ans = shimadzuGCMS(reader);\n  } else if (\n    mass_values &&\n    source_file_format &&\n    source_file_format.match(/advion/i)\n  ) {\n    ans = advionGCMS(reader);\n  } else if (detector_name && detector_name.match(/(dad|tic)/i)) {\n    // diode array agilent HPLC\n    ans = agilentHPLC(reader);\n  } else if (aia_template_revision) {\n    ans = aiaTemplate(reader);\n  } else {\n    throw new TypeError('Unknown file format');\n  }\n\n  if (options.meta) {\n    ans.meta = addMeta(globalAttributes);\n  }\n\n  if (options.variables) {\n    ans.variables = addVariables(reader);\n  }\n\n  return ans;\n}\n\n/**\n * Reads a NetCDF file with Agilent GCMS format and returns a formatted JSON with the data from it\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @return {{times, series}} - JSON with the time, TIC and mass spectra values\n */\nfunction fromAgilentGCMS(data) {\n  return agilentGCMS(new NetCDFReader(data));\n}\n\n/**\n * Reads a NetCDF file with Agilent HPLC format and returns a formatted JSON with the data from it\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @return {{times, series}} - JSON with the time, TIC and mass spectra values\n */\nfunction fromAgilentHPLC(data) {\n  return agilentHPLC(new NetCDFReader(data));\n}\n\n/**\n * Reads a NetCDF file with Finnigan format and returns a formatted JSON with the data from it\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @return {{times, series}} - JSON with the time, TIC and mass spectra values\n */\nfunction fromFinniganGCMS(data) {\n  return finniganGCMS(new NetCDFReader(data));\n}\n\nfunction fromAiaTemplate(data) {\n  return aiaTemplate(new NetCDFReader(data));\n}\n\nfunction addMeta(globalAttributes) {\n  let ans = {};\n  for (const item of globalAttributes) {\n    ans[item.name] = item.value;\n  }\n  return ans;\n}\n\nfunction addVariables(reader) {\n  for (let variable of reader.variables) {\n    variable.value = reader.getDataVariable(variable);\n  }\n  return reader.variables;\n}\n\nmodule.exports = netcdfGcms;\nmodule.exports.fromAgilentGCMS = fromAgilentGCMS;\nmodule.exports.fromAgilentHPLC = fromAgilentHPLC;\nmodule.exports.fromFinniganGCMS = fromFinniganGCMS;\nmodule.exports.fromAiaTemplate = fromAiaTemplate;\n","(function (w) {\n  \"use strict\";\n\n  function findBest(atobNative) {\n    // normal window\n    if ('function' === typeof atobNative) { return atobNative; }\n\n\n    // browserify (web worker)\n    if ('function' === typeof Buffer) {\n      return function atobBrowserify(a) {\n        //!! Deliberately using an API that's deprecated in node.js because\n        //!! this file is for browsers and we expect them to cope with it.\n        //!! Discussion: github.com/node-browser-compat/atob/pull/9\n        return new Buffer(a, 'base64').toString('binary');\n      };\n    }\n\n    // ios web worker with base64js\n    if ('object' === typeof w.base64js) {\n      // bufferToBinaryString\n      // https://git.coolaj86.com/coolaj86/unibabel.js/blob/master/index.js#L50\n      return function atobWebWorker_iOS(a) {\n        var buf = w.base64js.b64ToByteArray(a);\n        return Array.prototype.map.call(buf, function (ch) {\n          return String.fromCharCode(ch);\n        }).join('');\n      };\n    }\n\n\t\treturn function () {\n\t\t\t// ios web worker without base64js\n\t\t\tthrow new Error(\"You're probably in an old browser or an iOS webworker.\" +\n\t\t\t\t\" It might help to include beatgammit's base64-js.\");\n    };\n  }\n\n  var atobBest = findBest(w.atob);\n  w.atob = atobBest;\n\n  if ((typeof module === 'object') && module && module.exports) {\n    module.exports = atobBest;\n  }\n}(window));\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\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 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            // eslint-disable-next-line no-lonely-if\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                        // eslint-disable-next-line no-lonely-if\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","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\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,\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,\n        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} info\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","import atob from 'atob';\nimport { toByteArray } from 'base64-js';\nimport { convert } from 'jcampconverter';\n\nconst common = {};\nexport default common;\ncommon.getBasename = function getBasename(filename) {\n  let base = filename.replace(/.*\\//, '');\n  return base.replace(/\\.[0-9]+$/, '');\n};\n\n/**\n * The reference remove the basedir and the extension\n * @param {*} filename\n * @returns\n */\ncommon.getReference = function getReference(filename) {\n  let base = filename.replace(/.*\\//, '');\n  base = base.replace(/\\.[0-9]+$/, '');\n  return base.replace(/\\..*?$/, '');\n};\n\ncommon.getExtension = function getExtension(filename) {\n  let extension = common.getBasename(filename);\n  return extension.replace(/.*\\./, '').toLowerCase();\n};\n\ncommon.getFilename = function getFilename(typeEntry) {\n  let keys = Object.keys(typeEntry);\n  for (let i = 0; i < keys.length; i++) {\n    if (typeEntry[keys[i]] && typeEntry[keys[i]].filename) {\n      return typeEntry[keys[i]].filename;\n    }\n  }\n  return undefined;\n};\n\ncommon.basenameFind = function basenameFind(typeEntries, filename) {\n  let reference = common.getBasename(filename);\n\n  return typeEntries.find((typeEntry) => {\n    return common.getBasename(common.getFilename(typeEntry)) === reference;\n  });\n};\n\ncommon.referenceFind = function referenceFind(typeEntries, filename) {\n  let reference = common.getReference(filename);\n\n  return typeEntries.find((typeEntry) => {\n    return common.getReference(common.getFilename(typeEntry)) === reference;\n  });\n};\n\ncommon.getTargetProperty = function getTargetProperty(filename) {\n  switch (common.getExtension(filename)) {\n    case 'jdx':\n    case 'dx':\n    case 'jcamp':\n      return 'jcamp';\n    case 'png':\n    case 'jpg':\n    case 'jpeg':\n    case 'tif':\n    case 'tiff':\n    case 'svg':\n      return 'image';\n    case 'mp4':\n    case 'm4a':\n    case 'avi':\n    case 'wav':\n      return 'video';\n    case 'cif':\n      return 'cif';\n    case 'pdb':\n      return 'pdb';\n    case 'xml':\n    case 'mzml':\n    case 'mzxml':\n    case 'mzdata':\n      return 'xml';\n    case 'cdf':\n    case 'nc':\n    case 'netcdf':\n      return 'cdf';\n    case 'pdf':\n      return 'pdf';\n    case 'txt':\n    case 'text':\n    case 'csv':\n    case 'tsv':\n      return 'text';\n    case 'gbk':\n    case 'gb':\n      return 'genbank';\n    default:\n      return 'file';\n  }\n};\n\ncommon.getContent = function getContent(content, target) {\n  switch (target) {\n    case 'text':\n    case 'xml':\n    case 'pdb':\n    case 'jcamp':\n    case 'cif':\n    case 'genbank':\n      return common.getTextContent(content);\n    default:\n      return common.getBufferContent(content);\n  }\n};\n\ncommon.getTextContent = function getTextContent(content) {\n  switch (content.encoding) {\n    case 'base64':\n      return atob(content.content);\n    default:\n      return content.content;\n  }\n};\n\ncommon.getBufferContent = function getBufferContent(content) {\n  switch (content.encoding) {\n    case 'base64':\n      return toByteArray(content.content);\n    default:\n      return content.content;\n  }\n};\n\ncommon.getMetaFromJcamp = function getMetaFromJcamp(\n  filename,\n  content,\n  options = {},\n) {\n  const extension = common.getExtension(filename);\n  const { mapping } = options;\n  let metaData = {};\n  if (extension === 'jdx' || extension === 'dx' || extension === 'jcamp') {\n    let textContent = common.getTextContent(content);\n    let parsed = convert(textContent, {\n      withoutXY: true,\n      keepRecordsRegExp: /.*/i,\n      canonicMetadataLabels: true,\n    }).flatten[0];\n    if (parsed && parsed.meta && parsed.meta.CHEMINFO) {\n      try {\n        let cheminfo = JSON.parse(parsed.meta.CHEMINFO);\n        if (cheminfo.meta) {\n          return cheminfo.meta;\n        }\n      } catch (e) {\n        // eslint-disable-next-line no-console\n        console.trace(e);\n      }\n    }\n    if (mapping && parsed && parsed.meta) {\n      for (let key in mapping) {\n        if (parsed.meta[key]) {\n          const paths = mapping[key].split('.');\n          let currentTarget = metaData;\n          for (let i = 0; i < paths.length - 1; i++) {\n            if (!currentTarget[paths[i]]) {\n              metaData[paths[i]] = {};\n            }\n            currentTarget = metaData[paths[i]];\n          }\n          currentTarget[paths[paths.length - 1]] = parsed.meta[key];\n        }\n      }\n    }\n  }\n  return metaData;\n};\n","import parseNetCDF from 'netcdf-gcms';\n\nimport common from '../common';\n\nfunction process(filename, content) {\n  const extension = common.getExtension(filename);\n  let metaData = {};\n  if (extension === 'cdf' || extension === 'netcdf') {\n    let bufferContent = common.getBufferContent(content);\n    let parsed = parseNetCDF(bufferContent, { meta: true });\n    if (parsed.series.length === 1) {\n      metaData.detector = parsed.series[0].name;\n    }\n  }\n  return metaData;\n}\n\nexport default {\n  jpath: ['spectra', 'chromatogram'],\n  find: common.referenceFind,\n  getProperty: common.getTargetProperty,\n  process,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'cyclicVoltammetry'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'differentialCentrifugalSedimentation'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'differentialScanningCalorimetry'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'dls'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'elementalAnalysis'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","/* eslint no-div-regex: 0*/\n/* eslint prefer-named-capture-group: 0 */\n\n'use strict';\n\nconst MONTHS = require('./utils/months');\n\nfunction genbankToJson(sequence) {\n  if (typeof sequence !== 'string') {\n    throw new TypeError('input must be a string');\n  }\n\n  let resultsArray = [];\n  let result;\n  let currentFeatureNote;\n\n  // Genbank specification: https://www.ncbi.nlm.nih.gov/Sitemap/samplerecord.html\n  let genbankAnnotationKey = {\n    // Contains in order: locus name, sequence length, molecule type (e.g. DNA), genbank division (see 1-18 below), modification date\n    // locus definition has changed with time, use accession number for a unique identifier\n    LOCUS_TAG: 'LOCUS',\n    DEFINITION_TAG: 'DEFINITION',\n    // Accession tag\n    // Example: Z78533\n    ACCESSION_TAG: 'ACCESSION',\n    // The version tag contains 2 informations\n    // The accession number with a revision\n    // The GI (GenInfo Identifier), a ncbi sequential number\n    // Example: Z78533.1  GI:2765658\n    // Unicity garanteed with respect to sequence. If 1 nucleotide changes, the version is different.\n    VERSION_TAG: 'VERSION',\n    KEYWORDS_TAG: 'KEYWORDS',\n    // SEGMENT_TAG:\"SEGMENT\"\n    // Source is free text\n    SOURCE_TAG: 'SOURCE',\n    ORGANISM_TAG: 'ORGANISM',\n    REFERENCE_TAG: 'REFERENCE',\n    AUTHORS_TAG: 'AUTHORS',\n    CONSORTIUM_TAG: 'CONSRTM',\n    TITLE_TAG: 'TITLE',\n    // Can be multiple journal tags\n    JOURNAL_TAG: 'JOURNAL',\n    PUBMED_TAG: 'PUBMED',\n    REMARK_TAG: 'REMARK',\n    FEATURES_TAG: 'FEATURES',\n    BASE_COUNT_TAG: 'BASE COUNT',\n    // CONTIG_TAG: \"CONTIG\"\n    ORIGIN_TAG: 'ORIGIN',\n    END_SEQUENCE_TAG: '//',\n  };\n\n  // Genbank divisions\n  //   1. PRI - primate sequences\n  //   2. ROD - rodent sequences\n  //   3. MAM - other mammalian sequences\n  //   4. VRT - other vertebrate sequences\n  //   5. INV - invertebrate sequences\n  //   6. PLN - plant, fungal, and algal sequences\n  //   7. BCT - bacterial sequences\n  //   8. VRL - viral sequences\n  //   9. PHG - bacteriophage sequences\n  // 10. SYN - synthetic sequences\n  // 11. UNA - unannotated sequences\n  // 12. EST - EST sequences (expressed sequence tags)\n  // 13. PAT - patent sequences\n  // 14. STS - STS sequences (sequence tagged sites)\n  // 15. GSS - GSS sequences (genome survey sequences)\n  // 16. HTG - HTG sequences (high-throughput genomic sequences)\n  // 17. HTC - unfinished high-throughput cDNA sequencing\n  // 18. ENV - environmental sampling sequences\n\n  let lines = sequence.split(/\\r?\\n/);\n  let fieldName;\n  let subFieldType;\n  let featureLocationIndentation;\n  let lastLineWasFeaturesTag;\n  let lastLineWasLocation;\n\n  let hasFoundLocus = false;\n\n  for (let line of lines) {\n    if (line === null) break;\n    let lineFieldName = getLineFieldName(line);\n    let val = getLineVal(line);\n    let isSubKey = isSubKeyword(line);\n    let isKey = isKeyword(line);\n\n    if (lineFieldName === genbankAnnotationKey.END_SEQUENCE_TAG || isKey) {\n      fieldName = lineFieldName;\n      subFieldType = null;\n    } else if (isSubKey) {\n      subFieldType = lineFieldName;\n    }\n    // IGNORE LINES: DO NOT EVEN PROCESS\n    if (line.trim() === '' || lineFieldName === ';') {\n      continue;\n    }\n\n    if (!hasFoundLocus && fieldName !== genbankAnnotationKey.LOCUS_TAG) {\n      // 'Genbank files must start with a LOCUS tag so this must not be a genbank'\n      break;\n    }\n\n    switch (fieldName) {\n      case genbankAnnotationKey.LOCUS_TAG:\n        hasFoundLocus = true;\n        parseLocus(line);\n        break;\n      case genbankAnnotationKey.FEATURES_TAG:\n        parseFeatures(line, lineFieldName, val);\n        break;\n      case genbankAnnotationKey.ORIGIN_TAG:\n        parseOrigin(line, lineFieldName);\n        break;\n      case genbankAnnotationKey.DEFINITION_TAG:\n      case genbankAnnotationKey.ACCESSION_TAG:\n      case genbankAnnotationKey.VERSION_TAG:\n      case genbankAnnotationKey.KEYWORDS_TAG:\n        parseMultiLineField(fieldName, line, fieldName.toLowerCase());\n        break;\n      case genbankAnnotationKey.SOURCE_TAG:\n        if (subFieldType === genbankAnnotationKey.ORGANISM_TAG) {\n          parseMultiLineField(subFieldType, line, 'organism');\n        } else {\n          parseMultiLineField(lineFieldName, line, 'source');\n        }\n        break;\n      case genbankAnnotationKey.REFERENCE_TAG:\n        if (lineFieldName === genbankAnnotationKey.REFERENCE_TAG) {\n          const ref = result.references || [];\n          result.references = ref;\n          ref.push({});\n        }\n        parseReference(line, subFieldType);\n        break;\n      case genbankAnnotationKey.END_SEQUENCE_TAG:\n        endSeq();\n        break;\n      default:\n        // Unhandled tag\n        break;\n    }\n  }\n\n  // catch the case where we've successfully started a sequence and parsed it, but endSeq isn't called correctly\n  if (resultsArray[resultsArray.length - 1] !== result) {\n    // current result isn't in resultsArray yet\n    // so we call endSeq here\n    endSeq();\n  }\n  return resultsArray;\n\n  function endSeq() {\n    // do some post processing clean-up\n    postProcessCurSeq();\n    // push the result into the resultsArray\n    resultsArray.push(result);\n  }\n\n  function getCurrentFeature() {\n    return result.features[result.features.length - 1];\n  }\n\n  function postProcessCurSeq() {\n    if (result && result.features) {\n      for (let i = 0; i < result.features.length; i++) {\n        result.features[i] = postProcessGenbankFeature(result.features[i]);\n      }\n    }\n  }\n\n  function parseOrigin(line, key) {\n    if (key !== genbankAnnotationKey.ORIGIN_TAG) {\n      let newLine = line.replace(/[\\s]*[0-9]*/g, '');\n      result.sequence += newLine;\n    }\n  }\n\n  function parseLocus(line) {\n    result = {\n      features: [],\n      name: 'Untitled sequence',\n      sequence: '',\n      references: [],\n    };\n    line = removeFieldName(genbankAnnotationKey.LOCUS_TAG, line);\n    const m = line.match(\n      /^([^\\s]+)\\s+(\\d+)\\s+bp\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)\\s*([^\\s]+)?$/,\n    );\n    let locusName = m[1];\n    let size = +m[2];\n    let moleculeType = m[3];\n    let circular = m[4] === 'circular';\n    const seq = result;\n    let dateStr = '';\n    if (!m[6]) {\n      dateStr = m[5];\n    } else {\n      seq.genbankDivision = m[5];\n      dateStr = m[6];\n    }\n    seq.circular = circular;\n    seq.moleculeType = moleculeType;\n    const dateMatch = dateStr.match(/^(\\d{2})-(.{3})-(\\d{4})$/);\n    const date = new Date();\n    date.setFullYear(+dateMatch[3]);\n    date.setUTCMonth(MONTHS.indexOf(dateMatch[2].toUpperCase()));\n    date.setDate(+dateMatch[1]);\n    date.setUTCHours(12);\n    date.setMinutes(0);\n    date.setSeconds(0);\n    date.setMilliseconds(0);\n    seq.date = date.toISOString();\n    seq.name = locusName;\n    seq.size = size;\n  }\n\n  function removeFieldName(fName, line) {\n    line = line.replace(/^\\s*/, '');\n    if (line.indexOf(fName) === 0) {\n      line = line.replace(fName, '');\n    }\n    return line.trim();\n  }\n\n  function parseReference(line, subType) {\n    const refs = result.references;\n    let lastRef = refs[refs.length - 1];\n    if (!subType) {\n      parseMultiLineField(\n        genbankAnnotationKey.REFERENCE_TAG,\n        line,\n        'description',\n        lastRef,\n      );\n    } else {\n      parseMultiLineField(subType, line, subType.toLowerCase(), lastRef);\n    }\n  }\n\n  function parseFeatures(line, key, val) {\n    let strand;\n    // FOR THE MAIN FEATURES LOCATION/QUALIFIER LINE\n    if (key === genbankAnnotationKey.FEATURES_TAG) {\n      lastLineWasFeaturesTag = true;\n      return;\n    }\n\n    if (lastLineWasFeaturesTag) {\n      // we need to get the indentation of feature locations\n      featureLocationIndentation = getLengthOfWhiteSpaceBeforeStartOfLetters(\n        line,\n      );\n      // set lastLineWasFeaturesTag to false\n      lastLineWasFeaturesTag = false;\n    }\n\n    // FOR LOCATION && QUALIFIER LINES\n    if (isFeatureLineRunon(line, featureLocationIndentation)) {\n      // the line is a continuation of the above line\n      if (lastLineWasLocation) {\n        // the last line was a location, so the run-on line is expected to be a feature location as well\n        parseFeatureLocation(line.trim());\n        lastLineWasLocation = true;\n      } else {\n        // the last line was a note\n        if (currentFeatureNote) {\n          // append to the currentFeatureNote\n          currentFeatureNote[\n            currentFeatureNote.length - 1\n          ] += line.trim().replace(/\"/g, '');\n        }\n        lastLineWasLocation = false;\n      }\n    } else {\n      // New Element/Qualifier lines. Not runon lines.\n      if (isNote(line)) {\n        // is a new Feature Element (e.g. source, CDS) in the form of  \"[\\s] KEY  SEQLOCATION\"\n        // is a FeatureQualifier in the /KEY=\"BLAH\" format; could be multiple per Element\n        // Check that feature did not get skipped for missing location\n        if (getCurrentFeature()) {\n          parseFeatureNote(line);\n          lastLineWasLocation = false;\n        }\n      } else {\n        // the line is a location, so we make a new feature from it\n        if (val.match(/complement/g)) {\n          strand = -1;\n        } else {\n          strand = 1;\n        }\n\n        newFeature();\n        let feat = getCurrentFeature();\n        feat.type = key;\n        feat.strand = strand;\n\n        parseFeatureLocation(val);\n        lastLineWasLocation = true;\n      }\n    }\n  }\n\n  function newFeature() {\n    result.features.push({\n      notes: {},\n    });\n  }\n\n  function isNote(line) {\n    let qual = false;\n    /* if (line.charAt(21) === \"/\") {//T.H. Hard coded method\n           qual = true;\n         }*/\n    if (line.trim().charAt(0).match(/\\//)) {\n      // searches based on looking for / in beginning of line\n      qual = true;\n    } else if (line.match(/^[\\s]*\\/[\\w]+=[\\S]+/)) {\n      // searches based on \"   /key=BLAH\" regex\n      qual = true;\n    }\n    return qual;\n  }\n\n  function parseFeatureLocation(locStr) {\n    locStr = locStr.trim();\n    let locArr = [];\n    locStr.replace(/(\\d+)/g, function (string, match) {\n      locArr.push(match);\n    });\n    let feat = getCurrentFeature();\n    feat.start = +locArr[0];\n    feat.end = locArr[1] === undefined ? +locArr[0] : +locArr[1];\n  }\n\n  function parseFeatureNote(line) {\n    let newLine, lineArr;\n\n    newLine = line.trim();\n    newLine = newLine.replace(/^\\/|\"$/g, '');\n    lineArr = newLine.split(/=\"|=/);\n\n    let val = lineArr[1];\n\n    if (val) {\n      val = val.replace(/\\\\/g, ' ');\n\n      if (line.match(/=\"/g)) {\n        val = val.replace(/\".*/g, '');\n      } else if (val.match(/^\\d+$/g)) {\n        val = +val;\n      }\n    }\n    let key = lineArr[0];\n    let currentNotes = getCurrentFeature().notes;\n    if (currentNotes[key]) {\n      // array already exists, so push value into it\n      currentNotes[key].push(val);\n    } else {\n      // array doesn't exist yet, so create it and populate it with the value\n      currentNotes[key] = [val];\n    }\n    currentFeatureNote = currentNotes[key];\n  }\n\n  function getLineFieldName(line) {\n    let arr;\n    line = line.trim();\n\n    arr = line.split(/[\\s]+/);\n\n    return arr[0];\n  }\n\n  function parseMultiLineField(fName, line, resultKey, r) {\n    r = r || result;\n    let fieldValue = removeFieldName(fName, line);\n    r[resultKey] = r[resultKey] ? `${r[resultKey]} ` : '';\n    r[resultKey] += fieldValue;\n  }\n\n  function getLineVal(line) {\n    let arr;\n\n    if (line.indexOf('=') < 0) {\n      line = line.replace(/^[\\s]*[\\S]+[\\s]+|[\\s]+$/, '');\n      line = line.trim();\n      return line;\n    } else {\n      arr = line.split(/=/);\n      return arr[1];\n    }\n  }\n\n  function isKeyword(line) {\n    let isKey = false;\n    if (line.substr(0, 10).match(/^[\\S]+/)) {\n      isKey = true;\n    }\n    return isKey;\n  }\n\n  function isSubKeyword(line) {\n    let isSubKey = false;\n    if (line.substr(0, 10).match(/^[\\s]+[\\S]+/)) {\n      isSubKey = true;\n    }\n    return isSubKey;\n  }\n\n  function postProcessGenbankFeature(feat) {\n    if (feat.notes.label) {\n      feat.name = feat.notes.label[0];\n    } else if (feat.notes.gene) {\n      feat.name = feat.notes.gene[0];\n    } else if (feat.notes.ApEinfo_label) {\n      feat.name = feat.notes.ApEinfo_label[0];\n    } else if (feat.notes.name) {\n      feat.name = feat.notes.name[0];\n    } else if (feat.notes.organism) {\n      feat.name = feat.notes.organism[0];\n    } else if (feat.notes.locus_tag) {\n      feat.name = feat.notes.locus_tag[0];\n    } else if (feat.notes.note) {\n      feat.name = feat.notes.note[0];\n    } else {\n      feat.name = 'Untitled Feature';\n    }\n    feat.name = typeof feat.name === 'string' ? feat.name : String(feat.name);\n    return feat;\n  }\n}\n\nfunction isFeatureLineRunon(line, featureLocationIndentation) {\n  let indentationOfLine = getLengthOfWhiteSpaceBeforeStartOfLetters(line);\n  if (featureLocationIndentation === indentationOfLine) {\n    // the feature location indentation calculated right after the feature tag\n    // cannot be the same as the indentation of the line\n    //\n    // FEATURES             Location/Qualifiers\n    //     rep_origin      complement(1074..3302)\n    // 01234  <-- this is the indentation we're talking about\n    return false; // the line is NOT a run on\n  }\n\n  let trimmed = line.trim();\n  if (trimmed.charAt(0).match(/\\//)) {\n    // the first char in the trimmed line cannot be a /\n    return false; // the line is NOT a run on\n  }\n  // the line is a run on\n  return true;\n  // run-on line example:\n  // FEATURES             Location/Qualifiers\n  //     rep_origin      complement(1074..3302)\n  //                 /label=pSC101**\n  //                 /note=\"REP_ORIGIN REP_ORIGIN pSC101* aka pMPP6, gives plasm\n  //                 id number 3 -4 copies per cell, BglII site in pSC101* ori h <--run-on line!\n  //                 as been dele ted by quick change agatcT changed to agatcA g <--run-on line!\n  //                 iving pSC101* * pSC101* aka pMPP6, gives plasmid number 3-4 <--run-on line!\n  //                 copies p er cell, BglII site in pSC101* ori has been delet  <--run-on line!\n  //                 ed by quic k change agatcT changed to agatcA giving pSC101* <--run-on line!\n  //                 * [pBbS0a-RFP]\"                                             <--run-on line!\n  //                 /gene=\"SC101** Ori\"\n  //                 /note=\"pSC101* aka pMPP6, gives plasmid number 3-4 copies p\n  //                 er cell, BglII site in pSC101* ori has been deleted by qui\n  //                 c k change agatcT changed to agatcA giving pSC101**\"\n  //                 /vntifkey=\"33\"\n}\n\nfunction getLengthOfWhiteSpaceBeforeStartOfLetters(string) {\n  let match = /^\\s*/.exec(string);\n  if (match !== null) {\n    return match[0].length;\n  } else {\n    return 0;\n  }\n}\n\nmodule.exports = genbankToJson;\n","'use strict';\n\nmodule.exports = [\n  'JAN',\n  'FEB',\n  'MAR',\n  'APR',\n  'MAY',\n  'JUN',\n  'JUL',\n  'AUG',\n  'SEP',\n  'OCT',\n  'NOV',\n  'DEC',\n];\n","import genbankParser from 'genbank-parser';\n\nimport common from '../common';\n\nexport default {\n  find(genbank, filename) {\n    let reference = common.getBasename(filename);\n\n    return genbank.find((genbank) => {\n      return common.getBasename(common.getFilename(genbank)) === reference;\n    });\n  },\n\n  getProperty(filename) {\n    return common.getTargetProperty(filename);\n  },\n\n  process(filename, content) {\n    let textContent = common.getTextContent(content);\n    let toReturn;\n    const parsed = genbankParser(textContent);\n    toReturn = {\n      seq: parsed.map((p) => p.parsedSequence),\n    };\n    return toReturn;\n  },\n\n  jpath: ['biology', 'nucleic'],\n};\n","export default {\n  jpath: ['general'],\n  getEmpty() {\n    return {\n      description: '',\n      title: '',\n      name: [],\n      mf: '',\n      molfile: '',\n      mw: 0,\n      keyword: [],\n      meta: {},\n      sequence: '',\n      kind: '',\n    };\n  },\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'hgPorosimetry'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'icp'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['image'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'ir'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'isotherm'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'iv'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'mass'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: (filename, content) => {\n    let metaData = common.getMetaFromJcamp(filename, content, {\n      mapping: {\n        EXPERIMENT: 'experiment',\n        INJECTION: 'injection',\n        MODE: 'mode',\n        INSTRUMENT: 'instrument',\n        ANALYZER: 'analyzer',\n        IONISATION: 'ionisation',\n        CONDITIONS: 'conditions',\n        ACCURATEMF: 'accurate.mf',\n        ACCURATEMODIF: 'accurate.modification',\n        ACCURATERESULT: 'accurate.value',\n      },\n    });\n    return metaData;\n  },\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 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","// sources:\n// https://en.wikipedia.org/wiki/Gyromagnetic_ratio\nexport 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=gyromagneticRatio.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\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\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        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\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 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 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 { 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","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (factory((global.d3_array = {})));\n}(this, function (exports) { 'use strict';\n\n  function ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n\n  function bisector(compare) {\n    if (compare.length === 1) compare = ascendingComparator(compare);\n    return {\n      left: function(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1;\n          else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid;\n          else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n\n  function ascendingComparator(f) {\n    return function(d, x) {\n      return ascending(f(d), x);\n    };\n  }\n\n  var ascendingBisect = bisector(ascending);\n  var bisectRight = ascendingBisect.right;\n  var bisectLeft = ascendingBisect.left;\n\n  function descending(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  }\n\n  function number$1(x) {\n    return x === null ? NaN : +x;\n  }\n\n  function variance(array, f) {\n    var n = array.length,\n        m = 0,\n        a,\n        d,\n        s = 0,\n        i = -1,\n        j = 0;\n\n    if (f == null) {\n      while (++i < n) {\n        if (!isNaN(a = number$1(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n\n    else {\n      while (++i < n) {\n        if (!isNaN(a = number$1(f(array[i], i, array)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n\n    if (j > 1) return s / (j - 1);\n  }\n\n  function deviation(array, f) {\n    var v = variance(array, f);\n    return v ? Math.sqrt(v) : v;\n  }\n\n  function extent(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b,\n        c;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n\n    return [a, c];\n  }\n\n  function constant(x) {\n    return function() {\n      return x;\n    };\n  }\n\n  function identity(x) {\n    return x;\n  }\n\n  function range(start, stop, step) {\n    start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n    var i = -1,\n        n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n        range = new Array(n);\n\n    while (++i < n) {\n      range[i] = start + i * step;\n    }\n\n    return range;\n  }\n\n  var e10 = Math.sqrt(50);\n  var e5 = Math.sqrt(10);\n  var e2 = Math.sqrt(2);\n  function ticks(start, stop, count) {\n    var step = tickStep(start, stop, count);\n    return range(\n      Math.ceil(start / step) * step,\n      Math.floor(stop / step) * step + step / 2, // inclusive\n      step\n    );\n  }\n\n  function tickStep(start, stop, count) {\n    var step0 = Math.abs(stop - start) / Math.max(0, count),\n        step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n        error = step0 / step1;\n    if (error >= e10) step1 *= 10;\n    else if (error >= e5) step1 *= 5;\n    else if (error >= e2) step1 *= 2;\n    return stop < start ? -step1 : step1;\n  }\n\n  function sturges(values) {\n    return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n  }\n\n  function number(x) {\n    return +x;\n  }\n\n  function histogram() {\n    var value = identity,\n        domain = extent,\n        threshold = sturges;\n\n    function histogram(data) {\n      var i,\n          n = data.length,\n          x,\n          values = new Array(n);\n\n      // Coerce values to numbers.\n      for (i = 0; i < n; ++i) {\n        values[i] = +value(data[i], i, data);\n      }\n\n      var xz = domain(values),\n          x0 = +xz[0],\n          x1 = +xz[1],\n          tz = threshold(values, x0, x1);\n\n      // Convert number of thresholds into uniform thresholds.\n      if (!Array.isArray(tz)) tz = ticks(x0, x1, +tz);\n\n      // Coerce thresholds to numbers, ignoring any outside the domain.\n      var m = tz.length;\n      for (i = 0; i < m; ++i) tz[i] = +tz[i];\n      while (tz[0] <= x0) tz.shift(), --m;\n      while (tz[m - 1] >= x1) tz.pop(), --m;\n\n      var bins = new Array(m + 1),\n          bin;\n\n      // Initialize bins.\n      for (i = 0; i <= m; ++i) {\n        bin = bins[i] = [];\n        bin.x0 = i > 0 ? tz[i - 1] : x0;\n        bin.x1 = i < m ? tz[i] : x1;\n      }\n\n      // Assign data to bins by value, ignoring any outside the domain.\n      for (i = 0; i < n; ++i) {\n        x = values[i];\n        if (x0 <= x && x <= x1) {\n          bins[bisectRight(tz, x, 0, m)].push(data[i]);\n        }\n      }\n\n      return bins;\n    }\n\n    histogram.value = function(_) {\n      return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), histogram) : value;\n    };\n\n    histogram.domain = function(_) {\n      return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), histogram) : domain;\n    };\n\n    histogram.thresholds = function(_) {\n      if (!arguments.length) return threshold;\n      threshold = typeof _ === \"function\" ? _\n          : Array.isArray(_) ? constant(Array.prototype.map.call(_, number))\n          : constant(+_);\n      return histogram;\n    };\n\n    return histogram;\n  }\n\n  function quantile(array, p, f) {\n    if (f == null) f = number$1;\n    if (!(n = array.length)) return;\n    if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array);\n    if (p >= 1) return +f(array[n - 1], n - 1, array);\n    var n,\n        h = (n - 1) * p,\n        i = Math.floor(h),\n        a = +f(array[i], i, array),\n        b = +f(array[i + 1], i + 1, array);\n    return a + (b - a) * (h - i);\n  }\n\n  function freedmanDiaconis(values, min, max) {\n    values.sort(ascending);\n    return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n  }\n\n  function scott(values, min, max) {\n    return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n  }\n\n  function max(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b;\n    }\n\n    return a;\n  }\n\n  function mean(array, f) {\n    var s = 0,\n        n = array.length,\n        a,\n        i = -1,\n        j = n;\n\n    if (f == null) {\n      while (++i < n) if (!isNaN(a = number$1(array[i]))) s += a; else --j;\n    }\n\n    else {\n      while (++i < n) if (!isNaN(a = number$1(f(array[i], i, array)))) s += a; else --j;\n    }\n\n    if (j) return s / j;\n  }\n\n  function median(array, f) {\n    var numbers = [],\n        n = array.length,\n        a,\n        i = -1;\n\n    if (f == null) {\n      while (++i < n) if (!isNaN(a = number$1(array[i]))) numbers.push(a);\n    }\n\n    else {\n      while (++i < n) if (!isNaN(a = number$1(f(array[i], i, array)))) numbers.push(a);\n    }\n\n    return quantile(numbers.sort(ascending), 0.5);\n  }\n\n  function merge(arrays) {\n    var n = arrays.length,\n        m,\n        i = -1,\n        j = 0,\n        merged,\n        array;\n\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n\n    return merged;\n  }\n\n  function min(array, f) {\n    var i = -1,\n        n = array.length,\n        a,\n        b;\n\n    if (f == null) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    }\n\n    else {\n      while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }\n      while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b;\n    }\n\n    return a;\n  }\n\n  function pairs(array) {\n    var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [p, p = array[++i]];\n    return pairs;\n  }\n\n  function permute(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  }\n\n  function scan(array, compare) {\n    if (!(n = array.length)) return;\n    var i = 0,\n        n,\n        j = 0,\n        xi,\n        xj = array[j];\n\n    if (!compare) compare = ascending;\n\n    while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i;\n\n    if (compare(xj, xj) === 0) return j;\n  }\n\n  function shuffle(array, i0, i1) {\n    var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n        t,\n        i;\n\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0];\n      array[m + i0] = array[i + i0];\n      array[i + i0] = t;\n    }\n\n    return array;\n  }\n\n  function sum(array, f) {\n    var s = 0,\n        n = array.length,\n        a,\n        i = -1;\n\n    if (f == null) {\n      while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent.\n    }\n\n    else {\n      while (++i < n) if (a = +f(array[i], i, array)) s += a;\n    }\n\n    return s;\n  }\n\n  function transpose(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  }\n\n  function length(d) {\n    return d.length;\n  }\n\n  function zip() {\n    return transpose(arguments);\n  }\n\n  var version = \"0.7.1\";\n\n  exports.version = version;\n  exports.bisect = bisectRight;\n  exports.bisectRight = bisectRight;\n  exports.bisectLeft = bisectLeft;\n  exports.ascending = ascending;\n  exports.bisector = bisector;\n  exports.descending = descending;\n  exports.deviation = deviation;\n  exports.extent = extent;\n  exports.histogram = histogram;\n  exports.thresholdFreedmanDiaconis = freedmanDiaconis;\n  exports.thresholdScott = scott;\n  exports.thresholdSturges = sturges;\n  exports.max = max;\n  exports.mean = mean;\n  exports.median = median;\n  exports.merge = merge;\n  exports.min = min;\n  exports.pairs = pairs;\n  exports.permute = permute;\n  exports.quantile = quantile;\n  exports.range = range;\n  exports.scan = scan;\n  exports.shuffle = shuffle;\n  exports.sum = sum;\n  exports.ticks = ticks;\n  exports.tickStep = tickStep;\n  exports.transpose = transpose;\n  exports.variance = variance;\n  exports.zip = zip;\n\n}));","const {bisectRight} = require('d3-array')\n\nconst quincunx = (u, v, w, q) => {\n  const n = u.length - 1\n\n  u[0] = 0\n  v[0] = 0\n  w[0] = 0\n  v[1] = v[1] / u[1]\n  w[1] = w[1] / u[1]\n  for (let i = 2; i < n; ++i) {\n    u[i] = u[i] - u[i - 2] * w[i - 2] * w[i - 2] - u[i - 1] * v[i - 1] * v[i - 1]\n    v[i] = (v[i] - u[i - 1] * v[i - 1] * w[i - 1]) / u[i]\n    w[i] = w[i] / u[i]\n  }\n\n  for (let i = 2; i < n; ++i) {\n    q[i] = q[i] - v[i - 1] * q[i - 1] - w[i - 2] * q[i - 2]\n  }\n  for (let i = 1; i < n; ++i) {\n    q[i] = q[i] / u[i]\n  }\n\n  q[n - 2] = q[n - 2] - v[n - 2] * q[n - 1]\n  for (let i = n - 3; i > 0; --i) {\n    q[i] = q[i] - v[i] * q[i + 1] - w[i] * q[i + 2]\n  }\n}\n\nconst smoothingSpline = (x, y, sigma, lambda) => {\n  const n = x.length - 1\n  const h = new Array(n + 1)\n  const r = new Array(n + 1)\n  const f = new Array(n + 1)\n  const p = new Array(n + 1)\n  const q = new Array(n + 1)\n  const u = new Array(n + 1)\n  const v = new Array(n + 1)\n  const w = new Array(n + 1)\n  const params = x.map(() => [0, 0, 0, 0])\n  params.pop()\n\n  const mu = 2 * (1 - lambda) / (3 * lambda)\n  for (let i = 0; i < n; ++i) {\n    h[i] = x[i + 1] - x[i]\n    r[i] = 3 / h[i]\n  }\n  q[0] = 0\n  for (let i = 1; i < n; ++i) {\n    f[i] = -(r[i - 1] + r[i])\n    p[i] = 2 * (x[i + 1] - x[i - 1])\n    q[i] = 3 * (y[i + 1] - y[i]) / h[i] - 3 * (y[i] - y[i - 1]) / h[i - 1]\n  }\n  q[n] = 0\n\n  for (let i = 1; i < n; ++i) {\n    u[i] = r[i - 1] * r[i - 1] * sigma[i - 1] + f[i] * f[i] * sigma[i] + r[i] * r[i] * sigma[i + 1]\n    u[i] = mu * u[i] + p[i]\n  }\n  for (let i = 1; i < n - 1; ++i) {\n    v[i] = f[i] * r[i] * sigma[i] + r[i] * f[i + 1] * sigma[i + 1]\n    v[i] = mu * v[i] + h[i]\n  }\n  for (let i = 1; i < n - 2; ++i) {\n    w[i] = mu * r[i] * r[i + 1] * sigma[i + 1]\n  }\n\n  quincunx(u, v, w, q)\n\n  params[0][3] = y[0] - mu * r[0] * q[1] * sigma[0]\n  params[1][3] = y[1] - mu * (f[1] * q[1] + r[1] * q[2]) * sigma[0]\n  params[0][0] = q[1] / (3 * h[0])\n  params[0][1] = 0\n  params[0][2] = (params[1][3] - params[0][3]) / h[0] - q[1] * h[0] / 3\n  r[0] = 0\n  for (let i = 1; i < n; ++i) {\n    params[i][0] = (q[i + 1] - q[i]) / (3 * h[i])\n    params[i][1] = q[i]\n    params[i][2] = (q[i] + q[i - 1]) * h[i - 1] + params[i - 1][2]\n    params[i][3] = r[i - 1] * q[i - 1] + f[i] * q[i] + r[i] * q[i + 1]\n    params[i][3] = y[i] - mu * params[i][3] * sigma[i]\n  }\n  return params\n}\n\nclass SplineInterpolator {\n  constructor (xIn, yIn, lambda = 1) {\n    const indices = xIn.map((_, i) => i)\n    indices.sort((i, j) => xIn[i] - xIn[j])\n    const x = indices.map((i) => xIn[i])\n    const y = indices.map((i) => yIn[i])\n    const n = indices.length\n    const sigma = indices.map(() => 1)\n    this.n = n\n    this.x = x\n    this.y = y\n    this.params = smoothingSpline(x, y, sigma, lambda)\n  }\n\n  interpolate (v) {\n    if (v === this.x[this.n - 1]) {\n      return this.y[this.n - 1]\n    }\n    const i = Math.min(Math.max(0, bisectRight(this.x, v) - 1), this.n - 2)\n    const [a, b, c, d] = this.params[i]\n    v = v - this.x[i]\n    return a * v * v * v + b * v * v + c * v + d\n  }\n\n  max (step = 100) {\n    const xStart = this.x[0]\n    const xStop = this.x[this.n - 1]\n    const delta = (xStop - xStart) / step\n    let maxValue = -Infinity\n    for (let i = 0, x = xStart; i < step; ++i, x += delta) {\n      const y = this.interpolate(x)\n      if (y > maxValue) {\n        maxValue = y\n      }\n    }\n    return maxValue\n  }\n\n  min (step = 100) {\n    const xStart = this.x[0]\n    const xStop = this.x[this.n - 1]\n    const delta = (xStop - xStart) / step\n    let minValue = Infinity\n    for (let i = 0, x = xStart; i < step; ++i, x += delta) {\n      const y = this.interpolate(x)\n      if (y < minValue) {\n        minValue = y\n      }\n    }\n    return minValue\n  }\n\n  domain () {\n    return [this.x[0], this.x[this.x.length - 1]]\n  }\n\n  range () {\n    return [this.min(), this.max()]\n  }\n\n  curve (nInterval, domain = null) {\n    domain = domain || this.domain()\n    const delta = (domain[1] - domain[0]) / (nInterval - 1)\n    const vals = new Array(nInterval)\n    for (let i = 0; i < nInterval; ++i) {\n      const x = delta * i + domain[0]\n      vals[i] = [x, this.interpolate(x)]\n    }\n    return vals\n  }\n}\n\nmodule.exports = SplineInterpolator\n","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 'nmr-processing';\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","/* eslint-disable camelcase */\nexport const impurities = {\n  cdcl3: {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: 'ds',\n        shift: 7.26,\n      },\n    ],\n    h2o: [\n      {\n        proton: 'H2O',\n        coupling: 0,\n        multiplicity: 'bs',\n        shift: 1.56,\n      },\n    ],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.1,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.17,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.1,\n      },\n    ],\n    benzene: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.36,\n      },\n    ],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.28,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.19,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.22,\n      },\n    ],\n    bhtb: [\n      {\n        proton: 'ArH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.98,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.01,\n      },\n      {\n        proton: 'ArCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.27,\n      },\n      {\n        proton: 'ArC(CH3)3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.43,\n      },\n    ],\n    chloroform: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.26,\n      },\n    ],\n    cyclohexane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.43,\n      },\n    ],\n    '1,2-dichloroethane': [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.73,\n      },\n    ],\n    dichloromethane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.3,\n      },\n    ],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.21,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.48,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.65,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.57,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.39,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.4,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.55,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.09,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.02,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.94,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 8.02,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.96,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.88,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.62,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.71,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.25,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.72,\n      },\n      {\n        proton: 'OH',\n        coupling: 5,\n        multiplicity: 's,t',\n        shift: 1.32,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.05,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 4.12,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.26,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.14,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.46,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.06,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.76,\n      },\n    ],\n    'grease^f': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 0.86,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'br_s',\n        shift: 1.26,\n      },\n    ],\n    'n-hexane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 't',\n        shift: 0.88,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.26,\n      },\n    ],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.65,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.49,\n      },\n      {\n        proton: 'OH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.09,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.33,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 7,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.27,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 1.22,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 4.04,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.62,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.29,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.68,\n      },\n    ],\n    silicone_greasei: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 0.07,\n      },\n    ],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.85,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.76,\n      },\n    ],\n    toluene: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.36,\n      },\n      {\n        proton: 'CH(o/p)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.17,\n      },\n      {\n        proton: 'CH(m)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.25,\n      },\n    ],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.03,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.53,\n      },\n    ],\n  },\n  '(cd3)2co': {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 2.05,\n      },\n    ],\n    h2o: [\n      {\n        proton: 'H2O',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.84,\n      },\n    ],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.96,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.09,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.05,\n      },\n    ],\n    benzene: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.36,\n      },\n    ],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.18,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.13,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.13,\n      },\n    ],\n    bhtb: [\n      {\n        proton: 'ArH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.96,\n      },\n      {\n        proton: 'ArCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.22,\n      },\n      {\n        proton: 'ArC(CH3)3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.41,\n      },\n    ],\n    chloroform: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 8.02,\n      },\n    ],\n    cyclohexane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.43,\n      },\n    ],\n    '1,2-dichloroethane': [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.87,\n      },\n    ],\n    dichloromethane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.63,\n      },\n    ],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.11,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.41,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.56,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.47,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.28,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.28,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.46,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.97,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.83,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.96,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.94,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.78,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.52,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.59,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.12,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.57,\n      },\n      {\n        proton: 'OH',\n        coupling: 5,\n        multiplicity: 's,t',\n        shift: 3.39,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.97,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 4.05,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.2,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.07,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.45,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.96,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.28,\n      },\n    ],\n    'grease^f': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 0.87,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'br_s',\n        shift: 1.29,\n      },\n    ],\n    'n-hexane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 't',\n        shift: 0.88,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.28,\n      },\n    ],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.59,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.31,\n      },\n      {\n        proton: 'OH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.12,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.43,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.88,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.27,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 1.1,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 3.9,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.58,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.35,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.76,\n      },\n    ],\n    silicone_greasei: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 0.13,\n      },\n    ],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.79,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.63,\n      },\n    ],\n    toluene: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.32,\n      },\n      {\n        proton: 'CH(o/p)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.5,\n      },\n      {\n        proton: 'CH(m)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.5,\n      },\n    ],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.96,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.45,\n      },\n    ],\n  },\n  dmso: {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: 'quint',\n        shift: 2.5,\n      },\n    ],\n    h2o: [\n      {\n        proton: 'H2O',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.33,\n      },\n    ],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.91,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.09,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.07,\n      },\n    ],\n    benzene: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.37,\n      },\n    ],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.11,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.19,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.11,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.08,\n      },\n    ],\n    bhtb: [\n      {\n        proton: 'ArH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.87,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.65,\n      },\n      {\n        proton: 'ArCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.18,\n      },\n      {\n        proton: 'ArC(CH3)3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.36,\n      },\n    ],\n    chloroform: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 8.32,\n      },\n    ],\n    cyclohexane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.4,\n      },\n    ],\n    '1,2-dichloroethane': [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.9,\n      },\n    ],\n    dichloromethane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.76,\n      },\n    ],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.09,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.38,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.51,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.38,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.24,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.24,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.43,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.96,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.94,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.78,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.95,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.89,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.73,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.54,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.57,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.06,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.44,\n      },\n      {\n        proton: 'OH',\n        coupling: 5,\n        multiplicity: 's,t',\n        shift: 4.63,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.99,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 4.03,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.17,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.07,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.43,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.91,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.34,\n      },\n    ],\n    'grease^f': [],\n    'n-hexane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 't',\n        shift: 0.86,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.25,\n      },\n    ],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.53,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.16,\n      },\n      {\n        proton: 'OH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.01,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.42,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.88,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.27,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 1.04,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 3.78,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.58,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.39,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.79,\n      },\n    ],\n    silicone_greasei: [],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.76,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.6,\n      },\n    ],\n    toluene: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.3,\n      },\n      {\n        proton: 'CH(o/p)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.18,\n      },\n      {\n        proton: 'CH(m)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.25,\n      },\n    ],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.93,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.43,\n      },\n    ],\n  },\n  c6d6: {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 7.16,\n      },\n    ],\n    h2o: [\n      {\n        proton: 'H2O',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 0.4,\n      },\n    ],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.55,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.55,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.55,\n      },\n    ],\n    benzene: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.15,\n      },\n    ],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.05,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.55,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.07,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.04,\n      },\n    ],\n    bhtb: [\n      {\n        proton: 'ArH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.05,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.79,\n      },\n      {\n        proton: 'ArCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.24,\n      },\n      {\n        proton: 'ArC(CH3)3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.38,\n      },\n    ],\n    chloroform: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.15,\n      },\n    ],\n    cyclohexane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.4,\n      },\n    ],\n    '1,2-dichloroethane': [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.9,\n      },\n    ],\n    dichloromethane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.27,\n      },\n    ],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.11,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.26,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.46,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.34,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.11,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.12,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.33,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.6,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.57,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.05,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.63,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.36,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.86,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.68,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.35,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.96,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.34,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.65,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.89,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.92,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.58,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 1.81,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.85,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.41,\n      },\n    ],\n    'grease^f': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 0.92,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'br_s',\n        shift: 1.36,\n      },\n    ],\n    'n-hexane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 't',\n        shift: 0.89,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.24,\n      },\n    ],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.4,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.07,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.94,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.86,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.23,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 0.95,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 3.67,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.53,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 6.66,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 6.98,\n      },\n    ],\n    silicone_greasei: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 0.29,\n      },\n    ],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.4,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.57,\n      },\n    ],\n    toluene: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.11,\n      },\n      {\n        proton: 'CH(o/p)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.02,\n      },\n      {\n        proton: 'CH(m)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.13,\n      },\n    ],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.96,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.4,\n      },\n    ],\n  },\n  cd3cn: {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 1.94,\n      },\n    ],\n    h2o: [\n      {\n        proton: 'H2O',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.13,\n      },\n    ],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.96,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.08,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.96,\n      },\n    ],\n    benzene: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.37,\n      },\n    ],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.16,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.18,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.14,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.13,\n      },\n    ],\n    bhtb: [\n      {\n        proton: 'ArH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.97,\n      },\n      {\n        proton: 'OHc',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.2,\n      },\n      {\n        proton: 'ArCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.22,\n      },\n      {\n        proton: 'ArC(CH3)3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.39,\n      },\n    ],\n    chloroform: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.58,\n      },\n    ],\n    cyclohexane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.44,\n      },\n    ],\n    '1,2-dichloroethane': [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.81,\n      },\n    ],\n    dichloromethane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.44,\n      },\n    ],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.12,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.42,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.53,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.45,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.29,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.28,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.45,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.97,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.96,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.83,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.92,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.89,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.77,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.5,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.6,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.12,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.54,\n      },\n      {\n        proton: 'OH',\n        coupling: 5,\n        multiplicity: 's,t',\n        shift: 2.47,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.97,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 4.06,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.2,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.06,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.43,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.96,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.51,\n      },\n    ],\n    'grease^f': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 0.86,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'br_s',\n        shift: 1.27,\n      },\n    ],\n    'n-hexane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 't',\n        shift: 0.89,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.28,\n      },\n    ],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.57,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.28,\n      },\n      {\n        proton: 'OH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.16,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.31,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.87,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.29,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 1.09,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 3.87,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.57,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.33,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.73,\n      },\n    ],\n    silicone_greasei: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 0.08,\n      },\n    ],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.8,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.64,\n      },\n    ],\n    toluene: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.33,\n      },\n      {\n        proton: 'CH(o/p)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.2,\n      },\n      {\n        proton: 'CH(m)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.2,\n      },\n    ],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.96,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.45,\n      },\n    ],\n  },\n  cd3od: {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 3.31,\n      },\n    ],\n    h2o: [\n      {\n        proton: 'H2O',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.87,\n      },\n    ],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.99,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.15,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.03,\n      },\n    ],\n    benzene: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.33,\n      },\n    ],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.4,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.15,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.2,\n      },\n    ],\n    bhtb: [\n      {\n        proton: 'ArH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 6.92,\n      },\n      {\n        proton: 'ArCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.21,\n      },\n      {\n        proton: 'ArC(CH3)3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.4,\n      },\n    ],\n    chloroform: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.9,\n      },\n    ],\n    cyclohexane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.45,\n      },\n    ],\n    '1,2-dichloroethane': [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.78,\n      },\n    ],\n    dichloromethane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 5.49,\n      },\n    ],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.18,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.49,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.61,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.58,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.35,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.35,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.52,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.07,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.31,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.92,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.97,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.99,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.86,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.65,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.66,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.19,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.6,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.01,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 4.09,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.24,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.12,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.5,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.01,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.59,\n      },\n    ],\n    'grease^f': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 0.88,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'br_s',\n        shift: 1.29,\n      },\n    ],\n    'n-hexane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 't',\n        shift: 0.9,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.29,\n      },\n    ],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.64,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.34,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.34,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.89,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.29,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 1.5,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 3.92,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.53,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.44,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.85,\n      },\n    ],\n    silicone_greasei: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 0.1,\n      },\n    ],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.87,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.71,\n      },\n    ],\n    toluene: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.32,\n      },\n      {\n        proton: 'CH(o/p)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.16,\n      },\n      {\n        proton: 'CH(m)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.16,\n      },\n    ],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.05,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.58,\n      },\n    ],\n  },\n  d2o: {\n    tms: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 0,\n      },\n    ],\n    solvent: [\n      {\n        proton: 'X',\n        coupling: 0,\n        multiplicity: '',\n        shift: 4.79,\n      },\n    ],\n    h2o: [],\n    acetic_acid: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.08,\n      },\n    ],\n    acetone: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.22,\n      },\n    ],\n    acetonitrile: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.06,\n      },\n    ],\n    benzene: [],\n    'tert-butyl_alcohol': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.24,\n      },\n    ],\n    'tert-butyl_methyl_ether': [\n      {\n        proton: 'CCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 1.21,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.22,\n      },\n    ],\n    bhtb: [],\n    chloroform: [],\n    cyclohexane: [],\n    '1,2-dichloroethane': [],\n    dichloromethane: [],\n    diethyl_ether: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.17,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.56,\n      },\n    ],\n    diglyme: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.67,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.61,\n      },\n      {\n        proton: 'OCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.37,\n      },\n    ],\n    '1,2-dimethoxyethane': [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.37,\n      },\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.6,\n      },\n    ],\n    dimethylacetamide: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.08,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.06,\n      },\n      {\n        proton: 'NCH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.9,\n      },\n    ],\n    dimethylformamide: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 7.92,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.01,\n      },\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.85,\n      },\n    ],\n    dimethyl_sulfoxide: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.71,\n      },\n    ],\n    dioxane: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.75,\n      },\n    ],\n    ethanol: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.17,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.65,\n      },\n    ],\n    ethyl_acetate: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.07,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 4.14,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.24,\n      },\n    ],\n    ethyl_methyl_ketone: [\n      {\n        proton: 'CH3CO',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 2.19,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 3.18,\n      },\n      {\n        proton: 'CH2CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 1.26,\n      },\n    ],\n    ethylene_glycol: [\n      {\n        proton: 'CH',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.65,\n      },\n    ],\n    'grease^f': [],\n    'n-hexane': [],\n    hmpag: [\n      {\n        proton: 'CH3',\n        coupling: 9.5,\n        multiplicity: 'd',\n        shift: 2.61,\n      },\n    ],\n    methanol: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 3.34,\n      },\n    ],\n    nitromethane: [\n      {\n        proton: 'CH3',\n        coupling: 0,\n        multiplicity: 's',\n        shift: 4.4,\n      },\n    ],\n    'n-pentane': [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.9,\n      },\n    ],\n    '2-propanol': [\n      {\n        proton: 'CH3',\n        coupling: 6,\n        multiplicity: 'd',\n        shift: 1.17,\n      },\n      {\n        proton: 'CH',\n        coupling: 6,\n        multiplicity: 'sep',\n        shift: 4.02,\n      },\n    ],\n    pyridine: [\n      {\n        proton: 'CH(2)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 8.52,\n      },\n      {\n        proton: 'CH(3)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.45,\n      },\n      {\n        proton: 'CH(4)',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 7.87,\n      },\n    ],\n    silicone_greasei: [],\n    tetrahydrofuran: [\n      {\n        proton: 'CH2',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 1.88,\n      },\n      {\n        proton: 'CH2O',\n        coupling: 0,\n        multiplicity: 'm',\n        shift: 3.74,\n      },\n    ],\n    toluene: [],\n    triethylamine: [\n      {\n        proton: 'CH3',\n        coupling: 7,\n        multiplicity: 't',\n        shift: 0.99,\n      },\n      {\n        proton: 'CH2',\n        coupling: 7,\n        multiplicity: 'q',\n        shift: 2.57,\n      },\n    ],\n  },\n};\n","import { impurities } from '../constants/impurities';\n\nconst toCheck = ['solvent', 'H2O', 'TMS'];\n\n/**\n * Try to remove peaks of impurities.\n * @param {array} peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options={}] - options\n * @param {string} [options.solvent=''] - solvent name.\n * @param {string} [options.error=0.025] - tolerance in ppm to assign a impurity.\n */\n\nexport function peaksFilterImpurities(peakList, options = {}) {\n  let { solvent = '', error = 0.025, remove = false } = options;\n  solvent = solvent.toLowerCase();\n  if (solvent === '(cd3)2so') solvent = 'dmso';\n  if (solvent === 'meod') solvent = 'cd3od';\n  let solventImpurities = impurities[solvent];\n  if (solventImpurities) {\n    for (let impurity of toCheck) {\n      let name = impurity.toLowerCase();\n      let impurityShifts = solventImpurities[name];\n      checkImpurity(peakList, impurityShifts, {\n        error,\n        remove,\n        name,\n      });\n    }\n  }\n  return peakList;\n}\n\nfunction checkImpurity(peakList, impurity, options) {\n  let { name, error, remove } = options;\n  let j, tolerance, difference;\n  let i = impurity.length;\n  while (i--) {\n    j = peakList.length;\n    while (j--) {\n      if (!peakList[j].asymmetric) {\n        tolerance = error + peakList[j].width;\n        difference = Math.abs(impurity[i].shift - peakList[j].x);\n        if (difference < tolerance) {\n          // && (impurity[i].multiplicity === '' || (impurity[i].multiplicity.indexOf(peakList[j].multiplicity)) { // some impurities has multiplicities like 'bs' but at presents it is unsupported\n          if (remove) {\n            peakList.splice(j, 1);\n          } else {\n            peakList[j].kind = name;\n          }\n        }\n      }\n    }\n  }\n}\n","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n//# sourceMappingURL=constants.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\nexport default function erfinv(x) {\n    let a = 0.147;\n    if (x === 0)\n        return 0;\n    let ln1MinusXSqrd = Math.log(1 - x * x);\n    let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n    let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n    let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n    return secondSqrt * (x > 0 ? 1 : -1);\n}\n//# sourceMappingURL=erfinv.js.map","export class Shape1D {\n}\n//# sourceMappingURL=Shape1D.js.map","import { ROOT_2LN2, GAUSSIAN_EXP_FACTOR, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport erfinv from '../../../util/erfinv';\nimport { Shape1D } from '../Shape1D';\nexport class Gaussian extends Shape1D {\n    constructor(options = {}) {\n        super();\n        const { fwhm = 500, sd, height } = options;\n        this.fwhm = sd ? widthToFWHM(2 * sd) : fwhm;\n        this.height =\n            height === undefined\n                ? Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI) / this.fwhm\n                : height;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return fwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return widthToFWHM(width);\n    }\n    fct(x) {\n        return fct(x, this.fwhm);\n    }\n    getArea() {\n        return getArea({ fwhm: this.fwhm, height: this.height });\n    }\n    getFactor(area) {\n        return getFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor } = options;\n        return getData({ fwhm: this.fwhm, height: this.height, factor, length });\n    }\n}\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @returns - the y value of gaussian with the current parameters.\n */\nexport function fct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n}\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * for more information check the [mathworld page](https://mathworld.wolfram.com/GaussianFunction.html)\n * @returns fwhm\n */\nexport function widthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * for more information check the [mathworld page](https://mathworld.wolfram.com/GaussianFunction.html)\n * @param fwhm - Full Width at Half Maximum.\n * @returns width\n */\nexport function fwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\n/**\n * Calculate the area of a specific shape.\n * @returns returns the area of the specific shape and parameters.\n */\nexport function getArea(options) {\n    let { fwhm, sd, height = 1 } = options;\n    if (sd)\n        fwhm = widthToFWHM(2 * sd);\n    if (fwhm === undefined) {\n        throw new Error('should pass fwhm or sd parameters');\n    }\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param [area=0.9999] Expected area to be covered.\n * @returns\n */\nexport function getFactor(area = 0.9999) {\n    return Math.sqrt(2) * erfinv(area);\n}\n/**\n * Calculate intensity array of a gaussian shape.\n * @returns {Float64Array} Intensity values.\n */\nexport function getData(options = {}) {\n    let { length, factor = getFactor(), fwhm = 500, sd, height } = options;\n    if (sd)\n        fwhm = widthToFWHM(2 * sd);\n    if (!height) {\n        height = Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI) / fwhm;\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = fct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","import { ROOT_THREE } from '../../../util/constants';\nimport { Shape1D } from '../Shape1D';\nexport class Lorentzian extends Shape1D {\n    constructor(options = {}) {\n        super();\n        const { fwhm = 500, height } = options;\n        this.fwhm = fwhm;\n        this.height = height === undefined ? 2 / Math.PI / fwhm : height;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return fwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return widthToFWHM(width);\n    }\n    fct(x) {\n        return fct(x, this.fwhm);\n    }\n    getArea() {\n        return getArea({ fwhm: this.fwhm, height: this.height });\n    }\n    getFactor(area) {\n        return getFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor } = options;\n        return getData({ fwhm: this.fwhm, height: this.height, factor, length });\n    }\n}\n/**\n * Return a parameterized function of a lorentzian shape (see README for equation).\n * @param x - x value to calculate.\n * @param fwhm - full width half maximum\n * @returns - the y value of lorentzian with the current parameters.\n */\nexport function fct(x, fwhm) {\n    return Math.pow(fwhm, 2) / (4 * Math.pow(x, 2) + Math.pow(fwhm, 2));\n}\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * for more information check the [mathworld page](https://mathworld.wolfram.com/LorentzianFunction.html)\n * @param width - Width between the inflection points\n * @returns fwhm\n */\nexport function widthToFWHM(width) {\n    return width * ROOT_THREE;\n}\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * for more information check the [mathworld page](https://mathworld.wolfram.com/LorentzianFunction.html)\n * @param fwhm - Full Width at Half Maximum.\n * @returns width\n */\nexport function fwhmToWidth(fwhm) {\n    return fwhm / ROOT_THREE;\n}\n/**\n * Calculate the area of a specific shape.\n * @returns returns the area of the specific shape and parameters.\n */\nexport function getArea(options) {\n    const { fwhm, height = 1 } = options;\n    if (fwhm === undefined) {\n        throw new Error('should pass fwhm or sd parameters');\n    }\n    return (height * Math.PI * fwhm) / 2;\n}\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param [area=0.9999] Expected area to be covered.\n * @returns\n */\nexport function getFactor(area = 0.9999) {\n    return 2 * Math.tan(Math.PI * (area - 0.5));\n}\n/**\n * Calculate intensity array of a lorentzian shape.\n * @returns {Float64Array} y values\n */\nexport function getData(options = {}) {\n    let { length, factor = getFactor(), fwhm = 500, height } = options;\n    if (!height) {\n        height = 2 / Math.PI / fwhm;\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = fct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Lorentzian.js.map","import { GAUSSIAN_EXP_FACTOR, ROOT_2LN2_MINUS_ONE, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport { Shape1D } from '../Shape1D';\nimport { fct as gaussian, getFactor as getFactorGaussian, } from '../gaussian/Gaussian';\nimport { fct as lorentzian, getFactor as getFactorLorentzian, } from '../lorentzian/Lorentzian';\nexport class PseudoVoigt extends Shape1D {\n    constructor(options = {}) {\n        super();\n        const { fwhm = 500, height, mu = 0.5 } = options;\n        this.mu = mu;\n        this.fwhm = fwhm;\n        this.height =\n            height === undefined\n                ? 1 /\n                    ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                        ((1 - mu) * fwhm * Math.PI) / 2)\n                : height;\n    }\n    fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n        return fwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this.mu) {\n        return widthToFWHM(width, mu);\n    }\n    fct(x) {\n        return fct(x, this.fwhm, this.mu);\n    }\n    getArea() {\n        return getArea({ fwhm: this.fwhm, height: this.height, mu: this.mu });\n    }\n    getFactor(area) {\n        return getFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor } = options;\n        return getData({\n            fwhm: this.fwhm,\n            height: this.height,\n            mu: this.mu,\n            factor,\n            length,\n        });\n    }\n}\n/**\n * Return a parameterized function of a pseudo voigt shape (see README for equation).\n * @param x - x value to calculate.\n * @param fwhm - full width half maximum\n * @returns - the y value of pseudo voigt with the current parameters.\n */\nexport function fct(x, fwhm, mu) {\n    return (1 - mu) * lorentzian(x, fwhm) + mu * gaussian(x, fwhm);\n}\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * @param width - Width between the inflection points\n * @param [mu=0.5] Ratio of gaussian contribution in the shape\n * @returns fwhm\n */\nexport function widthToFWHM(width, mu = 0.5) {\n    return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n}\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * @param fwhm - Full Width at Half Maximum.\n * @param [mu=0.5] Ratio of gaussian contribution in the shape\n * @returns width\n */\nexport function fwhmToWidth(fwhm, mu = 0.5) {\n    return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n}\n/**\n * Calculate the area of a specific shape.\n * @returns returns the area of the specific shape and parameters.\n */\nexport function getArea(options) {\n    const { fwhm, height = 1, mu = 0.5 } = options;\n    if (fwhm === undefined) {\n        throw new Error('should pass fwhm or sd parameters');\n    }\n    return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n}\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param [area=0.9999] Expected area to be covered.\n * @returns\n */\nexport function getFactor(area = 0.9999, mu = 0.5) {\n    return mu < 1 ? getFactorLorentzian(area) : getFactorGaussian(area);\n}\n/**\n * Calculate intensity array of a pseudo voigt shape.\n * @returns {Float64Array} y values\n */\nexport function getData(options = {}) {\n    let { length, factor = getFactor(), fwhm = 500, height, mu = 0.5 } = options;\n    if (!height) {\n        height =\n            1 /\n                ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                    ((1 - mu) * fwhm * Math.PI) / 2);\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = fct(i - center, fwhm, mu) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=PseudoVoigt.js.map","import { Gaussian } from '../shapes/1d/gaussian/Gaussian';\nimport { Lorentzian } from '../shapes/1d/lorentzian/Lorentzian';\nimport { PseudoVoigt } from '../shapes/1d/pseudoVoigt/PseudoVoigt';\n/**\n * Generate a instance of a specific kind of shape.\n */\nexport function getShape1D(kind, shapeOptions = {}) {\n    switch (kind) {\n        case 'gaussian':\n            return new Gaussian(shapeOptions);\n        case 'lorentzian':\n            return new Lorentzian(shapeOptions);\n        case 'pseudoVoigt':\n            return new PseudoVoigt(shapeOptions);\n        default: {\n            const unHandled = kind;\n            // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n            throw Error(`Unknown distribution ${unHandled}`);\n        }\n    }\n}\n//# sourceMappingURL=getShape1D.js.map","/**\n * Apply Savitzky Golay algorithm\n * @param {array} [ys] Array of y values\n * @param {array|number} [xs] Array of X or deltaX\n * @param {object} [options={}]\n * @param {number} [options.windowSize=9]\n * @param {number} [options.derivative=0]\n * @param {number} [options.polynomial=3]\n * @return {array} Array containing the new ys (same length)\n */\n\nexport default function SavitzkyGolay(ys, xs, options = {}) {\n  let { windowSize = 9, derivative = 0, polynomial = 3 } = options;\n\n  if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n    throw new RangeError(\n      'Invalid window size (should be odd and at least 5 integer number)',\n    );\n  }\n  if (windowSize > ys.length) {\n    throw new RangeError(\n      `Window size is higher than the data length ${windowSize}>${ys.length}`,\n    );\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(\n      '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  }\n\n  let half = Math.floor(windowSize / 2);\n  let np = ys.length;\n  let ans = new Array(np);\n  let weights = fullWeights(windowSize, polynomial, derivative);\n  let hs = 0;\n  let constantH = true;\n  if (Array.isArray(xs)) {\n    constantH = false;\n  } else {\n    hs = Math.pow(xs, derivative);\n  }\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    } 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\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++) d += wg[l] * ys[l + i - windowSize];\n    if (!constantH) hs = getHs(xs, i - half - 1, half, derivative);\n    ans[i - half - 1] = d / hs;\n  }\n  return ans;\n}\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}\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  } else {\n    if (k === 0 && s === 0) {\n      Grampoly = 1;\n    } else {\n      Grampoly = 0;\n    }\n  }\n  return Grampoly;\n}\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}\n\nfunction Weight(i, t, m, n, s) {\n  let sum = 0;\n  for (let k = 0; k <= n; k++) {\n    //console.log(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/**\n *\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 Array(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\n/*function entropy(data,h,options){\n    var trend = SavitzkyGolay(data,h,trendOptions);\n    var copy = new Array(data.length);\n    var sum = 0;\n    var max = 0;\n    for(var i=0;i<data.length;i++){\n        copy[i] = data[i]-trend[i];\n    }\n\n    sum/=data.length;\n    console.log(sum+\" \"+max);\n    console.log(stat.array.standardDeviation(copy));\n    console.log(Math.abs(stat.array.mean(copy))/stat.array.standardDeviation(copy));\n    return sum;\n\n}\n\n\n\nfunction guessWindowSize(data, h){\n    console.log(\"entropy \"+entropy(data,h,trendOptions));\n    return 5;\n}\n*/\n","import { getShape1D } from 'ml-peak-shape-generator';\nimport SG from 'ml-savitzky-golay-generalized';\n\n/**\n * Global spectra deconvolution\n * @param {object} data - Object data with x and y arrays\n * @param {Array<number>} [data.x] - Independent variable\n * @param {Array<number>} [data.y] - Dependent variable\n * @param {object} [options={}] - Options object\n * @param {object} [options.shape={}] - Object that specified the kind of shape to calculate the FWHM instead of width between inflection points. see https://mljs.github.io/peak-shape-generator/#inflectionpointswidthtofwhm\n * @param {object} [options.shape.kind='gaussian']\n * @param {object} [options.shape.options={}]\n * @param {object} [options.sgOptions] - Options object for Savitzky-Golay filter. See https://github.com/mljs/savitzky-golay-generalized#options\n * @param {number} [options.sgOptions.windowSize = 9] - points to use in the approximations\n * @param {number} [options.sgOptions.polynomial = 3] - degree of the polynomial to use in the approximations\n * @param {number} [options.minMaxRatio = 0.00025] - Threshold to determine if a given peak should be considered as a noise\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 * @param {number} [options.noiseLevel = 0] - Noise threshold in spectrum units\n * @param {boolean} [options.maxCriteria = true] - Peaks are local maximum(true) or minimum(false)\n * @param {boolean} [options.smoothY = true] - Select the peak intensities from a smoothed version of the independent variables\n * @param {boolean} [options.realTopDetection = false] - Use a quadratic optimizations with the peak and its 3 closest neighbors\n * to determine the true x,y values of the peak?\n * @param {number} [options.heightFactor = 0] - Factor to multiply the calculated height (usually 2)\n * @param {number} [options.derivativeThreshold = -1] - Filters based on the amplitude of the first derivative\n * @return {Array<object>}\n */\nexport function gsd(data, options = {}) {\n  let {\n    noiseLevel,\n    sgOptions = {\n      windowSize: 9,\n      polynomial: 3,\n    },\n    shape = {},\n    smoothY = true,\n    heightFactor = 0,\n    broadRatio = 0.0,\n    maxCriteria = true,\n    minMaxRatio = 0.00025,\n    derivativeThreshold = -1,\n    realTopDetection = false,\n  } = options;\n\n  let { y: yIn, x } = data;\n\n  const y = yIn.slice();\n  let equalSpaced = isEqualSpaced(x);\n\n  if (maxCriteria === false) {\n    for (let i = 0; i < y.length; i++) {\n      y[i] *= -1;\n    }\n  }\n\n  if (noiseLevel === undefined) {\n    noiseLevel = equalSpaced ? getNoiseLevel(y) : 0;\n  }\n  for (let i = 0; i < y.length; i++) {\n    y[i] -= noiseLevel;\n  }\n  for (let i = 0; i < y.length; i++) {\n    if (y[i] < 0) {\n      y[i] = 0;\n    }\n  }\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 yData = y;\n  let dY, ddY;\n  const { windowSize, polynomial } = sgOptions;\n\n  if (equalSpaced) {\n    if (smoothY) {\n      yData = SG(y, x[1] - x[0], {\n        windowSize,\n        polynomial,\n        derivative: 0,\n      });\n    }\n    dY = SG(y, x[1] - x[0], {\n      windowSize,\n      polynomial,\n      derivative: 1,\n    });\n    ddY = SG(y, x[1] - x[0], {\n      windowSize,\n      polynomial,\n      derivative: 2,\n    });\n  } else {\n    if (smoothY) {\n      yData = SG(y, x, {\n        windowSize,\n        polynomial,\n        derivative: 0,\n      });\n    }\n    dY = SG(y, x, {\n      windowSize,\n      polynomial,\n      derivative: 1,\n    });\n    ddY = SG(y, x, {\n      windowSize,\n      polynomial,\n      derivative: 2,\n    });\n  }\n\n  const xData = x;\n  const dX = x[1] - x[0];\n  let maxDdy = 0;\n  let maxY = 0;\n  for (let i = 0; i < yData.length; i++) {\n    if (Math.abs(ddY[i]) > maxDdy) {\n      maxDdy = Math.abs(ddY[i]);\n    }\n    if (Math.abs(yData[i]) > maxY) {\n      maxY = Math.abs(yData[i]);\n    }\n  }\n\n  let lastMax = null;\n  let lastMin = null;\n  let minddY = [];\n  let intervalL = [];\n  let intervalR = [];\n  let broadMask = [];\n\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    // filter based on derivativeThreshold\n    if (Math.abs(dY[i]) > derivativeThreshold) {\n      // Minimum in first derivative\n      if (\n        (dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n        (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])\n      ) {\n        lastMin = {\n          x: xData[i],\n          index: i,\n        };\n        if (dX > 0 && lastMax !== null) {\n          intervalL.push(lastMax);\n          intervalR.push(lastMin);\n        }\n      }\n\n      // Maximum in first derivative\n      if (\n        (dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n        (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])\n      ) {\n        lastMax = {\n          x: xData[i],\n          index: i,\n        };\n        if (dX < 0 && lastMin !== null) {\n          intervalL.push(lastMax);\n          intervalR.push(lastMin);\n        }\n      }\n    }\n\n    // Minimum in second derivative\n    if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n      minddY.push(i);\n      broadMask.push(Math.abs(ddY[i]) <= broadRatio * maxDdy);\n    }\n  }\n\n  let widthProcessor = shape.kind\n    ? getShape1D(shape.kind, shape.options).widthToFWHM\n    : (x) => x;\n\n  let signals = [];\n  let lastK = -1;\n  let possible, frequency, distanceJ, minDistance, gettingCloser;\n  for (let j = 0; j < minddY.length; ++j) {\n    frequency = xData[minddY[j]];\n    possible = -1;\n    let k = lastK + 1;\n    minDistance = Number.MAX_VALUE;\n    distanceJ = 0;\n    gettingCloser = true;\n    while (possible === -1 && k < intervalL.length && gettingCloser) {\n      distanceJ = Math.abs(frequency - (intervalL[k].x + intervalR[k].x) / 2);\n\n      // Still getting closer?\n      if (distanceJ < minDistance) {\n        minDistance = distanceJ;\n      } else {\n        gettingCloser = false;\n      }\n      if (distanceJ < Math.abs(intervalL[k].x - intervalR[k].x) / 2) {\n        possible = k;\n        lastK = k;\n      }\n      ++k;\n    }\n\n    if (possible !== -1) {\n      if (Math.abs(yData[minddY[j]]) > minMaxRatio * maxY) {\n        let width = Math.abs(intervalR[possible].x - intervalL[possible].x);\n        signals.push({\n          index: minddY[j],\n          x: frequency,\n          y: maxCriteria\n            ? yData[minddY[j]] + noiseLevel\n            : -yData[minddY[j]] - noiseLevel,\n          width: widthProcessor(width),\n          soft: broadMask[j],\n        });\n\n        signals[signals.length - 1].left = intervalL[possible];\n        signals[signals.length - 1].right = intervalR[possible];\n\n        if (heightFactor) {\n          let yLeft = yData[intervalL[possible].index];\n          let yRight = yData[intervalR[possible].index];\n          signals[signals.length - 1].height =\n            heightFactor *\n            (signals[signals.length - 1].y - (yLeft + yRight) / 2);\n        }\n      }\n    }\n  }\n\n  if (realTopDetection) {\n    determineRealTop(signals, xData, yData);\n  }\n\n  // Correct the values to fit the original spectra data\n  for (let j = 0; j < signals.length; j++) {\n    signals[j].base = noiseLevel;\n  }\n\n  signals.sort((a, b) => {\n    return a.x - b.x;\n  });\n\n  return signals;\n}\n\nconst isEqualSpaced = (x) => {\n  let tmp;\n  let maxDx = 0;\n  let minDx = Number.MAX_SAFE_INTEGER;\n  for (let i = 0; i < x.length - 1; ++i) {\n    tmp = Math.abs(x[i + 1] - x[i]);\n    if (tmp < minDx) {\n      minDx = tmp;\n    }\n    if (tmp > maxDx) {\n      maxDx = tmp;\n    }\n  }\n  return (maxDx - minDx) / maxDx < 0.05;\n};\n\nconst getNoiseLevel = (y) => {\n  let mean = 0;\n\n  let stddev = 0;\n  let length = y.length;\n  for (let i = 0; i < length; ++i) {\n    mean += y[i];\n  }\n  mean /= length;\n  let averageDeviations = new Array(length);\n  for (let i = 0; i < length; ++i) {\n    averageDeviations[i] = Math.abs(y[i] - mean);\n  }\n  averageDeviations.sort((a, b) => a - b);\n  if (length % 2 === 1) {\n    stddev = averageDeviations[(length - 1) / 2] / 0.6745;\n  } else {\n    stddev =\n      (0.5 *\n        (averageDeviations[length / 2] + averageDeviations[length / 2 - 1])) /\n      0.6745;\n  }\n\n  return stddev;\n};\n\nconst determineRealTop = (peakList, x, y) => {\n  let alpha, beta, gamma, p, currentPoint;\n  for (let j = 0; j < peakList.length; j++) {\n    currentPoint = peakList[j].index; // peakList[j][2];\n    // The detected peak could be moved 1 or 2 units to left or right.\n    if (\n      y[currentPoint - 1] >= y[currentPoint - 2] &&\n      y[currentPoint - 1] >= y[currentPoint]\n    ) {\n      currentPoint--;\n    } else {\n      if (\n        y[currentPoint + 1] >= y[currentPoint] &&\n        y[currentPoint + 1] >= y[currentPoint + 2]\n      ) {\n        currentPoint++;\n      } else {\n        if (\n          y[currentPoint - 2] >= y[currentPoint - 3] &&\n          y[currentPoint - 2] >= y[currentPoint - 1]\n        ) {\n          currentPoint -= 2;\n        } else {\n          if (\n            y[currentPoint + 2] >= y[currentPoint + 1] &&\n            y[currentPoint + 2] >= y[currentPoint + 3]\n          ) {\n            currentPoint += 2;\n          }\n        }\n      }\n    }\n    // interpolation to a sin() function\n    if (\n      y[currentPoint - 1] > 0 &&\n      y[currentPoint + 1] > 0 &&\n      y[currentPoint] >= y[currentPoint - 1] &&\n      y[currentPoint] >= y[currentPoint + 1] &&\n      (y[currentPoint] !== y[currentPoint - 1] ||\n        y[currentPoint] !== y[currentPoint + 1])\n    ) {\n      alpha = 20 * Math.log10(y[currentPoint - 1]);\n      beta = 20 * Math.log10(y[currentPoint]);\n      gamma = 20 * Math.log10(y[currentPoint + 1]);\n      p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n      // console.log(alpha, beta, gamma, `p: ${p}`);\n      // console.log(x[currentPoint]+\" \"+tmp+\" \"+currentPoint);\n      peakList[j].x =\n        x[currentPoint] + (x[currentPoint] - x[currentPoint - 1]) * p;\n      peakList[j].y =\n        y[currentPoint] -\n        0.25 * (y[currentPoint - 1] - y[currentPoint + 1]) * p;\n    }\n  }\n};\n","/*!\n * assign-symbols <https://github.com/jonschlinkert/assign-symbols>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst toString = Object.prototype.toString;\nconst isEnumerable = Object.prototype.propertyIsEnumerable;\nconst getSymbols = Object.getOwnPropertySymbols;\n\nmodule.exports = (target, ...args) => {\n  if (!isObject(target)) {\n    throw new TypeError('expected the first argument to be an object');\n  }\n\n  if (args.length === 0 || typeof Symbol !== 'function' || typeof getSymbols !== 'function') {\n    return target;\n  }\n\n  for (let arg of args) {\n    let names = getSymbols(arg);\n\n    for (let key of names) {\n      if (isEnumerable.call(arg, key)) {\n        target[key] = arg[key];\n      }\n    }\n  }\n  return target;\n};\n\nfunction isObject(val) {\n  return typeof val === 'function' || toString.call(val) === '[object Object]' || Array.isArray(val);\n}\n","/*!\n * assign-deep <https://github.com/jonschlinkert/assign-deep>\n *\n * Copyright (c) 2017-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst toString = Object.prototype.toString;\nconst assignSymbols = require('assign-symbols');\n\nconst isValidKey = key => {\n  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n};\n\nconst assign = module.exports = (target, ...args) => {\n  let i = 0;\n  if (isPrimitive(target)) target = args[i++];\n  if (!target) target = {};\n  for (; i < args.length; i++) {\n    if (isObject(args[i])) {\n      for (const key of Object.keys(args[i])) {\n        if (isValidKey(key)) {\n          if (isObject(target[key]) && isObject(args[i][key])) {\n            assign(target[key], args[i][key]);\n          } else {\n            target[key] = args[i][key];\n          }\n        }\n      }\n      assignSymbols(target, args[i]);\n    }\n  }\n  return target;\n};\n\nfunction isObject(val) {\n  return typeof val === 'function' || toString.call(val) === '[object Object]';\n}\n\nfunction isPrimitive(val) {\n  return typeof val === 'object' ? val === null : typeof val !== 'function';\n}\n","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n\nexport default function erfinv(x) {\n  let a = 0.147;\n  if (x === 0) return 0;\n  let ln1MinusXSqrd = Math.log(1 - x * x);\n  let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n  let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n  let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n  return secondSqrt * (x > 0 ? 1 : -1);\n}\n","import {\n  ROOT_2LN2,\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\nimport erfinv from '../util/erfinv';\n\nexport class Gaussian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=4*LN2/(PI*FWHM)] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.sd\n      ? Gaussian.widthToFWHM(2 * options.sd)\n      : options.fwhm\n      ? options.fwhm\n      : 500;\n    this.height =\n      options.height === undefined\n        ? Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI) / this.fwhm\n        : options.height;\n  }\n  /**\n   * Calculate a gaussian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = 6] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a gaussian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of gaussian with the current parameters.\n   */\n  fct(x) {\n    return Gaussian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Gaussian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Gaussian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} width - Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    //https://mathworld.wolfram.com/GaussianFunction.html\n    return Gaussian.widthToFWHM(width);\n  }\n\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @returns {number} width\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Gaussian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nGaussian.fct = function fct(x, fwhm = 500) {\n  return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} width - Width between the inflection points\n * @returns {number} fwhm\n */\nGaussian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_2LN2;\n};\n\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} fwhm - Full Width at Half Maximum.\n * @returns {number} width\n */\nGaussian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_2LN2;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {object} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\n\nGaussian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n  return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nGaussian.getFactor = function getFactor(area = 0.9999) {\n  return Math.sqrt(2) * erfinv(area);\n};\n","import { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=2/(PI*FWHM)] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined ? 2 / Math.PI / this.fwhm : options.height;\n  }\n  /**\n   * Calculate a lorentzian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a lorentzian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of lorentzian with the current parameters.\n   */\n  fct(x) {\n    return Lorentzian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Lorentzian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Lorentzian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [fwhm] - Full Width at Half Maximum.\n   * @returns {number} width between the inflection points\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Lorentzian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [width] Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    return Lorentzian.widthToFWHM(width);\n  }\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nLorentzian.fct = function fct(x, fwhm) {\n  const squareFWHM = fwhm * fwhm;\n  return squareFWHM / (4 * Math.pow(x, 2) + squareFWHM);\n};\n\n/**\n * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [fwhm] - Full Width at Half Maximum.\n * @returns {number} width between the inflection points\n */\nLorentzian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_THREE;\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [width] Width between the inflection points\n * @returns {number} fwhm\n */\nLorentzian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_THREE;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nLorentzian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n\n  return (height * Math.PI * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nLorentzian.getFactor = function getFactor(area = 0.9999) {\n  return 2 * Math.tan(Math.PI * (area - 0.5));\n};\n","import {\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_2LN2_MINUS_ONE,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\n\nimport { Gaussian } from './Gaussian';\nimport { Lorentzian } from './Lorentzian';\n\nexport class PseudoVoigt {\n  /**\n   * @param {object} [options={}]\n   * @param {number} [options.height=1/(mu*FWHM/sqrt(4*LN2/PI)+(1-mu)*fwhm*PI*0.5)] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm=500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.mu=0.5] - ratio of gaussian contribution.\n   */\n\n  constructor(options = {}) {\n    this.mu = options.mu === undefined ? 0.5 : options.mu;\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined\n        ? 1 /\n          ((this.mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * this.fwhm +\n            ((1 - this.mu) * this.fwhm * Math.PI) / 2)\n        : options.height;\n  }\n\n  /**\n   * Calculate a linear combination of gaussian and lorentzian function width an same full width at half maximum\n   * @param { object } [options = {}]\n   * @param { number } [options.factor = 2 * Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm in the calculation of the length.Default covers 99.99 % of area.\n   * @param { number } [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return { object } - { fwhm, data<Float64Array>} - An with the number of points at half maximum and the array of y values covering the 99.99 % of the area.\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n    if (!length) {\n      length = Math.ceil(this.fwhm * factor);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n\n    let data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a linear combination of Gaussian and Lorentzian shapes where the full width at half maximum are the same for both kind of shapes (see README for equation).\n   * @param {number} [x] x value to calculate.\n   * @returns {number} - the y value of a pseudo voigt with the current parameters.\n   */\n\n  fct(x) {\n    return PseudoVoigt.fct(x, this.fwhm, this.mu);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999] - required area to be coverage\n   * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n   * @returns {number}\n   */\n  getFactor(area = 0.9999, mu = this.mu) {\n    return PseudoVoigt.getFactor(area, mu);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n  getArea() {\n    return PseudoVoigt.getArea(this.fwhm, { height: this.height, mu: this.mu });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n   * @param {number} width - width between the inflection points\n   * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n   * @returns {number} Full Width at Half Maximum (FMHM).\n   */\n  widthToFWHM(width, mu) {\n    return PseudoVoigt.widthToFWHM(width, mu);\n  }\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @param {number} [mu] - ratio of gaussian contribution.\n   * @returns {number} width between the inflection points.\n   */\n  fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n    return PseudoVoigt.fwhmToWidth(fwhm, mu);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n\n  /**\n   * set a new mu\n   * @param {number} mu - ratio of gaussian contribution.\n   */\n  setMu(mu) {\n    this.mu = mu;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @param {number} [mu=0.5] - ratio of gaussian contribution.\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nPseudoVoigt.fct = function fct(x, fwhm, mu = 0.5) {\n  return (1 - mu) * Lorentzian.fct(x, fwhm) + mu * Gaussian.fct(x, fwhm);\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n * @param {number} width - width between the inflection points\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} Full Width at Half Maximum (FMHM).\n */\nPseudoVoigt.widthToFWHM = function widthToFWHM(width, mu = 0.5) {\n  return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * @param {number} fwhm - Full Width at Half Maximum.\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} width between the inflection points.\n */\nPseudoVoigt.fwhmToWidth = function fwhmToWidth(fwhm, mu = 0.5) {\n  return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @param {number} [options.mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nPseudoVoigt.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1, mu = 0.5 } = options;\n  return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999] - required area to be coverage\n * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n * @returns {number}\n */\nPseudoVoigt.getFactor = function getFactor(area = 0.9999, mu = 0.5) {\n  return mu < 1 ? Lorentzian.getFactor(area) : Gaussian.getFactor(area);\n};\n","import { PseudoVoigt } from 'ml-peak-shape-generator';\n\n/**\n * This function calculates the spectrum as a sum of linear combination of gaussian and lorentzian functions. The pseudo voigt\n * parameters are divided in 4 batches. 1st: centers; 2nd: heights; 3th: widths; 4th: mu's ;\n * @param t Ordinate value\n * @param p Lorentzian parameters\n * @returns {*}\n */\n\nexport function sumOfGaussianLorentzians(p) {\n  return function (t) {\n    let nL = p.length / 4;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      result +=\n        p[i + nL] * PseudoVoigt.fct(t - p[i], p[i + nL * 2], p[i + nL * 3]);\n    }\n    return result;\n  };\n}\n","import { Gaussian } from 'ml-peak-shape-generator';\n/**\n * This function calculates the spectrum as a sum of gaussian functions. The Gaussian\n * parameters are divided in 3 batches. 1st: centers; 2nd: height; 3th: widths;\n * @param t Ordinate values\n * @param p Gaussian parameters\n * @returns {*}\n */\n\nexport function sumOfGaussians(p) {\n  return function (t) {\n    let nL = p.length / 3;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      result += p[i + nL] * Gaussian.fct(t - p[i], p[i + nL * 2]);\n    }\n    return result;\n  };\n}\n","import { Lorentzian } from 'ml-peak-shape-generator';\n\n/**\n * This function calculates the spectrum as a sum of lorentzian functions. The Lorentzian\n * parameters are divided in 3 batches. 1st: centers; 2nd: heights; 3th: widths;\n * @param t Ordinate values\n * @param p Lorentzian parameters\n * @returns {*}\n */\n\nexport function sumOfLorentzians(p) {\n  return function (t) {\n    let nL = p.length / 3;\n    let result = 0;\n    for (let i = 0; i < nL; i++) {\n      result += p[i + nL] * Lorentzian.fct(t - p[i], p[i + nL * 2]);\n    }\n    return result;\n  };\n}\n","import assignDeep from 'assign-deep';\nimport getMaxValue from 'ml-array-max';\n\nimport { sumOfGaussianLorentzians } from './shapes/sumOfGaussianLorentzians';\nimport { sumOfGaussians } from './shapes/sumOfGaussians';\nimport { sumOfLorentzians } from './shapes/sumOfLorentzians';\n\nexport function checkInput(data, peaks, options) {\n  let {\n    shape = { kind: 'gaussian' },\n    optimization = {\n      kind: 'lm',\n    },\n  } = options;\n\n  if (typeof shape.kind !== 'string') {\n    throw new Error('kind should be a string');\n  }\n\n  let kind = shape.kind.toLowerCase().replace(/[^a-z]/g, '');\n\n  let paramsFunc;\n  let defaultParameters;\n  switch (kind) {\n    case 'gaussian':\n      paramsFunc = sumOfGaussians;\n      defaultParameters = {\n        x: {\n          init: (peak) => peak.x,\n          max: (peak) => peak.x + peak.width * 2,\n          min: (peak) => peak.x - peak.width * 2,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        width: {\n          init: (peak) => peak.width,\n          max: (peak) => peak.width * 4,\n          min: (peak) => peak.width * 0.25,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n      };\n      break;\n    case 'lorentzian':\n      paramsFunc = sumOfLorentzians;\n      defaultParameters = {\n        x: {\n          init: (peak) => peak.x,\n          max: (peak) => peak.x + peak.width * 2,\n          min: (peak) => peak.x - peak.width * 2,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        width: {\n          init: (peak) => peak.width,\n          max: (peak) => peak.width * 4,\n          min: (peak) => peak.width * 0.25,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n      };\n      break;\n    case 'pseudovoigt':\n      paramsFunc = sumOfGaussianLorentzians;\n      defaultParameters = {\n        x: {\n          init: (peak) => peak.x,\n          max: (peak) => peak.x + peak.width * 2,\n          min: (peak) => peak.x - peak.width * 2,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        y: {\n          init: (peak) => peak.y,\n          max: () => 1.5,\n          min: () => 0,\n          gradientDifference: () => 1e-3,\n        },\n        width: {\n          init: (peak) => peak.width,\n          max: (peak) => peak.width * 4,\n          min: (peak) => peak.width * 0.25,\n          gradientDifference: (peak) => peak.width * 2e-3,\n        },\n        mu: {\n          init: (peak) => (peak.mu !== undefined ? peak.mu : 0.5),\n          min: () => 0,\n          max: () => 1,\n          gradientDifference: () => 0.01,\n        },\n      };\n      break;\n    default:\n      throw new Error('kind of shape is not supported');\n  }\n\n  let x = data.x;\n  let maxY = getMaxValue(data.y);\n  let y = new Array(x.length);\n  for (let i = 0; i < x.length; i++) {\n    y[i] = data.y[i] / maxY;\n  }\n\n  for (let i = 0; i < peaks.length; i++) {\n    peaks[i].y /= maxY;\n  }\n\n  let parameters = assignDeep({}, optimization.parameters, defaultParameters);\n\n  for (let key in parameters) {\n    for (let par in parameters[key]) {\n      if (!Array.isArray(parameters[key][par])) {\n        parameters[key][par] = [parameters[key][par]];\n      }\n      if (\n        parameters[key][par].length !== 1 &&\n        parameters[key][par].length !== peaks.length\n      ) {\n        throw new Error(`The length of ${key}-${par} is not correct`);\n      }\n      for (let index = 0; index < parameters[key][par].length; index++) {\n        if (typeof parameters[key][par][index] === 'number') {\n          let value = parameters[key][par][index];\n          parameters[key][par][index] = () => value;\n        }\n      }\n    }\n  }\n\n  optimization.parameters = parameters;\n\n  return {\n    y,\n    x,\n    maxY,\n    peaks,\n    paramsFunc,\n    optimization,\n  };\n}\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nexport default function checkOptions(data, parameterizedFunction, options) {\n  let {\n    timeout,\n    minValues,\n    maxValues,\n    initialValues,\n    weights = 1,\n    damping = 1e-2,\n    dampingStepUp = 11,\n    dampingStepDown = 9,\n    maxIterations = 100,\n    errorTolerance = 1e-7,\n    centralDifference = false,\n    gradientDifference = 10e-2,\n    improvementThreshold = 1e-3,\n  } = options;\n\n  if (damping <= 0) {\n    throw new Error('The damping option must be a positive number');\n  } else if (!data.x || !data.y) {\n    throw new Error('The data parameter must have x and y elements');\n  } else if (\n    !isArray(data.x) ||\n    data.x.length < 2 ||\n    !isArray(data.y) ||\n    data.y.length < 2\n  ) {\n    throw new Error(\n      'The data parameter elements must be an array with more than 2 points',\n    );\n  } else if (data.x.length !== data.y.length) {\n    throw new Error('The data parameter elements must have the same size');\n  }\n\n  let parameters =\n    initialValues || new Array(parameterizedFunction.length).fill(1);\n\n  let nbPoints = data.y.length;\n  let parLen = parameters.length;\n  maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n  minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n  if (maxValues.length !== minValues.length) {\n    throw new Error('minValues and maxValues must be the same size');\n  }\n\n  if (!isArray(parameters)) {\n    throw new Error('initialValues must be an array');\n  }\n\n  if (typeof gradientDifference === 'number') {\n    gradientDifference = new Array(parameters.length).fill(gradientDifference);\n  } else if (isArray(gradientDifference)) {\n    if (gradientDifference.length !== parLen) {\n      gradientDifference = new Array(parLen).fill(gradientDifference[0]);\n    }\n  } else {\n    throw new Error(\n      'gradientDifference should be a number or array with length equal to the number of parameters',\n    );\n  }\n\n  let filler;\n  if (typeof weights === 'number') {\n    let value = 1 / weights ** 2;\n    filler = () => value;\n  } else if (isArray(weights)) {\n    if (weights.length < data.x.length) {\n      let value = 1 / weights[0] ** 2;\n      filler = () => value;\n    } else {\n      filler = (i) => 1 / weights[i] ** 2;\n    }\n  } else {\n    throw new Error(\n      'weights should be a number or array with length equal to the number of data points',\n    );\n  }\n\n  let checkTimeout;\n  if (timeout !== undefined) {\n    if (typeof timeout !== 'number') {\n      throw new Error('timeout should be a number');\n    }\n    let endTime = Date.now() + timeout * 1000;\n    checkTimeout = () => Date.now() > endTime;\n  } else {\n    checkTimeout = () => false;\n  }\n\n  let weightSquare = new Array(data.x.length);\n  for (let i = 0; i < nbPoints; i++) {\n    weightSquare[i] = filler(i);\n  }\n\n  return {\n    checkTimeout,\n    minValues,\n    maxValues,\n    parameters,\n    weightSquare,\n    damping,\n    dampingStepUp,\n    dampingStepDown,\n    maxIterations,\n    errorTolerance,\n    centralDifference,\n    gradientDifference,\n    improvementThreshold,\n  };\n}\n","/**\n * the sum of the weighted squares of the errors (or weighted residuals) between the data.y\n * and the curve-fit function.\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {Array} weightSquare - Square of weights\n * @return {number}\n */\nexport default function errorCalculation(\n  data,\n  parameters,\n  parameterizedFunction,\n  weightSquare,\n) {\n  let error = 0;\n  const func = parameterizedFunction(parameters);\n  for (let i = 0; i < data.x.length; i++) {\n    error += Math.pow(data.y[i] - func(data.x[i]), 2) / weightSquare[i];\n  }\n\n  return error;\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\nimport gradientFunction from './gradientFunction';\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n  const m = data.x.length;\n\n  let ans = new Matrix(m, 1);\n\n  for (let point = 0; point < m; point++) {\n    ans.set(point, 0, data.y[point] - evaluatedData[point]);\n  }\n  return ans;\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n  data,\n  params,\n  damping,\n  gradientDifference,\n  parameterizedFunction,\n  centralDifference,\n  weights,\n) {\n  let value = damping;\n  let identity = Matrix.eye(params.length, params.length, value);\n\n  const func = parameterizedFunction(params);\n\n  let evaluatedData = new Float64Array(data.x.length);\n  for (let i = 0; i < data.x.length; i++) {\n    evaluatedData[i] = func(data.x[i]);\n  }\n\n  let gradientFunc = gradientFunction(\n    data,\n    evaluatedData,\n    params,\n    gradientDifference,\n    parameterizedFunction,\n    centralDifference,\n  );\n  let residualError = matrixFunction(data, evaluatedData);\n\n  let inverseMatrix = inverse(\n    identity.add(\n      gradientFunc.mmul(\n        gradientFunc.transpose().scale('row', { scale: weights }),\n      ),\n    ),\n  );\n\n  let jacobianWeigthResidualError = gradientFunc.mmul(\n    residualError.scale('row', { scale: weights }),\n  );\n\n  let perturbations = inverseMatrix.mmul(jacobianWeigthResidualError);\n\n  return {\n    perturbations,\n    jacobianWeigthResidualError,\n  };\n}\n","import { Matrix } from 'ml-matrix';\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number|array} gradientDifference - The step size to approximate the jacobian matrix\n * @param {boolean} centralDifference - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\n\nexport default function gradientFunction(\n  data,\n  evaluatedData,\n  params,\n  gradientDifference,\n  paramFunction,\n  centralDifference,\n) {\n  const nbParams = params.length;\n  const nbPoints = data.x.length;\n  let ans = Matrix.zeros(nbParams, nbPoints);\n\n  let rowIndex = 0;\n  for (let param = 0; param < nbParams; param++) {\n    if (gradientDifference[param] === 0) continue;\n    let delta = gradientDifference[param];\n    let auxParams = params.slice();\n    auxParams[param] += delta;\n    let funcParam = paramFunction(auxParams);\n    if (!centralDifference) {\n      for (let point = 0; point < nbPoints; point++) {\n        ans.set(\n          rowIndex,\n          point,\n          (evaluatedData[point] - funcParam(data.x[point])) / delta,\n        );\n      }\n    } else {\n      auxParams = params.slice();\n      auxParams[param] -= delta;\n      delta *= 2;\n      let funcParam2 = paramFunction(auxParams);\n      for (let point = 0; point < nbPoints; point++) {\n        ans.set(\n          rowIndex,\n          point,\n          (funcParam2(data.x[point]) - funcParam(data.x[point])) / delta,\n        );\n      }\n    }\n    rowIndex++;\n  }\n\n  return ans;\n}\n","import checkOptions from './checkOptions';\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number|array} [options.weights = 1] - weighting vector, if the length does not match with the number of data points, the vector is reconstructed with first value.\n * @param {number} [options.damping = 1e-2] - Levenberg-Marquardt parameter, small values of the damping parameter λ result in a Gauss-Newton update and large\nvalues of λ result in a gradient descent update\n * @param {number} [options.dampingStepDown = 9] - factor to reduce the damping (Levenberg-Marquardt parameter) when there is not an improvement when updating parameters.\n * @param {number} [options.dampingStepUp = 11] - factor to increase the damping (Levenberg-Marquardt parameter) when there is an improvement when updating parameters.\n * @param {number} [options.improvementThreshold = 1e-3] - the threshold to define an improvement through an update of parameters\n * @param {number|array} [options.gradientDifference = 10e-2] - The step size to approximate the jacobian matrix\n * @param {boolean} [options.centralDifference = false] - If true the jacobian matrix is approximated by central differences otherwise by forward differences\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point.\n * @param {number} [options.timeout] - maximum time running before throw in seconds.\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n  data,\n  parameterizedFunction,\n  options = {},\n) {\n  let {\n    checkTimeout,\n    minValues,\n    maxValues,\n    parameters,\n    weightSquare,\n    damping,\n    dampingStepUp,\n    dampingStepDown,\n    maxIterations,\n    errorTolerance,\n    centralDifference,\n    gradientDifference,\n    improvementThreshold,\n  } = checkOptions(data, parameterizedFunction, options);\n\n  let error = errorCalculation(\n    data,\n    parameters,\n    parameterizedFunction,\n    weightSquare,\n  );\n\n  let converged = error <= errorTolerance;\n\n  let iteration = 0;\n  for (; iteration < maxIterations && !converged; iteration++) {\n    let previousError = error;\n\n    let { perturbations, jacobianWeigthResidualError } = step(\n      data,\n      parameters,\n      damping,\n      gradientDifference,\n      parameterizedFunction,\n      centralDifference,\n      weightSquare,\n    );\n\n    for (let k = 0; k < parameters.length; k++) {\n      parameters[k] = Math.min(\n        Math.max(minValues[k], parameters[k] - perturbations.get(k, 0)),\n        maxValues[k],\n      );\n    }\n\n    error = errorCalculation(\n      data,\n      parameters,\n      parameterizedFunction,\n      weightSquare,\n    );\n\n    if (isNaN(error)) break;\n\n    let improvementMetric =\n      (previousError - error) /\n      perturbations\n        .transpose()\n        .mmul(perturbations.mulS(damping).add(jacobianWeigthResidualError))\n        .get(0, 0);\n\n    if (improvementMetric > improvementThreshold) {\n      damping = Math.max(damping / dampingStepDown, 1e-7);\n    } else {\n      error = previousError;\n      damping = Math.min(damping * dampingStepUp, 1e7);\n    }\n\n    if (checkTimeout()) {\n      throw new Error(\n        `The execution time is over to ${options.timeout} seconds`,\n      );\n    }\n\n    converged = error <= errorTolerance;\n  }\n\n  return {\n    parameterValues: parameters,\n    parameterError: error,\n    iterations: iteration,\n  };\n}\n","import LM from 'ml-levenberg-marquardt';\n\nconst LEVENBERG_MARQUARDT = 1;\n\nexport function selectMethod(optimizationOptions = {}) {\n  let { kind, options } = optimizationOptions;\n  kind = getKind(kind);\n  switch (kind) {\n    case LEVENBERG_MARQUARDT:\n      return {\n        algorithm: LM,\n        optimizationOptions: checkOptions(kind, options),\n      };\n    default:\n      throw new Error(`Unknown kind algorithm`);\n  }\n}\n\nfunction checkOptions(kind, options = {}) {\n  // eslint-disable-next-line default-case\n  switch (kind) {\n    case LEVENBERG_MARQUARDT:\n      return Object.assign({}, lmOptions, options);\n  }\n}\n\nfunction getKind(kind) {\n  if (typeof kind !== 'string') return kind;\n  switch (kind.toLowerCase().replace(/[^a-z]/g, '')) {\n    case 'lm':\n    case 'levenbergmarquardt':\n      return LEVENBERG_MARQUARDT;\n    default:\n      throw new Error(`Unknown kind algorithm`);\n  }\n}\n\nconst lmOptions = {\n  damping: 1.5,\n  maxIterations: 100,\n  errorTolerance: 1e-8,\n};\n","import { checkInput } from './checkInput';\nimport { selectMethod } from './selectMethod';\n\n// const STATE_INIT = 0;\n// const STATE_MIN = 1;\n// const STATE_MAX = 2;\n// const STATE_GRADIENT_DIFFERENCE = 3;\n\n// const X = 0;\n// const Y = 1;\n// const WIDTH = 2;\n// const MU = 3;\n\n// const keys = ['x', 'y', 'width', 'mu'];\n/**\n * Fits a set of points to the sum of a set of bell functions.\n * @param {object} data - An object containing the x and y data to be fitted.\n * @param {array} peaks - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options = {}]\n * @param {object} [options.shape={}] - it's specify the kind of shape used to fitting.\n * @param {string} [options.shape.kind = 'gaussian'] - kind of shape; lorentzian, gaussian and pseudovoigt are supported.\n * @param {object} [options.optimization = {}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {object} [options.optimization.kind = 'lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {object} [options.optimization.parameters] - options of each parameter to be optimized e.g. For a gaussian shape\n *  it could have x, y and with properties, each of which could contain init, min, max and gradientDifference, those options will define the guess,\n *  the min and max value of the parameter (search space) and the step size to approximate the jacobian matrix respectively. Those options could be a number,\n *  array of numbers, callback, or array of callbacks. Each kind of shape has default parameters so it could be undefined.\n * @param {object} [options.optimization.parameters.x] - options for x parameter.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.init] - definition of the starting point of the parameter (the guess),\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the guess of the first peak and so on.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.min] - definition of the lower limit of the parameter,\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the min of the first peak and so on.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.max] - definition of the upper limit of the parameter,\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the max of the first peak and so on.\n * @param {number|callback|array<number|callback>} [options.optimization.parameters.x.gradientDifference] - definition of  the step size to approximate the jacobian matrix of the parameter,\n *  if it is a callback the method pass the peak as the unique input, if it is an array the first element define the gradientDifference of the first peak and so on.\n * @param {object} [options.optimization.options = {}] - options for the specific kind of algorithm.\n * @param {number} [options.optimization.options.timeout] - maximum time running before break in seconds.\n * @param {number} [options.optimization.options.damping=1.5]\n * @param {number} [options.optimization.options.maxIterations=100]\n * @param {number} [options.optimization.options.errorTolerance=1e-8]\n * @returns {object} - A object with fitting error and the list of optimized parameters { parameters: [ {x, y, width} ], error } if the kind of shape is pseudoVoigt mu parameter is optimized.\n */\nexport function optimize(data, peakList, options = {}) {\n  const { y, x, maxY, peaks, paramsFunc, optimization } = checkInput(\n    data,\n    peakList,\n    options,\n  );\n\n  let parameters = optimization.parameters;\n\n  let nbShapes = peaks.length;\n  let parameterKey = Object.keys(parameters);\n  let nbParams = nbShapes * parameterKey.length;\n  let pMin = new Float64Array(nbParams);\n  let pMax = new Float64Array(nbParams);\n  let pInit = new Float64Array(nbParams);\n  let gradientDifference = new Float64Array(nbParams);\n\n  for (let i = 0; i < nbShapes; i++) {\n    let peak = peaks[i];\n    for (let k = 0; k < parameterKey.length; k++) {\n      let key = parameterKey[k];\n      let init = parameters[key].init;\n      let min = parameters[key].min;\n      let max = parameters[key].max;\n      let gradientDifferenceValue = parameters[key].gradientDifference;\n      pInit[i + k * nbShapes] = init[i % init.length](peak);\n      pMin[i + k * nbShapes] = min[i % min.length](peak);\n      pMax[i + k * nbShapes] = max[i % max.length](peak);\n      gradientDifference[i + k * nbShapes] = gradientDifferenceValue[\n        i % gradientDifferenceValue.length\n      ](peak);\n    }\n  }\n\n  let { algorithm, optimizationOptions } = selectMethod(optimization);\n\n  optimizationOptions.minValues = pMin;\n  optimizationOptions.maxValues = pMax;\n  optimizationOptions.initialValues = pInit;\n  optimizationOptions.gradientDifference = gradientDifference;\n\n  let pFit = algorithm({ x, y }, paramsFunc, optimizationOptions);\n\n  let { parameterError: error, iterations } = pFit;\n  let result = { error, iterations, peaks };\n  for (let i = 0; i < nbShapes; i++) {\n    pFit.parameterValues[i + nbShapes] *= maxY;\n    for (let k = 0; k < parameterKey.length; k++) {\n      // we modify the optimized parameters\n      peaks[i][parameterKey[k]] = pFit.parameterValues[i + k * nbShapes];\n    }\n  }\n\n  return result;\n}\n","import median from 'ml-array-median';\n\nimport { xAbsolute } from './xAbsolute';\n/**\n * This function calculates the median after taking the reimAbsolute values of the points\n * @param {Array<Number>} array - the array that will be rotated\n * @return {Number}\n */\nexport function xAbsoluteMedian(array) {\n  return median(xAbsolute(array));\n}\n","/**\n * This function returns an array with absolute values\n * @param {Array<Number>} array\n * @return {Number}\n */\nexport function xAbsolute(array) {\n  let tmpArray = array.slice();\n  for (let i = 0; i < tmpArray.length; i++) {\n    if (tmpArray[i] < 0) tmpArray[i] *= -1;\n  }\n\n  return tmpArray;\n}\n","/**\n * Returns the closest index of a `target` in an ordered array\n * @param {array<Number>} array\n * @param {number} target\n */\n\nexport function xFindClosestIndex(array, target) {\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    } else if (array[middle] > target) {\n      high = middle;\n    } else {\n      return middle;\n    }\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    } else {\n      return low + 1;\n    }\n  } else {\n    return low;\n  }\n}\n","import { xFindClosestIndex } from './xFindClosestIndex';\n\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param {array} x\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n */\n\nexport function xGetFromToIndex(x, options = {}) {\n  let { fromIndex, toIndex, from, to } = options;\n\n  if (fromIndex === undefined) {\n    if (from !== undefined) {\n      fromIndex = xFindClosestIndex(x, from);\n    } else {\n      fromIndex = 0;\n    }\n  }\n  if (toIndex === undefined) {\n    if (to !== undefined) {\n      toIndex = xFindClosestIndex(x, to);\n    } else {\n      toIndex = x.length - 1;\n    }\n  }\n  if (fromIndex > toIndex) [fromIndex, toIndex] = [toIndex, fromIndex];\n  return { fromIndex, toIndex };\n}\n","/* eslint-disable no-loss-of-precision */\n\n/*\nAdapted from: https://github.com/compute-io/erfcinv/blob/aa116e23883839359e310ad41a7c42f72815fc1e/lib/number.js\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2015 The Compute.io Authors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the \"Software\") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Coefficients for erfcinv on [0, 0.5]:\nconst Y1 = 8.91314744949340820313e-2;\nconst P1 = [\n  -5.38772965071242932965e-3, 8.22687874676915743155e-3,\n  2.19878681111168899165e-2, -3.65637971411762664006e-2,\n  -1.26926147662974029034e-2, 3.34806625409744615033e-2,\n  -8.36874819741736770379e-3, -5.08781949658280665617e-4,\n];\nconst Q1 = [\n  8.86216390456424707504e-4, -2.33393759374190016776e-3,\n  7.95283687341571680018e-2, -5.27396382340099713954e-2,\n  -7.1228902341542847553e-1, 6.62328840472002992063e-1, 1.56221558398423026363,\n  -1.56574558234175846809, -9.70005043303290640362e-1, 1,\n];\n\n// Coefficients for erfcinv for 0.5 > 1-x >= 0:\nconst Y2 = 2.249481201171875;\nconst P2 = [\n  -3.67192254707729348546, 2.11294655448340526258e1, 1.7445385985570866523e1,\n  -4.46382324441786960818e1, -1.88510648058714251895e1,\n  1.76447298408374015486e1, 8.37050328343119927838, 1.05264680699391713268e-1,\n  -2.02433508355938759655e-1,\n];\nconst Q2 = [\n  1.72114765761200282724, -2.26436933413139721736e1, 1.08268667355460159008e1,\n  4.85609213108739935468e1, -2.01432634680485188801e1,\n  -2.86608180499800029974e1, 3.9713437953343869095, 6.24264124854247537712, 1,\n];\n\n// Coefficients for erfcinv for sqrt( -log(1-x)):\nconst Y3 = 8.07220458984375e-1;\nconst P3 = [\n  -6.81149956853776992068e-10, 2.85225331782217055858e-8,\n  -6.79465575181126350155e-7, 2.14558995388805277169e-3,\n  2.90157910005329060432e-2, 1.42869534408157156766e-1,\n  3.37785538912035898924e-1, 3.87079738972604337464e-1,\n  1.17030156341995252019e-1, -1.63794047193317060787e-1,\n  -1.31102781679951906451e-1,\n];\nconst Q3 = [\n  1.105924229346489121e-2, 1.52264338295331783612e-1, 8.48854343457902036425e-1,\n  2.59301921623620271374, 4.77846592945843778382, 5.38168345707006855425,\n  3.46625407242567245975, 1,\n];\n\nconst Y4 = 9.3995571136474609375e-1;\nconst P4 = [\n  2.66339227425782031962e-12, -2.30404776911882601748e-10,\n  4.60469890584317994083e-6, 1.57544617424960554631e-4,\n  1.87123492819559223345e-3, 9.50804701325919603619e-3,\n  1.85573306514231072324e-2, -2.22426529213447927281e-3,\n  -3.50353787183177984712e-2,\n];\nconst Q4 = [\n  7.64675292302794483503e-5, 2.63861676657015992959e-3,\n  3.41589143670947727934e-2, 2.20091105764131249824e-1,\n  7.62059164553623404043e-1, 1.3653349817554063097, 1,\n];\n\nconst Y5 = 9.8362827301025390625e-1;\nconst P5 = [\n  9.9055709973310326855e-17, -2.81128735628831791805e-14,\n  4.62596163522878599135e-9, 4.49696789927706453732e-7,\n  1.49624783758342370182e-5, 2.09386317487588078668e-4,\n  1.05628862152492910091e-3, -1.12951438745580278863e-3,\n  -1.67431005076633737133e-2,\n];\nconst Q5 = [\n  2.82243172016108031869e-7, 2.75335474764726041141e-5,\n  9.64011807005165528527e-4, 1.60746087093676504695e-2,\n  1.38151865749083321638e-1, 5.91429344886417493481e-1, 1,\n];\n\nfunction polyval(c, x) {\n  let p = 0;\n  for (const coef of c) {\n    p = p * x + coef;\n  }\n  return p;\n}\n\n/**\n * Calculates a rational approximation.\n *\n * @private\n * @param {Number} x\n * @param {Number} v\n * @param {Array} P - array of polynomial coefficients\n * @param {Array} Q - array of polynomial coefficients\n * @param {Number} Y\n * @returns {Number} rational approximation\n */\nfunction calc(x, v, P, Q, Y) {\n  const s = x - v;\n  const r = polyval(P, s) / polyval(Q, s);\n  return Y * x + r * x;\n}\n\n/**\n * Evaluates the complementary inverse error function for an input value.\n *\n * @private\n * @param {Number} x - input value\n * @returns {Number} evaluated complementary inverse error function\n */\nexport default function erfcinv(x) {\n  let sign = false;\n  let val;\n  let q;\n  let g;\n  let r;\n\n  // [1] Special cases...\n\n  // NaN:\n  if (Number.isNaN(x)) {\n    return NaN;\n  }\n  // x not on the interval: [0,2]\n  if (x < 0 || x > 2) {\n    throw new RangeError(\n      `erfcinv()::invalid input argument. Value must be on the interval [0,2]. Value: \\`${x}\\`.`,\n    );\n  }\n  if (x === 0) {\n    return Number.POSITIVE_INFINITY;\n  }\n  if (x === 2) {\n    return Number.NEGATIVE_INFINITY;\n  }\n  if (x === 1) {\n    return 0;\n  }\n  // [2] Get the sign and make use of `erfc` reflection formula: `erfc(-z)=2 - erfc(z)`...\n  if (x > 1) {\n    q = 2 - x;\n    x = 1 - q;\n    sign = true;\n  } else {\n    q = x;\n    x = 1 - x;\n  }\n  // [3] |x| <= 0.5\n  if (x <= 0.5) {\n    g = x * (x + 10);\n    r = polyval(P1, x) / polyval(Q1, x);\n    val = g * Y1 + g * r;\n    return sign ? -val : val;\n  }\n\n  // [4] 1-|x| >= 0.25\n  if (q >= 0.25) {\n    g = Math.sqrt(-2 * Math.log(q));\n    q = q - 0.25;\n    r = polyval(P2, q) / polyval(Q2, q);\n    val = g / (Y2 + r);\n    return sign ? -val : val;\n  }\n  q = Math.sqrt(-Math.log(q));\n\n  // [5] q < 3\n  if (q < 3) {\n    return calc(q, 1.125, P3, Q3, Y3);\n  }\n  // [6] q < 6\n  if (q < 6) {\n    return calc(q, 3, P4, Q4, Y4);\n  }\n  // Note that the smallest number in JavaScript is 5e-324. Math.sqrt( -Math.log( 5e-324 ) ) ~27.2844\n  return calc(q, 6, P5, Q5, Y5);\n\n  // Note that in the boost library, they are able to go to much smaller values, as 128 bit long doubles support ~1e-5000; something which JavaScript does not natively support.\n}\n","export default function rayleighCdf(x, sigma = 1) {\n  if (x < 0) {\n    return 0;\n  }\n  return -Math.expm1(-Math.pow(x, 2) / (2 * Math.pow(sigma, 2)));\n}\n","import fill from 'ml-array-sequential-fill';\nimport SplineInterpolator from 'spline-interpolator';\n\nimport erfcinv from './erfcinv';\nimport rayleighCdf from './rayleighCdf';\n\n/**\n * Determine noise level by san plot methodology (https://doi.org/10.1002/mrc.4882)\n * @param {Array} data - real or magnitude spectra data.\n * @param {object} [options = {}]\n * @param {array} [options.mask] - boolean array to filter data, if the i-th element is true then the i-th element of the distribution will be ignored.\n * @param {number} [options.scaleFactor=1] - factor to scale the data input[i]*=scaleFactor.\n * @param {number} [options.cutOff] - percent of positive signal distribution where the noise level will be determined, if it is not defined the program calculate it.\n * @param {number} [options.factorStd=5] - factor times std to determine what will be marked as signals.\n * @param {boolean} [options.refine=true] - if true the noise level will be recalculated get out the signals using factorStd.\n * @param {boolean} [options.fixOffset=true] - If the baseline is correct, the midpoint of distribution should be zero. if true, the distribution will be centered.\n * @param {number} [options.logBaseY=2] - log scale to apply in the intensity axis in order to avoid big numbers.\n */\n\nexport function xNoiseSanPlot(data, options = {}) {\n  const {\n    mask,\n    cutOff,\n    refine = true,\n    magnitudeMode = false,\n    scaleFactor = 1,\n    factorStd = 5,\n    fixOffset = true,\n  } = options;\n\n  let input;\n  if (Array.isArray(mask) && mask.length === data.length) {\n    input = new Float64Array(data.filter((_e, i) => !mask[i]));\n  } else {\n    input = new Float64Array(data);\n  }\n\n  if (scaleFactor > 1) {\n    for (let i = 0; i < input.length; i++) {\n      input[i] *= scaleFactor;\n    }\n  }\n  input = input.sort().reverse();\n\n  if (fixOffset && !magnitudeMode) {\n    let medianIndex = Math.floor(input.length / 2);\n    let median = 0.5 * (input[medianIndex] + input[medianIndex + 1]);\n    for (let i = 0; i < input.length; i++) {\n      input[i] -= median;\n    }\n  }\n\n  let firstNegativeValueIndex =\n    input[input.length - 1] >= 0 ? input.length : input.findIndex((e) => e < 0);\n  let lastPositiveValueIndex = firstNegativeValueIndex - 1;\n  for (let i = lastPositiveValueIndex; i >= 0; i--) {\n    if (input[i] > 0) {\n      lastPositiveValueIndex = i;\n      break;\n    }\n  }\n\n  let signPositive = input.slice(0, lastPositiveValueIndex + 1);\n  let signNegative = input.slice(firstNegativeValueIndex);\n\n  let cutOffDist = cutOff || determineCutOff(signPositive, { magnitudeMode });\n\n  let pIndex = Math.floor(signPositive.length * cutOffDist);\n  let initialNoiseLevelPositive = signPositive[pIndex];\n\n  let skyPoint = signPositive[0];\n\n  let initialNoiseLevelNegative;\n  if (signNegative.length > 0) {\n    let nIndex = Math.floor(signNegative.length * (1 - cutOffDist));\n    initialNoiseLevelNegative = -1 * signNegative[nIndex];\n  } else {\n    initialNoiseLevelNegative = 0;\n  }\n\n  let noiseLevelPositive = initialNoiseLevelPositive;\n  let noiseLevelNegative = initialNoiseLevelNegative;\n  let cloneSignPositive = signPositive.slice();\n  let cloneSignNegative = signNegative.slice();\n\n  let cutOffSignalsIndexPlus = 0;\n  let cutOffSignalsIndexNeg = 2;\n  if (refine) {\n    let cutOffSignals = noiseLevelPositive * factorStd;\n    cutOffSignalsIndexPlus = signPositive.findIndex((e) => e < cutOffSignals);\n\n    if (cutOffSignalsIndexPlus > -1) {\n      cloneSignPositive = signPositive.slice(cutOffSignalsIndexPlus);\n      noiseLevelPositive =\n        cloneSignPositive[Math.floor(cloneSignPositive.length * cutOffDist)];\n    }\n\n    cutOffSignals = noiseLevelNegative * factorStd;\n    cutOffSignalsIndexNeg = signNegative.findIndex((e) => e < cutOffSignals);\n    if (cutOffSignalsIndexNeg > -1) {\n      cloneSignNegative = signNegative.slice(cutOffSignalsIndexNeg);\n      noiseLevelNegative =\n        cloneSignPositive[\n          Math.floor(cloneSignNegative.length * (1 - cutOffDist))\n        ];\n    }\n  }\n  let correctionFactor = -simpleNormInv(cutOffDist / 2, { magnitudeMode });\n  initialNoiseLevelPositive = initialNoiseLevelPositive / correctionFactor;\n  initialNoiseLevelNegative = initialNoiseLevelNegative / correctionFactor;\n\n  let effectiveCutOffDist, refinedCorrectionFactor;\n\n  if (refine && cutOffSignalsIndexPlus > -1) {\n    effectiveCutOffDist =\n      (cutOffDist * cloneSignPositive.length + cutOffSignalsIndexPlus) /\n      (cloneSignPositive.length + cutOffSignalsIndexPlus);\n    refinedCorrectionFactor =\n      -1 * simpleNormInv(effectiveCutOffDist / 2, { magnitudeMode });\n\n    noiseLevelPositive /= refinedCorrectionFactor;\n\n    if (cutOffSignalsIndexNeg > -1) {\n      effectiveCutOffDist =\n        (cutOffDist * cloneSignNegative.length + cutOffSignalsIndexNeg) /\n        (cloneSignNegative.length + cutOffSignalsIndexNeg);\n      refinedCorrectionFactor =\n        -1 * simpleNormInv(effectiveCutOffDist / 2, { magnitudeMode });\n      if (noiseLevelNegative !== 0) {\n        noiseLevelNegative /= refinedCorrectionFactor;\n      }\n    }\n  } else {\n    noiseLevelPositive /= correctionFactor;\n    noiseLevelNegative /= correctionFactor;\n  }\n\n  return {\n    positive: noiseLevelPositive,\n    negative: noiseLevelNegative,\n    snr: skyPoint / noiseLevelPositive,\n    sanplot: generateSanPlot(input, {\n      fromTo: {\n        positive: { from: 0, to: lastPositiveValueIndex },\n        negative: { from: firstNegativeValueIndex, to: input.length },\n      },\n    }),\n  };\n}\n\nfunction determineCutOff(signPositive, options = {}) {\n  let {\n    magnitudeMode = false,\n    considerList = { from: 0.5, step: 0.1, to: 0.9 },\n  } = options;\n  //generate a list of values for\n  let cutOff = [];\n  let indexMax = signPositive.length - 1;\n  for (let i = 0.01; i <= 0.99; i += 0.01) {\n    let index = Math.round(indexMax * i);\n    let value =\n      -signPositive[index] / simpleNormInv([i / 2], { magnitudeMode });\n    cutOff.push([i, value]);\n  }\n\n  let minKi = Number.MAX_SAFE_INTEGER;\n  let { from, to, step } = considerList;\n  let delta = step / 2;\n  let whereToCutStat = 0.5;\n  for (let i = from; i <= to; i += step) {\n    let floor = i - delta;\n    let top = i + delta;\n    let elementsOfCutOff = cutOff.filter((e) => e[0] < top && e[0] > floor);\n    let averageValue = elementsOfCutOff.reduce((a, b) => a + Math.abs(b[1]), 0);\n    let kiSqrt = 0;\n    for (let j = 0; j < elementsOfCutOff.length; j++) {\n      kiSqrt += Math.pow(elementsOfCutOff[j][1] - averageValue, 2);\n    }\n\n    if (kiSqrt < minKi) {\n      minKi = kiSqrt;\n      whereToCutStat = i;\n    }\n  }\n\n  return whereToCutStat;\n}\n\nfunction simpleNormInv(data, options = {}) {\n  const { magnitudeMode = false } = options;\n\n  if (!Array.isArray(data)) data = [data];\n\n  let from = 0;\n  let to = 2;\n  let step = 0.01;\n  let xTraining = createArray(from, to, step);\n\n  let result = new Float64Array(data.length);\n  let yTraining = new Float64Array(xTraining.length);\n  if (magnitudeMode) {\n    let factor = 1;\n    for (let i = 0; i < yTraining.length; i++) {\n      let finalInput = xTraining[i] * factor;\n      yTraining[i] = 1 - rayleighCdf(finalInput);\n    }\n    let interp = new SplineInterpolator(xTraining, yTraining);\n    for (let i = 0; i < result.length; i++) {\n      let yValue = 2 * data[i];\n      result[i] = -1 * interp.interpolate(yValue);\n    }\n  } else {\n    for (let i = 0; i < result.length; i++) {\n      result[i] = -1 * Math.SQRT2 * erfcinv(2 * data[i]);\n    }\n  }\n  return result.length === 1 ? result[0] : result;\n}\n\nfunction createArray(from, to, step) {\n  let result = new Array(Math.abs((from - to) / step + 1));\n  for (let i = 0; i < result.length; i++) {\n    result[i] = from + i * step;\n  }\n  return result;\n}\n\nfunction generateSanPlot(array, options = {}) {\n  const { fromTo, logBaseY = 2 } = options;\n\n  let sanplot = {};\n  for (let key in fromTo) {\n    let { from, to } = fromTo[key];\n    sanplot[key] =\n      from !== to\n        ? scale(array.slice(from, to), {\n            logBaseY,\n          })\n        : { x: [], y: [] };\n    if (key === 'negative') {\n      sanplot[key].y.reverse();\n    }\n  }\n  return sanplot;\n}\n\nfunction scale(array, options = {}) {\n  const { log10, abs } = Math;\n  const { logBaseY } = options;\n  if (logBaseY) {\n    array = array.slice();\n    const logOfBase = log10(logBaseY);\n    for (let i = 0; i < array.length; i++) {\n      array[i] = log10(abs(array[i])) / logOfBase;\n    }\n  }\n\n  const xAxis = fill({\n    from: 0,\n    to: array.length - 1,\n    size: array.length,\n  });\n\n  return { x: xAxis, y: array };\n}\n","import isAnyArray from 'is-any-array';\n\n/**\n * Throw an error in no an object of x,y arrays\n * @param {DataXY} [data={}]\n */\nexport function xyCheck(data = {}) {\n  if (!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 mush have the same length');\n  }\n}\n","/**\n * Normalize an array of zones:\n * - ensure than from < to\n * - merge overlapping zones\n * @param {Array<Zone>} [zones=[]]\n * @param {object} [options={}]\n * @param {number} [options.from=Number.MIN_VALUE]\n * @param {number} [options.to=Number.MAX_VALUE]\n */\n\nexport function zonesNormalize(zones = [], options = {}) {\n  if (zones.length === 0) return [];\n  zones = JSON.parse(JSON.stringify(zones)).map((zone) =>\n    zone.from > zone.to ? { from: zone.to, to: zone.from } : zone,\n  );\n  let { from = Number.NEGATIVE_INFINITY, to = Number.POSITIVE_INFINITY } =\n    options;\n  if (from > to) {\n    [from, to] = [to, from];\n  }\n\n  zones = zones.sort((a, b) => {\n    if (a.from !== b.from) return a.from - b.from;\n    return a.to - b.to;\n  });\n\n  zones.forEach((zone) => {\n    if (from > zone.from) zone.from = from;\n    if (to < zone.to) zone.to = to;\n  });\n\n  zones = zones.filter((zone) => zone.from <= zone.to);\n  if (zones.length === 0) return [];\n\n  let currentZone = zones[0];\n  let result = [currentZone];\n  for (let zone of zones) {\n    if (zone.from <= currentZone.to) {\n      currentZone.to = zone.to;\n    } else {\n      currentZone = zone;\n      result.push(currentZone);\n    }\n  }\n  return result;\n}\n","import { zonesNormalize } from '../zones/zonesNormalize';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * xyExtract zones from a XY data\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {Array} [options.zones=[]]\n * @return {Array} Array of points\n */\n\nexport function xyExtract(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  let { zones } = options;\n\n  zones = zonesNormalize(zones);\n\n  if (!Array.isArray(zones) || zones.length === 0) return data;\n\n  let newX = [];\n  let newY = [];\n\n  let currentZone = zones[0];\n  let position = 0;\n  loop: for (let i = 0; i < x.length; i++) {\n    while (currentZone.to < x[i]) {\n      position++;\n      currentZone = zones[position];\n      if (!currentZone) {\n        i = x.length;\n        break loop;\n      }\n    }\n    if (x[i] >= currentZone.from) {\n      newX.push(x[i]);\n      newY.push(y[i]);\n    }\n  }\n  return { x: newX, y: newY };\n}\n","import { xGetFromToIndex } from '../x/xGetFromToIndex';\n\nimport { xyCheck } from './xyCheck';\n\n/**\n * Calculate integration\n * @param {DataXY} [data={}] - Object that contains property x (an ordered increasing array) and y (an array)\n * @param {object} [options={}]\n * @param {number} [options.from] - First value for xyIntegration in the X scale\n * @param {number} [options.fromIndex=0] - First point for xyIntegration\n * @param {number} [options.to] - Last value for xyIntegration in the X scale\n * @param {number} [options.toIndex=x.length-1] - Last point for xyIntegration\n * @return {number} xyIntegration value on the specified range\n */\n\nexport function xyIntegration(data = {}, options = {}) {\n  xyCheck(data);\n  const { x, y } = data;\n  if (x.length < 2) 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\n  return currentxyIntegration;\n}\n","/**\n * Group peaks based on factor and add group property in peaks\n * @param {array} peakList\n * @param {number} factor\n */\n\nexport function groupPeaks(peakList, factor = 1) {\n  if (peakList.length === 0) return [];\n  let peaks = peakList.sort((a, b) => a.x - b.x);\n\n  let previousPeak = { x: Number.NEGATIVE_INFINITY, width: 1 };\n  let currentGroup = [previousPeak];\n  let groups = [];\n\n  for (let peak of peaks) {\n    if (\n      (peak.x - previousPeak.x) / (peak.width + previousPeak.width) <=\n      factor / 2\n    ) {\n      currentGroup.push(peak);\n    } else {\n      currentGroup = [peak];\n      groups.push(currentGroup);\n    }\n    peak.group = groups.length - 1;\n    previousPeak = peak;\n  }\n\n  return groups;\n}\n","import { optimize } from 'ml-spectra-fitting';\nimport { xGetFromToIndex } from 'ml-spectra-processing';\n\nimport { groupPeaks } from './groupPeaks';\n\n/**\n * Optimize the position (x), max intensity (y), full width at half maximum (width)\n * and the ratio of gaussian contribution (mu) if it's required. It supports three kind of shapes: gaussian, lorentzian and pseudovoigt\n * @param {object} data - An object containing the x and y data to be fitted.\n * @param {Array} peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options = {}] -\n * @param {number} [options.factorWidth = 1] - times of width to group peaks.\n * @param {number} [options.factorLimits = 2] - times of width to use to optimize peaks\n * @param {object} [options.shape={}] - it's specify the kind of shape used to fitting.\n * @param {string} [options.shape.kind='gaussian'] - kind of shape; lorentzian, gaussian and pseudovoigt are supported.\n * @param {string} [options.shape.options={}] - options depending the kind of shape\n * @param {object} [options.optimization={}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {string} [options.optimization.kind='lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {object} [options.optimization.options={}] - options for the specific kind of algorithm.\n * @param {number} [options.optimization.options.timeout=10] - maximum time running before break in seconds.\n */\n\nexport function optimizePeaks(data, peakList, options = {}) {\n  const {\n    factorWidth = 1,\n    factorLimits = 2,\n    shape = {\n      kind: 'gaussian',\n    },\n    optimization = {\n      kind: 'lm',\n      options: {\n        timeout: 10,\n      },\n    },\n  } = options;\n\n  if (data.x[0] > data.x[1]) {\n    data.x.reverse();\n    data.y.reverse();\n  }\n\n  let groups = groupPeaks(peakList, factorWidth);\n\n  let results = [];\n  for (const peaks of groups) {\n    const firstPeak = peaks[0];\n    const lastPeak = peaks[peaks.length - 1];\n\n    const from = firstPeak.x - firstPeak.width * factorLimits;\n    const to = lastPeak.x + lastPeak.width * factorLimits;\n    const { fromIndex, toIndex } = xGetFromToIndex(data.x, { from, to });\n    // Multiple peaks\n    const currentRange = {\n      x: data.x.slice(fromIndex, toIndex),\n      y: data.y.slice(fromIndex, toIndex),\n    };\n    if (currentRange.x.length > 5) {\n      let { peaks: optimizedPeaks } = optimize(currentRange, peaks, {\n        shape,\n        optimization,\n      });\n      results = results.concat(optimizedPeaks);\n    } else {\n      results = results.concat(peaks);\n    }\n  }\n  return results;\n}\n","import { optimize } from 'ml-spectra-fitting';\n\n/**\n * This function try to join the peaks that seems to belong to a broad signal in a single broad peak.\n * @param {Array} peakList - A list of initial parameters to be optimized. e.g. coming from a peak picking [{x, y, width}].\n * @param {object} [options = {}] - options\n * @param {number} [options.width=0.25] - width limit to join peaks.\n * @param {object} [options.shape={}] - it's specify the kind of shape used to fitting.\n * @param {string} [options.shape.kind = 'gaussian'] - kind of shape; lorentzian, gaussian and pseudovoigt are supported.\n * @param {object} [options.optimization = {}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {string} [options.optimization.kind = 'lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {number} [options.optimization.options.timeout = 10] - maximum time running before break in seconds.\n * @param {object} [options.optimization.options = {}] - options for the specific kind of algorithm.\n */\nexport function joinBroadPeaks(peakList, options = {}) {\n  let {\n    width = 0.25,\n    shape = { kind: 'gaussian' },\n    optimization = { kind: 'lm', timeout: 10 },\n  } = options;\n  let broadLines = [];\n  // Optimize the possible broad lines\n  let max = 0;\n\n  let maxI = 0;\n\n  let count = 1;\n  for (let i = peakList.length - 1; i >= 0; i--) {\n    if (peakList[i].soft) {\n      broadLines.push(peakList.splice(i, 1)[0]);\n    }\n  }\n  // Push a feke peak\n  broadLines.push({ x: Number.MAX_VALUE });\n\n  let candidates = { x: [broadLines[0].x], y: [broadLines[0].y] };\n  let indexes = [0];\n  for (let i = 1; i < broadLines.length; i++) {\n    if (Math.abs(broadLines[i - 1].x - broadLines[i].x) < width) {\n      candidates.x.push(broadLines[i].x);\n      candidates.y.push(broadLines[i].y);\n      if (broadLines[i].y > max) {\n        max = broadLines[i].y;\n        maxI = i;\n      }\n      indexes.push(i);\n      count++;\n    } else {\n      if (count > 2) {\n        let fitted = optimize(\n          candidates,\n          [\n            {\n              x: broadLines[maxI].x,\n              y: max,\n              width: Math.abs(\n                candidates.x[0] - candidates.x[candidates.x.length - 1],\n              ),\n            },\n          ],\n          { shape, optimization },\n        );\n        let { peaks: peak } = fitted;\n        peak[0].index = Math.floor(\n          indexes.reduce((a, b) => a + b, 0) / indexes.length,\n        );\n        peak[0].soft = false;\n        peakList.push(peak[0]);\n      } else {\n        // Put back the candidates to the signals list\n        indexes.forEach((index) => {\n          peakList.push(broadLines[index]);\n        });\n      }\n      candidates = { x: [broadLines[i].x], y: [broadLines[i].y] };\n      indexes = [i];\n      max = broadLines[i].y;\n      maxI = i;\n      count = 1;\n    }\n  }\n  peakList.sort((a, b) => {\n    return a.x - b.x;\n  });\n\n  return peakList;\n}\n","import { gsd, joinBroadPeaks, optimizePeaks } from 'ml-gsd';\nimport {\n  xyExtract,\n  xNoiseSanPlot,\n  xAbsoluteMedian,\n} from 'ml-spectra-processing';\n/**\n * Implementation of the peak picking method described by Cobas in:\n * A new approach to improving automated analysis of proton NMR spectra\n * through Global Spectral Deconvolution (GSD)\n * http://www.spectrosco-pyeurope.com/images/stories/ColumnPDFs/TD_23_1.pdf\n * @param {DataXY} data - Object of kind\n * @param {object} [options={}] - options object with some parameter for GSD.\n * @param {number} [options.minMaxRatio = 0.01] - Threshold to determine if a given peak should be considered as a noise, bases on its relative height compared to the highest peak.\n * @param {number} [options.broadRatio = 0.00025] - If broadRatio is higher than 0, then all the peaks which second derivative smaller than broadRatio * maxAbsSecondDerivative will be marked with the soft mask equal to true.\n * @param {number} [options.broadWidth = 0.25] - Threshold to determine if some peak is candidate to clustering into range.\n * @param {number} [options.thresholdFactor=3] - the factor that multiplies the noise level to set up a threshold to select peaks with respect to the intensity.\n * @param {number} [options.noiseLevel = median(data.y) * (options.thresholdFactor || 3)] - Noise threshold in spectrum y units. Default is three/thresholdFactor times the absolute median of data.y.\n * @param {number} [options.factorWidth = 4] - factor to determine the width at the moment to group the peaks in signals in 'GSD.optimizePeaks' function.\n * @param {object} [options.shape={}] - it's specify the kind of shape used to fitting.\n * @param {string} [options.shape.kind = 'gaussian'] - kind of shape; lorentzian, gaussian and pseudovoigt are supported.\n * @param {object} [options.optimization = {}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {string} [options.optimization.kind = 'lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {object} [options.optimization.options = {}] - options for the specific kind of algorithm.\n * @param {Boolean} [options.smoothY = true] - Select the peak intensities from a smoothed version of the independent variables?\n * @param {Boolean} [options.optimize = true] - if it's true adjust an train of gaussian or lorentzian shapes to spectrum.\n * @return {Array}\n */\n\nexport function xyAutoPeaksPicking(data, options = {}) {\n  const {\n    from,\n    to,\n    noiseLevel,\n    thresholdFactor = 3,\n    minMaxRatio = 0.05,\n    broadRatio = 0.00025,\n    useSanPlot = false,\n    smoothY = true,\n    optimize = false,\n    factorWidth = 4,\n    realTopDetection = true,\n    shape = { kind: 'gaussian' },\n    optimization = { kind: 'lm' },\n    broadWidth = 0.25,\n    lookNegative = false,\n    sgOptions = { windowSize: 9, polynomial: 3 },\n  } = options;\n\n  if (from !== undefined && to !== undefined) {\n    data = xyExtract(data, [{ from, to }]);\n  }\n\n  const cutOff = getCutOff(data.y, { noiseLevel, useSanPlot, thresholdFactor });\n\n  let getPeakOptions = {\n    shape,\n    broadWidth,\n    optimize,\n    factorWidth,\n    sgOptions,\n    minMaxRatio,\n    broadRatio,\n    noiseLevel: cutOff.positive,\n    smoothY,\n    optimization,\n    realTopDetection,\n  };\n\n  let peaks = getPeakList(data, getPeakOptions);\n\n  if (lookNegative) {\n    getPeakOptions.noiseLevel = cutOff.negative;\n    peaks.push(...getNegativePeaks(data, getPeakOptions));\n  }\n\n  return peaks;\n}\n\nfunction getPeakList(data, options) {\n  const {\n    shape,\n    broadWidth,\n    optimize,\n    factorWidth,\n    sgOptions,\n    minMaxRatio,\n    broadRatio,\n    noiseLevel,\n    smoothY,\n    optimization,\n    realTopDetection,\n  } = options;\n\n  let peakList = gsd(data, {\n    sgOptions,\n    minMaxRatio,\n    broadRatio,\n    noiseLevel,\n    smoothY,\n    realTopDetection,\n  });\n\n  if (broadWidth) {\n    peakList = joinBroadPeaks(peakList, {\n      width: broadWidth,\n      shape,\n      optimization,\n    });\n  }\n\n  if (optimize) {\n    peakList = optimizePeaks(data, peakList, {\n      shape,\n      factorWidth,\n      optimization,\n    });\n  }\n\n  return peakList;\n}\n\nfunction getNegativePeaks(data, options) {\n  let { x, y } = data;\n  let negativeDataY = new Float64Array(data.y.length);\n  for (let i = 0; i < negativeDataY.length; i++) {\n    negativeDataY[i] = -1 * y[i];\n  }\n\n  let peakList = getPeakList({ x, y: negativeDataY }, options);\n\n  for (let i = 0; i < peakList.length; i++) {\n    peakList[i].y *= -1;\n  }\n  return peakList;\n}\n\nfunction getCutOff(data, options = {}) {\n  const { noiseLevel, useSanPlot, thresholdFactor } = options;\n\n  const formatResult = (noiseLevel) =>\n    typeof noiseLevel === 'number'\n      ? { positive: noiseLevel, negative: -noiseLevel }\n      : noiseLevel;\n\n  if (noiseLevel) {\n    return formatResult(noiseLevel);\n  } else {\n    return useSanPlot\n      ? xNoiseSanPlot(data, { factorStd: thresholdFactor })\n      : formatResult(xAbsoluteMedian(data) * thresholdFactor);\n  }\n}\n","/*\n * This library implements the J analyser described by Cobas et al in the paper:\n * A two-stage approach to automatic determination of 1H NMR coupling constants\n */\nconst patterns = ['s', 'd', 't', 'q', 'quint', 'h', 'sept', 'o', 'n'];\nlet symRatio = 1.5;\nlet maxErrorIter1 = 2.5; // Hz\nlet maxErrorIter2 = 1; // Hz\nlet jAxisKeys = { jAxis: 'x', intensity: 'intensity' };\n\nexport default {\n  /**\n   * The compilation process implements at the first stage a normalization procedure described by Golotvin et al.\n   * embedding in peak-component-counting method described by Hoyes et al.\n   * @param {object} signal\n   * @private\n   */\n  compilePattern: function (signal, options = {}) {\n    let { jAxisKey = jAxisKeys } = options;\n    signal.multiplicity = 'm';\n    // 1.1 symmetrize\n    // It will add a set of peaks(signal.peaksComp) to the signal that will be used during\n    // the compilation process. The unit of those peaks will be in Hz\n    signal.symRank = symmetrizeChoiseBest(signal, {\n      maxError: maxErrorIter1,\n      iteration: 1,\n      jAxisKey,\n    });\n    signal.asymmetric = true;\n    // Is the signal symmetric?\n    if (signal.symRank >= 0.95 && signal.peaksComp.length < 32) {\n      signal.asymmetric = false;\n      let P1, n2, maxFlagged;\n      let k = 1;\n      let Jc = [];\n\n      // Loop over the possible number of coupling contributing to the multiplet\n      for (let n = 0; n < 9; n++) {\n        // 1.2 Normalize. It makes a deep copy of the peaks before to modify them.\n        let peaks = normalize(signal, n);\n        // signal.peaksCompX = peaks;\n        let validPattern = false; // It will change to true, when we find the good patter\n        // Lets check if the signal could be a singulet.\n        if (peaks.length === 1 && n === 0) {\n          validPattern = true;\n        } else {\n          if (peaks.length <= 1) {\n            continue;\n          }\n        }\n        // 1.3 Establish a range for the Heights Hi [peaks.intensity*0.85,peaks.intensity*1.15];\n        let ranges = getRanges(peaks);\n        n2 = Math.pow(2, n);\n\n        // 1.4 Find a combination of integer heights Hi, one from each Si, that sums to 2^n.\n        let heights = null;\n        let counter = 1;\n        while (\n          !validPattern &&\n          (heights = getNextCombination(ranges, n2)) !== null &&\n          counter < 400\n        ) {\n          // 2.1 Number the components of the multiplet consecutively from 1 to 2n,\n          // starting at peak 1\n          let numbering = new Array(heights.length);\n          k = 1;\n          for (let i = 0; i < heights.length; i++) {\n            numbering[i] = new Array(heights[i]);\n            for (let j = 0; j < heights[i]; j++) {\n              numbering[i][j] = k++;\n            }\n          }\n\n          Jc = []; // The array to store the detected j-coupling\n          // 2.2 Set j = 1; J1 = P2 - P1. Flag components 1 and 2 as accounted for.\n          let j = 1;\n          Jc.push(peaks[1].x - peaks[0].x);\n          P1 = peaks[0].x;\n          numbering[0].splice(0, 1); // Flagged\n          numbering[1].splice(0, 1); // Flagged\n          k = 1;\n          let nFlagged = 2;\n          maxFlagged = Math.pow(2, n) - 1;\n          while (Jc.length < n && nFlagged < maxFlagged && k < peaks.length) {\n            counter += 1;\n            // 4.1. Increment j. Set k to the number of the first unflagged component.\n            j++;\n            while (k < peaks.length && numbering[k].length === 0) {\n              k++;\n            }\n            if (k < peaks.length) {\n              // 4.2 Jj = Pk - P1.\n              Jc.push(peaks[k].x - peaks[0].x);\n              // Flag component k and, for each sum of the...\n              numbering[k].splice(0, 1); // Flageed\n              nFlagged++;\n              // Flag the other components of the multiplet\n              for (let u = 2; u <= j; u++) {\n                let jSum = 0;\n                for (let i = 0; i < u; i++) {\n                  jSum += Jc[i];\n                }\n                for (let i = 1; i < numbering.length; i++) {\n                  // Maybe 0.25 Hz is too much?\n                  if (Math.abs(peaks[i].x - (P1 + jSum)) < 0.25) {\n                    numbering[i].splice(0, 1); // Flageed\n                    nFlagged++;\n                    break;\n                  }\n                }\n              }\n            }\n          }\n          // Calculate the ideal patter by using the extracted j-couplings\n          let pattern = idealPattern(Jc);\n          // Compare the ideal pattern with the proposed intensities.\n          // All the intensities have to match to accept the multiplet\n          validPattern = true;\n          for (let i = 0; i < pattern.length; i++) {\n            if (pattern[i].intensity !== heights[i]) {\n              validPattern = false;\n            }\n          }\n        }\n        // If we found a valid pattern we should inform about the pattern.\n        if (validPattern) {\n          updateSignal(signal, Jc);\n        }\n      }\n    }\n    // Before to return, change the units of peaksComp from Hz to PPM again\n    for (let i = 0; i < signal.peaksComp.length; i++) {\n      signal.peaksComp[i].x /= signal.observe;\n    }\n  },\n};\n\n/**\n * @private\n * update the signal\n * @param {*} signal\n * @param {*} Jc\n */\nfunction updateSignal(signal, Jc) {\n  // Update the limits of the signal\n  let peaks = signal.peaksComp; // Always in Hz\n  let nbPeaks = peaks.length;\n  signal.startX = peaks[0].x / signal.observe - peaks[0].width;\n  signal.stopX =\n    peaks[nbPeaks - 1].x / signal.observe + peaks[nbPeaks - 1].width;\n  signal.integralData.from = peaks[0].x / signal.observe - peaks[0].width * 3;\n  signal.integralData.to =\n    peaks[nbPeaks - 1].x / signal.observe + peaks[nbPeaks - 1].width * 3;\n  // Compile the pattern and format the constant couplings\n  signal.maskPattern = signal.mask2;\n  signal.multiplicity = abstractPattern(signal, Jc);\n  signal.pattern = signal.multiplicity; // Our library depends on this parameter, but it is old\n}\n\n/**\n * Returns the multiplet in the compact format\n * @param {object} signal\n * @param {object} Jc\n * @return {String}\n * @private\n */\nfunction abstractPattern(signal, Jc) {\n  let tol = 0.05;\n  let pattern = '';\n  let cont = 1;\n  let newNmrJs = [];\n\n  if (Jc && Jc.length > 0) {\n    Jc.sort(function (a, b) {\n      return b - a;\n    });\n\n    for (let i = 0; i < Jc.length - 1; i++) {\n      if (Math.abs(Jc[i] - Jc[i + 1]) < tol) {\n        cont++;\n      } else {\n        newNmrJs.push({\n          coupling: Math.abs(Jc[i]),\n          multiplicity: patterns[cont],\n        });\n        pattern += patterns[cont];\n        cont = 1;\n      }\n    }\n    let index = Jc.length - 1;\n    newNmrJs.push({\n      coupling: Math.abs(Jc[index]),\n      multiplicity: patterns[cont],\n    });\n    pattern += patterns[cont];\n    signal.nmrJs = newNmrJs;\n  } else {\n    pattern = 's';\n    if (Math.abs(signal.startX - signal.stopX) * signal.observe > 16) {\n      pattern = 'br s';\n    }\n  }\n  return pattern;\n}\n\n/**\n * This function creates an ideal pattern from the given J-couplings\n * @private\n * @param {Array} Jc\n * @return {*[]}\n * @private\n */\nfunction idealPattern(Jc) {\n  let hsum = Math.pow(2, Jc.length);\n  let pattern = [{ x: 0, intensity: hsum }];\n  // To split the initial height\n  for (let i = 0; i < Jc.length; i++) {\n    for (let j = pattern.length - 1; j >= 0; j--) {\n      pattern.push({\n        x: pattern[j].x + Jc[i] / 2,\n        intensity: pattern[j].intensity / 2,\n      });\n      pattern[j].x = pattern[j].x - Jc[i] / 2;\n      pattern[j].intensity = pattern[j].intensity / 2;\n    }\n  }\n  // To sum the heights in the same positions\n  pattern.sort(function compare(a, b) {\n    return a.x - b.x;\n  });\n  for (let j = pattern.length - 2; j >= 0; j--) {\n    if (Math.abs(pattern[j].x - pattern[j + 1].x) < 0.1) {\n      pattern[j].intensity += pattern[j + 1].intensity;\n      pattern.splice(j + 1, 1);\n    }\n  }\n  return pattern;\n}\n\n/**\n * Find a combination of integer heights Hi, one from each Si, that sums to 2n.\n * @param {object} ranges\n * @param {Number} value\n * @return {*}\n * @private\n */\nfunction getNextCombination(ranges, value) {\n  let half = Math.ceil(ranges.values.length * 0.5);\n  let lng = ranges.values.length;\n  let sum = 0;\n  let ok;\n  while (sum !== value) {\n    // Update the indexes to point at the next possible combination\n    ok = false;\n    while (!ok) {\n      ok = true;\n      ranges.currentIndex[ranges.active]++;\n      if (\n        ranges.currentIndex[ranges.active] >=\n        ranges.values[ranges.active].length\n      ) {\n        // In this case, there is no more possible combinations\n        if (ranges.active + 1 === half) {\n          return null;\n        } else {\n          // If this happens we need to try the next active peak\n          ranges.currentIndex[ranges.active] = 0;\n          ok = false;\n          ranges.active++;\n        }\n      } else {\n        ranges.active = 0;\n      }\n    }\n    // Sum the heights for this combination\n    sum = 0;\n    for (let i = 0; i < half; i++) {\n      sum += ranges.values[i][ranges.currentIndex[i]] * 2;\n    }\n    if (ranges.values.length % 2 !== 0) {\n      sum -= ranges.values[half - 1][ranges.currentIndex[half - 1]];\n    }\n  }\n  // If the sum is equal to the expected value, fill the array to return\n  if (sum === value) {\n    let heights = new Array(lng);\n    for (let i = 0; i < half; i++) {\n      heights[i] = ranges.values[i][ranges.currentIndex[i]];\n      heights[lng - i - 1] = ranges.values[i][ranges.currentIndex[i]];\n    }\n    return heights;\n  }\n  return null;\n}\n\n/**\n * This function generates the possible values that each peak can contribute\n * to the multiplet.\n * @param {Array} peaks Array of objects with peaks information {intensity}\n * @return {{values: Array, currentIndex: Array, active: number}}\n * @private\n */\nfunction getRanges(peaks) {\n  let ranges = new Array(peaks.length);\n  let currentIndex = new Array(peaks.length);\n  let min, max;\n  ranges[0] = [1];\n  ranges[peaks.length - 1] = [1];\n  currentIndex[0] = -1;\n  currentIndex[peaks.length - 1] = 0;\n  for (let i = 1; i < peaks.length - 1; i++) {\n    min = Math.round(peaks[i].intensity * 0.85);\n    max = Math.round(peaks[i].intensity * 1.15);\n    ranges[i] = [];\n    for (let j = min; j <= max; j++) {\n      ranges[i].push(j);\n    }\n    currentIndex[i] = 0;\n  }\n  return { values: ranges, currentIndex: currentIndex, active: 0 };\n}\n/**\n * Performs a symmetrization of the signal by using different aproximations to the center.\n * It will return the result of the symmetrization that removes less peaks from the signal\n * @param {object} signal\n * @param {Number} maxError\n * @param {Number} iteration\n * @return {*}\n * @private\n */\nfunction symmetrizeChoiseBest(signal, options = {}) {\n  let { maxError, iteration, jAxisKey = jAxisKeys } = options;\n  let symRank1 = symmetrize(signal, maxError, iteration, jAxisKey);\n  let tmpPeaks = signal.peaksComp;\n  let tmpMask = signal.mask;\n  let cs = signal.delta1;\n  signal.delta1 =\n    (signal.peaks[0].x + signal.peaks[signal.peaks.length - 1].x) / 2;\n  let symRank2 = symmetrize(signal, maxError, iteration, jAxisKey);\n  if (signal.peaksComp.length > tmpPeaks.length) {\n    return symRank2;\n  } else {\n    signal.delta1 = cs;\n    signal.peaksComp = tmpPeaks;\n    signal.mask = tmpMask;\n    return symRank1;\n  }\n}\n\n/**\n * This function will return a set of symmetric peaks that will\n * be the enter point for the patter compilation process.\n * @param {object} signal\n * @param {Number} maxError\n * @param {Number} iteration\n * @return {Number}\n * @private\n */\nfunction symmetrize(signal, maxError, iteration, key) {\n  let { jAxis, intensity } = key;\n  // Before to symmetrize we need to keep only the peaks that possibly conforms the multiplete\n  let max, min, avg, ratio, avgWidth;\n  let peaks = new Array(signal.peaks.length);\n  // Make a deep copy of the peaks and convert PPM ot HZ\n  for (let i = 0; i < peaks.length; i++) {\n    peaks[i] = {\n      x: signal.peaks[i][jAxis] * signal.observe,\n      intensity: signal.peaks[i][intensity],\n      width: signal.peaks[i].width,\n    };\n  }\n  // Join the peaks that are closer than 0.25 Hz\n  for (let i = peaks.length - 2; i >= 0; i--) {\n    if (Math.abs(peaks[i].x - peaks[i + 1].x) < 0.25) {\n      peaks[i].x =\n        peaks[i].x * peaks[i].intensity +\n        peaks[i + 1].x * peaks[i + 1].intensity;\n      peaks[i].intensity = peaks[i].intensity + peaks[i + 1].intensity;\n      peaks[i].x /= peaks[i].intensity;\n      peaks[i].intensity /= 2;\n      peaks[i].width += peaks[i + 1].width;\n      peaks.splice(i + 1, 1);\n    }\n  }\n  signal.peaksComp = peaks;\n  let nbPeaks = peaks.length;\n  let mask = new Array(nbPeaks);\n  signal.mask = mask;\n  let left = 0;\n  let right = peaks.length - 1;\n  let cs = signal.delta1 * signal.observe;\n  let middle = [(peaks[0].x + peaks[nbPeaks - 1].x) / 2, 1];\n  maxError = error(Math.abs(cs - middle[0]));\n  let heightSum = 0;\n  // We try to symmetrize the extreme peaks. We consider as candidates for symmetricing those which have\n  // ratio smaller than 3\n  for (let i = 0; i < nbPeaks; i++) {\n    mask[i] = true;\n    // heightSum += signal.peaks[i].intensity;\n    heightSum += peaks[i].intensity;\n  }\n\n  while (left <= right) {\n    mask[left] = true;\n    mask[right] = true;\n    if (left === right) {\n      if (nbPeaks > 2 && Math.abs(peaks[left].x - cs) > maxError) {\n        mask[left] = false;\n      }\n    } else {\n      max = Math.max(peaks[left].intensity, peaks[right].intensity);\n      min = Math.min(peaks[left].intensity, peaks[right].intensity);\n      ratio = max / min;\n      if (ratio > symRatio) {\n        if (peaks[left].intensity === min) {\n          mask[left] = false;\n          right++;\n        } else {\n          mask[right] = false;\n          left--;\n        }\n      } else {\n        let diffL = Math.abs(peaks[left].x - cs);\n        let diffR = Math.abs(peaks[right].x - cs);\n\n        if (Math.abs(diffL - diffR) < maxError) {\n          avg = Math.min(peaks[left].intensity, peaks[right].intensity);\n          avgWidth = Math.min(peaks[left].width, peaks[right].width);\n          peaks[left].intensity = peaks[right].intensity = avg;\n          peaks[left].width = peaks[right].width = avgWidth;\n          middle = [\n            middle[0] + (peaks[right].x + peaks[left].x) / 2,\n            middle[1] + 1,\n          ];\n        } else {\n          if (Math.max(diffL, diffR) === diffR) {\n            mask[right] = false;\n            left--;\n          } else {\n            mask[left] = false;\n            right++;\n          }\n        }\n      }\n    }\n    left++;\n    right--;\n    // Only alter cs if it is the first iteration of the sym process.\n    if (iteration === 1) {\n      cs = chemicalShift(peaks, mask);\n      // There is not more available peaks\n      if (isNaN(cs)) {\n        return 0;\n      }\n    }\n    maxError = error(Math.abs(cs - middle[0] / middle[1]));\n  }\n  // To remove the weak peaks and recalculate the cs\n  for (let i = nbPeaks - 1; i >= 0; i--) {\n    if (mask[i] === false) {\n      peaks.splice(i, 1);\n    }\n  }\n  cs = chemicalShift(peaks);\n  if (isNaN(cs)) {\n    return 0;\n  }\n  signal.delta1 = cs / signal.observe;\n  // Now, the peak should be symmetric in heights, but we need to know if it is symmetric in x\n  let symFactor = 0;\n  let weight = 0;\n  if (peaks.length > 1) {\n    for (let i = Math.ceil(peaks.length / 2) - 1; i >= 0; i--) {\n      symFactor +=\n        ((3 +\n          Math.min(\n            Math.abs(peaks[i].x - cs),\n            Math.abs(peaks[peaks.length - 1 - i].x - cs),\n          )) /\n          (3 +\n            Math.max(\n              Math.abs(peaks[i].x - cs),\n              Math.abs(peaks[peaks.length - 1 - i].x - cs),\n            ))) *\n        peaks[i].intensity;\n      weight += peaks[i].intensity;\n    }\n    symFactor /= weight;\n  } else {\n    if (peaks.length === 1) {\n      symFactor = 1;\n    }\n  }\n  let newSumHeights = 0;\n  for (let i = 0; i < peaks.length; i++) {\n    newSumHeights += peaks[i].intensity;\n  }\n  symFactor -= ((heightSum - newSumHeights) / heightSum) * 0.12; // Removed peaks penalty\n  // Sometimes we need a second opinion after the first symmetrization.\n  if (symFactor > 0.8 && symFactor < 0.97 && iteration < 2) {\n    return symmetrize(signal, maxErrorIter2, 2, key);\n  } else {\n    // Center the given pattern at cs and symmetrize x\n    if (peaks.length > 1) {\n      let dxi;\n      for (let i = Math.ceil(peaks.length / 2) - 1; i >= 0; i--) {\n        dxi = (peaks[i].x - peaks[peaks.length - 1 - i].x) / 2.0;\n        peaks[i].x = cs + dxi;\n        peaks[peaks.length - 1 - i].x = cs - dxi;\n      }\n    }\n  }\n  return symFactor;\n}\n/**\n * Error validator\n * @param {Number} value\n * @return {Number}\n * @private\n */\nfunction error(value) {\n  let maxError = value * 2.5;\n  if (maxError < 0.75) {\n    maxError = 0.75;\n  }\n  if (maxError > 3) {\n    maxError = 3;\n  }\n  return maxError;\n}\n/**\n * @private\n * 2 stages normalizarion of the peaks heights to Math.pow(2,n).\n * Creates a new mask with the peaks that could contribute to the multiplete\n * @param {object} signal\n * @param {Number} n\n * @return {*}\n */\nfunction normalize(signal, n) {\n  // Perhaps this is slow\n  let peaks = JSON.parse(JSON.stringify(signal.peaksComp));\n  let norm = 0;\n  let norm2 = 0;\n  for (let i = 0; i < peaks.length; i++) {\n    norm += peaks[i].intensity;\n  }\n  norm = Math.pow(2, n) / norm;\n  signal.mask2 = JSON.parse(JSON.stringify(signal.mask));\n\n  let index = signal.mask2.length - 1;\n  for (let i = peaks.length - 1; i >= 0; i--) {\n    peaks[i].intensity *= norm;\n    while (index >= 0 && signal.mask2[index] === false) {\n      index--;\n    }\n    if (peaks[i].intensity < 0.75) {\n      peaks.splice(i, 1);\n      signal.mask2[index] = false;\n    } else {\n      norm2 += peaks[i].intensity;\n    }\n    index--;\n  }\n  norm2 = Math.pow(2, n) / norm2;\n  for (let i = peaks.length - 1; i >= 0; i--) {\n    peaks[i].intensity *= norm2;\n  }\n  return peaks;\n}\n\n/**\n * @private\n * Calculates the chemical shift as the weighted sum of the peaks\n * @param {Array} peaks\n * @param {Array} mask\n * @return {Number}\n */\nfunction chemicalShift(peaks, mask) {\n  let sum = 0;\n  let cs = 0;\n  let area;\n  if (mask) {\n    for (let i = 0; i < peaks.length; i++) {\n      if (mask[i] === true) {\n        area = getArea(peaks[i]);\n        sum += area;\n        cs += area * peaks[i].x;\n      }\n    }\n  } else {\n    for (let i = 0; i < peaks.length; i++) {\n      area = getArea(peaks[i]);\n      sum += area;\n      cs += area * peaks[i].x;\n    }\n  }\n  return cs / sum;\n}\n\n/**\n * Return the area of a Lorentzian function\n * @param {object} peak - object with peak information\n * @return {Number}\n * @private\n */\nfunction getArea(peak) {\n  return Math.abs(peak.intensity * peak.width * 1.57); // 1.772453851);\n}\n","export function joinRanges(ranges) {\n  ranges.sort((a, b) => a.from - b.from);\n  for (let i = 0; i < ranges.length - 1; i++) {\n    if (ranges[i].to > ranges[i + 1].from) {\n      ranges[i].to = Math.max(ranges[i + 1].to, ranges[i].to);\n      ranges[i].signal = ranges[i].signal.concat(ranges[i + 1].signal);\n      ranges[i].integral += ranges[i + 1].integral;\n      ranges.splice(i + 1, 1);\n      i--;\n    }\n  }\n  return ranges;\n}\n","// import { Ranges } from 'spectra-data-ranges';\nimport { xyIntegration } from 'ml-spectra-processing';\n\nimport jAnalyzer from './util/jAnalyzer';\nimport { joinRanges } from './util/joinRanges';\n\n/**\n * This function clustering peaks and calculate the integral value for each range from the peak list returned from extractPeaks function.\n * @param {Object} data - spectra data\n * @param {Array} peakList - nmr signals\n * @param {Object} [options={}] - options object with some parameter for GSD, detectSignal functions.\n * @param {Number} [options.integrationSum=100] - Number of hydrogens or some number to normalize the integral data. If it's zero return the absolute integral value\n * @param {String} [options.integralType='sum'] - option to chose between approx area with peaks or the sum of the points of given range ('sum', 'peaks')\n * @param {Number} [options.frequencyCluster=16] - distance limit to clustering peaks.\n * @param {Number} [options.clean=0.4] - If exits it remove all the signals with integration < clean value\n * @param {Boolean} [options.compile=true] - If true, the Janalyzer function is run over signals to compile the patterns.\n * @param {Boolean} [options.keepPeaks=false] - If true each signal will contain an array of peaks.\n * @param {String} [options.nucleus='1H'] - Nucleus\n * @param {String} [options.frequency=400] - Observed frequency\n * @returns {Array}\n */\n\nexport function peaksToRanges(data, peakList, options = {}) {\n  let {\n    integrationSum = 100,\n    joinOverlapRanges = true,\n    clean = 0.4,\n    compile = true,\n    integralType = 'sum',\n    frequency = 400,\n    frequencyCluster = 16,\n    keepPeaks = false,\n    nucleus = '1H',\n  } = options;\n\n  let signalOptions = {\n    integrationSum,\n    integralType,\n    frequencyCluster,\n    frequency,\n    nucleus,\n  };\n\n  if (data.x[0] > data.x[1]) {\n    data.x = data.x.reverse();\n    data.y = data.y.reverse();\n  }\n\n  let signals = detectSignals(data, peakList, signalOptions);\n  if (clean) {\n    for (let i = 0; i < signals.length; i++) {\n      if (Math.abs(signals[i].integralData.value) < clean) {\n        signals.splice(i, 1);\n      }\n    }\n  }\n\n  if (compile) {\n    let nHi, sum;\n    for (let i = 0; i < signals.length; i++) {\n      jAnalyzer.compilePattern(signals[i]);\n\n      if (\n        signals[i].maskPattern &&\n        signals[i].multiplicity !== 'm' &&\n        signals[i].multiplicity !== ''\n      ) {\n        // Create a new signal with the removed peaks\n        nHi = 0;\n        sum = 0;\n        let peaksO = [];\n        for (let j = signals[i].maskPattern.length - 1; j >= 0; j--) {\n          sum += computeArea(signals[i].peaks[j]);\n          if (signals[i].maskPattern[j] === false) {\n            let peakR = signals[i].peaks.splice(j, 1)[0];\n            peaksO.push({ x: peakR.x, y: peakR.intensity, width: peakR.width });\n            signals[i].mask.splice(j, 1);\n            signals[i].mask2.splice(j, 1);\n            signals[i].maskPattern.splice(j, 1);\n            signals[i].nbPeaks--;\n            nHi += computeArea(peakR);\n          }\n        }\n        if (peaksO.length > 0) {\n          nHi = (nHi * signals[i].integralData.value) / sum;\n          signals[i].integralData.value -= nHi;\n          let peaks1 = [];\n          for (let j = peaksO.length - 1; j >= 0; j--) {\n            peaks1.push(peaksO[j]);\n          }\n          signalOptions.integrationSum = Math.abs(nHi);\n          let ranges = detectSignals(data, peaks1, signalOptions);\n\n          for (let j = 0; j < ranges.length; j++) {\n            signals.push(ranges[j]);\n          }\n        }\n      }\n    }\n    // it was a updateIntegrals function.\n    let sumIntegral = 0;\n    let sumObserved = 0;\n    for (let i = 0; i < signals.length; i++) {\n      sumObserved += Math.abs(Math.round(signals[i].integralData.value));\n    }\n    if (sumObserved !== integrationSum) {\n      sumIntegral = integrationSum / sumObserved;\n      for (let i = 0; i < signals.length; i++) {\n        signals[i].integralData.value *= sumIntegral;\n      }\n    }\n  }\n\n  signals.sort((a, b) => {\n    return b.delta1 - a.delta1;\n  });\n\n  if (clean) {\n    for (let i = signals.length - 1; i >= 0; i--) {\n      if (Math.abs(signals[i].integralData.value) < clean) {\n        signals.splice(i, 1);\n      }\n    }\n  }\n\n  let ranges = []; //new Array(signals.length);\n  for (let i = 0; i < signals.length; i++) {\n    let signal = signals[i];\n    ranges[i] = {\n      from: signal.integralData.from,\n      to: signal.integralData.to,\n      integral: signal.integralData.value,\n      signal: [\n        {\n          kind: signal.kind || 'signal',\n          multiplicity: signal.multiplicity,\n        },\n      ],\n    };\n    if (keepPeaks) {\n      ranges[i].signal[0].peak = signal.peaks;\n    }\n    if (signal.nmrJs) {\n      ranges[i].signal[0].j = signal.nmrJs;\n    }\n    if (!signal.asymmetric || signal.multiplicity === 'm') {\n      ranges[i].signal[0].delta = signal.delta1;\n    }\n  }\n\n  if (joinOverlapRanges) ranges = joinRanges(ranges);\n  // return new Ranges(ranges);\n  return ranges;\n}\n\n/**\n * Extract the signals from the peakList and the given spectrum.\n * @param {object} data - spectra data\n * @param {array} peakList - nmr signals\n * @param {object} [options = {}]\n * @param {number} [options.integrationSum='100'] - Number of hydrogens or some number to normalize the integration data, If it's zero return the absolute integral value\n * @param {string} [options.integralType='sum'] - option to chose between approx area with peaks or the sum of the points of given range\n * @param {number} [options.frequencyCluster=16] - distance limit to clustering the peaks.\n * range = frequencyCluster / observeFrequency -> Peaks withing this range are considered to belongs to the same signal1D\n * @param {string} [options.nucleus='1H'] - - Nucleus\n * @param {String} [options.frequency = 400] - Observed frequency\n * @return {array} nmr signals\n * @private\n */\nfunction detectSignals(data, peakList, options = {}) {\n  let {\n    integrationSum = 100,\n    integralType = 'sum',\n    frequencyCluster = 16,\n    frequency = 400,\n    nucleus = '1H',\n  } = options;\n\n  let signal1D, peaks;\n  let signals = [];\n  let prevPeak = { x: 100000 };\n  let spectrumIntegral = 0;\n  frequencyCluster /= frequency;\n  for (let i = 0; i < peakList.length; i++) {\n    if (Math.abs(peakList[i].x - prevPeak.x) > frequencyCluster) {\n      signal1D = {\n        nbPeaks: 1,\n        units: 'PPM',\n        startX: peakList[i].x - peakList[i].width,\n        stopX: peakList[i].x + peakList[i].width,\n        multiplicity: '',\n        pattern: '',\n        observe: frequency,\n        nucleus,\n        integralData: {\n          from: peakList[i].x - peakList[i].width * 3,\n          to: peakList[i].x + peakList[i].width * 3,\n        },\n        peaks: [\n          {\n            x: peakList[i].x,\n            intensity: peakList[i].y,\n            width: peakList[i].width,\n          },\n        ],\n      };\n      if (peakList[i].kind) signal1D.kind = peakList[i].kind;\n      signals.push(signal1D);\n    } else {\n      let tmp = peakList[i].x + peakList[i].width;\n      signal1D.stopX = Math.max(signal1D.stopX, tmp);\n      signal1D.startX = Math.min(signal1D.startX, tmp);\n      signal1D.nbPeaks++;\n      signal1D.peaks.push({\n        x: peakList[i].x,\n        intensity: peakList[i].y,\n        width: peakList[i].width,\n      });\n      signal1D.integralData.from = Math.min(\n        signal1D.integralData.from,\n        peakList[i].x - peakList[i].width * 3,\n      );\n      signal1D.integralData.to = Math.max(\n        signal1D.integralData.to,\n        peakList[i].x + peakList[i].width * 3,\n      );\n      if (peakList[i].kind) signal1D.kind = peakList[i].kind;\n    }\n    prevPeak = peakList[i];\n  }\n\n  for (let i = 0; i < signals.length; i++) {\n    peaks = signals[i].peaks;\n    let integral = signals[i].integralData;\n    let chemicalShift = 0;\n    let integralPeaks = 0;\n\n    for (let j = 0; j < peaks.length; j++) {\n      let area = computeArea(peaks[j]);\n      chemicalShift += peaks[j].x * area;\n      integralPeaks += area;\n    }\n    signals[i].delta1 = chemicalShift / integralPeaks;\n\n    if (integralType === 'sum') {\n      integral.value = xyIntegration(data, {\n        from: integral.from,\n        to: integral.to,\n      });\n    } else {\n      integral.value = integralPeaks;\n    }\n    spectrumIntegral += integral.value;\n  }\n\n  if (integrationSum > 0) {\n    let integralFactor = integrationSum / spectrumIntegral;\n    for (let i = 0; i < signals.length; i++) {\n      let integral = signals[i].integralData;\n      integral.value *= integralFactor;\n    }\n  }\n\n  return signals;\n}\n\n/**\n * Return the area of a Lorentzian function\n * @param {object} peak - object with peak information\n * @return {Number}\n * @private\n */\nfunction computeArea(peak) {\n  return Math.abs(peak.intensity * peak.width * 1.57); // todo add an option with this value: 1.772453851\n}\n","import { peaksFilterImpurities } from '../peaks/peaksFilterImpurities';\nimport { peaksToRanges } from '../peaks/peaksToRanges';\n\nimport { xyAutoPeaksPicking } from './xyAutoPeaksPicking';\n\n/**\n * Detect peaks, optimize parameters and compile multiplicity if required.\n * @param {DataXY}  data - Object of kind\n * @param {object}  [options={}] - options object with some parameter for GSD.\n * @param {object}  [options.peakPicking={}] - options to peak detection and optimization.\n * @param {number}  [options.peakPicking.minMaxRatio=0.01] - Threshold to determine if a given peak should be considered as a noise, bases on its relative height compared to the highest peak.\n * @param {number}  [options.peakPicking.broadRatio=0.00025] - If broadRatio is higher than 0, then all the peaks which second derivative smaller than broadRatio * maxAbsSecondDerivative will be marked with the soft mask equal to true.\n * @param {number}  [options.peakPicking.broadWidth=0.25] - Threshold to determine if some peak is candidate to clustering into range.\n * @param {number}  [options.peakPicking.noiseLevel=median(data.y) * (options.thresholdFactor || 3)] - Noise threshold in spectrum y units. Default is three/thresholdFactor times the absolute median of data.y.\n * @param {number}  [options.peakPicking.factorWidth=4] - factor to determine the width at the moment to group the peaks in signals in 'GSD.optimizePeaks' function.\n * @param {object}  [options.peakPicking.shape={}] - it's specify the kind of shape used to fitting.\n * @param {string}  [options.peakPicking.shape.kind='gaussian'] - kind of shape; lorentzian, gaussian and pseudovoigt are supported.\n * @param {object}  [options.peakPicking.optimization={}] - it's specify the kind and options of the algorithm use to optimize parameters.\n * @param {string}  [options.peakPicking.optimization.kind='lm'] - kind of algorithm. By default it's levenberg-marquardt.\n * @param {object}  [options.peakPicking.optimization.options={}] - options for the specific kind of algorithm.\n * @param {Boolean} [options.peakPicking.compile=true] - If true, the Janalyzer function is run over signals to compile the patterns.\n * @param {Boolean} [options.peakPicking.smoothY=true] - Select the peak intensities from a smoothed version of the independent variables?\n * @param {Boolean} [options.peakPicking.optimize=true] - if it's true adjust an train of gaussian or lorentzian shapes to spectrum.\n * @param {Boolean} [options.peakPicking.optimize=true] - if it's true adjust an train of gaussian or lorentzian shapes to spectrum.\n * @param {Number}  [options.ranges.integrationSum=100] - Number of hydrogens or some number to normalize the integral data. If it's zero return the absolute integral value\n * @param {String}  [options.ranges.integralType='sum'] - option to chose between approx area with peaks or the sum of the points of given range ('sum', 'peaks')\n * @param {Number}  [options.ranges.frequencyCluster=16] - distance limit to clustering peaks.\n * @param {Number}  [options.ranges.clean=0.4] - If exits it remove all the signals with integration < clean value\n * @param {Boolean} [options.ranges.compile=true] - If true, the Janalyzer function is run over signals to compile the patterns.\n * @param {Boolean} [options.ranges.keepPeaks=false] - If true each signal will contain an array of peaks.\n * @param {String}  [options.ranges.nucleus='1H'] - Nucleus\n * @param {String}  [options.ranges.frequency=400] - Observed frequency\n * @param {object}  [options.impurities={}] - impurities options.\n * @param {string}  [options.impurities.solvent=''] - solvent name.\n * @param {string}  [options.impurities.error=0.025] - tolerance in ppm to assign a impurity.\n * @returns {array} - Array of ranges with {from, to, integral, signals: [{delta, j, multiplicity, peaks}]}\n */\n\nexport function xyAutoRangesPicking(data, options = {}) {\n  let peaks = xyAutoPeaksPicking(data, options.peakPicking);\n  peaks = peaksFilterImpurities(peaks, options.impurities);\n  return peaksToRanges(data, peaks, options.ranges);\n}\n","import { getNucleusFrom2DExperiment } from './getNucleusFrom2DExperiment';\nimport { getSpectrumType } from './getSpectrumType';\n\nexport function getMetaData(info, meta) {\n  const metadata = {\n    dimension: 1,\n    nucleus: [],\n    isFid: false,\n    isFt: false,\n    isComplex: false,\n  };\n\n  maybeAdd(metadata, 'title', info.TITLE);\n  maybeAdd(metadata, 'solvent', info['.SOLVENTNAME']);\n  maybeAdd(\n    metadata,\n    'pulse',\n    info['.PULSESEQUENCE'] || info['.PULPROG'] || meta.PULPROG,\n  );\n  maybeAdd(metadata, 'experiment', getSpectrumType(metadata, info));\n  maybeAdd(metadata, 'temperature', parseFloat(meta.TE || info['.TE']));\n  maybeAdd(metadata, 'frequency', parseFloat(info['.OBSERVEFREQUENCY']));\n  maybeAdd(metadata, 'type', info.DATATYPE);\n  maybeAdd(metadata, 'probe', meta.PROBHD);\n  if (meta.FNTYPE !== undefined) {\n    maybeAdd(metadata, 'acquisitionMode', parseInt(meta.FNTYPE, 10));\n  }\n  maybeAdd(metadata, 'expno', parseInt(meta.EXPNO, 10));\n  if (metadata.type) {\n    if (metadata.type.toUpperCase().indexOf('FID') >= 0) {\n      metadata.isFid = true;\n    } else if (metadata.type.toUpperCase().indexOf('SPECTRUM') >= 0) {\n      metadata.isFt = true;\n    }\n  }\n\n  if (info['.NUCLEUS']) {\n    metadata.nucleus = info['.NUCLEUS'].split(',').map((nuc) => nuc.trim());\n  } else if (info['.OBSERVENUCLEUS']) {\n    metadata.nucleus = [info['.OBSERVENUCLEUS'].replace(/[^A-Za-z0-9]/g, '')];\n  } else {\n    metadata.nucleus = getNucleusFrom2DExperiment(metadata.experiment);\n  }\n\n  metadata.dimension = metadata.nucleus.length;\n\n  if (info.SYMBOL) {\n    let symbols = info.SYMBOL.split(/[, ]+/);\n    if (symbols.includes('R') && symbols.includes('I')) {\n      metadata.isComplex = true;\n    }\n  }\n\n  if (meta.DATE) {\n    metadata.date = new Date(meta.DATE * 1000).toISOString();\n  }\n  return metadata;\n}\n\nfunction maybeAdd(obj, name, value) {\n  if (value !== undefined) {\n    if (typeof value === 'string') {\n      if (value.startsWith('<') && value.endsWith('>')) {\n        value = value.substring(1, value.length - 2);\n      }\n      obj[name] = value.trim();\n    } else {\n      obj[name] = value;\n    }\n  }\n}\n","/**\n * Returns a list of likely nuclei based on an experiment string\n * This is really an hypothesis and should not be used\n * @param {string} experiment\n * @return {string[]}\n */\n\nexport function getNucleusFrom2DExperiment(experiment) {\n  if (typeof experiment !== 'string') {\n    return [];\n  }\n  experiment = experiment.toLowerCase();\n  if (experiment.includes('jres')) {\n    return ['1H'];\n  }\n  if (experiment.includes('hmbc') || experiment.includes('hsqc')) {\n    return ['1H', '13C'];\n  }\n  return ['1H', '1H'];\n}\n","/**\n * Returns an experiment string based on a pulse sequence\n * @param {string} pulse\n * @return {string}\n */\nexport function getSpectrumType(meta = {}, info = {}) {\n  if (meta === null) meta = {};\n  if (typeof meta === 'string') {\n    meta = { pulse: meta };\n  }\n\n  let spectyp;\n  if (Array.isArray(info.$SPECTYP)) {\n    spectyp = (info.$SPECTYP[0] || '').replace(/^<(.*)>$/, '$1').toLowerCase();\n  } else {\n    spectyp = (info.$SPECTYP || '').replace(/^<(.*)>$/, '$1').toLowerCase();\n  }\n\n  if (spectyp) return spectyp;\n\n  let pulse = meta.pulse;\n  if (typeof pulse !== 'string') {\n    return '';\n  }\n\n  pulse = pulse.toLowerCase();\n  if (pulse.includes('zg')) {\n    return '1d';\n  }\n\n  if (\n    pulse.includes('hsqct') ||\n    (pulse.includes('invi') && (pulse.includes('ml') || pulse.includes('di')))\n  ) {\n    return 'hsqctocsy';\n  }\n\n  if (pulse.includes('hsqc') || pulse.includes('invi')) {\n    return 'hsqc';\n  }\n\n  if (\n    pulse.includes('hmbc') ||\n    (pulse.includes('inv4') && pulse.includes('lp'))\n  ) {\n    return 'hmbc';\n  }\n\n  if (pulse.includes('cosy')) {\n    return 'cosy';\n  }\n\n  if (pulse.includes('jres')) {\n    return 'jres';\n  }\n\n  if (\n    pulse.includes('tocsy') ||\n    pulse.includes('mlev') ||\n    pulse.includes('dipsi')\n  ) {\n    return 'tocsy';\n  }\n\n  if (pulse.includes('noesy')) {\n    return 'noesy';\n  }\n\n  if (pulse.includes('roesy')) {\n    return 'roesy';\n  }\n\n  if (pulse.includes('dept')) {\n    return 'dept';\n  }\n\n  if (pulse.includes('jmod') || pulse.includes('apt')) {\n    return 'aptjmod';\n  }\n\n  return '';\n}\n","import { convert } from 'jcampconverter';\nimport { xyAutoRangesPicking } from 'nmr-processing';\n\nimport { getMetaData } from './getMetaData';\n\nexport const fromInfo = getMetaData;\n\n/**\n * Object containing parsed metadata\n * @name NMRMetadata\n * @typedef {object} NMRMetadata\n * @property {number} dimension\n * @property {number[]} nucleus\n * @property {string} title\n * @property {string} solvent\n * @property {string} pulse\n * @property {string} experiment\n * @property {number} temperature - Temperature in Kelvin\n * @property {number} frequency\n * @property {string} probe\n * @property {string} acquisitionMode\n * @property {number} expno - Experience number\n * @property {string} date - Date in ISO string format\n * @property {object} ranges\n */\n\nconst defaultOptions = {\n  computeRanges: false,\n};\n\nconst defaultRangesOptions = {\n  integrationSum: 100,\n  clean: 0.4,\n  compile: true,\n  integralType: 'sum',\n};\n\nconst defaultPeaksOptions = {\n  thresholdFactor: 0.85,\n};\n\n/**\n * Returns a metadata object from JCAMP\n * @param {string} jcampData\n * @param {object} [options={}]\n * @param {boolean} [options.computeRanges=false]\n * @param {number} [options.ranges] - options for ranges computation\n * @return {NMRMetadata} metadata\n */\nexport function fromJcamp(jcampData, options = {}) {\n  options = {\n    ...defaultOptions,\n    ...options,\n  };\n\n  const parsedJcamp = convert(jcampData, {\n    keepRecordsRegExp: /.*/,\n    canonicMetadataLabels: true,\n    withoutXY: false,\n  }).flatten[0];\n\n  let metadata = getMetaData(parsedJcamp.info, parsedJcamp.meta);\n\n  if (\n    options.computeRanges &&\n    metadata.isFt &&\n    metadata.dimension === 1 &&\n    metadata.nucleus[0] === '1H'\n  ) {\n    let { ranges = {}, impurities = {}, peakPicking = {} } = options;\n\n    const rangesOptions = { ...defaultRangesOptions, ...ranges };\n    const peaksOptions = { ...defaultPeaksOptions, ...peakPicking };\n\n    if (metadata.solvent) {\n      impurities.solvent = metadata.solvent;\n    }\n\n    metadata.range = xyAutoRangesPicking(parsedJcamp.spectra[0].data, {\n      impurities,\n      ranges: rangesOptions,\n      peakPicking: peaksOptions,\n    });\n  }\n\n  return metadata;\n}\n\nexport { getSpectrumType } from './getSpectrumType';\n","import { fromJcamp } from 'nmr-metadata';\n\nimport common from '../common';\n\nconst isFid = /[^a-z]fid[^a-z]/i;\nconst replaceFid = /[^a-z]fid[^a-z]?/i;\nexport default {\n  find: (nmr, filename) => {\n    let reference = getReference(filename);\n\n    return nmr.find((nmr) => {\n      return getReference(common.getFilename(nmr)) === reference;\n    });\n  },\n\n  getProperty: (filename) => {\n    const extension = common.getExtension(filename);\n    if (extension === 'jdx' || extension === 'dx' || extension === 'jcamp') {\n      if (isFid.test(filename)) {\n        return 'jcampFID';\n      }\n    }\n    return common.getTargetProperty(filename);\n  },\n\n  process: (filename, content) => {\n    const extension = common.getExtension(filename);\n    let metaData = {};\n    if (extension === 'jdx' || extension === 'dx' || extension === 'jcamp') {\n      let textContent = common.getTextContent(content);\n      metaData = fromJcamp(textContent);\n    }\n    return metaData;\n  },\n\n  jpath: ['spectra', 'nmr'],\n};\n\nconst reg2 = /(.*)\\.(.*)/;\n\nfunction getReference(filename) {\n  if (typeof filename === 'undefined') return undefined;\n\n  let reference = common.getBasename(filename);\n  reference = reference.replace(reg2, '$1');\n\n  if (isFid.test(filename)) {\n    reference = reference.replace(replaceFid, '');\n  }\n  return reference;\n}\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'oan'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'pelletHardness'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'permeability'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","export default {\n  jpath: ['physical'],\n  getEmpty() {\n    return {};\n  },\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'raman'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","export default {\n  jpath: ['stock'],\n  getEmpty() {\n    return {};\n  },\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'thermogravimetricAnalysis'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'uv'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['video'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'voidVolume'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xps'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xray'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xrd'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xrf'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n  process: common.getMetaFromJcamp,\n};\n","const lib = {};\nlib['reaction'] = {}\nimport reactiongeneral from './reaction/general';\nlib['reaction']['general'] = reactiongeneral;\n\nlib['sample'] = {}\nimport samplechromatogram from './sample/chromatogram';\nlib['sample']['chromatogram'] = samplechromatogram;\n\nimport samplecyclicVoltammetry from './sample/cyclicVoltammetry';\nlib['sample']['cyclicVoltammetry'] = samplecyclicVoltammetry;\n\nimport sampledifferentialCentrifugalSedimentation from './sample/differentialCentrifugalSedimentation';\nlib['sample']['differentialCentrifugalSedimentation'] = sampledifferentialCentrifugalSedimentation;\n\nimport sampledifferentialScanningCalorimetry from './sample/differentialScanningCalorimetry';\nlib['sample']['differentialScanningCalorimetry'] = sampledifferentialScanningCalorimetry;\n\nimport sampledls from './sample/dls';\nlib['sample']['dls'] = sampledls;\n\nimport sampleelementAnalysis from './sample/elementAnalysis';\nlib['sample']['elementAnalysis'] = sampleelementAnalysis;\n\nimport samplegenbank from './sample/genbank';\nlib['sample']['genbank'] = samplegenbank;\n\nimport samplegeneral from './sample/general';\nlib['sample']['general'] = samplegeneral;\n\nimport samplehgPorosimetry from './sample/hgPorosimetry';\nlib['sample']['hgPorosimetry'] = samplehgPorosimetry;\n\nimport sampleicp from './sample/icp';\nlib['sample']['icp'] = sampleicp;\n\nimport sampleimage from './sample/image';\nlib['sample']['image'] = sampleimage;\n\nimport sampleir from './sample/ir';\nlib['sample']['ir'] = sampleir;\n\nimport sampleisotherm from './sample/isotherm';\nlib['sample']['isotherm'] = sampleisotherm;\n\nimport sampleiv from './sample/iv';\nlib['sample']['iv'] = sampleiv;\n\nimport samplemass from './sample/mass';\nlib['sample']['mass'] = samplemass;\n\nimport samplenmr from './sample/nmr';\nlib['sample']['nmr'] = samplenmr;\n\nimport sampleoan from './sample/oan';\nlib['sample']['oan'] = sampleoan;\n\nimport samplepelletHardness from './sample/pelletHardness';\nlib['sample']['pelletHardness'] = samplepelletHardness;\n\nimport samplepermeability from './sample/permeability';\nlib['sample']['permeability'] = samplepermeability;\n\nimport samplephysical from './sample/physical';\nlib['sample']['physical'] = samplephysical;\n\nimport sampleraman from './sample/raman';\nlib['sample']['raman'] = sampleraman;\n\nimport samplestock from './sample/stock';\nlib['sample']['stock'] = samplestock;\n\nimport samplethermogravimetricAnalysis from './sample/thermogravimetricAnalysis';\nlib['sample']['thermogravimetricAnalysis'] = samplethermogravimetricAnalysis;\n\nimport sampleuv from './sample/uv';\nlib['sample']['uv'] = sampleuv;\n\nimport samplevideo from './sample/video';\nlib['sample']['video'] = samplevideo;\n\nimport samplevoidVolume from './sample/voidVolume';\nlib['sample']['voidVolume'] = samplevoidVolume;\n\nimport samplexps from './sample/xps';\nlib['sample']['xps'] = samplexps;\n\nimport samplexray from './sample/xray';\nlib['sample']['xray'] = samplexray;\n\nimport samplexrd from './sample/xrd';\nlib['sample']['xrd'] = samplexrd;\n\nimport samplexrf from './sample/xrf';\nlib['sample']['xrf'] = samplexrf;\n\nexport default lib;","import defaultType from './types/default.js';\nimport lib from './types/index';\n\nexport function getType(type, kind, custom) {\n  if (kind) {\n    if (lib[kind][type]) {\n      return Object.assign({}, defaultType, lib[kind][type], custom);\n    }\n  } else {\n    for (kind in lib) {\n      if (lib[kind][type]) {\n        return Object.assign(\n          {},\n          defaultType,\n          lib[kind].default,\n          lib[kind][type],\n          custom,\n        );\n      }\n    }\n  }\n\n  return Object.assign({}, defaultType);\n}\n\nexport function getAllTypes(kind, custom) {\n  let all = [];\n\n  for (let type in lib[kind]) {\n    if (type !== 'default') {\n      all.push(getType(type, kind, custom));\n    }\n  }\n  return all;\n}\n\nexport default lib;\n","/*\n    Modified from https://github.com/justmoon/node-extend\n    Copyright (c) 2014 Stefan Thomas\n */\n\n/* eslint prefer-rest-params: 0 */\n\nlet hasOwn = Object.prototype.hasOwnProperty;\nlet toStr = Object.prototype.toString;\n\nlet isArray = function isArray(arr) {\n  if (typeof Array.isArray === 'function') {\n    return Array.isArray(arr);\n  }\n\n  return toStr.call(arr) === '[object Array]';\n};\n\nlet isPlainObject = function isPlainObject(obj) {\n  if (!obj || toStr.call(obj) !== '[object Object]') {\n    return false;\n  }\n\n  let hasOwnConstructor = hasOwn.call(obj, 'constructor');\n  let hasIsPrototypeOf =\n    obj.constructor &&\n    obj.constructor.prototype &&\n    hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n  // Not own constructor property must be Object\n  if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n    return false;\n  }\n\n  // Own properties are enumerated firstly, so to speed up,\n  // if last one is own, then all properties are own.\n  let key;\n  for (key in obj) {\n    /**/\n  }\n\n  return typeof key === 'undefined' || hasOwn.call(obj, key);\n};\nexport default function defaults() {\n  let options, name, src, copy, copyIsArray, clone;\n  let target = arguments[0];\n  let i = 1;\n  let length = arguments.length;\n  let deep = false;\n\n  // Handle a deep copy situation\n  if (typeof target === 'boolean') {\n    deep = target;\n    target = arguments[1] || {};\n    // skip the boolean and the target\n    i = 2;\n  } else if (\n    (typeof target !== 'object' && typeof target !== 'function') ||\n    target == null\n  ) {\n    target = {};\n  }\n\n  for (; i < length; ++i) {\n    options = arguments[i];\n    // Only deal with non-null/undefined values\n    if (options != null) {\n      // Extend the base object\n      for (name in options) {\n        src = target[name];\n        copy = options[name];\n\n        // Prevent never-ending loop\n        if (target !== copy) {\n          // Recurse if we're merging plain objects or arrays\n          if (\n            deep &&\n            copy &&\n            (isPlainObject(copy) || (copyIsArray = isArray(copy)))\n          ) {\n            if (copyIsArray) {\n              copyIsArray = false;\n              clone = src && isArray(src) ? src : [];\n            } else {\n              clone = src && isPlainObject(src) ? src : {};\n            }\n\n            // Never move original objects, clone them\n            if (typeof target[name] === 'undefined') {\n              target[name] = defaults(deep, clone, copy);\n            } else {\n              defaults(deep, clone, copy);\n            }\n\n            // Don't bring in undefined values\n          } else if (typeof copy !== 'undefined') {\n            if (typeof target[name] === 'undefined') {\n              target[name] = copy;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  // Return the modified object\n  return target;\n}\n","import { getAllTypes, getType } from './types';\nimport util from './types/common';\nimport defaults from './util/defaults';\n\nconst elnPlugin = {\n  util,\n  /**\n   *\n   * @param {*} type\n   * @param {*} doc\n   * @param {*} content\n   * @param {*} customMetadata\n   * @param {object} [options={}]\n   * @param {boolean} [options.keepContent=false]\n   */\n  process(type, doc, content, customMetadata, options = {}) {\n    let filename = content.filename;\n    const typeProcessor = getType(type);\n    const arr = createFromJpath(doc, typeProcessor);\n    const entry = typeProcessor.find(arr, filename);\n    const property = typeProcessor.getProperty(filename, content);\n    if (property === undefined) {\n      throw new Error(`Could not get property of ${filename} (type ${type}`);\n    }\n    const metadata = typeProcessor.process(filename, content);\n\n    metadata[property] = {\n      filename: elnPlugin.getFilename(type, content.filename),\n    };\n\n    if (options.keepContent) {\n      metadata[property].data = util.getContent(content, property);\n    }\n\n    if (entry) {\n      Object.assign(entry, metadata, customMetadata);\n    } else {\n      Object.assign(metadata, customMetadata);\n      arr.push(metadata);\n    }\n\n    return doc;\n  },\n\n  getType(type, doc, kind) {\n    const typeProcessor = getType(type, kind);\n    return getFromJpath(doc, typeProcessor);\n  },\n\n  getFilename(type, filename) {\n    let match = /[^/]*$/.exec(filename);\n    if (match) filename = match[0];\n    const typeProcessor = getType(type);\n    const jpath = typeProcessor.jpath;\n    if (!jpath) throw new Error('No such type or no jpath');\n    return jpath.concat(filename).join('/');\n  },\n\n  getEmpty(kind, content) {\n    const typeProcessors = getAllTypes(kind);\n    if (!content) content = {};\n    for (let i = 0; i < typeProcessors.length; i++) {\n      createFromJpath(content, typeProcessors[i]);\n    }\n\n    return content;\n  },\n\n  defaults(kind, content) {\n    let empty = elnPlugin.getEmpty(kind);\n    defaults(true, content, empty);\n    return content;\n  },\n};\n\nfunction createFromJpath(doc, typeProcessor) {\n  const jpath = typeProcessor.jpath;\n  if (!jpath) {\n    throw new Error('createFromJpath: undefined jpath argument');\n  }\n  for (let i = 0; i < jpath.length; i++) {\n    if (doc[jpath[i]] === undefined) {\n      if (i !== jpath.length - 1) {\n        doc[jpath[i]] = {};\n      } else {\n        doc[jpath[i]] = typeProcessor.getEmpty();\n      }\n    }\n    doc = doc[jpath[i]];\n  }\n  if (jpath.length === 0) {\n    doc = Object.assign(doc, typeProcessor.getEmpty());\n  }\n  return doc;\n}\n\nfunction getFromJpath(doc, typeProcessor) {\n  if (!doc) return undefined;\n  const jpath = typeProcessor.jpath;\n  if (!jpath) throw new Error('getFromJpath: undefined jpath argument');\n  for (let i = 0; i < jpath.length; i++) {\n    if (doc[jpath[i]] === undefined) {\n      return undefined;\n    }\n    doc = doc[jpath[i]];\n  }\n  return doc;\n}\n\nexport default elnPlugin;\n"],"names":["defaultType","process","getEmpty","reactiongeneral","jpath","code","date","Date","now","procedure","products","reagents","conditions","meta","remarks","title","reactionRXN","root","byteArray","byteCount","byteIndex","stringFromCharCode","String","fromCharCode","ucs2decode","string","value","extra","output","counter","length","charCodeAt","push","checkScalarValue","codePoint","Error","toString","toUpperCase","createByte","shift","encodeCodePoint","symbol","readContinuationByte","continuationByte","decodeSymbol","byte1","version","encode","codePoints","index","byteString","decode","tmp","array","ucs2encode","exports","IOBuffer","constructor","data","options","dataIsGiven","ArrayBuffer","this","lastWrittenByte","byteLength","offset","dvOffset","isView","buffer","byteOffset","littleEndian","_data","DataView","_mark","_marks","available","isLittleEndian","setLittleEndian","isBigEndian","setBigEndian","skip","n","seek","mark","reset","pushMark","popMark","pop","undefined","rewind","ensureAvailable","newLength","newArray","Uint8Array","set","readBoolean","readUint8","readInt8","getInt8","getUint8","readByte","readBytes","bytes","i","readInt16","getInt16","readUint16","getUint16","readInt32","getInt32","readUint32","getUint32","readFloat32","getFloat32","readFloat64","getFloat64","readChar","readChars","result","readUtf8","bString","writeBoolean","writeUint8","writeInt8","setInt8","_updateLastWrittenByte","setUint8","writeByte","writeBytes","writeInt16","setInt16","writeUint16","setUint16","writeInt32","setInt32","writeUint32","setUint32","writeFloat32","setFloat32","writeFloat64","setFloat64","writeChar","str","writeChars","writeUtf8","toArray","padding","utils$2","notNetcdf","statement","reason","TypeError","readName","nameLength","name","require$$0","types","BYTE","CHAR","SHORT","INT","FLOAT","DOUBLE","readNumber","size","bufferReader","numbers","Array","typesModule","types$3","num2str","type","Number","num2bytes","str2num","readType","substring","trimNull","bind","data$1","nonRecord","variable","record","recordDimension","width","step","recordStep","currentOffset","utils","require$$1","attributesList","gAttList","attributeSize","attributes","gAtt","header_1","header","dimList","recordId","recordName","dimensionSize","dimensions","dim","dimensionsList","id","globalAttributes","variables","varList","variableSize","v","dimensionality","dimensionsIds","varSize","variablesList","toString_1","dimension","padEnd","attribute","JSON","parse","stringify","getDataVariable","isNaN","join","require$$2","readHeader","require$$3","require$$4","agilentGCMS_1","reader","time","tic","pointCount","massValues","intensityValues","ms","j","times","series","brukerGCMS","scanIndex","agilentHPLC_1","intensities","numberPoints","detector","getAttribute","channel","match","replace","delayTime","runtimeLength","samplingInterval","dataVariableExists","Math","abs","finniganGCMS_1","shimadzuGCMS_1","advionGCMS_1","aiaTemplate_1","interval","currentTime","NetCDFReader","attributeName","find","val","getDataVariableAsString","variableName","call","attributeExists","agilentGCMS","agilentHPLC","finniganGCMS","shimadzuGCMS","require$$5","advionGCMS","require$$6","aiaTemplate","require$$7","addMeta","ans","item","addVariables","srcModule","arguments","instrument_mfr","dataset_origin","mass_values","detector_name","aia_template_revision","source_file_format","src$2","fromAgilentGCMS","fromAgilentHPLC","fromFinniganGCMS","fromAiaTemplate","w","atobNative","atobBest","window","atob","Buffer","a","base64js","buf","b64ToByteArray","prototype","map","ch","module","base64Js","b64","lens","getLens","validLen","placeHoldersLen","toByteArray_1","toByteArray","arr","Arr","_byteLength","curByte","len","revLookup","fromByteArray","uint8","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","indexOf","start","end","num","ensureString","blob","encoding","guessEncoding","TextDecoder","isutf8","parseString","lowercase","toLowerCase","number","includes","GC_MS_FIELDS","complexChromatogram","spectra","chromatogram","existingGCMSFields","label","convertMSFieldToLabel","spectrum","pageValue","x","y","isMSField","canonicDataLabel","convertToFloatArray","stringArray","floatArray","fastParseXYData","yFactor","deltaX","isXYdata","currentData","ascii","currentX","firstX","currentY","firstY","endLine","newLine","isDifference","isLastDifference","lastDifference","isDuplicate","inComment","currentValue","lastValue","isNegative","inValue","skipFirstValue","decimalPosition","pow","duplicate","ascii2","removeCommentRegExp","peakTableSplitRegExp","parsePeakTable","isPeaktable","Object","keys","numberOfVariables","forEach","lines","split","values","trim","logs","parseXYZ","xFactor","parseXY","key","parseXYA","removeSymbolRegExp","isXYAdata","isAnyArray","endsWith","d","e","f","g","h","c","b","_ref","median","input","quickSelectMedian","slice","add2D","zData","minZ","maxZ","ySize","xSize","z","lastX","lastY","reverse","medians","row","Float64Array","from","getMedian","minX","min","maxX","max","minY","maxY","noise","convertTo3DZ","noContour","contourLines","povarHeight0","povarHeight1","povarHeight2","povarHeight3","isOver0","isOver1","isOver2","isOver3","pAx","pAy","pBx","pBy","lineZValue","nbSubSpectra","nbPovars","x0","dx","y0","dy","iter","nbContourLevels","contourLevels","level","contourLevel","side","factor","noiseMultiplier","exp","zValue","iSubSpectra","subSpectra","subSpectraAfter","povar","segments","generateContourLines","minMax","gyromagneticRatio","profiling","action","simpleChromatogram","intensity","postProcessing","entriesFlat","entry","observeFrequency","shiftOffsetVal","ntuples","xUnits","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","charAt","lowerCaseSymbol","first","last","vardim","nbPoints","varname","yUnits","prepareSpectrum","ntuplesSeparatorRegExp","defaultOptions","keepRecordsRegExp","canonicDataLabels","canonicMetadataLabels","dynamicTyping","withoutXY","convert","jcamp","entries","tmpResult","children","parentsStack","ldrs","ldr","position","dataLabel","dataValue","infos","datatable","parentEntry","info","dataType","dataClass","xType","shiftOffsetNum","vartype","varform","page","sampleDescription","target","isArray","flatten","common","util","getBasename","filename","getReference","base","getExtension","getFilename","typeEntry","basenameFind","typeEntries","reference","referenceFind","getTargetProperty","getContent","content","getTextContent","getBufferContent","getMetaFromJcamp","extension","mapping","metaData","parsed","CHEMINFO","cheminfo","console","trace","paths","currentTarget","samplechromatogram","getProperty","bufferContent","parseNetCDF","samplecyclicVoltammetry","sampledifferentialCentrifugalSedimentation","sampledifferentialScanningCalorimetry","sampledls","sampleelementAnalysis","MONTHS","getLengthOfWhiteSpaceBeforeStartOfLetters","exec","src","sequence","currentFeatureNote","fieldName","subFieldType","featureLocationIndentation","lastLineWasFeaturesTag","lastLineWasLocation","resultsArray","genbankAnnotationKey","hasFoundLocus","line","lineFieldName","getLineFieldName","getLineVal","isSubKey","isSubKeyword","isKey","isKeyword","parseLocus","parseFeatures","parseOrigin","parseMultiLineField","ref","references","parseReference","endSeq","features","postProcessGenbankFeature","postProcessCurSeq","getCurrentFeature","m","removeFieldName","locusName","moleculeType","circular","seq","dateStr","genbankDivision","dateMatch","setFullYear","setUTCMonth","setDate","setUTCHours","setMinutes","setSeconds","setMilliseconds","toISOString","fName","subType","refs","lastRef","strand","indentationOfLine","isFeatureLineRunon","parseFeatureLocation","qual","isNote","lineArr","currentNotes","notes","parseFeatureNote","feat","locStr","locArr","resultKey","r","fieldValue","substr","gene","ApEinfo_label","organism","locus_tag","note","samplegenbank","genbank","toReturn","textContent","genbankParser","p","parsedSequence","samplegeneral","description","mf","molfile","mw","keyword","samplehgPorosimetry","sampleicp","sampleimage","sampleir","sampleisotherm","sampleiv","samplemass","EXPERIMENT","INJECTION","MODE","INSTRUMENT","ANALYZER","IONISATION","CONDITIONS","ACCURATEMF","ACCURATEMODIF","ACCURATERESULT","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","maxValue","minValue","rescale","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","inspectData","rows","columns","maxI","maxJ","formatNumber","get","numStr","precise","toPrecision","exponential","toExponential","eIndex","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","newMatrix","Matrix","column","fill","random","round","zeros","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","iMax","swapRows","reducedEchelonForm","maxRow","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","NEGATIVE_INFINITY","maxIndex","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","sqrt","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","resultat","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","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","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","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","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","leftHandSide","rightHandSide","useSVD","_typeof","obj","iterator","sequentialFill","_options","_options$from","_options$to","to","_options$size","_i","ascending","bisector","compare","ascendingComparator","left","lo","hi","mid","right","ascendingBisect","bisectRight","bisectLeft","descending","number$1","deviation","extent","constant","range","stop","e10","e5","e2","ticks","tickStep","step0","step1","LN10","error","sturges","LN2","histogram","domain","xz","x1","tz","bin","bins","_","thresholds","quantile","freedmanDiaconis","scott","merge","arrays","merged","pairs","permute","indexes","permutes","scan","xi","xj","shuffle","i0","i1","zip","bisect","thresholdFreedmanDiaconis","thresholdScott","thresholdSturges","factory","splineInterpolator","xIn","yIn","lambda","sigma","params","u","mu","quincunx","smoothingSpline","interpolate","xStart","delta","Infinity","curve","nInterval","vals","impurities","cdcl3","tms","proton","coupling","multiplicity","solvent","h2o","acetic_acid","acetone","acetonitrile","benzene","bhtb","chloroform","cyclohexane","dichloromethane","diethyl_ether","diglyme","dimethylacetamide","dimethylformamide","dimethyl_sulfoxide","dioxane","ethanol","ethyl_acetate","ethyl_methyl_ketone","ethylene_glycol","hmpag","methanol","nitromethane","pyridine","silicone_greasei","tetrahydrofuran","toluene","triethylamine","dmso","c6d6","cd3cn","cd3od","d2o","toCheck","peaksFilterImpurities","peakList","remove","solventImpurities","impurity","checkImpurity","tolerance","difference","asymmetric","GAUSSIAN_EXP_FACTOR","ROOT_PI_OVER_LN2","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","erfinv","ln1MinusXSqrd","lnEtcBy2Plus2","firstSqrt","Shape1D","Gaussian","fwhm","sd","height","widthToFWHM","fwhmToWidth","fct","getArea","getFactor","area","getData","Lorentzian","PseudoVoigt","lorentzian","gaussian","getFactorLorentzian","getFactorGaussian","getShape1D","shapeOptions","SavitzkyGolay","ys","xs","windowSize","derivative","polynomial","half","np","weights","fullWeights","hs","constantH","wg1","wg2","d1","d2","getHs","wg","GramPoly","Grampoly","GenFact","gf","Weight","isEqualSpaced","maxDx","minDx","MAX_SAFE_INTEGER","getNoiseLevel","stddev","averageDeviations","determineRealTop","beta","gamma","currentPoint","isEnumerable","propertyIsEnumerable","getSymbols","getOwnPropertySymbols","isObject","assignSymbols","_len","args","_key","arg","names","isValidKey","assign","assignDeepModule","isPrimitive","setFWHM","setHeight","squareFWHM","setMu","sumOfGaussianLorentzians","nL","sumOfGaussians","sumOfLorentzians","checkInput","peaks","paramsFunc","defaultParameters","shape","optimization","init","peak","gradientDifference","getMaxValue","parameters","assignDeep","par","object","checkOptions","parameterizedFunction","timeout","minValues","maxValues","initialValues","damping","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","centralDifference","improvementThreshold","filler","checkTimeout","parLen","MIN_SAFE_INTEGER","endTime","weightSquare","errorCalculation","func","evaluatedData","gradientFunc","paramFunction","nbParams","param","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeigthResidualError","perturbations","levenbergMarquardt","converged","iteration","previousError","parameterValues","parameterError","iterations","selectMethod","optimizationOptions","getKind","algorithm","LM","lmOptions","optimize","nbShapes","parameterKey","pMin","pMax","pInit","gradientDifferenceValue","pFit","xAbsoluteMedian","tmpArray","xAbsolute","xFindClosestIndex","low","high","xGetFromToIndex","P1","Q1","P2","Q2","P3","Q3","P4","Q4","P5","Q5","polyval","coef","calc","P","Q","erfcinv","rayleighCdf","xNoiseSanPlot","mask","cutOff","refine","magnitudeMode","scaleFactor","factorStd","fixOffset","filter","_e","medianIndex","firstNegativeValueIndex","findIndex","lastPositiveValueIndex","initialNoiseLevelNegative","signPositive","signNegative","cutOffDist","determineCutOff","pIndex","initialNoiseLevelPositive","skyPoint","noiseLevelPositive","noiseLevelNegative","cloneSignPositive","cloneSignNegative","cutOffSignalsIndexPlus","cutOffSignalsIndexNeg","cutOffSignals","effectiveCutOffDist","refinedCorrectionFactor","correctionFactor","simpleNormInv","positive","negative","snr","sanplot","generateSanPlot","fromTo","considerList","indexMax","minKi","whereToCutStat","top","elementsOfCutOff","averageValue","reduce","kiSqrt","xTraining","createArray","yTraining","finalInput","interp","SplineInterpolator","yValue","SQRT2","logBaseY","logOfBase","xAxis","xyCheck","zonesNormalize","zones","zone","currentZone","xyExtract","newX","newY","loop","xyIntegration","currentxyIntegration","groupPeaks","previousPeak","currentGroup","groups","group","optimizePeaks","factorWidth","factorLimits","results","firstPeak","lastPeak","currentRange","optimizedPeaks","concat","joinBroadPeaks","broadLines","soft","MAX_VALUE","candidates","fitted","xyAutoPeaksPicking","noiseLevel","thresholdFactor","minMaxRatio","broadRatio","useSanPlot","smoothY","realTopDetection","broadWidth","lookNegative","sgOptions","getCutOff","getPeakOptions","getPeakList","getNegativePeaks","heightFactor","maxCriteria","derivativeThreshold","equalSpaced","dY","ddY","yData","SG","xData","dX","maxDdy","lastMax","lastMin","minddY","intervalL","intervalR","broadMask","possible","frequency","distanceJ","minDistance","gettingCloser","widthProcessor","signals","lastK","yLeft","yRight","gsd","negativeDataY","formatResult","patterns","jAxisKeys","jAxis","jAnalyzer","signal","jAxisKey","symRank","symmetrizeChoiseBest","maxError","peaksComp","n2","maxFlagged","Jc","normalize","validPattern","ranges","getRanges","heights","getNextCombination","numbering","nFlagged","jSum","pattern","idealPattern","updateSignal","observe","nbPeaks","startX","stopX","integralData","maskPattern","mask2","cont","newNmrJs","nmrJs","abstractPattern","ok","lng","currentIndex","active","symRank1","symmetrize","tmpPeaks","tmpMask","delta1","symRank2","avg","avgWidth","heightSum","diffL","diffR","chemicalShift","symFactor","weight","newSumHeights","dxi","joinRanges","integral","peaksToRanges","integrationSum","joinOverlapRanges","clean","compile","integralType","frequencyCluster","keepPeaks","signalOptions","detectSignals","nHi","peaksO","computeArea","peakR","peaks1","sumIntegral","sumObserved","signal1D","prevPeak","spectrumIntegral","integralPeaks","integralFactor","xyAutoRangesPicking","peakPicking","getMetaData","metadata","isFid","isFt","isComplex","experiment","maybeAdd","TITLE","PULPROG","spectyp","pulse","$SPECTYP","getSpectrumType","parseFloat","TE","DATATYPE","PROBHD","FNTYPE","EXPNO","nuc","SYMBOL","symbols","DATE","computeRanges","defaultRangesOptions","defaultPeaksOptions","replaceFid","samplenmr","nmr","test","jcampData","parsedJcamp","rangesOptions","peaksOptions","fromJcamp","reg2","sampleoan","samplepelletHardness","samplepermeability","samplephysical","sampleraman","samplestock","samplethermogravimetricAnalysis","sampleuv","samplevideo","samplevoidVolume","samplexps","samplexray","samplexrd","samplexrf","lib","lib$1","getType","custom","default","hasOwn","hasOwnProperty","toStr","isPlainObject","hasOwnConstructor","hasIsPrototypeOf","defaults","copyIsArray","deep","elnPlugin","doc","customMetadata","typeProcessor","createFromJpath","property","keepContent","getFromJpath","typeProcessors","all","getAllTypes"],"mappings":"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"}