{"version":3,"sources":["webpack:///./node_modules/chart.js/src/core/core.animation.js","webpack:///./node_modules/chart.js/src/core/core.defaults.js","webpack:///./node_modules/chart.js/src/controllers/controller.line.js","webpack:///./node_modules/chart.js/src/core/core.datasetController.js","webpack:///./node_modules/chart.js/src/core/core.element.js","webpack:///./node_modules/chart.js/src/charts/Chart.Bar.js","webpack:///./node_modules/chart.js/src/charts/Chart.Bubble.js","webpack:///./node_modules/chart.js/src/charts/Chart.Scatter.js","webpack:///./node_modules/chart.js/src/charts/Chart.Doughnut.js","webpack:///./node_modules/chart.js/src/core/core.plugins.js","webpack:///./node_modules/chart.js/src/chart.js","webpack:///./node_modules/chart.js/src/controllers/controller.doughnut.js","webpack:///./node_modules/chart.js/src/controllers/controller.bar.js","webpack:///./node_modules/chart.js/src/controllers/controller.radar.js","webpack:///./node_modules/chart.js/src/controllers/controller.bubble.js","webpack:///./node_modules/chart.js/src/core/core.scale.js","webpack:///./node_modules/chart.js/src/core/core.layouts.js","webpack:///./node_modules/chart.js/src/core/core.ticks.js","webpack:///./node_modules/chart.js/src/charts/Chart.Radar.js","webpack:///./node_modules/chart.js/src/core/core.interaction.js","webpack:///./node_modules/chart.js/src/core/core.helpers.js","webpack:///./node_modules/chart.js/src/charts/Chart.PolarArea.js","webpack:///./node_modules/chart.js/src/core/core.scaleService.js","webpack:///./node_modules/chart.js/src/core/core.tooltip.js","webpack:///./node_modules/chart.js/src/core/core.js","webpack:///./node_modules/chart.js/src/controllers/controller.scatter.js","webpack:///./node_modules/chart.js/src/controllers/controller.polarArea.js","webpack:///./node_modules/chart.js/src/core/core.controller.js","webpack:///./node_modules/chart.js/src/charts/Chart.Line.js"],"names":["defaults","__webpack_require__","Element","helpers","_set","animation","duration","easing","onProgress","noop","onComplete","module","exports","Chart","Animation","extend","chart","currentStep","numSteps","render","onAnimationProgress","onAnimationComplete","animationService","frameDuration","animations","dropFrames","request","addAnimation","lazy","i","ilen","this","animating","length","push","requestAnimationFrame","cancelAnimation","index","findIndex","splice","me","requestAnimFrame","call","window","startDigest","startTime","Date","now","framesToDrop","Math","floor","advance","endTime","count","min","callback","Object","defineProperty","prototype","get","set","value","scope","values","merge","elements","showLines","spanGaps","hover","mode","scales","xAxes","type","id","yAxes","lineEnabled","dataset","options","valueOrDefault","showLine","controllers","line","DatasetController","datasetElementType","Line","dataElementType","Point","update","reset","custom","meta","getMeta","points","data","lineElementOptions","scale","getScaleForId","yAxisID","getDataset","undefined","tension","lineTension","_scale","_datasetIndex","_children","_model","backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","steppedLine","stepped","cubicInterpolationMode","pivot","updateElement","updateBezierControlPoints","getPointBackgroundColor","point","pointBackgroundColor","valueAtIndexOrDefault","getPointBorderColor","pointBorderColor","getPointBorderWidth","isNaN","pointBorderWidth","isArray","x","y","datasetIndex","yScale","xScale","xAxisID","pointOptions","radius","pointRadius","hitRadius","pointHitRadius","getPixelForValue","NaN","getBasePixel","calculatePointY","_xScale","_yScale","_index","skip","pointStyle","ds","dsMeta","sumPos","sumNeg","stacked","datasets","getDatasetMeta","isDatasetVisible","stackedRightValue","Number","getRightValue","rightValue","model","controlPoints","area","chartArea","capControlPoint","pt","max","filter","splineCurveMonotone","splineCurve","previousItem","nextItem","controlPointPreviousX","previous","controlPointPreviousY","controlPointNextX","next","controlPointNextY","capBezierPoints","left","right","top","bottom","draw","canvas","clipArea","ctx","unclipArea","setHoverStyle","hoverRadius","pointHoverRadius","hoverBackgroundColor","pointHoverBackgroundColor","getHoverColor","hoverBorderColor","pointHoverBorderColor","hoverBorderWidth","pointHoverBorderWidth","removeHoverStyle","arrayEvents","listenArrayEvents","array","listener","_chartjs","listeners","configurable","enumerable","forEach","key","method","charAt","toUpperCase","slice","base","args","Array","arguments","res","apply","each","object","unlistenArrayEvents","stub","indexOf","initialize","linkScales","addElements","updateIndex","scaleID","destroy","_data","createMetaDataset","_chart","createMetaData","metaData","addElementAndReset","element","buildOrUpdateElements","resyncElements","transition","easingValue","elementOpts","numMeta","numData","insertElements","start","onDataPush","onDataPop","pop","onDataShift","shift","onDataSplice","onDataUnshift","inherits","color","interpolate","view","ease","actual","origin","target","c0","c1","keys","hasOwnProperty","valid","mix","rgbString","isFinite","configuration","hidden","_view","clone","_start","tooltipPosition","hasValue","isNumber","Bar","context","config","Bubble","Scatter","Doughnut","plugins","_plugins","_cacheId","register","p","concat","plugin","unregister","idx","clear","getAll","notify","hook","descriptor","params","descriptors","cache","$plugins","opts","global","_invalidate","Interaction","layouts","platform","Ticks","k","Legend","legend","_element","Title","title","pluginService","PluginBase","canvasHelpers","layoutService","animateRotate","animateScale","legendCallback","text","labels","join","generateLabels","map","label","arc","arcOpts","stroke","bw","fillStyle","strokeStyle","lineWidth","onClick","e","legendItem","cutoutPercentage","rotation","PI","circumference","tooltips","callbacks","tooltipItem","dataLabel","doughnut","pie","Arc","getRingIndex","ringIndex","j","availableWidth","availableHeight","minSize","offset","startAngle","endAngle","cos","sin","end","contains0","contains90","contains180","contains270","cutout","size","width","height","getMaxBorderWidth","outerRadius","innerRadius","radiusLength","getVisibleDatasetCount","offsetX","offsetY","total","calculateTotal","animationOpts","centerX","centerY","calculateCircumference","abs","arcs","hoverWidth","computeMinSampleSize","pixels","prev","curr","isHorizontal","ticks","getTicks","getPixelForTick","computeFitCategoryTraits","ruler","ratio","thickness","barThickness","stackCount","isNullOrUndef","categoryPercentage","barPercentage","chunk","computeFlexCategoryTraits","percent","gridLines","offsetGridLines","axis","position","rectangle","borderSkipped","item","yLabel","datasetLabel","xLabel","bar","Rectangle","stack","rects","_ruler","getRuler","rectangleOptions","updateElementGeometry","vscale","getValueScale","horizontal","vpixels","calculateBarValuePixels","ipixels","calculateBarIndexPixels","head","center","getValueScaleId","getIndexScaleId","getIndexScale","_getStacks","last","stacks","getStackCount","getStackIndex","name","imeta","ivalue","controller","range","stackIndex","maxBarThickness","Infinity","rectangleElementOptions","horizontalBar","radar","_loop","pointElementOptions","pointPosition","getPointPositionForValue","xCenter","yCenter","dataPoint","r","bubble","_resolveElementOptions","dsIndex","getPixelForDecimal","_options","resolve","dataIndex","labelsFromTicks","getLineValue","lineValue","display","drawBorder","drawOnChartArea","drawTicks","tickMarkLength","zeroLineWidth","zeroLineColor","zeroLineBorderDash","zeroLineBorderDashOffset","scaleLabel","labelString","lineHeight","padding","beginAtZero","minRotation","maxRotation","mirror","reverse","autoSkip","autoSkipPadding","labelOffset","formatters","minor","major","computeTextSize","tick","font","longestText","measureText","parseFontOptions","globalDefaults","fontSize","defaultFontSize","style","fontStyle","defaultFontStyle","family","fontFamily","defaultFontFamily","fontString","parseLineHeight","toLineHeight","Scale","getPadding","paddingLeft","paddingTop","paddingRight","paddingBottom","_ticks","mergeTicksOptions","beforeUpdate","maxWidth","maxHeight","margins","longestTextCache","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","beforeTickToLabelConversion","convertTicksToLabels","afterTickToLabelConversion","beforeCalculateTickRotation","calculateTickRotation","afterCalculateTickRotation","beforeFit","fit","afterFit","afterUpdate","tickOpts","userCallback","tickFont","labelRotation","cosRotation","sinRotation","originalLabelWidth","labelWidth","tickWidth","angleRadians","toRadians","scaleLabelOpts","gridLineOpts","isFullWidth","scaleLabelLineHeight","scaleLabelPadding","toPadding","deltaHeight","largestTextWidth","tallestLabelHeightInLines","numberOfLabelLines","lineSpace","tickPadding","longestLabelWidth","labelHeight","firstLabelWidth","lastLabelWidth","handleMargins","rawValue","getLabelForIndex","getValueForPixel","innerWidth","pixel","finalVal","round","innerHeight","decimal","valueOffset","getBaseValue","_autoSkip","skipRatio","shouldSkip","maxTicks","optionTicks","tickCount","labelRotationRadians","longestRotatedLabel","result","maxTicksLimit","optionMajorTicks","isRotated","tickFontColor","fontColor","defaultFontColor","majorTickFontColor","majorTickFont","tl","scaleLabelFontColor","scaleLabelFont","itemsToDraw","axisWidth","xTickStart","xTickEnd","yTickStart","yTickEnd","lineColor","tx1","ty1","tx2","ty2","x1","y1","x2","y2","labelX","labelY","zeroLineIndex","textAlign","textBaseline","labelYOffset","xLineValue","aliasPixel","labelXOffset","isLeft","yLineValue","glWidth","glColor","glBorderDash","glBorderDashOffset","itemToDraw","save","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","restore","translate","rotate","lineCount","fillText","scaleLabelX","scaleLabelY","halfLineHeight","filterByPosition","where","v","sortByWeight","_tmpIndex_","sort","a","b","v0","v1","weight","addBox","boxes","fullWidth","removeBox","layoutItem","configure","prop","props","layoutOptions","layout","leftPadding","rightPadding","topPadding","bottomPadding","leftBoxes","rightBoxes","topBoxes","bottomBoxes","chartAreaBoxes","chartWidth","chartHeight","chartAreaWidth","chartAreaHeight","verticalBoxWidth","horizontalBoxHeight","maxChartAreaWidth","maxChartAreaHeight","minBoxSizes","getMinimumBoxSize","maxHorizontalLeftPadding","maxHorizontalRightPadding","maxVerticalTopPadding","maxVerticalBottomPadding","horizontalBox","boxPadding","verticalBox","totalLeftBoxesWidth","totalRightBoxesWidth","totalTopBoxesHeight","totalBottomBoxesHeight","fitBox","box","finalFitVerticalBox","leftPaddingAddition","topPaddingAddition","newMaxChartAreaHeight","newMaxChartAreaWidth","placeBox","minBoxSize","findNextWhere","minBox","scaleMargin","linear","tickValue","delta","logDelta","log10","tickString","numDecimal","toFixed","logarithmic","remain","pow","toExponential","Radar","getRelativePosition","native","parseVisibleItems","handler","jlen","getIntersectItems","inRange","getNearestItems","intersect","distanceMetric","minDistance","POSITIVE_INFINITY","nearestItems","getCenterPoint","distance","getDistanceMetricForAxis","useX","useY","pt1","pt2","deltaX","deltaY","sqrt","indexMode","items","modes","single","x-axis","nearest","sizeA","getArea","sizeB","ret","intersectsItem","inXRange","inYRange","parseMaxStyle","styleValue","node","parentProperty","valueInPixels","parseInt","parentNode","isConstrainedValue","getConstraintDimension","domNode","maxStyle","percentageProperty","document","defaultView","constrainedNode","getComputedStyle","constrainedContainer","hasCNode","hasCContainer","infinity","configMerge","merger","source","tval","sval","scaleMerge","scaleService","getScaleDefaults","_merger","slen","collection","filterCallback","filtered","arrayToSearch","startIndex","currentItem","findPreviousWhere","n","parseFloat","almostEquals","epsilon","almostWhole","rounded","reduce","NEGATIVE_INFINITY","sign","exponent","log","LOG10E","powerOf10","isPowerOf10","degrees","toDegrees","radians","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distanceBetweenPoints","pixelWidth","firstPoint","middlePoint","afterPoint","t","current","d01","d12","s01","s12","fa","fb","EPSILON","pointBefore","pointCurrent","pointAfter","alphaK","betaK","tauK","squaredMagnitude","pointsWithTangents","deltaK","mK","pointsLen","slopeDeltaX","loop","niceNum","niceFraction","fraction","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","evt","mouseX","mouseY","originalEvent","currentTarget","srcElement","boundingRect","getBoundingClientRect","touches","clientX","clientY","getStyle","currentDevicePixelRatio","getConstraintWidth","getConstraintHeight","getMaximumWidth","container","clientWidth","w","cw","getMaximumHeight","clientHeight","h","ch","el","property","currentStyle","getPropertyValue","retinaScale","forceRatio","pixelRatio","devicePixelRatio","pixelSize","arrayOfThings","gc","garbageCollect","longest","thing","nestedThing","gcLen","string","textWidth","numberOfLines","CanvasGradient","defaultColor","console","error","colorValue","CanvasPattern","saturate","darken","PolarArea","constructors","registerScaleType","scaleConstructor","scaleDefaults","getScaleConstructor","updateScaleDefaults","additions","addScalesToLayout","enabled","titleFontStyle","titleSpacing","titleMarginBottom","titleFontColor","titleAlign","bodySpacing","bodyFontColor","bodyAlign","footerFontStyle","footerSpacing","footerMarginTop","footerFontColor","footerAlign","yPadding","xPadding","caretPadding","caretSize","cornerRadius","multiKeyBackground","displayColors","beforeTitle","tooltipItems","labelCount","afterTitle","beforeBody","beforeLabel","labelColor","activeElement","labelTextColor","afterLabel","afterBody","beforeFooter","footer","afterFooter","mergeOpacity","colorString","opacity","alpha","rgbaString","pushOrConcat","toPush","createTooltipItem","getBaseModel","tooltipOpts","xAlign","yAlign","_bodyFontFamily","bodyFontFamily","_bodyFontStyle","bodyFontStyle","_bodyAlign","bodyFontSize","_titleFontFamily","titleFontFamily","_titleFontStyle","titleFontSize","_titleAlign","_footerFontFamily","footerFontFamily","_footerFontStyle","footerFontSize","_footerAlign","legendColorBackground","getTooltipSize","tooltip","body","combinedBodyLength","bodyItem","before","lines","after","titleLineCount","footerLineCount","widthPadding","maxLineWidth","determineAlignment","lf","rf","olf","orf","yf","midX","midY","getBackgroundPoint","vm","alignment","paddingAndSize","radiusAndPadding","Tooltip","_lastActive","getTitle","getBeforeBody","getBody","bodyItems","getAfterBody","getFooter","changed","len","existingModel","active","_active","backgroundPoint","tooltipSize","caretX","caretY","labelColors","labelTextColors","positioners","_eventPosition","itemSort","dataPoints","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","tmp","drawTitle","drawBody","xLinePadding","fillLineOfText","drawColorBoxes","textColor","fillRect","strokeRect","drawFooter","drawBackground","quadraticCurveTo","closePath","hasTooltipContent","handleEvent","getElementsAtEventForMode","arrayEquals","average","pos","eventPosition","nearestElement","d","tp","responsive","responsiveAnimationDuration","maintainAspectRatio","events","onHover","animationDuration","construct","scatter","angleLines","circular","pointLabels","polarArea","countVisibleElements","visibleCount","datasetStartAngle","getDistanceFromCenterForValue","resetRadius","initConfig","updateConfig","newOptions","ensureScalesHaveIDs","buildOrUpdateScales","positionIsHorizontal","types","instances","acquireContext","uid","aspectRatio","_bufferedRender","bindEvents","resize","initToolTip","stop","silent","newWidth","newHeight","newSize","onResize","scalesOptions","scaleOptions","xAxisOptions","yAxisOptions","updated","obj","dtype","dposition","isDefault","scaleType","scaleClass","hasUpdated","buildOrUpdateControllers","newControllers","destroyDatasetMeta","ControllerClass","Error","resetElements","updateLayout","updateDatasets","lastActive","_bufferedRequest","updateDataset","animationOptions","animationObject","easingFunction","effects","stepDecimal","drawDatasets","_drawTooltip","drawDataset","getElementAtEvent","getElementsAtEvent","getElementsAtXAxis","getDatasetAtEvent","_meta","generateLegend","unbindEvents","releaseContext","toBase64Image","toDataURL","_chartInstance","_listeners","eventHandler","addEventListener","removeEventListener","updateHoverStyle","bufferedRequest","hoverOptions","Controller"],"mappings":"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","file":"js/chunk-vendors~8f4a6b7b.a26ae099.js","sourcesContent":["/* global window: false */\n'use strict';\n\nvar defaults = require('./core.defaults');\nvar Element = require('./core.element');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\tanimation: {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.Animation = Element.extend({\n\t\tchart: null, // the animation associated chart instance\n\t\tcurrentStep: 0, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @param {Chart} chart - The chart to animate.\n\t\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t\t * @param {Number} duration - The animation duration in ms.\n\t\t * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chart, animation, duration, lazy) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar i, ilen;\n\n\t\t\tanimation.chart = chart;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchart.animating = true;\n\t\t\t}\n\n\t\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tanimations.push(animation);\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (animations.length === 1) {\n\t\t\t\tthis.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\tcancelAnimation: function(chart) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animation) {\n\t\t\t\treturn animation.chart === chart;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchart.animating = false;\n\t\t\t}\n\t\t},\n\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\tvar endTime = Date.now();\n\n\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tadvance: function(count) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar animation, chart;\n\t\t\tvar i = 0;\n\n\t\t\twhile (i < animations.length) {\n\t\t\t\tanimation = animations[i];\n\t\t\t\tchart = animation.chart;\n\n\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\tchart.animating = false;\n\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation instead\n\t * @prop Chart.Animation#animationObject\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'animationObject', {\n\t\tget: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation#chart instead\n\t * @prop Chart.Animation#chartInstance\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n\t\tget: function() {\n\t\t\treturn this.chart;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.chart = value;\n\t\t}\n\t});\n\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\nmodule.exports = {\n\t/**\n\t * @private\n\t */\n\t_set: function(scope, values) {\n\t\treturn helpers.merge(this[scope] || (this[scope] = {}), values);\n\t}\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('line', {\n\tshowLines: true,\n\tspanGaps: false,\n\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\tid: 'x-axis-0'\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.valueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar area = chart.chartArea;\n\t\t\tvar ilen = points.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, area);\n\n\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tpoints[i].draw(area);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\nmodule.exports = function(Chart) {\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\ttransition: function(easingValue) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].transition(easingValue);\n\t\t\t}\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar getHoverColor = helpers.getHoverColor;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i = 0; i < count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length - 1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n","'use strict';\n\nvar color = require('chartjs-color');\nvar helpers = require('../helpers/index');\n\nfunction interpolate(start, view, model, ease) {\n\tvar keys = Object.keys(model);\n\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\tkey = keys[i];\n\n\t\ttarget = model[key];\n\n\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\tif (!view.hasOwnProperty(key)) {\n\t\t\tview[key] = target;\n\t\t}\n\n\t\tactual = view[key];\n\n\t\tif (actual === target || key[0] === '_') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!start.hasOwnProperty(key)) {\n\t\t\tstart[key] = actual;\n\t\t}\n\n\t\torigin = start[key];\n\n\t\ttype = typeof target;\n\n\t\tif (type === typeof origin) {\n\t\t\tif (type === 'string') {\n\t\t\t\tc0 = color(origin);\n\t\t\t\tif (c0.valid) {\n\t\t\t\t\tc1 = color(target);\n\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tview[key] = target;\n\t}\n}\n\nvar Element = function(configuration) {\n\thelpers.extend(this, configuration);\n\tthis.initialize.apply(this, arguments);\n};\n\nhelpers.extend(Element.prototype, {\n\n\tinitialize: function() {\n\t\tthis.hidden = false;\n\t},\n\n\tpivot: function() {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\tme._view = helpers.clone(me._model);\n\t\t}\n\t\tme._start = {};\n\t\treturn me;\n\t},\n\n\ttransition: function(ease) {\n\t\tvar me = this;\n\t\tvar model = me._model;\n\t\tvar start = me._start;\n\t\tvar view = me._view;\n\n\t\t// No animation -> No Transition\n\t\tif (!model || ease === 1) {\n\t\t\tme._view = model;\n\t\t\tme._start = null;\n\t\t\treturn me;\n\t\t}\n\n\t\tif (!view) {\n\t\t\tview = me._view = {};\n\t\t}\n\n\t\tif (!start) {\n\t\t\tstart = me._start = {};\n\t\t}\n\n\t\tinterpolate(start, view, model, ease);\n\n\t\treturn me;\n\t},\n\n\ttooltipPosition: function() {\n\t\treturn {\n\t\t\tx: this._model.x,\n\t\t\ty: this._model.y\n\t\t};\n\t},\n\n\thasValue: function() {\n\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t}\n});\n\nElement.extend = helpers.inherits;\n\nmodule.exports = Element;\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\tplugins: {}\n});\n\n/**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\nmodule.exports = {\n\t/**\n\t * Globally registered plugins.\n\t * @private\n\t */\n\t_plugins: [],\n\n\t/**\n\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t * incremented and descriptors are regenerated during following API calls.\n\t * @private\n\t */\n\t_cacheId: 0,\n\n\t/**\n\t * Registers the given plugin(s) if not already registered.\n\t * @param {Array|Object} plugins plugin instance(s).\n\t */\n\tregister: function(plugins) {\n\t\tvar p = this._plugins;\n\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\tp.push(plugin);\n\t\t\t}\n\t\t});\n\n\t\tthis._cacheId++;\n\t},\n\n\t/**\n\t * Unregisters the given plugin(s) only if registered.\n\t * @param {Array|Object} plugins plugin instance(s).\n\t */\n\tunregister: function(plugins) {\n\t\tvar p = this._plugins;\n\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\tvar idx = p.indexOf(plugin);\n\t\t\tif (idx !== -1) {\n\t\t\t\tp.splice(idx, 1);\n\t\t\t}\n\t\t});\n\n\t\tthis._cacheId++;\n\t},\n\n\t/**\n\t * Remove all registered plugins.\n\t * @since 2.1.5\n\t */\n\tclear: function() {\n\t\tthis._plugins = [];\n\t\tthis._cacheId++;\n\t},\n\n\t/**\n\t * Returns the number of registered plugins?\n\t * @returns {Number}\n\t * @since 2.1.5\n\t */\n\tcount: function() {\n\t\treturn this._plugins.length;\n\t},\n\n\t/**\n\t * Returns all registered plugin instances.\n\t * @returns {Array} array of plugin objects.\n\t * @since 2.1.5\n\t */\n\tgetAll: function() {\n\t\treturn this._plugins;\n\t},\n\n\t/**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Object} chart - The chart instance for which plugins should be called.\n\t * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Array} [args] - Extra arguments to apply to the hook call.\n\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t */\n\tnotify: function(chart, hook, args) {\n\t\tvar descriptors = this.descriptors(chart);\n\t\tvar ilen = descriptors.length;\n\t\tvar i, descriptor, plugin, params, method;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tdescriptor = descriptors[i];\n\t\t\tplugin = descriptor.plugin;\n\t\t\tmethod = plugin[hook];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\tparams.push(descriptor.options);\n\t\t\t\tif (method.apply(plugin, params) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns descriptors of enabled plugins for the given chart.\n\t * @returns {Array} [{ plugin, options }]\n\t * @private\n\t */\n\tdescriptors: function(chart) {\n\t\tvar cache = chart.$plugins || (chart.$plugins = {});\n\t\tif (cache.id === this._cacheId) {\n\t\t\treturn cache.descriptors;\n\t\t}\n\n\t\tvar plugins = [];\n\t\tvar descriptors = [];\n\t\tvar config = (chart && chart.config) || {};\n\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\tif (idx !== -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar id = plugin.id;\n\t\t\tvar opts = options[id];\n\t\t\tif (opts === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (opts === true) {\n\t\t\t\topts = helpers.clone(defaults.global.plugins[id]);\n\t\t\t}\n\n\t\t\tplugins.push(plugin);\n\t\t\tdescriptors.push({\n\t\t\t\tplugin: plugin,\n\t\t\t\toptions: opts || {}\n\t\t\t});\n\t\t});\n\n\t\tcache.descriptors = descriptors;\n\t\tcache.id = this._cacheId;\n\t\treturn descriptors;\n\t},\n\n\t/**\n\t * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\n\t * but in some cases, this reference can be changed by the user when updating options.\n\t * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t * @private\n\t */\n\t_invalidate: function(chart) {\n\t\tdelete chart.$plugins;\n\t}\n};\n\n/**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n/**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n/**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n*/\n/**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n/**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n/**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n/**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n/**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n/**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n/**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n/**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeTooltipDraw\n * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\n * the tooltip drawing is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart tooltip drawing.\n */\n/**\n * @method IPlugin#afterTooltipDraw\n * @desc Called after drawing the `tooltip`. Note that this hook will not\n * be called if the tooltip drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n","/**\n * @namespace Chart\n */\nvar Chart = require('./core/core')();\n\nChart.helpers = require('./helpers/index');\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\nrequire('./core/core.helpers')(Chart);\n\nChart.defaults = require('./core/core.defaults');\nChart.Element = require('./core/core.element');\nChart.elements = require('./elements/index');\nChart.Interaction = require('./core/core.interaction');\nChart.layouts = require('./core/core.layouts');\nChart.platform = require('./platforms/platform');\nChart.plugins = require('./core/core.plugins');\nChart.Ticks = require('./core/core.ticks');\n\nrequire('./core/core.animation')(Chart);\nrequire('./core/core.controller')(Chart);\nrequire('./core/core.datasetController')(Chart);\nrequire('./core/core.scaleService')(Chart);\nrequire('./core/core.scale')(Chart);\nrequire('./core/core.tooltip')(Chart);\n\nrequire('./scales/scale.linearbase')(Chart);\nrequire('./scales/scale.category')(Chart);\nrequire('./scales/scale.linear')(Chart);\nrequire('./scales/scale.logarithmic')(Chart);\nrequire('./scales/scale.radialLinear')(Chart);\nrequire('./scales/scale.time')(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire('./controllers/controller.bar')(Chart);\nrequire('./controllers/controller.bubble')(Chart);\nrequire('./controllers/controller.doughnut')(Chart);\nrequire('./controllers/controller.line')(Chart);\nrequire('./controllers/controller.polarArea')(Chart);\nrequire('./controllers/controller.radar')(Chart);\nrequire('./controllers/controller.scatter')(Chart);\n\nrequire('./charts/Chart.Bar')(Chart);\nrequire('./charts/Chart.Bubble')(Chart);\nrequire('./charts/Chart.Doughnut')(Chart);\nrequire('./charts/Chart.Line')(Chart);\nrequire('./charts/Chart.PolarArea')(Chart);\nrequire('./charts/Chart.Radar')(Chart);\nrequire('./charts/Chart.Scatter')(Chart);\n\n// Loading built-it plugins\nvar plugins = require('./plugins');\nfor (var k in plugins) {\n\tif (plugins.hasOwnProperty(k)) {\n\t\tChart.plugins.register(plugins[k]);\n\t}\n}\n\nChart.platform.initialize();\n\nmodule.exports = Chart;\nif (typeof window !== 'undefined') {\n\twindow.Chart = Chart;\n}\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Legend\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\nChart.Legend = plugins.legend._element;\n\n/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Title\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\nChart.Title = plugins.title._element;\n\n/**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\nChart.pluginService = Chart.plugins;\n\n/**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\nChart.PluginBase = Chart.Element.extend({});\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nChart.canvasHelpers = Chart.helpers.canvas;\n\n/**\n * Provided for backward compatibility, use Chart.layouts instead.\n * @namespace Chart.layoutService\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\nChart.layoutService = Chart.layouts;\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('doughnut', {\n\tanimation: {\n\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\tanimateRotate: true,\n\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\tanimateScale: false\n\t},\n\thover: {\n\t\tmode: 'single'\n\t},\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t// toggle visibility of index if exists\n\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// The percentage of the chart that we cut out of the middle.\n\tcutoutPercentage: 50,\n\n\t// The rotation of the chart, where the first data arc begins.\n\trotation: Math.PI * -0.5,\n\n\t// The total circumference of the chart.\n\tcircumference: Math.PI * 2.0,\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t} else {\n\t\t\t\t\tdataLabel += value;\n\t\t\t\t}\n\n\t\t\t\treturn dataLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\ndefaults._set('pie', helpers.clone(defaults.doughnut));\ndefaults._set('pie', {\n\tcutoutPercentage: 0\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n\t\t\tvar availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n\t\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\t\tvar offset = {x: 0, y: 0};\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\t\tvar circumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (Math.abs(value) / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(arcs) {\n\t\t\tvar max = 0;\n\t\t\tvar index = this.index;\n\t\t\tvar length = arcs.length;\n\t\t\tvar borderWidth;\n\t\t\tvar hoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('bar', {\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\ttype: 'linear'\n\t\t}]\n\t}\n});\n\ndefaults._set('horizontalBar', {\n\thover: {\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'bottom'\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\tposition: 'left',\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Horizontal Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}]\n\t},\n\n\telements: {\n\t\trectangle: {\n\t\t\tborderSkipped: 'left'\n\t\t}\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function(item, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\n\t\t\t\tif (item.length > 0) {\n\t\t\t\t\tif (item[0].yLabel) {\n\t\t\t\t\t\ttitle = item[0].yLabel;\n\t\t\t\t\t} else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n\t\t\t\t\t\ttitle = data.labels[item[0].index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\treturn datasetLabel + ': ' + item.xLabel;\n\t\t\t}\n\t\t},\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t}\n});\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(scale, pixels) {\n\tvar min = scale.isHorizontal() ? scale.width : scale.height;\n\tvar ticks = scale.getTicks();\n\tvar prev, curr, i, ilen;\n\n\tfor (i = 1, ilen = pixels.length; i < ilen; ++i) {\n\t\tmin = Math.min(min, pixels[i] - pixels[i - 1]);\n\t}\n\n\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\tcurr = scale.getPixelForTick(i);\n\t\tmin = i > 0 ? Math.min(min, curr - prev) : min;\n\t\tprev = curr;\n\t}\n\n\treturn min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options) {\n\tvar thickness = options.barThickness;\n\tvar count = ruler.stackCount;\n\tvar curr = ruler.pixels[index];\n\tvar size, ratio;\n\n\tif (helpers.isNullOrUndef(thickness)) {\n\t\tsize = ruler.min * options.categoryPercentage;\n\t\tratio = options.barPercentage;\n\t} else {\n\t\t// When bar thickness is enforced, category and bar percentages are ignored.\n\t\t// Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n\t\t// and deprecate barPercentage since this value is ignored when thickness is absolute.\n\t\tsize = thickness * count;\n\t\tratio = 1;\n\t}\n\n\treturn {\n\t\tchunk: size / count,\n\t\tratio: ratio,\n\t\tstart: curr - (size / 2)\n\t};\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options) {\n\tvar pixels = ruler.pixels;\n\tvar curr = pixels[index];\n\tvar prev = index > 0 ? pixels[index - 1] : null;\n\tvar next = index < pixels.length - 1 ? pixels[index + 1] : null;\n\tvar percent = options.categoryPercentage;\n\tvar start, size;\n\n\tif (prev === null) {\n\t\t// first data: its size is double based on the next point or,\n\t\t// if it's also the last data, we use the scale end extremity.\n\t\tprev = curr - (next === null ? ruler.end - curr : next - curr);\n\t}\n\n\tif (next === null) {\n\t\t// last data: its size is also double based on the previous point.\n\t\tnext = curr + curr - prev;\n\t}\n\n\tstart = curr - ((curr - prev) / 2) * percent;\n\tsize = ((next - prev) / 2) * percent;\n\n\treturn {\n\t\tchunk: size / ruler.stackCount,\n\t\tratio: options.barPercentage,\n\t\tstart: start\n\t};\n}\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Rectangle,\n\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta;\n\n\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\tmeta = me.getMeta();\n\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar i, ilen;\n\n\t\t\tme._ruler = me.getRuler();\n\n\t\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(rects[i], i, reset);\n\t\t\t}\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\trectangle._model = {\n\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t};\n\n\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tupdateElementGeometry: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar model = rectangle._model;\n\t\t\tvar vscale = me.getValueScale();\n\t\t\tvar base = vscale.getBasePixel();\n\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\tmodel.horizontal = horizontal;\n\t\t\tmodel.base = reset ? base : vpixels.base;\n\t\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScale: function() {\n\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScale: function() {\n\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t},\n\n\t\t/**\n\t\t * Returns the stacks based on groups and bar visibility.\n\t\t * @param {Number} [last] - The dataset index\n\t\t * @returns {Array} The stack list\n\t\t * @private\n\t\t */\n\t\t_getStacks: function(last) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\t\tvar stacks = [];\n\t\t\tvar i, meta;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) &&\n\t\t\t\t\t(stacked === false ||\n\t\t\t\t\t(stacked === true && stacks.indexOf(meta.stack) === -1) ||\n\t\t\t\t\t(stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks;\n\t\t},\n\n\t\t/**\n\t\t * Returns the effective number of stacks based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackCount: function() {\n\t\t\treturn this._getStacks().length;\n\t\t},\n\n\t\t/**\n\t\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t\t * @param {Number} [datasetIndex] - The dataset index\n\t\t * @param {String} [name] - The stack name to find\n\t\t * @returns {Number} The stack index\n\t\t * @private\n\t\t */\n\t\tgetStackIndex: function(datasetIndex, name) {\n\t\t\tvar stacks = this._getStacks(datasetIndex);\n\t\t\tvar index = (name !== undefined)\n\t\t\t\t? stacks.indexOf(name)\n\t\t\t\t: -1; // indexOf returns -1 if element is not present\n\n\t\t\treturn (index === -1)\n\t\t\t\t? stacks.length - 1\n\t\t\t\t: index;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stackCount = me.getStackCount();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar isHorizontal = scale.isHorizontal();\n\t\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\t\tvar pixels = [];\n\t\t\tvar i, ilen, min;\n\n\t\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t\t}\n\n\t\t\tmin = helpers.isNullOrUndef(scale.options.barThickness)\n\t\t\t\t? computeMinSampleSize(scale, pixels)\n\t\t\t\t: -1;\n\n\t\t\treturn {\n\t\t\t\tmin: min,\n\t\t\t\tpixels: pixels,\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tstackCount: stackCount,\n\t\t\t\tscale: scale\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Note: pixel values are not clamped to the scale area.\n\t\t * @private\n\t\t */\n\t\tcalculateBarValuePixels: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar value = scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar stack = meta.stack;\n\t\t\tvar start = 0;\n\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\tif (imeta.bar &&\n\t\t\t\t\t\timeta.stack === stack &&\n\t\t\t\t\t\timeta.controller.getValueScaleId() === scale.id &&\n\t\t\t\t\t\tchart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\tivalue = scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\t\tif ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n\t\t\t\t\t\t\tstart += ivalue;\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\tbase = scale.getPixelForValue(start);\n\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\tsize = (head - base) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: head,\n\t\t\t\tcenter: head + size / 2\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tcalculateBarIndexPixels: function(datasetIndex, index, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar options = ruler.scale.options;\n\t\t\tvar range = options.barThickness === 'flex'\n\t\t\t\t? computeFlexCategoryTraits(index, ruler, options)\n\t\t\t\t: computeFitCategoryTraits(index, ruler, options);\n\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n\t\t\tvar center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n\t\t\tvar size = Math.min(\n\t\t\t\thelpers.valueOrDefault(options.maxBarThickness, Infinity),\n\t\t\t\trange.chunk * range.ratio);\n\n\t\t\treturn {\n\t\t\t\tbase: center - size / 2,\n\t\t\t\thead: center + size / 2,\n\t\t\t\tcenter: center,\n\t\t\t\tsize: size\n\t\t\t};\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar ilen = rects.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\t\trects[i].draw();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\t});\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('radar', {\n\tscale: {\n\t\ttype: 'radialLinear'\n\t},\n\telements: {\n\t\tline: {\n\t\t\ttension: 0 // no bezier in radar\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_scale: scale,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('bubble', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\tposition: 'bottom',\n\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tdataElementType: elements.Point,\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar options = me._resolveElementOptions(point, index);\n\t\t\tvar data = me.getDataset().data[index];\n\t\t\tvar dsIndex = me.index;\n\n\t\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n\t\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._options = options;\n\t\t\tpoint._datasetIndex = dsIndex;\n\t\t\tpoint._index = index;\n\t\t\tpoint._model = {\n\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\tborderColor: options.borderColor,\n\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\thitRadius: options.hitRadius,\n\t\t\t\tpointStyle: options.pointStyle,\n\t\t\t\tradius: reset ? 0 : options.radius,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t};\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n\t\t\tmodel.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n\t\t\tmodel.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t\t\tmodel.radius = options.radius + options.hoverRadius;\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = options.backgroundColor;\n\t\t\tmodel.borderColor = options.borderColor;\n\t\t\tmodel.borderWidth = options.borderWidth;\n\t\t\tmodel.radius = options.radius;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\t_resolveElementOptions: function(point, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar dataset = datasets[me.index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar options = chart.options.elements.point;\n\t\t\tvar resolve = helpers.options.resolve;\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar values = {};\n\t\t\tvar i, ilen, key;\n\n\t\t\t// Scriptable options\n\t\t\tvar context = {\n\t\t\t\tchart: chart,\n\t\t\t\tdataIndex: index,\n\t\t\t\tdataset: dataset,\n\t\t\t\tdatasetIndex: me.index\n\t\t\t};\n\n\t\t\tvar keys = [\n\t\t\t\t'backgroundColor',\n\t\t\t\t'borderColor',\n\t\t\t\t'borderWidth',\n\t\t\t\t'hoverBackgroundColor',\n\t\t\t\t'hoverBorderColor',\n\t\t\t\t'hoverBorderWidth',\n\t\t\t\t'hoverRadius',\n\t\t\t\t'hitRadius',\n\t\t\t\t'pointStyle'\n\t\t\t];\n\n\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\tkey = keys[i];\n\t\t\t\tvalues[key] = resolve([\n\t\t\t\t\tcustom[key],\n\t\t\t\t\tdataset[key],\n\t\t\t\t\toptions[key]\n\t\t\t\t], context, index);\n\t\t\t}\n\n\t\t\t// Custom radius resolution\n\t\t\tvalues.radius = resolve([\n\t\t\t\tcustom.radius,\n\t\t\t\tdata ? data.r : undefined,\n\t\t\t\tdataset.radius,\n\t\t\t\toptions.radius\n\t\t\t], context, index);\n\n\t\t\treturn values;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar Element = require('./core.element');\nvar helpers = require('../helpers/index');\nvar Ticks = require('./core.ticks');\n\ndefaults._set('scale', {\n\tdisplay: true,\n\tposition: 'left',\n\toffset: false,\n\n\t// grid line settings\n\tgridLines: {\n\t\tdisplay: true,\n\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\tlineWidth: 1,\n\t\tdrawBorder: true,\n\t\tdrawOnChartArea: true,\n\t\tdrawTicks: true,\n\t\ttickMarkLength: 10,\n\t\tzeroLineWidth: 1,\n\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\tzeroLineBorderDash: [],\n\t\tzeroLineBorderDashOffset: 0.0,\n\t\toffsetGridLines: false,\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0\n\t},\n\n\t// scale label\n\tscaleLabel: {\n\t\t// display property\n\t\tdisplay: false,\n\n\t\t// actual label\n\t\tlabelString: '',\n\n\t\t// line height\n\t\tlineHeight: 1.2,\n\n\t\t// top/bottom padding\n\t\tpadding: {\n\t\t\ttop: 4,\n\t\t\tbottom: 4\n\t\t}\n\t},\n\n\t// label settings\n\tticks: {\n\t\tbeginAtZero: false,\n\t\tminRotation: 0,\n\t\tmaxRotation: 50,\n\t\tmirror: false,\n\t\tpadding: 0,\n\t\treverse: false,\n\t\tdisplay: true,\n\t\tautoSkip: true,\n\t\tautoSkipPadding: 0,\n\t\tlabelOffset: 0,\n\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\tcallback: Ticks.formatters.values,\n\t\tminor: {},\n\t\tmajor: {}\n\t}\n});\n\nfunction labelsFromTicks(ticks) {\n\tvar labels = [];\n\tvar i, ilen;\n\n\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\tlabels.push(ticks[i].label);\n\t}\n\n\treturn labels;\n}\n\nfunction getLineValue(scale, index, offsetGridLines) {\n\tvar lineValue = scale.getPixelForTick(index);\n\n\tif (offsetGridLines) {\n\t\tif (index === 0) {\n\t\t\tlineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n\t\t} else {\n\t\t\tlineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n\t\t}\n\t}\n\treturn lineValue;\n}\n\nmodule.exports = function(Chart) {\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar globalDefaults = defaults.global;\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tfunction parseLineHeight(options) {\n\t\treturn helpers.options.toLineHeight(\n\t\t\thelpers.valueOrDefault(options.lineHeight, 1.2),\n\t\t\thelpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n\t}\n\n\tChart.Scale = Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Returns the scale tick objects ({label, major})\n\t\t * @since 2.7\n\t\t */\n\t\tgetTicks: function() {\n\t\t\treturn this._ticks;\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tmergeTicksOptions: function() {\n\t\t\tvar ticks = this.options.ticks;\n\t\t\tif (ticks.minor === false) {\n\t\t\t\tticks.minor = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (ticks.major === false) {\n\t\t\t\tticks.major = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tfor (var key in ticks) {\n\t\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\t\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t\t// around for long time and not marked as private, we can't change its structure\n\t\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t\t// use scale.getTicks() instead.\n\n\t\t\tme.beforeBuildTicks();\n\n\t\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\t\tticks = me.buildTicks() || [];\n\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\n\t\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t\t// this method and supposed to contain only string values).\n\t\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\tme.ticks = labels; // BACKWARD COMPATIBILITY\n\n\t\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\t\tlabel = labels[i];\n\t\t\t\ttick = ticks[i];\n\t\t\t\tif (!tick) {\n\t\t\t\t\tticks.push(tick = {\n\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\tmajor: false\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttick.label = label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme._ticks = ticks;\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tvar scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n\t\t\t\tvar deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += deltaHeight;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += deltaHeight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * (tallestLabelHeightInLines - 1))\n\t\t\t\t\t\t+ lineSpace; // padding\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t\t}\n\n\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (helpers.isNullOrUndef(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof rawValue === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (rawValue) {\n\t\t\t\tif (this.isHorizontal()) {\n\t\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t\t}\n\t\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t/**\n\t\t * Used to get the value to display in the tooltip for the data at the given index\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param value\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t/**\n\t\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param pixel\n\t\t */\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the tick at the given index\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (offset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me._ticks.length - 1)));\n\t\t},\n\n\t\t/**\n\t\t * Utility for getting the pixel location of a percentage of scale\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForDecimal: function(decimal) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\t/**\n\t\t * Returns the pixel for the minimum chart value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: 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.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\t/**\n\t\t * Returns a subset of ticks to be plotted to avoid overlapping labels.\n\t\t * @private\n\t\t */\n\t\t_autoSkip: function(ticks) {\n\t\t\tvar skipRatio;\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar optionTicks = me.options.ticks.minor;\n\t\t\tvar tickCount = ticks.length;\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\t\t\tvar result = [];\n\t\t\tvar i, tick, shouldSkip;\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && tickCount > maxTicks) {\n\t\t\t\t\tskipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\t\ttick = ticks[i];\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tshouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n\t\t\t\tif (shouldSkip && i !== tickCount - 1) {\n\t\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\t\tdelete tick.label;\n\t\t\t\t}\n\t\t\t\tresult.push(tick);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = defaults.global;\n\t\t\tvar optionTicks = options.ticks.minor;\n\t\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\t\tvar tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\t\t\tvar majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar majorTickFont = parseFontOptions(optionMajorTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\tvar scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tvar axisWidth = me.options.gridLines.lineWidth;\n\t\t\tvar xTickStart = options.position === 'right' ? me.right : me.right - axisWidth - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.right + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top + axisWidth : me.bottom - tl - axisWidth;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + axisWidth + tl : me.bottom + axisWidth;\n\n\t\t\thelpers.each(ticks, function(tick, index) {\n\t\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\t\tif (helpers.isNullOrUndef(tick.label)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar label = tick.label;\n\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\tborderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\tborderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\t\t\t\tvar tickPadding = optionTicks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'top' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'bottom' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (xLineValue < me.left) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\txLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom + axisWidth;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (yLineValue < me.top) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right + axisWidth;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tmajor: tick.major,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n\t\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tvar lineCount = label.length;\n\t\t\t\t\t\tvar lineHeight = tickFont.size * 1.5;\n\t\t\t\t\t\tvar y = me.isHorizontal() ? 0 : -lineHeight * (lineCount - 1) / 2;\n\n\t\t\t\t\t\tfor (var i = 0; i < lineCount; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\t\t\t\tvar halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom'\n\t\t\t\t\t\t? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n\t\t\t\t\t\t: me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft\n\t\t\t\t\t\t? me.left + halfLineHeight + scaleLabelPadding.top\n\t\t\t\t\t\t: me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left;\n\t\t\t\tvar x2 = me.right + axisWidth;\n\t\t\t\tvar y1 = me.top;\n\t\t\t\tvar y2 = me.bottom + axisWidth;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\nfunction filterByPosition(array, position) {\n\treturn helpers.where(array, function(v) {\n\t\treturn v.position === position;\n\t});\n}\n\nfunction sortByWeight(array, reverse) {\n\tarray.forEach(function(v, i) {\n\t\tv._tmpIndex_ = i;\n\t\treturn v;\n\t});\n\tarray.sort(function(a, b) {\n\t\tvar v0 = reverse ? b : a;\n\t\tvar v1 = reverse ? a : b;\n\t\treturn v0.weight === v1.weight ?\n\t\t\tv0._tmpIndex_ - v1._tmpIndex_ :\n\t\t\tv0.weight - v1.weight;\n\t});\n\tarray.forEach(function(v) {\n\t\tdelete v._tmpIndex_;\n\t});\n}\n\n/**\n * @interface ILayoutItem\n * @prop {String} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n * @prop {Function} getPadding - Returns an object with padding on the edges\n * @prop {Number} width - Width of item. Must be valid after update()\n * @prop {Number} height - Height of item. Must be valid after update()\n * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nmodule.exports = {\n\tdefaults: {},\n\n\t/**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {ILayoutItem} item - the item to add to be layed out\n\t */\n\taddBox: function(chart, item) {\n\t\tif (!chart.boxes) {\n\t\t\tchart.boxes = [];\n\t\t}\n\n\t\t// initialize item with default values\n\t\titem.fullWidth = item.fullWidth || false;\n\t\titem.position = item.position || 'top';\n\t\titem.weight = item.weight || 0;\n\n\t\tchart.boxes.push(item);\n\t},\n\n\t/**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {Object} layoutItem - the item to remove from the layout\n\t */\n\tremoveBox: function(chart, layoutItem) {\n\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\tif (index !== -1) {\n\t\t\tchart.boxes.splice(index, 1);\n\t\t}\n\t},\n\n\t/**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {Object} item - the item to configure with the given options\n\t * @param {Object} options - the new item options.\n\t */\n\tconfigure: function(chart, item, options) {\n\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\tvar ilen = props.length;\n\t\tvar i = 0;\n\t\tvar prop;\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\tprop = props[i];\n\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\titem[prop] = options[prop];\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {Number} width - the width to fit into\n\t * @param {Number} height - the height to fit into\n\t */\n\tupdate: function(chart, width, height) {\n\t\tif (!chart) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar layoutOptions = chart.options.layout || {};\n\t\tvar padding = helpers.options.toPadding(layoutOptions.padding);\n\t\tvar leftPadding = padding.left;\n\t\tvar rightPadding = padding.right;\n\t\tvar topPadding = padding.top;\n\t\tvar bottomPadding = padding.bottom;\n\n\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\tsortByWeight(leftBoxes, true);\n\t\tsortByWeight(rightBoxes, false);\n\t\tsortByWeight(topBoxes, true);\n\t\tsortByWeight(bottomBoxes, false);\n\n\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t// Our canvas looks like the following.\n\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t// B1 is the bottom axis\n\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t// an error will be thrown.\n\t\t//\n\t\t// |----------------------------------------------------|\n\t\t// | T1 (Full Width) |\n\t\t// |----------------------------------------------------|\n\t\t// | | | T2 | |\n\t\t// | |----|-------------------------------------|----|\n\t\t// | | | C1 | | C2 | |\n\t\t// | | |----| |----| |\n\t\t// | | | | |\n\t\t// | L1 | L2 | ChartArea (C0) | R1 |\n\t\t// | | | | |\n\t\t// | | |----| |----| |\n\t\t// | | | C3 | | C4 | |\n\t\t// | |----|-------------------------------------|----|\n\t\t// | | | B1 | |\n\t\t// |----------------------------------------------------|\n\t\t// | B2 (Full Width) |\n\t\t// |----------------------------------------------------|\n\t\t//\n\t\t// What we do to find the best sizing, we do the following\n\t\t// 1. Determine the minimum size of the chart area.\n\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t// 6. Refit each axis\n\t\t// 7. Position each axis in the final location\n\t\t// 8. Tell the chart the final location of the chart area\n\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t// Step 1\n\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t// Step 2\n\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t// Step 3\n\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t// Step 4\n\t\tvar maxChartAreaWidth = chartWidth;\n\t\tvar maxChartAreaHeight = chartHeight;\n\t\tvar minBoxSizes = [];\n\n\t\tfunction getMinimumBoxSize(box) {\n\t\t\tvar minSize;\n\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t} else {\n\t\t\t\tminSize = box.update(verticalBoxWidth, maxChartAreaHeight);\n\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t}\n\n\t\t\tminBoxSizes.push({\n\t\t\t\thorizontal: isHorizontal,\n\t\t\t\tminSize: minSize,\n\t\t\t\tbox: box,\n\t\t\t});\n\t\t}\n\n\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\tvar maxHorizontalLeftPadding = 0;\n\t\tvar maxHorizontalRightPadding = 0;\n\t\tvar maxVerticalTopPadding = 0;\n\t\tvar maxVerticalBottomPadding = 0;\n\n\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t}\n\t\t});\n\n\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\tif (verticalBox.getPadding) {\n\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t}\n\t\t});\n\n\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t// be if the axes are drawn at their minimum sizes.\n\t\t// Steps 5 & 6\n\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\tvar totalRightBoxesWidth = rightPadding;\n\t\tvar totalTopBoxesHeight = topPadding;\n\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t// Function to fit a box\n\t\tfunction fitBox(box) {\n\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\treturn minBox.box === box;\n\t\t\t});\n\n\t\t\tif (minBoxSize) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t};\n\n\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t} else {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\thelpers.each(leftBoxes, function(box) {\n\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t});\n\n\t\thelpers.each(rightBoxes, function(box) {\n\t\t\ttotalRightBoxesWidth += box.width;\n\t\t});\n\n\t\t// Set the Left and Right margins for the horizontal boxes\n\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\thelpers.each(topBoxes, function(box) {\n\t\t\ttotalTopBoxesHeight += box.height;\n\t\t});\n\n\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t});\n\n\t\tfunction finalFitVerticalBox(box) {\n\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\treturn minSize.box === box;\n\t\t\t});\n\n\t\t\tvar scaleMargin = {\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t};\n\n\t\t\tif (minBoxSize) {\n\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t}\n\t\t}\n\n\t\t// Let the left layout know the final margin\n\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\ttotalLeftBoxesWidth = leftPadding;\n\t\ttotalRightBoxesWidth = rightPadding;\n\t\ttotalTopBoxesHeight = topPadding;\n\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\thelpers.each(leftBoxes, function(box) {\n\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t});\n\n\t\thelpers.each(rightBoxes, function(box) {\n\t\t\ttotalRightBoxesWidth += box.width;\n\t\t});\n\n\t\thelpers.each(topBoxes, function(box) {\n\t\t\ttotalTopBoxesHeight += box.height;\n\t\t});\n\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t});\n\n\t\t// We may be adding some padding to account for rotated x axis labels\n\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t// without calling `fit` again\n\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t}\n\n\t\t// Step 7 - Position the boxes\n\t\tvar left = leftPadding + leftPaddingAddition;\n\t\tvar top = topPadding + topPaddingAddition;\n\n\t\tfunction placeBox(box) {\n\t\t\tif (box.isHorizontal()) {\n\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\tbox.top = top;\n\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t// Move to next point\n\t\t\t\ttop = box.bottom;\n\n\t\t\t} else {\n\n\t\t\t\tbox.left = left;\n\t\t\t\tbox.right = left + box.width;\n\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t// Move to next point\n\t\t\t\tleft = box.right;\n\t\t\t}\n\t\t}\n\n\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t// Account for chart width and height\n\t\tleft += maxChartAreaWidth;\n\t\ttop += maxChartAreaHeight;\n\n\t\thelpers.each(rightBoxes, placeBox);\n\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t// Step 8\n\t\tchart.chartArea = {\n\t\t\tleft: totalLeftBoxesWidth,\n\t\t\ttop: totalTopBoxesHeight,\n\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t};\n\n\t\t// Step 9\n\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\tbox.left = chart.chartArea.left;\n\t\t\tbox.top = chart.chartArea.top;\n\t\t\tbox.right = chart.chartArea.right;\n\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t});\n\t}\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nmodule.exports = {\n\t/**\n\t * Namespace to hold formatters for different types of ticks\n\t * @namespace Chart.Ticks.formatters\n\t */\n\tformatters: {\n\t\t/**\n\t\t * Formatter for value labels\n\t\t * @method Chart.Ticks.formatters.values\n\t\t * @param value the value to display\n\t\t * @return {String|Array} the label to display\n\t\t */\n\t\tvalues: function(value) {\n\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t},\n\n\t\t/**\n\t\t * Formatter for linear numeric ticks\n\t\t * @method Chart.Ticks.formatters.linear\n\t\t * @param tickValue {Number} the value to be formatted\n\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t * @param ticks {Array} the list of ticks being converted\n\t\t * @return {String} string representation of the tickValue parameter\n\t\t */\n\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t// not an integer\n\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\tvar tickString = '';\n\n\t\t\tif (tickValue !== 0) {\n\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t} else {\n\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t}\n\n\t\t\treturn tickString;\n\t\t},\n\n\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\tif (tickValue === 0) {\n\t\t\t\treturn '0';\n\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\treturn tickValue.toExponential();\n\t\t\t}\n\t\t\treturn '';\n\t\t}\n\t}\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\n/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\nfunction getRelativePosition(e, chart) {\n\tif (e.native) {\n\t\treturn {\n\t\t\tx: e.x,\n\t\t\ty: e.y\n\t\t};\n\t}\n\n\treturn helpers.getRelativePosition(e, chart);\n}\n\n/**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\nfunction parseVisibleItems(chart, handler) {\n\tvar datasets = chart.data.datasets;\n\tvar meta, i, j, ilen, jlen;\n\n\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tmeta = chart.getDatasetMeta(i);\n\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\tvar element = meta.data[j];\n\t\t\tif (!element._view.skip) {\n\t\t\t\thandler(element);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\nfunction getIntersectItems(chart, position) {\n\tvar elements = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (element.inRange(position.x, position.y)) {\n\t\t\telements.push(element);\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\nfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\tvar minDistance = Number.POSITIVE_INFINITY;\n\tvar nearestItems = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar center = element.getCenterPoint();\n\t\tvar distance = distanceMetric(position, center);\n\n\t\tif (distance < minDistance) {\n\t\t\tnearestItems = [element];\n\t\t\tminDistance = distance;\n\t\t} else if (distance === minDistance) {\n\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\tnearestItems.push(element);\n\t\t}\n\t});\n\n\treturn nearestItems;\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {String} axis the axis mode. x|y|xy\n */\nfunction getDistanceMetricForAxis(axis) {\n\tvar useX = axis.indexOf('x') !== -1;\n\tvar useY = axis.indexOf('y') !== -1;\n\n\treturn function(pt1, pt2) {\n\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t};\n}\n\nfunction indexMode(chart, e, options) {\n\tvar position = getRelativePosition(e, chart);\n\t// Default axis for index mode is 'x' to match old behaviour\n\toptions.axis = options.axis || 'x';\n\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\tvar elements = [];\n\n\tif (!items.length) {\n\t\treturn [];\n\t}\n\n\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\tvar element = meta.data[items[0]._index];\n\n\t\t\t// don't count items that are skipped (null data)\n\t\t\tif (element && !element._view.skip) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * @interface IInteractionOptions\n */\n/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nmodule.exports = {\n\t// Helper function for different modes\n\tmodes: {\n\t\tsingle: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar elements = [];\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t\treturn elements;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn elements.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.label\n\t\t * @deprecated since version 2.4.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tlabel: indexMode,\n\n\t\t/**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tindex: indexMode,\n\n\t\t/**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tdataset: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\tif (items.length > 0) {\n\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.x-axis\n\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\t'x-axis': function(chart, e) {\n\t\t\treturn indexMode(chart, e, {intersect: false});\n\t\t},\n\n\t\t/**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tpoint: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\treturn getIntersectItems(chart, position);\n\t\t},\n\n\t\t/**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tnearest: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\tif (nearestItems.length > 1) {\n\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Return only 1 item\n\t\t\treturn nearestItems.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tx: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\ty: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t}\n\t}\n};\n","/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require('chartjs-color');\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\n\nmodule.exports = function(Chart) {\n\n\t// -- Basic js utility methods\n\n\thelpers.configMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tvar tval = target[key] || {};\n\t\t\t\tvar sval = source[key];\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\t\ttarget[key] = helpers.scaleMerge(tval, sval);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\t\ttarget[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.scaleMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t\tvar slen = source[key].length;\n\t\t\t\t\tvar i, type, scale;\n\n\t\t\t\t\tif (!target[key]) {\n\t\t\t\t\t\ttarget[key] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\t\ttype = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n\t\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\n\t\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\t\thelpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\t\thelpers.merge(target[key][i], scale);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex ?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined ? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign ?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10 ?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tvar exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n\t\t\t// Check for whole powers of 10,\n\t\t\t// which due to floating point rounding error should be corrected.\n\t\t\tvar powerOf10 = Math.round(exponent);\n\t\t\tvar isPowerOf10 = x === Math.pow(10, powerOf10);\n\n\t\t\treturn isPowerOf10 ? powerOf10 : exponent;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\n\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\n\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\n\t\tvar current = middlePoint;\n\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn function(callback) {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t}\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt;\n\t\tvar canvas = evt.currentTarget || evt.srcElement;\n\t\tvar boundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof styleValue === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientWidth;\n\t\t}\n\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientHeight;\n\t\t}\n\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart, forceRatio) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tif (!canvas.style.height && !canvas.style.width) {\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tcanvas.style.width = width + 'px';\n\t\t}\n\t};\n\t// -- Canvas methods\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\n\thelpers.color = !color ?\n\t\tfunction(value) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn value;\n\t\t} :\n\t\tfunction(value) {\n\t\t\t/* global CanvasGradient */\n\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\tvalue = defaults.global.defaultColor;\n\t\t\t}\n\n\t\t\treturn color(value);\n\t\t};\n\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\nvar layouts = require('./core.layouts');\n\nmodule.exports = function(Chart) {\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, scaleDefaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(scaleDefaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar me = this;\n\t\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\t\tme.defaults[type] = helpers.extend(me.defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chart) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chart.scales, function(scale) {\n\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\tscale.position = scale.options.position;\n\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\tlayouts.addBox(chart, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar Element = require('./core.element');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\ttooltips: {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretPadding: 2,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tborderColor: 'rgba(0,0,0,0)',\n\t\tborderWidth: 0,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\tif (label) {\n\t\t\t\t\tlabel += ': ';\n\t\t\t\t}\n\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\treturn label;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chart) {\n\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tlabelTextColor: function() {\n\t\t\t\treturn this._options.bodyFontColor;\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index;\n\t\tvar datasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = defaults.global;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize;\n\t\tvar bodyFontSize = model.bodyFontSize;\n\t\tvar footerFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chart.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width + model.caretSize + model.caretPadding > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width - model.caretSize - model.caretPadding < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n\t */\n\tfunction getBackgroundPoint(vm, size, alignment, chart) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize;\n\t\tvar caretPadding = vm.caretPadding;\n\t\tvar cornerRadius = vm.cornerRadius;\n\t\tvar xAlign = alignment.xAlign;\n\t\tvar yAlign = alignment.yAlign;\n\t\tvar paddingAndSize = caretSize + caretPadding;\n\t\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t\tif (x + size.width > chart.width) {\n\t\t\t\tx = chart.width - size.width;\n\t\t\t}\n\t\t\tif (x < 0) {\n\t\t\t\tx = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t\tthis._lastActive = [];\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\t\tvar title = callbacks.title.apply(me, arguments);\n\t\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\tvar labelTextColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t\t});\n\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\tmodel.labelColors = labelColors;\n\t\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size) {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t},\n\t\tgetCaretPosition: function(tooltipPoint, size, vm) {\n\t\t\tvar x1, x2, x3, y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x;\n\t\t\tvar ptY = tooltipPoint.y;\n\t\t\tvar width = size.width;\n\t\t\tvar height = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\ty2 = ptY + (height / 2);\n\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = vm.caretX;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t\t// invert drawing order\n\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t\tx1 = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\tctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\tvar textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar x = pt.x;\n\t\t\tvar y = pt.y;\n\t\t\tvar width = tooltipSize.width;\n\t\t\tvar height = tooltipSize.height;\n\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x + radius, y);\n\t\t\tif (yAlign === 'top') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\tif (yAlign === 'bottom') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x, y + radius);\n\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\tctx.closePath();\n\n\t\t\tctx.fill();\n\n\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t// Only handle target event on tooltip change\n\t\t\tif (changed) {\n\t\t\t\tme._lastActive = me._active;\n\n\t\t\t\tif (options.enabled || options.custom) {\n\t\t\t\t\tme._eventPosition = {\n\t\t\t\t\t\tx: e.x,\n\t\t\t\t\t\ty: e.y\n\t\t\t\t\t};\n\n\t\t\t\t\tme.update(true);\n\t\t\t\t\tme.pivot();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len, nearestElement;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t};\n\t\t}\n\t};\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\n\ndefaults._set('global', {\n\tresponsive: true,\n\tresponsiveAnimationDuration: 0,\n\tmaintainAspectRatio: true,\n\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\thover: {\n\t\tonHover: null,\n\t\tmode: 'nearest',\n\t\tintersect: true,\n\t\tanimationDuration: 400\n\t},\n\tonClick: null,\n\tdefaultColor: 'rgba(0,0,0,0.1)',\n\tdefaultFontColor: '#666',\n\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\tdefaultFontSize: 12,\n\tdefaultFontStyle: 'normal',\n\tshowLines: true,\n\n\t// Element defaults defined in element extensions\n\telements: {},\n\n\t// Layout options such as padding\n\tlayout: {\n\t\tpadding: {\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0\n\t\t}\n\t}\n});\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.construct(item, config);\n\t\treturn this;\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\n\ndefaults._set('scatter', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\tid: 'x-axis-1', // need an ID so datasets can reference the scale\n\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\tposition: 'bottom'\n\t\t}],\n\t\tyAxes: [{\n\t\t\tid: 'y-axis-1',\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left'\n\t\t}]\n\t},\n\n\tshowLines: false,\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn ''; // doesn't make sense for scatter since data are formatted as a point\n\t\t\t},\n\t\t\tlabel: function(item) {\n\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\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('polarArea', {\n\tscale: {\n\t\ttype: 'radialLinear',\n\t\tangleLines: {\n\t\t\tdisplay: false\n\t\t},\n\t\tgridLines: {\n\t\t\tcircular: true\n\t\t},\n\t\tpointLabels: {\n\t\t\tdisplay: false\n\t\t},\n\t\tticks: {\n\t\t\tbeginAtZero: true\n\t\t}\n\t},\n\n\t// Boolean - Whether to animate the rotation of the chart\n\tanimation: {\n\t\tanimateRotate: true,\n\t\tanimateScale: true\n\t},\n\n\tstartAngle: -0.5 * Math.PI,\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\nvar Interaction = require('./core.interaction');\nvar layouts = require('./core.layouts');\nvar platform = require('../platforms/platform');\nvar plugins = require('./core.plugins');\n\nmodule.exports = function(Chart) {\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tdefaults.global,\n\t\t\tdefaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\thelpers.each(chart.scales, function(scale) {\n\t\t\tlayouts.removeBox(chart, scale);\n\t\t});\n\n\t\tnewOptions = helpers.configMerge(\n\t\t\tChart.defaults.global,\n\t\t\tChart.defaults[chart.config.type],\n\t\t\tnewOptions);\n\n\t\tchart.options = chart.config.options = newOptions;\n\t\tchart.ensureScalesHaveIDs();\n\t\tchart.buildOrUpdateScales();\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t\tchart.tooltip.initialize();\n\t}\n\n\tfunction positionIsHorizontal(position) {\n\t\treturn position === 'top' || position === 'bottom';\n\t}\n\n\thelpers.extend(Chart.prototype, /** @lends Chart */ {\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tconstruct: function(item, config) {\n\t\t\tvar me = this;\n\n\t\t\tconfig = initConfig(config);\n\n\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\tvar canvas = context && context.canvas;\n\t\t\tvar height = canvas && canvas.height;\n\t\t\tvar width = canvas && canvas.width;\n\n\t\t\tme.id = helpers.uid();\n\t\t\tme.ctx = context;\n\t\t\tme.canvas = canvas;\n\t\t\tme.config = config;\n\t\t\tme.width = width;\n\t\t\tme.height = height;\n\t\t\tme.aspectRatio = height ? width / height : null;\n\t\t\tme.options = config.options;\n\t\t\tme._bufferedRender = false;\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n\t\t\t * the \"instance\" still need to be defined since it might be called from plugins.\n\t\t\t * @prop Chart#chart\n\t\t\t * @deprecated since version 2.6.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tme.chart = me;\n\t\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t\t// Add the chart instance to the global namespace\n\t\t\tChart.instances[me.id] = me;\n\n\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn me.config.data;\n\t\t\t\t},\n\t\t\t\tset: function(value) {\n\t\t\t\t\tme.config.data = value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!context || !canvas) {\n\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tme.initialize();\n\t\t\tme.update();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me, me.options.devicePixelRatio);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildOrUpdateScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.canvas.clear(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n\t\t\tvar newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n\t\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = me.width = newWidth;\n\t\t\tcanvas.height = me.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(me, options.devicePixelRatio);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildOrUpdateScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales || {};\n\t\t\tvar items = [];\n\t\t\tvar updated = Object.keys(scales).reduce(function(obj, id) {\n\t\t\t\tobj[id] = false;\n\t\t\t\treturn obj;\n\t\t\t}, {});\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({\n\t\t\t\t\toptions: options.scale,\n\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\tisDefault: true,\n\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar id = scaleOptions.id;\n\t\t\t\tvar scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n\n\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t}\n\n\t\t\t\tupdated[id] = true;\n\t\t\t\tvar scale = null;\n\t\t\t\tif (id in scales && scales[id].type === scaleType) {\n\t\t\t\t\tscale = scales[id];\n\t\t\t\t\tscale.options = scaleOptions;\n\t\t\t\t\tscale.ctx = me.ctx;\n\t\t\t\t\tscale.chart = me;\n\t\t\t\t} else {\n\t\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\t\tif (!scaleClass) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tscale = new scaleClass({\n\t\t\t\t\t\tid: id,\n\t\t\t\t\t\ttype: scaleType,\n\t\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\t\tchart: me\n\t\t\t\t\t});\n\t\t\t\t\tscales[scale.id] = scale;\n\t\t\t\t}\n\n\t\t\t\tscale.mergeTicksOptions();\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// clear up discarded scales\n\t\t\thelpers.each(updated, function(hasUpdated, id) {\n\t\t\t\tif (!hasUpdated) {\n\t\t\t\t\tdelete scales[id];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.scales = scales;\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t}\n\t\t\t\tmeta.type = type;\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t\tmeta.controller.linkScales();\n\t\t\t\t} else {\n\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tupdateConfig(me);\n\n\t\t\t// plugins options references might have change, let's invalidate the cache\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t\t\tplugins._invalidate(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\tif (me.options.animation && me.options.animation.duration) {\n\t\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\t\tcontroller.reset();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t\t// after update.\n\t\t\tme.tooltip.initialize();\n\n\t\t\t// Last active contains items that were previously in the tooltip.\n\t\t\t// When we reset the tooltip, we need to clear it\n\t\t\tme.lastActive = [];\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tduration: config.duration,\n\t\t\t\t\teasing: config.easing,\n\t\t\t\t\tlazy: config.lazy\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(config);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlayouts.update(this, this.width, this.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.updateDataset(i);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\t/**\n\t\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDataset: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.update();\n\n\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t},\n\n\t\trender: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar duration = config.duration;\n\t\t\tvar lazy = config.lazy;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function(animation) {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation({\n\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\t\trender: function(chart, animationObject) {\n\t\t\t\t\t\tvar easingFunction = helpers.easing.effects[animationObject.easing];\n\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t},\n\n\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t});\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\n\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\tonComplete(new Chart.Animation({numSteps: 0, chart: me}));\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (helpers.isNullOrUndef(easingValue)) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tme.transition(easingValue);\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\t\t\tme._drawTooltip(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\ttransition: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.tooltip.transition(easingValue);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDataset: function(index, easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t},\n\n\t\t/**\n\t\t * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n\t\t * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n\t\t * @private\n\t\t */\n\t\t_drawTooltip: function(easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\t\t\tvar args = {\n\t\t\t\ttooltip: tooltip,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttooltip.draw();\n\n\t\t\tplugins.notify(me, 'afterTooltipDraw', [args]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroyDatasetMeta: function(datasetIndex) {\n\t\t\tvar id = this.id;\n\t\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\t\tif (meta) {\n\t\t\t\tmeta.controller.destroy();\n\t\t\t\tdelete dataset._meta[id];\n\t\t\t}\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.destroyDatasetMeta(i);\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.canvas.clear(me);\n\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\tme.canvas = null;\n\t\t\t\tme.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me,\n\t\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\t// for smooth tooltip animations issue #4989\n\t\t\t// the tooltip should be the source of change\n\t\t\t// Animation check workaround:\n\t\t\t// tooltip._start will be null when tooltip isn't animating\n\t\t\tif (tooltip) {\n\t\t\t\tchanged = tooltip._start\n\t\t\t\t\t? tooltip.handleEvent(e)\n\t\t\t\t\t: changed | tooltip.handleEvent(e);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// Invoke onHover hook\n\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\thelpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart instead.\n\t * @class Chart.Controller\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.Controller = Chart;\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n"],"sourceRoot":""}