{"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/base64-js/index.js","../node_modules/atob/browser-atob.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/elementAnalysis.js","../node_modules/genbank-parser/src/utils/months.js","../node_modules/genbank-parser/src/index.js","../src/types/sample/genbank.js","../src/types/sample/general.js","../src/types/sample/hgPorosimetry.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/jcampconverter/src/complexChromatogram.js","../node_modules/jcampconverter/src/convertToFloatArray.js","../node_modules/jcampconverter/src/parse/fastParseXYData.js","../node_modules/jcampconverter/src/parse/parsePeakTable.js","../node_modules/jcampconverter/src/parse/parseXYA.js","../node_modules/is-any-array/src/index.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-array-median/lib-es6/index.js","../node_modules/jcampconverter/src/2d/add2D.js","../node_modules/jcampconverter/src/2d/convertTo3DZ.js","../node_modules/jcampconverter/src/2d/generateContourLines.js","../node_modules/ml-gsd/node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/ml-gsd/node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/ml-gsd/node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/ml-gsd/node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/ml-gsd/node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../node_modules/ml-savitzky-golay-generalized/src/index.js","../node_modules/ml-gsd/src/gsd.js","../node_modules/ml-gsd/node_modules/ml-peak-shape-generator/src/util/getShapeGenerator.js","../node_modules/assign-symbols/index.js","../node_modules/assign-deep/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-spectra-fitting/node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/ml-spectra-fitting/node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/ml-spectra-fitting/node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/ml-spectra-fitting/node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/ml-spectra-fitting/node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../node_modules/ml-spectra-fitting/src/shapes/sumOfGaussianLorentzians.js","../node_modules/ml-spectra-fitting/src/shapes/sumOfGaussians.js","../node_modules/ml-spectra-fitting/src/shapes/sumOfLorentzians.js","../node_modules/ml-levenberg-marquardt/src/errorCalculation.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-levenberg-marquardt/src/step.js","../node_modules/ml-levenberg-marquardt/src/gradientFunction.js","../node_modules/ml-levenberg-marquardt/src/index.js","../node_modules/ml-levenberg-marquardt/src/checkOptions.js","../node_modules/ml-spectra-fitting/src/selectMethod.js","../node_modules/ml-spectra-fitting/src/index.js","../node_modules/ml-spectra-fitting/src/checkInput.js","../node_modules/ml-spectra-processing/src/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/src/x/xGetFromToIndex.js","../node_modules/ml-gsd/src/post/optimizePeaks.js","../node_modules/ml-gsd/src/post/groupPeaks.js","../node_modules/ml-gsd/src/post/joinBroadPeaks.js","../node_modules/jcampconverter/node_modules/nmr-processing/src/constants/gyromagneticRatio.js","../node_modules/jcampconverter/src/profiling.js","../node_modules/jcampconverter/src/simpleChromatogram.js","../node_modules/jcampconverter/src/postProcessing.js","../node_modules/jcampconverter/src/postProcessingNMR.js","../node_modules/jcampconverter/src/prepareNtuplesDatatable.js","../node_modules/jcampconverter/src/prepareSpectrum.js","../node_modules/jcampconverter/src/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-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/xy/xyExtract.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/src/xy/xyAutoPeaksPicking.js","../node_modules/nmr-processing/src/xy/xyGetArea.js","../node_modules/nmr-processing/node_modules/ml-spectra-processing/src/x/xGetFromToIndex.js","../node_modules/nmr-processing/src/peaks/util/jAnalyzer.js","../node_modules/nmr-processing/src/peaks/peaksToRanges.js","../node_modules/nmr-processing/src/xy/xyAutoRangesPicking.js","../node_modules/nmr-processing/src/peaks/util/joinRanges.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/physical.js","../src/types/sample/raman.js","../src/types/sample/thermogravimetricAnalysis.js","../src/types/sample/uv.js","../src/types/sample/video.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      keywords: [],\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","'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","(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","import atob from 'atob';\nimport { toByteArray } from 'base64-js';\n\nconst common = {};\nexport default common;\ncommon.getBasename = function (filename) {\n  let base = filename.replace(/.*\\//, '');\n  return base.replace(/\\.[0-9]+$/, '');\n};\n\ncommon.getExtension = function (filename) {\n  let extension = common.getBasename(filename);\n  return extension.replace(/.*\\./, '').toLowerCase();\n};\n\ncommon.getFilename = function (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 (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.getTargetProperty = function (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 (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","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}\nexport default {\n  jpath: ['spectra', 'chromatogram'],\n  find: common.basenameFind,\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};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'differentialCentrifugalSedimentation'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'differentialScanningCalorimetry'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'elementalAnalysis'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\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","/* 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","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};\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};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'isotherm'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'iv'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'mass'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","const GC_MS_FIELDS = ['TIC', '.RIC', 'SCANNUMBER'];\n\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\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\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] = parseFloat(\n        spectrum[existingGCMSFields[j]],\n      );\n    }\n    if (spectrum.data) {\n      chromatogram.series.ms.data[i] = [spectrum.data.x, spectrum.data.y];\n    }\n  }\n  result.chromatogram = chromatogram;\n}\n\nexport function isMSField(canonicDataLabel) {\n  return GC_MS_FIELDS.indexOf(canonicDataLabel) !== -1;\n}\n\nexport function convertMSFieldToLabel(value) {\n  return value.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n","export default function convertToFloatArray(stringArray) {\n  let floatArray = [];\n  for (let i = 0; i < stringArray.length; i++) {\n    floatArray.push(parseFloat(stringArray[i]));\n  }\n  return floatArray;\n}\n","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\n  let yFactor = spectrum.yFactor;\n  let deltaX = spectrum.deltaX;\n\n  spectrum.isXYdata = true;\n  let currentData = { x: [], y: [] };\n  spectrum.data = currentData;\n\n  let currentX = spectrum.firstX;\n  let currentY = spectrum.firstY;\n\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    } else {\n      if (endLine) break;\n    }\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) ascii = 13;\n    else 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    } 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        } else {\n          currentValue *= 10;\n          currentValue += ascii - 48;\n        }\n      } else if (ascii === 44 || ascii === 46) {\n        // a \",\" or \".\"\n        inValue = true;\n        decimalPosition++;\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) skipFirstValue = true;\n          } else {\n            // need to deal with duplicate and differences\n            if (skipFirstValue) {\n              skipFirstValue = false;\n            } else {\n              if (isDifference) {\n                lastDifference = isNegative ? 0 - currentValue : currentValue;\n                isLastDifference = true;\n                isDifference = false;\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                } 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\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        } 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        } 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        } else if (ascii > 82 && ascii < 91) {\n          inValue = true;\n          isDuplicate = true;\n          currentValue = ascii - 82;\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        } 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        } 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        } 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        } 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 (\n            (ascii2 >= 48 && ascii2 <= 57) ||\n            ascii2 === 44 ||\n            ascii2 === 46\n          ) {\n            inValue = true;\n            if (!newLine) isLastDifference = false;\n            isNegative = true;\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","const removeCommentRegExp = /\\$\\$.*/;\nconst peakTableSplitRegExp = /[,\\t ]+/;\n\nexport default function parsePeakTable(spectrum, value, result) {\n  spectrum.isPeaktable = true;\n\n  if (!spectrum.variables || Object.keys(spectrum.variables) === 2) {\n    parseXY(spectrum, value, result);\n  } else {\n    parseXYZ(spectrum, value, result);\n  }\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}\n\nfunction parseXY(spectrum, value, result) {\n  let currentData = { x: [], y: [] };\n  spectrum.data = currentData;\n\n  // counts for around 20% of the time\n  let lines = value.split(/,? *,?[;\\r\\n]+ */);\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 parseFloat\n        currentData.x.push(parseFloat(values[j]) * spectrum.xFactor);\n        currentData.y.push(parseFloat(values[j + 1]) * spectrum.yFactor);\n      }\n    } else {\n      result.logs.push(`Format error: ${values}`);\n    }\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\n  // counts for around 20% of the time\n  let lines = value.split(/,? *,?[;\\r\\n]+ */);\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(\n          parseFloat(values[j]),\n        );\n      }\n    } else {\n      result.logs.push(`Format error: ${values}`);\n    }\n  }\n}\n","export default function parseXYA(spectrum, value) {\n  let removeSymbolRegExp = /(\\(+|\\)+|<+|>+|\\s+)/g;\n\n  spectrum.isXYAdata = true;\n  let values;\n  let currentData = { x: [], y: [] };\n  spectrum.data = currentData;\n\n  let lines = value.split(/,? *,?[;\\r\\n]+ */);\n\n  for (let i = 1; i < lines.length; i++) {\n    values = lines[i].trim().replace(removeSymbolRegExp, '').split(',');\n    currentData.x.push(parseFloat(values[0]));\n    currentData.y.push(parseFloat(values[1]));\n  }\n}\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","(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 isArray from 'is-any-array';\nimport quickSelectMedian from 'median-quickselect';\n\nfunction median(input) {\n  if (!isArray(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 default median;\n","import convertTo3DZ from './convertTo3DZ';\nimport generateContourLines from './generateContourLines';\n\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","import getMedian from 'ml-array-median';\n\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\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) minZ = value;\n      if (value > maxZ) maxZ = value;\n    }\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\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\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: getMedian(z[0].map(Math.abs)),\n  };\n}\n","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\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\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\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 =\n      (maxZ - options.noiseMultiplier * noise) *\n      Math.exp((level >> 1) - options.nbContourLevels);\n    if (side === 0) {\n      lineZValue = factor + options.noiseMultiplier * noise;\n    } else {\n      lineZValue = 0 - factor - options.noiseMultiplier * noise;\n    }\n    let lines = [];\n    contourLevel.zValue = lineZValue;\n    contourLevel.lines = lines;\n\n    if (lineZValue <= minZ || lineZValue >= maxZ) continue;\n\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\n        isOver0 = povarHeight0 > lineZValue;\n        isOver1 = povarHeight1 > lineZValue;\n        isOver2 = povarHeight2 > lineZValue;\n        isOver3 = povarHeight3 > lineZValue;\n\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\n  return {\n    minX: zData.minX,\n    maxX: zData.maxX,\n    minY: zData.minY,\n    maxY: zData.maxY,\n    segments: contourLevels,\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","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=x] 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","// 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 { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] 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=x] 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","/**\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 { getShapeGenerator } 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 (noiseLevel === undefined) {\n    noiseLevel = equalSpaced ? getNoiseLevel(y) : 0;\n  }\n\n  const yCorrection = { m: 1, b: noiseLevel };\n\n  if (!maxCriteria) {\n    yCorrection.m = -1;\n    yCorrection.b *= -1;\n  }\n\n  for (let i = 0; i < y.length; i++) {\n    y[i] = yCorrection.m * y[i] - yCorrection.b;\n  }\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    // console.log('pasa', y[i], dY[i], ddY[i]);\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    ? getShapeGenerator(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: (yData[minddY[j]] + yCorrection.b) / yCorrection.m,\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(function (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","import { Gaussian } from '../classes/Gaussian';\nimport { Lorentzian } from '../classes/Lorentzian';\nimport { PseudoVoigt } from '../classes/PseudoVoigt';\n\nexport function getShapeGenerator(options) {\n  let { kind = 'Gaussian', options: shapeOptions } = options;\n  switch (kind.toLowerCase().replace(/[^a-z]/g, '')) {\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      throw new Error(`Unknown kind: ${kind}`);\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","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(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 default max;\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","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=x] 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","// 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 { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] 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=x] 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","/**\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 isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(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 default min;\n","import isArray 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 (!isArray(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 (!isArray(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 default rescale;\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","/**\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 checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\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 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  checkIndices,\n  checkNonEmpty,\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() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(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        }\n      }\n    }\n    return v;\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() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(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        }\n      }\n    }\n    return v;\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    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  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    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[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 (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(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 (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(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 (!Array.isArray(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 (!Array.isArray(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[\n    Symbol.for('nodejs.util.inspect.custom')\n  ] = inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (Array.isArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class 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 { 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 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","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 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","/**\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","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","/**\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';\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(function (a, b) {\n    return a.x - b.x;\n  });\n\n  return peakList;\n}\n","// sources:\n// https://en.wikipedia.org/wiki/Gyromagnetic_ratio\n\n// TODO: #13 can we have a better source and more digits ? @jwist\n\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","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","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","import add2D from './2d/add2D';\nimport { complexChromatogram } from './complexChromatogram';\nimport postProcessingNMR from './postProcessingNMR';\nimport profiling from './profiling';\nimport simpleChromatogram from './simpleChromatogram';\n\nexport default function postProcessing(entriesFlat, result, options) {\n  // converting Hz to ppm\n  postProcessingNMR(entriesFlat);\n\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]) newNtuples[j] = {};\n          newNtuples[j][key] = values[j];\n        }\n      }\n      entry.ntuples = newNtuples;\n    }\n\n    if (entry.twoD && options.wantXY) {\n      add2D(entry, options);\n\n      profiling(result, 'Finished countour plot calculation', options);\n\n      if (!options.keepSpectra) {\n        delete entry.spectra;\n      }\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      } else {\n        simpleChromatogram(entry);\n      }\n      profiling(result, 'Finished chromatogram calculation', options);\n    }\n    delete entry.tmp;\n  }\n}\n","import { gyromagneticRatio } from 'nmr-processing';\n\nexport default function postProcessingNMR(entriesFlat) {\n  // specific NMR functions\n  let observeFrequency = 0;\n  let shiftOffsetVal = 0;\n\n  for (let entry of entriesFlat) {\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      } else {\n        observeFrequency = spectrum.observeFrequency;\n        shiftOffsetVal = spectrum.shiftOffsetVal;\n      }\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\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') entry.ntuples.nucleus[i] = entry.tmp.$NUC2;\n            if (symbol === 'F2') entry.ntuples.nucleus[i] = entry.tmp.$NUC1;\n          }\n          if (symbol === 'F2') {\n            entry.yType = entry.ntuples.nucleus[0];\n          }\n        }\n      }\n\n      if (\n        observeFrequency &&\n        entry.ntuples &&\n        entry.ntuples.symbol &&\n        entry.ntuples.nucleus\n      ) {\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\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","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  } 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) 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\n  if (xIndex === -1) xIndex = 0;\n  if (yIndex === -1) yIndex = 0;\n\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 (\n    currentEntry.ntuples.vardim &&\n    currentEntry.ntuples.vardim.length > xIndex\n  ) {\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 (\n        currentEntry.ntuples.varname &&\n        currentEntry.ntuples.varname[xIndex]\n      ) {\n        spectrum.xUnits = `${currentEntry.ntuples.varname[xIndex]} [${currentEntry.ntuples.units[xIndex]}]`;\n      } else {\n        spectrum.xUnits = currentEntry.ntuples.units[xIndex];\n      }\n    }\n    if (currentEntry.ntuples.units.length > yIndex) {\n      if (\n        currentEntry.ntuples.varname &&\n        currentEntry.ntuples.varname[yIndex]\n      ) {\n        spectrum.yUnits = `${currentEntry.ntuples.varname[yIndex]} [${currentEntry.ntuples.units[yIndex]}]`;\n      } else {\n        spectrum.yUnits = currentEntry.ntuples.units[yIndex];\n      }\n    }\n  }\n}\n","export default function prepareSpectrum(spectrum) {\n  if (!spectrum.xFactor) spectrum.xFactor = 1;\n  if (!spectrum.yFactor) spectrum.yFactor = 1;\n}\n","import { 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\n// the following RegExp can only be used for XYdata, some peakTables have values with a \"E-5\" ...\nconst ntuplesSeparatorRegExp = /[ \\t]*,[ \\t]*/;\nconst numberRegExp = /^[-+]?[0-9]*\\.?[0-9]+(e[-+]?[0-9]+)?$/;\n\nclass Spectrum {}\n\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 *\n * @param {text} jcamp\n * @param {object} [options]\n * @param {number} [options.keepRecordsRegExp=/^$/] By default we don't keep meta information\n * @param {number} [options.canonicDataLabels=true] Canonize the Labels (uppercase without symbol)\n * @param {number} [options.canonicMetadataLabels=false] Canonize the metadata Labels (uppercase without symbol)\n * @param {number} [options.dynamicTyping=false] Convert numbers to Number\n * @param {number} [options.withoutXY=false] Remove the XY data\n * @param {number} [options.chromatogram=false] Special post-processing for GC / HPLC / MS\n * @param {number} [options.keepSpectra=false] Force to keep the spectra in case of 2D\n * @param {number} [options.noContour=false] Don't calculate countour in case of 2D\n * @param {number} [options.nbContourLevels=7] Number of positive / negative contour levels to calculate\n * @param {number} [options.noiseMultiplier=5] Define for 2D the level as 5 times the median as default\n * @param {number} [options.profiling=false] Add profiling information\n */\n\nexport default function convert(jcamp, options = {}) {\n  options = Object.assign({}, defaultOptions, options);\n  options.wantXY = !options.withoutXY;\n  options.start = Date.now();\n\n  let entriesFlat = [];\n\n  let result = {\n    profiling: options.profiling ? [] : false,\n    logs: [],\n    entries: [],\n  };\n\n  let tmpResult = { children: [] };\n  let currentEntry = tmpResult;\n  let parentsStack = [];\n\n  let spectrum = new Spectrum();\n\n  if (typeof jcamp !== 'string') {\n    throw new TypeError('the JCAMP should be a string');\n  }\n\n  profiling(result, 'Before split to LDRS', options);\n\n  let ldrs = jcamp.replace(/[\\r\\n]+##/g, '\\n##').split('\\n##');\n\n  profiling(result, 'Split to LDRS', options);\n\n  if (ldrs[0]) ldrs[0] = ldrs[0].replace(/^[\\r\\n ]*##/, '');\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\n    let canonicDataLabel = dataLabel.replace(/[_ -]/g, '').toUpperCase();\n\n    if (canonicDataLabel === 'DATATABLE') {\n      let endLine = dataValue.indexOf('\\n');\n      if (endLine === -1) endLine = dataValue.indexOf('\\r');\n      if (endLine > 0) {\n        // ##DATA TABLE= (X++(I..I)), XYDATA\n        // We need to find the variables\n\n        let infos = dataValue.substring(0, endLine).split(/[ ,;\\t]+/);\n        prepareNtuplesDatatable(currentEntry, spectrum, infos[0]);\n\n        spectrum.datatable = infos[0];\n        if (infos[1] && infos[1].indexOf('PEAKS') > -1) {\n          canonicDataLabel = 'PEAKTABLE';\n        } else if (\n          infos[1] &&\n          (infos[1].indexOf('XYDATA') || infos[0].indexOf('++') > 0)\n        ) {\n          canonicDataLabel = 'XYDATA';\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          spectrum.deltaX =\n            (spectrum.lastX - spectrum.firstX) / (spectrum.nbPoints - 1);\n\n          fastParseXYData(spectrum, dataValue, result);\n        } else {\n          parsePeakTable(spectrum, dataValue, result);\n        }\n        currentEntry.spectra.push(spectrum);\n        spectrum = new Spectrum();\n      }\n      continue;\n    } else if (canonicDataLabel === 'PEAKTABLE') {\n      if (options.wantXY) {\n        prepareSpectrum(spectrum);\n        parsePeakTable(spectrum, dataValue, result);\n        currentEntry.spectra.push(spectrum);\n        spectrum = new 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 = new Spectrum();\n      }\n      continue;\n    }\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    } else if (canonicDataLabel === 'DATATYPE') {\n      currentEntry.dataType = dataValue;\n      if (dataValue.toLowerCase().indexOf('nd') > -1) {\n        currentEntry.twoD = true;\n      }\n    } else if (canonicDataLabel === 'NTUPLES') {\n      if (dataValue.toLowerCase().indexOf('nd') > -1) {\n        currentEntry.twoD = true;\n      }\n    } else if (canonicDataLabel === 'DATACLASS') {\n      currentEntry.dataClass = dataValue;\n    } else if (canonicDataLabel === 'XUNITS') {\n      spectrum.xUnits = dataValue;\n    } else if (canonicDataLabel === 'YUNITS') {\n      spectrum.yUnits = dataValue;\n    } else if (canonicDataLabel === 'FIRSTX') {\n      spectrum.firstX = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'LASTX') {\n      spectrum.lastX = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'FIRSTY') {\n      spectrum.firstY = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'LASTY') {\n      spectrum.lastY = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'NPOINTS') {\n      spectrum.nbPoints = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'XFACTOR') {\n      spectrum.xFactor = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'YFACTOR') {\n      spectrum.yFactor = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'MAXX') {\n      spectrum.maxX = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'MINX') {\n      spectrum.minX = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'MAXY') {\n      spectrum.maxY = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'MINY') {\n      spectrum.minY = parseFloat(dataValue);\n    } else if (canonicDataLabel === 'DELTAX') {\n      spectrum.deltaX = parseFloat(dataValue);\n    } else if (\n      canonicDataLabel === '.OBSERVEFREQUENCY' ||\n      canonicDataLabel === '$SFO1'\n    ) {\n      if (!spectrum.observeFrequency) {\n        spectrum.observeFrequency = parseFloat(dataValue);\n      }\n    } else if (canonicDataLabel === '.OBSERVENUCLEUS') {\n      if (!spectrum.xType) {\n        currentEntry.xType = dataValue.replace(/[^a-zA-Z0-9]/g, '');\n      }\n    } else if (canonicDataLabel === '$OFFSET') {\n      // OFFSET for Bruker spectra\n      currentEntry.shiftOffsetNum = 0;\n      if (!spectrum.shiftOffsetVal) {\n        spectrum.shiftOffsetVal = parseFloat(dataValue);\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 = parseFloat(parts[3].trim());\n    } else if (canonicDataLabel === 'VARNAME') {\n      currentEntry.ntuples.varname = dataValue.split(ntuplesSeparatorRegExp);\n    } else if (canonicDataLabel === 'SYMBOL') {\n      currentEntry.ntuples.symbol = dataValue.split(ntuplesSeparatorRegExp);\n    } else if (canonicDataLabel === 'VARTYPE') {\n      currentEntry.ntuples.vartype = dataValue.split(ntuplesSeparatorRegExp);\n    } else if (canonicDataLabel === 'VARFORM') {\n      currentEntry.ntuples.varform = dataValue.split(ntuplesSeparatorRegExp);\n    } else if (canonicDataLabel === 'VARDIM') {\n      currentEntry.ntuples.vardim = convertToFloatArray(\n        dataValue.split(ntuplesSeparatorRegExp),\n      );\n    } else if (canonicDataLabel === 'UNITS') {\n      currentEntry.ntuples.units = dataValue.split(ntuplesSeparatorRegExp);\n    } else if (canonicDataLabel === 'FACTOR') {\n      currentEntry.ntuples.factor = convertToFloatArray(\n        dataValue.split(ntuplesSeparatorRegExp),\n      );\n    } else if (canonicDataLabel === 'FIRST') {\n      currentEntry.ntuples.first = convertToFloatArray(\n        dataValue.split(ntuplesSeparatorRegExp),\n      );\n    } else if (canonicDataLabel === 'LAST') {\n      currentEntry.ntuples.last = convertToFloatArray(\n        dataValue.split(ntuplesSeparatorRegExp),\n      );\n    } else if (canonicDataLabel === 'MIN') {\n      currentEntry.ntuples.min = convertToFloatArray(\n        dataValue.split(ntuplesSeparatorRegExp),\n      );\n    } else if (canonicDataLabel === 'MAX') {\n      currentEntry.ntuples.max = convertToFloatArray(\n        dataValue.split(ntuplesSeparatorRegExp),\n      );\n    } else if (canonicDataLabel === '.NUCLEUS') {\n      if (currentEntry.ntuples) {\n        currentEntry.ntuples.nucleus = dataValue.split(ntuplesSeparatorRegExp);\n      }\n    } else if (canonicDataLabel === 'PAGE') {\n      spectrum.page = dataValue.trim();\n      spectrum.pageValue = parseFloat(dataValue.replace(/^.*=/, ''));\n      spectrum.pageSymbol = spectrum.page.replace(/[=].*/, '');\n    } else if (canonicDataLabel === 'RETENTIONTIME') {\n      spectrum.pageValue = parseFloat(dataValue);\n    } else if (isMSField(canonicDataLabel)) {\n      spectrum[convertMSFieldToLabel(canonicDataLabel)] = dataValue;\n    } else if (canonicDataLabel === 'SAMPLEDESCRIPTION') {\n      spectrum.sampleDescription = dataValue;\n    } else if (canonicDataLabel.startsWith('$NUC')) {\n      if (!currentEntry.tmp[canonicDataLabel] && !dataValue.includes('off')) {\n        currentEntry.tmp[canonicDataLabel] = dataValue.replace(/[<>]/g, '');\n      }\n    } else if (canonicDataLabel === 'END') {\n      currentEntry = parentsStack.pop();\n    }\n\n    if (\n      currentEntry &&\n      currentEntry.info &&\n      currentEntry.meta &&\n      canonicDataLabel.match(options.keepRecordsRegExp)\n    ) {\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      } else {\n        label = options.canonicDataLabels ? canonicDataLabel : dataLabel;\n        target = currentEntry.info;\n      }\n\n      if (options.dynamicTyping) {\n        if (value.match(numberRegExp)) {\n          value = Number.parseFloat(value);\n        }\n      }\n      if (target[label]) {\n        if (!Array.isArray(target[label])) {\n          target[label] = [target[label]];\n        }\n        target[label].push(value);\n      } else {\n        target[label] = value;\n      }\n    }\n  }\n\n  profiling(result, 'Finished parsing', options);\n\n  postProcessing(entriesFlat, result, options);\n\n  profiling(result, 'Total time', options);\n\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\n  return result;\n}\n","/* 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","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    tmpArray[i] = Math.abs(tmpArray[i]);\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 { 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 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('Points 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 {\n    from = Number.NEGATIVE_INFINITY,\n    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 { gsd, joinBroadPeaks, optimizePeaks } from 'ml-gsd';\nimport { xAbsoluteMedian, xyExtract } 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    minMaxRatio = 0.01,\n    broadRatio = 0.00025,\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    noiseLevel = xAbsoluteMedian(data.y) * (options.thresholdFactor || 3),\n    sgOptions = { windowSize: 9, polynomial: 3 },\n  } = options;\n\n  if (from !== undefined && to !== undefined) {\n    data = xyExtract(data, [{ from, to }]);\n  }\n\n  let getPeakOptions = {\n    shape,\n    broadWidth,\n    optimize,\n    factorWidth,\n    sgOptions,\n    minMaxRatio,\n    broadRatio,\n    noiseLevel,\n    smoothY,\n    optimization,\n    realTopDetection,\n  };\n\n  let result = getPeakList(data, getPeakOptions);\n  return lookNegative\n    ? result.concat(getNegativePeaks(data, getPeakOptions))\n    : result;\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","import { xGetFromToIndex } from 'ml-spectra-processing';\n\nexport function xyGetArea(data, options = {}) {\n  const { x, y } = data;\n  const { fromIndex, toIndex } = xGetFromToIndex(x, options);\n\n  let integral = 0;\n  for (let i = fromIndex; i < toIndex; i++) {\n    integral += y[i];\n  }\n\n  return integral * Math.abs(x[0] - x[1]);\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","/*\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\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) {\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, maxErrorIter1, 1);\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                // TODO improve those loops\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\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\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  // console.log(signal);\n  /* if (DEBUG)        {\n        console.log('Final j-couplings: ' + JSON.stringify(Jc));\n    }*/\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, maxError, iteration) {\n  let symRank1 = symmetrize(signal, maxError, iteration);\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);\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) {\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].x * 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  }\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);\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","// import { Ranges } from 'spectra-data-ranges';\nimport { xyGetArea } from '../xy/xyGetArea';\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 = xyGetArea(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","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 = ranges[i + 1].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    }\n  }\n  return 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));\n  }\n  maybeAdd(metadata, 'expno', parseInt(meta.EXPNO));\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 jcampString = jcampData.toString();\n  const parsedJcamp = convert(jcampString, {\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","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};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'thermogravimetricAnalysis'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'uv'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\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', 'xps'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xray'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xrd'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\n};\n","import common from '../common';\n\nexport default {\n  jpath: ['spectra', 'xrf'],\n  find: common.basenameFind,\n  getProperty: common.getTargetProperty,\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 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 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 samplephysical from './sample/physical';\nlib['sample']['physical'] = samplephysical;\n\nimport sampleraman from './sample/raman';\nlib['sample']['raman'] = sampleraman;\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 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: function (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: function (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":["process","getEmpty","jpath","code","date","Date","now","procedure","products","reagents","conditions","keywords","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","[object Object]","data","options","dataIsGiven","ArrayBuffer","lastWrittenByte","byteLength","offset","dvOffset","isView","buffer","byteOffset","littleEndian","_data","DataView","this","_mark","_marks","n","pop","undefined","seek","available","newLength","newArray","Uint8Array","set","readUint8","getInt8","getUint8","bytes","i","readByte","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","readInt8","result","readChar","bString","readChars","writeUint8","ensureAvailable","setInt8","_updateLastWrittenByte","setUint8","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","str","writeChars","padding","skip","statement","reason","TypeError","nameLength","readUint32","name","notNetcdf","require$$0","types","BYTE","CHAR","SHORT","INT","FLOAT","DOUBLE","readNumber","size","bufferReader","numbers","Array","type","Number","readBytes","substring","trimNull","readInt16","bind","readInt32","readFloat32","readFloat64","variable","str2num","num2bytes","readType","recordDimension","width","step","recordStep","currentOffset","attributesList","gAttList","utils","attributeSize","attributes","gAtt","readName","num2str","header","dimList","recordId","recordName","dimensionSize","dimensions","dim","dimensionsList","id","globalAttributes","variables","varList","variableSize","v","dimensionality","dimensionsIds","varSize","record","variablesList","dimension","padEnd","attribute","JSON","parse","stringify","getDataVariable","isNaN","join","constructor","setBigEndian","readHeader","getAttribute","attributeName","find","val","getDataVariableAsString","variableName","call","nonRecord","dataVariableExists","attributeExists","reader","time","tic","pointCount","massValues","intensityValues","ms","j","times","series","scanIndex","intensities","numberPoints","detector","channel","match","replace","delayTime","runtimeLength","samplingInterval","Math","abs","interval","currentTime","NetCDFReader","ans","instrument_mfr","dataset_origin","mass_values","detector_name","aia_template_revision","source_file_format","agilentGCMS","finniganGCMS","brukerGCMS","shimadzuGCMS","advionGCMS","agilentHPLC","aiaTemplate","meta","item","addMeta","addVariables","w","atobNative","atobBest","window","atob","Buffer","a","base64js","buf","b64ToByteArray","prototype","map","ch","module","b64","lens","len","validLen","indexOf","getLens","placeHoldersLen","arr","Arr","_byteLength","curByte","revLookup","lookup","common","getBasename","filename","getExtension","toLowerCase","getFilename","typeEntry","keys","Object","basenameFind","typeEntries","reference","getTargetProperty","getContent","content","target","getTextContent","getBufferContent","encoding","toByteArray","getProperty","extension","metaData","bufferContent","parsed","parseNetCDF","getLengthOfWhiteSpaceBeforeStartOfLetters","exec","sequence","currentFeatureNote","fieldName","subFieldType","featureLocationIndentation","lastLineWasFeaturesTag","lastLineWasLocation","resultsArray","genbankAnnotationKey","lines","split","hasFoundLocus","line","lineFieldName","getLineFieldName","getLineVal","isSubKey","isSubKeyword","isKey","isKeyword","trim","parseLocus","parseFeatures","parseOrigin","parseMultiLineField","ref","references","parseReference","endSeq","features","postProcessGenbankFeature","postProcessCurSeq","getCurrentFeature","key","newLine","m","removeFieldName","locusName","moleculeType","circular","seq","dateStr","genbankDivision","dateMatch","setFullYear","setUTCMonth","MONTHS","setDate","setUTCHours","setMinutes","setSeconds","setMilliseconds","toISOString","fName","subType","refs","lastRef","strand","indentationOfLine","charAt","isFeatureLineRunon","parseFeatureLocation","qual","isNote","lineArr","currentNotes","notes","parseFeatureNote","feat","locStr","locArr","start","end","resultKey","r","fieldValue","substr","label","gene","ApEinfo_label","organism","locus_tag","note","genbank","toReturn","textContent","genbankParser","p","parsedSequence","description","mf","molfile","mw","keyword","kind","GC_MS_FIELDS","complexChromatogram","spectra","chromatogram","existingGCMSFields","convertMSFieldToLabel","spectrum","pageValue","parseFloat","x","y","isMSField","canonicDataLabel","convertToFloatArray","stringArray","floatArray","fastParseXYData","yFactor","deltaX","isXYdata","currentData","ascii","currentX","firstX","currentY","firstY","endLine","isDifference","isLastDifference","lastDifference","isDuplicate","inComment","currentValue","lastValue","isNegative","inValue","skipFirstValue","decimalPosition","pow","duplicate","ascii2","removeCommentRegExp","peakTableSplitRegExp","parsePeakTable","isPeaktable","numberOfVariables","forEach","values","logs","parseXYZ","xFactor","parseXY","parseXYA","removeSymbolRegExp","isXYAdata","isAnyArray","object","endsWith","d","e","f","g","h","c","b","_ref","median","input","isArray","quickSelectMedian","slice","add2D","zData","minZ","maxZ","ySize","xSize","z","lastX","lastY","reverse","minX","min","maxX","max","minY","maxY","noise","getMedian","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","GAUSSIAN_EXP_FACTOR","LN2","ROOT_PI_OVER_LN2","sqrt","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","Gaussian","fwhm","sd","widthToFWHM","height","getData","getFactor","ceil","center","Float64Array","fct","area","getArea","fwhmToWidth","setFWHM","setHeight","ln1MinusXSqrd","log","lnEtcBy2Plus2","firstSqrt","erfinv","Lorentzian","squareFWHM","tan","PseudoVoigt","mu","setMu","SavitzkyGolay","ys","xs","windowSize","derivative","polynomial","isInteger","RangeError","console","warn","half","floor","np","weights","s","t","Weight","fullWeights","hs","constantH","wg1","wg2","d1","d2","l","getHs","wg","count","GramPoly","k","Grampoly","GenFact","gf","sum","gsd","noiseLevel","sgOptions","shape","smoothY","heightFactor","broadRatio","maxCriteria","minMaxRatio","derivativeThreshold","realTopDetection","yIn","equalSpaced","isEqualSpaced","getNoiseLevel","yCorrection","dY","ddY","yData","SG","xData","dX","maxDdy","lastMax","lastMin","minddY","intervalL","intervalR","broadMask","possible","frequency","distanceJ","minDistance","gettingCloser","widthProcessor","shapeOptions","getShapeGenerator","signals","lastK","MAX_VALUE","soft","left","right","yLeft","yRight","determineRealTop","base","sort","maxDx","minDx","MAX_SAFE_INTEGER","mean","stddev","averageDeviations","peakList","alpha","beta","gamma","currentPoint","log10","isEnumerable","propertyIsEnumerable","getSymbols","getOwnPropertySymbols","args","Symbol","arg","names","isValidKey","assign","isObject","assignSymbols","arguments","_options$fromIndex","fromIndex","_options$toIndex","toIndex","maxValue","sumOfGaussianLorentzians","nL","sumOfGaussians","sumOfLorentzians","errorCalculation","parameters","parameterizedFunction","weightSquare","error","func","minValue","rescale","currentMin","currentMax","_options$min","autoMinMax","_options$max","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","rows","columns","maxI","maxJ","formatNumber","get","inspectData","num","numStr","precise","toPrecision","exponential","toExponential","eIndex","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","some","from","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","column","fill","random","round","zeros","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","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","NaN","maxIndex","idx","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","cumulativeSum","dot","vector2","vector1","mmul","other","Bcolj","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","blockMult","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","first","last","flipColumns","kroneckerProduct","q","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","checkIndices","rowIndex","columnIndex","trace","by","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","for","rand","randomInt","randInt","diagonal","identity","eye","negate","tensorProduct","nRows","nColumns","arrayData","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","fround","log1p","log2","sign","sin","sinh","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","X","determinant","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","MIN_VALUE","ks","cs","sn","sp","spm1","epm1","sk","ek","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","tol","ii","useSVD","leftHandSide","rightHandSide","params","damping","gradientDifference","centralDifference","evaluatedData","gradientFunc","paramFunction","nbParams","nbPoints","param","delta","auxParams","funcParam","funcParam2","point","gradientFunction","residualError","matrixFunction","inverseMatrix","jacobianWeigthResidualError","perturbations","levenbergMarquardt","checkTimeout","minValues","maxValues","dampingStepUp","dampingStepDown","maxIterations","errorTolerance","improvementThreshold","timeout","initialValues","filler","parLen","MIN_SAFE_INTEGER","endTime","checkOptions","converged","iteration","previousError","parameterValues","parameterError","iterations","selectMethod","optimizationOptions","getKind","algorithm","LM","lmOptions","optimize","peaks","paramsFunc","optimization","defaultParameters","init","peak","getMaxValue","assignDeep","par","checkInput","nbShapes","parameterKey","pMin","pMax","pInit","gradientDifferenceValue","pFit","xFindClosestIndex","low","high","xGetFromToIndex","to","optimizePeaks","factorWidth","factorLimits","groups","previousPeak","NEGATIVE_INFINITY","currentGroup","group","groupPeaks","results","firstPeak","lastPeak","currentRange","optimizedPeaks","concat","joinBroadPeaks","broadLines","candidates","indexes","fitted","reduce","gyromagneticRatio","profiling","action","simpleChromatogram","intensity","postProcessing","entriesFlat","observeFrequency","shiftOffsetVal","entry","ntuples","xUnits","includes","nucleus","startsWith","$NUC2","$NUC1","yType","unit","pageSymbolIndex","pageSymbol","units","ratio0","ratio1","ratio","postProcessingNMR","newNtuples","twoD","wantXY","keepSpectra","prepareNtuplesDatatable","currentEntry","xIndex","yIndex","firstVariable","secondVariable","lowerCaseSymbol","vardim","varname","yUnits","prepareSpectrum","ntuplesSeparatorRegExp","numberRegExp","Spectrum","defaultOptions","keepRecordsRegExp","canonicDataLabels","canonicMetadataLabels","dynamicTyping","withoutXY","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","checkImpurity","impurity","tolerance","difference","remove","asymmetric","xAbsoluteMedian","tmpArray","xAbsolute","xyExtract","xyCheck","zones","zone","POSITIVE_INFINITY","filter","currentZone","zonesNormalize","newX","newY","position","loop","xyAutoPeaksPicking","broadWidth","lookNegative","thresholdFactor","getPeakOptions","getPeakList","negativeDataY","getNegativePeaks","xyGetArea","integral","patterns","signal","symRank","maxError","symRank1","symmetrize","tmpPeaks","peaksComp","tmpMask","mask","delta1","symRank2","symmetrizeChoiseBest","P1","n2","maxFlagged","Jc","normalize","validPattern","ranges","getRanges","heights","getNextCombination","numbering","nFlagged","u","jSum","pattern","idealPattern","updateSignal","observe","nbPeaks","startX","stopX","integralData","maskPattern","mask2","cont","newNmrJs","nmrJs","abstractPattern","ok","lng","currentIndex","active","avg","avgWidth","heightSum","diffL","diffR","chemicalShift","symFactor","weight","newSumHeights","dxi","norm2","detectSignals","signal1D","integrationSum","integralType","frequencyCluster","prevPeak","spectrumIntegral","integralPeaks","computeArea","integralFactor","xyAutoRangesPicking","peakPicking","solventImpurities","peaksFilterImpurities","joinOverlapRanges","clean","compile","keepPeaks","signalOptions","nHi","jAnalyzer","peaksO","peakR","peaks1","sumIntegral","sumObserved","joinRanges","peaksToRanges","getMetaData","info","metadata","isFid","isFt","isComplex","experiment","maybeAdd","TITLE","PULPROG","spectyp","pulse","$SPECTYP","getSpectrumType","TE","DATATYPE","PROBHD","FNTYPE","EXPNO","nuc","SYMBOL","symbols","DATE","obj","computeRanges","defaultRangesOptions","defaultPeaksOptions","fromJcamp","jcampData","parsedJcamp","jcamp","entries","tmpResult","children","parentsStack","ldrs","ldr","dataLabel","dataValue","infos","datatable","parentEntry","dataType","dataClass","xType","shiftOffsetNum","vartype","varform","page","sampleDescription","flatten","convert","rangesOptions","peaksOptions","range","replaceFid","nmr","getReference","test","reg2","lib","getType","custom","defaultType","default","reactiongeneral","samplechromatogram","samplecyclicVoltammetry","sampledifferentialCentrifugalSedimentation","sampledifferentialScanningCalorimetry","sampleelementAnalysis","samplegenbank","samplegeneral","samplehgPorosimetry","sampleimage","sampleir","sampleisotherm","sampleiv","samplemass","samplenmr","samplephysical","sampleraman","samplethermogravimetricAnalysis","sampleuv","samplevideo","samplexps","samplexray","samplexrd","samplexrf","hasOwn","hasOwnProperty","toStr","isPlainObject","hasOwnConstructor","hasIsPrototypeOf","defaults","src","copyIsArray","deep","elnPlugin","util","doc","customMetadata","typeProcessor","createFromJpath","property","keepContent","getFromJpath","typeProcessors","all","getAllTypes"],"mappings":"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"}