{"version":3,"sources":["webpack:///./node_modules/chart.js/src/plugins/plugin.legend.js","webpack:///./node_modules/chart.js/src/platforms/platform.basic.js","webpack:///./node_modules/chart.js/src/scales/scale.time.js","webpack:///./node_modules/chart.js/src/scales/scale.linear.js","webpack:///./node_modules/chart.js/src/scales/scale.logarithmic.js","webpack:///./node_modules/chart.js/src/platforms/platform.js","webpack:///./node_modules/chart.js/src/plugins/index.js","webpack:///./node_modules/chart.js/src/plugins/plugin.title.js","webpack:///./node_modules/chart.js/src/scales/scale.linearbase.js","webpack:///./node_modules/chart.js/src/platforms/platform.dom.js","webpack:///./node_modules/chart.js/src/plugins/plugin.filler.js","webpack:///./node_modules/chart.js/src/scales/scale.category.js","webpack:///./node_modules/chart.js/src/scales/scale.radialLinear.js"],"names":["defaults","Element","helpers","layouts","noop","getBoxWidth","labelOpts","fontSize","usePointStyle","Math","SQRT2","boxWidth","_set","legend","display","position","fullWidth","reverse","weight","onClick","e","legendItem","index","datasetIndex","ci","this","chart","meta","getDatasetMeta","hidden","data","datasets","update","onHover","labels","padding","generateLabels","isArray","map","dataset","i","text","label","fillStyle","backgroundColor","isDatasetVisible","lineCap","borderCapStyle","lineDash","borderDash","lineDashOffset","borderDashOffset","lineJoin","borderJoinStyle","lineWidth","borderWidth","strokeStyle","borderColor","pointStyle","legendCallback","push","id","length","join","Legend","extend","initialize","config","legendHitBoxes","doughnutMode","beforeUpdate","maxWidth","maxHeight","margins","me","beforeSetDimensions","setDimensions","afterSetDimensions","beforeBuildLabels","buildLabels","afterBuildLabels","beforeFit","fit","afterFit","afterUpdate","minSize","isHorizontal","width","left","right","height","top","bottom","paddingLeft","paddingTop","paddingRight","paddingBottom","options","legendItems","callback","filter","item","opts","ctx","globalDefault","global","valueOrDefault","defaultFontSize","fontStyle","defaultFontStyle","fontFamily","defaultFontFamily","labelFont","fontString","hitboxes","font","lineWidths","totalHeight","textAlign","textBaseline","each","measureText","vPadding","columnWidths","totalWidth","currentColWidth","currentColHeight","itemHeight","itemWidth","max","draw","lineDefault","elements","line","legendWidth","cursor","fontColor","defaultFontColor","drawLegendBox","x","y","isNaN","save","defaultColor","isLineWidthZero","setLineDash","radius","offSet","centerX","centerY","canvas","drawPoint","strokeRect","fillRect","restore","fillText","textWidth","halfFontSize","xLeft","yMiddle","beginPath","moveTo","lineTo","stroke","handleEvent","type","changed","lh","hitBox","call","native","createNewLegendAndAttach","legendOpts","configure","addBox","module","exports","_element","beforeInit","mergeIf","removeBox","afterEvent","acquireContext","getContext","moment","window","MIN_INTEGER","Number","MIN_SAFE_INTEGER","MAX_INTEGER","MAX_SAFE_INTEGER","INTERVALS","millisecond","common","size","steps","second","minute","hour","day","week","month","quarter","year","UNITS","Object","keys","sorter","a","b","arrayUnique","items","ilen","hash","out","buildLookupTable","timestamps","min","distribution","time","pos","prev","curr","next","table","undefined","round","lookup","key","value","mid","i0","i1","lo","hi","interpolate","skey","sval","tkey","range","span","ratio","offset","momentify","parser","format","isValid","parse","input","scale","isNullOrUndef","getRightValue","startOf","valueOf","determineStepSize","unit","capacity","factor","interval","milliseconds","ceil","determineUnitForAutoTicks","minUnit","indexOf","determineUnitForFormatting","ticks","duration","diff","as","determineMajorUnit","generate","timeOpts","minor","major","stepSize","unitStepSize","weekday","isoWeekday","majorTicksEnabled","enabled","first","last","add","computeOffsets","upper","lower","ticksFromTimestamps","values","majorUnit","determineLabelFormat","momentDate","hasTime","Chart","defaultConfig","bounds","displayFormat","displayFormats","autoSkip","source","TimeScale","Scale","Error","mergeTicksOptions","prototype","console","warn","apply","arguments","rawValue","t","determineDataLimits","j","jlen","timestamp","isObject","slice","sort","endOf","_horizontal","_table","_timestamps","buildTicks","getLabelCapacity","_unit","_majorUnit","_offsets","_labelFormat","getLabelForIndex","tooltipFormat","tickFormatFunction","tick","formatOverride","formats","minorFormat","majorFormat","majorTime","clone","majorTickOpts","tickOpts","formatter","userCallback","convertTicksToLabels","getPixelForOffset","start","getPixelForValue","getPixelForTick","getTicks","getValueForPixel","pixel","getLabelWidth","ticksOpts","tickLabelWidth","angle","toRadians","maxRotation","cosRotation","cos","sinRotation","sin","tickFontSize","exampleTime","exampleLabel","innerWidth","floor","scaleService","registerScaleType","Ticks","formatters","linear","LinearScale","LinearScaleBase","DEFAULT_MIN","DEFAULT_MAX","IDMatches","xAxisID","yAxisID","hasStacks","stacked","stack","valuesPerStack","positiveValues","negativeValues","relativePoints","valuesForType","concat","minVal","maxVal","isFinite","handleTickRangeOptions","getTickLimit","maxTicks","maxTicksLimit","handleDirectionalChanges","rightValue","end","innerDimension","ticksAsNumbers","generateTicks","generationOptions","dataRange","exp","significand","tickVal","pow","log10","endExp","endSignificand","minNotZero","precision","abs","lastTick","logarithmic","LogarithmicScale","tickValues","_getFirstTickValue","sign","firstTickValue","getValueOrDefault","basic","dom","implementation","_enabled","releaseContext","addEventListener","removeEventListener","filler","title","lineHeight","Title","lineCount","toLineHeight","textSize","globalDefaults","titleX","titleY","titleFont","rotation","PI","translate","rotate","createNewTitleBlockAndAttach","titleOpts","titleBlock","spacing","niceRange","niceNum","niceMin","niceMax","almostWhole","numSpaces","almostEquals","toString","beginAtZero","minSign","maxSign","setMin","suggestedMin","setMax","suggestedMax","numericGeneratorOptions","fixedStepSize","zeroLineIndex","EXPANDO_KEY","CSS_PREFIX","CSS_RENDER_MONITOR","CSS_RENDER_ANIMATION","ANIMATION_START_EVENTS","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","readUsedSize","element","property","getStyle","matches","match","initCanvas","style","renderHeight","getAttribute","renderWidth","initial","displayWidth","aspectRatio","displayHeight","supportsEventListenerOptions","supports","defineProperty","get","eventListenerOptions","passive","node","listener","createEvent","nativeEvent","fromNativeEvent","event","getRelativePosition","throttled","fn","thisArg","ticking","args","Array","requestAnimFrame","createResizer","handler","resizer","document","createElement","cls","maxSize","cssText","className","innerHTML","expand","childNodes","shrink","_reset","scrollLeft","scrollTop","onScroll","bind","watchForRender","expando","proxy","renderProxy","animationName","reflow","offsetParent","classList","unwatchForRender","remove","addResizeListener","container","parentNode","insertBefore","firstChild","removeResizeListener","removeChild","injectCSS","platform","css","_style","setAttribute","getElementsByTagName","appendChild","createTextNode","keyframes","getElementById","context","forEach","prop","removeAttribute","proxies","addEvent","removeEvent","plugins","propagate","mappers","fill","visible","points","_children","point","_view","boundary","decodeFill","el","count","target","model","_model","parseFloat","computeBoundary","horizontal","_scale","scaleBottom","scaleTop","scaleZero","getBasePosition","getBasePixel","resolveTarget","sources","visited","createMapper","isDrawable","skip","drawArea","curve0","curve1","len0","len1","doFill","mapper","view","color","loop","p0","p1","d0","d1","spanGaps","closePath","afterDatasetsUpdate","Line","$filler","beforeDatasetDraw","clipArea","chartArea","_loop","unclipArea","DatasetScale","getLabels","xLabels","yLabels","findIndex","minIndex","maxIndex","valueCategory","offsetAmt","idx","valueWidth","widthOffset","valueHeight","heightOffset","_ticks","horz","valueDimension","animate","angleLines","gridLines","circular","showLabelBackdrop","backdropColor","backdropPaddingY","backdropPaddingX","pointLabels","getValueCount","getPointLabelFontOptions","pointLabelOptions","family","measureLabelSize","w","longestText","h","determineLimits","fitWithPointLabels","pointPosition","plFont","largestPossibleRadius","furthestLimits","r","l","furthestAngles","_pointLabelSizes","valueCount","getPointPosition","angleRadians","getIndexAngle","toDegrees","hLimits","vLimits","setReductions","drawingArea","setCenterPoint","getTextAlignForAngle","adjustPointPositionForLabelHeight","drawPointLabels","angleLineOpts","pointLabelOpts","outerDistance","getDistanceFromCenterForValue","outerPosition","xCenter","yCenter","pointLabelPosition","pointLabelFontColor","valueAtIndexOrDefault","drawRadiusLine","gridLineOpts","arc","numberOrZero","param","isNumber","LinearRadialScale","POSITIVE_INFINITY","NEGATIVE_INFINITY","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","angleMultiplier","startAngle","startAngleRadians","scalingFactor","distanceFromCenter","thisAngle","getPointPositionForValue","tickFontStyle","tickFontFamily","tickLabelFont","yCenterOffset","tickFontColor","labelWidth"],"mappings":"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","file":"js/chunk-vendors~1141f9d8.1a1989d9.js","sourcesContent":["'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar Element = require('../core/core.element');\nvar helpers = require('../helpers/index');\nvar layouts = require('../core/core.layouts');\n\nvar noop = helpers.noop;\n\ndefaults._set('global', {\n\tlegend: {\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true,\n\t\treverse: false,\n\t\tweight: 1000,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t},\n\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('');\n\t\treturn text.join('');\n\t}\n});\n\n/**\n * Helper function to get the box width based on the usePointStyle option\n * @param labelopts {Object} the label options on the legend\n * @param fontSize {Number} the label font size\n * @return {Number} width of the color box area\n */\nfunction getBoxWidth(labelOpts, fontSize) {\n\treturn labelOpts.usePointStyle ?\n\t\tfontSize * Math.SQRT2 :\n\t\tlabelOpts.boxWidth;\n}\n\n/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\nvar Legend = Element.extend({\n\n\tinitialize: function(config) {\n\t\thelpers.extend(this, config);\n\n\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\tthis.legendHitBoxes = [];\n\n\t\t// Are we in doughnut mode which has a different data type\n\t\tthis.doughnutMode = false;\n\t},\n\n\t// These methods are ordered by lifecycle. Utilities then follow.\n\t// Any function defined here is inherited by all legend types.\n\t// Any function can be extended by the legend type\n\n\tbeforeUpdate: noop,\n\tupdate: function(maxWidth, maxHeight, margins) {\n\t\tvar me = this;\n\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\tme.beforeUpdate();\n\n\t\t// Absorb the master measurements\n\t\tme.maxWidth = maxWidth;\n\t\tme.maxHeight = maxHeight;\n\t\tme.margins = margins;\n\n\t\t// Dimensions\n\t\tme.beforeSetDimensions();\n\t\tme.setDimensions();\n\t\tme.afterSetDimensions();\n\t\t// Labels\n\t\tme.beforeBuildLabels();\n\t\tme.buildLabels();\n\t\tme.afterBuildLabels();\n\n\t\t// Fit\n\t\tme.beforeFit();\n\t\tme.fit();\n\t\tme.afterFit();\n\t\t//\n\t\tme.afterUpdate();\n\n\t\treturn me.minSize;\n\t},\n\tafterUpdate: noop,\n\n\t//\n\n\tbeforeSetDimensions: noop,\n\tsetDimensions: function() {\n\t\tvar me = this;\n\t\t// Set the unconstrained dimension before label rotation\n\t\tif (me.isHorizontal()) {\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.left = 0;\n\t\t\tme.right = me.width;\n\t\t} else {\n\t\t\tme.height = me.maxHeight;\n\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.top = 0;\n\t\t\tme.bottom = me.height;\n\t\t}\n\n\t\t// Reset padding\n\t\tme.paddingLeft = 0;\n\t\tme.paddingTop = 0;\n\t\tme.paddingRight = 0;\n\t\tme.paddingBottom = 0;\n\n\t\t// Reset minSize\n\t\tme.minSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t},\n\tafterSetDimensions: noop,\n\n\t//\n\n\tbeforeBuildLabels: noop,\n\tbuildLabels: function() {\n\t\tvar me = this;\n\t\tvar labelOpts = me.options.labels || {};\n\t\tvar legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n\t\tif (labelOpts.filter) {\n\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t});\n\t\t}\n\n\t\tif (me.options.reverse) {\n\t\t\tlegendItems.reverse();\n\t\t}\n\n\t\tme.legendItems = legendItems;\n\t},\n\tafterBuildLabels: noop,\n\n\t//\n\n\tbeforeFit: noop,\n\tfit: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar labelOpts = opts.labels;\n\t\tvar display = opts.display;\n\n\t\tvar ctx = me.ctx;\n\n\t\tvar globalDefault = defaults.global;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t// Reset hit boxes\n\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\tvar minSize = me.minSize;\n\t\tvar isHorizontal = me.isHorizontal();\n\n\t\tif (isHorizontal) {\n\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\tminSize.height = display ? 10 : 0;\n\t\t} else {\n\t\t\tminSize.width = display ? 10 : 0;\n\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t}\n\n\t\t// Increase sizes here\n\t\tif (display) {\n\t\t\tctx.font = labelFont;\n\n\t\t\tif (isHorizontal) {\n\t\t\t\t// Labels\n\n\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\ttotalHeight += fontSize + (labelOpts.padding);\n\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t};\n\n\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t});\n\n\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t} else {\n\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\tvar currentColWidth = 0;\n\t\t\t\tvar currentColHeight = 0;\n\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get max width\n\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\tminSize.width += totalWidth;\n\t\t\t}\n\t\t}\n\n\t\tme.width = minSize.width;\n\t\tme.height = minSize.height;\n\t},\n\tafterFit: noop,\n\n\t// Shared Methods\n\tisHorizontal: function() {\n\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t},\n\n\t// Actually draw the legend on the canvas\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar labelOpts = opts.labels;\n\t\tvar globalDefault = defaults.global;\n\t\tvar lineDefault = globalDefault.elements.line;\n\t\tvar legendWidth = me.width;\n\t\tvar lineWidths = me.lineWidths;\n\n\t\tif (opts.display) {\n\t\t\tvar ctx = me.ctx;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\tvar cursor;\n\n\t\t\t// Canvas setup\n\t\t\tctx.textAlign = 'left';\n\t\t\tctx.textBaseline = 'middle';\n\t\t\tctx.lineWidth = 0.5;\n\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\tctx.font = labelFont;\n\n\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\tvar hitboxes = me.legendHitBoxes;\n\n\t\t\t// current position\n\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Set the ctx for the box\n\t\t\t\tctx.save();\n\n\t\t\t\tctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\tctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\tctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\tctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\tctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\tctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\tvar isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\tctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t}\n\n\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\thelpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t} else {\n\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t}\n\n\t\t\t\tctx.restore();\n\t\t\t};\n\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\tvar halfFontSize = fontSize / 2;\n\t\t\t\tvar xLeft = boxWidth + halfFontSize + x;\n\t\t\t\tvar yMiddle = y + halfFontSize;\n\n\t\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\n\n\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\tctx.moveTo(xLeft, yMiddle);\n\t\t\t\t\tctx.lineTo(xLeft + textWidth, yMiddle);\n\t\t\t\t\tctx.stroke();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Horizontal\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tif (isHorizontal) {\n\t\t\t\tcursor = {\n\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2),\n\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\tline: 0\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tcursor = {\n\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\tline: 0\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\n\t\t\t\tvar width = boxWidth + (fontSize / 2) + textWidth;\n\t\t\t\tvar x = cursor.x;\n\t\t\t\tvar y = cursor.y;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n\t\t\t\t\t}\n\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\tcursor.line++;\n\t\t\t\t}\n\n\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\thitboxes[i].left = x;\n\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t// Fill the actual label\n\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor.x += width + (labelOpts.padding);\n\t\t\t\t} else {\n\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t}\n\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Handle an event\n\t * @private\n\t * @param {IEvent} event - The event to handle\n\t * @return {Boolean} true if a change occured\n\t */\n\thandleEvent: function(e) {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\tvar changed = false;\n\n\t\tif (type === 'mousemove') {\n\t\t\tif (!opts.onHover) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (type === 'click') {\n\t\t\tif (!opts.onClick) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\t// Chart event already has relative position in it\n\t\tvar x = e.x;\n\t\tvar y = e.y;\n\n\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t// See if we are touching one of the dataset boxes\n\t\t\tvar lh = me.legendHitBoxes;\n\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t// Touching an element\n\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changed;\n\t}\n});\n\nfunction createNewLegendAndAttach(chart, legendOpts) {\n\tvar legend = new Legend({\n\t\tctx: chart.ctx,\n\t\toptions: legendOpts,\n\t\tchart: chart\n\t});\n\n\tlayouts.configure(chart, legend, legendOpts);\n\tlayouts.addBox(chart, legend);\n\tchart.legend = legend;\n}\n\nmodule.exports = {\n\tid: 'legend',\n\n\t/**\n\t * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\n\t * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\n\t * the plugin, which one will be re-exposed in the chart.js file.\n\t * https://github.com/chartjs/Chart.js/pull/2640\n\t * @private\n\t */\n\t_element: Legend,\n\n\tbeforeInit: function(chart) {\n\t\tvar legendOpts = chart.options.legend;\n\n\t\tif (legendOpts) {\n\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t}\n\t},\n\n\tbeforeUpdate: function(chart) {\n\t\tvar legendOpts = chart.options.legend;\n\t\tvar legend = chart.legend;\n\n\t\tif (legendOpts) {\n\t\t\thelpers.mergeIf(legendOpts, defaults.global.legend);\n\n\t\t\tif (legend) {\n\t\t\t\tlayouts.configure(chart, legend, legendOpts);\n\t\t\t\tlegend.options = legendOpts;\n\t\t\t} else {\n\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t}\n\t\t} else if (legend) {\n\t\t\tlayouts.removeBox(chart, legend);\n\t\t\tdelete chart.legend;\n\t\t}\n\t},\n\n\tafterEvent: function(chart, e) {\n\t\tvar legend = chart.legend;\n\t\tif (legend) {\n\t\t\tlegend.handleEvent(e);\n\t\t}\n\t}\n};\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nmodule.exports = {\n\tacquireContext: function(item) {\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\treturn item && item.getContext('2d') || null;\n\t}\n};\n","/* global window: false */\n'use strict';\n\nvar moment = require('moment');\nmoment = typeof moment === 'function' ? moment : window.moment;\n\nvar defaults = require('../core/core.defaults');\nvar helpers = require('../helpers/index');\n\n// Integer constants are from the ES6 spec.\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\nvar INTERVALS = {\n\tmillisecond: {\n\t\tcommon: true,\n\t\tsize: 1,\n\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t},\n\tsecond: {\n\t\tcommon: true,\n\t\tsize: 1000,\n\t\tsteps: [1, 2, 5, 10, 30]\n\t},\n\tminute: {\n\t\tcommon: true,\n\t\tsize: 60000,\n\t\tsteps: [1, 2, 5, 10, 30]\n\t},\n\thour: {\n\t\tcommon: true,\n\t\tsize: 3600000,\n\t\tsteps: [1, 2, 3, 6, 12]\n\t},\n\tday: {\n\t\tcommon: true,\n\t\tsize: 86400000,\n\t\tsteps: [1, 2, 5]\n\t},\n\tweek: {\n\t\tcommon: false,\n\t\tsize: 604800000,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tmonth: {\n\t\tcommon: true,\n\t\tsize: 2.628e9,\n\t\tsteps: [1, 2, 3]\n\t},\n\tquarter: {\n\t\tcommon: false,\n\t\tsize: 7.884e9,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tyear: {\n\t\tcommon: true,\n\t\tsize: 3.154e10\n\t}\n};\n\nvar UNITS = Object.keys(INTERVALS);\n\nfunction sorter(a, b) {\n\treturn a - b;\n}\n\nfunction arrayUnique(items) {\n\tvar hash = {};\n\tvar out = [];\n\tvar i, ilen, item;\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\titem = items[i];\n\t\tif (!hash[item]) {\n\t\t\thash[item] = true;\n\t\t\tout.push(item);\n\t\t}\n\t}\n\n\treturn out;\n}\n\n/**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\nfunction buildLookupTable(timestamps, min, max, distribution) {\n\tif (distribution === 'linear' || !timestamps.length) {\n\t\treturn [\n\t\t\t{time: min, pos: 0},\n\t\t\t{time: max, pos: 1}\n\t\t];\n\t}\n\n\tvar table = [];\n\tvar items = [min];\n\tvar i, ilen, prev, curr, next;\n\n\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\tcurr = timestamps[i];\n\t\tif (curr > min && curr < max) {\n\t\t\titems.push(curr);\n\t\t}\n\t}\n\n\titems.push(max);\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\tnext = items[i + 1];\n\t\tprev = items[i - 1];\n\t\tcurr = items[i];\n\n\t\t// only add points that breaks the scale linearity\n\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n\t\t\ttable.push({time: curr, pos: i / (ilen - 1)});\n\t\t}\n\t}\n\n\treturn table;\n}\n\n// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\nfunction lookup(table, key, value) {\n\tvar lo = 0;\n\tvar hi = table.length - 1;\n\tvar mid, i0, i1;\n\n\twhile (lo >= 0 && lo <= hi) {\n\t\tmid = (lo + hi) >> 1;\n\t\ti0 = table[mid - 1] || null;\n\t\ti1 = table[mid];\n\n\t\tif (!i0) {\n\t\t\t// given value is outside table (before first item)\n\t\t\treturn {lo: null, hi: i1};\n\t\t} else if (i1[key] < value) {\n\t\t\tlo = mid + 1;\n\t\t} else if (i0[key] > value) {\n\t\t\thi = mid - 1;\n\t\t} else {\n\t\t\treturn {lo: i0, hi: i1};\n\t\t}\n\t}\n\n\t// given value is outside table (after last item)\n\treturn {lo: i1, hi: null};\n}\n\n/**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\nfunction interpolate(table, skey, sval, tkey) {\n\tvar range = lookup(table, skey, sval);\n\n\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n\tvar span = next[skey] - prev[skey];\n\tvar ratio = span ? (sval - prev[skey]) / span : 0;\n\tvar offset = (next[tkey] - prev[tkey]) * ratio;\n\n\treturn prev[tkey] + offset;\n}\n\n/**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\nfunction momentify(value, options) {\n\tvar parser = options.parser;\n\tvar format = options.parser || options.format;\n\n\tif (typeof parser === 'function') {\n\t\treturn parser(value);\n\t}\n\n\tif (typeof value === 'string' && typeof format === 'string') {\n\t\treturn moment(value, format);\n\t}\n\n\tif (!(value instanceof moment)) {\n\t\tvalue = moment(value);\n\t}\n\n\tif (value.isValid()) {\n\t\treturn value;\n\t}\n\n\t// Labels are in an incompatible moment format and no `parser` has been provided.\n\t// The user might still use the deprecated `format` option to convert his inputs.\n\tif (typeof format === 'function') {\n\t\treturn format(value);\n\t}\n\n\treturn value;\n}\n\nfunction parse(input, scale) {\n\tif (helpers.isNullOrUndef(input)) {\n\t\treturn null;\n\t}\n\n\tvar options = scale.options.time;\n\tvar value = momentify(scale.getRightValue(input), options);\n\tif (!value.isValid()) {\n\t\treturn null;\n\t}\n\n\tif (options.round) {\n\t\tvalue.startOf(options.round);\n\t}\n\n\treturn value.valueOf();\n}\n\n/**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\nfunction determineStepSize(min, max, unit, capacity) {\n\tvar range = max - min;\n\tvar interval = INTERVALS[unit];\n\tvar milliseconds = interval.size;\n\tvar steps = interval.steps;\n\tvar i, ilen, factor;\n\n\tif (!steps) {\n\t\treturn Math.ceil(range / (capacity * milliseconds));\n\t}\n\n\tfor (i = 0, ilen = steps.length; i < ilen; ++i) {\n\t\tfactor = steps[i];\n\t\tif (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn factor;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n\tvar ilen = UNITS.length;\n\tvar i, interval, factor;\n\n\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n\t\tinterval = INTERVALS[UNITS[i]];\n\t\tfactor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n\n\treturn UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n */\nfunction determineUnitForFormatting(ticks, minUnit, min, max) {\n\tvar duration = moment.duration(moment(max).diff(moment(min)));\n\tvar ilen = UNITS.length;\n\tvar i, unit;\n\n\tfor (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n\t\tunit = UNITS[i];\n\t\tif (INTERVALS[unit].common && duration.as(unit) >= ticks.length) {\n\t\t\treturn unit;\n\t\t}\n\t}\n\n\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\nfunction determineMajorUnit(unit) {\n\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n\t\tif (INTERVALS[UNITS[i]].common) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n}\n\n/**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\nfunction generate(min, max, capacity, options) {\n\tvar timeOpts = options.time;\n\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n\tvar major = determineMajorUnit(minor);\n\tvar stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n\tvar majorTicksEnabled = options.ticks.major.enabled;\n\tvar interval = INTERVALS[minor];\n\tvar first = moment(min);\n\tvar last = moment(max);\n\tvar ticks = [];\n\tvar time;\n\n\tif (!stepSize) {\n\t\tstepSize = determineStepSize(min, max, minor, capacity);\n\t}\n\n\t// For 'week' unit, handle the first day of week option\n\tif (weekday) {\n\t\tfirst = first.isoWeekday(weekday);\n\t\tlast = last.isoWeekday(weekday);\n\t}\n\n\t// Align first/last ticks on unit\n\tfirst = first.startOf(weekday ? 'day' : minor);\n\tlast = last.startOf(weekday ? 'day' : minor);\n\n\t// Make sure that the last tick include max\n\tif (last < max) {\n\t\tlast.add(1, minor);\n\t}\n\n\ttime = moment(first);\n\n\tif (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n\t\t// Align the first tick on the previous `minor` unit aligned on the `major` unit:\n\t\t// we first aligned time on the previous `major` unit then add the number of full\n\t\t// stepSize there is between first and the previous major time.\n\t\ttime.startOf(major);\n\t\ttime.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n\t}\n\n\tfor (; time < last; time.add(stepSize, minor)) {\n\t\tticks.push(+time);\n\t}\n\n\tticks.push(+time);\n\n\treturn ticks;\n}\n\n/**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\nfunction computeOffsets(table, ticks, min, max, options) {\n\tvar left = 0;\n\tvar right = 0;\n\tvar upper, lower;\n\n\tif (options.offset && ticks.length) {\n\t\tif (!options.time.min) {\n\t\t\tupper = ticks.length > 1 ? ticks[1] : max;\n\t\t\tlower = ticks[0];\n\t\t\tleft = (\n\t\t\t\tinterpolate(table, 'time', upper, 'pos') -\n\t\t\t\tinterpolate(table, 'time', lower, 'pos')\n\t\t\t) / 2;\n\t\t}\n\t\tif (!options.time.max) {\n\t\t\tupper = ticks[ticks.length - 1];\n\t\t\tlower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n\t\t\tright = (\n\t\t\t\tinterpolate(table, 'time', upper, 'pos') -\n\t\t\t\tinterpolate(table, 'time', lower, 'pos')\n\t\t\t) / 2;\n\t\t}\n\t}\n\n\treturn {left: left, right: right};\n}\n\nfunction ticksFromTimestamps(values, majorUnit) {\n\tvar ticks = [];\n\tvar i, ilen, value, major;\n\n\tfor (i = 0, ilen = values.length; i < ilen; ++i) {\n\t\tvalue = values[i];\n\t\tmajor = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n\t\tticks.push({\n\t\t\tvalue: value,\n\t\t\tmajor: major\n\t\t});\n\t}\n\n\treturn ticks;\n}\n\nfunction determineLabelFormat(data, timeOpts) {\n\tvar i, momentDate, hasTime;\n\tvar ilen = data.length;\n\n\t// find the label with the most parts (milliseconds, minutes, etc.)\n\t// format all labels with the same level of detail as the most specific label\n\tfor (i = 0; i < ilen; i++) {\n\t\tmomentDate = momentify(data[i], timeOpts);\n\t\tif (momentDate.millisecond() !== 0) {\n\t\t\treturn 'MMM D, YYYY h:mm:ss.SSS a';\n\t\t}\n\t\tif (momentDate.second() !== 0 || momentDate.minute() !== 0 || momentDate.hour() !== 0) {\n\t\t\thasTime = true;\n\t\t}\n\t}\n\tif (hasTime) {\n\t\treturn 'MMM D, YYYY h:mm:ss a';\n\t}\n\treturn 'MMM D, YYYY';\n}\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'bottom',\n\n\t\t/**\n\t\t * Data distribution along the scale:\n\t\t * - 'linear': data are spread according to their time (distances can vary),\n\t\t * - 'series': data are spread at the same distance from each other.\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t * @since 2.7.0\n\t\t */\n\t\tdistribution: 'linear',\n\n\t\t/**\n\t\t * Scale boundary strategy (bypassed by min/max time options)\n\t\t * - `data`: make sure data are fully visible, ticks outside are removed\n\t\t * - `ticks`: make sure ticks are fully visible, data outside are truncated\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4556\n\t\t * @since 2.7.0\n\t\t */\n\t\tbounds: 'data',\n\n\t\ttime: {\n\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\tminUnit: 'millisecond',\n\n\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\tdisplayFormats: {\n\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\tminute: 'h:mm a', // 11:20 AM\n\t\t\t\thour: 'hA', // 5PM\n\t\t\t\tday: 'MMM D', // Sep 4\n\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t},\n\t\t},\n\t\tticks: {\n\t\t\tautoSkip: false,\n\n\t\t\t/**\n\t\t\t * Ticks generation input values:\n\t\t\t * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n\t\t\t * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n\t\t\t * - 'labels': generates ticks from user given `data.labels` values ONLY.\n\t\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t\t * @since 2.7.0\n\t\t\t */\n\t\t\tsource: 'auto',\n\n\t\t\tmajor: {\n\t\t\t\tenabled: false\n\t\t\t}\n\t\t}\n\t};\n\n\tvar TimeScale = Chart.Scale.extend({\n\t\tinitialize: function() {\n\t\t\tif (!moment) {\n\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t}\n\n\t\t\tthis.mergeTicksOptions();\n\n\t\t\tChart.Scale.prototype.initialize.call(this);\n\t\t},\n\n\t\tupdate: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\n\t\t\t// DEPRECATIONS: output a message only one time per update\n\t\t\tif (options.time && options.time.format) {\n\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t\t}\n\n\t\t\treturn Chart.Scale.prototype.update.apply(me, arguments);\n\t\t},\n\n\t\t/**\n\t\t * Allows data to be referenced via 't' attribute\n\t\t */\n\t\tgetRightValue: function(rawValue) {\n\t\t\tif (rawValue && rawValue.t !== undefined) {\n\t\t\t\trawValue = rawValue.t;\n\t\t\t}\n\t\t\treturn Chart.Scale.prototype.getRightValue.call(this, rawValue);\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar timeOpts = me.options.time;\n\t\t\tvar unit = timeOpts.unit || 'day';\n\t\t\tvar min = MAX_INTEGER;\n\t\t\tvar max = MIN_INTEGER;\n\t\t\tvar timestamps = [];\n\t\t\tvar datasets = [];\n\t\t\tvar labels = [];\n\t\t\tvar i, j, ilen, jlen, data, timestamp;\n\n\t\t\t// Convert labels to timestamps\n\t\t\tfor (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n\t\t\t\tlabels.push(parse(chart.data.labels[i], me));\n\t\t\t}\n\n\t\t\t// Convert data to timestamps\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\tdata = chart.data.datasets[i].data;\n\n\t\t\t\t\t// Let's consider that all data have the same format.\n\t\t\t\t\tif (helpers.isObject(data[0])) {\n\t\t\t\t\t\tdatasets[i] = [];\n\n\t\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\n\t\t\t\t\t\t\ttimestamp = parse(data[j], me);\n\t\t\t\t\t\t\ttimestamps.push(timestamp);\n\t\t\t\t\t\t\tdatasets[i][j] = timestamp;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimestamps.push.apply(timestamps, labels);\n\t\t\t\t\t\tdatasets[i] = labels.slice(0);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdatasets[i] = [];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (labels.length) {\n\t\t\t\t// Sort labels **after** data have been converted\n\t\t\t\tlabels = arrayUnique(labels).sort(sorter);\n\t\t\t\tmin = Math.min(min, labels[0]);\n\t\t\t\tmax = Math.max(max, labels[labels.length - 1]);\n\t\t\t}\n\n\t\t\tif (timestamps.length) {\n\t\t\t\ttimestamps = arrayUnique(timestamps).sort(sorter);\n\t\t\t\tmin = Math.min(min, timestamps[0]);\n\t\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\n\t\t\t}\n\n\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t// In case there is no valid min/max, set limits based on unit time option\n\t\t\tmin = min === MAX_INTEGER ? +moment().startOf(unit) : min;\n\t\t\tmax = max === MIN_INTEGER ? +moment().endOf(unit) + 1 : max;\n\n\t\t\t// Make sure that max is strictly higher than min (required by the lookup table)\n\t\t\tme.min = Math.min(min, max);\n\t\t\tme.max = Math.max(min + 1, max);\n\n\t\t\t// PRIVATE\n\t\t\tme._horizontal = me.isHorizontal();\n\t\t\tme._table = [];\n\t\t\tme._timestamps = {\n\t\t\t\tdata: timestamps,\n\t\t\t\tdatasets: datasets,\n\t\t\t\tlabels: labels\n\t\t\t};\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\t\t\tvar options = me.options;\n\t\t\tvar timeOpts = options.time;\n\t\t\tvar timestamps = [];\n\t\t\tvar ticks = [];\n\t\t\tvar i, ilen, timestamp;\n\n\t\t\tswitch (options.ticks.source) {\n\t\t\tcase 'data':\n\t\t\t\ttimestamps = me._timestamps.data;\n\t\t\t\tbreak;\n\t\t\tcase 'labels':\n\t\t\t\ttimestamps = me._timestamps.labels;\n\t\t\t\tbreak;\n\t\t\tcase 'auto':\n\t\t\tdefault:\n\t\t\t\ttimestamps = generate(min, max, me.getLabelCapacity(min), options);\n\t\t\t}\n\n\t\t\tif (options.bounds === 'ticks' && timestamps.length) {\n\t\t\t\tmin = timestamps[0];\n\t\t\t\tmax = timestamps[timestamps.length - 1];\n\t\t\t}\n\n\t\t\t// Enforce limits with user min/max options\n\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t// Remove ticks outside the min/max range\n\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\ttimestamp = timestamps[i];\n\t\t\t\tif (timestamp >= min && timestamp <= max) {\n\t\t\t\t\tticks.push(timestamp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.min = min;\n\t\t\tme.max = max;\n\n\t\t\t// PRIVATE\n\t\t\tme._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max);\n\t\t\tme._majorUnit = determineMajorUnit(me._unit);\n\t\t\tme._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n\t\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\n\t\t\tme._labelFormat = determineLabelFormat(me._timestamps.data, timeOpts);\n\n\t\t\treturn ticksFromTimestamps(ticks, me._majorUnit);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar timeOpts = me.options.time;\n\t\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\n\t\t\tvar value = data.datasets[datasetIndex].data[index];\n\n\t\t\tif (helpers.isObject(value)) {\n\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t}\n\t\t\tif (timeOpts.tooltipFormat) {\n\t\t\t\treturn momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n\t\t\t}\n\t\t\tif (typeof label === 'string') {\n\t\t\t\treturn label;\n\t\t\t}\n\n\t\t\treturn momentify(label, timeOpts).format(me._labelFormat);\n\t\t},\n\n\t\t/**\n\t\t * Function to format an individual tick mark\n\t\t * @private\n\t\t */\n\t\ttickFormatFunction: function(tick, index, ticks, formatOverride) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar time = tick.valueOf();\n\t\t\tvar formats = options.time.displayFormats;\n\t\t\tvar minorFormat = formats[me._unit];\n\t\t\tvar majorUnit = me._majorUnit;\n\t\t\tvar majorFormat = formats[majorUnit];\n\t\t\tvar majorTime = tick.clone().startOf(majorUnit).valueOf();\n\t\t\tvar majorTickOpts = options.ticks.major;\n\t\t\tvar major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n\t\t\tvar label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat);\n\t\t\tvar tickOpts = major ? majorTickOpts : options.ticks.minor;\n\t\t\tvar formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\treturn formatter ? formatter(label, index, ticks) : label;\n\t\t},\n\n\t\tconvertTicksToLabels: function(ticks) {\n\t\t\tvar labels = [];\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\tlabels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n\t\t\t}\n\n\t\t\treturn labels;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetPixelForOffset: function(time) {\n\t\t\tvar me = this;\n\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\tvar pos = interpolate(me._table, 'time', time, 'pos');\n\n\t\t\treturn start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n\t\t},\n\n\t\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar time = null;\n\n\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\n\t\t\t}\n\n\t\t\tif (time === null) {\n\t\t\t\ttime = parse(value, me);\n\t\t\t}\n\n\t\t\tif (time !== null) {\n\t\t\t\treturn me.getPixelForOffset(time);\n\t\t\t}\n\t\t},\n\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar ticks = this.getTicks();\n\t\t\treturn index >= 0 && index < ticks.length ?\n\t\t\t\tthis.getPixelForOffset(ticks[index].value) :\n\t\t\t\tnull;\n\t\t},\n\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\tvar pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n\t\t\tvar time = interpolate(me._table, 'pos', pos, 'time');\n\n\t\t\treturn moment(time);\n\t\t},\n\n\t\t/**\n\t\t * Crude approximation of what the label width might be\n\t\t * @private\n\t\t */\n\t\tgetLabelWidth: function(label) {\n\t\t\tvar me = this;\n\t\t\tvar ticksOpts = me.options.ticks;\n\t\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\t\tvar angle = helpers.toRadians(ticksOpts.maxRotation);\n\t\t\tvar cosRotation = Math.cos(angle);\n\t\t\tvar sinRotation = Math.sin(angle);\n\t\t\tvar tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n\t\t\treturn (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetLabelCapacity: function(exampleTime) {\n\t\t\tvar me = this;\n\n\t\t\tvar formatOverride = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\n\t\t\tvar exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride);\n\t\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\tvar capacity = Math.floor(innerWidth / tickLabelWidth);\n\t\t\treturn capacity > 0 ? capacity : 1;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar helpers = require('../helpers/index');\nvar Ticks = require('../core/core.ticks');\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\t\tticks: {\n\t\t\tcallback: Ticks.formatters.linear\n\t\t}\n\t};\n\n\tvar LinearScale = Chart.LinearScaleBase.extend({\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar DEFAULT_MIN = 0;\n\t\t\tvar DEFAULT_MAX = 1;\n\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// First Calculate the range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store these per type\n\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n\t\t\tme.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar maxTicks;\n\t\t\tvar me = this;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t} else {\n\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t}\n\n\t\t\treturn maxTicks;\n\t\t},\n\t\t// Called after the ticks are built. We need\n\t\thandleDirectionalChanges: function() {\n\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tthis.ticks.reverse();\n\t\t\t}\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\t// Utils\n\t\tgetPixelForValue: function(value) {\n\t\t\t// This must be called after fit has been run so that\n\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\n\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\tvar pixel;\n\t\t\tvar range = me.end - start;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t\t} else {\n\t\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\treturn me.start + ((me.end - me.start) * offset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\nvar Ticks = require('../core/core.ticks');\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {Array} array of tick values\n */\nfunction generateTicks(generationOptions, dataRange) {\n\tvar ticks = [];\n\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t// Figure out what the max number of ticks we can support it is based on the size of\n\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t// the graph\n\tvar tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\tvar exp, significand;\n\n\tif (tickVal === 0) {\n\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\tticks.push(tickVal);\n\t\ttickVal = significand * Math.pow(10, exp);\n\t} else {\n\t\texp = Math.floor(helpers.log10(tickVal));\n\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t}\n\tvar precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n\n\tdo {\n\t\tticks.push(tickVal);\n\n\t\t++significand;\n\t\tif (significand === 10) {\n\t\t\tsignificand = 1;\n\t\t\t++exp;\n\t\t\tprecision = exp >= 0 ? 1 : precision;\n\t\t}\n\n\t\ttickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\tvar lastTick = valueOrDefault(generationOptions.max, tickVal);\n\tticks.push(lastTick);\n\n\treturn ticks;\n}\n\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tcallback: Ticks.formatters.logarithmic\n\t\t}\n\t};\n\n\tvar LogarithmicScale = Chart.Scale.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// Calculate Range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\t\t\tme.minNotZero = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tif (valuesForType.length > 0) {\n\t\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar DEFAULT_MIN = 1;\n\t\t\tvar DEFAULT_MAX = 10;\n\n\t\t\tme.min = valueOrDefault(tickOpts.min, me.min);\n\t\t\tme.max = valueOrDefault(tickOpts.max, me.max);\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tme.min = DEFAULT_MIN;\n\t\t\t\t\tme.max = DEFAULT_MAX;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (me.min === null) {\n\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.max)) - 1);\n\t\t\t}\n\t\t\tif (me.max === null) {\n\t\t\t\tme.max = me.min !== 0\n\t\t\t\t\t? Math.pow(10, Math.floor(helpers.log10(me.min)) + 1)\n\t\t\t\t\t: DEFAULT_MAX;\n\t\t\t}\n\t\t\tif (me.minNotZero === null) {\n\t\t\t\tif (me.min > 0) {\n\t\t\t\t\tme.minNotZero = me.min;\n\t\t\t\t} else if (me.max < 1) {\n\t\t\t\t\tme.minNotZero = Math.pow(10, Math.floor(helpers.log10(me.max)));\n\t\t\t\t} else {\n\t\t\t\t\tme.minNotZero = DEFAULT_MIN;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar reverse = !me.isHorizontal();\n\n\t\t\tvar generationOptions = {\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max\n\t\t\t};\n\t\t\tvar ticks = me.ticks = generateTicks(generationOptions, me);\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\treverse = !reverse;\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t\tif (reverse) {\n\t\t\t\tticks.reverse();\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(this);\n\t\t},\n\t\t// Get the correct tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t},\n\t\t/**\n\t\t * Returns the value of the first tick.\n\t\t * @param {Number} value - The minimum not zero value.\n\t\t * @return {Number} The first tick value.\n\t\t * @private\n\t\t */\n\t\t_getFirstTickValue: function(value) {\n\t\t\tvar exp = Math.floor(helpers.log10(value));\n\t\t\tvar significand = Math.floor(value / Math.pow(10, exp));\n\n\t\t\treturn significand * Math.pow(10, exp);\n\t\t},\n\t\tgetPixelForValue: function(value) {\n\t\t\tvar me = this;\n\t\t\tvar reverse = me.options.ticks.reverse;\n\t\t\tvar log10 = helpers.log10;\n\t\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\t\tvar offset = 0;\n\t\t\tvar innerDimension, pixel, start, end, sign;\n\n\t\t\tvalue = +me.getRightValue(value);\n\t\t\tif (reverse) {\n\t\t\t\tstart = me.end;\n\t\t\t\tend = me.start;\n\t\t\t\tsign = -1;\n\t\t\t} else {\n\t\t\t\tstart = me.start;\n\t\t\t\tend = me.end;\n\t\t\t\tsign = 1;\n\t\t\t}\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tpixel = reverse ? me.right : me.left;\n\t\t\t} else {\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tsign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)\n\t\t\t\tpixel = reverse ? me.top : me.bottom;\n\t\t\t}\n\t\t\tif (value !== start) {\n\t\t\t\tif (start === 0) { // include zero tick\n\t\t\t\t\toffset = helpers.getValueOrDefault(\n\t\t\t\t\t\tme.options.ticks.fontSize,\n\t\t\t\t\t\tChart.defaults.global.defaultFontSize\n\t\t\t\t\t);\n\t\t\t\t\tinnerDimension -= offset;\n\t\t\t\t\tstart = firstTickValue;\n\t\t\t\t}\n\t\t\t\tif (value !== 0) {\n\t\t\t\t\toffset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));\n\t\t\t\t}\n\t\t\t\tpixel += sign * offset;\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar reverse = me.options.ticks.reverse;\n\t\t\tvar log10 = helpers.log10;\n\t\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\t\tvar innerDimension, start, end, value;\n\n\t\t\tif (reverse) {\n\t\t\t\tstart = me.end;\n\t\t\t\tend = me.start;\n\t\t\t} else {\n\t\t\t\tstart = me.start;\n\t\t\t\tend = me.end;\n\t\t\t}\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tvalue = reverse ? me.right - pixel : pixel - me.left;\n\t\t\t} else {\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tvalue = reverse ? pixel - me.top : me.bottom - pixel;\n\t\t\t}\n\t\t\tif (value !== start) {\n\t\t\t\tif (start === 0) { // include zero tick\n\t\t\t\t\tvar offset = helpers.getValueOrDefault(\n\t\t\t\t\t\tme.options.ticks.fontSize,\n\t\t\t\t\t\tChart.defaults.global.defaultFontSize\n\t\t\t\t\t);\n\t\t\t\t\tvalue -= offset;\n\t\t\t\t\tinnerDimension -= offset;\n\t\t\t\t\tstart = firstTickValue;\n\t\t\t\t}\n\t\t\t\tvalue *= log10(end) - log10(start);\n\t\t\t\tvalue /= innerDimension;\n\t\t\t\tvalue = Math.pow(10, log10(start) + value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\nvar basic = require('./platform.basic');\nvar dom = require('./platform.dom');\n\n// @TODO Make possible to select another platform at build time.\nvar implementation = dom._enabled ? dom : basic;\n\n/**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\nmodule.exports = helpers.extend({\n\t/**\n\t * @since 2.7.0\n\t */\n\tinitialize: function() {},\n\n\t/**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t * @param {Object} options - The chart options\n\t * @returns {CanvasRenderingContext2D} context2d instance\n\t */\n\tacquireContext: function() {},\n\n\t/**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {Boolean} true if the method succeeded, else false\n\t */\n\treleaseContext: function() {},\n\n\t/**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {String} type - The ({@link IEvent}) type to listen for\n\t * @param {Function} listener - Receives a notification (an object that implements\n\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t */\n\taddEventListener: function() {},\n\n\t/**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart -Chart from which to remove the listener\n\t * @param {String} type - The ({@link IEvent}) type to remove\n\t * @param {Function} listener - The listener function to remove from the event target.\n\t */\n\tremoveEventListener: function() {}\n\n}, implementation);\n\n/**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n/**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n","'use strict';\n\nmodule.exports = {};\nmodule.exports.filler = require('./plugin.filler');\nmodule.exports.legend = require('./plugin.legend');\nmodule.exports.title = require('./plugin.title');\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar Element = require('../core/core.element');\nvar helpers = require('../helpers/index');\nvar layouts = require('../core/core.layouts');\n\nvar noop = helpers.noop;\n\ndefaults._set('global', {\n\ttitle: {\n\t\tdisplay: false,\n\t\tfontStyle: 'bold',\n\t\tfullWidth: true,\n\t\tlineHeight: 1.2,\n\t\tpadding: 10,\n\t\tposition: 'top',\n\t\ttext: '',\n\t\tweight: 2000 // by default greater than legend (1000) to be above\n\t}\n});\n\n/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\nvar Title = Element.extend({\n\tinitialize: function(config) {\n\t\tvar me = this;\n\t\thelpers.extend(me, config);\n\n\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\tme.legendHitBoxes = [];\n\t},\n\n\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\tbeforeUpdate: noop,\n\tupdate: function(maxWidth, maxHeight, margins) {\n\t\tvar me = this;\n\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\tme.beforeUpdate();\n\n\t\t// Absorb the master measurements\n\t\tme.maxWidth = maxWidth;\n\t\tme.maxHeight = maxHeight;\n\t\tme.margins = margins;\n\n\t\t// Dimensions\n\t\tme.beforeSetDimensions();\n\t\tme.setDimensions();\n\t\tme.afterSetDimensions();\n\t\t// Labels\n\t\tme.beforeBuildLabels();\n\t\tme.buildLabels();\n\t\tme.afterBuildLabels();\n\n\t\t// Fit\n\t\tme.beforeFit();\n\t\tme.fit();\n\t\tme.afterFit();\n\t\t//\n\t\tme.afterUpdate();\n\n\t\treturn me.minSize;\n\n\t},\n\tafterUpdate: noop,\n\n\t//\n\n\tbeforeSetDimensions: noop,\n\tsetDimensions: function() {\n\t\tvar me = this;\n\t\t// Set the unconstrained dimension before label rotation\n\t\tif (me.isHorizontal()) {\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.left = 0;\n\t\t\tme.right = me.width;\n\t\t} else {\n\t\t\tme.height = me.maxHeight;\n\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.top = 0;\n\t\t\tme.bottom = me.height;\n\t\t}\n\n\t\t// Reset padding\n\t\tme.paddingLeft = 0;\n\t\tme.paddingTop = 0;\n\t\tme.paddingRight = 0;\n\t\tme.paddingBottom = 0;\n\n\t\t// Reset minSize\n\t\tme.minSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t},\n\tafterSetDimensions: noop,\n\n\t//\n\n\tbeforeBuildLabels: noop,\n\tbuildLabels: noop,\n\tafterBuildLabels: noop,\n\n\t//\n\n\tbeforeFit: noop,\n\tfit: function() {\n\t\tvar me = this;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar opts = me.options;\n\t\tvar display = opts.display;\n\t\tvar fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n\t\tvar minSize = me.minSize;\n\t\tvar lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\tvar textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0;\n\n\t\tif (me.isHorizontal()) {\n\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\tminSize.height = textSize;\n\t\t} else {\n\t\t\tminSize.width = textSize;\n\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t}\n\n\t\tme.width = minSize.width;\n\t\tme.height = minSize.height;\n\n\t},\n\tafterFit: noop,\n\n\t// Shared Methods\n\tisHorizontal: function() {\n\t\tvar pos = this.options.position;\n\t\treturn pos === 'top' || pos === 'bottom';\n\t},\n\n\t// Actually draw the title block on the canvas\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar ctx = me.ctx;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar opts = me.options;\n\t\tvar globalDefaults = defaults.global;\n\n\t\tif (opts.display) {\n\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tvar fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\tvar fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\tvar titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\tvar offset = lineHeight / 2 + opts.padding;\n\t\t\tvar rotation = 0;\n\t\t\tvar top = me.top;\n\t\t\tvar left = me.left;\n\t\t\tvar bottom = me.bottom;\n\t\t\tvar right = me.right;\n\t\t\tvar maxWidth, titleX, titleY;\n\n\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\tctx.font = titleFont;\n\n\t\t\t// Horizontal\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\ttitleY = top + offset;\n\t\t\t\tmaxWidth = right - left;\n\t\t\t} else {\n\t\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\n\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t}\n\n\t\t\tctx.save();\n\t\t\tctx.translate(titleX, titleY);\n\t\t\tctx.rotate(rotation);\n\t\t\tctx.textAlign = 'center';\n\t\t\tctx.textBaseline = 'middle';\n\n\t\t\tvar text = opts.text;\n\t\t\tif (helpers.isArray(text)) {\n\t\t\t\tvar y = 0;\n\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\n\t\t\t\t\ty += lineHeight;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tctx.fillText(text, 0, 0, maxWidth);\n\t\t\t}\n\n\t\t\tctx.restore();\n\t\t}\n\t}\n});\n\nfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\tvar title = new Title({\n\t\tctx: chart.ctx,\n\t\toptions: titleOpts,\n\t\tchart: chart\n\t});\n\n\tlayouts.configure(chart, title, titleOpts);\n\tlayouts.addBox(chart, title);\n\tchart.titleBlock = title;\n}\n\nmodule.exports = {\n\tid: 'title',\n\n\t/**\n\t * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\n\t * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\n\t * the plugin, which one will be re-exposed in the chart.js file.\n\t * https://github.com/chartjs/Chart.js/pull/2640\n\t * @private\n\t */\n\t_element: Title,\n\n\tbeforeInit: function(chart) {\n\t\tvar titleOpts = chart.options.title;\n\n\t\tif (titleOpts) {\n\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t}\n\t},\n\n\tbeforeUpdate: function(chart) {\n\t\tvar titleOpts = chart.options.title;\n\t\tvar titleBlock = chart.titleBlock;\n\n\t\tif (titleOpts) {\n\t\t\thelpers.mergeIf(titleOpts, defaults.global.title);\n\n\t\t\tif (titleBlock) {\n\t\t\t\tlayouts.configure(chart, titleBlock, titleOpts);\n\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t} else {\n\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t}\n\t\t} else if (titleBlock) {\n\t\t\tlayouts.removeBox(chart, titleBlock);\n\t\t\tdelete chart.titleBlock;\n\t\t}\n\t}\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\n/**\n * Generate a set of linear ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {Array} array of tick values\n */\nfunction generateTicks(generationOptions, dataRange) {\n\tvar ticks = [];\n\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t// for details.\n\n\tvar spacing;\n\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\tspacing = generationOptions.stepSize;\n\t} else {\n\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\t}\n\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\tif (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n\t\t// If very close to our whole number, use it.\n\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\tniceMin = generationOptions.min;\n\t\t\tniceMax = generationOptions.max;\n\t\t}\n\t}\n\n\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t// If very close to our rounded value, use it.\n\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\tnumSpaces = Math.round(numSpaces);\n\t} else {\n\t\tnumSpaces = Math.ceil(numSpaces);\n\t}\n\n\tvar precision = 1;\n\tif (spacing < 1) {\n\t\tprecision = Math.pow(10, spacing.toString().length - 2);\n\t\tniceMin = Math.round(niceMin * precision) / precision;\n\t\tniceMax = Math.round(niceMax * precision) / precision;\n\t}\n\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\tfor (var j = 1; j < numSpaces; ++j) {\n\t\tticks.push(Math.round((niceMin + j * spacing) * precision) / precision);\n\t}\n\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\treturn ticks;\n}\n\n\nmodule.exports = function(Chart) {\n\n\tvar noop = helpers.noop;\n\n\tChart.LinearScaleBase = Chart.Scale.extend({\n\t\tgetRightValue: function(value) {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\treturn +value;\n\t\t\t}\n\t\t\treturn Chart.Scale.prototype.getRightValue.call(this, value);\n\t\t},\n\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t// axis, they can manually override it\n\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t// move the top up to 0\n\t\t\t\t\tme.max = 0;\n\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\tme.min = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n\t\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\tme.min = tickOpts.min;\n\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\tif (me.min === null) {\n\t\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t\t} else {\n\t\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\tme.max = tickOpts.max;\n\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\tif (me.max === null) {\n\t\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t\t} else {\n\t\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setMin !== setMax) {\n\t\t\t\t// We set the min or the max but not both.\n\t\t\t\t// So ensure that our range is good\n\t\t\t\t// Inverted or 0 length range can happen when\n\t\t\t\t// ticks.min is set, and no datasets are visible\n\t\t\t\tif (me.min >= me.max) {\n\t\t\t\t\tif (setMin) {\n\t\t\t\t\t\tme.max = me.min + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.min = me.max - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tme.max++;\n\n\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\tme.min--;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTickLimit: noop,\n\t\thandleDirectionalChanges: noop,\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\tvar numericGeneratorOptions = {\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max,\n\t\t\t\tstepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t};\n\t\t\tvar ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\n\n\t\t\tme.handleDirectionalChanges();\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(me);\n\t\t}\n\t});\n};\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\n'use strict';\n\nvar helpers = require('../helpers/index');\n\nvar EXPANDO_KEY = '$chartjs';\nvar CSS_PREFIX = 'chartjs-';\nvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\nvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\nvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nvar EVENT_TYPES = {\n\ttouchstart: 'mousedown',\n\ttouchmove: 'mousemove',\n\ttouchend: 'mouseup',\n\tpointerenter: 'mouseenter',\n\tpointerdown: 'mousedown',\n\tpointermove: 'mousemove',\n\tpointerup: 'mouseup',\n\tpointerleave: 'mouseout',\n\tpointerout: 'mouseout'\n};\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {Number} Size in pixels or undefined if unknown.\n */\nfunction readUsedSize(element, property) {\n\tvar value = helpers.getStyle(element, property);\n\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\treturn matches ? Number(matches[1]) : undefined;\n}\n\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\nfunction initCanvas(canvas, config) {\n\tvar style = canvas.style;\n\n\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\tvar renderHeight = canvas.getAttribute('height');\n\tvar renderWidth = canvas.getAttribute('width');\n\n\t// Chart.js modifies some canvas values that we want to restore on destroy\n\tcanvas[EXPANDO_KEY] = {\n\t\tinitial: {\n\t\t\theight: renderHeight,\n\t\t\twidth: renderWidth,\n\t\t\tstyle: {\n\t\t\t\tdisplay: style.display,\n\t\t\t\theight: style.height,\n\t\t\t\twidth: style.width\n\t\t\t}\n\t\t}\n\t};\n\n\t// Force canvas to display as block to avoid extra space caused by inline\n\t// elements, which would interfere with the responsive resize process.\n\t// https://github.com/chartjs/Chart.js/issues/2538\n\tstyle.display = style.display || 'block';\n\n\tif (renderWidth === null || renderWidth === '') {\n\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\tif (displayWidth !== undefined) {\n\t\t\tcanvas.width = displayWidth;\n\t\t}\n\t}\n\n\tif (renderHeight === null || renderHeight === '') {\n\t\tif (canvas.style.height === '') {\n\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t} else {\n\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.height = displayHeight;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canvas;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nvar supportsEventListenerOptions = (function() {\n\tvar supports = false;\n\ttry {\n\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\tget: function() {\n\t\t\t\tsupports = true;\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('e', null, options);\n\t} catch (e) {\n\t\t// continue regardless of error\n\t}\n\treturn supports;\n}());\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nvar eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addEventListener(node, type, listener) {\n\tnode.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeEventListener(node, type, listener) {\n\tnode.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction createEvent(type, chart, x, y, nativeEvent) {\n\treturn {\n\t\ttype: type,\n\t\tchart: chart,\n\t\tnative: nativeEvent || null,\n\t\tx: x !== undefined ? x : null,\n\t\ty: y !== undefined ? y : null,\n\t};\n}\n\nfunction fromNativeEvent(event, chart) {\n\tvar type = EVENT_TYPES[event.type] || event.type;\n\tvar pos = helpers.getRelativePosition(event, chart);\n\treturn createEvent(type, chart, pos.x, pos.y, event);\n}\n\nfunction throttled(fn, thisArg) {\n\tvar ticking = false;\n\tvar args = [];\n\n\treturn function() {\n\t\targs = Array.prototype.slice.call(arguments);\n\t\tthisArg = thisArg || this;\n\n\t\tif (!ticking) {\n\t\t\tticking = true;\n\t\t\thelpers.requestAnimFrame.call(window, function() {\n\t\t\t\tticking = false;\n\t\t\t\tfn.apply(thisArg, args);\n\t\t\t});\n\t\t}\n\t};\n}\n\n// Implementation based on https://github.com/marcj/css-element-queries\nfunction createResizer(handler) {\n\tvar resizer = document.createElement('div');\n\tvar cls = CSS_PREFIX + 'size-monitor';\n\tvar maxSize = 1000000;\n\tvar style =\n\t\t'position:absolute;' +\n\t\t'left:0;' +\n\t\t'top:0;' +\n\t\t'right:0;' +\n\t\t'bottom:0;' +\n\t\t'overflow:hidden;' +\n\t\t'pointer-events:none;' +\n\t\t'visibility:hidden;' +\n\t\t'z-index:-1;';\n\n\tresizer.style.cssText = style;\n\tresizer.className = cls;\n\tresizer.innerHTML =\n\t\t'
' +\n\t\t\t'
' +\n\t\t\t'
' +\n\t\t'
' +\n\t\t'
' +\n\t\t\t'
' +\n\t\t\t'
' +\n\t\t'
';\n\n\tvar expand = resizer.childNodes[0];\n\tvar shrink = resizer.childNodes[1];\n\n\tresizer._reset = function() {\n\t\texpand.scrollLeft = maxSize;\n\t\texpand.scrollTop = maxSize;\n\t\tshrink.scrollLeft = maxSize;\n\t\tshrink.scrollTop = maxSize;\n\t};\n\tvar onScroll = function() {\n\t\tresizer._reset();\n\t\thandler();\n\t};\n\n\taddEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\taddEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\treturn resizer;\n}\n\n// https://davidwalsh.name/detect-node-insertion\nfunction watchForRender(node, handler) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\tvar proxy = expando.renderProxy = function(e) {\n\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\thandler();\n\t\t}\n\t};\n\n\thelpers.each(ANIMATION_START_EVENTS, function(type) {\n\t\taddEventListener(node, type, proxy);\n\t});\n\n\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t// is removed then added back immediately (same animation frame?). Accessing the\n\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t// https://github.com/chartjs/Chart.js/issues/4737\n\texpando.reflow = !!node.offsetParent;\n\n\tnode.classList.add(CSS_RENDER_MONITOR);\n}\n\nfunction unwatchForRender(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar proxy = expando.renderProxy;\n\n\tif (proxy) {\n\t\thelpers.each(ANIMATION_START_EVENTS, function(type) {\n\t\t\tremoveEventListener(node, type, proxy);\n\t\t});\n\n\t\tdelete expando.renderProxy;\n\t}\n\n\tnode.classList.remove(CSS_RENDER_MONITOR);\n}\n\nfunction addResizeListener(node, listener, chart) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\tvar resizer = expando.resizer = createResizer(throttled(function() {\n\t\tif (expando.resizer) {\n\t\t\treturn listener(createEvent('resize', chart));\n\t\t}\n\t}));\n\n\t// The resizer needs to be attached to the node parent, so we first need to be\n\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\twatchForRender(node, function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = node.parentNode;\n\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t}\n\n\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\tresizer._reset();\n\t\t}\n\t});\n}\n\nfunction removeResizeListener(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar resizer = expando.resizer;\n\n\tdelete expando.resizer;\n\tunwatchForRender(node);\n\n\tif (resizer && resizer.parentNode) {\n\t\tresizer.parentNode.removeChild(resizer);\n\t}\n}\n\nfunction injectCSS(platform, css) {\n\t// http://stackoverflow.com/q/3922139\n\tvar style = platform._style || document.createElement('style');\n\tif (!platform._style) {\n\t\tplatform._style = style;\n\t\tcss = '/* Chart.js */\\n' + css;\n\t\tstyle.setAttribute('type', 'text/css');\n\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\t}\n\n\tstyle.appendChild(document.createTextNode(css));\n}\n\nmodule.exports = {\n\t/**\n\t * This property holds whether this platform is enabled for the current environment.\n\t * Currently used by platform.js to select the proper implementation.\n\t * @private\n\t */\n\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n\tinitialize: function() {\n\t\tvar keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n\t\tinjectCSS(this,\n\t\t\t// DOM rendering detection\n\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\t'@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n\t\t\t'@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n\t\t\t'.' + CSS_RENDER_MONITOR + '{' +\n\t\t\t\t'-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n\t\t\t\t'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n\t\t\t'}'\n\t\t);\n\t},\n\n\tacquireContext: function(item, config) {\n\t\tif (typeof item === 'string') {\n\t\t\titem = document.getElementById(item);\n\t\t} else if (item.length) {\n\t\t\t// Support for array based queries (such as jQuery)\n\t\t\titem = item[0];\n\t\t}\n\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\tif (context && context.canvas === item) {\n\t\t\tinitCanvas(item, config);\n\t\t\treturn context;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\treleaseContext: function(context) {\n\t\tvar canvas = context.canvas;\n\t\tif (!canvas[EXPANDO_KEY]) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar initial = canvas[EXPANDO_KEY].initial;\n\t\t['height', 'width'].forEach(function(prop) {\n\t\t\tvar value = initial[prop];\n\t\t\tif (helpers.isNullOrUndef(value)) {\n\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t} else {\n\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t}\n\t\t});\n\n\t\thelpers.each(initial.style || {}, function(value, key) {\n\t\t\tcanvas.style[key] = value;\n\t\t});\n\n\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\tcanvas.width = canvas.width;\n\n\t\tdelete canvas[EXPANDO_KEY];\n\t},\n\n\taddEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\taddResizeListener(canvas, listener, chart);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n\t\tvar proxies = expando.proxies || (expando.proxies = {});\n\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t};\n\n\t\taddEventListener(canvas, type, proxy);\n\t},\n\n\tremoveEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\tremoveResizeListener(canvas, listener);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || {};\n\t\tvar proxies = expando.proxies || {};\n\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\tif (!proxy) {\n\t\t\treturn;\n\t\t}\n\n\t\tremoveEventListener(canvas, type, proxy);\n\t}\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.addEvent = addEventListener;\n\n/**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.removeEvent = removeEventListener;\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\tplugins: {\n\t\tfiller: {\n\t\t\tpropagate: true\n\t\t}\n\t}\n});\n\nvar mappers = {\n\tdataset: function(source) {\n\t\tvar index = source.fill;\n\t\tvar chart = source.chart;\n\t\tvar meta = chart.getDatasetMeta(index);\n\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\tvar points = (visible && meta.dataset._children) || [];\n\t\tvar length = points.length || 0;\n\n\t\treturn !length ? null : function(point, i) {\n\t\t\treturn (i < length && points[i]._view) || null;\n\t\t};\n\t},\n\n\tboundary: function(source) {\n\t\tvar boundary = source.boundary;\n\t\tvar x = boundary ? boundary.x : null;\n\t\tvar y = boundary ? boundary.y : null;\n\n\t\treturn function(point) {\n\t\t\treturn {\n\t\t\t\tx: x === null ? point.x : x,\n\t\t\t\ty: y === null ? point.y : y,\n\t\t\t};\n\t\t};\n\t}\n};\n\n// @todo if (fill[0] === '#')\nfunction decodeFill(el, index, count) {\n\tvar model = el._model || {};\n\tvar fill = model.fill;\n\tvar target;\n\n\tif (fill === undefined) {\n\t\tfill = !!model.backgroundColor;\n\t}\n\n\tif (fill === false || fill === null) {\n\t\treturn false;\n\t}\n\n\tif (fill === true) {\n\t\treturn 'origin';\n\t}\n\n\ttarget = parseFloat(fill, 10);\n\tif (isFinite(target) && Math.floor(target) === target) {\n\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\ttarget = index + target;\n\t\t}\n\n\t\tif (target === index || target < 0 || target >= count) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tswitch (fill) {\n\t// compatibility\n\tcase 'bottom':\n\t\treturn 'start';\n\tcase 'top':\n\t\treturn 'end';\n\tcase 'zero':\n\t\treturn 'origin';\n\t// supported boundaries\n\tcase 'origin':\n\tcase 'start':\n\tcase 'end':\n\t\treturn fill;\n\t// invalid fill values\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nfunction computeBoundary(source) {\n\tvar model = source.el._model || {};\n\tvar scale = source.el._scale || {};\n\tvar fill = source.fill;\n\tvar target = null;\n\tvar horizontal;\n\n\tif (isFinite(fill)) {\n\t\treturn null;\n\t}\n\n\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t// controllers might still use it (e.g. the Smith chart).\n\n\tif (fill === 'start') {\n\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n\t} else if (fill === 'end') {\n\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\n\t} else if (model.scaleZero !== undefined) {\n\t\ttarget = model.scaleZero;\n\t} else if (scale.getBasePosition) {\n\t\ttarget = scale.getBasePosition();\n\t} else if (scale.getBasePixel) {\n\t\ttarget = scale.getBasePixel();\n\t}\n\n\tif (target !== undefined && target !== null) {\n\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\treturn target;\n\t\t}\n\n\t\tif (typeof target === 'number' && isFinite(target)) {\n\t\t\thorizontal = scale.isHorizontal();\n\t\t\treturn {\n\t\t\t\tx: horizontal ? target : null,\n\t\t\t\ty: horizontal ? null : target\n\t\t\t};\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction resolveTarget(sources, index, propagate) {\n\tvar source = sources[index];\n\tvar fill = source.fill;\n\tvar visited = [index];\n\tvar target;\n\n\tif (!propagate) {\n\t\treturn fill;\n\t}\n\n\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\tif (!isFinite(fill)) {\n\t\t\treturn fill;\n\t\t}\n\n\t\ttarget = sources[fill];\n\t\tif (!target) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (target.visible) {\n\t\t\treturn fill;\n\t\t}\n\n\t\tvisited.push(fill);\n\t\tfill = target.fill;\n\t}\n\n\treturn false;\n}\n\nfunction createMapper(source) {\n\tvar fill = source.fill;\n\tvar type = 'dataset';\n\n\tif (fill === false) {\n\t\treturn null;\n\t}\n\n\tif (!isFinite(fill)) {\n\t\ttype = 'boundary';\n\t}\n\n\treturn mappers[type](source);\n}\n\nfunction isDrawable(point) {\n\treturn point && !point.skip;\n}\n\nfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\tvar i;\n\n\tif (!len0 || !len1) {\n\t\treturn;\n\t}\n\n\t// building first area curve (normal)\n\tctx.moveTo(curve0[0].x, curve0[0].y);\n\tfor (i = 1; i < len0; ++i) {\n\t\thelpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n\t}\n\n\t// joining the two area curves\n\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n\t// building opposite area curve (reverse)\n\tfor (i = len1 - 1; i > 0; --i) {\n\t\thelpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n\t}\n}\n\nfunction doFill(ctx, points, mapper, view, color, loop) {\n\tvar count = points.length;\n\tvar span = view.spanGaps;\n\tvar curve0 = [];\n\tvar curve1 = [];\n\tvar len0 = 0;\n\tvar len1 = 0;\n\tvar i, ilen, index, p0, p1, d0, d1;\n\n\tctx.beginPath();\n\n\tfor (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n\t\tindex = i % count;\n\t\tp0 = points[index]._view;\n\t\tp1 = mapper(p0, index, view);\n\t\td0 = isDrawable(p0);\n\t\td1 = isDrawable(p1);\n\n\t\tif (d0 && d1) {\n\t\t\tlen0 = curve0.push(p0);\n\t\t\tlen1 = curve1.push(p1);\n\t\t} else if (len0 && len1) {\n\t\t\tif (!span) {\n\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\tlen0 = len1 = 0;\n\t\t\t\tcurve0 = [];\n\t\t\t\tcurve1 = [];\n\t\t\t} else {\n\t\t\t\tif (d0) {\n\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t}\n\t\t\t\tif (d1) {\n\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\tctx.closePath();\n\tctx.fillStyle = color;\n\tctx.fill();\n}\n\nmodule.exports = {\n\tid: 'filler',\n\n\tafterDatasetsUpdate: function(chart, options) {\n\t\tvar count = (chart.data.datasets || []).length;\n\t\tvar propagate = options.propagate;\n\t\tvar sources = [];\n\t\tvar meta, i, el, source;\n\n\t\tfor (i = 0; i < count; ++i) {\n\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\tel = meta.dataset;\n\t\t\tsource = null;\n\n\t\t\tif (el && el._model && el instanceof elements.Line) {\n\t\t\t\tsource = {\n\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\tchart: chart,\n\t\t\t\t\tel: el\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmeta.$filler = source;\n\t\t\tsources.push(source);\n\t\t}\n\n\t\tfor (i = 0; i < count; ++i) {\n\t\t\tsource = sources[i];\n\t\t\tif (!source) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\tsource.boundary = computeBoundary(source);\n\t\t\tsource.mapper = createMapper(source);\n\t\t}\n\t},\n\n\tbeforeDatasetDraw: function(chart, args) {\n\t\tvar meta = args.meta.$filler;\n\t\tif (!meta) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar ctx = chart.ctx;\n\t\tvar el = meta.el;\n\t\tvar view = el._view;\n\t\tvar points = el._children || [];\n\t\tvar mapper = meta.mapper;\n\t\tvar color = view.backgroundColor || defaults.global.defaultColor;\n\n\t\tif (mapper && color && points.length) {\n\t\t\thelpers.canvas.clipArea(ctx, chart.chartArea);\n\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\n\t\t\thelpers.canvas.unclipArea(ctx);\n\t\t}\n\t}\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\t// Default config for a category scale\n\tvar defaultConfig = {\n\t\tposition: 'bottom'\n\t};\n\n\tvar DatasetScale = Chart.Scale.extend({\n\t\t/**\n\t\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t\t* else fall back to data.labels\n\t\t* @private\n\t\t*/\n\t\tgetLabels: function() {\n\t\t\tvar data = this.chart.data;\n\t\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\tme.minIndex = 0;\n\t\t\tme.maxIndex = labels.length - 1;\n\t\t\tvar findIndex;\n\n\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t// user specified min value\n\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.min);\n\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t}\n\n\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t// user specified max value\n\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.max);\n\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t}\n\n\t\t\tme.min = labels[me.minIndex];\n\t\t\tme.max = labels[me.maxIndex];\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t}\n\t\t\treturn me.ticks[index - me.minIndex];\n\t\t},\n\n\t\t// Used to get data value locations. Value can either be an index or a numerical value\n\t\tgetPixelForValue: function(value, index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n\t\t\t// If value is a data object, then index is the index in the data array,\n\t\t\t// not the index of the scale. We need to change that.\n\t\t\tvar valueCategory;\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t\t}\n\t\t\tif (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n\t\t\t\tvar labels = me.getLabels();\n\t\t\t\tvalue = valueCategory || value;\n\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t}\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\t\tif (offset) {\n\t\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t\t}\n\n\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t}\n\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\t\tif (offset) {\n\t\t\t\theightOffset += (valueHeight / 2);\n\t\t\t}\n\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tvar value;\n\t\t\tvar offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\tvar horz = me.isHorizontal();\n\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\tif (offset) {\n\t\t\t\tpixel -= (valueDimension / 2);\n\t\t\t}\n\n\t\t\tif (pixel <= 0) {\n\t\t\t\tvalue = 0;\n\t\t\t} else {\n\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t}\n\n\t\t\treturn value + me.minIndex;\n\t\t},\n\t\tgetBasePixel: function() {\n\t\t\treturn this.bottom;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar helpers = require('../helpers/index');\nvar Ticks = require('../core/core.ticks');\n\nmodule.exports = function(Chart) {\n\n\tvar globalDefaults = defaults.global;\n\n\tvar defaultConfig = {\n\t\tdisplay: true,\n\n\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\tanimate: true,\n\t\tposition: 'chartArea',\n\n\t\tangleLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1\n\t\t},\n\n\t\tgridLines: {\n\t\t\tcircular: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\tshowLabelBackdrop: true,\n\n\t\t\t// String - The colour of the label backdrop\n\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\tbackdropPaddingY: 2,\n\n\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\tbackdropPaddingX: 2,\n\n\t\t\tcallback: Ticks.formatters.linear\n\t\t},\n\n\t\tpointLabels: {\n\t\t\t// Boolean - if true, show point labels\n\t\t\tdisplay: true,\n\n\t\t\t// Number - Point label font size in pixels\n\t\t\tfontSize: 10,\n\n\t\t\t// Function - Used to convert point labels\n\t\t\tcallback: function(label) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction getValueCount(scale) {\n\t\tvar opts = scale.options;\n\t\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n\t}\n\n\tfunction getPointLabelFontOptions(scale) {\n\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\tvar fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\tvar fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\treturn {\n\t\t\tsize: fontSize,\n\t\t\tstyle: fontStyle,\n\t\t\tfamily: fontFamily,\n\t\t\tfont: font\n\t\t};\n\t}\n\n\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\tif (helpers.isArray(label)) {\n\t\t\treturn {\n\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\th: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tw: ctx.measureText(label).width,\n\t\t\th: fontSize\n\t\t};\n\t}\n\n\tfunction determineLimits(angle, pos, size, min, max) {\n\t\tif (angle === min || angle === max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - (size / 2),\n\t\t\t\tend: pos + (size / 2)\n\t\t\t};\n\t\t} else if (angle < min || angle > max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - size - 5,\n\t\t\t\tend: pos\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstart: pos,\n\t\t\tend: pos + size + 5\n\t\t};\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with point labels\n\t */\n\tfunction fitWithPointLabels(scale) {\n\t\t/*\n\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t *\n\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t *\n\t\t * Solution:\n\t\t *\n\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t * at each index we check if the text overlaps.\n\t\t *\n\t\t * Where it does, we store that angle and that index.\n\t\t *\n\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t * from the shape radius to move the point inwards by that x.\n\t\t *\n\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t * along with labels.\n\t\t *\n\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t *\n\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t * and position it in the most space efficient manner\n\t\t *\n\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t */\n\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tvar furthestLimits = {\n\t\t\tr: scale.width,\n\t\t\tl: 0,\n\t\t\tt: scale.height,\n\t\t\tb: 0\n\t\t};\n\t\tvar furthestAngles = {};\n\t\tvar i, textSize, pointPosition;\n\n\t\tscale.ctx.font = plFont.font;\n\t\tscale._pointLabelSizes = [];\n\n\t\tvar valueCount = getValueCount(scale);\n\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t}\n\n\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t}\n\t\t}\n\n\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with no point labels\n\t */\n\tfunction fit(scale) {\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t}\n\n\tfunction getTextAlignForAngle(angle) {\n\t\tif (angle === 0 || angle === 180) {\n\t\t\treturn 'center';\n\t\t} else if (angle < 180) {\n\t\t\treturn 'left';\n\t\t}\n\n\t\treturn 'right';\n\t}\n\n\tfunction fillText(ctx, text, position, fontSize) {\n\t\tif (helpers.isArray(text)) {\n\t\t\tvar y = position.y;\n\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\ty += spacing;\n\t\t\t}\n\t\t} else {\n\t\t\tctx.fillText(text, position.x, position.y);\n\t\t}\n\t}\n\n\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\tif (angle === 90 || angle === 270) {\n\t\t\tposition.y -= (textSize.h / 2);\n\t\t} else if (angle > 270 || angle < 90) {\n\t\t\tposition.y -= textSize.h;\n\t\t}\n\t}\n\n\tfunction drawPointLabels(scale) {\n\t\tvar ctx = scale.ctx;\n\t\tvar opts = scale.options;\n\t\tvar angleLineOpts = opts.angleLines;\n\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n\t\t// Point Label Font\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\tctx.textBaseline = 'top';\n\n\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\tif (angleLineOpts.display) {\n\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\n\t\t\tif (pointLabelOpts.display) {\n\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t\t// Keep this in loop since we may support array properties here\n\t\t\t\tvar pointLabelFontColor = helpers.valueAtIndexOrDefault(pointLabelOpts.fontColor, i, globalDefaults.defaultFontColor);\n\t\t\t\tctx.font = plFont.font;\n\t\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\tvar ctx = scale.ctx;\n\t\tctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\tctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\tif (scale.options.gridLines.circular) {\n\t\t\t// Draw circular arcs between the points\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t} else {\n\t\t\t// Draw straight lines connecting each index\n\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\tif (valueCount === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t}\n\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tfunction numberOrZero(param) {\n\t\treturn helpers.isNumber(param) ? param : 0;\n\t}\n\n\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.height = me.maxHeight;\n\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tme.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\thelpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tme.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\n\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t// Point labels\n\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tfit: function() {\n\t\t\tif (this.options.pointLabels.display) {\n\t\t\t\tfitWithPointLabels(this);\n\t\t\t} else {\n\t\t\t\tfit(this);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set radius reductions and determine new radius and center point\n\t\t * @private\n\t\t */\n\t\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\tvar me = this;\n\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\tme.drawingArea = Math.min(\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\tvar me = this;\n\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\n\t\t\tvar maxLeft = leftMovement + me.drawingArea;\n\t\t\tvar maxTop = topMovement + me.drawingArea;\n\t\t\tvar maxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\tme.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n\t\t\tme.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n\t\t},\n\n\t\tgetIndexAngle: function(index) {\n\t\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\t\tthis.chart.options.startAngle :\n\t\t\t\t0;\n\n\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t},\n\t\tgetDistanceFromCenterForValue: function(value) {\n\t\t\tvar me = this;\n\n\t\t\tif (value === null) {\n\t\t\t\treturn 0; // null always in center\n\t\t\t}\n\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\tif (me.options.ticks.reverse) {\n\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t}\n\t\t\treturn (value - me.min) * scalingFactor;\n\t\t},\n\t\tgetPointPosition: function(index, distanceFromCenter) {\n\t\t\tvar me = this;\n\t\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\t\treturn {\n\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t};\n\t\t},\n\t\tgetPointPositionForValue: function(index, value) {\n\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t},\n\n\t\tgetBasePosition: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.getPointPositionForValue(0,\n\t\t\t\tme.beginAtZero ? 0 :\n\t\t\t\tmin < 0 && max < 0 ? max :\n\t\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t\t0);\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\t\t\t\tvar startAngle = this.getIndexAngle(0);\n\n\t\t\t\t// Tick Font\n\t\t\t\tvar tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\tif (index > 0 || tickOpts.reverse) {\n\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\tvar tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(me.xCenter, me.yCenter);\n\t\t\t\t\t\t\tctx.rotate(startAngle);\n\n\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t\t-labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t\t-yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\t\ttickFontSize + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\tctx.fillText(label, 0, -yCenterOffset);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n};\n"],"sourceRoot":""}