{"version":3,"sources":["webpack:///open-spectro/webpack/universalModuleDefinition","webpack:///open-spectro/open-spectro.min.js","webpack:///open-spectro/webpack/bootstrap aa52f5afe4e20729dda8","webpack:///open-spectro/./src/index.js","webpack:///open-spectro/./src/wavelengthToColor.js","webpack:///open-spectro/./src/parse.js","webpack:///open-spectro/./src/process.js","webpack:///open-spectro/./src/util.js","webpack:///open-spectro/./src/getAnnotations.js","webpack:///open-spectro/./src/getColorBar.js","webpack:///open-spectro/./src/getChart.js","webpack:///open-spectro/./~/color-convert/index.js","webpack:///open-spectro/./~/color-convert/conversions.js","webpack:///open-spectro/./~/color-convert/css-keywords.js","webpack:///open-spectro/./~/color-convert/route.js","webpack:///open-spectro/./src/types.js","webpack:///open-spectro/./src/getTabDelimited.js","webpack:///open-spectro/./src/load.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","wavelengthToColor","parse","process","getAnnotations","getColorBar","Util","getChart","getTabDelimited","load","wavelengthTocolor","wavelength","red","green","blue","alpha","color","absorbance","experiment","reference","results","Array","length","i","Math","log10","transmittance","parseData","lines","y","currentValue","fields","split","j","field","trim","match","firstChar","substring","value","difference","indexOf","substr","push","parseInfo","info","result","type","fieldType","replace","fieldValue","intensity","percentIntensity","round","values","redPoint","greenPoint","bluePoint","nMRed","nMGreen","nMBlue","backgroundMin","backgroundMax","convertToObject","spectra","spectrum","addInfo","Object","keys","forEach","key","addAbsorbanceTransmittance","Z","E","a","JSON","stringify","A","t","T","addTabDelimited","tab","toXY","addX","diffPoints","diffNM","firstNM","lastNM","x","text","options","create","blocs","part","bloc","slice","smooth","nbPixels","array","shift","floor","average","normalize","min","Number","MAX_VALUE","max","MIN_VALUE","join","toArray","getAnnotation","pixel","height","fillColor","position","strokeWidth","annotations","experiments","getDistinctColors","numberColor","colors","colorConvert","hsl","rgb","types","channels","index","isArray","yLabel","label","yUnit","chart","title","axis","data","showName","showConcentration","showComment","showChannel","concentration","name","comment","distinctColors","undefined","xAxis","yAxis","defaultStyle","lineColor","lineWidth","wrapRaw","fn","wrappedFn","args","arguments","prototype","conversion","wrapRounded","len","conversions","route","convert","models","fromModel","routes","routeModels","toModel","raw","cssKeywords","reverseKeywords","hasOwnProperty","hsv","hwb","cmyk","xyz","lab","lch","hex","keyword","ansi16","ansi256","h","s","l","r","g","b","delta","v","w","k","pow","z","t1","t2","t3","val","sv","hi","f","q","sl","n","wh","bl","ratio","y2","hr","atan2","PI","sqrt","cos","sin","ansi","mult","rem","integer","string","toString","toUpperCase","parseInt","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","buildGraph","graph","distance","parent","deriveBFS","queue","current","pop","adjacents","adjacent","node","unshift","link","from","to","wrapConversion","path","cur","R","G","B","W","addHeaders","headers","currentData","toPrecision","header","datum","selected"],"mappings":"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","file":"open-spectro.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"openSpectro\"] = factory();\n\telse\n\t\troot[\"openSpectro\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"openSpectro\"] = factory();\n\telse\n\t\troot[\"openSpectro\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\tvar wavelengthToColor = __webpack_require__(1);\n\tvar parse = __webpack_require__(2);\n\tvar process = __webpack_require__(3);\n\tvar getAnnotations = __webpack_require__(5);\n\tvar getColorBar = __webpack_require__(6);\n\tvar Util = __webpack_require__(4);\n\tvar getChart = __webpack_require__(7);\n\tvar getTabDelimited = __webpack_require__(13);\n\tvar load = __webpack_require__(14);\n\t\n\tmodule.exports.wavelengthTocolor=wavelengthToColor;\n\tmodule.exports.parse=parse;\n\tmodule.exports.process=process;\n\tmodule.exports.getAnnotations=getAnnotations;\n\tmodule.exports.getColorBar=getColorBar;\n\tmodule.exports.Util=Util;\n\tmodule.exports.getChart=getChart;\n\tmodule.exports.getTabDelimited=getTabDelimited;\n\tmodule.exports.load=load;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function (wavelength) {\n\t    var red;\n\t    var green;\n\t    var blue;\n\t    var alpha;\n\t\n\t    if (wavelength >= 380 && wavelength < 440) {\n\t        red = -1 * (wavelength - 440) / (440 - 380);\n\t        green = 0;\n\t        blue = 1;\n\t    } else if (wavelength >= 440 && wavelength < 490) {\n\t        red = 0;\n\t        green = (wavelength - 440) / (490 - 440);\n\t        blue = 1;\n\t    } else if (wavelength >= 490 && wavelength < 510) {\n\t        red = 0;\n\t        green = 1;\n\t        blue = -1 * (wavelength - 510) / (510 - 490);\n\t    } else if (wavelength >= 510 && wavelength < 580) {\n\t        red = (wavelength - 510) / (580 - 510);\n\t        green = 1;\n\t        blue = 0;\n\t    } else if (wavelength >= 580 && wavelength < 645) {\n\t        red = 1;\n\t        green = -1 * (wavelength - 645) / (645 - 580);\n\t        blue = 0.0;\n\t    } else if (wavelength >= 645 && wavelength <= 780) {\n\t        red = 1;\n\t        green = 0;\n\t        blue = 0;\n\t    } else {\n\t        red = 0;\n\t        green = 0;\n\t        blue = 0;\n\t    }\n\t\n\t    // outside visible spectrum\n\t    if (wavelength > 780 || wavelength < 380) {\n\t        alpha = 0;\n\t    } else if (wavelength > 700) {\n\t        alpha = (780 - wavelength) / (780 - 700);\n\t    } else if (wavelength < 420) {\n\t        alpha = (wavelength - 380) / (420 - 380);\n\t    } else {\n\t        alpha = 1;\n\t    }\n\t\n\t    return {\n\t        color: \"rgba(\" + (red * 100) + \"%,\" + (green * 100) + \"%,\" + (blue * 100) + \"%, \" + alpha + \")\",\n\t        red: red,\n\t        green: green,\n\t        blue: blue,\n\t        alpha: alpha\n\t    }\n\t}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar process=__webpack_require__(3);\n\tvar Util=__webpack_require__(4);\n\t\n\t\n\tfunction absorbance(experiment, reference) {\n\t    var results=new Array(experiment.length);\n\t    for (var i=0; i<experiment.length; i++) {\n\t        results[i]=-Math.log10(experiment[i]/reference[i]);\n\t    }\n\t    return results;\n\t}\n\t\n\tfunction transmittance(experiment, reference) {\n\t    var results=new Array(experiment.length);\n\t    for (var i=0; i<experiment.length; i++) {\n\t        results[i]=experiment[i]/reference[i]*100;\n\t    }\n\t    return results;\n\t}\n\t\n\t\n\t\n\tvar difference=['r','q','p','o','n','m','l','k','j','%','J','K','L','M','N','O','P','Q','R'];\n\t\n\tfunction parseData(lines) {\n\t    var y=[];\n\t    var currentValue=0;\n\t    for (var i=0; i<lines.length; i++) {\n\t        var line=lines[i];\n\t        var fields=lines[i].split(/( ?(?=[a-zA-Z%])| +(?=[^a-zA-Z%]))/);\n\t        for (var j=0; j<fields.length; j++) {\n\t            var field=fields[j];\n\t            if (field.trim().length>0) {\n\t                // we check if we convert the first character\n\t                if (field.match(/^[j-rJ-R%]/)) {\n\t                    var firstChar=field.substring(0,1);\n\t                    var value=difference.indexOf(firstChar)-9;\n\t                    currentValue+=(value+field.substr(1))>>0;\n\t                } else {\n\t                    currentValue=fields[j]>>0;\n\t                }\n\t                y.push(currentValue);\n\t            }\n\t        }\n\t    }\n\t    return y;\n\t}\n\t\n\t\n\t\n\tfunction parseInfo(info) {\n\t    var result={};\n\t    var fields=info.split(\",\");\n\t    result.type=fields[0];\n\t    for (var i=1; i<fields.length; i++) {\n\t        var field=fields[i];\n\t        var fieldType=field.replace(/^([A-Z]*)(.*)$/,\"$1\");\n\t        var fieldValue=field.replace(/^([A-Z]*)(.*)$/,\"$2\");\n\t        switch(fieldType) {\n\t            case 'I':\n\t                result.intensity=fieldValue>>0;\n\t                result.percentIntensity=Math.round(((fieldValue>>0)/256)*100);\n\t                break;\n\t            case 'RGB':\n\t                var values=fieldValue.split(\"/\");\n\t                result.redPoint=values[0]>>0;\n\t                result.greenPoint=values[1]>>0;\n\t                result.bluePoint=values[2]>>0;\n\t                break;\n\t            case 'REF':\n\t                var values=fieldValue.split(\"/\");\n\t                result.nMRed=values[0]>>0;\n\t                result.nMGreen=values[1]>>0;\n\t                result.nMBlue=values[2]>>0;\n\t                break;\n\t            case 'BG':\n\t                var values=fieldValue.split(\"/\");\n\t                result.backgroundMin=values[0]>>0;\n\t                result.backgroundMax=values[1]>>0;\n\t                break;\n\t            default:\n\t                result[fieldType]=fieldValue;\n\t        }\n\t    }\n\t    return result;\n\t}\n\t\n\t/*\n\t types are normally: R G B W\n\t Z (background), E (experimental)\n\t A: absorbance\n\t T: transmittance\n\t  */\n\t\n\tfunction convertToObject(spectra) {\n\t    var result={};\n\t    for (var i=0; i<spectra.length; i++) {\n\t        var spectrum=spectra[i];\n\t        result[spectrum.type]=spectrum;\n\t    }\n\t    return result;\n\t}\n\t\n\tfunction addInfo(spectra, info) {\n\t    var info=info || {};\n\t    for (var type in spectra) {\n\t        var spectrum=spectra[type];\n\t        Object.keys(info).forEach(function(key) {\n\t            spectrum.info = spectrum.info || {};\n\t            if (key!=='data') {\n\t                spectrum.info[key]=info[key];\n\t            }\n\t        });\n\t    }\n\t}\n\t\n\tfunction addAbsorbanceTransmittance(spectra) {\n\t    // if we have Z and E we calculate absorbance and transmittance\n\t    if (spectra.Z && spectra.E) {\n\t        var a=JSON.parse(JSON.stringify(spectra.Z));\n\t        a.type=\"A\";\n\t        a.y=absorbance(spectra.E.y, spectra.Z.y);\n\t        spectra.A=a;\n\t        var t=JSON.parse(JSON.stringify(spectra.Z));\n\t        t.type=\"T\";\n\t        t.y=transmittance(spectra.E.y, spectra.Z.y);\n\t        spectra.T=t;\n\t    }\n\t}\n\t\n\tfunction addTabDelimited(spectra) {\n\t    for (var key in spectra) {\n\t        var spectrum = spectra[key];\n\t        spectrum.tab = Util.toXY(spectrum);\n\t    }\n\t}\n\t\n\tfunction addX(spectra) {\n\t    for (var key in spectra) {\n\t        var spectrum=spectra[key];\n\t        var diffPoints=spectrum.redPoint-spectrum.bluePoint;\n\t        var diffNM=(spectrum.nMRed-spectrum.nMBlue)/(diffPoints-1);\n\t        var length=spectrum.y.length;\n\t\n\t        // we will add all the color spectrum\n\t        // need to guess the nm of the first point and last point\n\t        var firstNM=spectrum.nMBlue-spectrum.bluePoint*diffNM;\n\t        var lastNM=spectrum.nMRed+(length-spectrum.redPoint)*diffNM;\n\t        spectrum.x=[];\n\t        for (var i=0; i<length; i++) {\n\t            var wavelength=firstNM+(lastNM-firstNM)/(length-1)*i;\n\t            spectrum.x.push(wavelength);\n\t        }\n\t    }\n\t}\n\t\n\tmodule.exports = function (text, options) {\n\t    if (! text) return [];\n\t    var options=Object.create(options || {});\n\t    var blocs=text.split(/[\\r\\n]*>/m);\n\t    var results=[];\n\t    for (var part=0; part<blocs.length; part++) {\n\t        var bloc=blocs[part];\n\t        var result=[];\n\t        var lines=bloc.split(/[\\r\\n]+/);\n\t        // first line is the info line\n\t        var info=lines[0];\n\t        if (info && info.match(/^[A-Z]/)) {\n\t            var result=parseInfo(info);\n\t            result.y=parseData(lines.slice(1));\n\t            results.push(result);\n\t        }\n\t\n\t    }\n\t    var spectra=convertToObject(results);\n\t    addAbsorbanceTransmittance(spectra);\n\t    addInfo(spectra, options.info);\n\t    process(spectra, options);\n\t    addX(spectra);\n\t    addTabDelimited(spectra);\n\t\n\t    return spectra;\n\t}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t// process spectra\n\t\n\tfunction smooth(spectrum, nbPixels) {\n\t    var result=[];\n\t    var array=spectrum.y;\n\t    var shift=Math.floor(nbPixels/2);\n\t\n\t    for (var i=shift; i<(array.length-shift-1); i++) {\n\t        var average=0;\n\t        for (var j=i-shift; j<i-shift+nbPixels; j++) {\n\t            average+=array[j];\n\t        }\n\t        result.push(average/nbPixels)\n\t    }\n\t\n\t    spectrum.y=result;\n\t    // need to shift the reference point\n\t    spectrum.redPoint-=shift;\n\t    spectrum.bluePoint-=shift;\n\t    spectrum.greenPoint-=shift;\n\t};\n\t\n\tfunction normalize(spectrum) {\n\t    var array=spectrum.y;\n\t    var min=Number.MAX_VALUE;\n\t    var max=Number.MIN_VALUE;\n\t    for (var i=0; i<array.length; i++) {\n\t        if (array[i]<min) min=array[i];\n\t        if (array[i]>max) max=array[i];\n\t    }\n\t    if (min!=max) {\n\t        for (var i=0; i<array.length; i++) {\n\t            array[i]=(array[i]-min)/(max-min);\n\t        }\n\t    } else {\n\t        for (var i=0; i<array.length; i++) {\n\t            array[i]=0.5;\n\t        }\n\t    }\n\t    spectrum.y=array;\n\t}\n\t\n\tmodule.exports=function(spectra, options) {\n\t    var options=Object.create(options||{});\n\t\n\t    for (var key in spectra) {\n\t        if (options.smooth) {\n\t            smooth(spectra[key], options.smooth);\n\t        }\n\t        if (options.normalize) {\n\t            normalize(spectra[key]);\n\t        }\n\t    }\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports.toXY=function(spectrum) {\n\t    var x=spectrum.x;\n\t    var y=spectrum.y;\n\t    var result=[];\n\t    for (var i=0; i< x.length; i++) {\n\t        result.push(x[i]+\"\\t\"+y[i]);\n\t    }\n\t    return result.join('\\r\\n');\n\t}\n\t\n\tmodule.exports.toArray=function(spectra) {\n\t    var array=[];\n\t    for (var key in spectra) {\n\t        array.push(spectra[key]);\n\t    }\n\t    return array;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar wavelengthToColor = __webpack_require__(1);\n\t\n\t\n\tfunction getAnnotation(pixel, color, height) {\n\t    return {\n\t        \"fillColor\": color,\n\t        \"type\": \"rect\",\n\t        \"position\": [{\n\t            \"y\": \"0px\",\n\t            \"x\": pixel+2\n\t        },{\n\t            \"y\": height+\"px\",\n\t            \"x\": pixel-1\n\t        }],\n\t        \"strokeWidth\":0.0001\n\t    };\n\t}\n\t\n\tmodule.exports=function(spectrum) {\n\t    if (! spectrum) return;\n\t    var annotations=[];\n\t    annotations.push(getAnnotation(spectrum.nMRed,\"red\",15));\n\t    annotations.push(getAnnotation(spectrum.nMBlue,\"blue\",15));\n\t    annotations.push(getAnnotation(spectrum.nMGreen,\"green\",15));\n\t\n\t    var x=spectrum.x;\n\t    for (var i=0; i<x.length; i++) {\n\t        var color=wavelengthToColor(x[i]).color;\n\t        annotations.push(getAnnotation(x[i],color,10));\n\t    }\n\t    return annotations;\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar getAnnotations=__webpack_require__(5);\n\t\n\tmodule.exports=function(experiments) {\n\t    if (! experiments || experiments.length===0) return;\n\t    var experiment=experiments[0];\n\t    var keys=Object.keys(experiment);\n\t    if (keys.length===0) return;\n\t    return getAnnotations(experiment[keys[0]]);\n\t}\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar colorConvert = __webpack_require__(8);\n\t\n\t\n\t// convert an experiment, an array of spectra, to a chart\n\t\n\tvar types=__webpack_require__(12);\n\t\n\t\n\t\n\tmodule.exports=function (experiments, options) {\n\t    var options=options || {};\n\t    var channels='RGBWT';\n\t    if (options.channels) channels=options.channels+\"\"; // solve datastring length problem\n\t    var index=options.index;\n\t\n\t    if (! Array.isArray(experiments)) experiments=[experiments];\n\t\n\t    var yLabel=\"Y axis\";\n\t    if (channels.length===1) {\n\t        yLabel=types[channels].label + \"(\"+types[channels].yUnit+\")\";\n\t    }\n\t\n\t    var chart = {\n\t        title: \"Open Spectrophotometer results\",\n\t        \"axis\": [\n\t            {\n\t                \"label\": \"Wavelength (nm)\"\n\t            },\n\t            {\n\t                \"label\": yLabel\n\t            }\n\t        ],\n\t        \"data\": []\n\t    }\n\t\n\t    var counter=0;\n\t\n\t    var showName=false;\n\t    var showConcentration=false;\n\t    var showComment=false;\n\t    var showChannel=(channels.length===1) ? false : true;\n\t\n\t    for (var i=0; i<experiments.length; i++) {\n\t        var experiment=experiments[i];\n\t        for (var key in experiment) {\n\t            if (!experiment[key].info) experiment[key].info = {};\n\t        }\n\t    }\n\t\n\t    for (var i=1; i<experiments.length; i++) {\n\t        var experiment=experiments[i];\n\t        for (var key in experiment) {\n\t            if (channels.indexOf(key) > -1) {\n\t                if (experiments[0][key].info.concentration !== experiment[key].info.concentration) showConcentration = true;\n\t                if (experiments[0][key].info.name !== experiment[key].info.name) showName = true;\n\t                if (experiments[0][key].info.comment !== experiment[key].info.comment) showComment = true;\n\t            }\n\t        }\n\t    }\n\t\n\t\n\t    var distinctColors=getDistinctColors(experiments.length);\n\t\n\t    for (var i = 0; i < experiments.length; i++) {\n\t        if ((index === undefined) || (index === i)) {\n\t            var experiment=experiments[i];\n\t            for (var key in experiment) {\n\t                if (channels.indexOf(key)>-1) {\n\t                    var data=experiment[key];\n\t\n\t                    var label=\"\";\n\t                    if (showName) label+=data.info.name;\n\t                    if (showConcentration) {\n\t                        if (showName) label+=' ('+data.info.concentration+')';\n\t                        else label+=data.info.concentration;\n\t                    }\n\t                    if (showComment) {\n\t                        if (label) label+=' ';\n\t                        label+=data.info.comment;\n\t                    }\n\t                    if (showChannel) {\n\t                        if (label) label+=' ';\n\t                        label+=key;\n\t                    }\n\t                    var color=(channels.length===1 && experiments.length>1) ? distinctColors[i] : types[key].color;\n\t                    chart.data.push({\n\t                        \"x\":data.x,\n\t                        \"y\":data.y,\n\t                        \"label\":label,\n\t                        xAxis: 0,\n\t                        yAxis: 1,\n\t                        defaultStyle: {\n\t                            lineColor: color,\n\t                            lineWidth: 2\n\t                        }\n\t                    });\n\t                }\n\t            }\n\t        }\n\t    }\n\t\n\t    return {\n\t        type:'chart',\n\t        value: chart\n\t    };\n\t}\n\t\n\t\n\t\n\tfunction getDistinctColors(numberColor) {\n\t    var colors=[];\n\t    for (var i=0; i<360; i+=360/numberColor) {\n\t        colors.push(colorConvert.hsl.rgb(i, 100, 50));\n\t    }\n\t    return colors;\n\t}\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar conversions = __webpack_require__(9);\n\tvar route = __webpack_require__(11);\n\t\n\tvar convert = {};\n\t\n\tvar models = Object.keys(conversions);\n\t\n\tfunction wrapRaw(fn) {\n\t\tvar wrappedFn = function (args) {\n\t\t\tif (args === undefined || args === null) {\n\t\t\t\treturn args;\n\t\t\t}\n\t\n\t\t\tif (arguments.length > 1) {\n\t\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t\t}\n\t\n\t\t\treturn fn(args);\n\t\t};\n\t\n\t\t// preserve .conversion property if there is one\n\t\tif ('conversion' in fn) {\n\t\t\twrappedFn.conversion = fn.conversion;\n\t\t}\n\t\n\t\treturn wrappedFn;\n\t}\n\t\n\tfunction wrapRounded(fn) {\n\t\tvar wrappedFn = function (args) {\n\t\t\tif (args === undefined || args === null) {\n\t\t\t\treturn args;\n\t\t\t}\n\t\n\t\t\tif (arguments.length > 1) {\n\t\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t\t}\n\t\n\t\t\tvar result = fn(args);\n\t\n\t\t\t// we're assuming the result is an array here.\n\t\t\t// see notice in conversions.js; don't use box types\n\t\t\t// in conversion functions.\n\t\t\tif (typeof result === 'object') {\n\t\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn result;\n\t\t};\n\t\n\t\t// preserve .conversion property if there is one\n\t\tif ('conversion' in fn) {\n\t\t\twrappedFn.conversion = fn.conversion;\n\t\t}\n\t\n\t\treturn wrappedFn;\n\t}\n\t\n\tmodels.forEach(function (fromModel) {\n\t\tconvert[fromModel] = {};\n\t\n\t\tvar routes = route(fromModel);\n\t\tvar routeModels = Object.keys(routes);\n\t\n\t\trouteModels.forEach(function (toModel) {\n\t\t\tvar fn = routes[toModel];\n\t\n\t\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t\t});\n\t});\n\t\n\tmodule.exports = convert;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* MIT license */\n\tvar cssKeywords = __webpack_require__(10);\n\t\n\t// NOTE: conversions should only return primitive values (i.e. arrays, or\n\t//       values that give correct `typeof` results).\n\t//       do not use box values types (i.e. Number(), String(), etc.)\n\t\n\tvar reverseKeywords = {};\n\tfor (var key in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(key)) {\n\t\t\treverseKeywords[cssKeywords[key].join()] = key;\n\t\t}\n\t}\n\t\n\tvar convert = module.exports = {\n\t\trgb: {},\n\t\thsl: {},\n\t\thsv: {},\n\t\thwb: {},\n\t\tcmyk: {},\n\t\txyz: {},\n\t\tlab: {},\n\t\tlch: {},\n\t\thex: {},\n\t\tkeyword: {},\n\t\tansi16: {},\n\t\tansi256: {}\n\t};\n\t\n\tconvert.rgb.hsl = function (rgb) {\n\t\tvar r = rgb[0] / 255;\n\t\tvar g = rgb[1] / 255;\n\t\tvar b = rgb[2] / 255;\n\t\tvar min = Math.min(r, g, b);\n\t\tvar max = Math.max(r, g, b);\n\t\tvar delta = max - min;\n\t\tvar h;\n\t\tvar s;\n\t\tvar l;\n\t\n\t\tif (max === min) {\n\t\t\th = 0;\n\t\t} else if (r === max) {\n\t\t\th = (g - b) / delta;\n\t\t} else if (g === max) {\n\t\t\th = 2 + (b - r) / delta;\n\t\t} else if (b === max) {\n\t\t\th = 4 + (r - g) / delta;\n\t\t}\n\t\n\t\th = Math.min(h * 60, 360);\n\t\n\t\tif (h < 0) {\n\t\t\th += 360;\n\t\t}\n\t\n\t\tl = (min + max) / 2;\n\t\n\t\tif (max === min) {\n\t\t\ts = 0;\n\t\t} else if (l <= 0.5) {\n\t\t\ts = delta / (max + min);\n\t\t} else {\n\t\t\ts = delta / (2 - max - min);\n\t\t}\n\t\n\t\treturn [h, s * 100, l * 100];\n\t};\n\t\n\tconvert.rgb.hsv = function (rgb) {\n\t\tvar r = rgb[0];\n\t\tvar g = rgb[1];\n\t\tvar b = rgb[2];\n\t\tvar min = Math.min(r, g, b);\n\t\tvar max = Math.max(r, g, b);\n\t\tvar delta = max - min;\n\t\tvar h;\n\t\tvar s;\n\t\tvar v;\n\t\n\t\tif (max === 0) {\n\t\t\ts = 0;\n\t\t} else {\n\t\t\ts = (delta / max * 1000) / 10;\n\t\t}\n\t\n\t\tif (max === min) {\n\t\t\th = 0;\n\t\t} else if (r === max) {\n\t\t\th = (g - b) / delta;\n\t\t} else if (g === max) {\n\t\t\th = 2 + (b - r) / delta;\n\t\t} else if (b === max) {\n\t\t\th = 4 + (r - g) / delta;\n\t\t}\n\t\n\t\th = Math.min(h * 60, 360);\n\t\n\t\tif (h < 0) {\n\t\t\th += 360;\n\t\t}\n\t\n\t\tv = ((max / 255) * 1000) / 10;\n\t\n\t\treturn [h, s, v];\n\t};\n\t\n\tconvert.rgb.hwb = function (rgb) {\n\t\tvar r = rgb[0];\n\t\tvar g = rgb[1];\n\t\tvar b = rgb[2];\n\t\tvar h = convert.rgb.hsl(rgb)[0];\n\t\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\t\n\t\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\t\n\t\treturn [h, w * 100, b * 100];\n\t};\n\t\n\tconvert.rgb.cmyk = function (rgb) {\n\t\tvar r = rgb[0] / 255;\n\t\tvar g = rgb[1] / 255;\n\t\tvar b = rgb[2] / 255;\n\t\tvar c;\n\t\tvar m;\n\t\tvar y;\n\t\tvar k;\n\t\n\t\tk = Math.min(1 - r, 1 - g, 1 - b);\n\t\tc = (1 - r - k) / (1 - k) || 0;\n\t\tm = (1 - g - k) / (1 - k) || 0;\n\t\ty = (1 - b - k) / (1 - k) || 0;\n\t\n\t\treturn [c * 100, m * 100, y * 100, k * 100];\n\t};\n\t\n\tconvert.rgb.keyword = function (rgb) {\n\t\treturn reverseKeywords[rgb.join()];\n\t};\n\t\n\tconvert.keyword.rgb = function (keyword) {\n\t\treturn cssKeywords[keyword];\n\t};\n\t\n\tconvert.rgb.xyz = function (rgb) {\n\t\tvar r = rgb[0] / 255;\n\t\tvar g = rgb[1] / 255;\n\t\tvar b = rgb[2] / 255;\n\t\n\t\t// assume sRGB\n\t\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\t\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\t\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\t\n\t\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\t\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\t\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\t\n\t\treturn [x * 100, y * 100, z * 100];\n\t};\n\t\n\tconvert.rgb.lab = function (rgb) {\n\t\tvar xyz = convert.rgb.xyz(rgb);\n\t\tvar x = xyz[0];\n\t\tvar y = xyz[1];\n\t\tvar z = xyz[2];\n\t\tvar l;\n\t\tvar a;\n\t\tvar b;\n\t\n\t\tx /= 95.047;\n\t\ty /= 100;\n\t\tz /= 108.883;\n\t\n\t\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\t\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\t\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\t\n\t\tl = (116 * y) - 16;\n\t\ta = 500 * (x - y);\n\t\tb = 200 * (y - z);\n\t\n\t\treturn [l, a, b];\n\t};\n\t\n\tconvert.hsl.rgb = function (hsl) {\n\t\tvar h = hsl[0] / 360;\n\t\tvar s = hsl[1] / 100;\n\t\tvar l = hsl[2] / 100;\n\t\tvar t1;\n\t\tvar t2;\n\t\tvar t3;\n\t\tvar rgb;\n\t\tvar val;\n\t\n\t\tif (s === 0) {\n\t\t\tval = l * 255;\n\t\t\treturn [val, val, val];\n\t\t}\n\t\n\t\tif (l < 0.5) {\n\t\t\tt2 = l * (1 + s);\n\t\t} else {\n\t\t\tt2 = l + s - l * s;\n\t\t}\n\t\n\t\tt1 = 2 * l - t2;\n\t\n\t\trgb = [0, 0, 0];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\t\tif (t3 < 0) {\n\t\t\t\tt3++;\n\t\t\t}\n\t\t\tif (t3 > 1) {\n\t\t\t\tt3--;\n\t\t\t}\n\t\n\t\t\tif (6 * t3 < 1) {\n\t\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t\t} else if (2 * t3 < 1) {\n\t\t\t\tval = t2;\n\t\t\t} else if (3 * t3 < 2) {\n\t\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t\t} else {\n\t\t\t\tval = t1;\n\t\t\t}\n\t\n\t\t\trgb[i] = val * 255;\n\t\t}\n\t\n\t\treturn rgb;\n\t};\n\t\n\tconvert.hsl.hsv = function (hsl) {\n\t\tvar h = hsl[0];\n\t\tvar s = hsl[1] / 100;\n\t\tvar l = hsl[2] / 100;\n\t\tvar sv;\n\t\tvar v;\n\t\n\t\tif (l === 0) {\n\t\t\t// no need to do calc on black\n\t\t\t// also avoids divide by 0 error\n\t\t\treturn [0, 0, 0];\n\t\t}\n\t\n\t\tl *= 2;\n\t\ts *= (l <= 1) ? l : 2 - l;\n\t\tv = (l + s) / 2;\n\t\tsv = (2 * s) / (l + s);\n\t\n\t\treturn [h, sv * 100, v * 100];\n\t};\n\t\n\tconvert.hsv.rgb = function (hsv) {\n\t\tvar h = hsv[0] / 60;\n\t\tvar s = hsv[1] / 100;\n\t\tvar v = hsv[2] / 100;\n\t\tvar hi = Math.floor(h) % 6;\n\t\n\t\tvar f = h - Math.floor(h);\n\t\tvar p = 255 * v * (1 - s);\n\t\tvar q = 255 * v * (1 - (s * f));\n\t\tvar t = 255 * v * (1 - (s * (1 - f)));\n\t\tv *= 255;\n\t\n\t\tswitch (hi) {\n\t\t\tcase 0:\n\t\t\t\treturn [v, t, p];\n\t\t\tcase 1:\n\t\t\t\treturn [q, v, p];\n\t\t\tcase 2:\n\t\t\t\treturn [p, v, t];\n\t\t\tcase 3:\n\t\t\t\treturn [p, q, v];\n\t\t\tcase 4:\n\t\t\t\treturn [t, p, v];\n\t\t\tcase 5:\n\t\t\t\treturn [v, p, q];\n\t\t}\n\t};\n\t\n\tconvert.hsv.hsl = function (hsv) {\n\t\tvar h = hsv[0];\n\t\tvar s = hsv[1] / 100;\n\t\tvar v = hsv[2] / 100;\n\t\tvar sl;\n\t\tvar l;\n\t\n\t\tl = (2 - s) * v;\n\t\tsl = s * v;\n\t\tsl /= (l <= 1) ? l : 2 - l;\n\t\tsl = sl || 0;\n\t\tl /= 2;\n\t\n\t\treturn [h, sl * 100, l * 100];\n\t};\n\t\n\t// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n\tconvert.hwb.rgb = function (hwb) {\n\t\tvar h = hwb[0] / 360;\n\t\tvar wh = hwb[1] / 100;\n\t\tvar bl = hwb[2] / 100;\n\t\tvar ratio = wh + bl;\n\t\tvar i;\n\t\tvar v;\n\t\tvar f;\n\t\tvar n;\n\t\n\t\t// wh + bl cant be > 1\n\t\tif (ratio > 1) {\n\t\t\twh /= ratio;\n\t\t\tbl /= ratio;\n\t\t}\n\t\n\t\ti = Math.floor(6 * h);\n\t\tv = 1 - bl;\n\t\tf = 6 * h - i;\n\t\n\t\tif ((i & 0x01) !== 0) {\n\t\t\tf = 1 - f;\n\t\t}\n\t\n\t\tn = wh + f * (v - wh); // linear interpolation\n\t\n\t\tvar r;\n\t\tvar g;\n\t\tvar b;\n\t\tswitch (i) {\n\t\t\tdefault:\n\t\t\tcase 6:\n\t\t\tcase 0: r = v; g = n; b = wh; break;\n\t\t\tcase 1: r = n; g = v; b = wh; break;\n\t\t\tcase 2: r = wh; g = v; b = n; break;\n\t\t\tcase 3: r = wh; g = n; b = v; break;\n\t\t\tcase 4: r = n; g = wh; b = v; break;\n\t\t\tcase 5: r = v; g = wh; b = n; break;\n\t\t}\n\t\n\t\treturn [r * 255, g * 255, b * 255];\n\t};\n\t\n\tconvert.cmyk.rgb = function (cmyk) {\n\t\tvar c = cmyk[0] / 100;\n\t\tvar m = cmyk[1] / 100;\n\t\tvar y = cmyk[2] / 100;\n\t\tvar k = cmyk[3] / 100;\n\t\tvar r;\n\t\tvar g;\n\t\tvar b;\n\t\n\t\tr = 1 - Math.min(1, c * (1 - k) + k);\n\t\tg = 1 - Math.min(1, m * (1 - k) + k);\n\t\tb = 1 - Math.min(1, y * (1 - k) + k);\n\t\n\t\treturn [r * 255, g * 255, b * 255];\n\t};\n\t\n\tconvert.xyz.rgb = function (xyz) {\n\t\tvar x = xyz[0] / 100;\n\t\tvar y = xyz[1] / 100;\n\t\tvar z = xyz[2] / 100;\n\t\tvar r;\n\t\tvar g;\n\t\tvar b;\n\t\n\t\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\t\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\t\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\t\n\t\t// assume sRGB\n\t\tr = r > 0.0031308\n\t\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t\t: r *= 12.92;\n\t\n\t\tg = g > 0.0031308\n\t\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t\t: g *= 12.92;\n\t\n\t\tb = b > 0.0031308\n\t\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t\t: b *= 12.92;\n\t\n\t\tr = Math.min(Math.max(0, r), 1);\n\t\tg = Math.min(Math.max(0, g), 1);\n\t\tb = Math.min(Math.max(0, b), 1);\n\t\n\t\treturn [r * 255, g * 255, b * 255];\n\t};\n\t\n\tconvert.xyz.lab = function (xyz) {\n\t\tvar x = xyz[0];\n\t\tvar y = xyz[1];\n\t\tvar z = xyz[2];\n\t\tvar l;\n\t\tvar a;\n\t\tvar b;\n\t\n\t\tx /= 95.047;\n\t\ty /= 100;\n\t\tz /= 108.883;\n\t\n\t\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\t\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\t\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\t\n\t\tl = (116 * y) - 16;\n\t\ta = 500 * (x - y);\n\t\tb = 200 * (y - z);\n\t\n\t\treturn [l, a, b];\n\t};\n\t\n\tconvert.lab.xyz = function (lab) {\n\t\tvar l = lab[0];\n\t\tvar a = lab[1];\n\t\tvar b = lab[2];\n\t\tvar x;\n\t\tvar y;\n\t\tvar z;\n\t\tvar y2;\n\t\n\t\tif (l <= 8) {\n\t\t\ty = (l * 100) / 903.3;\n\t\t\ty2 = (7.787 * (y / 100)) + (16 / 116);\n\t\t} else {\n\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\ty2 = Math.pow(y / 100, 1 / 3);\n\t\t}\n\t\n\t\tx = x / 95.047 <= 0.008856\n\t\t\t? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787\n\t\t\t: 95.047 * Math.pow((a / 500) + y2, 3);\n\t\tz = z / 108.883 <= 0.008859\n\t\t\t? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787\n\t\t\t: 108.883 * Math.pow(y2 - (b / 200), 3);\n\t\n\t\treturn [x, y, z];\n\t};\n\t\n\tconvert.lab.lch = function (lab) {\n\t\tvar l = lab[0];\n\t\tvar a = lab[1];\n\t\tvar b = lab[2];\n\t\tvar hr;\n\t\tvar h;\n\t\tvar c;\n\t\n\t\thr = Math.atan2(b, a);\n\t\th = hr * 360 / 2 / Math.PI;\n\t\n\t\tif (h < 0) {\n\t\t\th += 360;\n\t\t}\n\t\n\t\tc = Math.sqrt(a * a + b * b);\n\t\n\t\treturn [l, c, h];\n\t};\n\t\n\tconvert.lch.lab = function (lch) {\n\t\tvar l = lch[0];\n\t\tvar c = lch[1];\n\t\tvar h = lch[2];\n\t\tvar a;\n\t\tvar b;\n\t\tvar hr;\n\t\n\t\thr = h / 360 * 2 * Math.PI;\n\t\ta = c * Math.cos(hr);\n\t\tb = c * Math.sin(hr);\n\t\n\t\treturn [l, a, b];\n\t};\n\t\n\tconvert.rgb.ansi16 = function (args) {\n\t\tvar r = args[0];\n\t\tvar g = args[1];\n\t\tvar b = args[2];\n\t\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\t\n\t\tvalue = Math.round(value / 50);\n\t\n\t\tif (value === 0) {\n\t\t\treturn 30;\n\t\t}\n\t\n\t\tvar ansi = 30\n\t\t\t+ ((Math.round(b / 255) << 2)\n\t\t\t| (Math.round(g / 255) << 1)\n\t\t\t| Math.round(r / 255));\n\t\n\t\tif (value === 2) {\n\t\t\tansi += 60;\n\t\t}\n\t\n\t\treturn ansi;\n\t};\n\t\n\tconvert.hsv.ansi16 = function (args) {\n\t\t// optimization here; we already know the value and don't need to get\n\t\t// it converted for us.\n\t\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n\t};\n\t\n\tconvert.rgb.ansi256 = function (args) {\n\t\tvar r = args[0];\n\t\tvar g = args[1];\n\t\tvar b = args[2];\n\t\n\t\t// we use the extended greyscale palette here, with the exception of\n\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\tif (r === g && g === b) {\n\t\t\tif (r < 8) {\n\t\t\t\treturn 16;\n\t\t\t}\n\t\n\t\t\tif (r > 248) {\n\t\t\t\treturn 231;\n\t\t\t}\n\t\n\t\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t\t}\n\t\n\t\tvar ansi = 16\n\t\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t\t+ Math.round(b / 255 * 5);\n\t\n\t\treturn ansi;\n\t};\n\t\n\tconvert.ansi16.rgb = function (args) {\n\t\tvar color = args % 10;\n\t\n\t\t// handle greyscale\n\t\tif (color === 0 || color === 7) {\n\t\t\tif (args > 50) {\n\t\t\t\tcolor += 3.5;\n\t\t\t}\n\t\n\t\t\tcolor = color / 10.5 * 255;\n\t\n\t\t\treturn [color, color, color];\n\t\t}\n\t\n\t\tvar mult = (~~(args > 50) + 1) * 0.5;\n\t\tvar r = ((color & 1) * mult) * 255;\n\t\tvar g = (((color >> 1) & 1) * mult) * 255;\n\t\tvar b = (((color >> 2) & 1) * mult) * 255;\n\t\n\t\treturn [r, g, b];\n\t};\n\t\n\tconvert.ansi256.rgb = function (args) {\n\t\t// handle greyscale\n\t\tif (args >= 232) {\n\t\t\tvar c = (args - 232) * 10 + 8;\n\t\t\treturn [c, c, c];\n\t\t}\n\t\n\t\targs -= 16;\n\t\n\t\tvar rem;\n\t\tvar r = Math.floor(args / 36) / 5 * 255;\n\t\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\t\tvar b = (rem % 6) / 5 * 255;\n\t\n\t\treturn [r, g, b];\n\t};\n\t\n\tconvert.rgb.hex = function (args) {\n\t\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t\t+ (Math.round(args[2]) & 0xFF);\n\t\n\t\tvar string = integer.toString(16).toUpperCase();\n\t\treturn '000000'.substring(string.length) + string;\n\t};\n\t\n\tconvert.hex.rgb = function (args) {\n\t\tvar match = args.toString(16).match(/[a-f0-9]{6}/i);\n\t\tif (!match) {\n\t\t\treturn [0, 0, 0];\n\t\t}\n\t\n\t\tvar integer = parseInt(match[0], 16);\n\t\tvar r = (integer >> 16) & 0xFF;\n\t\tvar g = (integer >> 8) & 0xFF;\n\t\tvar b = integer & 0xFF;\n\t\n\t\treturn [r, g, b];\n\t};\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tmodule.exports = {\n\t\taliceblue: [240, 248, 255],\n\t\tantiquewhite: [250, 235, 215],\n\t\taqua: [0, 255, 255],\n\t\taquamarine: [127, 255, 212],\n\t\tazure: [240, 255, 255],\n\t\tbeige: [245, 245, 220],\n\t\tbisque: [255, 228, 196],\n\t\tblack: [0, 0, 0],\n\t\tblanchedalmond: [255, 235, 205],\n\t\tblue: [0, 0, 255],\n\t\tblueviolet: [138, 43, 226],\n\t\tbrown: [165, 42, 42],\n\t\tburlywood: [222, 184, 135],\n\t\tcadetblue: [95, 158, 160],\n\t\tchartreuse: [127, 255, 0],\n\t\tchocolate: [210, 105, 30],\n\t\tcoral: [255, 127, 80],\n\t\tcornflowerblue: [100, 149, 237],\n\t\tcornsilk: [255, 248, 220],\n\t\tcrimson: [220, 20, 60],\n\t\tcyan: [0, 255, 255],\n\t\tdarkblue: [0, 0, 139],\n\t\tdarkcyan: [0, 139, 139],\n\t\tdarkgoldenrod: [184, 134, 11],\n\t\tdarkgray: [169, 169, 169],\n\t\tdarkgreen: [0, 100, 0],\n\t\tdarkgrey: [169, 169, 169],\n\t\tdarkkhaki: [189, 183, 107],\n\t\tdarkmagenta: [139, 0, 139],\n\t\tdarkolivegreen: [85, 107, 47],\n\t\tdarkorange: [255, 140, 0],\n\t\tdarkorchid: [153, 50, 204],\n\t\tdarkred: [139, 0, 0],\n\t\tdarksalmon: [233, 150, 122],\n\t\tdarkseagreen: [143, 188, 143],\n\t\tdarkslateblue: [72, 61, 139],\n\t\tdarkslategray: [47, 79, 79],\n\t\tdarkslategrey: [47, 79, 79],\n\t\tdarkturquoise: [0, 206, 209],\n\t\tdarkviolet: [148, 0, 211],\n\t\tdeeppink: [255, 20, 147],\n\t\tdeepskyblue: [0, 191, 255],\n\t\tdimgray: [105, 105, 105],\n\t\tdimgrey: [105, 105, 105],\n\t\tdodgerblue: [30, 144, 255],\n\t\tfirebrick: [178, 34, 34],\n\t\tfloralwhite: [255, 250, 240],\n\t\tforestgreen: [34, 139, 34],\n\t\tfuchsia: [255, 0, 255],\n\t\tgainsboro: [220, 220, 220],\n\t\tghostwhite: [248, 248, 255],\n\t\tgold: [255, 215, 0],\n\t\tgoldenrod: [218, 165, 32],\n\t\tgray: [128, 128, 128],\n\t\tgreen: [0, 128, 0],\n\t\tgreenyellow: [173, 255, 47],\n\t\tgrey: [128, 128, 128],\n\t\thoneydew: [240, 255, 240],\n\t\thotpink: [255, 105, 180],\n\t\tindianred: [205, 92, 92],\n\t\tindigo: [75, 0, 130],\n\t\tivory: [255, 255, 240],\n\t\tkhaki: [240, 230, 140],\n\t\tlavender: [230, 230, 250],\n\t\tlavenderblush: [255, 240, 245],\n\t\tlawngreen: [124, 252, 0],\n\t\tlemonchiffon: [255, 250, 205],\n\t\tlightblue: [173, 216, 230],\n\t\tlightcoral: [240, 128, 128],\n\t\tlightcyan: [224, 255, 255],\n\t\tlightgoldenrodyellow: [250, 250, 210],\n\t\tlightgray: [211, 211, 211],\n\t\tlightgreen: [144, 238, 144],\n\t\tlightgrey: [211, 211, 211],\n\t\tlightpink: [255, 182, 193],\n\t\tlightsalmon: [255, 160, 122],\n\t\tlightseagreen: [32, 178, 170],\n\t\tlightskyblue: [135, 206, 250],\n\t\tlightslategray: [119, 136, 153],\n\t\tlightslategrey: [119, 136, 153],\n\t\tlightsteelblue: [176, 196, 222],\n\t\tlightyellow: [255, 255, 224],\n\t\tlime: [0, 255, 0],\n\t\tlimegreen: [50, 205, 50],\n\t\tlinen: [250, 240, 230],\n\t\tmagenta: [255, 0, 255],\n\t\tmaroon: [128, 0, 0],\n\t\tmediumaquamarine: [102, 205, 170],\n\t\tmediumblue: [0, 0, 205],\n\t\tmediumorchid: [186, 85, 211],\n\t\tmediumpurple: [147, 112, 219],\n\t\tmediumseagreen: [60, 179, 113],\n\t\tmediumslateblue: [123, 104, 238],\n\t\tmediumspringgreen: [0, 250, 154],\n\t\tmediumturquoise: [72, 209, 204],\n\t\tmediumvioletred: [199, 21, 133],\n\t\tmidnightblue: [25, 25, 112],\n\t\tmintcream: [245, 255, 250],\n\t\tmistyrose: [255, 228, 225],\n\t\tmoccasin: [255, 228, 181],\n\t\tnavajowhite: [255, 222, 173],\n\t\tnavy: [0, 0, 128],\n\t\toldlace: [253, 245, 230],\n\t\tolive: [128, 128, 0],\n\t\tolivedrab: [107, 142, 35],\n\t\torange: [255, 165, 0],\n\t\torangered: [255, 69, 0],\n\t\torchid: [218, 112, 214],\n\t\tpalegoldenrod: [238, 232, 170],\n\t\tpalegreen: [152, 251, 152],\n\t\tpaleturquoise: [175, 238, 238],\n\t\tpalevioletred: [219, 112, 147],\n\t\tpapayawhip: [255, 239, 213],\n\t\tpeachpuff: [255, 218, 185],\n\t\tperu: [205, 133, 63],\n\t\tpink: [255, 192, 203],\n\t\tplum: [221, 160, 221],\n\t\tpowderblue: [176, 224, 230],\n\t\tpurple: [128, 0, 128],\n\t\trebeccapurple: [102, 51, 153],\n\t\tred: [255, 0, 0],\n\t\trosybrown: [188, 143, 143],\n\t\troyalblue: [65, 105, 225],\n\t\tsaddlebrown: [139, 69, 19],\n\t\tsalmon: [250, 128, 114],\n\t\tsandybrown: [244, 164, 96],\n\t\tseagreen: [46, 139, 87],\n\t\tseashell: [255, 245, 238],\n\t\tsienna: [160, 82, 45],\n\t\tsilver: [192, 192, 192],\n\t\tskyblue: [135, 206, 235],\n\t\tslateblue: [106, 90, 205],\n\t\tslategray: [112, 128, 144],\n\t\tslategrey: [112, 128, 144],\n\t\tsnow: [255, 250, 250],\n\t\tspringgreen: [0, 255, 127],\n\t\tsteelblue: [70, 130, 180],\n\t\ttan: [210, 180, 140],\n\t\tteal: [0, 128, 128],\n\t\tthistle: [216, 191, 216],\n\t\ttomato: [255, 99, 71],\n\t\tturquoise: [64, 224, 208],\n\t\tviolet: [238, 130, 238],\n\t\twheat: [245, 222, 179],\n\t\twhite: [255, 255, 255],\n\t\twhitesmoke: [245, 245, 245],\n\t\tyellow: [255, 255, 0],\n\t\tyellowgreen: [154, 205, 50]\n\t};\n\t\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar conversions = __webpack_require__(9);\n\t\n\t/*\n\t\tthis function routes a model to all other models.\n\t\n\t\tall functions that are routed have a property `.conversion` attached\n\t\tto the returned synthetic function. This property is an array\n\t\tof strings, each with the steps in between the 'from' and 'to'\n\t\tcolor models (inclusive).\n\t\n\t\tconversions that are not possible simply are not included.\n\t*/\n\t\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\t\n\tfunction buildGraph() {\n\t\tvar graph = {};\n\t\n\t\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\t\tgraph[models[i]] = {\n\t\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t\t// micro-opt, but this is simple.\n\t\t\t\tdistance: -1,\n\t\t\t\tparent: null\n\t\t\t};\n\t\t}\n\t\n\t\treturn graph;\n\t}\n\t\n\t// https://en.wikipedia.org/wiki/Breadth-first_search\n\tfunction deriveBFS(fromModel) {\n\t\tvar graph = buildGraph();\n\t\tvar queue = [fromModel]; // unshift -> queue -> pop\n\t\n\t\tgraph[fromModel].distance = 0;\n\t\n\t\twhile (queue.length) {\n\t\t\tvar current = queue.pop();\n\t\t\tvar adjacents = Object.keys(conversions[current]);\n\t\n\t\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\t\tvar adjacent = adjacents[i];\n\t\t\t\tvar node = graph[adjacent];\n\t\n\t\t\t\tif (node.distance === -1) {\n\t\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\t\tnode.parent = current;\n\t\t\t\t\tqueue.unshift(adjacent);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn graph;\n\t}\n\t\n\tfunction link(from, to) {\n\t\treturn function (args) {\n\t\t\treturn to(from(args));\n\t\t};\n\t}\n\t\n\tfunction wrapConversion(toModel, graph) {\n\t\tvar path = [graph[toModel].parent, toModel];\n\t\tvar fn = conversions[graph[toModel].parent][toModel];\n\t\n\t\tvar cur = graph[toModel].parent;\n\t\twhile (graph[cur].parent) {\n\t\t\tpath.unshift(graph[cur].parent);\n\t\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\t\tcur = graph[cur].parent;\n\t\t}\n\t\n\t\tfn.conversion = path;\n\t\treturn fn;\n\t}\n\t\n\tmodule.exports = function (fromModel) {\n\t\tvar graph = deriveBFS(fromModel);\n\t\tvar conversion = {};\n\t\n\t\tvar models = Object.keys(graph);\n\t\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\t\tvar toModel = models[i];\n\t\t\tvar node = graph[toModel];\n\t\n\t\t\tif (node.parent === null) {\n\t\t\t\t// no possible conversion, or this node is the source model.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t\t}\n\t\n\t\treturn conversion;\n\t};\n\t\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/*\n\t types are normally: R G B W\n\t Z (background), E (experimental)\n\t A: absorbance\n\t T: transmittance\n\t */\n\t\n\tmodule.exports = {\n\t    R:{label:'red', yUnit:\"relative\", color:'red'},\n\t    G:{label:'green', yUnit:\"relative\", color:'green'},\n\t    B:{label:'blue', yUnit:\"relative\", color:'blue'},\n\t    W:{label:'white', yUnit:\"relative\", color:'black'},\n\t    Z:{label:'background', yUnit:\"relative\", color:'grey'},\n\t    E:{label:'experimental', yUnit:\"relative\", color:'black'},\n\t    A:{label:'absorbance', yUnit:\"%\", color:'black'},\n\t    T:{label:'transmittance', yUnit:\"%\", color:'black'}\n\t};\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t// convert experiments to a tab-delimited file\n\t\n\tvar headers=[];\n\theaders[0]=[]; // name\n\theaders[1]=[]; // concentration\n\theaders[2]=[]; // comment\n\theaders[3]=[]; // type\n\t\n\tmodule.exports=function (experiments, channels, index) {\n\t    var channels = channels || 'RGBWT';\n\t\n\t    if (! Array.isArray(experiments)) experiments=[experiments];\n\t\n\t    var data=[];\n\t\n\t\n\t\n\t    var counter=0;\n\t    for (var i = 0; i < experiments.length; i++) {\n\t        if ((index === undefined) || (index === i)) {\n\t            var experiment=experiments[i];\n\t\n\t            addHeaders(experiment, 'X');\n\t            var currentData=experiment[Object.keys(experiment)[0]];\n\t            for (var j=0; j<currentData.x.length; j++) {\n\t                if (! data[j]) data[j]=[];\n\t                data[j].push(currentData.x[j].toPrecision(4));\n\t            }\n\t\n\t            for (var key in experiment) {\n\t                if (channels.indexOf(key)>-1) {\n\t                    addHeaders(experiment,key);\n\t                    var currentData=experiment[key];\n\t                    for (var j=0; j<currentData.y.length; j++) {\n\t                        data[j].push(currentData.y[j].toPrecision(4));\n\t                    }\n\t                }\n\t            }\n\t        }\n\t    }\n\t\n\t    var lines=[];\n\t    for (var i=0; i<headers.length; i++) {\n\t        var header=headers[i];\n\t        lines.push(header.join(\"\\t\"));\n\t    }\n\t    for (var i=0; i<data.length; i++) {\n\t        var datum=data[i];\n\t        lines.push(datum.join(\"\\t\"));\n\t    }\n\t    var result=lines.join(\"\\r\\n\");\n\t    return result;\n\t\n\t}\n\t\n\tfunction addHeaders(experiment, type) {\n\t    headers[0].push(experiment.info.name);\n\t    headers[1].push(experiment.info.concentration);\n\t    headers[2].push(experiment.info.comment);\n\t    headers[3].push(type);\n\t}\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar parse=__webpack_require__(2);\n\t\n\t// We load a json containing all the einformations\n\t\n\t\n\tmodule.exports = function (selected, options) {\n\t    var options=Object.create(options||{});\n\t    var experiments=[];\n\t    selected.forEach(function(current) {\n\t        options.info=current;\n\t        var experiment=parse(current.data, options);\n\t        experiments.push(experiment);\n\t    });\n\t    return experiments;\n\t};\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** open-spectro.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap aa52f5afe4e20729dda8\n **/","'use strict';\n\n\nvar wavelengthToColor = require('./wavelengthToColor');\nvar parse = require('./parse');\nvar process = require('./process');\nvar getAnnotations = require('./getAnnotations');\nvar getColorBar = require('./getColorBar');\nvar Util = require('./util');\nvar getChart = require('./getChart');\nvar getTabDelimited = require('./getTabDelimited');\nvar load = require('./load');\n\nmodule.exports.wavelengthTocolor=wavelengthToColor;\nmodule.exports.parse=parse;\nmodule.exports.process=process;\nmodule.exports.getAnnotations=getAnnotations;\nmodule.exports.getColorBar=getColorBar;\nmodule.exports.Util=Util;\nmodule.exports.getChart=getChart;\nmodule.exports.getTabDelimited=getTabDelimited;\nmodule.exports.load=load;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/index.js\n ** module id = 0\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = function (wavelength) {\n    var red;\n    var green;\n    var blue;\n    var alpha;\n\n    if (wavelength >= 380 && wavelength < 440) {\n        red = -1 * (wavelength - 440) / (440 - 380);\n        green = 0;\n        blue = 1;\n    } else if (wavelength >= 440 && wavelength < 490) {\n        red = 0;\n        green = (wavelength - 440) / (490 - 440);\n        blue = 1;\n    } else if (wavelength >= 490 && wavelength < 510) {\n        red = 0;\n        green = 1;\n        blue = -1 * (wavelength - 510) / (510 - 490);\n    } else if (wavelength >= 510 && wavelength < 580) {\n        red = (wavelength - 510) / (580 - 510);\n        green = 1;\n        blue = 0;\n    } else if (wavelength >= 580 && wavelength < 645) {\n        red = 1;\n        green = -1 * (wavelength - 645) / (645 - 580);\n        blue = 0.0;\n    } else if (wavelength >= 645 && wavelength <= 780) {\n        red = 1;\n        green = 0;\n        blue = 0;\n    } else {\n        red = 0;\n        green = 0;\n        blue = 0;\n    }\n\n    // outside visible spectrum\n    if (wavelength > 780 || wavelength < 380) {\n        alpha = 0;\n    } else if (wavelength > 700) {\n        alpha = (780 - wavelength) / (780 - 700);\n    } else if (wavelength < 420) {\n        alpha = (wavelength - 380) / (420 - 380);\n    } else {\n        alpha = 1;\n    }\n\n    return {\n        color: \"rgba(\" + (red * 100) + \"%,\" + (green * 100) + \"%,\" + (blue * 100) + \"%, \" + alpha + \")\",\n        red: red,\n        green: green,\n        blue: blue,\n        alpha: alpha\n    }\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/wavelengthToColor.js\n ** module id = 1\n ** module chunks = 0\n **/","'use strict';\nvar process=require('./process.js');\nvar Util=require('./util.js');\n\n\nfunction absorbance(experiment, reference) {\n    var results=new Array(experiment.length);\n    for (var i=0; i<experiment.length; i++) {\n        results[i]=-Math.log10(experiment[i]/reference[i]);\n    }\n    return results;\n}\n\nfunction transmittance(experiment, reference) {\n    var results=new Array(experiment.length);\n    for (var i=0; i<experiment.length; i++) {\n        results[i]=experiment[i]/reference[i]*100;\n    }\n    return results;\n}\n\n\n\nvar difference=['r','q','p','o','n','m','l','k','j','%','J','K','L','M','N','O','P','Q','R'];\n\nfunction parseData(lines) {\n    var y=[];\n    var currentValue=0;\n    for (var i=0; i<lines.length; i++) {\n        var line=lines[i];\n        var fields=lines[i].split(/( ?(?=[a-zA-Z%])| +(?=[^a-zA-Z%]))/);\n        for (var j=0; j<fields.length; j++) {\n            var field=fields[j];\n            if (field.trim().length>0) {\n                // we check if we convert the first character\n                if (field.match(/^[j-rJ-R%]/)) {\n                    var firstChar=field.substring(0,1);\n                    var value=difference.indexOf(firstChar)-9;\n                    currentValue+=(value+field.substr(1))>>0;\n                } else {\n                    currentValue=fields[j]>>0;\n                }\n                y.push(currentValue);\n            }\n        }\n    }\n    return y;\n}\n\n\n\nfunction parseInfo(info) {\n    var result={};\n    var fields=info.split(\",\");\n    result.type=fields[0];\n    for (var i=1; i<fields.length; i++) {\n        var field=fields[i];\n        var fieldType=field.replace(/^([A-Z]*)(.*)$/,\"$1\");\n        var fieldValue=field.replace(/^([A-Z]*)(.*)$/,\"$2\");\n        switch(fieldType) {\n            case 'I':\n                result.intensity=fieldValue>>0;\n                result.percentIntensity=Math.round(((fieldValue>>0)/256)*100);\n                break;\n            case 'RGB':\n                var values=fieldValue.split(\"/\");\n                result.redPoint=values[0]>>0;\n                result.greenPoint=values[1]>>0;\n                result.bluePoint=values[2]>>0;\n                break;\n            case 'REF':\n                var values=fieldValue.split(\"/\");\n                result.nMRed=values[0]>>0;\n                result.nMGreen=values[1]>>0;\n                result.nMBlue=values[2]>>0;\n                break;\n            case 'BG':\n                var values=fieldValue.split(\"/\");\n                result.backgroundMin=values[0]>>0;\n                result.backgroundMax=values[1]>>0;\n                break;\n            default:\n                result[fieldType]=fieldValue;\n        }\n    }\n    return result;\n}\n\n/*\n types are normally: R G B W\n Z (background), E (experimental)\n A: absorbance\n T: transmittance\n  */\n\nfunction convertToObject(spectra) {\n    var result={};\n    for (var i=0; i<spectra.length; i++) {\n        var spectrum=spectra[i];\n        result[spectrum.type]=spectrum;\n    }\n    return result;\n}\n\nfunction addInfo(spectra, info) {\n    var info=info || {};\n    for (var type in spectra) {\n        var spectrum=spectra[type];\n        Object.keys(info).forEach(function(key) {\n            spectrum.info = spectrum.info || {};\n            if (key!=='data') {\n                spectrum.info[key]=info[key];\n            }\n        });\n    }\n}\n\nfunction addAbsorbanceTransmittance(spectra) {\n    // if we have Z and E we calculate absorbance and transmittance\n    if (spectra.Z && spectra.E) {\n        var a=JSON.parse(JSON.stringify(spectra.Z));\n        a.type=\"A\";\n        a.y=absorbance(spectra.E.y, spectra.Z.y);\n        spectra.A=a;\n        var t=JSON.parse(JSON.stringify(spectra.Z));\n        t.type=\"T\";\n        t.y=transmittance(spectra.E.y, spectra.Z.y);\n        spectra.T=t;\n    }\n}\n\nfunction addTabDelimited(spectra) {\n    for (var key in spectra) {\n        var spectrum = spectra[key];\n        spectrum.tab = Util.toXY(spectrum);\n    }\n}\n\nfunction addX(spectra) {\n    for (var key in spectra) {\n        var spectrum=spectra[key];\n        var diffPoints=spectrum.redPoint-spectrum.bluePoint;\n        var diffNM=(spectrum.nMRed-spectrum.nMBlue)/(diffPoints-1);\n        var length=spectrum.y.length;\n\n        // we will add all the color spectrum\n        // need to guess the nm of the first point and last point\n        var firstNM=spectrum.nMBlue-spectrum.bluePoint*diffNM;\n        var lastNM=spectrum.nMRed+(length-spectrum.redPoint)*diffNM;\n        spectrum.x=[];\n        for (var i=0; i<length; i++) {\n            var wavelength=firstNM+(lastNM-firstNM)/(length-1)*i;\n            spectrum.x.push(wavelength);\n        }\n    }\n}\n\nmodule.exports = function (text, options) {\n    if (! text) return [];\n    var options=Object.create(options || {});\n    var blocs=text.split(/[\\r\\n]*>/m);\n    var results=[];\n    for (var part=0; part<blocs.length; part++) {\n        var bloc=blocs[part];\n        var result=[];\n        var lines=bloc.split(/[\\r\\n]+/);\n        // first line is the info line\n        var info=lines[0];\n        if (info && info.match(/^[A-Z]/)) {\n            var result=parseInfo(info);\n            result.y=parseData(lines.slice(1));\n            results.push(result);\n        }\n\n    }\n    var spectra=convertToObject(results);\n    addAbsorbanceTransmittance(spectra);\n    addInfo(spectra, options.info);\n    process(spectra, options);\n    addX(spectra);\n    addTabDelimited(spectra);\n\n    return spectra;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/parse.js\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\n// process spectra\n\nfunction smooth(spectrum, nbPixels) {\n    var result=[];\n    var array=spectrum.y;\n    var shift=Math.floor(nbPixels/2);\n\n    for (var i=shift; i<(array.length-shift-1); i++) {\n        var average=0;\n        for (var j=i-shift; j<i-shift+nbPixels; j++) {\n            average+=array[j];\n        }\n        result.push(average/nbPixels)\n    }\n\n    spectrum.y=result;\n    // need to shift the reference point\n    spectrum.redPoint-=shift;\n    spectrum.bluePoint-=shift;\n    spectrum.greenPoint-=shift;\n};\n\nfunction normalize(spectrum) {\n    var array=spectrum.y;\n    var min=Number.MAX_VALUE;\n    var max=Number.MIN_VALUE;\n    for (var i=0; i<array.length; i++) {\n        if (array[i]<min) min=array[i];\n        if (array[i]>max) max=array[i];\n    }\n    if (min!=max) {\n        for (var i=0; i<array.length; i++) {\n            array[i]=(array[i]-min)/(max-min);\n        }\n    } else {\n        for (var i=0; i<array.length; i++) {\n            array[i]=0.5;\n        }\n    }\n    spectrum.y=array;\n}\n\nmodule.exports=function(spectra, options) {\n    var options=Object.create(options||{});\n\n    for (var key in spectra) {\n        if (options.smooth) {\n            smooth(spectra[key], options.smooth);\n        }\n        if (options.normalize) {\n            normalize(spectra[key]);\n        }\n    }\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/process.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports.toXY=function(spectrum) {\n    var x=spectrum.x;\n    var y=spectrum.y;\n    var result=[];\n    for (var i=0; i< x.length; i++) {\n        result.push(x[i]+\"\\t\"+y[i]);\n    }\n    return result.join('\\r\\n');\n}\n\nmodule.exports.toArray=function(spectra) {\n    var array=[];\n    for (var key in spectra) {\n        array.push(spectra[key]);\n    }\n    return array;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/util.js\n ** module id = 4\n ** module chunks = 0\n **/","'use strict';\n\nvar wavelengthToColor = require('./wavelengthToColor');\n\n\nfunction getAnnotation(pixel, color, height) {\n    return {\n        \"fillColor\": color,\n        \"type\": \"rect\",\n        \"position\": [{\n            \"y\": \"0px\",\n            \"x\": pixel+2\n        },{\n            \"y\": height+\"px\",\n            \"x\": pixel-1\n        }],\n        \"strokeWidth\":0.0001\n    };\n}\n\nmodule.exports=function(spectrum) {\n    if (! spectrum) return;\n    var annotations=[];\n    annotations.push(getAnnotation(spectrum.nMRed,\"red\",15));\n    annotations.push(getAnnotation(spectrum.nMBlue,\"blue\",15));\n    annotations.push(getAnnotation(spectrum.nMGreen,\"green\",15));\n\n    var x=spectrum.x;\n    for (var i=0; i<x.length; i++) {\n        var color=wavelengthToColor(x[i]).color;\n        annotations.push(getAnnotation(x[i],color,10));\n    }\n    return annotations;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/getAnnotations.js\n ** module id = 5\n ** module chunks = 0\n **/","'use strict';\n\nvar getAnnotations=require('./getAnnotations.js');\n\nmodule.exports=function(experiments) {\n    if (! experiments || experiments.length===0) return;\n    var experiment=experiments[0];\n    var keys=Object.keys(experiment);\n    if (keys.length===0) return;\n    return getAnnotations(experiment[keys[0]]);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/getColorBar.js\n ** module id = 6\n ** module chunks = 0\n **/","'use strict';\n\nvar colorConvert = require('color-convert');\n\n\n// convert an experiment, an array of spectra, to a chart\n\nvar types=require('./types.js');\n\n\n\nmodule.exports=function (experiments, options) {\n    var options=options || {};\n    var channels='RGBWT';\n    if (options.channels) channels=options.channels+\"\"; // solve datastring length problem\n    var index=options.index;\n\n    if (! Array.isArray(experiments)) experiments=[experiments];\n\n    var yLabel=\"Y axis\";\n    if (channels.length===1) {\n        yLabel=types[channels].label + \"(\"+types[channels].yUnit+\")\";\n    }\n\n    var chart = {\n        title: \"Open Spectrophotometer results\",\n        \"axis\": [\n            {\n                \"label\": \"Wavelength (nm)\"\n            },\n            {\n                \"label\": yLabel\n            }\n        ],\n        \"data\": []\n    }\n\n    var counter=0;\n\n    var showName=false;\n    var showConcentration=false;\n    var showComment=false;\n    var showChannel=(channels.length===1) ? false : true;\n\n    for (var i=0; i<experiments.length; i++) {\n        var experiment=experiments[i];\n        for (var key in experiment) {\n            if (!experiment[key].info) experiment[key].info = {};\n        }\n    }\n\n    for (var i=1; i<experiments.length; i++) {\n        var experiment=experiments[i];\n        for (var key in experiment) {\n            if (channels.indexOf(key) > -1) {\n                if (experiments[0][key].info.concentration !== experiment[key].info.concentration) showConcentration = true;\n                if (experiments[0][key].info.name !== experiment[key].info.name) showName = true;\n                if (experiments[0][key].info.comment !== experiment[key].info.comment) showComment = true;\n            }\n        }\n    }\n\n\n    var distinctColors=getDistinctColors(experiments.length);\n\n    for (var i = 0; i < experiments.length; i++) {\n        if ((index === undefined) || (index === i)) {\n            var experiment=experiments[i];\n            for (var key in experiment) {\n                if (channels.indexOf(key)>-1) {\n                    var data=experiment[key];\n\n                    var label=\"\";\n                    if (showName) label+=data.info.name;\n                    if (showConcentration) {\n                        if (showName) label+=' ('+data.info.concentration+')';\n                        else label+=data.info.concentration;\n                    }\n                    if (showComment) {\n                        if (label) label+=' ';\n                        label+=data.info.comment;\n                    }\n                    if (showChannel) {\n                        if (label) label+=' ';\n                        label+=key;\n                    }\n                    var color=(channels.length===1 && experiments.length>1) ? distinctColors[i] : types[key].color;\n                    chart.data.push({\n                        \"x\":data.x,\n                        \"y\":data.y,\n                        \"label\":label,\n                        xAxis: 0,\n                        yAxis: 1,\n                        defaultStyle: {\n                            lineColor: color,\n                            lineWidth: 2\n                        }\n                    });\n                }\n            }\n        }\n    }\n\n    return {\n        type:'chart',\n        value: chart\n    };\n}\n\n\n\nfunction getDistinctColors(numberColor) {\n    var colors=[];\n    for (var i=0; i<360; i+=360/numberColor) {\n        colors.push(colorConvert.hsl.rgb(i, 100, 50));\n    }\n    return colors;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/getChart.js\n ** module id = 7\n ** module chunks = 0\n **/","var conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/color-convert/index.js\n ** module id = 8\n ** module chunks = 0\n **/","/* MIT license */\nvar cssKeywords = require('./css-keywords');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key].join()] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {},\n\thsl: {},\n\thsv: {},\n\thwb: {},\n\tcmyk: {},\n\txyz: {},\n\tlab: {},\n\tlch: {},\n\thex: {},\n\tkeyword: {},\n\tansi16: {},\n\tansi256: {}\n};\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar v;\n\n\tif (max === 0) {\n\t\ts = 0;\n\t} else {\n\t\ts = (delta / max * 1000) / 10;\n\t}\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tv = ((max / 255) * 1000) / 10;\n\n\treturn [h, s, v];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nconvert.rgb.keyword = function (rgb) {\n\treturn reverseKeywords[rgb.join()];\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar sv;\n\tvar v;\n\n\tif (l === 0) {\n\t\t// no need to do calc on black\n\t\t// also avoids divide by 0 error\n\t\treturn [0, 0, 0];\n\t}\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tv = (l + s) / 2;\n\tsv = (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tsl = s * v;\n\tsl /= (l <= 1) ? l : 2 - l;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r *= 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g *= 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b *= 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\tvar y2;\n\n\tif (l <= 8) {\n\t\ty = (l * 100) / 903.3;\n\t\ty2 = (7.787 * (y / 100)) + (16 / 116);\n\t} else {\n\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\ty2 = Math.pow(y / 100, 1 / 3);\n\t}\n\n\tx = x / 95.047 <= 0.008856\n\t\t? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787\n\t\t: 95.047 * Math.pow((a / 500) + y2, 3);\n\tz = z / 108.883 <= 0.008859\n\t\t? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787\n\t\t: 108.883 * Math.pow(y2 - (b / 200), 3);\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar integer = parseInt(match[0], 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/color-convert/conversions.js\n ** module id = 9\n ** module chunks = 0\n **/","module.exports = {\n\taliceblue: [240, 248, 255],\n\tantiquewhite: [250, 235, 215],\n\taqua: [0, 255, 255],\n\taquamarine: [127, 255, 212],\n\tazure: [240, 255, 255],\n\tbeige: [245, 245, 220],\n\tbisque: [255, 228, 196],\n\tblack: [0, 0, 0],\n\tblanchedalmond: [255, 235, 205],\n\tblue: [0, 0, 255],\n\tblueviolet: [138, 43, 226],\n\tbrown: [165, 42, 42],\n\tburlywood: [222, 184, 135],\n\tcadetblue: [95, 158, 160],\n\tchartreuse: [127, 255, 0],\n\tchocolate: [210, 105, 30],\n\tcoral: [255, 127, 80],\n\tcornflowerblue: [100, 149, 237],\n\tcornsilk: [255, 248, 220],\n\tcrimson: [220, 20, 60],\n\tcyan: [0, 255, 255],\n\tdarkblue: [0, 0, 139],\n\tdarkcyan: [0, 139, 139],\n\tdarkgoldenrod: [184, 134, 11],\n\tdarkgray: [169, 169, 169],\n\tdarkgreen: [0, 100, 0],\n\tdarkgrey: [169, 169, 169],\n\tdarkkhaki: [189, 183, 107],\n\tdarkmagenta: [139, 0, 139],\n\tdarkolivegreen: [85, 107, 47],\n\tdarkorange: [255, 140, 0],\n\tdarkorchid: [153, 50, 204],\n\tdarkred: [139, 0, 0],\n\tdarksalmon: [233, 150, 122],\n\tdarkseagreen: [143, 188, 143],\n\tdarkslateblue: [72, 61, 139],\n\tdarkslategray: [47, 79, 79],\n\tdarkslategrey: [47, 79, 79],\n\tdarkturquoise: [0, 206, 209],\n\tdarkviolet: [148, 0, 211],\n\tdeeppink: [255, 20, 147],\n\tdeepskyblue: [0, 191, 255],\n\tdimgray: [105, 105, 105],\n\tdimgrey: [105, 105, 105],\n\tdodgerblue: [30, 144, 255],\n\tfirebrick: [178, 34, 34],\n\tfloralwhite: [255, 250, 240],\n\tforestgreen: [34, 139, 34],\n\tfuchsia: [255, 0, 255],\n\tgainsboro: [220, 220, 220],\n\tghostwhite: [248, 248, 255],\n\tgold: [255, 215, 0],\n\tgoldenrod: [218, 165, 32],\n\tgray: [128, 128, 128],\n\tgreen: [0, 128, 0],\n\tgreenyellow: [173, 255, 47],\n\tgrey: [128, 128, 128],\n\thoneydew: [240, 255, 240],\n\thotpink: [255, 105, 180],\n\tindianred: [205, 92, 92],\n\tindigo: [75, 0, 130],\n\tivory: [255, 255, 240],\n\tkhaki: [240, 230, 140],\n\tlavender: [230, 230, 250],\n\tlavenderblush: [255, 240, 245],\n\tlawngreen: [124, 252, 0],\n\tlemonchiffon: [255, 250, 205],\n\tlightblue: [173, 216, 230],\n\tlightcoral: [240, 128, 128],\n\tlightcyan: [224, 255, 255],\n\tlightgoldenrodyellow: [250, 250, 210],\n\tlightgray: [211, 211, 211],\n\tlightgreen: [144, 238, 144],\n\tlightgrey: [211, 211, 211],\n\tlightpink: [255, 182, 193],\n\tlightsalmon: [255, 160, 122],\n\tlightseagreen: [32, 178, 170],\n\tlightskyblue: [135, 206, 250],\n\tlightslategray: [119, 136, 153],\n\tlightslategrey: [119, 136, 153],\n\tlightsteelblue: [176, 196, 222],\n\tlightyellow: [255, 255, 224],\n\tlime: [0, 255, 0],\n\tlimegreen: [50, 205, 50],\n\tlinen: [250, 240, 230],\n\tmagenta: [255, 0, 255],\n\tmaroon: [128, 0, 0],\n\tmediumaquamarine: [102, 205, 170],\n\tmediumblue: [0, 0, 205],\n\tmediumorchid: [186, 85, 211],\n\tmediumpurple: [147, 112, 219],\n\tmediumseagreen: [60, 179, 113],\n\tmediumslateblue: [123, 104, 238],\n\tmediumspringgreen: [0, 250, 154],\n\tmediumturquoise: [72, 209, 204],\n\tmediumvioletred: [199, 21, 133],\n\tmidnightblue: [25, 25, 112],\n\tmintcream: [245, 255, 250],\n\tmistyrose: [255, 228, 225],\n\tmoccasin: [255, 228, 181],\n\tnavajowhite: [255, 222, 173],\n\tnavy: [0, 0, 128],\n\toldlace: [253, 245, 230],\n\tolive: [128, 128, 0],\n\tolivedrab: [107, 142, 35],\n\torange: [255, 165, 0],\n\torangered: [255, 69, 0],\n\torchid: [218, 112, 214],\n\tpalegoldenrod: [238, 232, 170],\n\tpalegreen: [152, 251, 152],\n\tpaleturquoise: [175, 238, 238],\n\tpalevioletred: [219, 112, 147],\n\tpapayawhip: [255, 239, 213],\n\tpeachpuff: [255, 218, 185],\n\tperu: [205, 133, 63],\n\tpink: [255, 192, 203],\n\tplum: [221, 160, 221],\n\tpowderblue: [176, 224, 230],\n\tpurple: [128, 0, 128],\n\trebeccapurple: [102, 51, 153],\n\tred: [255, 0, 0],\n\trosybrown: [188, 143, 143],\n\troyalblue: [65, 105, 225],\n\tsaddlebrown: [139, 69, 19],\n\tsalmon: [250, 128, 114],\n\tsandybrown: [244, 164, 96],\n\tseagreen: [46, 139, 87],\n\tseashell: [255, 245, 238],\n\tsienna: [160, 82, 45],\n\tsilver: [192, 192, 192],\n\tskyblue: [135, 206, 235],\n\tslateblue: [106, 90, 205],\n\tslategray: [112, 128, 144],\n\tslategrey: [112, 128, 144],\n\tsnow: [255, 250, 250],\n\tspringgreen: [0, 255, 127],\n\tsteelblue: [70, 130, 180],\n\ttan: [210, 180, 140],\n\tteal: [0, 128, 128],\n\tthistle: [216, 191, 216],\n\ttomato: [255, 99, 71],\n\tturquoise: [64, 224, 208],\n\tviolet: [238, 130, 238],\n\twheat: [245, 222, 179],\n\twhite: [255, 255, 255],\n\twhitesmoke: [245, 245, 245],\n\tyellow: [255, 255, 0],\n\tyellowgreen: [154, 205, 50]\n};\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/color-convert/css-keywords.js\n ** module id = 10\n ** module chunks = 0\n **/","var conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\n// https://jsperf.com/object-keys-vs-for-in-with-closure/3\nvar models = Object.keys(conversions);\n\nfunction buildGraph() {\n\tvar graph = {};\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/color-convert/route.js\n ** module id = 11\n ** module chunks = 0\n **/","'use strict';\n\n/*\n types are normally: R G B W\n Z (background), E (experimental)\n A: absorbance\n T: transmittance\n */\n\nmodule.exports = {\n    R:{label:'red', yUnit:\"relative\", color:'red'},\n    G:{label:'green', yUnit:\"relative\", color:'green'},\n    B:{label:'blue', yUnit:\"relative\", color:'blue'},\n    W:{label:'white', yUnit:\"relative\", color:'black'},\n    Z:{label:'background', yUnit:\"relative\", color:'grey'},\n    E:{label:'experimental', yUnit:\"relative\", color:'black'},\n    A:{label:'absorbance', yUnit:\"%\", color:'black'},\n    T:{label:'transmittance', yUnit:\"%\", color:'black'}\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/types.js\n ** module id = 12\n ** module chunks = 0\n **/","'use strict';\n\n// convert experiments to a tab-delimited file\n\nvar headers=[];\nheaders[0]=[]; // name\nheaders[1]=[]; // concentration\nheaders[2]=[]; // comment\nheaders[3]=[]; // type\n\nmodule.exports=function (experiments, channels, index) {\n    var channels = channels || 'RGBWT';\n\n    if (! Array.isArray(experiments)) experiments=[experiments];\n\n    var data=[];\n\n\n\n    var counter=0;\n    for (var i = 0; i < experiments.length; i++) {\n        if ((index === undefined) || (index === i)) {\n            var experiment=experiments[i];\n\n            addHeaders(experiment, 'X');\n            var currentData=experiment[Object.keys(experiment)[0]];\n            for (var j=0; j<currentData.x.length; j++) {\n                if (! data[j]) data[j]=[];\n                data[j].push(currentData.x[j].toPrecision(4));\n            }\n\n            for (var key in experiment) {\n                if (channels.indexOf(key)>-1) {\n                    addHeaders(experiment,key);\n                    var currentData=experiment[key];\n                    for (var j=0; j<currentData.y.length; j++) {\n                        data[j].push(currentData.y[j].toPrecision(4));\n                    }\n                }\n            }\n        }\n    }\n\n    var lines=[];\n    for (var i=0; i<headers.length; i++) {\n        var header=headers[i];\n        lines.push(header.join(\"\\t\"));\n    }\n    for (var i=0; i<data.length; i++) {\n        var datum=data[i];\n        lines.push(datum.join(\"\\t\"));\n    }\n    var result=lines.join(\"\\r\\n\");\n    return result;\n\n}\n\nfunction addHeaders(experiment, type) {\n    headers[0].push(experiment.info.name);\n    headers[1].push(experiment.info.concentration);\n    headers[2].push(experiment.info.comment);\n    headers[3].push(type);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/getTabDelimited.js\n ** module id = 13\n ** module chunks = 0\n **/","'use strict';\nvar parse=require('./parse.js');\n\n// We load a json containing all the einformations\n\n\nmodule.exports = function (selected, options) {\n    var options=Object.create(options||{});\n    var experiments=[];\n    selected.forEach(function(current) {\n        options.info=current;\n        var experiment=parse(current.data, options);\n        experiments.push(experiment);\n    });\n    return experiments;\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/load.js\n ** module id = 14\n ** module chunks = 0\n **/"],"sourceRoot":""}