{"version":3,"sources":["webpack:///./node_modules/vue-chartjs/es/mixins/index.js","webpack:///./node_modules/vue-chartjs/es/BaseCharts.js","webpack:///./node_modules/chart.js/dist/Chart.js"],"names":["dataHandler","newData","oldData","chart","this","$data","_chart","newDatasetLabels","datasets","map","dataset","label","oldDatasetLabels","oldLabels","JSON","stringify","newLabels","length","forEach","i","oldDatasetKeys","Object","keys","newDatasetKeys","deletionKeys","filter","key","indexOf","attribute","deletionKey","data","hasOwnProperty","labels","$emit","xLabels","yLabels","update","destroy","renderChart","chartData","options","reactiveData","watch","reactiveProp","props","type","required","default","generateChart","chartId","chartType","render","createElement","style","styles","class","cssClasses","attrs","id","width","height","ref","String","Number","plugins","Array","_plugins","methods","addPlugin","plugin","push","generateLegend","$refs","canvas","getContext","beforeDestroy","Bar","Line","global","factory","module","exports","e","moment","conversions","rgb2hsl","rgb2hsv","rgb2hwb","rgb2cmyk","rgb2keyword","rgb2xyz","rgb2lab","rgb2lch","hsl2rgb","hsl2hsv","hsl2hwb","hsl2cmyk","hsl2keyword","hsv2rgb","hsv2hsl","hsv2hwb","hsv2cmyk","hsv2keyword","hwb2rgb","hwb2hsl","hwb2hsv","hwb2cmyk","hwb2keyword","cmyk2rgb","cmyk2hsl","cmyk2hsv","cmyk2hwb","cmyk2keyword","keyword2rgb","keyword2hsl","keyword2hsv","keyword2hwb","keyword2cmyk","keyword2lab","keyword2xyz","xyz2rgb","xyz2lab","xyz2lch","lab2xyz","lab2rgb","lab2lch","lch2lab","lch2xyz","lch2rgb","rgb","h","s","l","r","g","b","min","Math","max","delta","v","w","c","m","y","k","reverseKeywords","pow","x","z","a","xyz","args","hsl","t1","t2","t3","val","sv","hsv","hi","floor","f","p","q","t","sl","hwb","n","wh","bl","ratio","cmyk","lab","y2","hr","atan2","PI","sqrt","lch","cos","sin","keyword","cssKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","convert","Converter","func","arg","prototype","slice","call","arguments","pair","exec","from","to","undefined","round","convs","routeSpace","space","values","getValues","setValues","vals","fspace","colorConvert","colorName","colorString","getRgba","getHsla","getRgb","getHsl","getHwb","getAlpha","hexString","rgbString","rgbaString","percentString","percentaString","hslString","hslaString","hwbString","string","abbr","hex","rgba","per","match","hexAlpha","parseInt","parseFloat","scale","alpha","isNaN","hsla","hexDouble","reverseNames","num","str","toString","toUpperCase","name","Color","obj","valid","lightness","value","whiteness","isValid","setSpace","rgbArray","hslArray","hsvArray","hwbArray","concat","cmykArray","rgbaArray","hslaArray","setChannel","hue","saturation","saturationv","blackness","rgbNumber","luminosity","lum","chan","contrast","color2","lum1","lum2","level","contrastRatio","dark","yiq","light","negate","lighten","darken","saturate","desaturate","whiten","blacken","greyscale","clearer","opaquer","rotate","degrees","mix","mixinColor","weight","color1","w1","w2","toJSON","clone","result","source","target","prop","console","error","spaces","maxes","charAt","capped","chans","sname","index","svalues","window","chartjsColor","helpers","noop","uid","isNullOrUndef","isArray","substr","isObject","isFinite","valueOrDefault","defaultValue","valueAtIndexOrDefault","callback","fn","thisArg","apply","each","loopable","reverse","len","arrayEquals","a0","a1","ilen","v0","v1","klen","_merger","tval","sval","merge","_mergerIf","mergeIf","sources","merger","extend","setFn","inherits","extensions","me","ChartElement","constructor","Surrogate","__super__","helpers_core","callCallback","array","item","fromIndex","getValueOrDefault","getValueAtIndexOrDefault","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","helpers_easing","easingEffects","RAD_PER_DEG","DOUBLE_PI","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","exports$1","clear","ctx","clearRect","roundedRect","radius","left","top","right","bottom","moveTo","arc","closePath","rect","drawPoint","rotation","xOffset","yOffset","size","cornerRadius","rad","drawImage","beginPath","lineTo","SQRT1_2","fill","stroke","_isPointInArea","point","area","epsilon","clipArea","save","clip","unclipArea","restore","previous","flip","stepped","steppedLine","midpoint","tension","bezierCurveTo","controlPointPreviousX","controlPointNextX","controlPointPreviousY","controlPointNextY","helpers_canvas","drawRoundedRectangle","defaults","_set","scope","defaultColor","defaultFontColor","defaultFontFamily","defaultFontSize","defaultFontStyle","defaultLineHeight","showLines","core_defaults","toFontString","font","family","helpers_options","toLineHeight","matches","toPadding","_parseFont","globalDefaults","fontSize","fontFamily","lineHeight","fontStyle","resolve","inputs","context","helpers$1","easing","interpolate","start","view","model","ease","actual","origin","c0","c1","Element","configuration","initialize","hidden","pivot","_view","_model","_start","transition","tooltipPosition","hasValue","isNumber","core_element","exports$2","currentStep","numSteps","onAnimationProgress","onAnimationComplete","core_animation","defineProperty","get","set","animation","duration","onProgress","onComplete","core_animations","animations","request","addAnimation","lazy","startTime","Date","now","animating","requestAnimationFrame","cancelAnimation","findIndex","splice","requestAnimFrame","startDigest","advance","nextStep","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","configurable","enumerable","method","base","res","object","unlistenArrayEvents","stub","DatasetController","datasetIndex","datasetElementType","dataElementType","linkScales","addElements","updateIndex","meta","getMeta","getDataset","xAxisID","scales","xAxes","yAxisID","yAxes","getDatasetMeta","getScaleForId","scaleID","_getValueScaleId","_getIndexScaleId","_getValueScale","_getIndexScale","reset","_data","createMetaDataset","_datasetIndex","createMetaData","_index","metaData","addElementAndReset","element","updateElement","buildOrUpdateElements","isExtensible","resyncElements","easingValue","elements","draw","removeHoverStyle","$previousStyle","setHoverStyle","custom","getHoverColor","backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","numMeta","numData","insertElements","count","onDataPush","onDataPop","pop","onDataShift","shift","onDataSplice","onDataUnshift","core_datasetController","borderAlign","element_arc","inLabelRange","mouseX","vm","hoverRadius","inRange","chartX","chartY","pointRelativePosition","getAngleFromPoint","angle","distance","startAngle","endAngle","betweenAngles","withinRadius","innerRadius","outerRadius","getCenterPoint","halfAngle","halfRadius","getArea","centreAngle","rangeFromCentre","angleMargin","sA","eA","pixelMargin","fillStyle","lineWidth","lineJoin","strokeStyle","valueOrDefault$1","line","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","capBezierPoints","element_line","current","currentVM","spanGaps","points","_children","globalOptionLineElements","lastDrawnIndex","_loop","lineCap","setLineDash","lineDashOffset","previousItem","skip","valueOrDefault$2","defaultColor$1","xRange","abs","hitRadius","yRange","mouseY","pointStyle","element_point","inXRange","inYRange","padding","chartArea","defaultColor$2","isVertical","getBarBounds","x1","x2","y1","half","swap","orig","v2","parseBorderSkipped","edge","borderSkipped","horizontal","parseBorderWidth","maxW","maxH","boundingRects","bounds","border","outer","inner","skipX","skipY","rectangle","element_rectangle","rects","fillRect","Arc","Point","Rectangle","resolve$1","computeMinSampleSize","pixels","prev","curr","isHorizontal","ticks","getTicks","getPixelForTick","computeFitCategoryTraits","ruler","thickness","barThickness","stackCount","categoryPercentage","barPercentage","chunk","computeFlexCategoryTraits","next","percent","end","hover","mode","offset","gridLines","offsetGridLines","controller_bar","stack","bar","_ruler","getRuler","_resolveElementOptions","_xScale","_yScale","datasetLabel","_updateElementGeometry","vscale","getBasePixel","vpixels","calculateBarValuePixels","ipixels","calculateBarIndexPixels","head","center","_getStacks","last","stacked","stacks","isDatasetVisible","getStackCount","getStackIndex","getPixelForValue","imeta","ivalue","getRightValue","minBarLength","controller","range","stackIndex","maxBarThickness","Infinity","dataIndex","valueOrDefault$3","resolve$2","position","tooltips","callbacks","title","dataPoint","xLabel","yLabel","controller_bubble","xScale","yScale","dsIndex","getPixelForDecimal","NaN","_options","resolve$3","valueOrDefault$4","animateRotate","animateScale","legendCallback","text","join","legend","generateLabels","ds","arcOpts","bw","onClick","legendItem","cutoutPercentage","circumference","tooltipItem","dataLabel","controller_doughnut","getRingIndex","ringIndex","j","opts","availableWidth","availableHeight","minSize","arcs","chartWeight","_getRingWeight","contains0","contains90","contains180","contains270","cutout","getMaxBorderWidth","radiusLength","_getVisibleDatasetWeightTotal","offsetX","offsetY","total","calculateTotal","_getRingWeightOffset","animationOpts","centerX","centerY","calculateCircumference","hoverWidth","ringWeightOffset","dataSetIndex","axis","controller_horizontalBar","valueOrDefault$5","resolve$4","isPointInArea","lineEnabled","showLine","controller_line","lineTension","_scale","_resolveLineOptions","updateBezierControlPoints","lineModel","_resolvePointOptions","calculatePointY","ELEMENT_OPTIONS","elementOptions","dsMeta","sumPos","sumNeg","stackedRightValue","rightValue","controlPoints","capControlPoint","pt","cubicInterpolationMode","splineCurveMonotone","splineCurve","nextItem","halfBorderWidth","resolve$5","angleLines","display","circular","pointLabels","beginAtZero","controller_polarArea","starts","_starts","angles","_angles","_updateRadius","countVisibleElements","_computeAngle","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getDistanceFromCenterForValue","resetRadius","doughnut","controller_pie","valueOrDefault$6","resolve$6","controller_radar","pointPosition","getPointPositionForValue","controller_scatter","controllers","bubble","horizontalBar","polarArea","pie","radar","scatter","getRelativePosition","native","parseVisibleItems","handler","jlen","getIntersectItems","getNearestItems","intersect","distanceMetric","minDistance","POSITIVE_INFINITY","nearestItems","getDistanceMetricForAxis","useX","useY","pt1","pt2","deltaX","deltaY","indexMode","items","core_interaction","modes","single","nearest","intersectsItem","filterByPosition","where","sortByWeight","_tmpIndex_","sort","findMaxPadding","boxes","box","getPadding","boxPadding","addSizeByPosition","layout","core_layouts","addBox","fullWidth","removeBox","layoutItem","configure","layoutOptions","leftPadding","rightPadding","topPadding","bottomPadding","leftBoxes","rightBoxes","topBoxes","bottomBoxes","chartAreaBoxes","maxPadding","verticalBoxes","horizontalBoxes","outerBoxes","chartWidth","chartHeight","chartAreaWidth","verticalBoxWidth","maxChartAreaWidth","maxChartAreaHeight","outerBoxSizes","minBoxSizes","getMinimumBoxSize","fitBox","finalFitVerticalBox","leftPaddingAddition","topPaddingAddition","newMaxChartAreaHeight","newMaxChartAreaWidth","placeBox","minBoxSize","findNextWhere","minBox","scaleMargin","platform_basic","acquireContext","platform_dom","platform_dom$1","freeze","getCjsExportFromNamespace","stylesheet","EXPANDO_KEY","CSS_PREFIX","CSS_SIZE_MONITOR","CSS_RENDER_MONITOR","CSS_RENDER_ANIMATION","ANIMATION_START_EVENTS","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","readUsedSize","property","getStyle","initCanvas","config","renderHeight","getAttribute","renderWidth","initial","displayWidth","aspectRatio","displayHeight","supportsEventListenerOptions","supports","addEventListener","eventListenerOptions","passive","addListener","node","removeListener","removeEventListener","createEvent","nativeEvent","fromNativeEvent","event","pos","throttled","ticking","createDiv","cls","el","document","className","createResizer","maxSize","resizer","expand","shrink","appendChild","_reset","scrollLeft","scrollTop","onScroll","bind","watchForRender","expando","proxy","renderProxy","animationName","reflow","offsetParent","classList","add","unwatchForRender","remove","addResizeListener","container","maintainAspectRatio","parentNode","clientWidth","insertBefore","firstChild","removeResizeListener","removeChild","injectCSS","platform","css","_style","setAttribute","getElementsByTagName","createTextNode","platform_dom$2","disableCSSInjection","_enabled","_ensureLoaded","_loaded","getElementById","releaseContext","removeAttribute","proxies","addEvent","removeEvent","implementation","core_plugins","_cacheId","register","unregister","idx","getAll","notify","hook","descriptor","params","descriptors","cache","$plugins","_invalidate","core_scaleService","constructors","registerScaleType","scaleConstructor","scaleDefaults","getScaleConstructor","getScaleDefaults","updateScaleDefaults","additions","addScalesToLayout","valueOrDefault$7","enabled","titleFontStyle","titleSpacing","titleMarginBottom","titleFontColor","titleAlign","bodySpacing","bodyFontColor","bodyAlign","footerFontStyle","footerSpacing","footerMarginTop","footerFontColor","footerAlign","yPadding","xPadding","caretPadding","caretSize","multiKeyBackground","displayColors","beforeTitle","tooltipItems","labelCount","afterTitle","beforeBody","beforeLabel","labelColor","activeElement","labelTextColor","afterLabel","afterBody","beforeFooter","footer","afterFooter","positioners","average","eventPosition","nearestElement","d","distanceBetweenPoints","tp","pushOrConcat","toPush","splitNewlines","split","createTooltipItem","indexScale","valueScale","getLabelForIndex","getBaseModel","tooltipOpts","xAlign","yAlign","_bodyFontFamily","bodyFontFamily","_bodyFontStyle","bodyFontStyle","_bodyAlign","bodyFontSize","_titleFontFamily","titleFontFamily","_titleFontStyle","titleFontSize","_titleAlign","_footerFontFamily","footerFontFamily","_footerFontStyle","footerFontSize","_footerAlign","opacity","legendColorBackground","getTooltipSize","tooltip","body","combinedBodyLength","reduce","bodyItem","before","lines","after","titleLineCount","footerLineCount","widthPadding","maxLineWidth","measureText","fontString","determineAlignment","lf","rf","olf","orf","yf","midX","midY","getBackgroundPoint","alignment","paddingAndSize","radiusAndPadding","getAlignedX","align","getBeforeAfterBodyLines","exports$3","_lastActive","getTitle","getBeforeBody","getBody","bodyItems","getAfterBody","getFooter","changed","existingModel","active","_active","backgroundPoint","tooltipSize","caretX","caretY","labelColors","labelTextColors","_eventPosition","itemSort","dataPoints","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","tmp","drawTitle","textAlign","textBaseline","fillText","drawBody","textColor","drawColorBoxes","xLinePadding","colorX","fillLineOfText","strokeRect","drawFooter","drawBackground","quadraticCurveTo","hasTooltipContent","globalAlpha","handleEvent","getElementsAtEventForMode","positioners_1","core_tooltip","valueOrDefault$8","mergeScaleConfig","slen","mergeConfig","initConfig","updateConfig","newOptions","ensureScalesHaveIDs","buildOrUpdateScales","positionIsHorizontal","events","onHover","animationDuration","responsive","responsiveAnimationDuration","Chart","construct","_bufferedRender","instances","retinaScale","devicePixelRatio","bindEvents","resize","initToolTip","stop","silent","newWidth","getMaximumWidth","newHeight","getMaximumHeight","newSize","onResize","scalesOptions","scaleOptions","xAxisOptions","yAxisOptions","updated","dtype","dposition","isDefault","scaleType","scaleClass","mergeTicksOptions","hasUpdated","buildOrUpdateControllers","newControllers","destroyDatasetMeta","ControllerClass","Error","resetElements","updateLayout","updateDatasets","lastActive","_bufferedRequest","updateDataset","animationOptions","animationObject","easingFunction","stepDecimal","drawDatasets","_drawTooltip","drawDataset","getElementAtEvent","getElementsAtEvent","getElementsAtXAxis","getDatasetAtEvent","_meta","unbindEvents","toBase64Image","toDataURL","_chartInstance","_listeners","eventHandler","updateHoverStyle","bufferedRequest","hoverOptions","core_controller","Controller","types","configMerge","scaleMerge","core_helpers","parseMaxStyle","styleValue","parentProperty","valueInPixels","isConstrainedValue","getConstraintDimension","domNode","maxStyle","percentageProperty","defaultView","_getParentNode","constrainedNode","getComputedStyle","constrainedContainer","hasCNode","hasCContainer","infinity","collection","filterCallback","filtered","arrayToSearch","startIndex","currentItem","findPreviousWhere","almostEquals","almostWhole","rounded","NEGATIVE_INFINITY","sign","log10","exponent","log","LOG10E","powerOf10","isPowerOf10","toRadians","toDegrees","radians","_decimalPlaces","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","aliasPixel","pixelWidth","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","firstPoint","middlePoint","afterPoint","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","originalEvent","srcElement","boundingRect","getBoundingClientRect","touches","clientX","clientY","paddingLeft","paddingTop","paddingRight","paddingBottom","getConstraintWidth","getConstraintHeight","_calculatePadding","parentDimension","parent","host","cw","clientHeight","ch","currentStyle","getPropertyValue","forceRatio","pixelRatio","pixelSize","longestText","arrayOfThings","gc","garbageCollect","longest","thing","nestedThing","gcLen","textWidth","numberOfLabelLines","numberOfLines","color","CanvasGradient","colorValue","CanvasPattern","abstract","DateAdapter","formats","parse","format","diff","startOf","endOf","_create","override","members","_date","core_adapters","core_ticks","formatters","tickValue","logDelta","tickString","maxTick","logTick","toExponential","numDecimal","toFixed","logarithmic","remain","valueOrDefault$9","labelsFromTicks","getPixelForGridLine","lineValue","computeTextSize","tick","drawBorder","drawOnChartArea","drawTicks","tickMarkLength","zeroLineWidth","zeroLineColor","zeroLineBorderDash","zeroLineBorderDashOffset","scaleLabel","labelString","minRotation","maxRotation","mirror","autoSkip","autoSkipPadding","labelOffset","minor","major","core_scale","_ticks","beforeUpdate","maxWidth","maxHeight","margins","_maxLabelLines","longestLabelWidth","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","scaleLabelOpts","gridLineOpts","_isVisible","parseFont","isFullWidth","scaleLabelFont","scaleLabelPadding","deltaHeight","largestTextWidth","tallestLabelHeightInLines","lineSpace","tickPadding","labelHeight","firstLabelWidth","lastLabelWidth","offsetLeft","offsetRight","handleMargins","rawValue","getValueForPixel","innerWidth","finalVal","innerHeight","decimal","valueOffset","getBaseValue","_autoSkip","optionTicks","tickCount","skipRatio","maxTicks","maxTicksLimit","ticksLength","_tickSize","axisLength","PaddingBottom","rot","borderValue","tickStart","tickEnd","optionMajorTicks","isRotated","isMirrored","tickFontColor","fontColor","majorTickFontColor","majorTickFont","tl","scaleLabelFontColor","labelRotationRadians","itemsToDraw","axisWidth","alignPixel","lineColor","tx1","ty1","tx2","ty2","labelX","labelY","textOffset","zeroLineIndex","labelYOffset","labelXOffset","glWidth","glColor","glBorderDash","glBorderDashOffset","itemToDraw","translate","scaleLabelX","scaleLabelY","halfLineHeight","isLeft","firstLineWidth","lastLineWidth","defaultConfig","scale_category","getLabels","minIndex","maxIndex","valueCategory","offsetAmt","valueWidth","widthOffset","valueHeight","heightOffset","horz","valueDimension","_defaults","generateTicks","generationOptions","dataRange","factor","niceMin","niceMax","numSpaces","MIN_SPACING","stepSize","unit","maxNumSpaces","precision","rmin","rmax","spacing","ceil","scale_linearbase","handleTickRangeOptions","minSign","maxSign","setMin","suggestedMin","setMax","suggestedMax","getTickLimit","_computeTickLimit","handleDirectionalChanges","numericGeneratorOptions","fixedStepSize","ticksAsNumbers","defaultConfig$1","scale_linear","DEFAULT_MIN","DEFAULT_MAX","IDMatches","hasStacks","valuesPerStack","positiveValues","negativeValues","relativePoints","valuesForType","minVal","maxVal","innerDimension","_defaults$1","valueOrDefault$a","generateTicks$1","exp","significand","tickVal","endExp","endSignificand","minNotZero","lastTick","defaultConfig$2","nonNegativeOrDefault","scale_logarithmic","tickValues","_getFirstTickValue","firstTickValue","_defaults$2","valueOrDefault$b","valueAtIndexOrDefault$1","resolve$7","defaultConfig$3","animate","showLabelBackdrop","backdropColor","backdropPaddingY","backdropPaddingX","getValueCount","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","textSize","plFont","furthestLimits","furthestAngles","_pointLabelSizes","valueCount","getPointPosition","drawingArea","getIndexAngle","hLimits","vLimits","setReductions","getTextAlignForAngle","adjustPointPositionForLabelHeight","drawPointLabels","angleLineOpts","pointLabelOpts","tickBackdropHeight","outerDistance","outerPosition","extra","pointLabelPosition","pointLabelFontColor","drawRadiusLine","numberOrZero","param","scale_radialLinear","setCenterPoint","largestPossibleRadius","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","angleMultiplier","startAngleRadians","scalingFactor","distanceFromCenter","thisAngle","getBasePosition","yCenterOffset","_defaults$3","valueOrDefault$c","MIN_INTEGER","MIN_SAFE_INTEGER","MAX_INTEGER","MAX_SAFE_INTEGER","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","arrayUnique","hash","out","buildLookupTable","timestamps","distribution","time","table","lookup","mid","i0","i1","lo","interpolate$1","skey","tkey","span","toTimestamp","input","adapter","_adapter","parser","determineStepSize","capacity","interval","milliseconds","determineUnitForAutoTicks","minUnit","determineUnitForFormatting","determineMajorUnit","generate","timeOpts","unitStepSize","weekday","isoWeekday","majorTicksEnabled","first","computeOffsets","ticksFromTimestamps","majorUnit","defaultConfig$4","adapters","displayFormat","displayFormats","scale_time","date","warn","timestamp","dataLabels","_horizontal","_table","_timestamps","getLabelCapacity","_unit","_majorUnit","_offsets","tooltipFormat","datetime","tickFormatFunction","minorFormat","majorFormat","majorTime","majorTickOpts","formatter","getPixelForOffset","isReverse","getLabelWidth","ticksOpts","tickLabelWidth","tickFontSize","exampleTime","exampleLabel","_defaults$4","category","radialLinear","FORMATS","_id","valueOf","amount","as","filler","propagate","mappers","visible","boundary","decodeFill","computeBoundary","scaleBottom","scaleTop","scaleZero","resolveTarget","visited","createMapper","isDrawable","drawArea","curve0","curve1","len0","len1","doFill","mapper","p0","p1","d0","d1","plugin_filler","afterDatasetsUpdate","$filler","beforeDatasetDraw","noop$1","valueOrDefault$d","getBoxWidth","labelOpts","usePointStyle","boxWidth","ci","onLeave","lineDash","Legend","legendHitBoxes","_hoveredItem","doughnutMode","beforeBuildLabels","buildLabels","afterBuildLabels","legendItems","labelFont","hitboxes","lineWidths","totalHeight","vPadding","columnWidths","totalWidth","currentColWidth","currentColHeight","itemHeight","itemWidth","lineDefault","legendWidth","cursor","drawLegendBox","SQRT2","halfFontSize","xLeft","yMiddle","_getLegendItemAt","hitBox","lh","hoveredItem","createNewLegendAndAttach","legendOpts","plugin_legend","_element","beforeInit","afterEvent","noop$2","Title","lineCount","fontOpts","titleX","titleY","createNewTitleBlockAndAttach","titleOpts","titleBlock","plugin_title","_adapters","Animation","animationService","Interaction","layouts","Scale","scaleService","Ticks","Tooltip","src","pluginService","PluginBase","canvasHelpers","layoutService","LinearScaleBase","klass","cfg","toLowerCase"],"mappings":"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","file":"js/chunk-fa696058.195f17bd.js","sourcesContent":["function dataHandler(newData, oldData) {\n if (oldData) {\n var chart = this.$data._chart;\n var newDatasetLabels = newData.datasets.map(function (dataset) {\n return dataset.label;\n });\n var oldDatasetLabels = oldData.datasets.map(function (dataset) {\n return dataset.label;\n });\n var oldLabels = JSON.stringify(oldDatasetLabels);\n var newLabels = JSON.stringify(newDatasetLabels);\n\n if (newLabels === oldLabels && oldData.datasets.length === newData.datasets.length) {\n newData.datasets.forEach(function (dataset, i) {\n var oldDatasetKeys = Object.keys(oldData.datasets[i]);\n var newDatasetKeys = Object.keys(dataset);\n var deletionKeys = oldDatasetKeys.filter(function (key) {\n return key !== '_meta' && newDatasetKeys.indexOf(key) === -1;\n });\n deletionKeys.forEach(function (deletionKey) {\n delete chart.data.datasets[i][deletionKey];\n });\n\n for (var attribute in dataset) {\n if (dataset.hasOwnProperty(attribute)) {\n chart.data.datasets[i][attribute] = dataset[attribute];\n }\n }\n });\n\n if (newData.hasOwnProperty('labels')) {\n chart.data.labels = newData.labels;\n this.$emit('labels:update');\n }\n\n if (newData.hasOwnProperty('xLabels')) {\n chart.data.xLabels = newData.xLabels;\n this.$emit('xlabels:update');\n }\n\n if (newData.hasOwnProperty('yLabels')) {\n chart.data.yLabels = newData.yLabels;\n this.$emit('ylabels:update');\n }\n\n chart.update();\n this.$emit('chart:update');\n } else {\n if (chart) {\n chart.destroy();\n this.$emit('chart:destroy');\n }\n\n this.renderChart(this.chartData, this.options);\n this.$emit('chart:render');\n }\n } else {\n if (this.$data._chart) {\n this.$data._chart.destroy();\n\n this.$emit('chart:destroy');\n }\n\n this.renderChart(this.chartData, this.options);\n this.$emit('chart:render');\n }\n}\n\nexport var reactiveData = {\n data: function data() {\n return {\n chartData: null\n };\n },\n watch: {\n 'chartData': dataHandler\n }\n};\nexport var reactiveProp = {\n props: {\n chartData: {\n type: Object,\n required: true,\n default: function _default() {}\n }\n },\n watch: {\n 'chartData': dataHandler\n }\n};\nexport default {\n reactiveData: reactiveData,\n reactiveProp: reactiveProp\n};","import Chart from 'chart.js';\nexport function generateChart(chartId, chartType) {\n return {\n render: function render(createElement) {\n return createElement('div', {\n style: this.styles,\n class: this.cssClasses\n }, [createElement('canvas', {\n attrs: {\n id: this.chartId,\n width: this.width,\n height: this.height\n },\n ref: 'canvas'\n })]);\n },\n props: {\n chartId: {\n default: chartId,\n type: String\n },\n width: {\n default: 400,\n type: Number\n },\n height: {\n default: 400,\n type: Number\n },\n cssClasses: {\n type: String,\n default: ''\n },\n styles: {\n type: Object\n },\n plugins: {\n type: Array,\n default: function _default() {\n return [];\n }\n }\n },\n data: function data() {\n return {\n _chart: null,\n _plugins: this.plugins\n };\n },\n methods: {\n addPlugin: function addPlugin(plugin) {\n this.$data._plugins.push(plugin);\n },\n generateLegend: function generateLegend() {\n if (this.$data._chart) {\n return this.$data._chart.generateLegend();\n }\n },\n renderChart: function renderChart(data, options) {\n if (this.$data._chart) this.$data._chart.destroy();\n this.$data._chart = new Chart(this.$refs.canvas.getContext('2d'), {\n type: chartType,\n data: data,\n options: options,\n plugins: this.$data._plugins\n });\n }\n },\n beforeDestroy: function beforeDestroy() {\n if (this.$data._chart) {\n this.$data._chart.destroy();\n }\n }\n };\n}\nexport var Bar = generateChart('bar-chart', 'bar');\nexport var HorizontalBar = generateChart('horizontalbar-chart', 'horizontalBar');\nexport var Doughnut = generateChart('doughnut-chart', 'doughnut');\nexport var Line = generateChart('line-chart', 'line');\nexport var Pie = generateChart('pie-chart', 'pie');\nexport var PolarArea = generateChart('polar-chart', 'polarArea');\nexport var Radar = generateChart('radar-chart', 'radar');\nexport var Bubble = generateChart('bubble-chart', 'bubble');\nexport var Scatter = generateChart('scatter-chart', 'scatter');\nexport default {\n Bar: Bar,\n HorizontalBar: HorizontalBar,\n Doughnut: Doughnut,\n Line: Line,\n Pie: Pie,\n PolarArea: PolarArea,\n Radar: Radar,\n Bubble: Bubble,\n Scatter: Scatter\n};","/*!\n * Chart.js v2.8.0\n * https://www.chartjs.org\n * (c) 2019 Chart.js Contributors\n * Released under the MIT License\n */\n(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) :\ntypeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) :\n(global.Chart = factory(global.moment));\n}(this, (function (moment) { 'use strict';\n\nmoment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;\n\n/* MIT license */\n\nvar conversions = {\n rgb2hsl: rgb2hsl,\n rgb2hsv: rgb2hsv,\n rgb2hwb: rgb2hwb,\n rgb2cmyk: rgb2cmyk,\n rgb2keyword: rgb2keyword,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n rgb2lch: rgb2lch,\n\n hsl2rgb: hsl2rgb,\n hsl2hsv: hsl2hsv,\n hsl2hwb: hsl2hwb,\n hsl2cmyk: hsl2cmyk,\n hsl2keyword: hsl2keyword,\n\n hsv2rgb: hsv2rgb,\n hsv2hsl: hsv2hsl,\n hsv2hwb: hsv2hwb,\n hsv2cmyk: hsv2cmyk,\n hsv2keyword: hsv2keyword,\n\n hwb2rgb: hwb2rgb,\n hwb2hsl: hwb2hsl,\n hwb2hsv: hwb2hsv,\n hwb2cmyk: hwb2cmyk,\n hwb2keyword: hwb2keyword,\n\n cmyk2rgb: cmyk2rgb,\n cmyk2hsl: cmyk2hsl,\n cmyk2hsv: cmyk2hsv,\n cmyk2hwb: cmyk2hwb,\n cmyk2keyword: cmyk2keyword,\n\n keyword2rgb: keyword2rgb,\n keyword2hsl: keyword2hsl,\n keyword2hsv: keyword2hsv,\n keyword2hwb: keyword2hwb,\n keyword2cmyk: keyword2cmyk,\n keyword2lab: keyword2lab,\n keyword2xyz: keyword2xyz,\n\n xyz2rgb: xyz2rgb,\n xyz2lab: xyz2lab,\n xyz2lch: xyz2lch,\n\n lab2xyz: lab2xyz,\n lab2rgb: lab2rgb,\n lab2lch: lab2lch,\n\n lch2lab: lch2lab,\n lch2xyz: lch2xyz,\n lch2rgb: lch2rgb\n};\n\n\nfunction rgb2hsl(rgb) {\n var r = rgb[0]/255,\n g = rgb[1]/255,\n b = rgb[2]/255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, l;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g)/ delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n l = (min + max) / 2;\n\n if (max == min)\n s = 0;\n else if (l <= 0.5)\n s = delta / (max + min);\n else\n s = delta / (2 - max - min);\n\n return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, v;\n\n if (max == 0)\n s = 0;\n else\n s = (delta/max * 1000)/10;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g) / delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n v = ((max / 255) * 1000) / 10;\n\n return [h, s, v];\n}\n\nfunction rgb2hwb(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n h = rgb2hsl(rgb)[0],\n w = 1/255 * Math.min(r, Math.min(g, b)),\n b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n return [h, w * 100, b * 100];\n}\n\nfunction rgb2cmyk(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n c, m, y, k;\n\n k = Math.min(1 - r, 1 - g, 1 - b);\n c = (1 - r - k) / (1 - k) || 0;\n m = (1 - g - k) / (1 - k) || 0;\n y = (1 - b - k) / (1 - k) || 0;\n return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255;\n\n // assume sRGB\n r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n var xyz = rgb2xyz(rgb),\n x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n}\n\nfunction rgb2lch(args) {\n return lab2lch(rgb2lab(args));\n}\n\nfunction hsl2rgb(hsl) {\n var h = hsl[0] / 360,\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n t1, t2, t3, rgb, val;\n\n if (s == 0) {\n val = l * 255;\n return [val, val, val];\n }\n\n if (l < 0.5)\n t2 = l * (1 + s);\n else\n t2 = l + s - l * s;\n t1 = 2 * l - t2;\n\n rgb = [0, 0, 0];\n for (var i = 0; i < 3; i++) {\n t3 = h + 1 / 3 * - (i - 1);\n t3 < 0 && t3++;\n t3 > 1 && t3--;\n\n if (6 * t3 < 1)\n val = t1 + (t2 - t1) * 6 * t3;\n else if (2 * t3 < 1)\n val = t2;\n else if (3 * t3 < 2)\n val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n else\n val = t1;\n\n rgb[i] = val * 255;\n }\n\n return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n var h = hsl[0],\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n sv, v;\n\n if(l === 0) {\n // no need to do calc on black\n // also avoids divide by 0 error\n return [0, 0, 0];\n }\n\n l *= 2;\n s *= (l <= 1) ? l : 2 - l;\n v = (l + s) / 2;\n sv = (2 * s) / (l + s);\n return [h, sv * 100, v * 100];\n}\n\nfunction hsl2hwb(args) {\n return rgb2hwb(hsl2rgb(args));\n}\n\nfunction hsl2cmyk(args) {\n return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n var h = hsv[0] / 60,\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n hi = Math.floor(h) % 6;\n\n var f = h - Math.floor(h),\n p = 255 * v * (1 - s),\n q = 255 * v * (1 - (s * f)),\n t = 255 * v * (1 - (s * (1 - f))),\n v = 255 * v;\n\n switch(hi) {\n case 0:\n return [v, t, p];\n case 1:\n return [q, v, p];\n case 2:\n return [p, v, t];\n case 3:\n return [p, q, v];\n case 4:\n return [t, p, v];\n case 5:\n return [v, p, q];\n }\n}\n\nfunction hsv2hsl(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n sl, l;\n\n l = (2 - s) * v;\n sl = s * v;\n sl /= (l <= 1) ? l : 2 - l;\n sl = sl || 0;\n l /= 2;\n return [h, sl * 100, l * 100];\n}\n\nfunction hsv2hwb(args) {\n return rgb2hwb(hsv2rgb(args))\n}\n\nfunction hsv2cmyk(args) {\n return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n return rgb2keyword(hsv2rgb(args));\n}\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nfunction hwb2rgb(hwb) {\n var h = hwb[0] / 360,\n wh = hwb[1] / 100,\n bl = hwb[2] / 100,\n ratio = wh + bl,\n i, v, f, n;\n\n // wh + bl cant be > 1\n if (ratio > 1) {\n wh /= ratio;\n bl /= ratio;\n }\n\n i = Math.floor(6 * h);\n v = 1 - bl;\n f = 6 * h - i;\n if ((i & 0x01) != 0) {\n f = 1 - f;\n }\n n = wh + f * (v - wh); // linear interpolation\n\n switch (i) {\n default:\n case 6:\n case 0: r = v; g = n; b = wh; break;\n case 1: r = n; g = v; b = wh; break;\n case 2: r = wh; g = v; b = n; break;\n case 3: r = wh; g = n; b = v; break;\n case 4: r = n; g = wh; b = v; break;\n case 5: r = v; g = wh; b = n; break;\n }\n\n return [r * 255, g * 255, b * 255];\n}\n\nfunction hwb2hsl(args) {\n return rgb2hsl(hwb2rgb(args));\n}\n\nfunction hwb2hsv(args) {\n return rgb2hsv(hwb2rgb(args));\n}\n\nfunction hwb2cmyk(args) {\n return rgb2cmyk(hwb2rgb(args));\n}\n\nfunction hwb2keyword(args) {\n return rgb2keyword(hwb2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n var c = cmyk[0] / 100,\n m = cmyk[1] / 100,\n y = cmyk[2] / 100,\n k = cmyk[3] / 100,\n r, g, b;\n\n r = 1 - Math.min(1, c * (1 - k) + k);\n g = 1 - Math.min(1, m * (1 - k) + k);\n b = 1 - Math.min(1, y * (1 - k) + k);\n return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2hwb(args) {\n return rgb2hwb(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n var x = xyz[0] / 100,\n y = xyz[1] / 100,\n z = xyz[2] / 100,\n r, g, b;\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n // assume sRGB\n r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n : r = (r * 12.92);\n\n g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n : g = (g * 12.92);\n\n b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n : b = (b * 12.92);\n\n r = Math.min(Math.max(0, r), 1);\n g = Math.min(Math.max(0, g), 1);\n b = Math.min(Math.max(0, b), 1);\n\n return [r * 255, g * 255, b * 255];\n}\n\nfunction xyz2lab(xyz) {\n var x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n}\n\nfunction xyz2lch(args) {\n return lab2lch(xyz2lab(args));\n}\n\nfunction lab2xyz(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n x, y, z, y2;\n\n if (l <= 8) {\n y = (l * 100) / 903.3;\n y2 = (7.787 * (y / 100)) + (16 / 116);\n } else {\n y = 100 * Math.pow((l + 16) / 116, 3);\n y2 = Math.pow(y / 100, 1/3);\n }\n\n x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n return [x, y, z];\n}\n\nfunction lab2lch(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n hr, h, c;\n\n hr = Math.atan2(b, a);\n h = hr * 360 / 2 / Math.PI;\n if (h < 0) {\n h += 360;\n }\n c = Math.sqrt(a * a + b * b);\n return [l, c, h];\n}\n\nfunction lab2rgb(args) {\n return xyz2rgb(lab2xyz(args));\n}\n\nfunction lch2lab(lch) {\n var l = lch[0],\n c = lch[1],\n h = lch[2],\n a, b, hr;\n\n hr = h / 360 * 2 * Math.PI;\n a = c * Math.cos(hr);\n b = c * Math.sin(hr);\n return [l, a, b];\n}\n\nfunction lch2xyz(args) {\n return lab2xyz(lch2lab(args));\n}\n\nfunction lch2rgb(args) {\n return lab2rgb(lch2lab(args));\n}\n\nfunction keyword2rgb(keyword) {\n return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2hwb(args) {\n return rgb2hwb(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n return rgb2cmyk(keyword2rgb(args));\n}\n\nfunction keyword2lab(args) {\n return rgb2lab(keyword2rgb(args));\n}\n\nfunction keyword2xyz(args) {\n return rgb2xyz(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n aliceblue: [240,248,255],\n antiquewhite: [250,235,215],\n aqua: [0,255,255],\n aquamarine: [127,255,212],\n azure: [240,255,255],\n beige: [245,245,220],\n bisque: [255,228,196],\n black: [0,0,0],\n blanchedalmond: [255,235,205],\n blue: [0,0,255],\n blueviolet: [138,43,226],\n brown: [165,42,42],\n burlywood: [222,184,135],\n cadetblue: [95,158,160],\n chartreuse: [127,255,0],\n chocolate: [210,105,30],\n coral: [255,127,80],\n cornflowerblue: [100,149,237],\n cornsilk: [255,248,220],\n crimson: [220,20,60],\n cyan: [0,255,255],\n darkblue: [0,0,139],\n darkcyan: [0,139,139],\n darkgoldenrod: [184,134,11],\n darkgray: [169,169,169],\n darkgreen: [0,100,0],\n darkgrey: [169,169,169],\n darkkhaki: [189,183,107],\n darkmagenta: [139,0,139],\n darkolivegreen: [85,107,47],\n darkorange: [255,140,0],\n darkorchid: [153,50,204],\n darkred: [139,0,0],\n darksalmon: [233,150,122],\n darkseagreen: [143,188,143],\n darkslateblue: [72,61,139],\n darkslategray: [47,79,79],\n darkslategrey: [47,79,79],\n darkturquoise: [0,206,209],\n darkviolet: [148,0,211],\n deeppink: [255,20,147],\n deepskyblue: [0,191,255],\n dimgray: [105,105,105],\n dimgrey: [105,105,105],\n dodgerblue: [30,144,255],\n firebrick: [178,34,34],\n floralwhite: [255,250,240],\n forestgreen: [34,139,34],\n fuchsia: [255,0,255],\n gainsboro: [220,220,220],\n ghostwhite: [248,248,255],\n gold: [255,215,0],\n goldenrod: [218,165,32],\n gray: [128,128,128],\n green: [0,128,0],\n greenyellow: [173,255,47],\n grey: [128,128,128],\n honeydew: [240,255,240],\n hotpink: [255,105,180],\n indianred: [205,92,92],\n indigo: [75,0,130],\n ivory: [255,255,240],\n khaki: [240,230,140],\n lavender: [230,230,250],\n lavenderblush: [255,240,245],\n lawngreen: [124,252,0],\n lemonchiffon: [255,250,205],\n lightblue: [173,216,230],\n lightcoral: [240,128,128],\n lightcyan: [224,255,255],\n lightgoldenrodyellow: [250,250,210],\n lightgray: [211,211,211],\n lightgreen: [144,238,144],\n lightgrey: [211,211,211],\n lightpink: [255,182,193],\n lightsalmon: [255,160,122],\n lightseagreen: [32,178,170],\n lightskyblue: [135,206,250],\n lightslategray: [119,136,153],\n lightslategrey: [119,136,153],\n lightsteelblue: [176,196,222],\n lightyellow: [255,255,224],\n lime: [0,255,0],\n limegreen: [50,205,50],\n linen: [250,240,230],\n magenta: [255,0,255],\n maroon: [128,0,0],\n mediumaquamarine: [102,205,170],\n mediumblue: [0,0,205],\n mediumorchid: [186,85,211],\n mediumpurple: [147,112,219],\n mediumseagreen: [60,179,113],\n mediumslateblue: [123,104,238],\n mediumspringgreen: [0,250,154],\n mediumturquoise: [72,209,204],\n mediumvioletred: [199,21,133],\n midnightblue: [25,25,112],\n mintcream: [245,255,250],\n mistyrose: [255,228,225],\n moccasin: [255,228,181],\n navajowhite: [255,222,173],\n navy: [0,0,128],\n oldlace: [253,245,230],\n olive: [128,128,0],\n olivedrab: [107,142,35],\n orange: [255,165,0],\n orangered: [255,69,0],\n orchid: [218,112,214],\n palegoldenrod: [238,232,170],\n palegreen: [152,251,152],\n paleturquoise: [175,238,238],\n palevioletred: [219,112,147],\n papayawhip: [255,239,213],\n peachpuff: [255,218,185],\n peru: [205,133,63],\n pink: [255,192,203],\n plum: [221,160,221],\n powderblue: [176,224,230],\n purple: [128,0,128],\n rebeccapurple: [102, 51, 153],\n red: [255,0,0],\n rosybrown: [188,143,143],\n royalblue: [65,105,225],\n saddlebrown: [139,69,19],\n salmon: [250,128,114],\n sandybrown: [244,164,96],\n seagreen: [46,139,87],\n seashell: [255,245,238],\n sienna: [160,82,45],\n silver: [192,192,192],\n skyblue: [135,206,235],\n slateblue: [106,90,205],\n slategray: [112,128,144],\n slategrey: [112,128,144],\n snow: [255,250,250],\n springgreen: [0,255,127],\n steelblue: [70,130,180],\n tan: [210,180,140],\n teal: [0,128,128],\n thistle: [216,191,216],\n tomato: [255,99,71],\n turquoise: [64,224,208],\n violet: [238,130,238],\n wheat: [245,222,179],\n white: [255,255,255],\n whitesmoke: [245,245,245],\n yellow: [255,255,0],\n yellowgreen: [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\nvar convert = function() {\n return new Converter();\n};\n\nfor (var func in conversions) {\n // export Raw versions\n convert[func + \"Raw\"] = (function(func) {\n // accept array or plain args\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n return conversions[func](arg);\n }\n })(func);\n\n var pair = /(\\w+)2(\\w+)/.exec(func),\n from = pair[1],\n to = pair[2];\n\n // export rgb2hsl and [\"rgb\"][\"hsl\"]\n convert[from] = convert[from] || {};\n\n convert[from][to] = convert[func] = (function(func) { \n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n \n var val = conversions[func](arg);\n if (typeof val == \"string\" || val === undefined)\n return val; // keyword\n\n for (var i = 0; i < val.length; i++)\n val[i] = Math.round(val[i]);\n return val;\n }\n })(func);\n}\n\n\n/* Converter does lazy conversion and caching */\nvar Converter = function() {\n this.convs = {};\n};\n\n/* Either get the values for a space or\n set the values for a space, depending on args */\nConverter.prototype.routeSpace = function(space, args) {\n var values = args[0];\n if (values === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n // color.rgb(10, 10, 10)\n if (typeof values == \"number\") {\n values = Array.prototype.slice.call(args); \n }\n\n return this.setValues(space, values);\n};\n \n/* Set the values for a space, invalidating cache */\nConverter.prototype.setValues = function(space, values) {\n this.space = space;\n this.convs = {};\n this.convs[space] = values;\n return this;\n};\n\n/* Get the values for a space. If there's already\n a conversion for the space, fetch it, otherwise\n compute it */\nConverter.prototype.getValues = function(space) {\n var vals = this.convs[space];\n if (!vals) {\n var fspace = this.space,\n from = this.convs[fspace];\n vals = convert[fspace][space](from);\n\n this.convs[space] = vals;\n }\n return vals;\n};\n\n[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n Converter.prototype[space] = function(vals) {\n return this.routeSpace(space, arguments);\n };\n});\n\nvar colorConvert = convert;\n\nvar colorName = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\n\n/* MIT license */\n\n\nvar colorString = {\n getRgba: getRgba,\n getHsla: getHsla,\n getRgb: getRgb,\n getHsl: getHsl,\n getHwb: getHwb,\n getAlpha: getAlpha,\n\n hexString: hexString,\n rgbString: rgbString,\n rgbaString: rgbaString,\n percentString: percentString,\n percentaString: percentaString,\n hslString: hslString,\n hslaString: hslaString,\n hwbString: hwbString,\n keyword: keyword\n};\n\nfunction getRgba(string) {\n if (!string) {\n return;\n }\n var abbr = /^#([a-fA-F0-9]{3,4})$/i,\n hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,\n rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n keyword = /(\\w+)/;\n\n var rgb = [0, 0, 0],\n a = 1,\n match = string.match(abbr),\n hexAlpha = \"\";\n if (match) {\n match = match[1];\n hexAlpha = match[3];\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match[i] + match[i], 16);\n }\n if (hexAlpha) {\n a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;\n }\n }\n else if (match = string.match(hex)) {\n hexAlpha = match[2];\n match = match[1];\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n }\n if (hexAlpha) {\n a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;\n }\n }\n else if (match = string.match(rgba)) {\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match[i + 1]);\n }\n a = parseFloat(match[4]);\n }\n else if (match = string.match(per)) {\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n }\n a = parseFloat(match[4]);\n }\n else if (match = string.match(keyword)) {\n if (match[1] == \"transparent\") {\n return [0, 0, 0, 0];\n }\n rgb = colorName[match[1]];\n if (!rgb) {\n return;\n }\n }\n\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = scale(rgb[i], 0, 255);\n }\n if (!a && a != 0) {\n a = 1;\n }\n else {\n a = scale(a, 0, 1);\n }\n rgb[3] = a;\n return rgb;\n}\n\nfunction getHsla(string) {\n if (!string) {\n return;\n }\n var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n var match = string.match(hsl);\n if (match) {\n var alpha = parseFloat(match[4]);\n var h = scale(parseInt(match[1]), 0, 360),\n s = scale(parseFloat(match[2]), 0, 100),\n l = scale(parseFloat(match[3]), 0, 100),\n a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n return [h, s, l, a];\n }\n}\n\nfunction getHwb(string) {\n if (!string) {\n return;\n }\n var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n var match = string.match(hwb);\n if (match) {\n var alpha = parseFloat(match[4]);\n var h = scale(parseInt(match[1]), 0, 360),\n w = scale(parseFloat(match[2]), 0, 100),\n b = scale(parseFloat(match[3]), 0, 100),\n a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n return [h, w, b, a];\n }\n}\n\nfunction getRgb(string) {\n var rgba = getRgba(string);\n return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n var hsla = getHsla(string);\n return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n var vals = getRgba(string);\n if (vals) {\n return vals[3];\n }\n else if (vals = getHsla(string)) {\n return vals[3];\n }\n else if (vals = getHwb(string)) {\n return vals[3];\n }\n}\n\n// generators\nfunction hexString(rgba, a) {\n var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];\n return \"#\" + hexDouble(rgba[0]) \n + hexDouble(rgba[1])\n + hexDouble(rgba[2])\n + (\n (a >= 0 && a < 1)\n ? hexDouble(Math.round(a * 255))\n : \"\"\n );\n}\n\nfunction rgbString(rgba, alpha) {\n if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n return rgbaString(rgba, alpha);\n }\n return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n if (alpha === undefined) {\n alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n }\n return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n return percentaString(rgba, alpha);\n }\n var r = Math.round(rgba[0]/255 * 100),\n g = Math.round(rgba[1]/255 * 100),\n b = Math.round(rgba[2]/255 * 100);\n\n return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n var r = Math.round(rgba[0]/255 * 100),\n g = Math.round(rgba[1]/255 * 100),\n b = Math.round(rgba[2]/255 * 100);\n return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n return hslaString(hsla, alpha);\n }\n return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n if (alpha === undefined) {\n alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n }\n return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n if (alpha === undefined) {\n alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n }\n return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n var str = num.toString(16).toUpperCase();\n return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorName) {\n reverseNames[colorName[name]] = name;\n}\n\n/* MIT license */\n\n\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.valid = false;\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = colorString.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = colorString.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = colorString.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\tisValid: function () {\n\t\treturn this.valid;\n\t},\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn colorString.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn colorString.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn colorString.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn colorString.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn colorString.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn colorString.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn colorString.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn colorString.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tthis.valid = true;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = colorConvert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nvar chartjsColor = Color;\n\n/**\n * @namespace Chart.helpers\n */\nvar helpers = {\n\t/**\n\t * An empty function that can be used, for example, for optional callback.\n\t */\n\tnoop: function() {},\n\n\t/**\n\t * Returns a unique id, sequentially generated from a global variable.\n\t * @returns {number}\n\t * @function\n\t */\n\tuid: (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}()),\n\n\t/**\n\t * Returns true if `value` is neither null nor undefined, else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t * @since 2.7.0\n\t */\n\tisNullOrUndef: function(value) {\n\t\treturn value === null || typeof value === 'undefined';\n\t},\n\n\t/**\n\t * Returns true if `value` is an array (including typed arrays), else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t * @function\n\t */\n\tisArray: function(value) {\n\t\tif (Array.isArray && Array.isArray(value)) {\n\t\t\treturn true;\n\t\t}\n\t\tvar type = Object.prototype.toString.call(value);\n\t\tif (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Returns true if `value` is an object (excluding null), else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t * @since 2.7.0\n\t */\n\tisObject: function(value) {\n\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\n\t},\n\n\t/**\n\t * Returns true if `value` is a finite number, else returns false\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t */\n\tisFinite: function(value) {\n\t\treturn (typeof value === 'number' || value instanceof Number) && isFinite(value);\n\t},\n\n\t/**\n\t * Returns `value` if defined, else returns `defaultValue`.\n\t * @param {*} value - The value to return if defined.\n\t * @param {*} defaultValue - The value to return if `value` is undefined.\n\t * @returns {*}\n\t */\n\tvalueOrDefault: function(value, defaultValue) {\n\t\treturn typeof value === 'undefined' ? defaultValue : value;\n\t},\n\n\t/**\n\t * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n\t * @param {Array} value - The array to lookup for value at `index`.\n\t * @param {number} index - The index in `value` to lookup for value.\n\t * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n\t * @returns {*}\n\t */\n\tvalueAtIndexOrDefault: function(value, index, defaultValue) {\n\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n\t},\n\n\t/**\n\t * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n\t * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n\t * @param {function} fn - The function to call.\n\t * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n\t * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @returns {*}\n\t */\n\tcallback: function(fn, args, thisArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\treturn fn.apply(thisArg, args);\n\t\t}\n\t},\n\n\t/**\n\t * Note(SB) for performance sake, this method should only be used when loopable type\n\t * is unknown or in none intensive code (not called often and small loopable). Else\n\t * it's preferable to use a regular for() loop and save extra function calls.\n\t * @param {object|Array} loopable - The object or array to be iterated.\n\t * @param {function} fn - The function to call for each item.\n\t * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @param {boolean} [reverse] - If true, iterates backward on the loopable.\n\t */\n\teach: function(loopable, fn, thisArg, reverse) {\n\t\tvar i, len, keys;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (helpers.isObject(loopable)) {\n\t\t\tkeys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n\t * @see https://stackoverflow.com/a/14853974\n\t * @param {Array} a0 - The array to compare\n\t * @param {Array} a1 - The array to compare\n\t * @returns {boolean}\n\t */\n\tarrayEquals: function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns a deep copy of `source` without keeping references on objects and arrays.\n\t * @param {*} source - The value to clone.\n\t * @returns {*}\n\t */\n\tclone: function(source) {\n\t\tif (helpers.isArray(source)) {\n\t\t\treturn source.map(helpers.clone);\n\t\t}\n\n\t\tif (helpers.isObject(source)) {\n\t\t\tvar target = {};\n\t\t\tvar keys = Object.keys(source);\n\t\t\tvar klen = keys.length;\n\t\t\tvar k = 0;\n\n\t\t\tfor (; k < klen; ++k) {\n\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\treturn source;\n\t},\n\n\t/**\n\t * The default merger when Chart.helpers.merge is called without merger option.\n\t * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n\t * @private\n\t */\n\t_merger: function(key, target, source, options) {\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.merge(tval, sval, options);\n\t\t} else {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Merges source[key] in target[key] only if target[key] is undefined.\n\t * @private\n\t */\n\t_mergerIf: function(key, target, source) {\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.mergeIf(tval, sval);\n\t\t} else if (!target.hasOwnProperty(key)) {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` with the given `options`.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {object} target - The target object in which all sources are merged into.\n\t * @param {object|object[]} source - Object(s) to merge into `target`.\n\t * @param {object} [options] - Merging options:\n\t * @param {function} [options.merger] - The merge method (key, target, source, options)\n\t * @returns {object} The `target` object.\n\t */\n\tmerge: function(target, source, options) {\n\t\tvar sources = helpers.isArray(source) ? source : [source];\n\t\tvar ilen = sources.length;\n\t\tvar merge, i, keys, klen, k;\n\n\t\tif (!helpers.isObject(target)) {\n\t\t\treturn target;\n\t\t}\n\n\t\toptions = options || {};\n\t\tmerge = options.merger || helpers._merger;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tsource = sources[i];\n\t\t\tif (!helpers.isObject(source)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tkeys = Object.keys(source);\n\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\n\t\t\t\tmerge(keys[k], target, source, options);\n\t\t\t}\n\t\t}\n\n\t\treturn target;\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {object} target - The target object in which all sources are merged into.\n\t * @param {object|object[]} source - Object(s) to merge into `target`.\n\t * @returns {object} The `target` object.\n\t */\n\tmergeIf: function(target, source) {\n\t\treturn helpers.merge(target, source, {merger: helpers._mergerIf});\n\t},\n\n\t/**\n\t * Applies the contents of two or more objects together into the first object.\n\t * @param {object} target - The target object in which all objects are merged into.\n\t * @param {object} arg1 - Object containing additional properties to merge in target.\n\t * @param {object} argN - Additional objects containing properties to merge in target.\n\t * @returns {object} The `target` object.\n\t */\n\textend: function(target) {\n\t\tvar setFn = function(value, key) {\n\t\t\ttarget[key] = value;\n\t\t};\n\t\tfor (var i = 1, ilen = arguments.length; i < ilen; ++i) {\n\t\t\thelpers.each(arguments[i], setFn);\n\t\t}\n\t\treturn target;\n\t},\n\n\t/**\n\t * Basic javascript inheritance based on the model created in Backbone.js\n\t */\n\tinherits: function(extensions) {\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\t\treturn ChartElement;\n\t}\n};\n\nvar helpers_core = helpers;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nhelpers.callCallback = helpers.callback;\n\n/**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.indexOf = function(array, item, fromIndex) {\n\treturn Array.prototype.indexOf.call(array, item, fromIndex);\n};\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueOrDefault = helpers.valueOrDefault;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\nvar effects = {\n\tlinear: function(t) {\n\t\treturn t;\n\t},\n\n\teaseInQuad: function(t) {\n\t\treturn t * t;\n\t},\n\n\teaseOutQuad: function(t) {\n\t\treturn -t * (t - 2);\n\t},\n\n\teaseInOutQuad: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t;\n\t\t}\n\t\treturn -0.5 * ((--t) * (t - 2) - 1);\n\t},\n\n\teaseInCubic: function(t) {\n\t\treturn t * t * t;\n\t},\n\n\teaseOutCubic: function(t) {\n\t\treturn (t = t - 1) * t * t + 1;\n\t},\n\n\teaseInOutCubic: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t + 2);\n\t},\n\n\teaseInQuart: function(t) {\n\t\treturn t * t * t * t;\n\t},\n\n\teaseOutQuart: function(t) {\n\t\treturn -((t = t - 1) * t * t * t - 1);\n\t},\n\n\teaseInOutQuart: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t;\n\t\t}\n\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\n\t},\n\n\teaseInQuint: function(t) {\n\t\treturn t * t * t * t * t;\n\t},\n\n\teaseOutQuint: function(t) {\n\t\treturn (t = t - 1) * t * t * t * t + 1;\n\t},\n\n\teaseInOutQuint: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\n\t},\n\n\teaseInSine: function(t) {\n\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\n\t},\n\n\teaseOutSine: function(t) {\n\t\treturn Math.sin(t * (Math.PI / 2));\n\t},\n\n\teaseInOutSine: function(t) {\n\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\n\t},\n\n\teaseInExpo: function(t) {\n\t\treturn (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n\t},\n\n\teaseOutExpo: function(t) {\n\t\treturn (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n\t},\n\n\teaseInOutExpo: function(t) {\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\n\t\t}\n\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\n\t},\n\n\teaseInCirc: function(t) {\n\t\tif (t >= 1) {\n\t\t\treturn t;\n\t\t}\n\t\treturn -(Math.sqrt(1 - t * t) - 1);\n\t},\n\n\teaseOutCirc: function(t) {\n\t\treturn Math.sqrt(1 - (t = t - 1) * t);\n\t},\n\n\teaseInOutCirc: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\n\t\t}\n\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t},\n\n\teaseInElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t},\n\n\teaseOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n\t},\n\n\teaseInOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif ((t /= 0.5) === 2) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.45;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\tif (t < 1) {\n\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t}\n\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t},\n\teaseInBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn t * t * ((s + 1) * t - s);\n\t},\n\n\teaseOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\n\t},\n\n\teaseInOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t},\n\n\teaseInBounce: function(t) {\n\t\treturn 1 - effects.easeOutBounce(1 - t);\n\t},\n\n\teaseOutBounce: function(t) {\n\t\tif (t < (1 / 2.75)) {\n\t\t\treturn 7.5625 * t * t;\n\t\t}\n\t\tif (t < (2 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n\t\t}\n\t\tif (t < (2.5 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n\t\t}\n\t\treturn 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n\t},\n\n\teaseInOutBounce: function(t) {\n\t\tif (t < 0.5) {\n\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\n\t\t}\n\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n\t}\n};\n\nvar helpers_easing = {\n\teffects: effects\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.easingEffects = effects;\n\nvar PI = Math.PI;\nvar RAD_PER_DEG = PI / 180;\nvar DOUBLE_PI = PI * 2;\nvar HALF_PI = PI / 2;\nvar QUARTER_PI = PI / 4;\nvar TWO_THIRDS_PI = PI * 2 / 3;\n\n/**\n * @namespace Chart.helpers.canvas\n */\nvar exports$1 = {\n\t/**\n\t * Clears the entire canvas associated to the given `chart`.\n\t * @param {Chart} chart - The chart for which to clear the canvas.\n\t */\n\tclear: function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t},\n\n\t/**\n\t * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n\t * given size (width, height) and the same `radius` for all corners.\n\t * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t * @param {number} radius - The rounded amount (in pixels) for the four corners.\n\t * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n\t */\n\troundedRect: function(ctx, x, y, width, height, radius) {\n\t\tif (radius) {\n\t\t\tvar r = Math.min(radius, height / 2, width / 2);\n\t\t\tvar left = x + r;\n\t\t\tvar top = y + r;\n\t\t\tvar right = x + width - r;\n\t\t\tvar bottom = y + height - r;\n\n\t\t\tctx.moveTo(x, top);\n\t\t\tif (left < right && top < bottom) {\n\t\t\t\tctx.arc(left, top, r, -PI, -HALF_PI);\n\t\t\t\tctx.arc(right, top, r, -HALF_PI, 0);\n\t\t\t\tctx.arc(right, bottom, r, 0, HALF_PI);\n\t\t\t\tctx.arc(left, bottom, r, HALF_PI, PI);\n\t\t\t} else if (left < right) {\n\t\t\t\tctx.moveTo(left, y);\n\t\t\t\tctx.arc(right, top, r, -HALF_PI, HALF_PI);\n\t\t\t\tctx.arc(left, top, r, HALF_PI, PI + HALF_PI);\n\t\t\t} else if (top < bottom) {\n\t\t\t\tctx.arc(left, top, r, -PI, 0);\n\t\t\t\tctx.arc(left, bottom, r, 0, PI);\n\t\t\t} else {\n\t\t\t\tctx.arc(left, top, r, -PI, PI);\n\t\t\t}\n\t\t\tctx.closePath();\n\t\t\tctx.moveTo(x, y);\n\t\t} else {\n\t\t\tctx.rect(x, y, width, height);\n\t\t}\n\t},\n\n\tdrawPoint: function(ctx, style, radius, x, y, rotation) {\n\t\tvar type, xOffset, yOffset, size, cornerRadius;\n\t\tvar rad = (rotation || 0) * RAD_PER_DEG;\n\n\t\tif (style && typeof style === 'object') {\n\t\t\ttype = style.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.beginPath();\n\n\t\tswitch (style) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.arc(x, y, radius, 0, DOUBLE_PI);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n\t\t\trad += TWO_THIRDS_PI;\n\t\t\tctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n\t\t\trad += TWO_THIRDS_PI;\n\t\t\tctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\t// NOTE: the rounded rect implementation changed to use `arc` instead of\n\t\t\t// `quadraticCurveTo` since it generates better results when rect is\n\t\t\t// almost a circle. 0.516 (instead of 0.5) produces results with visually\n\t\t\t// closer proportion to the previous impl and it is inscribed in the\n\t\t\t// circle with `radius`. For more details, see the following PRs:\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5597\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5858\n\t\t\tcornerRadius = radius * 0.516;\n\t\t\tsize = radius - cornerRadius;\n\t\t\txOffset = Math.cos(rad + QUARTER_PI) * size;\n\t\t\tyOffset = Math.sin(rad + QUARTER_PI) * size;\n\t\t\tctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n\t\t\tctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n\t\t\tctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n\t\t\tctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tif (!rotation) {\n\t\t\t\tsize = Math.SQRT1_2 * radius;\n\t\t\t\tctx.rect(x - size, y - size, 2 * size, 2 * size);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\trad += QUARTER_PI;\n\t\t\t/* falls through */\n\t\tcase 'rectRot':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\trad += QUARTER_PI;\n\t\t\t/* falls through */\n\t\tcase 'cross':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\trad += QUARTER_PI;\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.fill();\n\t\tctx.stroke();\n\t},\n\n\t/**\n\t * Returns true if the point is inside the rectangle\n\t * @param {object} point - The point to test\n\t * @param {object} area - The rectangle\n\t * @returns {boolean}\n\t * @private\n\t */\n\t_isPointInArea: function(point, area) {\n\t\tvar epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n\n\t\treturn point.x > area.left - epsilon && point.x < area.right + epsilon &&\n\t\t\tpoint.y > area.top - epsilon && point.y < area.bottom + epsilon;\n\t},\n\n\tclipArea: function(ctx, area) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n\t\tctx.clip();\n\t},\n\n\tunclipArea: function(ctx) {\n\t\tctx.restore();\n\t},\n\n\tlineTo: function(ctx, previous, target, flip) {\n\t\tvar stepped = target.steppedLine;\n\t\tif (stepped) {\n\t\t\tif (stepped === 'middle') {\n\t\t\t\tvar midpoint = (previous.x + target.x) / 2.0;\n\t\t\t\tctx.lineTo(midpoint, flip ? target.y : previous.y);\n\t\t\t\tctx.lineTo(midpoint, flip ? previous.y : target.y);\n\t\t\t} else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) {\n\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t} else {\n\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t}\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target.tension) {\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.bezierCurveTo(\n\t\t\tflip ? previous.controlPointPreviousX : previous.controlPointNextX,\n\t\t\tflip ? previous.controlPointPreviousY : previous.controlPointNextY,\n\t\t\tflip ? target.controlPointNextX : target.controlPointPreviousX,\n\t\t\tflip ? target.controlPointNextY : target.controlPointPreviousY,\n\t\t\ttarget.x,\n\t\t\ttarget.y);\n\t}\n};\n\nvar helpers_canvas = exports$1;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.clear = exports$1.clear;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.drawRoundedRectangle = function(ctx) {\n\tctx.beginPath();\n\texports$1.roundedRect.apply(exports$1, arguments);\n};\n\nvar defaults = {\n\t/**\n\t * @private\n\t */\n\t_set: function(scope, values) {\n\t\treturn helpers_core.merge(this[scope] || (this[scope] = {}), values);\n\t}\n};\n\ndefaults._set('global', {\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\tdefaultLineHeight: 1.2,\n\tshowLines: true\n});\n\nvar core_defaults = defaults;\n\nvar valueOrDefault = helpers_core.valueOrDefault;\n\n/**\n * Converts the given font object into a CSS font string.\n * @param {object} font - A font object.\n * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nfunction toFontString(font) {\n\tif (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {\n\t\treturn null;\n\t}\n\n\treturn (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\nvar helpers_options = {\n\t/**\n\t * Converts the given line height `value` in pixels for a specific font `size`.\n\t * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n\t * @param {number} size - The font size (in pixels) used to resolve relative `value`.\n\t * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n\t * @since 2.7.0\n\t */\n\ttoLineHeight: function(value, size) {\n\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\t\tif (!matches || matches[1] === 'normal') {\n\t\t\treturn size * 1.2;\n\t\t}\n\n\t\tvalue = +matches[2];\n\n\t\tswitch (matches[3]) {\n\t\tcase 'px':\n\t\t\treturn value;\n\t\tcase '%':\n\t\t\tvalue /= 100;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn size * value;\n\t},\n\n\t/**\n\t * Converts the given value into a padding object with pre-computed width/height.\n\t * @param {number|object} value - If a number, set the value to all TRBL component,\n\t * else, if and object, use defined properties and sets undefined ones to 0.\n\t * @returns {object} The padding values (top, right, bottom, left, width, height)\n\t * @since 2.7.0\n\t */\n\ttoPadding: function(value) {\n\t\tvar t, r, b, l;\n\n\t\tif (helpers_core.isObject(value)) {\n\t\t\tt = +value.top || 0;\n\t\t\tr = +value.right || 0;\n\t\t\tb = +value.bottom || 0;\n\t\t\tl = +value.left || 0;\n\t\t} else {\n\t\t\tt = r = b = l = +value || 0;\n\t\t}\n\n\t\treturn {\n\t\t\ttop: t,\n\t\t\tright: r,\n\t\t\tbottom: b,\n\t\t\tleft: l,\n\t\t\theight: t + b,\n\t\t\twidth: l + r\n\t\t};\n\t},\n\n\t/**\n\t * Parses font options and returns the font object.\n\t * @param {object} options - A object that contains font options to be parsed.\n\t * @return {object} The font object.\n\t * @todo Support font.* options and renamed to toFont().\n\t * @private\n\t */\n\t_parseFont: function(options) {\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar font = {\n\t\t\tfamily: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),\n\t\t\tlineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),\n\t\t\tsize: size,\n\t\t\tstyle: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),\n\t\t\tweight: null,\n\t\t\tstring: ''\n\t\t};\n\n\t\tfont.string = toFontString(font);\n\t\treturn font;\n\t},\n\n\t/**\n\t * Evaluates the given `inputs` sequentially and returns the first defined value.\n\t * @param {Array} inputs - An array of values, falling back to the last value.\n\t * @param {object} [context] - If defined and the current value is a function, the value\n\t * is called with `context` as first argument and the result becomes the new input.\n\t * @param {number} [index] - If defined and the current value is an array, the value\n\t * at `index` become the new input.\n\t * @since 2.7.0\n\t */\n\tresolve: function(inputs, context, index) {\n\t\tvar i, ilen, value;\n\n\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\n\t\t\tvalue = inputs[i];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (context !== undefined && typeof value === 'function') {\n\t\t\t\tvalue = value(context);\n\t\t\t}\n\t\t\tif (index !== undefined && helpers_core.isArray(value)) {\n\t\t\t\tvalue = value[index];\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar helpers$1 = helpers_core;\nvar easing = helpers_easing;\nvar canvas = helpers_canvas;\nvar options = helpers_options;\nhelpers$1.easing = easing;\nhelpers$1.canvas = canvas;\nhelpers$1.options = options;\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 = chartjsColor(origin);\n\t\t\t\tif (c0.valid) {\n\t\t\t\t\tc1 = chartjsColor(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 (helpers$1.isFinite(origin) && helpers$1.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$1.extend(this, configuration);\n\tthis.initialize.apply(this, arguments);\n};\n\nhelpers$1.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$1.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$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);\n\t}\n});\n\nElement.extend = helpers$1.inherits;\n\nvar core_element = Element;\n\nvar exports$2 = core_element.extend({\n\tchart: null, // the animation associated chart instance\n\tcurrentStep: 0, // the current animation step\n\tnumSteps: 60, // default number of steps\n\teasing: '', // the easing to use for this animation\n\trender: null, // render function used by the animation service\n\n\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n});\n\nvar core_animation = exports$2;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.Animation instead\n * @prop Chart.Animation#animationObject\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\nObject.defineProperty(exports$2.prototype, 'animationObject', {\n\tget: function() {\n\t\treturn this;\n\t}\n});\n\n/**\n * Provided for backward compatibility, use Chart.Animation#chart instead\n * @prop Chart.Animation#chartInstance\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\nObject.defineProperty(exports$2.prototype, 'chartInstance', {\n\tget: function() {\n\t\treturn this.chart;\n\t},\n\tset: function(value) {\n\t\tthis.chart = value;\n\t}\n});\n\ncore_defaults._set('global', {\n\tanimation: {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers$1.noop,\n\t\tonComplete: helpers$1.noop\n\t}\n});\n\nvar core_animations = {\n\tanimations: [],\n\trequest: null,\n\n\t/**\n\t * @param {Chart} chart - The chart to animate.\n\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t * @param {number} duration - The animation duration in ms.\n\t * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t */\n\taddAnimation: function(chart, animation, duration, lazy) {\n\t\tvar animations = this.animations;\n\t\tvar i, ilen;\n\n\t\tanimation.chart = chart;\n\t\tanimation.startTime = Date.now();\n\t\tanimation.duration = duration;\n\n\t\tif (!lazy) {\n\t\t\tchart.animating = true;\n\t\t}\n\n\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\tif (animations[i].chart === chart) {\n\t\t\t\tanimations[i] = animation;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tanimations.push(animation);\n\n\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\tif (animations.length === 1) {\n\t\t\tthis.requestAnimationFrame();\n\t\t}\n\t},\n\n\tcancelAnimation: function(chart) {\n\t\tvar index = helpers$1.findIndex(this.animations, function(animation) {\n\t\t\treturn animation.chart === chart;\n\t\t});\n\n\t\tif (index !== -1) {\n\t\t\tthis.animations.splice(index, 1);\n\t\t\tchart.animating = false;\n\t\t}\n\t},\n\n\trequestAnimationFrame: function() {\n\t\tvar me = this;\n\t\tif (me.request === null) {\n\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\tme.request = helpers$1.requestAnimFrame.call(window, function() {\n\t\t\t\tme.request = null;\n\t\t\t\tme.startDigest();\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tstartDigest: function() {\n\t\tvar me = this;\n\n\t\tme.advance();\n\n\t\t// Do we have more stuff to animate?\n\t\tif (me.animations.length > 0) {\n\t\t\tme.requestAnimationFrame();\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tadvance: function() {\n\t\tvar animations = this.animations;\n\t\tvar animation, chart, numSteps, nextStep;\n\t\tvar i = 0;\n\n\t\t// 1 animation per chart, so we are looping charts here\n\t\twhile (i < animations.length) {\n\t\t\tanimation = animations[i];\n\t\t\tchart = animation.chart;\n\t\t\tnumSteps = animation.numSteps;\n\n\t\t\t// Make sure that currentStep starts at 1\n\t\t\t// https://github.com/chartjs/Chart.js/issues/6104\n\t\t\tnextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;\n\t\t\tanimation.currentStep = Math.min(nextStep, numSteps);\n\n\t\t\thelpers$1.callback(animation.render, [chart, animation], chart);\n\t\t\thelpers$1.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\tif (animation.currentStep >= numSteps) {\n\t\t\t\thelpers$1.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\tchart.animating = false;\n\t\t\t\tanimations.splice(i, 1);\n\t\t\t} else {\n\t\t\t\t++i;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar resolve = helpers$1.options.resolve;\n\nvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n */\nfunction listenArrayEvents(array, listener) {\n\tif (array._chartjs) {\n\t\tarray._chartjs.listeners.push(listener);\n\t\treturn;\n\t}\n\n\tObject.defineProperty(array, '_chartjs', {\n\t\tconfigurable: true,\n\t\tenumerable: false,\n\t\tvalue: {\n\t\t\tlisteners: [listener]\n\t\t}\n\t});\n\n\tarrayEvents.forEach(function(key) {\n\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\tvar base = array[key];\n\n\t\tObject.defineProperty(array, key, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: function() {\n\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\thelpers$1.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn res;\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nfunction unlistenArrayEvents(array, listener) {\n\tvar stub = array._chartjs;\n\tif (!stub) {\n\t\treturn;\n\t}\n\n\tvar listeners = stub.listeners;\n\tvar index = listeners.indexOf(listener);\n\tif (index !== -1) {\n\t\tlisteners.splice(index, 1);\n\t}\n\n\tif (listeners.length > 0) {\n\t\treturn;\n\t}\n\n\tarrayEvents.forEach(function(key) {\n\t\tdelete array[key];\n\t});\n\n\tdelete array._chartjs;\n}\n\n// Base class for all dataset controllers (line, bar, etc)\nvar DatasetController = function(chart, datasetIndex) {\n\tthis.initialize(chart, datasetIndex);\n};\n\nhelpers$1.extend(DatasetController.prototype, {\n\n\t/**\n\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t * @type {Chart.core.element}\n\t */\n\tdatasetElementType: null,\n\n\t/**\n\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t * @type {Chart.core.element}\n\t */\n\tdataElementType: null,\n\n\tinitialize: function(chart, datasetIndex) {\n\t\tvar me = this;\n\t\tme.chart = chart;\n\t\tme.index = datasetIndex;\n\t\tme.linkScales();\n\t\tme.addElements();\n\t},\n\n\tupdateIndex: function(datasetIndex) {\n\t\tthis.index = datasetIndex;\n\t},\n\n\tlinkScales: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar dataset = me.getDataset();\n\n\t\tif (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {\n\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t}\n\t\tif (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {\n\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t}\n\t},\n\n\tgetDataset: function() {\n\t\treturn this.chart.data.datasets[this.index];\n\t},\n\n\tgetMeta: function() {\n\t\treturn this.chart.getDatasetMeta(this.index);\n\t},\n\n\tgetScaleForId: function(scaleID) {\n\t\treturn this.chart.scales[scaleID];\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getValueScaleId: function() {\n\t\treturn this.getMeta().yAxisID;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScaleId: function() {\n\t\treturn this.getMeta().xAxisID;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getValueScale: function() {\n\t\treturn this.getScaleForId(this._getValueScaleId());\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScale: function() {\n\t\treturn this.getScaleForId(this._getIndexScaleId());\n\t},\n\n\treset: function() {\n\t\tthis.update(true);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tdestroy: function() {\n\t\tif (this._data) {\n\t\t\tunlistenArrayEvents(this._data, this);\n\t\t}\n\t},\n\n\tcreateMetaDataset: function() {\n\t\tvar me = this;\n\t\tvar type = me.datasetElementType;\n\t\treturn type && new type({\n\t\t\t_chart: me.chart,\n\t\t\t_datasetIndex: me.index\n\t\t});\n\t},\n\n\tcreateMetaData: function(index) {\n\t\tvar me = this;\n\t\tvar type = me.dataElementType;\n\t\treturn type && new type({\n\t\t\t_chart: me.chart,\n\t\t\t_datasetIndex: me.index,\n\t\t\t_index: index\n\t\t});\n\t},\n\n\taddElements: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar data = me.getDataset().data || [];\n\t\tvar metaData = meta.data;\n\t\tvar i, ilen;\n\n\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t}\n\n\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t},\n\n\taddElementAndReset: function(index) {\n\t\tvar element = this.createMetaData(index);\n\t\tthis.getMeta().data.splice(index, 0, element);\n\t\tthis.updateElement(element, index, true);\n\t},\n\n\tbuildOrUpdateElements: function() {\n\t\tvar me = this;\n\t\tvar dataset = me.getDataset();\n\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t// the internal meta data accordingly.\n\t\tif (me._data !== data) {\n\t\t\tif (me._data) {\n\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t}\n\n\t\t\tif (data && Object.isExtensible(data)) {\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t}\n\t\t\tme._data = data;\n\t\t}\n\n\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\tme.resyncElements();\n\t},\n\n\tupdate: helpers$1.noop,\n\n\ttransition: function(easingValue) {\n\t\tvar meta = this.getMeta();\n\t\tvar elements = meta.data || [];\n\t\tvar ilen = elements.length;\n\t\tvar i = 0;\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\telements[i].transition(easingValue);\n\t\t}\n\n\t\tif (meta.dataset) {\n\t\t\tmeta.dataset.transition(easingValue);\n\t\t}\n\t},\n\n\tdraw: function() {\n\t\tvar meta = this.getMeta();\n\t\tvar elements = meta.data || [];\n\t\tvar ilen = elements.length;\n\t\tvar i = 0;\n\n\t\tif (meta.dataset) {\n\t\t\tmeta.dataset.draw();\n\t\t}\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\telements[i].draw();\n\t\t}\n\t},\n\n\tremoveHoverStyle: function(element) {\n\t\thelpers$1.merge(element._model, element.$previousStyle || {});\n\t\tdelete element.$previousStyle;\n\t},\n\n\tsetHoverStyle: function(element) {\n\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\tvar index = element._index;\n\t\tvar custom = element.custom || {};\n\t\tvar model = element._model;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\telement.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth\n\t\t};\n\n\t\tmodel.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);\n\t\tmodel.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);\n\t\tmodel.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tresyncElements: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar data = me.getDataset().data;\n\t\tvar numMeta = meta.data.length;\n\t\tvar numData = data.length;\n\n\t\tif (numData < numMeta) {\n\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t} else if (numData > numMeta) {\n\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tinsertElements: function(start, count) {\n\t\tfor (var i = 0; i < count; ++i) {\n\t\t\tthis.addElementAndReset(start + i);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataPush: function() {\n\t\tvar count = arguments.length;\n\t\tthis.insertElements(this.getDataset().data.length - count, count);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataPop: function() {\n\t\tthis.getMeta().data.pop();\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataShift: function() {\n\t\tthis.getMeta().data.shift();\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataSplice: function(start, count) {\n\t\tthis.getMeta().data.splice(start, count);\n\t\tthis.insertElements(start, arguments.length - 2);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataUnshift: function() {\n\t\tthis.insertElements(0, arguments.length);\n\t}\n});\n\nDatasetController.extend = helpers$1.inherits;\n\nvar core_datasetController = DatasetController;\n\ncore_defaults._set('global', {\n\telements: {\n\t\tarc: {\n\t\t\tbackgroundColor: core_defaults.global.defaultColor,\n\t\t\tborderColor: '#fff',\n\t\t\tborderWidth: 2,\n\t\t\tborderAlign: 'center'\n\t\t}\n\t}\n});\n\nvar element_arc = core_element.extend({\n\tinLabelRange: function(mouseX) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t}\n\t\treturn false;\n\t},\n\n\tinRange: function(chartX, chartY) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\tvar pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});\n\t\t\tvar\tangle = pointRelativePosition.angle;\n\t\t\tvar distance = pointRelativePosition.distance;\n\n\t\t\t// Sanitise angle range\n\t\t\tvar startAngle = vm.startAngle;\n\t\t\tvar endAngle = vm.endAngle;\n\t\t\twhile (endAngle < startAngle) {\n\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t}\n\t\t\twhile (angle > endAngle) {\n\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t}\n\t\t\twhile (angle < startAngle) {\n\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t}\n\n\t\t\t// Check if within the range of the open/close angle\n\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle);\n\t\t\tvar withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\treturn (betweenAngles && withinRadius);\n\t\t}\n\t\treturn false;\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\treturn {\n\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n\t\treturn {\n\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t};\n\t},\n\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar sA = vm.startAngle;\n\t\tvar eA = vm.endAngle;\n\t\tvar pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;\n\t\tvar angleMargin;\n\n\t\tctx.save();\n\n\t\tctx.beginPath();\n\t\tctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);\n\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\t\tctx.closePath();\n\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.fill();\n\n\t\tif (vm.borderWidth) {\n\t\t\tif (vm.borderAlign === 'inner') {\n\t\t\t\t// Draw an inner border by cliping the arc and drawing a double-width border\n\t\t\t\t// Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n\t\t\t\tctx.beginPath();\n\t\t\t\tangleMargin = pixelMargin / vm.outerRadius;\n\t\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin);\n\t\t\t\tif (vm.innerRadius > pixelMargin) {\n\t\t\t\t\tangleMargin = pixelMargin / vm.innerRadius;\n\t\t\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true);\n\t\t\t\t} else {\n\t\t\t\t\tctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2);\n\t\t\t\t}\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.clip();\n\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\t\t\t\tctx.closePath();\n\n\t\t\t\tctx.lineWidth = vm.borderWidth * 2;\n\t\t\t\tctx.lineJoin = 'round';\n\t\t\t} else {\n\t\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\t\tctx.lineJoin = 'bevel';\n\t\t\t}\n\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.stroke();\n\t\t}\n\n\t\tctx.restore();\n\t}\n});\n\nvar valueOrDefault$1 = helpers$1.valueOrDefault;\n\nvar defaultColor = core_defaults.global.defaultColor;\n\ncore_defaults._set('global', {\n\telements: {\n\t\tline: {\n\t\t\ttension: 0.4,\n\t\t\tbackgroundColor: defaultColor,\n\t\t\tborderWidth: 3,\n\t\t\tborderColor: defaultColor,\n\t\t\tborderCapStyle: 'butt',\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0,\n\t\t\tborderJoinStyle: 'miter',\n\t\t\tcapBezierPoints: true,\n\t\t\tfill: true, // do we fill in the area between the line and its base axis\n\t\t}\n\t}\n});\n\nvar element_line = core_element.extend({\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar vm = me._view;\n\t\tvar ctx = me._chart.ctx;\n\t\tvar spanGaps = vm.spanGaps;\n\t\tvar points = me._children.slice(); // clone array\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\tvar lastDrawnIndex = -1;\n\t\tvar index, current, previous, currentVM;\n\n\t\t// If we are looping, adding the first point again\n\t\tif (me._loop && points.length) {\n\t\t\tpoints.push(points[0]);\n\t\t}\n\n\t\tctx.save();\n\n\t\t// Stroke Line Options\n\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t// IE 9 and 10 do not support line dash\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t}\n\n\t\tctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);\n\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\tctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);\n\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t// Stroke Line\n\t\tctx.beginPath();\n\t\tlastDrawnIndex = -1;\n\n\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\tcurrent = points[index];\n\t\t\tprevious = helpers$1.previousItem(points, index);\n\t\t\tcurrentVM = current._view;\n\n\t\t\t// First point moves to it's starting position no matter what\n\t\t\tif (index === 0) {\n\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\thelpers$1.canvas.lineTo(ctx, previous._view, current._view);\n\t\t\t\t\t}\n\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\t\tctx.restore();\n\t}\n});\n\nvar valueOrDefault$2 = helpers$1.valueOrDefault;\n\nvar defaultColor$1 = core_defaults.global.defaultColor;\n\ncore_defaults._set('global', {\n\telements: {\n\t\tpoint: {\n\t\t\tradius: 3,\n\t\t\tpointStyle: 'circle',\n\t\t\tbackgroundColor: defaultColor$1,\n\t\t\tborderColor: defaultColor$1,\n\t\t\tborderWidth: 1,\n\t\t\t// Hover\n\t\t\thitRadius: 1,\n\t\t\thoverRadius: 4,\n\t\t\thoverBorderWidth: 1\n\t\t}\n\t}\n});\n\nfunction xRange(mouseX) {\n\tvar vm = this._view;\n\treturn vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false;\n}\n\nfunction yRange(mouseY) {\n\tvar vm = this._view;\n\treturn vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false;\n}\n\nvar element_point = core_element.extend({\n\tinRange: function(mouseX, mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t},\n\n\tinLabelRange: xRange,\n\tinXRange: xRange,\n\tinYRange: yRange,\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y,\n\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t};\n\t},\n\n\tdraw: function(chartArea) {\n\t\tvar vm = this._view;\n\t\tvar ctx = this._chart.ctx;\n\t\tvar pointStyle = vm.pointStyle;\n\t\tvar rotation = vm.rotation;\n\t\tvar radius = vm.radius;\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow\n\n\t\tif (vm.skip) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clipping for Points.\n\t\tif (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {\n\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\tctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);\n\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\t\t\thelpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\n\t\t}\n\t}\n});\n\nvar defaultColor$2 = core_defaults.global.defaultColor;\n\ncore_defaults._set('global', {\n\telements: {\n\t\trectangle: {\n\t\t\tbackgroundColor: defaultColor$2,\n\t\t\tborderColor: defaultColor$2,\n\t\t\tborderSkipped: 'bottom',\n\t\t\tborderWidth: 0\n\t\t}\n\t}\n});\n\nfunction isVertical(vm) {\n\treturn vm && vm.width !== undefined;\n}\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\nfunction getBarBounds(vm) {\n\tvar x1, x2, y1, y2, half;\n\n\tif (isVertical(vm)) {\n\t\thalf = vm.width / 2;\n\t\tx1 = vm.x - half;\n\t\tx2 = vm.x + half;\n\t\ty1 = Math.min(vm.y, vm.base);\n\t\ty2 = Math.max(vm.y, vm.base);\n\t} else {\n\t\thalf = vm.height / 2;\n\t\tx1 = Math.min(vm.x, vm.base);\n\t\tx2 = Math.max(vm.x, vm.base);\n\t\ty1 = vm.y - half;\n\t\ty2 = vm.y + half;\n\t}\n\n\treturn {\n\t\tleft: x1,\n\t\ttop: y1,\n\t\tright: x2,\n\t\tbottom: y2\n\t};\n}\n\nfunction swap(orig, v1, v2) {\n\treturn orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction parseBorderSkipped(vm) {\n\tvar edge = vm.borderSkipped;\n\tvar res = {};\n\n\tif (!edge) {\n\t\treturn res;\n\t}\n\n\tif (vm.horizontal) {\n\t\tif (vm.base > vm.x) {\n\t\t\tedge = swap(edge, 'left', 'right');\n\t\t}\n\t} else if (vm.base < vm.y) {\n\t\tedge = swap(edge, 'bottom', 'top');\n\t}\n\n\tres[edge] = true;\n\treturn res;\n}\n\nfunction parseBorderWidth(vm, maxW, maxH) {\n\tvar value = vm.borderWidth;\n\tvar skip = parseBorderSkipped(vm);\n\tvar t, r, b, l;\n\n\tif (helpers$1.isObject(value)) {\n\t\tt = +value.top || 0;\n\t\tr = +value.right || 0;\n\t\tb = +value.bottom || 0;\n\t\tl = +value.left || 0;\n\t} else {\n\t\tt = r = b = l = +value || 0;\n\t}\n\n\treturn {\n\t\tt: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t,\n\t\tr: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r,\n\t\tb: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b,\n\t\tl: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l\n\t};\n}\n\nfunction boundingRects(vm) {\n\tvar bounds = getBarBounds(vm);\n\tvar width = bounds.right - bounds.left;\n\tvar height = bounds.bottom - bounds.top;\n\tvar border = parseBorderWidth(vm, width / 2, height / 2);\n\n\treturn {\n\t\touter: {\n\t\t\tx: bounds.left,\n\t\t\ty: bounds.top,\n\t\t\tw: width,\n\t\t\th: height\n\t\t},\n\t\tinner: {\n\t\t\tx: bounds.left + border.l,\n\t\t\ty: bounds.top + border.t,\n\t\t\tw: width - border.l - border.r,\n\t\t\th: height - border.t - border.b\n\t\t}\n\t};\n}\n\nfunction inRange(vm, x, y) {\n\tvar skipX = x === null;\n\tvar skipY = y === null;\n\tvar bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm);\n\n\treturn bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\n\nvar element_rectangle = core_element.extend({\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar rects = boundingRects(vm);\n\t\tvar outer = rects.outer;\n\t\tvar inner = rects.inner;\n\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.fillRect(outer.x, outer.y, outer.w, outer.h);\n\n\t\tif (outer.w === inner.w && outer.h === inner.h) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(outer.x, outer.y, outer.w, outer.h);\n\t\tctx.clip();\n\t\tctx.fillStyle = vm.borderColor;\n\t\tctx.rect(inner.x, inner.y, inner.w, inner.h);\n\t\tctx.fill('evenodd');\n\t\tctx.restore();\n\t},\n\n\theight: function() {\n\t\tvar vm = this._view;\n\t\treturn vm.base - vm.y;\n\t},\n\n\tinRange: function(mouseX, mouseY) {\n\t\treturn inRange(this._view, mouseX, mouseY);\n\t},\n\n\tinLabelRange: function(mouseX, mouseY) {\n\t\tvar vm = this._view;\n\t\treturn isVertical(vm)\n\t\t\t? inRange(vm, mouseX, null)\n\t\t\t: inRange(vm, null, mouseY);\n\t},\n\n\tinXRange: function(mouseX) {\n\t\treturn inRange(this._view, mouseX, null);\n\t},\n\n\tinYRange: function(mouseY) {\n\t\treturn inRange(this._view, null, mouseY);\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar x, y;\n\t\tif (isVertical(vm)) {\n\t\t\tx = vm.x;\n\t\t\ty = (vm.y + vm.base) / 2;\n\t\t} else {\n\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\ty = vm.y;\n\t\t}\n\n\t\treturn {x: x, y: y};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\n\t\treturn isVertical(vm)\n\t\t\t? vm.width * Math.abs(vm.y - vm.base)\n\t\t\t: vm.height * Math.abs(vm.x - vm.base);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t}\n});\n\nvar elements = {};\nvar Arc = element_arc;\nvar Line = element_line;\nvar Point = element_point;\nvar Rectangle = element_rectangle;\nelements.Arc = Arc;\nelements.Line = Line;\nelements.Point = Point;\nelements.Rectangle = Rectangle;\n\nvar resolve$1 = helpers$1.options.resolve;\n\ncore_defaults._set('bar', {\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\t\t\toffset: true,\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\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, Math.abs(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$1.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 size.\n\t\tprev = curr - (next === null ? ruler.end - ruler.start : 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 - Math.min(prev, next)) / 2 * percent;\n\tsize = Math.abs(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\nvar controller_bar = core_datasetController.extend({\n\n\tdataElementType: elements.Rectangle,\n\n\tinitialize: function() {\n\t\tvar me = this;\n\t\tvar meta;\n\n\t\tcore_datasetController.prototype.initialize.apply(me, arguments);\n\n\t\tmeta = me.getMeta();\n\t\tmeta.stack = me.getDataset().stack;\n\t\tmeta.bar = true;\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar rects = me.getMeta().data;\n\t\tvar i, ilen;\n\n\t\tme._ruler = me.getRuler();\n\n\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\tme.updateElement(rects[i], i, reset);\n\t\t}\n\t},\n\n\tupdateElement: function(rectangle, index, reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar dataset = me.getDataset();\n\t\tvar options = me._resolveElementOptions(rectangle, index);\n\n\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\trectangle._datasetIndex = me.index;\n\t\trectangle._index = index;\n\t\trectangle._model = {\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderSkipped: options.borderSkipped,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\tdatasetLabel: dataset.label,\n\t\t\tlabel: me.chart.data.labels[index]\n\t\t};\n\n\t\tme._updateElementGeometry(rectangle, index, reset);\n\n\t\trectangle.pivot();\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_updateElementGeometry: function(rectangle, index, reset) {\n\t\tvar me = this;\n\t\tvar model = rectangle._model;\n\t\tvar vscale = me._getValueScale();\n\t\tvar base = vscale.getBasePixel();\n\t\tvar horizontal = vscale.isHorizontal();\n\t\tvar ruler = me._ruler || me.getRuler();\n\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\tmodel.horizontal = horizontal;\n\t\tmodel.base = reset ? base : vpixels.base;\n\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t},\n\n\t/**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n\t_getStacks: function(last) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar scale = me._getIndexScale();\n\t\tvar stacked = scale.options.stacked;\n\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\tvar stacks = [];\n\t\tvar i, meta;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\tif (meta.bar && chart.isDatasetVisible(i) &&\n\t\t\t\t(stacked === false ||\n\t\t\t\t(stacked === true && stacks.indexOf(meta.stack) === -1) ||\n\t\t\t\t(stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n\t\t\t\tstacks.push(meta.stack);\n\t\t\t}\n\t\t}\n\n\t\treturn stacks;\n\t},\n\n\t/**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n\tgetStackCount: function() {\n\t\treturn this._getStacks().length;\n\t},\n\n\t/**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n\t * @returns {number} The stack index\n\t * @private\n\t */\n\tgetStackIndex: function(datasetIndex, name) {\n\t\tvar stacks = this._getStacks(datasetIndex);\n\t\tvar index = (name !== undefined)\n\t\t\t? stacks.indexOf(name)\n\t\t\t: -1; // indexOf returns -1 if element is not present\n\n\t\treturn (index === -1)\n\t\t\t? stacks.length - 1\n\t\t\t: index;\n\t},\n\n\t/**\n\t * @private\n\t */\n\tgetRuler: function() {\n\t\tvar me = this;\n\t\tvar scale = me._getIndexScale();\n\t\tvar stackCount = me.getStackCount();\n\t\tvar datasetIndex = me.index;\n\t\tvar isHorizontal = scale.isHorizontal();\n\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\tvar pixels = [];\n\t\tvar i, ilen, min;\n\n\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t}\n\n\t\tmin = helpers$1.isNullOrUndef(scale.options.barThickness)\n\t\t\t? computeMinSampleSize(scale, pixels)\n\t\t\t: -1;\n\n\t\treturn {\n\t\t\tmin: min,\n\t\t\tpixels: pixels,\n\t\t\tstart: start,\n\t\t\tend: end,\n\t\t\tstackCount: stackCount,\n\t\t\tscale: scale\n\t\t};\n\t},\n\n\t/**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n\tcalculateBarValuePixels: function(datasetIndex, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar meta = me.getMeta();\n\t\tvar scale = me._getValueScale();\n\t\tvar isHorizontal = scale.isHorizontal();\n\t\tvar datasets = chart.data.datasets;\n\t\tvar value = +scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\tvar minBarLength = scale.options.minBarLength;\n\t\tvar stacked = scale.options.stacked;\n\t\tvar stack = meta.stack;\n\t\tvar start = 0;\n\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\tif (imeta.bar &&\n\t\t\t\t\timeta.stack === stack &&\n\t\t\t\t\timeta.controller._getValueScaleId() === scale.id &&\n\t\t\t\t\tchart.isDatasetVisible(i)) {\n\n\t\t\t\t\tivalue = +scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\tif ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbase = scale.getPixelForValue(start);\n\t\thead = scale.getPixelForValue(start + value);\n\t\tsize = head - base;\n\n\t\tif (minBarLength !== undefined && Math.abs(size) < minBarLength) {\n\t\t\tsize = minBarLength;\n\t\t\tif (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {\n\t\t\t\thead = base - minBarLength;\n\t\t\t} else {\n\t\t\t\thead = base + minBarLength;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tbase: base,\n\t\t\thead: head,\n\t\t\tcenter: head + size / 2\n\t\t};\n\t},\n\n\t/**\n\t * @private\n\t */\n\tcalculateBarIndexPixels: function(datasetIndex, index, ruler) {\n\t\tvar me = this;\n\t\tvar options = ruler.scale.options;\n\t\tvar range = options.barThickness === 'flex'\n\t\t\t? computeFlexCategoryTraits(index, ruler, options)\n\t\t\t: computeFitCategoryTraits(index, ruler, options);\n\n\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n\t\tvar center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n\t\tvar size = Math.min(\n\t\t\thelpers$1.valueOrDefault(options.maxBarThickness, Infinity),\n\t\t\trange.chunk * range.ratio);\n\n\t\treturn {\n\t\t\tbase: center - size / 2,\n\t\t\thead: center + size / 2,\n\t\t\tcenter: center,\n\t\t\tsize: size\n\t\t};\n\t},\n\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar scale = me._getValueScale();\n\t\tvar rects = me.getMeta().data;\n\t\tvar dataset = me.getDataset();\n\t\tvar ilen = rects.length;\n\t\tvar i = 0;\n\n\t\thelpers$1.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\trects[i].draw();\n\t\t\t}\n\t\t}\n\n\t\thelpers$1.canvas.unclipArea(chart.ctx);\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveElementOptions: function(rectangle, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar datasets = chart.data.datasets;\n\t\tvar dataset = datasets[me.index];\n\t\tvar custom = rectangle.custom || {};\n\t\tvar options = chart.options.elements.rectangle;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\tvar keys = [\n\t\t\t'backgroundColor',\n\t\t\t'borderColor',\n\t\t\t'borderSkipped',\n\t\t\t'borderWidth'\n\t\t];\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$1([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t], context, index);\n\t\t}\n\n\t\treturn values;\n\t}\n});\n\nvar valueOrDefault$3 = helpers$1.valueOrDefault;\nvar resolve$2 = helpers$1.options.resolve;\n\ncore_defaults._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\nvar controller_bubble = core_datasetController.extend({\n\t/**\n\t * @protected\n\t */\n\tdataElementType: elements.Point,\n\n\t/**\n\t * @protected\n\t */\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar points = meta.data;\n\n\t\t// Update Points\n\t\thelpers$1.each(points, function(point, index) {\n\t\t\tme.updateElement(point, index, reset);\n\t\t});\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tupdateElement: function(point, index, reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar custom = point.custom || {};\n\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\tvar options = me._resolveElementOptions(point, index);\n\t\tvar data = me.getDataset().data[index];\n\t\tvar dsIndex = me.index;\n\n\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\tpoint._xScale = xScale;\n\t\tpoint._yScale = yScale;\n\t\tpoint._options = options;\n\t\tpoint._datasetIndex = dsIndex;\n\t\tpoint._index = index;\n\t\tpoint._model = {\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\thitRadius: options.hitRadius,\n\t\t\tpointStyle: options.pointStyle,\n\t\t\trotation: options.rotation,\n\t\t\tradius: reset ? 0 : options.radius,\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t};\n\n\t\tpoint.pivot();\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(point) {\n\t\tvar model = point._model;\n\t\tvar options = point._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tpoint.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t\tradius: model.radius\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth);\n\t\tmodel.radius = options.radius + options.hoverRadius;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveElementOptions: function(point, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar datasets = chart.data.datasets;\n\t\tvar dataset = datasets[me.index];\n\t\tvar custom = point.custom || {};\n\t\tvar options = chart.options.elements.point;\n\t\tvar data = dataset.data[index];\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\tvar keys = [\n\t\t\t'backgroundColor',\n\t\t\t'borderColor',\n\t\t\t'borderWidth',\n\t\t\t'hoverBackgroundColor',\n\t\t\t'hoverBorderColor',\n\t\t\t'hoverBorderWidth',\n\t\t\t'hoverRadius',\n\t\t\t'hitRadius',\n\t\t\t'pointStyle',\n\t\t\t'rotation'\n\t\t];\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$2([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t], context, index);\n\t\t}\n\n\t\t// Custom radius resolution\n\t\tvalues.radius = resolve$2([\n\t\t\tcustom.radius,\n\t\t\tdata ? data.r : undefined,\n\t\t\tdataset.radius,\n\t\t\toptions.radius\n\t\t], context, index);\n\n\t\treturn values;\n\t}\n});\n\nvar resolve$3 = helpers$1.options.resolve;\nvar valueOrDefault$4 = helpers$1.valueOrDefault;\n\ncore_defaults._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 arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);\n\t\t\t\t\t\tvar stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);\n\t\t\t\t\t\tvar bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);\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$1.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\nvar controller_doughnut = core_datasetController.extend({\n\n\tdataElementType: elements.Arc,\n\n\tlinkScales: helpers$1.noop,\n\n\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\tgetRingIndex: function(datasetIndex) {\n\t\tvar ringIndex = 0;\n\n\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t++ringIndex;\n\t\t\t}\n\t\t}\n\n\t\treturn ringIndex;\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar chartArea = chart.chartArea;\n\t\tvar opts = chart.options;\n\t\tvar availableWidth = chartArea.right - chartArea.left;\n\t\tvar availableHeight = chartArea.bottom - chartArea.top;\n\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\tvar offset = {x: 0, y: 0};\n\t\tvar meta = me.getMeta();\n\t\tvar arcs = meta.data;\n\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\tvar circumference = opts.circumference;\n\t\tvar chartWeight = me._getRingWeight(me.index);\n\t\tvar i, ilen;\n\n\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\tif (circumference < Math.PI * 2.0) {\n\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\tvar endAngle = startAngle + circumference;\n\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\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\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\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\tvar cutout = cutoutPercentage / 100.0;\n\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\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\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t}\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tarcs[i]._options = me._resolveElementOptions(arcs[i], i);\n\t\t}\n\n\t\tchart.borderWidth = me.getMaxBorderWidth();\n\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);\n\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\tmeta.total = me.calculateTotal();\n\n\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);\n\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tme.updateElement(arcs[i], i, reset);\n\t\t}\n\t},\n\n\tupdateElement: function(arc, index, reset) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar chartArea = chart.chartArea;\n\t\tvar opts = chart.options;\n\t\tvar animationOpts = opts.animation;\n\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\tvar dataset = me.getDataset();\n\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\tvar options = arc._options || {};\n\n\t\thelpers$1.extend(arc, {\n\t\t\t// Utility\n\t\t\t_datasetIndex: me.index,\n\t\t\t_index: index,\n\n\t\t\t// Desired view properties\n\t\t\t_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\tborderAlign: options.borderAlign,\n\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\tstartAngle: startAngle,\n\t\t\t\tendAngle: endAngle,\n\t\t\t\tcircumference: circumference,\n\t\t\t\touterRadius: outerRadius,\n\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\tlabel: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t}\n\t\t});\n\n\t\tvar model = arc._model;\n\n\t\t// Set correct angles if not resetting\n\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\tif (index === 0) {\n\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t} else {\n\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t}\n\n\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t}\n\n\t\tarc.pivot();\n\t},\n\n\tcalculateTotal: function() {\n\t\tvar dataset = this.getDataset();\n\t\tvar meta = this.getMeta();\n\t\tvar total = 0;\n\t\tvar value;\n\n\t\thelpers$1.each(meta.data, function(element, index) {\n\t\t\tvalue = dataset.data[index];\n\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\ttotal += Math.abs(value);\n\t\t\t}\n\t\t});\n\n\t\t/* if (total === 0) {\n\t\t\ttotal = NaN;\n\t\t}*/\n\n\t\treturn total;\n\t},\n\n\tcalculateCircumference: function(value) {\n\t\tvar total = this.getMeta().total;\n\t\tif (total > 0 && !isNaN(value)) {\n\t\t\treturn (Math.PI * 2.0) * (Math.abs(value) / total);\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// gets the max border or hover width to properly scale pie charts\n\tgetMaxBorderWidth: function(arcs) {\n\t\tvar me = this;\n\t\tvar max = 0;\n\t\tvar chart = me.chart;\n\t\tvar i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;\n\n\t\tif (!arcs) {\n\t\t\t// Find the outmost visible dataset\n\t\t\tfor (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tarcs = meta.data;\n\t\t\t\t\tif (i !== me.index) {\n\t\t\t\t\t\tcontroller = meta.controller;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!arcs) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tarc = arcs[i];\n\t\t\toptions = controller ? controller._resolveElementOptions(arc, i) : arc._options;\n\t\t\tif (options.borderAlign !== 'inner') {\n\t\t\t\tborderWidth = options.borderWidth;\n\t\t\t\thoverWidth = options.hoverBorderWidth;\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}\n\t\treturn max;\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(arc) {\n\t\tvar model = arc._model;\n\t\tvar options = arc._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tarc.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveElementOptions: function(arc, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = me.getDataset();\n\t\tvar custom = arc.custom || {};\n\t\tvar options = chart.options.elements.arc;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\tvar keys = [\n\t\t\t'backgroundColor',\n\t\t\t'borderColor',\n\t\t\t'borderWidth',\n\t\t\t'borderAlign',\n\t\t\t'hoverBackgroundColor',\n\t\t\t'hoverBorderColor',\n\t\t\t'hoverBorderWidth',\n\t\t];\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$3([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t], context, index);\n\t\t}\n\n\t\treturn values;\n\t},\n\n\t/**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n\t_getRingWeightOffset: function(datasetIndex) {\n\t\tvar ringWeightOffset = 0;\n\n\t\tfor (var i = 0; i < datasetIndex; ++i) {\n\t\t\tif (this.chart.isDatasetVisible(i)) {\n\t\t\t\tringWeightOffset += this._getRingWeight(i);\n\t\t\t}\n\t\t}\n\n\t\treturn ringWeightOffset;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getRingWeight: function(dataSetIndex) {\n\t\treturn Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0);\n\t},\n\n\t/**\n\t * Returns the sum of all visibile data set weights. This value can be 0.\n\t * @private\n\t */\n\t_getVisibleDatasetWeightTotal: function() {\n\t\treturn this._getRingWeightOffset(this.chart.data.datasets.length);\n\t}\n});\n\ncore_defaults._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\ttype: 'category',\n\t\t\tposition: 'left',\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\t\t\toffset: true,\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\tmode: 'index',\n\t\taxis: 'y'\n\t}\n});\n\nvar controller_horizontalBar = controller_bar.extend({\n\t/**\n\t * @private\n\t */\n\t_getValueScaleId: function() {\n\t\treturn this.getMeta().xAxisID;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScaleId: function() {\n\t\treturn this.getMeta().yAxisID;\n\t}\n});\n\nvar valueOrDefault$5 = helpers$1.valueOrDefault;\nvar resolve$4 = helpers$1.options.resolve;\nvar isPointInArea = helpers$1.canvas._isPointInArea;\n\ncore_defaults._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\nfunction lineEnabled(dataset, options) {\n\treturn valueOrDefault$5(dataset.showLine, options.showLines);\n}\n\nvar controller_line = core_datasetController.extend({\n\n\tdatasetElementType: elements.Line,\n\n\tdataElementType: elements.Point,\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar line = meta.dataset;\n\t\tvar points = meta.data || [];\n\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\tvar dataset = me.getDataset();\n\t\tvar showLine = lineEnabled(dataset, me.chart.options);\n\t\tvar i, ilen;\n\n\t\t// Update Line\n\t\tif (showLine) {\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\t// Utility\n\t\t\tline._scale = scale;\n\t\t\tline._datasetIndex = me.index;\n\t\t\t// Data\n\t\t\tline._children = points;\n\t\t\t// Model\n\t\t\tline._model = me._resolveLineOptions(line);\n\n\t\t\tline.pivot();\n\t\t}\n\n\t\t// Update Points\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tme.updateElement(points[i], i, reset);\n\t\t}\n\n\t\tif (showLine && line._model.tension !== 0) {\n\t\t\tme.updateBezierControlPoints();\n\t\t}\n\n\t\t// Now pivot the point for animation\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tpoints[i].pivot();\n\t\t}\n\t},\n\n\tupdateElement: function(point, index, reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar custom = point.custom || {};\n\t\tvar dataset = me.getDataset();\n\t\tvar datasetIndex = me.index;\n\t\tvar value = dataset.data[index];\n\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\tvar lineModel = meta.dataset._model;\n\t\tvar x, y;\n\n\t\tvar options = me._resolvePointOptions(point, index);\n\n\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t// Utility\n\t\tpoint._xScale = xScale;\n\t\tpoint._yScale = yScale;\n\t\tpoint._options = options;\n\t\tpoint._datasetIndex = datasetIndex;\n\t\tpoint._index = index;\n\n\t\t// Desired view properties\n\t\tpoint._model = {\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t// Appearance\n\t\t\tradius: options.radius,\n\t\t\tpointStyle: options.pointStyle,\n\t\t\trotation: options.rotation,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\ttension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0),\n\t\t\tsteppedLine: lineModel ? lineModel.steppedLine : false,\n\t\t\t// Tooltip\n\t\t\thitRadius: options.hitRadius\n\t\t};\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolvePointOptions: function(element, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = chart.data.datasets[me.index];\n\t\tvar custom = element.custom || {};\n\t\tvar options = chart.options.elements.point;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\tvar ELEMENT_OPTIONS = {\n\t\t\tbackgroundColor: 'pointBackgroundColor',\n\t\t\tborderColor: 'pointBorderColor',\n\t\t\tborderWidth: 'pointBorderWidth',\n\t\t\thitRadius: 'pointHitRadius',\n\t\t\thoverBackgroundColor: 'pointHoverBackgroundColor',\n\t\t\thoverBorderColor: 'pointHoverBorderColor',\n\t\t\thoverBorderWidth: 'pointHoverBorderWidth',\n\t\t\thoverRadius: 'pointHoverRadius',\n\t\t\tpointStyle: 'pointStyle',\n\t\t\tradius: 'pointRadius',\n\t\t\trotation: 'pointRotation'\n\t\t};\n\t\tvar keys = Object.keys(ELEMENT_OPTIONS);\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$4([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[ELEMENT_OPTIONS[key]],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t], context, index);\n\t\t}\n\n\t\treturn values;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveLineOptions: function(element) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = chart.data.datasets[me.index];\n\t\tvar custom = element.custom || {};\n\t\tvar options = chart.options;\n\t\tvar elementOptions = options.elements.line;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\tvar keys = [\n\t\t\t'backgroundColor',\n\t\t\t'borderWidth',\n\t\t\t'borderColor',\n\t\t\t'borderCapStyle',\n\t\t\t'borderDash',\n\t\t\t'borderDashOffset',\n\t\t\t'borderJoinStyle',\n\t\t\t'fill',\n\t\t\t'cubicInterpolationMode'\n\t\t];\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$4([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[key],\n\t\t\t\telementOptions[key]\n\t\t\t]);\n\t\t}\n\n\t\t// The default behavior of lines is to break at null values, according\n\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t// This option gives lines the ability to span gaps\n\t\tvalues.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps);\n\t\tvalues.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension);\n\t\tvalues.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);\n\n\t\treturn values;\n\t},\n\n\tcalculatePointY: function(value, index, datasetIndex) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar meta = me.getMeta();\n\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\tvar sumPos = 0;\n\t\tvar sumNeg = 0;\n\t\tvar i, ds, dsMeta;\n\n\t\tif (yScale.options.stacked) {\n\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\tif (rightValue < 0) {\n\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t}\n\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t}\n\n\t\treturn yScale.getPixelForValue(value);\n\t},\n\n\tupdateBezierControlPoints: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar meta = me.getMeta();\n\t\tvar lineModel = meta.dataset._model;\n\t\tvar area = chart.chartArea;\n\t\tvar points = meta.data || [];\n\t\tvar i, ilen, model, controlPoints;\n\n\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\tif (lineModel.spanGaps) {\n\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\treturn !pt._model.skip;\n\t\t\t});\n\t\t}\n\n\t\tfunction capControlPoint(pt, min, max) {\n\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t}\n\n\t\tif (lineModel.cubicInterpolationMode === 'monotone') {\n\t\t\thelpers$1.splineCurveMonotone(points);\n\t\t} else {\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tmodel = points[i]._model;\n\t\t\t\tcontrolPoints = helpers$1.splineCurve(\n\t\t\t\t\thelpers$1.previousItem(points, i)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers$1.nextItem(points, i)._model,\n\t\t\t\t\tlineModel.tension\n\t\t\t\t);\n\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t}\n\t\t}\n\n\t\tif (chart.options.elements.line.capBezierPoints) {\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tmodel = points[i]._model;\n\t\t\t\tif (isPointInArea(model, area)) {\n\t\t\t\t\tif (i > 0 && isPointInArea(points[i - 1]._model, area)) {\n\t\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\t}\n\t\t\t\t\tif (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {\n\t\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar meta = me.getMeta();\n\t\tvar points = meta.data || [];\n\t\tvar area = chart.chartArea;\n\t\tvar ilen = points.length;\n\t\tvar halfBorderWidth;\n\t\tvar i = 0;\n\n\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\thalfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;\n\n\t\t\thelpers$1.canvas.clipArea(chart.ctx, {\n\t\t\t\tleft: area.left,\n\t\t\t\tright: area.right,\n\t\t\t\ttop: area.top - halfBorderWidth,\n\t\t\t\tbottom: area.bottom + halfBorderWidth\n\t\t\t});\n\n\t\t\tmeta.dataset.draw();\n\n\t\t\thelpers$1.canvas.unclipArea(chart.ctx);\n\t\t}\n\n\t\t// Draw the points\n\t\tfor (; i < ilen; ++i) {\n\t\t\tpoints[i].draw(area);\n\t\t}\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(point) {\n\t\tvar model = point._model;\n\t\tvar options = point._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tpoint.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t\tradius: model.radius\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);\n\t\tmodel.radius = valueOrDefault$5(options.hoverRadius, options.radius);\n\t},\n});\n\nvar resolve$5 = helpers$1.options.resolve;\n\ncore_defaults._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 arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);\n\t\t\t\t\t\tvar stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);\n\t\t\t\t\t\tvar bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);\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\nvar controller_polarArea = core_datasetController.extend({\n\n\tdataElementType: elements.Arc,\n\n\tlinkScales: helpers$1.noop,\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar dataset = me.getDataset();\n\t\tvar meta = me.getMeta();\n\t\tvar start = me.chart.options.startAngle || 0;\n\t\tvar starts = me._starts = [];\n\t\tvar angles = me._angles = [];\n\t\tvar arcs = meta.data;\n\t\tvar i, ilen, angle;\n\n\t\tme._updateRadius();\n\n\t\tmeta.count = me.countVisibleElements();\n\n\t\tfor (i = 0, ilen = dataset.data.length; i < ilen; i++) {\n\t\t\tstarts[i] = start;\n\t\t\tangle = me._computeAngle(i);\n\t\t\tangles[i] = angle;\n\t\t\tstart += angle;\n\t\t}\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tarcs[i]._options = me._resolveElementOptions(arcs[i], i);\n\t\t\tme.updateElement(arcs[i], i, reset);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_updateRadius: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar chartArea = chart.chartArea;\n\t\tvar opts = chart.options;\n\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n\t\tchart.outerRadius = Math.max(minSize / 2, 0);\n\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\t},\n\n\tupdateElement: function(arc, index, reset) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = me.getDataset();\n\t\tvar opts = chart.options;\n\t\tvar animationOpts = opts.animation;\n\t\tvar scale = chart.scale;\n\t\tvar labels = chart.data.labels;\n\n\t\tvar centerX = scale.xCenter;\n\t\tvar centerY = scale.yCenter;\n\n\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\tvar datasetStartAngle = opts.startAngle;\n\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\tvar startAngle = me._starts[index];\n\t\tvar endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\n\n\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\tvar options = arc._options || {};\n\n\t\thelpers$1.extend(arc, {\n\t\t\t// Utility\n\t\t\t_datasetIndex: me.index,\n\t\t\t_index: index,\n\t\t\t_scale: scale,\n\n\t\t\t// Desired view properties\n\t\t\t_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\tborderAlign: options.borderAlign,\n\t\t\t\tx: centerX,\n\t\t\t\ty: centerY,\n\t\t\t\tinnerRadius: 0,\n\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\tlabel: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t}\n\t\t});\n\n\t\tarc.pivot();\n\t},\n\n\tcountVisibleElements: function() {\n\t\tvar dataset = this.getDataset();\n\t\tvar meta = this.getMeta();\n\t\tvar count = 0;\n\n\t\thelpers$1.each(meta.data, function(element, index) {\n\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t});\n\n\t\treturn count;\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(arc) {\n\t\tvar model = arc._model;\n\t\tvar options = arc._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\t\tvar valueOrDefault = helpers$1.valueOrDefault;\n\n\t\tarc.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveElementOptions: function(arc, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = me.getDataset();\n\t\tvar custom = arc.custom || {};\n\t\tvar options = chart.options.elements.arc;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\tvar keys = [\n\t\t\t'backgroundColor',\n\t\t\t'borderColor',\n\t\t\t'borderWidth',\n\t\t\t'borderAlign',\n\t\t\t'hoverBackgroundColor',\n\t\t\t'hoverBorderColor',\n\t\t\t'hoverBorderWidth',\n\t\t];\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$5([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t], context, index);\n\t\t}\n\n\t\treturn values;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_computeAngle: function(index) {\n\t\tvar me = this;\n\t\tvar count = this.getMeta().count;\n\t\tvar dataset = me.getDataset();\n\t\tvar meta = me.getMeta();\n\n\t\tif (isNaN(dataset.data[index]) || meta.data[index].hidden) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: me.chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\treturn resolve$5([\n\t\t\tme.chart.options.elements.arc.angle,\n\t\t\t(2 * Math.PI) / count\n\t\t], context, index);\n\t}\n});\n\ncore_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));\ncore_defaults._set('pie', {\n\tcutoutPercentage: 0\n});\n\n// Pie charts are Doughnut chart with different defaults\nvar controller_pie = controller_doughnut;\n\nvar valueOrDefault$6 = helpers$1.valueOrDefault;\nvar resolve$6 = helpers$1.options.resolve;\n\ncore_defaults._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\nvar controller_radar = core_datasetController.extend({\n\n\tdatasetElementType: elements.Line,\n\n\tdataElementType: elements.Point,\n\n\tlinkScales: helpers$1.noop,\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar line = meta.dataset;\n\t\tvar points = meta.data || [];\n\t\tvar scale = me.chart.scale;\n\t\tvar dataset = me.getDataset();\n\t\tvar i, ilen;\n\n\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\tdataset.lineTension = dataset.tension;\n\t\t}\n\n\t\t// Utility\n\t\tline._scale = scale;\n\t\tline._datasetIndex = me.index;\n\t\t// Data\n\t\tline._children = points;\n\t\tline._loop = true;\n\t\t// Model\n\t\tline._model = me._resolveLineOptions(line);\n\n\t\tline.pivot();\n\n\t\t// Update Points\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tme.updateElement(points[i], i, reset);\n\t\t}\n\n\t\t// Update bezier control points\n\t\tme.updateBezierControlPoints();\n\n\t\t// Now pivot the point for animation\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tpoints[i].pivot();\n\t\t}\n\t},\n\n\tupdateElement: function(point, index, reset) {\n\t\tvar me = this;\n\t\tvar custom = point.custom || {};\n\t\tvar dataset = me.getDataset();\n\t\tvar scale = me.chart.scale;\n\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\t\tvar options = me._resolvePointOptions(point, index);\n\t\tvar lineModel = me.getMeta().dataset._model;\n\t\tvar x = reset ? scale.xCenter : pointPosition.x;\n\t\tvar y = reset ? scale.yCenter : pointPosition.y;\n\n\t\t// Utility\n\t\tpoint._scale = scale;\n\t\tpoint._options = options;\n\t\tpoint._datasetIndex = me.index;\n\t\tpoint._index = index;\n\n\t\t// Desired view properties\n\t\tpoint._model = {\n\t\t\tx: x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\ty: y,\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t// Appearance\n\t\t\tradius: options.radius,\n\t\t\tpointStyle: options.pointStyle,\n\t\t\trotation: options.rotation,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\ttension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),\n\n\t\t\t// Tooltip\n\t\t\thitRadius: options.hitRadius\n\t\t};\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolvePointOptions: function(element, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = chart.data.datasets[me.index];\n\t\tvar custom = element.custom || {};\n\t\tvar options = chart.options.elements.point;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\tvar ELEMENT_OPTIONS = {\n\t\t\tbackgroundColor: 'pointBackgroundColor',\n\t\t\tborderColor: 'pointBorderColor',\n\t\t\tborderWidth: 'pointBorderWidth',\n\t\t\thitRadius: 'pointHitRadius',\n\t\t\thoverBackgroundColor: 'pointHoverBackgroundColor',\n\t\t\thoverBorderColor: 'pointHoverBorderColor',\n\t\t\thoverBorderWidth: 'pointHoverBorderWidth',\n\t\t\thoverRadius: 'pointHoverRadius',\n\t\t\tpointStyle: 'pointStyle',\n\t\t\tradius: 'pointRadius',\n\t\t\trotation: 'pointRotation'\n\t\t};\n\t\tvar keys = Object.keys(ELEMENT_OPTIONS);\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$6([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[ELEMENT_OPTIONS[key]],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t], context, index);\n\t\t}\n\n\t\treturn values;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveLineOptions: function(element) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = chart.data.datasets[me.index];\n\t\tvar custom = element.custom || {};\n\t\tvar options = chart.options.elements.line;\n\t\tvar values = {};\n\t\tvar i, ilen, key;\n\n\t\tvar keys = [\n\t\t\t'backgroundColor',\n\t\t\t'borderWidth',\n\t\t\t'borderColor',\n\t\t\t'borderCapStyle',\n\t\t\t'borderDash',\n\t\t\t'borderDashOffset',\n\t\t\t'borderJoinStyle',\n\t\t\t'fill'\n\t\t];\n\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tvalues[key] = resolve$6([\n\t\t\t\tcustom[key],\n\t\t\t\tdataset[key],\n\t\t\t\toptions[key]\n\t\t\t]);\n\t\t}\n\n\t\tvalues.tension = valueOrDefault$6(dataset.lineTension, options.tension);\n\n\t\treturn values;\n\t},\n\n\tupdateBezierControlPoints: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar area = me.chart.chartArea;\n\t\tvar points = meta.data || [];\n\t\tvar i, ilen, model, controlPoints;\n\n\t\tfunction capControlPoint(pt, min, max) {\n\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t}\n\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tmodel = points[i]._model;\n\t\t\tcontrolPoints = helpers$1.splineCurve(\n\t\t\t\thelpers$1.previousItem(points, i, true)._model,\n\t\t\t\tmodel,\n\t\t\t\thelpers$1.nextItem(points, i, true)._model,\n\t\t\t\tmodel.tension\n\t\t\t);\n\n\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\tmodel.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);\n\t\t\tmodel.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);\n\t\t\tmodel.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);\n\t\t\tmodel.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);\n\t\t}\n\t},\n\n\tsetHoverStyle: function(point) {\n\t\tvar model = point._model;\n\t\tvar options = point._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tpoint.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t\tradius: model.radius\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);\n\t\tmodel.radius = valueOrDefault$6(options.hoverRadius, options.radius);\n\t}\n});\n\ncore_defaults._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\n// Scatter charts use line controllers\nvar controller_scatter = controller_line;\n\n// NOTE export a map in which the key represents the controller type, not\n// the class, and so must be CamelCase in order to be correctly retrieved\n// by the controller in core.controller.js (`controllers[meta.type]`).\n\nvar controllers = {\n\tbar: controller_bar,\n\tbubble: controller_bubble,\n\tdoughnut: controller_doughnut,\n\thorizontalBar: controller_horizontalBar,\n\tline: controller_line,\n\tpolarArea: controller_polarArea,\n\tpie: controller_pie,\n\tradar: controller_radar,\n\tscatter: controller_scatter\n};\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 {object} 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$1.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 {function} handler - 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 {ChartElement[]} items - elements to filter\n * @param {object} position - 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 {object} position - the point to be nearest to\n * @param {boolean} intersect - if true, only consider items that intersect the position\n * @param {function} distanceMetric - 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\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 */\nvar core_interaction = {\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 {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - 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 {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - 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 {Event} e - 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 {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - 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\treturn getNearestItems(chart, position, options.intersect, distanceMetric);\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 {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - 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 {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - 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\nfunction filterByPosition(array, position) {\n\treturn helpers$1.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\nfunction findMaxPadding(boxes) {\n\tvar top = 0;\n\tvar left = 0;\n\tvar bottom = 0;\n\tvar right = 0;\n\thelpers$1.each(boxes, function(box) {\n\t\tif (box.getPadding) {\n\t\t\tvar boxPadding = box.getPadding();\n\t\t\ttop = Math.max(top, boxPadding.top);\n\t\t\tleft = Math.max(left, boxPadding.left);\n\t\t\tbottom = Math.max(bottom, boxPadding.bottom);\n\t\t\tright = Math.max(right, boxPadding.right);\n\t\t}\n\t});\n\treturn {\n\t\ttop: top,\n\t\tleft: left,\n\t\tbottom: bottom,\n\t\tright: right\n\t};\n}\n\nfunction addSizeByPosition(boxes, size) {\n\thelpers$1.each(boxes, function(box) {\n\t\tsize[box.position] += box.isHorizontal() ? box.height : box.width;\n\t});\n}\n\ncore_defaults._set('global', {\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\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.\nvar core_layouts = {\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 {ILayoutItem} 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 {ILayoutItem} 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$1.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\tvar verticalBoxes = leftBoxes.concat(rightBoxes);\n\t\tvar horizontalBoxes = topBoxes.concat(bottomBoxes);\n\t\tvar outerBoxes = verticalBoxes.concat(horizontalBoxes);\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\n\t\t// Step 2\n\t\tvar verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length;\n\n\t\t// Step 3\n\t\t// TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837)\n\t\t// var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length;\n\n\t\t// Step 4\n\t\tvar maxChartAreaWidth = chartWidth;\n\t\tvar maxChartAreaHeight = chartHeight;\n\t\tvar outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding};\n\t\tvar minBoxSizes = [];\n\t\tvar maxPadding;\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, chartHeight / 2);\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\twidth: minSize.width,\n\t\t\t\tbox: box,\n\t\t\t});\n\t\t}\n\n\t\thelpers$1.each(outerBoxes, 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\tmaxPadding = findMaxPadding(outerBoxes);\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\n\t\t// Function to fit a box\n\t\tfunction fitBox(box) {\n\t\t\tvar minBoxSize = helpers$1.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 (minBoxSize.horizontal) {\n\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\tleft: Math.max(outerBoxSizes.left, maxPadding.left),\n\t\t\t\t\t\tright: Math.max(outerBoxSizes.right, maxPadding.right),\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.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$1.each(verticalBoxes, fitBox);\n\t\taddSizeByPosition(verticalBoxes, outerBoxSizes);\n\n\t\t// Set the Left and Right margins for the horizontal boxes\n\t\thelpers$1.each(horizontalBoxes, fitBox);\n\t\taddSizeByPosition(horizontalBoxes, outerBoxSizes);\n\n\t\tfunction finalFitVerticalBox(box) {\n\t\t\tvar minBoxSize = helpers$1.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: outerBoxSizes.top,\n\t\t\t\tbottom: outerBoxSizes.bottom\n\t\t\t};\n\n\t\t\tif (minBoxSize) {\n\t\t\t\tbox.update(minBoxSize.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$1.each(verticalBoxes, 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\touterBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding};\n\t\taddSizeByPosition(outerBoxes, outerBoxSizes);\n\n\t\t// We may be adding some padding to account for rotated x axis labels\n\t\tvar leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0);\n\t\touterBoxSizes.left += leftPaddingAddition;\n\t\touterBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0);\n\n\t\tvar topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0);\n\t\touterBoxSizes.top += topPaddingAddition;\n\t\touterBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 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 - outerBoxSizes.top - outerBoxSizes.bottom;\n\t\tvar newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right;\n\n\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\thelpers$1.each(verticalBoxes, function(box) {\n\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t});\n\n\t\t\thelpers$1.each(horizontalBoxes, 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 : outerBoxSizes.left;\n\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + 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 = outerBoxSizes.top;\n\t\t\t\tbox.bottom = outerBoxSizes.top + 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$1.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$1.each(rightBoxes, placeBox);\n\t\thelpers$1.each(bottomBoxes, placeBox);\n\n\t\t// Step 8\n\t\tchart.chartArea = {\n\t\t\tleft: outerBoxSizes.left,\n\t\t\ttop: outerBoxSizes.top,\n\t\t\tright: outerBoxSizes.left + maxChartAreaWidth,\n\t\t\tbottom: outerBoxSizes.top + maxChartAreaHeight\n\t\t};\n\n\t\t// Step 9\n\t\thelpers$1.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\n/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nvar platform_basic = {\n\tacquireContext: function(item) {\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\treturn item && item.getContext('2d') || null;\n\t}\n};\n\nvar platform_dom = \"/*\\n * DOM element rendering detection\\n * https://davidwalsh.name/detect-node-insertion\\n */\\n@keyframes chartjs-render-animation {\\n\\tfrom { opacity: 0.99; }\\n\\tto { opacity: 1; }\\n}\\n\\n.chartjs-render-monitor {\\n\\tanimation: chartjs-render-animation 0.001s;\\n}\\n\\n/*\\n * DOM element resizing detection\\n * https://github.com/marcj/css-element-queries\\n */\\n.chartjs-size-monitor,\\n.chartjs-size-monitor-expand,\\n.chartjs-size-monitor-shrink {\\n\\tposition: absolute;\\n\\tdirection: ltr;\\n\\tleft: 0;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\toverflow: hidden;\\n\\tpointer-events: none;\\n\\tvisibility: hidden;\\n\\tz-index: -1;\\n}\\n\\n.chartjs-size-monitor-expand > div {\\n\\tposition: absolute;\\n\\twidth: 1000000px;\\n\\theight: 1000000px;\\n\\tleft: 0;\\n\\ttop: 0;\\n}\\n\\n.chartjs-size-monitor-shrink > div {\\n\\tposition: absolute;\\n\\twidth: 200%;\\n\\theight: 200%;\\n\\tleft: 0;\\n\\ttop: 0;\\n}\\n\";\n\nvar platform_dom$1 = /*#__PURE__*/Object.freeze({\ndefault: platform_dom\n});\n\nfunction getCjsExportFromNamespace (n) {\n\treturn n && n.default || n;\n}\n\nvar stylesheet = getCjsExportFromNamespace(platform_dom$1);\n\nvar EXPANDO_KEY = '$chartjs';\nvar CSS_PREFIX = 'chartjs-';\nvar CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';\nvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\nvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\nvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nvar EVENT_TYPES = {\n\ttouchstart: 'mousedown',\n\ttouchmove: 'mousemove',\n\ttouchend: 'mouseup',\n\tpointerenter: 'mouseenter',\n\tpointerdown: 'mousedown',\n\tpointermove: 'mousemove',\n\tpointerup: 'mouseup',\n\tpointerleave: 'mouseout',\n\tpointerout: 'mouseout'\n};\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {number} Size in pixels or undefined if unknown.\n */\nfunction readUsedSize(element, property) {\n\tvar value = helpers$1.getStyle(element, property);\n\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\treturn matches ? Number(matches[1]) : undefined;\n}\n\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\nfunction initCanvas(canvas, config) {\n\tvar style = canvas.style;\n\n\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\tvar renderHeight = canvas.getAttribute('height');\n\tvar renderWidth = canvas.getAttribute('width');\n\n\t// Chart.js modifies some canvas values that we want to restore on destroy\n\tcanvas[EXPANDO_KEY] = {\n\t\tinitial: {\n\t\t\theight: renderHeight,\n\t\t\twidth: renderWidth,\n\t\t\tstyle: {\n\t\t\t\tdisplay: style.display,\n\t\t\t\theight: style.height,\n\t\t\t\twidth: style.width\n\t\t\t}\n\t\t}\n\t};\n\n\t// Force canvas to display as block to avoid extra space caused by inline\n\t// elements, which would interfere with the responsive resize process.\n\t// https://github.com/chartjs/Chart.js/issues/2538\n\tstyle.display = style.display || 'block';\n\n\tif (renderWidth === null || renderWidth === '') {\n\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\tif (displayWidth !== undefined) {\n\t\t\tcanvas.width = displayWidth;\n\t\t}\n\t}\n\n\tif (renderHeight === null || renderHeight === '') {\n\t\tif (canvas.style.height === '') {\n\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t} else {\n\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.height = displayHeight;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canvas;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nvar supportsEventListenerOptions = (function() {\n\tvar supports = false;\n\ttry {\n\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\t// eslint-disable-next-line getter-return\n\t\t\tget: function() {\n\t\t\t\tsupports = true;\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('e', null, options);\n\t} catch (e) {\n\t\t// continue regardless of error\n\t}\n\treturn supports;\n}());\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nvar eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n\tnode.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeListener(node, type, listener) {\n\tnode.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction createEvent(type, chart, x, y, nativeEvent) {\n\treturn {\n\t\ttype: type,\n\t\tchart: chart,\n\t\tnative: nativeEvent || null,\n\t\tx: x !== undefined ? x : null,\n\t\ty: y !== undefined ? y : null,\n\t};\n}\n\nfunction fromNativeEvent(event, chart) {\n\tvar type = EVENT_TYPES[event.type] || event.type;\n\tvar pos = helpers$1.getRelativePosition(event, chart);\n\treturn createEvent(type, chart, pos.x, pos.y, event);\n}\n\nfunction throttled(fn, thisArg) {\n\tvar ticking = false;\n\tvar args = [];\n\n\treturn function() {\n\t\targs = Array.prototype.slice.call(arguments);\n\t\tthisArg = thisArg || this;\n\n\t\tif (!ticking) {\n\t\t\tticking = true;\n\t\t\thelpers$1.requestAnimFrame.call(window, function() {\n\t\t\t\tticking = false;\n\t\t\t\tfn.apply(thisArg, args);\n\t\t\t});\n\t\t}\n\t};\n}\n\nfunction createDiv(cls) {\n\tvar el = document.createElement('div');\n\tel.className = cls || '';\n\treturn el;\n}\n\n// Implementation based on https://github.com/marcj/css-element-queries\nfunction createResizer(handler) {\n\tvar maxSize = 1000000;\n\n\t// NOTE(SB) Don't use innerHTML because it could be considered unsafe.\n\t// https://github.com/chartjs/Chart.js/issues/5902\n\tvar resizer = createDiv(CSS_SIZE_MONITOR);\n\tvar expand = createDiv(CSS_SIZE_MONITOR + '-expand');\n\tvar shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');\n\n\texpand.appendChild(createDiv());\n\tshrink.appendChild(createDiv());\n\n\tresizer.appendChild(expand);\n\tresizer.appendChild(shrink);\n\tresizer._reset = function() {\n\t\texpand.scrollLeft = maxSize;\n\t\texpand.scrollTop = maxSize;\n\t\tshrink.scrollLeft = maxSize;\n\t\tshrink.scrollTop = maxSize;\n\t};\n\n\tvar onScroll = function() {\n\t\tresizer._reset();\n\t\thandler();\n\t};\n\n\taddListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\taddListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\treturn resizer;\n}\n\n// https://davidwalsh.name/detect-node-insertion\nfunction watchForRender(node, handler) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\tvar proxy = expando.renderProxy = function(e) {\n\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\thandler();\n\t\t}\n\t};\n\n\thelpers$1.each(ANIMATION_START_EVENTS, function(type) {\n\t\taddListener(node, type, proxy);\n\t});\n\n\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t// is removed then added back immediately (same animation frame?). Accessing the\n\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t// https://github.com/chartjs/Chart.js/issues/4737\n\texpando.reflow = !!node.offsetParent;\n\n\tnode.classList.add(CSS_RENDER_MONITOR);\n}\n\nfunction unwatchForRender(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar proxy = expando.renderProxy;\n\n\tif (proxy) {\n\t\thelpers$1.each(ANIMATION_START_EVENTS, function(type) {\n\t\t\tremoveListener(node, type, proxy);\n\t\t});\n\n\t\tdelete expando.renderProxy;\n\t}\n\n\tnode.classList.remove(CSS_RENDER_MONITOR);\n}\n\nfunction addResizeListener(node, listener, chart) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\tvar resizer = expando.resizer = createResizer(throttled(function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = chart.options.maintainAspectRatio && node.parentNode;\n\t\t\tvar w = container ? container.clientWidth : 0;\n\t\t\tlistener(createEvent('resize', chart));\n\t\t\tif (container && container.clientWidth < w && chart.canvas) {\n\t\t\t\t// If the container size shrank during chart resize, let's assume\n\t\t\t\t// scrollbar appeared. So we resize again with the scrollbar visible -\n\t\t\t\t// effectively making chart smaller and the scrollbar hidden again.\n\t\t\t\t// Because we are inside `throttled`, and currently `ticking`, scroll\n\t\t\t\t// events are ignored during this whole 2 resize process.\n\t\t\t\t// If we assumed wrong and something else happened, we are resizing\n\t\t\t\t// twice in a frame (potential performance issue)\n\t\t\t\tlistener(createEvent('resize', chart));\n\t\t\t}\n\t\t}\n\t}));\n\n\t// The resizer needs to be attached to the node parent, so we first need to be\n\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\twatchForRender(node, function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = node.parentNode;\n\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t}\n\n\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\tresizer._reset();\n\t\t}\n\t});\n}\n\nfunction removeResizeListener(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar resizer = expando.resizer;\n\n\tdelete expando.resizer;\n\tunwatchForRender(node);\n\n\tif (resizer && resizer.parentNode) {\n\t\tresizer.parentNode.removeChild(resizer);\n\t}\n}\n\nfunction injectCSS(platform, css) {\n\t// https://stackoverflow.com/q/3922139\n\tvar style = platform._style || document.createElement('style');\n\tif (!platform._style) {\n\t\tplatform._style = style;\n\t\tcss = '/* Chart.js */\\n' + css;\n\t\tstyle.setAttribute('type', 'text/css');\n\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\t}\n\n\tstyle.appendChild(document.createTextNode(css));\n}\n\nvar platform_dom$2 = {\n\t/**\n\t * When `true`, prevents the automatic injection of the stylesheet required to\n\t * correctly detect when the chart is added to the DOM and then resized. This\n\t * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`)\n\t * to be manually imported to make this library compatible with any CSP.\n\t * See https://github.com/chartjs/Chart.js/issues/5208\n\t */\n\tdisableCSSInjection: false,\n\n\t/**\n\t * This property holds whether this platform is enabled for the current environment.\n\t * Currently used by platform.js to select the proper implementation.\n\t * @private\n\t */\n\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n\t/**\n\t * @private\n\t */\n\t_ensureLoaded: function() {\n\t\tif (this._loaded) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._loaded = true;\n\n\t\t// https://github.com/chartjs/Chart.js/issues/5208\n\t\tif (!this.disableCSSInjection) {\n\t\t\tinjectCSS(this, stylesheet);\n\t\t}\n\t},\n\n\tacquireContext: function(item, config) {\n\t\tif (typeof item === 'string') {\n\t\t\titem = document.getElementById(item);\n\t\t} else if (item.length) {\n\t\t\t// Support for array based queries (such as jQuery)\n\t\t\titem = item[0];\n\t\t}\n\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t// Load platform resources on first chart creation, to make possible to change\n\t\t// platform options after importing the library (e.g. `disableCSSInjection`).\n\t\tthis._ensureLoaded();\n\n\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\tif (context && context.canvas === item) {\n\t\t\tinitCanvas(item, config);\n\t\t\treturn context;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\treleaseContext: function(context) {\n\t\tvar canvas = context.canvas;\n\t\tif (!canvas[EXPANDO_KEY]) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar initial = canvas[EXPANDO_KEY].initial;\n\t\t['height', 'width'].forEach(function(prop) {\n\t\t\tvar value = initial[prop];\n\t\t\tif (helpers$1.isNullOrUndef(value)) {\n\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t} else {\n\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t}\n\t\t});\n\n\t\thelpers$1.each(initial.style || {}, function(value, key) {\n\t\t\tcanvas.style[key] = value;\n\t\t});\n\n\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\t// eslint-disable-next-line no-self-assign\n\t\tcanvas.width = canvas.width;\n\n\t\tdelete canvas[EXPANDO_KEY];\n\t},\n\n\taddEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\taddResizeListener(canvas, listener, chart);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n\t\tvar proxies = expando.proxies || (expando.proxies = {});\n\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t};\n\n\t\taddListener(canvas, type, proxy);\n\t},\n\n\tremoveEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\tremoveResizeListener(canvas);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || {};\n\t\tvar proxies = expando.proxies || {};\n\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\tif (!proxy) {\n\t\t\treturn;\n\t\t}\n\n\t\tremoveListener(canvas, type, proxy);\n\t}\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers$1.addEvent = addListener;\n\n/**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers$1.removeEvent = removeListener;\n\n// @TODO Make possible to select another platform at build time.\nvar implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic;\n\n/**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\nvar platform = helpers$1.extend({\n\t/**\n\t * @since 2.7.0\n\t */\n\tinitialize: function() {},\n\n\t/**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t * @param {object} options - The chart options\n\t * @returns {CanvasRenderingContext2D} context2d instance\n\t */\n\tacquireContext: function() {},\n\n\t/**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n\treleaseContext: function() {},\n\n\t/**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link IEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t */\n\taddEventListener: function() {},\n\n\t/**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link IEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n\tremoveEventListener: function() {}\n\n}, implementation);\n\ncore_defaults._set('global', {\n\tplugins: {}\n});\n\n/**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\nvar core_plugins = {\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 {IPlugin[]|IPlugin} 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 {IPlugin[]|IPlugin} 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 {IPlugin[]} 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 {Chart} 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 {object[]} [{ 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$1.clone(core_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\nvar core_scaleService = {\n\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t// use the new chart options to grab the correct scale\n\tconstructors: {},\n\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t// old browsers\n\n\t// Scale config defaults\n\tdefaults: {},\n\tregisterScaleType: function(type, scaleConstructor, scaleDefaults) {\n\t\tthis.constructors[type] = scaleConstructor;\n\t\tthis.defaults[type] = helpers$1.clone(scaleDefaults);\n\t},\n\tgetScaleConstructor: function(type) {\n\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t},\n\tgetScaleDefaults: function(type) {\n\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\treturn this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {};\n\t},\n\tupdateScaleDefaults: function(type, additions) {\n\t\tvar me = this;\n\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\tme.defaults[type] = helpers$1.extend(me.defaults[type], additions);\n\t\t}\n\t},\n\taddScalesToLayout: function(chart) {\n\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\thelpers$1.each(chart.scales, function(scale) {\n\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\tscale.position = scale.options.position;\n\t\t\tscale.weight = scale.options.weight;\n\t\t\tcore_layouts.addBox(chart, scale);\n\t\t});\n\t}\n};\n\nvar valueOrDefault$7 = helpers$1.valueOrDefault;\n\ncore_defaults._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$1.noop,\n\t\t\ttitle: function(tooltipItems, data) {\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\t\t\t\t\tif (item.label) {\n\t\t\t\t\t\ttitle = item.label;\n\t\t\t\t\t} else if (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$1.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers$1.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers$1.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\tif (!helpers$1.isNullOrUndef(tooltipItem.value)) {\n\t\t\t\t\tlabel += tooltipItem.value;\n\t\t\t\t} else {\n\t\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\t}\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$1.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers$1.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers$1.noop,\n\t\t\tfooter: helpers$1.noop,\n\t\t\tafterFooter: helpers$1.noop\n\t\t}\n\t}\n});\n\nvar positioners = {\n\t/**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t * @function Chart.Tooltip.positioners.average\n\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t * @returns {object} tooltip position\n\t */\n\taverage: function(elements) {\n\t\tif (!elements.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar i, len;\n\t\tvar x = 0;\n\t\tvar y = 0;\n\t\tvar count = 0;\n\n\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\tvar el = elements[i];\n\t\t\tif (el && el.hasValue()) {\n\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\tx += pos.x;\n\t\t\t\ty += pos.y;\n\t\t\t\t++count;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tx: x / count,\n\t\t\ty: y / count\n\t\t};\n\t},\n\n\t/**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t * @function Chart.Tooltip.positioners.nearest\n\t * @param elements {Chart.Element[]} the tooltip elements\n\t * @param eventPosition {object} the position of the event in canvas coordinates\n\t * @returns {object} the tooltip position\n\t */\n\tnearest: function(elements, eventPosition) {\n\t\tvar x = eventPosition.x;\n\t\tvar y = eventPosition.y;\n\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\tvar i, len, nearestElement;\n\n\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\tvar el = elements[i];\n\t\t\tif (el && el.hasValue()) {\n\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\tvar d = helpers$1.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\tif (d < minDistance) {\n\t\t\t\t\tminDistance = d;\n\t\t\t\t\tnearestElement = el;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (nearestElement) {\n\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\tx = tp.x;\n\t\t\ty = tp.y;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n\tif (toPush) {\n\t\tif (helpers$1.isArray(toPush)) {\n\t\t\t// base = base.concat(toPush);\n\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t} else {\n\t\t\tbase.push(toPush);\n\t\t}\n\t}\n\n\treturn base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {string} value - The value to split by newline.\n * @returns {string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n\tif ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n\t\treturn str.split('\\n');\n\t}\n\treturn str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param element - the chart element (point, arc, bar) to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(element) {\n\tvar xScale = element._xScale;\n\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\tvar index = element._index;\n\tvar datasetIndex = element._datasetIndex;\n\tvar controller = element._chart.getDatasetMeta(datasetIndex).controller;\n\tvar indexScale = controller._getIndexScale();\n\tvar valueScale = controller._getValueScale();\n\n\treturn {\n\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\tlabel: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '',\n\t\tvalue: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '',\n\t\tindex: index,\n\t\tdatasetIndex: datasetIndex,\n\t\tx: element._model.x,\n\t\ty: element._model.y\n\t};\n}\n\n/**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {object} the tooltip options\n */\nfunction getBaseModel(tooltipOpts) {\n\tvar globalDefaults = core_defaults.global;\n\n\treturn {\n\t\t// Positioning\n\t\txPadding: tooltipOpts.xPadding,\n\t\tyPadding: tooltipOpts.yPadding,\n\t\txAlign: tooltipOpts.xAlign,\n\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t// Body\n\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t_bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t_bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\tbodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t// Title\n\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t_titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t_titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\ttitleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t// Footer\n\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t_footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t_footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\tfooterFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t// Appearance\n\t\tcaretSize: tooltipOpts.caretSize,\n\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\topacity: 0,\n\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\tdisplayColors: tooltipOpts.displayColors,\n\t\tborderColor: tooltipOpts.borderColor,\n\t\tborderWidth: tooltipOpts.borderWidth\n\t};\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, model) {\n\tvar ctx = tooltip._chart.ctx;\n\n\tvar height = model.yPadding * 2; // Tooltip Padding\n\tvar width = 0;\n\n\t// Count of all lines in the body\n\tvar body = model.body;\n\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t}, 0);\n\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\tvar titleLineCount = model.title.length;\n\tvar footerLineCount = model.footer.length;\n\tvar titleFontSize = model.titleFontSize;\n\tvar bodyFontSize = model.bodyFontSize;\n\tvar footerFontSize = model.footerFontSize;\n\n\theight += titleLineCount * titleFontSize; // Title Lines\n\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\theight += footerLineCount * (footerFontSize); // Footer Lines\n\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t// Title width\n\tvar widthPadding = 0;\n\tvar maxLineWidth = function(line) {\n\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t};\n\n\tctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\thelpers$1.each(model.title, maxLineWidth);\n\n\t// Body width\n\tctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\thelpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t// Body lines may include some extra width due to the color box\n\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\thelpers$1.each(body, function(bodyItem) {\n\t\thelpers$1.each(bodyItem.before, maxLineWidth);\n\t\thelpers$1.each(bodyItem.lines, maxLineWidth);\n\t\thelpers$1.each(bodyItem.after, maxLineWidth);\n\t});\n\n\t// Reset back to 0\n\twidthPadding = 0;\n\n\t// Footer width\n\tctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\thelpers$1.each(model.footer, maxLineWidth);\n\n\t// Add padding\n\twidth += 2 * model.xPadding;\n\n\treturn {\n\t\twidth: width,\n\t\theight: height\n\t};\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(tooltip, size) {\n\tvar model = tooltip._model;\n\tvar chart = tooltip._chart;\n\tvar chartArea = tooltip._chart.chartArea;\n\tvar xAlign = 'center';\n\tvar yAlign = 'center';\n\n\tif (model.y < size.height) {\n\t\tyAlign = 'top';\n\t} else if (model.y > (chart.height - size.height)) {\n\t\tyAlign = 'bottom';\n\t}\n\n\tvar lf, rf; // functions to determine left, right alignment\n\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\tvar midX = (chartArea.left + chartArea.right) / 2;\n\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\tif (yAlign === 'center') {\n\t\tlf = function(x) {\n\t\t\treturn x <= midX;\n\t\t};\n\t\trf = function(x) {\n\t\t\treturn x > midX;\n\t\t};\n\t} else {\n\t\tlf = function(x) {\n\t\t\treturn x <= (size.width / 2);\n\t\t};\n\t\trf = function(x) {\n\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t};\n\t}\n\n\tolf = function(x) {\n\t\treturn x + size.width + model.caretSize + model.caretPadding > chart.width;\n\t};\n\torf = function(x) {\n\t\treturn x - size.width - model.caretSize - model.caretPadding < 0;\n\t};\n\tyf = function(y) {\n\t\treturn y <= midY ? 'top' : 'bottom';\n\t};\n\n\tif (lf(model.x)) {\n\t\txAlign = 'left';\n\n\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\tif (olf(model.x)) {\n\t\t\txAlign = 'center';\n\t\t\tyAlign = yf(model.y);\n\t\t}\n\t} else if (rf(model.x)) {\n\t\txAlign = 'right';\n\n\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\tif (orf(model.x)) {\n\t\t\txAlign = 'center';\n\t\t\tyAlign = yf(model.y);\n\t\t}\n\t}\n\n\tvar opts = tooltip._options;\n\treturn {\n\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t};\n}\n\n/**\n * 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 */\nfunction getBackgroundPoint(vm, size, alignment, chart) {\n\t// Background Position\n\tvar x = vm.x;\n\tvar y = vm.y;\n\n\tvar caretSize = vm.caretSize;\n\tvar caretPadding = vm.caretPadding;\n\tvar cornerRadius = vm.cornerRadius;\n\tvar xAlign = alignment.xAlign;\n\tvar yAlign = alignment.yAlign;\n\tvar paddingAndSize = caretSize + caretPadding;\n\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\tif (xAlign === 'right') {\n\t\tx -= size.width;\n\t} else if (xAlign === 'center') {\n\t\tx -= (size.width / 2);\n\t\tif (x + size.width > chart.width) {\n\t\t\tx = chart.width - size.width;\n\t\t}\n\t\tif (x < 0) {\n\t\t\tx = 0;\n\t\t}\n\t}\n\n\tif (yAlign === 'top') {\n\t\ty += paddingAndSize;\n\t} else if (yAlign === 'bottom') {\n\t\ty -= size.height + paddingAndSize;\n\t} else {\n\t\ty -= (size.height / 2);\n\t}\n\n\tif (yAlign === 'center') {\n\t\tif (xAlign === 'left') {\n\t\t\tx += paddingAndSize;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx -= paddingAndSize;\n\t\t}\n\t} else if (xAlign === 'left') {\n\t\tx -= radiusAndPadding;\n\t} else if (xAlign === 'right') {\n\t\tx += radiusAndPadding;\n\t}\n\n\treturn {\n\t\tx: x,\n\t\ty: y\n\t};\n}\n\nfunction getAlignedX(vm, align) {\n\treturn align === 'center'\n\t\t? vm.x + vm.width / 2\n\t\t: align === 'right'\n\t\t\t? vm.x + vm.width - vm.xPadding\n\t\t\t: vm.x + vm.xPadding;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n\treturn pushOrConcat([], splitNewlines(callback));\n}\n\nvar exports$3 = core_element.extend({\n\tinitialize: function() {\n\t\tthis._model = getBaseModel(this._options);\n\t\tthis._lastActive = [];\n\t},\n\n\t// Get the title\n\t// Args are: (tooltipItem, data)\n\tgetTitle: function() {\n\t\tvar me = this;\n\t\tvar opts = me._options;\n\t\tvar callbacks = opts.callbacks;\n\n\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\tvar title = callbacks.title.apply(me, arguments);\n\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\tvar lines = [];\n\t\tlines = pushOrConcat(lines, splitNewlines(beforeTitle));\n\t\tlines = pushOrConcat(lines, splitNewlines(title));\n\t\tlines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n\t\treturn lines;\n\t},\n\n\t// Args are: (tooltipItem, data)\n\tgetBeforeBody: function() {\n\t\treturn getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));\n\t},\n\n\t// Args are: (tooltipItem, data)\n\tgetBody: function(tooltipItems, data) {\n\t\tvar me = this;\n\t\tvar callbacks = me._options.callbacks;\n\t\tvar bodyItems = [];\n\n\t\thelpers$1.each(tooltipItems, function(tooltipItem) {\n\t\t\tvar bodyItem = {\n\t\t\t\tbefore: [],\n\t\t\t\tlines: [],\n\t\t\t\tafter: []\n\t\t\t};\n\t\t\tpushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));\n\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\tpushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));\n\n\t\t\tbodyItems.push(bodyItem);\n\t\t});\n\n\t\treturn bodyItems;\n\t},\n\n\t// Args are: (tooltipItem, data)\n\tgetAfterBody: function() {\n\t\treturn getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));\n\t},\n\n\t// Get the footer and beforeFooter and afterFooter lines\n\t// Args are: (tooltipItem, data)\n\tgetFooter: function() {\n\t\tvar me = this;\n\t\tvar callbacks = me._options.callbacks;\n\n\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\tvar lines = [];\n\t\tlines = pushOrConcat(lines, splitNewlines(beforeFooter));\n\t\tlines = pushOrConcat(lines, splitNewlines(footer));\n\t\tlines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n\t\treturn lines;\n\t},\n\n\tupdate: function(changed) {\n\t\tvar me = this;\n\t\tvar opts = me._options;\n\n\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// 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// which breaks any animations.\n\t\tvar existingModel = me._model;\n\t\tvar model = me._model = getBaseModel(opts);\n\t\tvar active = me._active;\n\n\t\tvar data = me._data;\n\n\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\tvar alignment = {\n\t\t\txAlign: existingModel.xAlign,\n\t\t\tyAlign: existingModel.yAlign\n\t\t};\n\t\tvar backgroundPoint = {\n\t\t\tx: existingModel.x,\n\t\t\ty: existingModel.y\n\t\t};\n\t\tvar tooltipSize = {\n\t\t\twidth: existingModel.width,\n\t\t\theight: existingModel.height\n\t\t};\n\t\tvar tooltipPosition = {\n\t\t\tx: existingModel.caretX,\n\t\t\ty: existingModel.caretY\n\t\t};\n\n\t\tvar i, len;\n\n\t\tif (active.length) {\n\t\t\tmodel.opacity = 1;\n\n\t\t\tvar labelColors = [];\n\t\t\tvar labelTextColors = [];\n\t\t\ttooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\tvar tooltipItems = [];\n\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t}\n\n\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\tif (opts.filter) {\n\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\tif (opts.itemSort) {\n\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Determine colors for boxes\n\t\t\thelpers$1.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t});\n\n\n\t\t\t// Build the Text Lines\n\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t// Initial positioning and colors\n\t\t\tmodel.x = tooltipPosition.x;\n\t\t\tmodel.y = tooltipPosition.y;\n\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\tmodel.labelColors = labelColors;\n\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t// data points\n\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t// We need to determine alignment of the tooltip\n\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t// Final Size and Position\n\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n\t\t} else {\n\t\t\tmodel.opacity = 0;\n\t\t}\n\n\t\tmodel.xAlign = alignment.xAlign;\n\t\tmodel.yAlign = alignment.yAlign;\n\t\tmodel.x = backgroundPoint.x;\n\t\tmodel.y = backgroundPoint.y;\n\t\tmodel.width = tooltipSize.width;\n\t\tmodel.height = tooltipSize.height;\n\n\t\t// Point where the caret on the tooltip points to\n\t\tmodel.caretX = tooltipPosition.x;\n\t\tmodel.caretY = tooltipPosition.y;\n\n\t\tme._model = model;\n\n\t\tif (changed && opts.custom) {\n\t\t\topts.custom.call(me, model);\n\t\t}\n\n\t\treturn me;\n\t},\n\n\tdrawCaret: function(tooltipPoint, size) {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t},\n\tgetCaretPosition: function(tooltipPoint, size, vm) {\n\t\tvar x1, x2, x3, y1, y2, y3;\n\t\tvar caretSize = vm.caretSize;\n\t\tvar cornerRadius = vm.cornerRadius;\n\t\tvar xAlign = vm.xAlign;\n\t\tvar yAlign = vm.yAlign;\n\t\tvar ptX = tooltipPoint.x;\n\t\tvar ptY = tooltipPoint.y;\n\t\tvar width = size.width;\n\t\tvar height = size.height;\n\n\t\tif (yAlign === 'center') {\n\t\t\ty2 = ptY + (height / 2);\n\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx1 = ptX;\n\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\tx3 = x1;\n\n\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\ty3 = y2 - caretSize;\n\t\t\t} else {\n\t\t\t\tx1 = ptX + width;\n\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\tx3 = x1;\n\n\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\ty3 = y2 + caretSize;\n\t\t\t}\n\t\t} else {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\n\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\tx3 = x2 + caretSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\tx3 = x2 + caretSize;\n\t\t\t} else {\n\t\t\t\tx2 = vm.caretX;\n\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\tx3 = x2 + caretSize;\n\t\t\t}\n\t\t\tif (yAlign === 'top') {\n\t\t\t\ty1 = ptY;\n\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\ty3 = y1;\n\t\t\t} else {\n\t\t\t\ty1 = ptY + height;\n\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\ty3 = y1;\n\t\t\t\t// invert drawing order\n\t\t\t\tvar tmp = x3;\n\t\t\t\tx3 = x1;\n\t\t\t\tx1 = tmp;\n\t\t\t}\n\t\t}\n\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n\t},\n\n\tdrawTitle: function(pt, vm, ctx) {\n\t\tvar title = vm.title;\n\n\t\tif (title.length) {\n\t\t\tpt.x = getAlignedX(vm, vm._titleAlign);\n\n\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\tctx.textBaseline = 'top';\n\n\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\tctx.fillStyle = vm.titleFontColor;\n\t\t\tctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\tvar i, len;\n\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tdrawBody: function(pt, vm, ctx) {\n\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\tvar bodySpacing = vm.bodySpacing;\n\t\tvar bodyAlign = vm._bodyAlign;\n\t\tvar body = vm.body;\n\t\tvar drawColorBoxes = vm.displayColors;\n\t\tvar labelColors = vm.labelColors;\n\t\tvar xLinePadding = 0;\n\t\tvar colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;\n\t\tvar textColor;\n\n\t\tctx.textAlign = bodyAlign;\n\t\tctx.textBaseline = 'top';\n\t\tctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\tpt.x = getAlignedX(vm, bodyAlign);\n\n\t\t// Before Body\n\t\tvar fillLineOfText = function(line) {\n\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t};\n\n\t\t// Before body lines\n\t\tctx.fillStyle = vm.bodyFontColor;\n\t\thelpers$1.each(vm.beforeBody, fillLineOfText);\n\n\t\txLinePadding = drawColorBoxes && bodyAlign !== 'right'\n\t\t\t? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2)\n\t\t\t: 0;\n\n\t\t// Draw body lines now\n\t\thelpers$1.each(body, function(bodyItem, i) {\n\t\t\ttextColor = vm.labelTextColors[i];\n\t\t\tctx.fillStyle = textColor;\n\t\t\thelpers$1.each(bodyItem.before, fillLineOfText);\n\n\t\t\thelpers$1.each(bodyItem.lines, function(line) {\n\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\tctx.fillStyle = vm.legendColorBackground;\n\t\t\t\t\tctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t// Border\n\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\tctx.strokeStyle = labelColors[i].borderColor;\n\t\t\t\t\tctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t// Inner square\n\t\t\t\t\tctx.fillStyle = labelColors[i].backgroundColor;\n\t\t\t\t\tctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t}\n\n\t\t\t\tfillLineOfText(line);\n\t\t\t});\n\n\t\t\thelpers$1.each(bodyItem.after, fillLineOfText);\n\t\t});\n\n\t\t// Reset back to 0 for after body\n\t\txLinePadding = 0;\n\n\t\t// After body lines\n\t\thelpers$1.each(vm.afterBody, fillLineOfText);\n\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t},\n\n\tdrawFooter: function(pt, vm, ctx) {\n\t\tvar footer = vm.footer;\n\n\t\tif (footer.length) {\n\t\t\tpt.x = getAlignedX(vm, vm._footerAlign);\n\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\tctx.textBaseline = 'top';\n\n\t\t\tctx.fillStyle = vm.footerFontColor;\n\t\t\tctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\thelpers$1.each(footer, function(line) {\n\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t});\n\t\t}\n\t},\n\n\tdrawBackground: function(pt, vm, ctx, tooltipSize) {\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.strokeStyle = vm.borderColor;\n\t\tctx.lineWidth = vm.borderWidth;\n\t\tvar xAlign = vm.xAlign;\n\t\tvar yAlign = vm.yAlign;\n\t\tvar x = pt.x;\n\t\tvar y = pt.y;\n\t\tvar width = tooltipSize.width;\n\t\tvar height = tooltipSize.height;\n\t\tvar radius = vm.cornerRadius;\n\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + radius, y);\n\t\tif (yAlign === 'top') {\n\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t}\n\t\tctx.lineTo(x + width - radius, y);\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t}\n\t\tctx.lineTo(x + width, y + height - radius);\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\tif (yAlign === 'bottom') {\n\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t}\n\t\tctx.lineTo(x + radius, y + height);\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t}\n\t\tctx.lineTo(x, y + radius);\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\tctx.closePath();\n\n\t\tctx.fill();\n\n\t\tif (vm.borderWidth > 0) {\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\n\t\tif (vm.opacity === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tooltipSize = {\n\t\t\twidth: vm.width,\n\t\t\theight: vm.height\n\t\t};\n\t\tvar pt = {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\n\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t// Truthy/falsey value for empty tooltip\n\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\tctx.save();\n\t\t\tctx.globalAlpha = opacity;\n\n\t\t\t// Draw Background\n\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize);\n\n\t\t\t// Draw Title, Body, and Footer\n\t\t\tpt.y += vm.yPadding;\n\n\t\t\t// Titles\n\t\t\tthis.drawTitle(pt, vm, ctx);\n\n\t\t\t// Body\n\t\t\tthis.drawBody(pt, vm, ctx);\n\n\t\t\t// Footer\n\t\t\tthis.drawFooter(pt, vm, ctx);\n\n\t\t\tctx.restore();\n\t\t}\n\t},\n\n\t/**\n\t * Handle an event\n\t * @private\n\t * @param {IEvent} event - The event to handle\n\t * @returns {boolean} true if the tooltip changed\n\t */\n\thandleEvent: function(e) {\n\t\tvar me = this;\n\t\tvar options = me._options;\n\t\tvar changed = false;\n\n\t\tme._lastActive = me._lastActive || [];\n\n\t\t// Find Active Elements for tooltips\n\t\tif (e.type === 'mouseout') {\n\t\t\tme._active = [];\n\t\t} else {\n\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t}\n\n\t\t// Remember Last Actives\n\t\tchanged = !helpers$1.arrayEquals(me._active, me._lastActive);\n\n\t\t// Only handle target event on tooltip change\n\t\tif (changed) {\n\t\t\tme._lastActive = me._active;\n\n\t\t\tif (options.enabled || options.custom) {\n\t\t\t\tme._eventPosition = {\n\t\t\t\t\tx: e.x,\n\t\t\t\t\ty: e.y\n\t\t\t\t};\n\n\t\t\t\tme.update(true);\n\t\t\t\tme.pivot();\n\t\t\t}\n\t\t}\n\n\t\treturn changed;\n\t}\n});\n\n/**\n * @namespace Chart.Tooltip.positioners\n */\nvar positioners_1 = positioners;\n\nvar core_tooltip = exports$3;\ncore_tooltip.positioners = positioners_1;\n\nvar valueOrDefault$8 = helpers$1.valueOrDefault;\n\ncore_defaults._set('global', {\n\telements: {},\n\tevents: [\n\t\t'mousemove',\n\t\t'mouseout',\n\t\t'click',\n\t\t'touchstart',\n\t\t'touchmove'\n\t],\n\thover: {\n\t\tonHover: null,\n\t\tmode: 'nearest',\n\t\tintersect: true,\n\t\tanimationDuration: 400\n\t},\n\tonClick: null,\n\tmaintainAspectRatio: true,\n\tresponsive: true,\n\tresponsiveAnimationDuration: 0\n});\n\n/**\n * Recursively merge the given config objects representing the `scales` option\n * by incorporating scale defaults in `xAxes` and `yAxes` array items, then\n * returns a deep copy of the result, thus doesn't alter inputs.\n */\nfunction mergeScaleConfig(/* config objects ... */) {\n\treturn helpers$1.merge({}, [].slice.call(arguments), {\n\t\tmerger: function(key, target, source, options) {\n\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\tvar slen = source[key].length;\n\t\t\t\tvar i, type, scale;\n\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\ttarget[key] = [];\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\ttype = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n\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// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\thelpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\thelpers$1.merge(target[key][i], scale);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thelpers$1._merger(key, target, source, options);\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Recursively merge the given config objects as the root options by handling\n * default scale options for the `scales` and `scale` properties, then returns\n * a deep copy of the result, thus doesn't alter inputs.\n */\nfunction mergeConfig(/* config objects ... */) {\n\treturn helpers$1.merge({}, [].slice.call(arguments), {\n\t\tmerger: function(key, target, source, options) {\n\t\t\tvar tval = target[key] || {};\n\t\t\tvar sval = source[key];\n\n\t\t\tif (key === 'scales') {\n\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\ttarget[key] = mergeScaleConfig(tval, sval);\n\t\t\t} else if (key === 'scale') {\n\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\ttarget[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t} else {\n\t\t\t\thelpers$1._merger(key, target, source, options);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction initConfig(config) {\n\tconfig = config || {};\n\n\t// Do NOT use mergeConfig for the data object because this method merges arrays\n\t// and so would change references to labels and datasets, preventing data updates.\n\tvar data = config.data = config.data || {};\n\tdata.datasets = data.datasets || [];\n\tdata.labels = data.labels || [];\n\n\tconfig.options = mergeConfig(\n\t\tcore_defaults.global,\n\t\tcore_defaults[config.type],\n\t\tconfig.options || {});\n\n\treturn config;\n}\n\nfunction updateConfig(chart) {\n\tvar newOptions = chart.options;\n\n\thelpers$1.each(chart.scales, function(scale) {\n\t\tcore_layouts.removeBox(chart, scale);\n\t});\n\n\tnewOptions = mergeConfig(\n\t\tcore_defaults.global,\n\t\tcore_defaults[chart.config.type],\n\t\tnewOptions);\n\n\tchart.options = chart.config.options = newOptions;\n\tchart.ensureScalesHaveIDs();\n\tchart.buildOrUpdateScales();\n\n\t// Tooltip\n\tchart.tooltip._options = newOptions.tooltips;\n\tchart.tooltip.initialize();\n}\n\nfunction positionIsHorizontal(position) {\n\treturn position === 'top' || position === 'bottom';\n}\n\nvar Chart = function(item, config) {\n\tthis.construct(item, config);\n\treturn this;\n};\n\nhelpers$1.extend(Chart.prototype, /** @lends Chart */ {\n\t/**\n\t * @private\n\t */\n\tconstruct: function(item, config) {\n\t\tvar me = this;\n\n\t\tconfig = initConfig(config);\n\n\t\tvar context = platform.acquireContext(item, config);\n\t\tvar canvas = context && context.canvas;\n\t\tvar height = canvas && canvas.height;\n\t\tvar width = canvas && canvas.width;\n\n\t\tme.id = helpers$1.uid();\n\t\tme.ctx = context;\n\t\tme.canvas = canvas;\n\t\tme.config = config;\n\t\tme.width = width;\n\t\tme.height = height;\n\t\tme.aspectRatio = height ? width / height : null;\n\t\tme.options = config.options;\n\t\tme._bufferedRender = false;\n\n\t\t/**\n\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n\t\t * the \"instance\" still need to be defined since it might be called from plugins.\n\t\t * @prop Chart#chart\n\t\t * @deprecated since version 2.6.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tme.chart = me;\n\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t// Add the chart instance to the global namespace\n\t\tChart.instances[me.id] = me;\n\n\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\tObject.defineProperty(me, 'data', {\n\t\t\tget: function() {\n\t\t\t\treturn me.config.data;\n\t\t\t},\n\t\t\tset: function(value) {\n\t\t\t\tme.config.data = value;\n\t\t\t}\n\t\t});\n\n\t\tif (!context || !canvas) {\n\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\treturn;\n\t\t}\n\n\t\tme.initialize();\n\t\tme.update();\n\t},\n\n\t/**\n\t * @private\n\t */\n\tinitialize: function() {\n\t\tvar me = this;\n\n\t\t// Before init plugin notification\n\t\tcore_plugins.notify(me, 'beforeInit');\n\n\t\thelpers$1.retinaScale(me, me.options.devicePixelRatio);\n\n\t\tme.bindEvents();\n\n\t\tif (me.options.responsive) {\n\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\tme.resize(true);\n\t\t}\n\n\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\tme.ensureScalesHaveIDs();\n\t\tme.buildOrUpdateScales();\n\t\tme.initToolTip();\n\n\t\t// After init plugin notification\n\t\tcore_plugins.notify(me, 'afterInit');\n\n\t\treturn me;\n\t},\n\n\tclear: function() {\n\t\thelpers$1.canvas.clear(this);\n\t\treturn this;\n\t},\n\n\tstop: function() {\n\t\t// Stops any current animation loop occurring\n\t\tcore_animations.cancelAnimation(this);\n\t\treturn this;\n\t},\n\n\tresize: function(silent) {\n\t\tvar me = this;\n\t\tvar options = me.options;\n\t\tvar canvas = me.canvas;\n\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed\n\t\tvar newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas)));\n\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas)));\n\n\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\treturn;\n\t\t}\n\n\t\tcanvas.width = me.width = newWidth;\n\t\tcanvas.height = me.height = newHeight;\n\t\tcanvas.style.width = newWidth + 'px';\n\t\tcanvas.style.height = newHeight + 'px';\n\n\t\thelpers$1.retinaScale(me, options.devicePixelRatio);\n\n\t\tif (!silent) {\n\t\t\t// Notify any plugins about the resize\n\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\tcore_plugins.notify(me, 'resize', [newSize]);\n\n\t\t\t// Notify of resize\n\t\t\tif (options.onResize) {\n\t\t\t\toptions.onResize(me, newSize);\n\t\t\t}\n\n\t\t\tme.stop();\n\t\t\tme.update({\n\t\t\t\tduration: options.responsiveAnimationDuration\n\t\t\t});\n\t\t}\n\t},\n\n\tensureScalesHaveIDs: function() {\n\t\tvar options = this.options;\n\t\tvar scalesOptions = options.scales || {};\n\t\tvar scaleOptions = options.scale;\n\n\t\thelpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t});\n\n\t\thelpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t});\n\n\t\tif (scaleOptions) {\n\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t}\n\t},\n\n\t/**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n\tbuildOrUpdateScales: function() {\n\t\tvar me = this;\n\t\tvar options = me.options;\n\t\tvar scales = me.scales || {};\n\t\tvar items = [];\n\t\tvar updated = Object.keys(scales).reduce(function(obj, id) {\n\t\t\tobj[id] = false;\n\t\t\treturn obj;\n\t\t}, {});\n\n\t\tif (options.scales) {\n\t\t\titems = items.concat(\n\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n\t\t\t\t}),\n\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\n\t\tif (options.scale) {\n\t\t\titems.push({\n\t\t\t\toptions: options.scale,\n\t\t\t\tdtype: 'radialLinear',\n\t\t\t\tisDefault: true,\n\t\t\t\tdposition: 'chartArea'\n\t\t\t});\n\t\t}\n\n\t\thelpers$1.each(items, function(item) {\n\t\t\tvar scaleOptions = item.options;\n\t\t\tvar id = scaleOptions.id;\n\t\t\tvar scaleType = valueOrDefault$8(scaleOptions.type, item.dtype);\n\n\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t}\n\n\t\t\tupdated[id] = true;\n\t\t\tvar scale = null;\n\t\t\tif (id in scales && scales[id].type === scaleType) {\n\t\t\t\tscale = scales[id];\n\t\t\t\tscale.options = scaleOptions;\n\t\t\t\tscale.ctx = me.ctx;\n\t\t\t\tscale.chart = me;\n\t\t\t} else {\n\t\t\t\tvar scaleClass = core_scaleService.getScaleConstructor(scaleType);\n\t\t\t\tif (!scaleClass) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tscale = new scaleClass({\n\t\t\t\t\tid: id,\n\t\t\t\t\ttype: scaleType,\n\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\tchart: me\n\t\t\t\t});\n\t\t\t\tscales[scale.id] = scale;\n\t\t\t}\n\n\t\t\tscale.mergeTicksOptions();\n\n\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\tif (item.isDefault) {\n\t\t\t\tme.scale = scale;\n\t\t\t}\n\t\t});\n\t\t// clear up discarded scales\n\t\thelpers$1.each(updated, function(hasUpdated, id) {\n\t\t\tif (!hasUpdated) {\n\t\t\t\tdelete scales[id];\n\t\t\t}\n\t\t});\n\n\t\tme.scales = scales;\n\n\t\tcore_scaleService.addScalesToLayout(this);\n\t},\n\n\tbuildOrUpdateControllers: function() {\n\t\tvar me = this;\n\t\tvar newControllers = [];\n\n\t\thelpers$1.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t}\n\t\t\tmeta.type = type;\n\n\t\t\tif (meta.controller) {\n\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\tmeta.controller.linkScales();\n\t\t\t} else {\n\t\t\t\tvar ControllerClass = controllers[meta.type];\n\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t}\n\n\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t}\n\t\t}, me);\n\n\t\treturn newControllers;\n\t},\n\n\t/**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n\tresetElements: function() {\n\t\tvar me = this;\n\t\thelpers$1.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t}, me);\n\t},\n\n\t/**\n\t* Resets the chart back to it's state before the initial animation\n\t*/\n\treset: function() {\n\t\tthis.resetElements();\n\t\tthis.tooltip.initialize();\n\t},\n\n\tupdate: function(config) {\n\t\tvar me = this;\n\n\t\tif (!config || typeof config !== 'object') {\n\t\t\t// backwards compatibility\n\t\t\tconfig = {\n\t\t\t\tduration: config,\n\t\t\t\tlazy: arguments[1]\n\t\t\t};\n\t\t}\n\n\t\tupdateConfig(me);\n\n\t\t// plugins options references might have change, let's invalidate the cache\n\t\t// https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t\tcore_plugins._invalidate(me);\n\n\t\tif (core_plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// In case the entire data object changed\n\t\tme.tooltip._data = me.data;\n\n\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t// Make sure all dataset controllers have correct meta data counts\n\t\thelpers$1.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t}, me);\n\n\t\tme.updateLayout();\n\n\t\t// Can only reset the new controllers after the scales have been updated\n\t\tif (me.options.animation && me.options.animation.duration) {\n\t\t\thelpers$1.each(newControllers, function(controller) {\n\t\t\t\tcontroller.reset();\n\t\t\t});\n\t\t}\n\n\t\tme.updateDatasets();\n\n\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t// after update.\n\t\tme.tooltip.initialize();\n\n\t\t// Last active contains items that were previously in the tooltip.\n\t\t// When we reset the tooltip, we need to clear it\n\t\tme.lastActive = [];\n\n\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\tcore_plugins.notify(me, 'afterUpdate');\n\n\t\tif (me._bufferedRender) {\n\t\t\tme._bufferedRequest = {\n\t\t\t\tduration: config.duration,\n\t\t\t\teasing: config.easing,\n\t\t\t\tlazy: config.lazy\n\t\t\t};\n\t\t} else {\n\t\t\tme.render(config);\n\t\t}\n\t},\n\n\t/**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n\tupdateLayout: function() {\n\t\tvar me = this;\n\n\t\tif (core_plugins.notify(me, 'beforeLayout') === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tcore_layouts.update(this, this.width, this.height);\n\n\t\t/**\n\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t * @method IPlugin#afterScaleUpdate\n\t\t * @deprecated since version 2.5.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tcore_plugins.notify(me, 'afterScaleUpdate');\n\t\tcore_plugins.notify(me, 'afterLayout');\n\t},\n\n\t/**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n\tupdateDatasets: function() {\n\t\tvar me = this;\n\n\t\tif (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\tme.updateDataset(i);\n\t\t}\n\n\t\tcore_plugins.notify(me, 'afterDatasetsUpdate');\n\t},\n\n\t/**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n\tupdateDataset: function(index) {\n\t\tvar me = this;\n\t\tvar meta = me.getDatasetMeta(index);\n\t\tvar args = {\n\t\t\tmeta: meta,\n\t\t\tindex: index\n\t\t};\n\n\t\tif (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tmeta.controller.update();\n\n\t\tcore_plugins.notify(me, 'afterDatasetUpdate', [args]);\n\t},\n\n\trender: function(config) {\n\t\tvar me = this;\n\n\t\tif (!config || typeof config !== 'object') {\n\t\t\t// backwards compatibility\n\t\t\tconfig = {\n\t\t\t\tduration: config,\n\t\t\t\tlazy: arguments[1]\n\t\t\t};\n\t\t}\n\n\t\tvar animationOptions = me.options.animation;\n\t\tvar duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration);\n\t\tvar lazy = config.lazy;\n\n\t\tif (core_plugins.notify(me, 'beforeRender') === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar onComplete = function(animation) {\n\t\t\tcore_plugins.notify(me, 'afterRender');\n\t\t\thelpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t};\n\n\t\tif (animationOptions && duration) {\n\t\t\tvar animation = new core_animation({\n\t\t\t\tnumSteps: duration / 16.66, // 60 fps\n\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\trender: function(chart, animationObject) {\n\t\t\t\t\tvar easingFunction = helpers$1.easing.effects[animationObject.easing];\n\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t},\n\n\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\tonAnimationComplete: onComplete\n\t\t\t});\n\n\t\t\tcore_animations.addAnimation(me, animation, duration, lazy);\n\t\t} else {\n\t\t\tme.draw();\n\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\tonComplete(new core_animation({numSteps: 0, chart: me}));\n\t\t}\n\n\t\treturn me;\n\t},\n\n\tdraw: function(easingValue) {\n\t\tvar me = this;\n\n\t\tme.clear();\n\n\t\tif (helpers$1.isNullOrUndef(easingValue)) {\n\t\t\teasingValue = 1;\n\t\t}\n\n\t\tme.transition(easingValue);\n\n\t\tif (me.width <= 0 || me.height <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Draw all the scales\n\t\thelpers$1.each(me.boxes, function(box) {\n\t\t\tbox.draw(me.chartArea);\n\t\t}, me);\n\n\t\tme.drawDatasets(easingValue);\n\t\tme._drawTooltip(easingValue);\n\n\t\tcore_plugins.notify(me, 'afterDraw', [easingValue]);\n\t},\n\n\t/**\n\t * @private\n\t */\n\ttransition: function(easingValue) {\n\t\tvar me = this;\n\n\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t}\n\t\t}\n\n\t\tme.tooltip.transition(easingValue);\n\t},\n\n\t/**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n\tdrawDatasets: function(easingValue) {\n\t\tvar me = this;\n\n\t\tif (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Draw datasets reversed to support proper line stacking\n\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t}\n\t\t}\n\n\t\tcore_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t},\n\n\t/**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n\tdrawDataset: function(index, easingValue) {\n\t\tvar me = this;\n\t\tvar meta = me.getDatasetMeta(index);\n\t\tvar args = {\n\t\t\tmeta: meta,\n\t\t\tindex: index,\n\t\t\teasingValue: easingValue\n\t\t};\n\n\t\tif (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tmeta.controller.draw(easingValue);\n\n\t\tcore_plugins.notify(me, 'afterDatasetDraw', [args]);\n\t},\n\n\t/**\n\t * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n\t * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n\t * @private\n\t */\n\t_drawTooltip: function(easingValue) {\n\t\tvar me = this;\n\t\tvar tooltip = me.tooltip;\n\t\tvar args = {\n\t\t\ttooltip: tooltip,\n\t\t\teasingValue: easingValue\n\t\t};\n\n\t\tif (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip.draw();\n\n\t\tcore_plugins.notify(me, 'afterTooltipDraw', [args]);\n\t},\n\n\t/**\n\t * Get the single element that was clicked on\n\t * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t */\n\tgetElementAtEvent: function(e) {\n\t\treturn core_interaction.modes.single(this, e);\n\t},\n\n\tgetElementsAtEvent: function(e) {\n\t\treturn core_interaction.modes.label(this, e, {intersect: true});\n\t},\n\n\tgetElementsAtXAxis: function(e) {\n\t\treturn core_interaction.modes['x-axis'](this, e, {intersect: true});\n\t},\n\n\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\tvar method = core_interaction.modes[mode];\n\t\tif (typeof method === 'function') {\n\t\t\treturn method(this, e, options);\n\t\t}\n\n\t\treturn [];\n\t},\n\n\tgetDatasetAtEvent: function(e) {\n\t\treturn core_interaction.modes.dataset(this, e, {intersect: true});\n\t},\n\n\tgetDatasetMeta: function(datasetIndex) {\n\t\tvar me = this;\n\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\tif (!dataset._meta) {\n\t\t\tdataset._meta = {};\n\t\t}\n\n\t\tvar meta = dataset._meta[me.id];\n\t\tif (!meta) {\n\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\ttype: null,\n\t\t\t\tdata: [],\n\t\t\t\tdataset: null,\n\t\t\t\tcontroller: null,\n\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\txAxisID: null,\n\t\t\t\tyAxisID: null\n\t\t\t};\n\t\t}\n\n\t\treturn meta;\n\t},\n\n\tgetVisibleDatasetCount: function() {\n\t\tvar count = 0;\n\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t},\n\n\tisDatasetVisible: function(datasetIndex) {\n\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t},\n\n\tgenerateLegend: function() {\n\t\treturn this.options.legendCallback(this);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tdestroyDatasetMeta: function(datasetIndex) {\n\t\tvar id = this.id;\n\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\tif (meta) {\n\t\t\tmeta.controller.destroy();\n\t\t\tdelete dataset._meta[id];\n\t\t}\n\t},\n\n\tdestroy: function() {\n\t\tvar me = this;\n\t\tvar canvas = me.canvas;\n\t\tvar i, ilen;\n\n\t\tme.stop();\n\n\t\t// dataset controllers need to cleanup associated data\n\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\tme.destroyDatasetMeta(i);\n\t\t}\n\n\t\tif (canvas) {\n\t\t\tme.unbindEvents();\n\t\t\thelpers$1.canvas.clear(me);\n\t\t\tplatform.releaseContext(me.ctx);\n\t\t\tme.canvas = null;\n\t\t\tme.ctx = null;\n\t\t}\n\n\t\tcore_plugins.notify(me, 'destroy');\n\n\t\tdelete Chart.instances[me.id];\n\t},\n\n\ttoBase64Image: function() {\n\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t},\n\n\tinitToolTip: function() {\n\t\tvar me = this;\n\t\tme.tooltip = new core_tooltip({\n\t\t\t_chart: me,\n\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t_data: me.data,\n\t\t\t_options: me.options.tooltips\n\t\t}, me);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tbindEvents: function() {\n\t\tvar me = this;\n\t\tvar listeners = me._listeners = {};\n\t\tvar listener = function() {\n\t\t\tme.eventHandler.apply(me, arguments);\n\t\t};\n\n\t\thelpers$1.each(me.options.events, function(type) {\n\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\tlisteners[type] = listener;\n\t\t});\n\n\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\tif (me.options.responsive) {\n\t\t\tlistener = function() {\n\t\t\t\tme.resize();\n\t\t\t};\n\n\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\tlisteners.resize = listener;\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tunbindEvents: function() {\n\t\tvar me = this;\n\t\tvar listeners = me._listeners;\n\t\tif (!listeners) {\n\t\t\treturn;\n\t\t}\n\n\t\tdelete me._listeners;\n\t\thelpers$1.each(listeners, function(listener, type) {\n\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t});\n\t},\n\n\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\tvar element, i, ilen;\n\n\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\telement = elements[i];\n\t\t\tif (element) {\n\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\teventHandler: function(e) {\n\t\tvar me = this;\n\t\tvar tooltip = me.tooltip;\n\n\t\tif (core_plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Buffer any update calls so that renders do not occur\n\t\tme._bufferedRender = true;\n\t\tme._bufferedRequest = null;\n\n\t\tvar changed = me.handleEvent(e);\n\t\t// for smooth tooltip animations issue #4989\n\t\t// the tooltip should be the source of change\n\t\t// Animation check workaround:\n\t\t// tooltip._start will be null when tooltip isn't animating\n\t\tif (tooltip) {\n\t\t\tchanged = tooltip._start\n\t\t\t\t? tooltip.handleEvent(e)\n\t\t\t\t: changed | tooltip.handleEvent(e);\n\t\t}\n\n\t\tcore_plugins.notify(me, 'afterEvent', [e]);\n\n\t\tvar bufferedRequest = me._bufferedRequest;\n\t\tif (bufferedRequest) {\n\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\tme.render(bufferedRequest);\n\t\t} else if (changed && !me.animating) {\n\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\tme.stop();\n\n\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\tme.render({\n\t\t\t\tduration: me.options.hover.animationDuration,\n\t\t\t\tlazy: true\n\t\t\t});\n\t\t}\n\n\t\tme._bufferedRender = false;\n\t\tme._bufferedRequest = null;\n\n\t\treturn me;\n\t},\n\n\t/**\n\t * Handle an event\n\t * @private\n\t * @param {IEvent} event the event to handle\n\t * @return {boolean} true if the chart needs to re-render\n\t */\n\thandleEvent: function(e) {\n\t\tvar me = this;\n\t\tvar options = me.options || {};\n\t\tvar hoverOptions = options.hover;\n\t\tvar changed = false;\n\n\t\tme.lastActive = me.lastActive || [];\n\n\t\t// Find Active Elements for hover and tooltips\n\t\tif (e.type === 'mouseout') {\n\t\t\tme.active = [];\n\t\t} else {\n\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t}\n\n\t\t// Invoke onHover hook\n\t\t// Need to call with native event here to not break backwards compatibility\n\t\thelpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\tif (options.onClick) {\n\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t}\n\t\t}\n\n\t\t// Remove styling for last active (even if it may still be active)\n\t\tif (me.lastActive.length) {\n\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t}\n\n\t\t// Built in hover styling\n\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t}\n\n\t\tchanged = !helpers$1.arrayEquals(me.active, me.lastActive);\n\n\t\t// Remember Last Actives\n\t\tme.lastActive = me.active;\n\n\t\treturn changed;\n\t}\n});\n\n/**\n * NOTE(SB) We actually don't use this container anymore but we need to keep it\n * for backward compatibility. Though, it can still be useful for plugins that\n * would need to work on multiple charts?!\n */\nChart.instances = {};\n\nvar core_controller = Chart;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6\n * @todo remove at version 3\n * @private\n */\nChart.Controller = Chart;\n\n/**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart\n * @deprecated since version 2.8\n * @todo remove at version 3\n * @private\n */\nChart.types = {};\n\n/**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart.helpers.configMerge\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\nhelpers$1.configMerge = mergeConfig;\n\n/**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart.helpers.scaleMerge\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\nhelpers$1.scaleMerge = mergeScaleConfig;\n\nvar core_helpers = function() {\n\n\t// -- Basic js utility methods\n\n\thelpers$1.where = function(collection, filterCallback) {\n\t\tif (helpers$1.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers$1.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$1.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$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (helpers$1.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$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (helpers$1.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$1.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers$1.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers$1.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers$1.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$1.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$1.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$1.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$1.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers$1.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\n\t/**\n\t * Returns the number of decimal places\n\t * i.e. the number of digits after the decimal point, of the value of this Number.\n\t * @param {number} x - A number.\n\t * @returns {number} The number of decimal places.\n\t * @private\n\t */\n\thelpers$1._decimalPlaces = function(x) {\n\t\tif (!helpers$1.isFinite(x)) {\n\t\t\treturn;\n\t\t}\n\t\tvar e = 1;\n\t\tvar p = 0;\n\t\twhile (Math.round(x * e) / e !== x) {\n\t\t\te *= 10;\n\t\t\tp++;\n\t\t}\n\t\treturn p;\n\t};\n\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers$1.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$1.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\n\t/**\n\t * Provided for backward compatibility, not available anymore\n\t * @function Chart.helpers.aliasPixel\n\t * @deprecated since version 2.8.0\n\t * @todo remove at version 3\n\t */\n\thelpers$1.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\n\t/**\n\t * Returns the aligned pixel value to avoid anti-aliasing blur\n\t * @param {Chart} chart - The chart instance.\n\t * @param {number} pixel - A pixel value.\n\t * @param {number} width - The width of the element.\n\t * @returns {number} The aligned pixel value.\n\t * @private\n\t */\n\thelpers$1._alignPixel = function(chart, pixel, width) {\n\t\tvar devicePixelRatio = chart.currentDevicePixelRatio;\n\t\tvar halfWidth = width / 2;\n\t\treturn Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n\t};\n\n\thelpers$1.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$1.EPSILON = Number.EPSILON || 1e-14;\n\thelpers$1.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$1.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$1.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$1.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$1.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers$1.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 - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers$1.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$1.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt;\n\t\tvar canvas = evt.target || 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// https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers$1.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/**\n\t * Returns the max width or height of the given DOM node in a cross-browser compatible fashion\n\t * @param {HTMLElement} domNode - the node to check the constraint on\n\t * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height')\n\t * @param {string} percentageProperty - property of parent to use when calculating width as a percentage\n\t * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser}\n\t */\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = helpers$1._getParentNode(domNode);\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$1.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers$1.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\t/**\n\t * @private\n \t */\n\thelpers$1._calculatePadding = function(container, padding, parentDimension) {\n\t\tpadding = helpers$1.getStyle(container, padding);\n\n\t\treturn padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10);\n\t};\n\t/**\n\t * @private\n\t */\n\thelpers$1._getParentNode = function(domNode) {\n\t\tvar parent = domNode.parentNode;\n\t\tif (parent && parent.toString() === '[object ShadowRoot]') {\n\t\t\tparent = parent.host;\n\t\t}\n\t\treturn parent;\n\t};\n\thelpers$1.getMaximumWidth = function(domNode) {\n\t\tvar container = helpers$1._getParentNode(domNode);\n\t\tif (!container) {\n\t\t\treturn domNode.clientWidth;\n\t\t}\n\n\t\tvar clientWidth = container.clientWidth;\n\t\tvar paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth);\n\t\tvar paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth);\n\n\t\tvar w = clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers$1.getConstraintWidth(domNode);\n\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t};\n\thelpers$1.getMaximumHeight = function(domNode) {\n\t\tvar container = helpers$1._getParentNode(domNode);\n\t\tif (!container) {\n\t\t\treturn domNode.clientHeight;\n\t\t}\n\n\t\tvar clientHeight = container.clientHeight;\n\t\tvar paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight);\n\t\tvar paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight);\n\n\t\tvar h = clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers$1.getConstraintHeight(domNode);\n\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t};\n\thelpers$1.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$1.retinaScale = function(chart, forceRatio) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && 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$1.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers$1.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$1.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$1.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers$1.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers$1.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$1.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$1.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers$1.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$1.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$1.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers$1.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers$1.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$1.color = !chartjsColor ?\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 = core_defaults.global.defaultColor;\n\t\t\t}\n\n\t\t\treturn chartjsColor(value);\n\t\t};\n\n\thelpers$1.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ?\n\t\t\tcolorValue :\n\t\t\thelpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n\nfunction abstract() {\n\tthrow new Error(\n\t\t'This method is not implemented: either no adapter can ' +\n\t\t'be found or an incomplete integration was provided.'\n\t);\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\n\n/**\n * Currently supported unit string values.\n * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')}\n * @memberof Chart._adapters._date\n * @name Unit\n */\n\n/**\n * @class\n */\nfunction DateAdapter(options) {\n\tthis.options = options || {};\n}\n\nhelpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ {\n\t/**\n\t * Returns a map of time formats for the supported formatting units defined\n\t * in Unit as well as 'datetime' representing a detailed date/time string.\n\t * @returns {{string: string}}\n\t */\n\tformats: abstract,\n\n\t/**\n\t * Parses the given `value` and return the associated timestamp.\n\t * @param {any} value - the value to parse (usually comes from the data)\n\t * @param {string} [format] - the expected data format\n\t * @returns {(number|null)}\n\t * @function\n\t */\n\tparse: abstract,\n\n\t/**\n\t * Returns the formatted date in the specified `format` for a given `timestamp`.\n\t * @param {number} timestamp - the timestamp to format\n\t * @param {string} format - the date/time token\n\t * @return {string}\n\t * @function\n\t */\n\tformat: abstract,\n\n\t/**\n\t * Adds the specified `amount` of `unit` to the given `timestamp`.\n\t * @param {number} timestamp - the input timestamp\n\t * @param {number} amount - the amount to add\n\t * @param {Unit} unit - the unit as string\n\t * @return {number}\n\t * @function\n\t */\n\tadd: abstract,\n\n\t/**\n\t * Returns the number of `unit` between the given timestamps.\n\t * @param {number} max - the input timestamp (reference)\n\t * @param {number} min - the timestamp to substract\n\t * @param {Unit} unit - the unit as string\n\t * @return {number}\n\t * @function\n\t */\n\tdiff: abstract,\n\n\t/**\n\t * Returns start of `unit` for the given `timestamp`.\n\t * @param {number} timestamp - the input timestamp\n\t * @param {Unit} unit - the unit as string\n\t * @param {number} [weekday] - the ISO day of the week with 1 being Monday\n\t * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n\t * @function\n\t */\n\tstartOf: abstract,\n\n\t/**\n\t * Returns end of `unit` for the given `timestamp`.\n\t * @param {number} timestamp - the input timestamp\n\t * @param {Unit} unit - the unit as string\n\t * @function\n\t */\n\tendOf: abstract,\n\n\t// DEPRECATIONS\n\n\t/**\n\t * Provided for backward compatibility for scale.getValueForPixel(),\n\t * this method should be overridden only by the moment adapter.\n\t * @deprecated since version 2.8.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\t_create: function(value) {\n\t\treturn value;\n\t}\n});\n\nDateAdapter.override = function(members) {\n\thelpers$1.extend(DateAdapter.prototype, members);\n};\n\nvar _date = DateAdapter;\n\nvar core_adapters = {\n\t_date: _date\n};\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nvar core_ticks = {\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|string[]} the label to display\n\t\t */\n\t\tvalues: function(value) {\n\t\t\treturn helpers$1.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 {number[]} 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$1.log10(Math.abs(delta));\n\t\t\tvar tickString = '';\n\n\t\t\tif (tickValue !== 0) {\n\t\t\t\tvar maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));\n\t\t\t\tif (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation\n\t\t\t\t\tvar logTick = helpers$1.log10(Math.abs(tickValue));\n\t\t\t\t\ttickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta));\n\t\t\t\t} else {\n\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t\t}\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$1.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\nvar valueOrDefault$9 = helpers$1.valueOrDefault;\nvar valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;\n\ncore_defaults._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// 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: core_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 getPixelForGridLine(scale, index, offsetGridLines) {\n\tvar lineValue = scale.getPixelForTick(index);\n\n\tif (offsetGridLines) {\n\t\tif (scale.getTicks().length === 1) {\n\t\t\tlineValue -= scale.isHorizontal() ?\n\t\t\t\tMath.max(lineValue - scale.left, scale.right - lineValue) :\n\t\t\t\tMath.max(lineValue - scale.top, scale.bottom - lineValue);\n\t\t} else if (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\nfunction computeTextSize(context, tick, font) {\n\treturn helpers$1.isArray(tick) ?\n\t\thelpers$1.longestText(context, font, tick) :\n\t\tcontext.measureText(tick).width;\n}\n\nvar core_scale = core_element.extend({\n\t/**\n\t * Get the padding needed for the scale\n\t * @method getPadding\n\t * @private\n\t * @returns {Padding} the necessary padding\n\t */\n\tgetPadding: function() {\n\t\tvar me = this;\n\t\treturn {\n\t\t\tleft: me.paddingLeft || 0,\n\t\t\ttop: me.paddingTop || 0,\n\t\t\tright: me.paddingRight || 0,\n\t\t\tbottom: me.paddingBottom || 0\n\t\t};\n\t},\n\n\t/**\n\t * Returns the scale tick objects ({label, major})\n\t * @since 2.7\n\t */\n\tgetTicks: function() {\n\t\treturn this._ticks;\n\t},\n\n\t// These methods are ordered by lifecyle. Utilities then follow.\n\t// Any function defined here is inherited by all scale types.\n\t// Any function can be extended by the scale type\n\n\tmergeTicksOptions: function() {\n\t\tvar ticks = this.options.ticks;\n\t\tif (ticks.minor === false) {\n\t\t\tticks.minor = {\n\t\t\t\tdisplay: false\n\t\t\t};\n\t\t}\n\t\tif (ticks.major === false) {\n\t\t\tticks.major = {\n\t\t\t\tdisplay: false\n\t\t\t};\n\t\t}\n\t\tfor (var key in ticks) {\n\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t}\n\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tbeforeUpdate: function() {\n\t\thelpers$1.callback(this.options.beforeUpdate, [this]);\n\t},\n\n\tupdate: function(maxWidth, maxHeight, margins) {\n\t\tvar me = this;\n\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\tme.beforeUpdate();\n\n\t\t// Absorb the master measurements\n\t\tme.maxWidth = maxWidth;\n\t\tme.maxHeight = maxHeight;\n\t\tme.margins = helpers$1.extend({\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t\tbottom: 0\n\t\t}, margins);\n\n\t\tme._maxLabelLines = 0;\n\t\tme.longestLabelWidth = 0;\n\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t// Dimensions\n\t\tme.beforeSetDimensions();\n\t\tme.setDimensions();\n\t\tme.afterSetDimensions();\n\n\t\t// Data min/max\n\t\tme.beforeDataLimits();\n\t\tme.determineDataLimits();\n\t\tme.afterDataLimits();\n\n\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t// around for long time and not marked as private, we can't change its structure\n\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t// use scale.getTicks() instead.\n\n\t\tme.beforeBuildTicks();\n\n\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\tticks = me.buildTicks() || [];\n\n\t\t// Allow modification of ticks in callback.\n\t\tticks = me.afterBuildTicks(ticks) || ticks;\n\n\t\tme.beforeTickToLabelConversion();\n\n\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t// this method and supposed to contain only string values).\n\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\tme.afterTickToLabelConversion();\n\n\t\tme.ticks = labels; // BACKWARD COMPATIBILITY\n\n\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\tlabel = labels[i];\n\t\t\ttick = ticks[i];\n\t\t\tif (!tick) {\n\t\t\t\tticks.push(tick = {\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tmajor: false\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttick.label = label;\n\t\t\t}\n\t\t}\n\n\t\tme._ticks = ticks;\n\n\t\t// Tick Rotation\n\t\tme.beforeCalculateTickRotation();\n\t\tme.calculateTickRotation();\n\t\tme.afterCalculateTickRotation();\n\t\t// Fit\n\t\tme.beforeFit();\n\t\tme.fit();\n\t\tme.afterFit();\n\t\t//\n\t\tme.afterUpdate();\n\n\t\treturn me.minSize;\n\n\t},\n\tafterUpdate: function() {\n\t\thelpers$1.callback(this.options.afterUpdate, [this]);\n\t},\n\n\t//\n\n\tbeforeSetDimensions: function() {\n\t\thelpers$1.callback(this.options.beforeSetDimensions, [this]);\n\t},\n\tsetDimensions: function() {\n\t\tvar me = this;\n\t\t// Set the unconstrained dimension before label rotation\n\t\tif (me.isHorizontal()) {\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.left = 0;\n\t\t\tme.right = me.width;\n\t\t} else {\n\t\t\tme.height = me.maxHeight;\n\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.top = 0;\n\t\t\tme.bottom = me.height;\n\t\t}\n\n\t\t// Reset padding\n\t\tme.paddingLeft = 0;\n\t\tme.paddingTop = 0;\n\t\tme.paddingRight = 0;\n\t\tme.paddingBottom = 0;\n\t},\n\tafterSetDimensions: function() {\n\t\thelpers$1.callback(this.options.afterSetDimensions, [this]);\n\t},\n\n\t// Data limits\n\tbeforeDataLimits: function() {\n\t\thelpers$1.callback(this.options.beforeDataLimits, [this]);\n\t},\n\tdetermineDataLimits: helpers$1.noop,\n\tafterDataLimits: function() {\n\t\thelpers$1.callback(this.options.afterDataLimits, [this]);\n\t},\n\n\t//\n\tbeforeBuildTicks: function() {\n\t\thelpers$1.callback(this.options.beforeBuildTicks, [this]);\n\t},\n\tbuildTicks: helpers$1.noop,\n\tafterBuildTicks: function(ticks) {\n\t\tvar me = this;\n\t\t// ticks is empty for old axis implementations here\n\t\tif (helpers$1.isArray(ticks) && ticks.length) {\n\t\t\treturn helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);\n\t\t}\n\t\t// Support old implementations (that modified `this.ticks` directly in buildTicks)\n\t\tme.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;\n\t\treturn ticks;\n\t},\n\n\tbeforeTickToLabelConversion: function() {\n\t\thelpers$1.callback(this.options.beforeTickToLabelConversion, [this]);\n\t},\n\tconvertTicksToLabels: function() {\n\t\tvar me = this;\n\t\t// Convert ticks to strings\n\t\tvar tickOpts = me.options.ticks;\n\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t},\n\tafterTickToLabelConversion: function() {\n\t\thelpers$1.callback(this.options.afterTickToLabelConversion, [this]);\n\t},\n\n\t//\n\n\tbeforeCalculateTickRotation: function() {\n\t\thelpers$1.callback(this.options.beforeCalculateTickRotation, [this]);\n\t},\n\tcalculateTickRotation: function() {\n\t\tvar me = this;\n\t\tvar context = me.ctx;\n\t\tvar tickOpts = me.options.ticks;\n\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t// Get the width of each grid by calculating the difference\n\t\t// between x offsets between 0 and 1.\n\t\tvar tickFont = helpers$1.options._parseFont(tickOpts);\n\t\tcontext.font = tickFont.string;\n\n\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\tvar originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache);\n\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\tvar angleRadians = helpers$1.toRadians(labelRotation);\n\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t// go back one step\n\t\t\t\t\tlabelRotation--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tlabelRotation++;\n\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t}\n\t\t}\n\n\t\tme.labelRotation = labelRotation;\n\t},\n\tafterCalculateTickRotation: function() {\n\t\thelpers$1.callback(this.options.afterCalculateTickRotation, [this]);\n\t},\n\n\t//\n\n\tbeforeFit: function() {\n\t\thelpers$1.callback(this.options.beforeFit, [this]);\n\t},\n\tfit: function() {\n\t\tvar me = this;\n\t\t// Reset\n\t\tvar minSize = me.minSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\n\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\tvar opts = me.options;\n\t\tvar tickOpts = opts.ticks;\n\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\tvar gridLineOpts = opts.gridLines;\n\t\tvar display = me._isVisible();\n\t\tvar position = opts.position;\n\t\tvar isHorizontal = me.isHorizontal();\n\n\t\tvar parseFont = helpers$1.options._parseFont;\n\t\tvar tickFont = parseFont(tickOpts);\n\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t// Width\n\t\tif (isHorizontal) {\n\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t} else {\n\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t}\n\n\t\t// height\n\t\tif (isHorizontal) {\n\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t} else {\n\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t}\n\n\t\t// Are we showing a title for the scale?\n\t\tif (scaleLabelOpts.display && display) {\n\t\t\tvar scaleLabelFont = parseFont(scaleLabelOpts);\n\t\t\tvar scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding);\n\t\t\tvar deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height;\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height += deltaHeight;\n\t\t\t} else {\n\t\t\t\tminSize.width += deltaHeight;\n\t\t\t}\n\t\t}\n\n\t\t// Don't bother fitting the ticks if we are not showing the labels\n\t\tif (tickOpts.display && display) {\n\t\t\tvar largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache);\n\t\t\tvar tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels);\n\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t// Store max number of lines and widest label for _autoSkip\n\t\t\tme._maxLabelLines = tallestLabelHeightInLines;\n\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tvar angleRadians = helpers$1.toRadians(me.labelRotation);\n\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t// TODO - improve this calculation\n\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t+ (tickFont.lineHeight * tallestLabelHeightInLines)\n\t\t\t\t\t+ lineSpace; // padding\n\n\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\tme.ctx.font = tickFont.string;\n\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string);\n\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string);\n\t\t\t\tvar offsetLeft = me.getPixelForTick(0) - me.left;\n\t\t\t\tvar offsetRight = me.right - me.getPixelForTick(labels.length - 1);\n\t\t\t\tvar paddingLeft, paddingRight;\n\n\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\tpaddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace);\n\t\t\t\t\tpaddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth);\n\t\t\t\t} else {\n\t\t\t\t\tpaddingLeft = firstLabelWidth / 2;\n\t\t\t\t\tpaddingRight = lastLabelWidth / 2;\n\t\t\t\t}\n\t\t\t\tme.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges\n\t\t\t\tme.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3;\n\t\t\t} else {\n\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t}\n\n\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t}\n\t\t}\n\n\t\tme.handleMargins();\n\n\t\tme.width = minSize.width;\n\t\tme.height = minSize.height;\n\t},\n\n\t/**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n\thandleMargins: function() {\n\t\tvar me = this;\n\t\tif (me.margins) {\n\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t}\n\t},\n\n\tafterFit: function() {\n\t\thelpers$1.callback(this.options.afterFit, [this]);\n\t},\n\n\t// Shared Methods\n\tisHorizontal: function() {\n\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t},\n\tisFullWidth: function() {\n\t\treturn (this.options.fullWidth);\n\t},\n\n\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\tgetRightValue: function(rawValue) {\n\t\t// Null and undefined values first\n\t\tif (helpers$1.isNullOrUndef(rawValue)) {\n\t\t\treturn NaN;\n\t\t}\n\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\tif ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {\n\t\t\treturn NaN;\n\t\t}\n\t\t// If it is in fact an object, dive in one more level\n\t\tif (rawValue) {\n\t\t\tif (this.isHorizontal()) {\n\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t}\n\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t}\n\t\t}\n\n\t\t// Value is good, return it\n\t\treturn rawValue;\n\t},\n\n\t/**\n\t * Used to get the value to display in the tooltip for the data at the given index\n\t * @param index\n\t * @param datasetIndex\n\t */\n\tgetLabelForIndex: helpers$1.noop,\n\n\t/**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param value\n\t * @param index\n\t * @param datasetIndex\n\t */\n\tgetPixelForValue: helpers$1.noop,\n\n\t/**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param pixel\n\t */\n\tgetValueForPixel: helpers$1.noop,\n\n\t/**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t */\n\tgetPixelForTick: function(index) {\n\t\tvar me = this;\n\t\tvar offset = me.options.offset;\n\t\tif (me.isHorizontal()) {\n\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\tvar tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\tif (offset) {\n\t\t\t\tpixel += tickWidth / 2;\n\t\t\t}\n\n\t\t\tvar finalVal = me.left + pixel;\n\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\treturn finalVal;\n\t\t}\n\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\treturn me.top + (index * (innerHeight / (me._ticks.length - 1)));\n\t},\n\n\t/**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t */\n\tgetPixelForDecimal: function(decimal) {\n\t\tvar me = this;\n\t\tif (me.isHorizontal()) {\n\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\tvar finalVal = me.left + valueOffset;\n\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\treturn finalVal;\n\t\t}\n\t\treturn me.top + (decimal * me.height);\n\t},\n\n\t/**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t */\n\tgetBasePixel: function() {\n\t\treturn this.getPixelForValue(this.getBaseValue());\n\t},\n\n\tgetBaseValue: function() {\n\t\tvar me = this;\n\t\tvar min = me.min;\n\t\tvar max = me.max;\n\n\t\treturn me.beginAtZero ? 0 :\n\t\t\tmin < 0 && max < 0 ? max :\n\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t0;\n\t},\n\n\t/**\n\t * Returns a subset of ticks to be plotted to avoid overlapping labels.\n\t * @private\n\t */\n\t_autoSkip: function(ticks) {\n\t\tvar me = this;\n\t\tvar isHorizontal = me.isHorizontal();\n\t\tvar optionTicks = me.options.ticks.minor;\n\t\tvar tickCount = ticks.length;\n\t\tvar skipRatio = false;\n\t\tvar maxTicks = optionTicks.maxTicksLimit;\n\n\t\t// Total space needed to display all ticks. First and last ticks are\n\t\t// drawn as their center at end of axis, so tickCount-1\n\t\tvar ticksLength = me._tickSize() * (tickCount - 1);\n\n\t\t// Axis length\n\t\tvar axisLength = isHorizontal\n\t\t\t? me.width - (me.paddingLeft + me.paddingRight)\n\t\t\t: me.height - (me.paddingTop + me.PaddingBottom);\n\n\t\tvar result = [];\n\t\tvar i, tick;\n\n\t\tif (ticksLength > axisLength) {\n\t\t\tskipRatio = 1 + Math.floor(ticksLength / axisLength);\n\t\t}\n\n\t\t// if they defined a max number of optionTicks,\n\t\t// increase skipRatio until that number is met\n\t\tif (tickCount > maxTicks) {\n\t\t\tskipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks));\n\t\t}\n\n\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\ttick = ticks[i];\n\n\t\t\tif (skipRatio > 1 && i % skipRatio > 0) {\n\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\tdelete tick.label;\n\t\t\t}\n\t\t\tresult.push(tick);\n\t\t}\n\t\treturn result;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_tickSize: function() {\n\t\tvar me = this;\n\t\tvar isHorizontal = me.isHorizontal();\n\t\tvar optionTicks = me.options.ticks.minor;\n\n\t\t// Calculate space needed by label in axis direction.\n\t\tvar rot = helpers$1.toRadians(me.labelRotation);\n\t\tvar cos = Math.abs(Math.cos(rot));\n\t\tvar sin = Math.abs(Math.sin(rot));\n\n\t\tvar padding = optionTicks.autoSkipPadding || 0;\n\t\tvar w = (me.longestLabelWidth + padding) || 0;\n\n\t\tvar tickFont = helpers$1.options._parseFont(optionTicks);\n\t\tvar h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0;\n\n\t\t// Calculate space needed for 1 tick in axis direction.\n\t\treturn isHorizontal\n\t\t\t? h * cos > w * sin ? w / cos : h / sin\n\t\t\t: h * sin < w * cos ? h / cos : w / sin;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_isVisible: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar display = me.options.display;\n\t\tvar i, ilen, meta;\n\n\t\tif (display !== 'auto') {\n\t\t\treturn !!display;\n\t\t}\n\n\t\t// When 'auto', the scale is visible if at least one associated dataset is visible.\n\t\tfor (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tif (meta.xAxisID === me.id || meta.yAxisID === me.id) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Actually draw the scale on the canvas\n\t * @param {object} chartArea - the area of the chart to draw full grid lines on\n\t */\n\tdraw: function(chartArea) {\n\t\tvar me = this;\n\t\tvar options = me.options;\n\n\t\tif (!me._isVisible()) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar chart = me.chart;\n\t\tvar context = me.ctx;\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar defaultFontColor = globalDefaults.defaultFontColor;\n\t\tvar optionTicks = options.ticks.minor;\n\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\tvar gridLines = options.gridLines;\n\t\tvar scaleLabel = options.scaleLabel;\n\t\tvar position = options.position;\n\n\t\tvar isRotated = me.labelRotation !== 0;\n\t\tvar isMirrored = optionTicks.mirror;\n\t\tvar isHorizontal = me.isHorizontal();\n\n\t\tvar parseFont = helpers$1.options._parseFont;\n\t\tvar ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\tvar tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor);\n\t\tvar tickFont = parseFont(optionTicks);\n\t\tvar lineHeight = tickFont.lineHeight;\n\t\tvar majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor);\n\t\tvar majorTickFont = parseFont(optionMajorTicks);\n\t\tvar tickPadding = optionTicks.padding;\n\t\tvar labelOffset = optionTicks.labelOffset;\n\n\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\tvar scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor);\n\t\tvar scaleLabelFont = parseFont(scaleLabel);\n\t\tvar scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);\n\t\tvar labelRotationRadians = helpers$1.toRadians(me.labelRotation);\n\n\t\tvar itemsToDraw = [];\n\n\t\tvar axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;\n\t\tvar alignPixel = helpers$1._alignPixel;\n\t\tvar borderValue, tickStart, tickEnd;\n\n\t\tif (position === 'top') {\n\t\t\tborderValue = alignPixel(chart, me.bottom, axisWidth);\n\t\t\ttickStart = me.bottom - tl;\n\t\t\ttickEnd = borderValue - axisWidth / 2;\n\t\t} else if (position === 'bottom') {\n\t\t\tborderValue = alignPixel(chart, me.top, axisWidth);\n\t\t\ttickStart = borderValue + axisWidth / 2;\n\t\t\ttickEnd = me.top + tl;\n\t\t} else if (position === 'left') {\n\t\t\tborderValue = alignPixel(chart, me.right, axisWidth);\n\t\t\ttickStart = me.right - tl;\n\t\t\ttickEnd = borderValue - axisWidth / 2;\n\t\t} else {\n\t\t\tborderValue = alignPixel(chart, me.left, axisWidth);\n\t\t\ttickStart = borderValue + axisWidth / 2;\n\t\t\ttickEnd = me.left + tl;\n\t\t}\n\n\t\tvar epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error.\n\n\t\thelpers$1.each(ticks, function(tick, index) {\n\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\tif (helpers$1.isNullOrUndef(tick.label)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar label = tick.label;\n\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t// Draw the first index specially\n\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\tborderDash = gridLines.zeroLineBorderDash || [];\n\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;\n\t\t\t} else {\n\t\t\t\tlineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\tlineColor = valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\tborderDash = gridLines.borderDash || [];\n\t\t\t\tborderDashOffset = gridLines.borderDashOffset || 0.0;\n\t\t\t}\n\n\t\t\t// Common properties\n\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign;\n\t\t\tvar labelCount = helpers$1.isArray(label) ? label.length : 1;\n\t\t\tvar lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines);\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\tif (lineValue < me.left - epsilon) {\n\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t}\n\n\t\t\t\ttx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth);\n\t\t\t\tty1 = tickStart;\n\t\t\t\tty2 = tickEnd;\n\t\t\t\tlabelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\tif (position === 'top') {\n\t\t\t\t\ty1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2;\n\t\t\t\t\ty2 = chartArea.bottom;\n\t\t\t\t\ttextOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight;\n\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2;\n\t\t\t\t\ttextOffset = (!isRotated ? 0.5 : 0) * lineHeight;\n\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar labelXOffset = (isMirrored ? 0 : tl) + tickPadding;\n\n\t\t\t\tif (lineValue < me.top - epsilon) {\n\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t}\n\n\t\t\t\ttx1 = tickStart;\n\t\t\t\ttx2 = tickEnd;\n\t\t\t\tty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth);\n\t\t\t\tlabelY = me.getPixelForTick(index) + labelOffset;\n\t\t\t\ttextOffset = (1 - labelCount) * lineHeight / 2;\n\n\t\t\t\tif (position === 'left') {\n\t\t\t\t\tx1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2;\n\t\t\t\t\tx2 = chartArea.right;\n\t\t\t\t\ttextAlign = isMirrored ? 'left' : 'right';\n\t\t\t\t\tlabelX = me.right - labelXOffset;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2;\n\t\t\t\t\ttextAlign = isMirrored ? 'right' : 'left';\n\t\t\t\t\tlabelX = me.left + labelXOffset;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titemsToDraw.push({\n\t\t\t\ttx1: tx1,\n\t\t\t\tty1: ty1,\n\t\t\t\ttx2: tx2,\n\t\t\t\tty2: ty2,\n\t\t\t\tx1: x1,\n\t\t\t\ty1: y1,\n\t\t\t\tx2: x2,\n\t\t\t\ty2: y2,\n\t\t\t\tlabelX: labelX,\n\t\t\t\tlabelY: labelY,\n\t\t\t\tglWidth: lineWidth,\n\t\t\t\tglColor: lineColor,\n\t\t\t\tglBorderDash: borderDash,\n\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\tlabel: label,\n\t\t\t\tmajor: tick.major,\n\t\t\t\ttextOffset: textOffset,\n\t\t\t\ttextAlign: textAlign\n\t\t\t});\n\t\t});\n\n\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\thelpers$1.each(itemsToDraw, function(itemToDraw) {\n\t\t\tvar glWidth = itemToDraw.glWidth;\n\t\t\tvar glColor = itemToDraw.glColor;\n\n\t\t\tif (gridLines.display && glWidth && glColor) {\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.lineWidth = glWidth;\n\t\t\t\tcontext.strokeStyle = glColor;\n\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\n\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t}\n\n\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t}\n\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (optionTicks.display) {\n\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.string : tickFont.string;\n\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\tvar y = itemToDraw.textOffset;\n\t\t\t\tif (helpers$1.isArray(label)) {\n\t\t\t\t\tfor (var i = 0; i < label.length; ++i) {\n\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcontext.fillText(label, 0, y);\n\t\t\t\t}\n\t\t\t\tcontext.restore();\n\t\t\t}\n\t\t});\n\n\t\tif (scaleLabel.display) {\n\t\t\t// Draw the scale label\n\t\t\tvar scaleLabelX;\n\t\t\tvar scaleLabelY;\n\t\t\tvar rotation = 0;\n\t\t\tvar halfLineHeight = scaleLabelFont.lineHeight / 2;\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\tscaleLabelY = position === 'bottom'\n\t\t\t\t\t? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n\t\t\t\t\t: me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t} else {\n\t\t\t\tvar isLeft = position === 'left';\n\t\t\t\tscaleLabelX = isLeft\n\t\t\t\t\t? me.left + halfLineHeight + scaleLabelPadding.top\n\t\t\t\t\t: me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t}\n\n\t\t\tcontext.save();\n\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\tcontext.rotate(rotation);\n\t\t\tcontext.textAlign = 'center';\n\t\t\tcontext.textBaseline = 'middle';\n\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\tcontext.font = scaleLabelFont.string;\n\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\tcontext.restore();\n\t\t}\n\n\t\tif (axisWidth) {\n\t\t\t// Draw the line at the edge of the axis\n\t\t\tvar firstLineWidth = axisWidth;\n\t\t\tvar lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0);\n\t\t\tvar x1, x2, y1, y2;\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tx1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;\n\t\t\t\tx2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n\t\t\t\ty1 = y2 = borderValue;\n\t\t\t} else {\n\t\t\t\ty1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2;\n\t\t\t\ty2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n\t\t\t\tx1 = x2 = borderValue;\n\t\t\t}\n\n\t\t\tcontext.lineWidth = axisWidth;\n\t\t\tcontext.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\tcontext.beginPath();\n\t\t\tcontext.moveTo(x1, y1);\n\t\t\tcontext.lineTo(x2, y2);\n\t\t\tcontext.stroke();\n\t\t}\n\t}\n});\n\nvar defaultConfig = {\n\tposition: 'bottom'\n};\n\nvar scale_category = core_scale.extend({\n\t/**\n\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t* else fall back to data.labels\n\t* @private\n\t*/\n\tgetLabels: function() {\n\t\tvar data = this.chart.data;\n\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t},\n\n\tdetermineDataLimits: function() {\n\t\tvar me = this;\n\t\tvar labels = me.getLabels();\n\t\tme.minIndex = 0;\n\t\tme.maxIndex = labels.length - 1;\n\t\tvar findIndex;\n\n\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t// user specified min value\n\t\t\tfindIndex = labels.indexOf(me.options.ticks.min);\n\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t}\n\n\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t// user specified max value\n\t\t\tfindIndex = labels.indexOf(me.options.ticks.max);\n\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t}\n\n\t\tme.min = labels[me.minIndex];\n\t\tme.max = labels[me.maxIndex];\n\t},\n\n\tbuildTicks: function() {\n\t\tvar me = this;\n\t\tvar labels = me.getLabels();\n\t\t// If we are viewing some subset of labels, slice the original array\n\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t},\n\n\tgetLabelForIndex: function(index, datasetIndex) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\n\t\tif (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) {\n\t\t\treturn me.getRightValue(chart.data.datasets[datasetIndex].data[index]);\n\t\t}\n\n\t\treturn me.ticks[index - me.minIndex];\n\t},\n\n\t// Used to get data value locations. Value can either be an index or a numerical value\n\tgetPixelForValue: function(value, index) {\n\t\tvar me = this;\n\t\tvar offset = me.options.offset;\n\t\t// 1 is added because we need the length but we have the indexes\n\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n\t\t// If value is a data object, then index is the index in the data array,\n\t\t// not the index of the scale. We need to change that.\n\t\tvar valueCategory;\n\t\tif (value !== undefined && value !== null) {\n\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t}\n\t\tif (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n\t\t\tvar labels = me.getLabels();\n\t\t\tvalue = valueCategory || value;\n\t\t\tvar idx = labels.indexOf(value);\n\t\t\tindex = idx !== -1 ? idx : index;\n\t\t}\n\n\t\tif (me.isHorizontal()) {\n\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\tif (offset) {\n\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t}\n\n\t\t\treturn me.left + widthOffset;\n\t\t}\n\t\tvar valueHeight = me.height / offsetAmt;\n\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\tif (offset) {\n\t\t\theightOffset += (valueHeight / 2);\n\t\t}\n\n\t\treturn me.top + heightOffset;\n\t},\n\n\tgetPixelForTick: function(index) {\n\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n\t},\n\n\tgetValueForPixel: function(pixel) {\n\t\tvar me = this;\n\t\tvar offset = me.options.offset;\n\t\tvar value;\n\t\tvar offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\tvar horz = me.isHorizontal();\n\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\tpixel -= horz ? me.left : me.top;\n\n\t\tif (offset) {\n\t\t\tpixel -= (valueDimension / 2);\n\t\t}\n\n\t\tif (pixel <= 0) {\n\t\t\tvalue = 0;\n\t\t} else {\n\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t}\n\n\t\treturn value + me.minIndex;\n\t},\n\n\tgetBasePixel: function() {\n\t\treturn this.bottom;\n\t}\n});\n\n// INTERNAL: static default options, registered in src/index.js\nvar _defaults = defaultConfig;\nscale_category._defaults = _defaults;\n\nvar noop = helpers$1.noop;\nvar isNullOrUndef = helpers$1.isNullOrUndef;\n\n/**\n * Generate a set of linear ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {number[]} array of tick values\n */\nfunction generateTicks(generationOptions, dataRange) {\n\tvar ticks = [];\n\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t// \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t// for details.\n\n\tvar MIN_SPACING = 1e-14;\n\tvar stepSize = generationOptions.stepSize;\n\tvar unit = stepSize || 1;\n\tvar maxNumSpaces = generationOptions.maxTicks - 1;\n\tvar min = generationOptions.min;\n\tvar max = generationOptions.max;\n\tvar precision = generationOptions.precision;\n\tvar rmin = dataRange.min;\n\tvar rmax = dataRange.max;\n\tvar spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit;\n\tvar factor, niceMin, niceMax, numSpaces;\n\n\t// Beyond MIN_SPACING floating point numbers being to lose precision\n\t// such that we can't do the math necessary to generate ticks\n\tif (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) {\n\t\treturn [rmin, rmax];\n\t}\n\n\tnumSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n\tif (numSpaces > maxNumSpaces) {\n\t\t// If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n\t\tspacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;\n\t}\n\n\tif (stepSize || isNullOrUndef(precision)) {\n\t\t// If a precision is not specified, calculate factor based on spacing\n\t\tfactor = Math.pow(10, helpers$1._decimalPlaces(spacing));\n\t} else {\n\t\t// If the user specified a precision, round to that number of decimal places\n\t\tfactor = Math.pow(10, precision);\n\t\tspacing = Math.ceil(spacing * factor) / factor;\n\t}\n\n\tniceMin = Math.floor(rmin / spacing) * spacing;\n\tniceMax = Math.ceil(rmax / spacing) * spacing;\n\n\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\tif (stepSize) {\n\t\t// If very close to our whole number, use it.\n\t\tif (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {\n\t\t\tniceMin = min;\n\t\t}\n\t\tif (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {\n\t\t\tniceMax = max;\n\t\t}\n\t}\n\n\tnumSpaces = (niceMax - niceMin) / spacing;\n\t// If very close to our rounded value, use it.\n\tif (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\tnumSpaces = Math.round(numSpaces);\n\t} else {\n\t\tnumSpaces = Math.ceil(numSpaces);\n\t}\n\n\tniceMin = Math.round(niceMin * factor) / factor;\n\tniceMax = Math.round(niceMax * factor) / factor;\n\tticks.push(isNullOrUndef(min) ? niceMin : min);\n\tfor (var j = 1; j < numSpaces; ++j) {\n\t\tticks.push(Math.round((niceMin + j * spacing) * factor) / factor);\n\t}\n\tticks.push(isNullOrUndef(max) ? niceMax : max);\n\n\treturn ticks;\n}\n\nvar scale_linearbase = core_scale.extend({\n\tgetRightValue: function(value) {\n\t\tif (typeof value === 'string') {\n\t\t\treturn +value;\n\t\t}\n\t\treturn core_scale.prototype.getRightValue.call(this, value);\n\t},\n\n\thandleTickRangeOptions: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar tickOpts = opts.ticks;\n\n\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t// axis, they can manually override it\n\t\tif (tickOpts.beginAtZero) {\n\t\t\tvar minSign = helpers$1.sign(me.min);\n\t\t\tvar maxSign = helpers$1.sign(me.max);\n\n\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t// move the top up to 0\n\t\t\t\tme.max = 0;\n\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t// move the bottom down to 0\n\t\t\t\tme.min = 0;\n\t\t\t}\n\t\t}\n\n\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n\t\tif (tickOpts.min !== undefined) {\n\t\t\tme.min = tickOpts.min;\n\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\tif (me.min === null) {\n\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t} else {\n\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t}\n\t\t}\n\n\t\tif (tickOpts.max !== undefined) {\n\t\t\tme.max = tickOpts.max;\n\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\tif (me.max === null) {\n\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t} else {\n\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t}\n\t\t}\n\n\t\tif (setMin !== setMax) {\n\t\t\t// We set the min or the max but not both.\n\t\t\t// So ensure that our range is good\n\t\t\t// Inverted or 0 length range can happen when\n\t\t\t// ticks.min is set, and no datasets are visible\n\t\t\tif (me.min >= me.max) {\n\t\t\t\tif (setMin) {\n\t\t\t\t\tme.max = me.min + 1;\n\t\t\t\t} else {\n\t\t\t\t\tme.min = me.max - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (me.min === me.max) {\n\t\t\tme.max++;\n\n\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\tme.min--;\n\t\t\t}\n\t\t}\n\t},\n\n\tgetTickLimit: function() {\n\t\tvar me = this;\n\t\tvar tickOpts = me.options.ticks;\n\t\tvar stepSize = tickOpts.stepSize;\n\t\tvar maxTicksLimit = tickOpts.maxTicksLimit;\n\t\tvar maxTicks;\n\n\t\tif (stepSize) {\n\t\t\tmaxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n\t\t} else {\n\t\t\tmaxTicks = me._computeTickLimit();\n\t\t\tmaxTicksLimit = maxTicksLimit || 11;\n\t\t}\n\n\t\tif (maxTicksLimit) {\n\t\t\tmaxTicks = Math.min(maxTicksLimit, maxTicks);\n\t\t}\n\n\t\treturn maxTicks;\n\t},\n\n\t_computeTickLimit: function() {\n\t\treturn Number.POSITIVE_INFINITY;\n\t},\n\n\thandleDirectionalChanges: noop,\n\n\tbuildTicks: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar tickOpts = opts.ticks;\n\n\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t// the graph. Make sure we always have at least 2 ticks\n\t\tvar maxTicks = me.getTickLimit();\n\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\tvar numericGeneratorOptions = {\n\t\t\tmaxTicks: maxTicks,\n\t\t\tmin: tickOpts.min,\n\t\t\tmax: tickOpts.max,\n\t\t\tprecision: tickOpts.precision,\n\t\t\tstepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t};\n\t\tvar ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\n\n\t\tme.handleDirectionalChanges();\n\n\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t// range of the scale\n\t\tme.max = helpers$1.max(ticks);\n\t\tme.min = helpers$1.min(ticks);\n\n\t\tif (tickOpts.reverse) {\n\t\t\tticks.reverse();\n\n\t\t\tme.start = me.max;\n\t\t\tme.end = me.min;\n\t\t} else {\n\t\t\tme.start = me.min;\n\t\t\tme.end = me.max;\n\t\t}\n\t},\n\n\tconvertTicksToLabels: function() {\n\t\tvar me = this;\n\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\tcore_scale.prototype.convertTicksToLabels.call(me);\n\t}\n});\n\nvar defaultConfig$1 = {\n\tposition: 'left',\n\tticks: {\n\t\tcallback: core_ticks.formatters.linear\n\t}\n};\n\nvar scale_linear = scale_linearbase.extend({\n\tdetermineDataLimits: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar chart = me.chart;\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar isHorizontal = me.isHorizontal();\n\t\tvar DEFAULT_MIN = 0;\n\t\tvar DEFAULT_MAX = 1;\n\n\t\tfunction IDMatches(meta) {\n\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t}\n\n\t\t// First Calculate the range\n\t\tme.min = null;\n\t\tme.max = null;\n\n\t\tvar hasStacks = opts.stacked;\n\t\tif (hasStacks === undefined) {\n\t\t\thelpers$1.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (hasStacks) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\thasStacks = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (opts.stacked || hasStacks) {\n\t\t\tvar valuesPerStack = {};\n\n\t\t\thelpers$1.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\tvar key = [\n\t\t\t\t\tmeta.type,\n\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\tmeta.stack\n\t\t\t\t].join('.');\n\n\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Store these per type\n\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\thelpers$1.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpositiveValues[index] += value;\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\thelpers$1.each(valuesPerStack, function(valuesForType) {\n\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\tvar minVal = helpers$1.min(values);\n\t\t\t\tvar maxVal = helpers$1.max(values);\n\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t});\n\n\t\t} else {\n\t\t\thelpers$1.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\thelpers$1.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tme.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n\t\tme.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\tthis.handleTickRangeOptions();\n\t},\n\n\t// Returns the maximum number of ticks based on the scale dimension\n\t_computeTickLimit: function() {\n\t\tvar me = this;\n\t\tvar tickFont;\n\n\t\tif (me.isHorizontal()) {\n\t\t\treturn Math.ceil(me.width / 40);\n\t\t}\n\t\ttickFont = helpers$1.options._parseFont(me.options.ticks);\n\t\treturn Math.ceil(me.height / tickFont.lineHeight);\n\t},\n\n\t// Called after the ticks are built. We need\n\thandleDirectionalChanges: function() {\n\t\tif (!this.isHorizontal()) {\n\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\tthis.ticks.reverse();\n\t\t}\n\t},\n\n\tgetLabelForIndex: function(index, datasetIndex) {\n\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t},\n\n\t// Utils\n\tgetPixelForValue: function(value) {\n\t\t// This must be called after fit has been run so that\n\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\tvar me = this;\n\t\tvar start = me.start;\n\n\t\tvar rightValue = +me.getRightValue(value);\n\t\tvar pixel;\n\t\tvar range = me.end - start;\n\n\t\tif (me.isHorizontal()) {\n\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t} else {\n\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t}\n\t\treturn pixel;\n\t},\n\n\tgetValueForPixel: function(pixel) {\n\t\tvar me = this;\n\t\tvar isHorizontal = me.isHorizontal();\n\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\treturn me.start + ((me.end - me.start) * offset);\n\t},\n\n\tgetPixelForTick: function(index) {\n\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t}\n});\n\n// INTERNAL: static default options, registered in src/index.js\nvar _defaults$1 = defaultConfig$1;\nscale_linear._defaults = _defaults$1;\n\nvar valueOrDefault$a = helpers$1.valueOrDefault;\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {number[]} array of tick values\n */\nfunction generateTicks$1(generationOptions, dataRange) {\n\tvar ticks = [];\n\n\tvar tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min))));\n\n\tvar endExp = Math.floor(helpers$1.log10(dataRange.max));\n\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\tvar exp, significand;\n\n\tif (tickVal === 0) {\n\t\texp = Math.floor(helpers$1.log10(dataRange.minNotZero));\n\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\tticks.push(tickVal);\n\t\ttickVal = significand * Math.pow(10, exp);\n\t} else {\n\t\texp = Math.floor(helpers$1.log10(tickVal));\n\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t}\n\tvar precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n\n\tdo {\n\t\tticks.push(tickVal);\n\n\t\t++significand;\n\t\tif (significand === 10) {\n\t\t\tsignificand = 1;\n\t\t\t++exp;\n\t\t\tprecision = exp >= 0 ? 1 : precision;\n\t\t}\n\n\t\ttickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\tvar lastTick = valueOrDefault$a(generationOptions.max, tickVal);\n\tticks.push(lastTick);\n\n\treturn ticks;\n}\n\nvar defaultConfig$2 = {\n\tposition: 'left',\n\n\t// label settings\n\tticks: {\n\t\tcallback: core_ticks.formatters.logarithmic\n\t}\n};\n\n// TODO(v3): change this to positiveOrDefault\nfunction nonNegativeOrDefault(value, defaultValue) {\n\treturn helpers$1.isFinite(value) && value >= 0 ? value : defaultValue;\n}\n\nvar scale_logarithmic = core_scale.extend({\n\tdetermineDataLimits: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar chart = me.chart;\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar isHorizontal = me.isHorizontal();\n\t\tfunction IDMatches(meta) {\n\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t}\n\n\t\t// Calculate Range\n\t\tme.min = null;\n\t\tme.max = null;\n\t\tme.minNotZero = null;\n\n\t\tvar hasStacks = opts.stacked;\n\t\tif (hasStacks === undefined) {\n\t\t\thelpers$1.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (hasStacks) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\thasStacks = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (opts.stacked || hasStacks) {\n\t\t\tvar valuesPerStack = {};\n\n\t\t\thelpers$1.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\tvar key = [\n\t\t\t\t\tmeta.type,\n\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\tmeta.stack\n\t\t\t\t].join('.');\n\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\thelpers$1.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers$1.each(valuesPerStack, function(valuesForType) {\n\t\t\t\tif (valuesForType.length > 0) {\n\t\t\t\t\tvar minVal = helpers$1.min(valuesForType);\n\t\t\t\t\tvar maxVal = helpers$1.max(valuesForType);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t}\n\t\t\t});\n\n\t\t} else {\n\t\t\thelpers$1.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\thelpers$1.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Common base implementation to handle ticks.min, ticks.max\n\t\tthis.handleTickRangeOptions();\n\t},\n\n\thandleTickRangeOptions: function() {\n\t\tvar me = this;\n\t\tvar tickOpts = me.options.ticks;\n\t\tvar DEFAULT_MIN = 1;\n\t\tvar DEFAULT_MAX = 10;\n\n\t\tme.min = nonNegativeOrDefault(tickOpts.min, me.min);\n\t\tme.max = nonNegativeOrDefault(tickOpts.max, me.max);\n\n\t\tif (me.min === me.max) {\n\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\tme.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1);\n\t\t\t\tme.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1);\n\t\t\t} else {\n\t\t\t\tme.min = DEFAULT_MIN;\n\t\t\t\tme.max = DEFAULT_MAX;\n\t\t\t}\n\t\t}\n\t\tif (me.min === null) {\n\t\t\tme.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1);\n\t\t}\n\t\tif (me.max === null) {\n\t\t\tme.max = me.min !== 0\n\t\t\t\t? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1)\n\t\t\t\t: DEFAULT_MAX;\n\t\t}\n\t\tif (me.minNotZero === null) {\n\t\t\tif (me.min > 0) {\n\t\t\t\tme.minNotZero = me.min;\n\t\t\t} else if (me.max < 1) {\n\t\t\t\tme.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max)));\n\t\t\t} else {\n\t\t\t\tme.minNotZero = DEFAULT_MIN;\n\t\t\t}\n\t\t}\n\t},\n\n\tbuildTicks: function() {\n\t\tvar me = this;\n\t\tvar tickOpts = me.options.ticks;\n\t\tvar reverse = !me.isHorizontal();\n\n\t\tvar generationOptions = {\n\t\t\tmin: nonNegativeOrDefault(tickOpts.min),\n\t\t\tmax: nonNegativeOrDefault(tickOpts.max)\n\t\t};\n\t\tvar ticks = me.ticks = generateTicks$1(generationOptions, me);\n\n\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t// range of the scale\n\t\tme.max = helpers$1.max(ticks);\n\t\tme.min = helpers$1.min(ticks);\n\n\t\tif (tickOpts.reverse) {\n\t\t\treverse = !reverse;\n\t\t\tme.start = me.max;\n\t\t\tme.end = me.min;\n\t\t} else {\n\t\t\tme.start = me.min;\n\t\t\tme.end = me.max;\n\t\t}\n\t\tif (reverse) {\n\t\t\tticks.reverse();\n\t\t}\n\t},\n\n\tconvertTicksToLabels: function() {\n\t\tthis.tickValues = this.ticks.slice();\n\n\t\tcore_scale.prototype.convertTicksToLabels.call(this);\n\t},\n\n\t// Get the correct tooltip label\n\tgetLabelForIndex: function(index, datasetIndex) {\n\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t},\n\n\tgetPixelForTick: function(index) {\n\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t},\n\n\t/**\n\t * Returns the value of the first tick.\n\t * @param {number} value - The minimum not zero value.\n\t * @return {number} The first tick value.\n\t * @private\n\t */\n\t_getFirstTickValue: function(value) {\n\t\tvar exp = Math.floor(helpers$1.log10(value));\n\t\tvar significand = Math.floor(value / Math.pow(10, exp));\n\n\t\treturn significand * Math.pow(10, exp);\n\t},\n\n\tgetPixelForValue: function(value) {\n\t\tvar me = this;\n\t\tvar tickOpts = me.options.ticks;\n\t\tvar reverse = tickOpts.reverse;\n\t\tvar log10 = helpers$1.log10;\n\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\tvar offset = 0;\n\t\tvar innerDimension, pixel, start, end, sign;\n\n\t\tvalue = +me.getRightValue(value);\n\t\tif (reverse) {\n\t\t\tstart = me.end;\n\t\t\tend = me.start;\n\t\t\tsign = -1;\n\t\t} else {\n\t\t\tstart = me.start;\n\t\t\tend = me.end;\n\t\t\tsign = 1;\n\t\t}\n\t\tif (me.isHorizontal()) {\n\t\t\tinnerDimension = me.width;\n\t\t\tpixel = reverse ? me.right : me.left;\n\t\t} else {\n\t\t\tinnerDimension = me.height;\n\t\t\tsign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)\n\t\t\tpixel = reverse ? me.top : me.bottom;\n\t\t}\n\t\tif (value !== start) {\n\t\t\tif (start === 0) { // include zero tick\n\t\t\t\toffset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);\n\t\t\t\tinnerDimension -= offset;\n\t\t\t\tstart = firstTickValue;\n\t\t\t}\n\t\t\tif (value !== 0) {\n\t\t\t\toffset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));\n\t\t\t}\n\t\t\tpixel += sign * offset;\n\t\t}\n\t\treturn pixel;\n\t},\n\n\tgetValueForPixel: function(pixel) {\n\t\tvar me = this;\n\t\tvar tickOpts = me.options.ticks;\n\t\tvar reverse = tickOpts.reverse;\n\t\tvar log10 = helpers$1.log10;\n\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\tvar innerDimension, start, end, value;\n\n\t\tif (reverse) {\n\t\t\tstart = me.end;\n\t\t\tend = me.start;\n\t\t} else {\n\t\t\tstart = me.start;\n\t\t\tend = me.end;\n\t\t}\n\t\tif (me.isHorizontal()) {\n\t\t\tinnerDimension = me.width;\n\t\t\tvalue = reverse ? me.right - pixel : pixel - me.left;\n\t\t} else {\n\t\t\tinnerDimension = me.height;\n\t\t\tvalue = reverse ? pixel - me.top : me.bottom - pixel;\n\t\t}\n\t\tif (value !== start) {\n\t\t\tif (start === 0) { // include zero tick\n\t\t\t\tvar offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);\n\t\t\t\tvalue -= offset;\n\t\t\t\tinnerDimension -= offset;\n\t\t\t\tstart = firstTickValue;\n\t\t\t}\n\t\t\tvalue *= log10(end) - log10(start);\n\t\t\tvalue /= innerDimension;\n\t\t\tvalue = Math.pow(10, log10(start) + value);\n\t\t}\n\t\treturn value;\n\t}\n});\n\n// INTERNAL: static default options, registered in src/index.js\nvar _defaults$2 = defaultConfig$2;\nscale_logarithmic._defaults = _defaults$2;\n\nvar valueOrDefault$b = helpers$1.valueOrDefault;\nvar valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;\nvar resolve$7 = helpers$1.options.resolve;\n\nvar defaultConfig$3 = {\n\tdisplay: true,\n\n\t// Boolean - Whether to animate scaling the chart from the centre\n\tanimate: true,\n\tposition: 'chartArea',\n\n\tangleLines: {\n\t\tdisplay: true,\n\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\tlineWidth: 1,\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0\n\t},\n\n\tgridLines: {\n\t\tcircular: false\n\t},\n\n\t// label settings\n\tticks: {\n\t\t// Boolean - Show a backdrop to the scale label\n\t\tshowLabelBackdrop: true,\n\n\t\t// String - The colour of the label backdrop\n\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t// Number - The backdrop padding above & below the label in pixels\n\t\tbackdropPaddingY: 2,\n\n\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\tbackdropPaddingX: 2,\n\n\t\tcallback: core_ticks.formatters.linear\n\t},\n\n\tpointLabels: {\n\t\t// Boolean - if true, show point labels\n\t\tdisplay: true,\n\n\t\t// Number - Point label font size in pixels\n\t\tfontSize: 10,\n\n\t\t// Function - Used to convert point labels\n\t\tcallback: function(label) {\n\t\t\treturn label;\n\t\t}\n\t}\n};\n\nfunction getValueCount(scale) {\n\tvar opts = scale.options;\n\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n}\n\nfunction getTickBackdropHeight(opts) {\n\tvar tickOpts = opts.ticks;\n\n\tif (tickOpts.display && opts.display) {\n\t\treturn valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;\n\t}\n\treturn 0;\n}\n\nfunction measureLabelSize(ctx, lineHeight, label) {\n\tif (helpers$1.isArray(label)) {\n\t\treturn {\n\t\t\tw: helpers$1.longestText(ctx, ctx.font, label),\n\t\t\th: label.length * lineHeight\n\t\t};\n\t}\n\n\treturn {\n\t\tw: ctx.measureText(label).width,\n\t\th: lineHeight\n\t};\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n\tif (angle === min || angle === max) {\n\t\treturn {\n\t\t\tstart: pos - (size / 2),\n\t\t\tend: pos + (size / 2)\n\t\t};\n\t} else if (angle < min || angle > max) {\n\t\treturn {\n\t\t\tstart: pos - size,\n\t\t\tend: pos\n\t\t};\n\t}\n\n\treturn {\n\t\tstart: pos,\n\t\tend: pos + size\n\t};\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n\t// Right, this is really confusing and there is a lot of maths going on here\n\t// The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t//\n\t// Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t//\n\t// Solution:\n\t//\n\t// We assume the radius of the polygon is half the size of the canvas at first\n\t// at each index we check if the text overlaps.\n\t//\n\t// Where it does, we store that angle and that index.\n\t//\n\t// After finding the largest index and angle we calculate how much we need to remove\n\t// from the shape radius to move the point inwards by that x.\n\t//\n\t// We average the left and right distances to get the maximum shape radius that can fit in the box\n\t// along with labels.\n\t//\n\t// Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t// on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t//\n\t// This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t// and position it in the most space efficient manner\n\t//\n\t// https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n\tvar plFont = helpers$1.options._parseFont(scale.options.pointLabels);\n\n\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\tvar furthestLimits = {\n\t\tl: 0,\n\t\tr: scale.width,\n\t\tt: 0,\n\t\tb: scale.height - scale.paddingTop\n\t};\n\tvar furthestAngles = {};\n\tvar i, textSize, pointPosition;\n\n\tscale.ctx.font = plFont.string;\n\tscale._pointLabelSizes = [];\n\n\tvar valueCount = getValueCount(scale);\n\tfor (i = 0; i < valueCount; i++) {\n\t\tpointPosition = scale.getPointPosition(i, scale.drawingArea + 5);\n\t\ttextSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || '');\n\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\tvar angle = helpers$1.toDegrees(angleRadians) % 360;\n\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\tfurthestAngles.l = angleRadians;\n\t\t}\n\n\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\tfurthestAngles.r = angleRadians;\n\t\t}\n\n\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\tfurthestAngles.t = angleRadians;\n\t\t}\n\n\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\tfurthestAngles.b = angleRadians;\n\t\t}\n\t}\n\n\tscale.setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n}\n\nfunction getTextAlignForAngle(angle) {\n\tif (angle === 0 || angle === 180) {\n\t\treturn 'center';\n\t} else if (angle < 180) {\n\t\treturn 'left';\n\t}\n\n\treturn 'right';\n}\n\nfunction fillText(ctx, text, position, lineHeight) {\n\tvar y = position.y + lineHeight / 2;\n\tvar i, ilen;\n\n\tif (helpers$1.isArray(text)) {\n\t\tfor (i = 0, ilen = text.length; i < ilen; ++i) {\n\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\ty += lineHeight;\n\t\t}\n\t} else {\n\t\tctx.fillText(text, position.x, y);\n\t}\n}\n\nfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\tif (angle === 90 || angle === 270) {\n\t\tposition.y -= (textSize.h / 2);\n\t} else if (angle > 270 || angle < 90) {\n\t\tposition.y -= textSize.h;\n\t}\n}\n\nfunction drawPointLabels(scale) {\n\tvar ctx = scale.ctx;\n\tvar opts = scale.options;\n\tvar angleLineOpts = opts.angleLines;\n\tvar gridLineOpts = opts.gridLines;\n\tvar pointLabelOpts = opts.pointLabels;\n\tvar lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth);\n\tvar lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color);\n\tvar tickBackdropHeight = getTickBackdropHeight(opts);\n\n\tctx.save();\n\tctx.lineWidth = lineWidth;\n\tctx.strokeStyle = lineColor;\n\tif (ctx.setLineDash) {\n\t\tctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));\n\t\tctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);\n\t}\n\n\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n\t// Point Label Font\n\tvar plFont = helpers$1.options._parseFont(pointLabelOpts);\n\n\tctx.font = plFont.string;\n\tctx.textBaseline = 'middle';\n\n\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\tif (angleLineOpts.display && lineWidth && lineColor) {\n\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\tctx.stroke();\n\t\t}\n\n\t\tif (pointLabelOpts.display) {\n\t\t\t// Extra pixels out for some label spacing\n\t\t\tvar extra = (i === 0 ? tickBackdropHeight / 2 : 0);\n\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);\n\n\t\t\t// Keep this in loop since we may support array properties here\n\t\t\tvar pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);\n\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers$1.toDegrees(angleRadians);\n\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight);\n\t\t}\n\t}\n\tctx.restore();\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\tvar ctx = scale.ctx;\n\tvar circular = gridLineOpts.circular;\n\tvar valueCount = getValueCount(scale);\n\tvar lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);\n\tvar lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);\n\tvar pointPosition;\n\n\tif ((!circular && !valueCount) || !lineColor || !lineWidth) {\n\t\treturn;\n\t}\n\n\tctx.save();\n\tctx.strokeStyle = lineColor;\n\tctx.lineWidth = lineWidth;\n\tif (ctx.setLineDash) {\n\t\tctx.setLineDash(gridLineOpts.borderDash || []);\n\t\tctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0;\n\t}\n\n\tctx.beginPath();\n\tif (circular) {\n\t\t// Draw circular arcs between the points\n\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t} else {\n\t\t// Draw straight lines connecting each index\n\t\tpointPosition = scale.getPointPosition(0, radius);\n\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t}\n\t}\n\tctx.closePath();\n\tctx.stroke();\n\tctx.restore();\n}\n\nfunction numberOrZero(param) {\n\treturn helpers$1.isNumber(param) ? param : 0;\n}\n\nvar scale_radialLinear = scale_linearbase.extend({\n\tsetDimensions: function() {\n\t\tvar me = this;\n\n\t\t// Set the unconstrained dimension before label rotation\n\t\tme.width = me.maxWidth;\n\t\tme.height = me.maxHeight;\n\t\tme.paddingTop = getTickBackdropHeight(me.options) / 2;\n\t\tme.xCenter = Math.floor(me.width / 2);\n\t\tme.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n\t\tme.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n\t},\n\n\tdetermineDataLimits: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar min = Number.POSITIVE_INFINITY;\n\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\thelpers$1.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\thelpers$1.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\tme.handleTickRangeOptions();\n\t},\n\n\t// Returns the maximum number of ticks based on the scale dimension\n\t_computeTickLimit: function() {\n\t\treturn Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n\t},\n\n\tconvertTicksToLabels: function() {\n\t\tvar me = this;\n\n\t\tscale_linearbase.prototype.convertTicksToLabels.call(me);\n\n\t\t// Point labels\n\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t},\n\n\tgetLabelForIndex: function(index, datasetIndex) {\n\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t},\n\n\tfit: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\n\t\tif (opts.display && opts.pointLabels.display) {\n\t\t\tfitWithPointLabels(me);\n\t\t} else {\n\t\t\tme.setCenterPoint(0, 0, 0, 0);\n\t\t}\n\t},\n\n\t/**\n\t * Set radius reductions and determine new radius and center point\n\t * @private\n\t */\n\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\tvar me = this;\n\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n\n\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\tme.drawingArea = Math.min(\n\t\t\tMath.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\tMath.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t},\n\n\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\tvar me = this;\n\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\n\t\tvar maxLeft = leftMovement + me.drawingArea;\n\t\tvar maxTop = topMovement + me.drawingArea;\n\t\tvar maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;\n\n\t\tme.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);\n\t\tme.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);\n\t},\n\n\tgetIndexAngle: function(index) {\n\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\tthis.chart.options.startAngle :\n\t\t\t0;\n\n\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\treturn index * angleMultiplier + startAngleRadians;\n\t},\n\n\tgetDistanceFromCenterForValue: function(value) {\n\t\tvar me = this;\n\n\t\tif (value === null) {\n\t\t\treturn 0; // null always in center\n\t\t}\n\n\t\t// Take into account half font size + the yPadding of the top value\n\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\tif (me.options.ticks.reverse) {\n\t\t\treturn (me.max - value) * scalingFactor;\n\t\t}\n\t\treturn (value - me.min) * scalingFactor;\n\t},\n\n\tgetPointPosition: function(index, distanceFromCenter) {\n\t\tvar me = this;\n\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\treturn {\n\t\t\tx: Math.cos(thisAngle) * distanceFromCenter + me.xCenter,\n\t\t\ty: Math.sin(thisAngle) * distanceFromCenter + me.yCenter\n\t\t};\n\t},\n\n\tgetPointPositionForValue: function(index, value) {\n\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t},\n\n\tgetBasePosition: function() {\n\t\tvar me = this;\n\t\tvar min = me.min;\n\t\tvar max = me.max;\n\n\t\treturn me.getPointPositionForValue(0,\n\t\t\tme.beginAtZero ? 0 :\n\t\t\tmin < 0 && max < 0 ? max :\n\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t0);\n\t},\n\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar gridLineOpts = opts.gridLines;\n\t\tvar tickOpts = opts.ticks;\n\n\t\tif (opts.display) {\n\t\t\tvar ctx = me.ctx;\n\t\t\tvar startAngle = this.getIndexAngle(0);\n\t\t\tvar tickFont = helpers$1.options._parseFont(tickOpts);\n\n\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\tdrawPointLabels(me);\n\t\t\t}\n\n\t\t\thelpers$1.each(me.ticks, function(label, index) {\n\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\tif (index > 0 || tickOpts.reverse) {\n\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\tvar tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor);\n\t\t\t\t\t\tctx.font = tickFont.string;\n\n\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\tctx.translate(me.xCenter, me.yCenter);\n\t\t\t\t\t\tctx.rotate(startAngle);\n\n\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t-labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t-yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\ttickFont.size + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\tctx.fillText(label, 0, -yCenterOffset);\n\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n});\n\n// INTERNAL: static default options, registered in src/index.js\nvar _defaults$3 = defaultConfig$3;\nscale_radialLinear._defaults = _defaults$3;\n\nvar valueOrDefault$c = helpers$1.valueOrDefault;\n\n// Integer constants are from the ES6 spec.\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\nvar INTERVALS = {\n\tmillisecond: {\n\t\tcommon: true,\n\t\tsize: 1,\n\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t},\n\tsecond: {\n\t\tcommon: true,\n\t\tsize: 1000,\n\t\tsteps: [1, 2, 5, 10, 15, 30]\n\t},\n\tminute: {\n\t\tcommon: true,\n\t\tsize: 60000,\n\t\tsteps: [1, 2, 5, 10, 15, 30]\n\t},\n\thour: {\n\t\tcommon: true,\n\t\tsize: 3600000,\n\t\tsteps: [1, 2, 3, 6, 12]\n\t},\n\tday: {\n\t\tcommon: true,\n\t\tsize: 86400000,\n\t\tsteps: [1, 2, 5]\n\t},\n\tweek: {\n\t\tcommon: false,\n\t\tsize: 604800000,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tmonth: {\n\t\tcommon: true,\n\t\tsize: 2.628e9,\n\t\tsteps: [1, 2, 3]\n\t},\n\tquarter: {\n\t\tcommon: false,\n\t\tsize: 7.884e9,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tyear: {\n\t\tcommon: true,\n\t\tsize: 3.154e10\n\t}\n};\n\nvar UNITS = Object.keys(INTERVALS);\n\nfunction sorter(a, b) {\n\treturn a - b;\n}\n\nfunction arrayUnique(items) {\n\tvar hash = {};\n\tvar out = [];\n\tvar i, ilen, item;\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\titem = items[i];\n\t\tif (!hash[item]) {\n\t\t\thash[item] = true;\n\t\t\tout.push(item);\n\t\t}\n\t}\n\n\treturn out;\n}\n\n/**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\nfunction buildLookupTable(timestamps, min, max, distribution) {\n\tif (distribution === 'linear' || !timestamps.length) {\n\t\treturn [\n\t\t\t{time: min, pos: 0},\n\t\t\t{time: max, pos: 1}\n\t\t];\n\t}\n\n\tvar table = [];\n\tvar items = [min];\n\tvar i, ilen, prev, curr, next;\n\n\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\tcurr = timestamps[i];\n\t\tif (curr > min && curr < max) {\n\t\t\titems.push(curr);\n\t\t}\n\t}\n\n\titems.push(max);\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\tnext = items[i + 1];\n\t\tprev = items[i - 1];\n\t\tcurr = items[i];\n\n\t\t// only add points that breaks the scale linearity\n\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n\t\t\ttable.push({time: curr, pos: i / (ilen - 1)});\n\t\t}\n\t}\n\n\treturn table;\n}\n\n// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\nfunction lookup(table, key, value) {\n\tvar lo = 0;\n\tvar hi = table.length - 1;\n\tvar mid, i0, i1;\n\n\twhile (lo >= 0 && lo <= hi) {\n\t\tmid = (lo + hi) >> 1;\n\t\ti0 = table[mid - 1] || null;\n\t\ti1 = table[mid];\n\n\t\tif (!i0) {\n\t\t\t// given value is outside table (before first item)\n\t\t\treturn {lo: null, hi: i1};\n\t\t} else if (i1[key] < value) {\n\t\t\tlo = mid + 1;\n\t\t} else if (i0[key] > value) {\n\t\t\thi = mid - 1;\n\t\t} else {\n\t\t\treturn {lo: i0, hi: i1};\n\t\t}\n\t}\n\n\t// given value is outside table (after last item)\n\treturn {lo: i1, hi: null};\n}\n\n/**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\nfunction interpolate$1(table, skey, sval, tkey) {\n\tvar range = lookup(table, skey, sval);\n\n\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n\tvar span = next[skey] - prev[skey];\n\tvar ratio = span ? (sval - prev[skey]) / span : 0;\n\tvar offset = (next[tkey] - prev[tkey]) * ratio;\n\n\treturn prev[tkey] + offset;\n}\n\nfunction toTimestamp(scale, input) {\n\tvar adapter = scale._adapter;\n\tvar options = scale.options.time;\n\tvar parser = options.parser;\n\tvar format = parser || options.format;\n\tvar value = input;\n\n\tif (typeof parser === 'function') {\n\t\tvalue = parser(value);\n\t}\n\n\t// Only parse if its not a timestamp already\n\tif (!helpers$1.isFinite(value)) {\n\t\tvalue = typeof format === 'string'\n\t\t\t? adapter.parse(value, format)\n\t\t\t: adapter.parse(value);\n\t}\n\n\tif (value !== null) {\n\t\treturn +value;\n\t}\n\n\t// Labels are in an incompatible format and no `parser` has been provided.\n\t// The user might still use the deprecated `format` option for parsing.\n\tif (!parser && typeof format === 'function') {\n\t\tvalue = format(input);\n\n\t\t// `format` could return something else than a timestamp, if so, parse it\n\t\tif (!helpers$1.isFinite(value)) {\n\t\t\tvalue = adapter.parse(value);\n\t\t}\n\t}\n\n\treturn value;\n}\n\nfunction parse(scale, input) {\n\tif (helpers$1.isNullOrUndef(input)) {\n\t\treturn null;\n\t}\n\n\tvar options = scale.options.time;\n\tvar value = toTimestamp(scale, scale.getRightValue(input));\n\tif (value === null) {\n\t\treturn value;\n\t}\n\n\tif (options.round) {\n\t\tvalue = +scale._adapter.startOf(value, options.round);\n\t}\n\n\treturn value;\n}\n\n/**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\nfunction determineStepSize(min, max, unit, capacity) {\n\tvar range = max - min;\n\tvar interval = INTERVALS[unit];\n\tvar milliseconds = interval.size;\n\tvar steps = interval.steps;\n\tvar i, ilen, factor;\n\n\tif (!steps) {\n\t\treturn Math.ceil(range / (capacity * milliseconds));\n\t}\n\n\tfor (i = 0, ilen = steps.length; i < ilen; ++i) {\n\t\tfactor = steps[i];\n\t\tif (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn factor;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n\tvar ilen = UNITS.length;\n\tvar i, interval, factor;\n\n\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n\t\tinterval = INTERVALS[UNITS[i]];\n\t\tfactor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n\n\treturn UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n */\nfunction determineUnitForFormatting(scale, ticks, minUnit, min, max) {\n\tvar ilen = UNITS.length;\n\tvar i, unit;\n\n\tfor (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n\t\tunit = UNITS[i];\n\t\tif (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) {\n\t\t\treturn unit;\n\t\t}\n\t}\n\n\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\nfunction determineMajorUnit(unit) {\n\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n\t\tif (INTERVALS[UNITS[i]].common) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n}\n\n/**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\nfunction generate(scale, min, max, capacity) {\n\tvar adapter = scale._adapter;\n\tvar options = scale.options;\n\tvar timeOpts = options.time;\n\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n\tvar major = determineMajorUnit(minor);\n\tvar stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize);\n\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n\tvar majorTicksEnabled = options.ticks.major.enabled;\n\tvar interval = INTERVALS[minor];\n\tvar first = min;\n\tvar last = max;\n\tvar ticks = [];\n\tvar time;\n\n\tif (!stepSize) {\n\t\tstepSize = determineStepSize(min, max, minor, capacity);\n\t}\n\n\t// For 'week' unit, handle the first day of week option\n\tif (weekday) {\n\t\tfirst = +adapter.startOf(first, 'isoWeek', weekday);\n\t\tlast = +adapter.startOf(last, 'isoWeek', weekday);\n\t}\n\n\t// Align first/last ticks on unit\n\tfirst = +adapter.startOf(first, weekday ? 'day' : minor);\n\tlast = +adapter.startOf(last, weekday ? 'day' : minor);\n\n\t// Make sure that the last tick include max\n\tif (last < max) {\n\t\tlast = +adapter.add(last, 1, minor);\n\t}\n\n\ttime = first;\n\n\tif (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n\t\t// Align the first tick on the previous `minor` unit aligned on the `major` unit:\n\t\t// we first aligned time on the previous `major` unit then add the number of full\n\t\t// stepSize there is between first and the previous major time.\n\t\ttime = +adapter.startOf(time, major);\n\t\ttime = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n\t}\n\n\tfor (; time < last; time = +adapter.add(time, stepSize, minor)) {\n\t\tticks.push(+time);\n\t}\n\n\tticks.push(+time);\n\n\treturn ticks;\n}\n\n/**\n * Returns the start and end offsets from edges in the form of {start, end}\n * where each value is a relative width to the scale and ranges between 0 and 1.\n * They add extra margins on the both sides by scaling down the original scale.\n * Offsets are added when the `offset` option is true.\n */\nfunction computeOffsets(table, ticks, min, max, options) {\n\tvar start = 0;\n\tvar end = 0;\n\tvar first, last;\n\n\tif (options.offset && ticks.length) {\n\t\tif (!options.time.min) {\n\t\t\tfirst = interpolate$1(table, 'time', ticks[0], 'pos');\n\t\t\tif (ticks.length === 1) {\n\t\t\t\tstart = 1 - first;\n\t\t\t} else {\n\t\t\t\tstart = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;\n\t\t\t}\n\t\t}\n\t\tif (!options.time.max) {\n\t\t\tlast = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');\n\t\t\tif (ticks.length === 1) {\n\t\t\t\tend = last;\n\t\t\t} else {\n\t\t\t\tend = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {start: start, end: end};\n}\n\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n\tvar ticks = [];\n\tvar i, ilen, value, major;\n\n\tfor (i = 0, ilen = values.length; i < ilen; ++i) {\n\t\tvalue = values[i];\n\t\tmajor = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false;\n\n\t\tticks.push({\n\t\t\tvalue: value,\n\t\t\tmajor: major\n\t\t});\n\t}\n\n\treturn ticks;\n}\n\nvar defaultConfig$4 = {\n\tposition: 'bottom',\n\n\t/**\n\t * Data distribution along the scale:\n\t * - 'linear': data are spread according to their time (distances can vary),\n\t * - 'series': data are spread at the same distance from each other.\n\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t * @since 2.7.0\n\t */\n\tdistribution: 'linear',\n\n\t/**\n\t * Scale boundary strategy (bypassed by min/max time options)\n\t * - `data`: make sure data are fully visible, ticks outside are removed\n\t * - `ticks`: make sure ticks are fully visible, data outside are truncated\n\t * @see https://github.com/chartjs/Chart.js/pull/4556\n\t * @since 2.7.0\n\t */\n\tbounds: 'data',\n\n\tadapters: {},\n\ttime: {\n\t\tparser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/\n\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\tround: false, // none, or override with week, month, year, etc.\n\t\tdisplayFormat: false, // DEPRECATED\n\t\tisoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/\n\t\tminUnit: 'millisecond',\n\t\tdisplayFormats: {}\n\t},\n\tticks: {\n\t\tautoSkip: false,\n\n\t\t/**\n\t\t * Ticks generation input values:\n\t\t * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n\t\t * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n\t\t * - 'labels': generates ticks from user given `data.labels` values ONLY.\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t * @since 2.7.0\n\t\t */\n\t\tsource: 'auto',\n\n\t\tmajor: {\n\t\t\tenabled: false\n\t\t}\n\t}\n};\n\nvar scale_time = core_scale.extend({\n\tinitialize: function() {\n\t\tthis.mergeTicksOptions();\n\t\tcore_scale.prototype.initialize.call(this);\n\t},\n\n\tupdate: function() {\n\t\tvar me = this;\n\t\tvar options = me.options;\n\t\tvar time = options.time || (options.time = {});\n\t\tvar adapter = me._adapter = new core_adapters._date(options.adapters.date);\n\n\t\t// DEPRECATIONS: output a message only one time per update\n\t\tif (time.format) {\n\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t}\n\n\t\t// Backward compatibility: before introducing adapter, `displayFormats` was\n\t\t// supposed to contain *all* unit/string pairs but this can't be resolved\n\t\t// when loading the scale (adapters are loaded afterward), so let's populate\n\t\t// missing formats on update\n\t\thelpers$1.mergeIf(time.displayFormats, adapter.formats());\n\n\t\treturn core_scale.prototype.update.apply(me, arguments);\n\t},\n\n\t/**\n\t * Allows data to be referenced via 't' attribute\n\t */\n\tgetRightValue: function(rawValue) {\n\t\tif (rawValue && rawValue.t !== undefined) {\n\t\t\trawValue = rawValue.t;\n\t\t}\n\t\treturn core_scale.prototype.getRightValue.call(this, rawValue);\n\t},\n\n\tdetermineDataLimits: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar adapter = me._adapter;\n\t\tvar timeOpts = me.options.time;\n\t\tvar unit = timeOpts.unit || 'day';\n\t\tvar min = MAX_INTEGER;\n\t\tvar max = MIN_INTEGER;\n\t\tvar timestamps = [];\n\t\tvar datasets = [];\n\t\tvar labels = [];\n\t\tvar i, j, ilen, jlen, data, timestamp;\n\t\tvar dataLabels = chart.data.labels || [];\n\n\t\t// Convert labels to timestamps\n\t\tfor (i = 0, ilen = dataLabels.length; i < ilen; ++i) {\n\t\t\tlabels.push(parse(me, dataLabels[i]));\n\t\t}\n\n\t\t// Convert data to timestamps\n\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\tdata = chart.data.datasets[i].data;\n\n\t\t\t\t// Let's consider that all data have the same format.\n\t\t\t\tif (helpers$1.isObject(data[0])) {\n\t\t\t\t\tdatasets[i] = [];\n\n\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\n\t\t\t\t\t\ttimestamp = parse(me, data[j]);\n\t\t\t\t\t\ttimestamps.push(timestamp);\n\t\t\t\t\t\tdatasets[i][j] = timestamp;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (j = 0, jlen = labels.length; j < jlen; ++j) {\n\t\t\t\t\t\ttimestamps.push(labels[j]);\n\t\t\t\t\t}\n\t\t\t\t\tdatasets[i] = labels.slice(0);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdatasets[i] = [];\n\t\t\t}\n\t\t}\n\n\t\tif (labels.length) {\n\t\t\t// Sort labels **after** data have been converted\n\t\t\tlabels = arrayUnique(labels).sort(sorter);\n\t\t\tmin = Math.min(min, labels[0]);\n\t\t\tmax = Math.max(max, labels[labels.length - 1]);\n\t\t}\n\n\t\tif (timestamps.length) {\n\t\t\ttimestamps = arrayUnique(timestamps).sort(sorter);\n\t\t\tmin = Math.min(min, timestamps[0]);\n\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\n\t\t}\n\n\t\tmin = parse(me, timeOpts.min) || min;\n\t\tmax = parse(me, timeOpts.max) || max;\n\n\t\t// In case there is no valid min/max, set limits based on unit time option\n\t\tmin = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;\n\t\tmax = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max;\n\n\t\t// Make sure that max is strictly higher than min (required by the lookup table)\n\t\tme.min = Math.min(min, max);\n\t\tme.max = Math.max(min + 1, max);\n\n\t\t// PRIVATE\n\t\tme._horizontal = me.isHorizontal();\n\t\tme._table = [];\n\t\tme._timestamps = {\n\t\t\tdata: timestamps,\n\t\t\tdatasets: datasets,\n\t\t\tlabels: labels\n\t\t};\n\t},\n\n\tbuildTicks: function() {\n\t\tvar me = this;\n\t\tvar min = me.min;\n\t\tvar max = me.max;\n\t\tvar options = me.options;\n\t\tvar timeOpts = options.time;\n\t\tvar timestamps = [];\n\t\tvar ticks = [];\n\t\tvar i, ilen, timestamp;\n\n\t\tswitch (options.ticks.source) {\n\t\tcase 'data':\n\t\t\ttimestamps = me._timestamps.data;\n\t\t\tbreak;\n\t\tcase 'labels':\n\t\t\ttimestamps = me._timestamps.labels;\n\t\t\tbreak;\n\t\tcase 'auto':\n\t\tdefault:\n\t\t\ttimestamps = generate(me, min, max, me.getLabelCapacity(min), options);\n\t\t}\n\n\t\tif (options.bounds === 'ticks' && timestamps.length) {\n\t\t\tmin = timestamps[0];\n\t\t\tmax = timestamps[timestamps.length - 1];\n\t\t}\n\n\t\t// Enforce limits with user min/max options\n\t\tmin = parse(me, timeOpts.min) || min;\n\t\tmax = parse(me, timeOpts.max) || max;\n\n\t\t// Remove ticks outside the min/max range\n\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\ttimestamp = timestamps[i];\n\t\t\tif (timestamp >= min && timestamp <= max) {\n\t\t\t\tticks.push(timestamp);\n\t\t\t}\n\t\t}\n\n\t\tme.min = min;\n\t\tme.max = max;\n\n\t\t// PRIVATE\n\t\tme._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max);\n\t\tme._majorUnit = determineMajorUnit(me._unit);\n\t\tme._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n\t\tif (options.ticks.reverse) {\n\t\t\tticks.reverse();\n\t\t}\n\n\t\treturn ticksFromTimestamps(me, ticks, me._majorUnit);\n\t},\n\n\tgetLabelForIndex: function(index, datasetIndex) {\n\t\tvar me = this;\n\t\tvar adapter = me._adapter;\n\t\tvar data = me.chart.data;\n\t\tvar timeOpts = me.options.time;\n\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\n\t\tvar value = data.datasets[datasetIndex].data[index];\n\n\t\tif (helpers$1.isObject(value)) {\n\t\t\tlabel = me.getRightValue(value);\n\t\t}\n\t\tif (timeOpts.tooltipFormat) {\n\t\t\treturn adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat);\n\t\t}\n\t\tif (typeof label === 'string') {\n\t\t\treturn label;\n\t\t}\n\t\treturn adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime);\n\t},\n\n\t/**\n\t * Function to format an individual tick mark\n\t * @private\n\t */\n\ttickFormatFunction: function(time, index, ticks, format) {\n\t\tvar me = this;\n\t\tvar adapter = me._adapter;\n\t\tvar options = me.options;\n\t\tvar formats = options.time.displayFormats;\n\t\tvar minorFormat = formats[me._unit];\n\t\tvar majorUnit = me._majorUnit;\n\t\tvar majorFormat = formats[majorUnit];\n\t\tvar majorTime = +adapter.startOf(time, majorUnit);\n\t\tvar majorTickOpts = options.ticks.major;\n\t\tvar major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n\t\tvar label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);\n\t\tvar tickOpts = major ? majorTickOpts : options.ticks.minor;\n\t\tvar formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback);\n\n\t\treturn formatter ? formatter(label, index, ticks) : label;\n\t},\n\n\tconvertTicksToLabels: function(ticks) {\n\t\tvar labels = [];\n\t\tvar i, ilen;\n\n\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\tlabels.push(this.tickFormatFunction(ticks[i].value, i, ticks));\n\t\t}\n\n\t\treturn labels;\n\t},\n\n\t/**\n\t * @private\n\t */\n\tgetPixelForOffset: function(time) {\n\t\tvar me = this;\n\t\tvar isReverse = me.options.ticks.reverse;\n\t\tvar size = me._horizontal ? me.width : me.height;\n\t\tvar start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top;\n\t\tvar pos = interpolate$1(me._table, 'time', time, 'pos');\n\t\tvar offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end);\n\n\t\treturn isReverse ? start - offset : start + offset;\n\t},\n\n\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\tvar me = this;\n\t\tvar time = null;\n\n\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\n\t\t}\n\n\t\tif (time === null) {\n\t\t\ttime = parse(me, value);\n\t\t}\n\n\t\tif (time !== null) {\n\t\t\treturn me.getPixelForOffset(time);\n\t\t}\n\t},\n\n\tgetPixelForTick: function(index) {\n\t\tvar ticks = this.getTicks();\n\t\treturn index >= 0 && index < ticks.length ?\n\t\t\tthis.getPixelForOffset(ticks[index].value) :\n\t\t\tnull;\n\t},\n\n\tgetValueForPixel: function(pixel) {\n\t\tvar me = this;\n\t\tvar size = me._horizontal ? me.width : me.height;\n\t\tvar start = me._horizontal ? me.left : me.top;\n\t\tvar pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end;\n\t\tvar time = interpolate$1(me._table, 'pos', pos, 'time');\n\n\t\t// DEPRECATION, we should return time directly\n\t\treturn me._adapter._create(time);\n\t},\n\n\t/**\n\t * Crude approximation of what the label width might be\n\t * @private\n\t */\n\tgetLabelWidth: function(label) {\n\t\tvar me = this;\n\t\tvar ticksOpts = me.options.ticks;\n\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\tvar angle = helpers$1.toRadians(ticksOpts.maxRotation);\n\t\tvar cosRotation = Math.cos(angle);\n\t\tvar sinRotation = Math.sin(angle);\n\t\tvar tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize);\n\n\t\treturn (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tgetLabelCapacity: function(exampleTime) {\n\t\tvar me = this;\n\n\t\t// pick the longest format (milliseconds) for guestimation\n\t\tvar format = me.options.time.displayFormats.millisecond;\n\t\tvar exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format);\n\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\t\tvar capacity = Math.floor(innerWidth / tickLabelWidth);\n\n\t\treturn capacity > 0 ? capacity : 1;\n\t}\n});\n\n// INTERNAL: static default options, registered in src/index.js\nvar _defaults$4 = defaultConfig$4;\nscale_time._defaults = _defaults$4;\n\nvar scales = {\n\tcategory: scale_category,\n\tlinear: scale_linear,\n\tlogarithmic: scale_logarithmic,\n\tradialLinear: scale_radialLinear,\n\ttime: scale_time\n};\n\nvar FORMATS = {\n\tdatetime: 'MMM D, YYYY, h:mm:ss a',\n\tmillisecond: 'h:mm:ss.SSS a',\n\tsecond: 'h:mm:ss a',\n\tminute: 'h:mm a',\n\thour: 'hA',\n\tday: 'MMM D',\n\tweek: 'll',\n\tmonth: 'MMM YYYY',\n\tquarter: '[Q]Q - YYYY',\n\tyear: 'YYYY'\n};\n\ncore_adapters._date.override(typeof moment === 'function' ? {\n\t_id: 'moment', // DEBUG ONLY\n\n\tformats: function() {\n\t\treturn FORMATS;\n\t},\n\n\tparse: function(value, format) {\n\t\tif (typeof value === 'string' && typeof format === 'string') {\n\t\t\tvalue = moment(value, format);\n\t\t} else if (!(value instanceof moment)) {\n\t\t\tvalue = moment(value);\n\t\t}\n\t\treturn value.isValid() ? value.valueOf() : null;\n\t},\n\n\tformat: function(time, format) {\n\t\treturn moment(time).format(format);\n\t},\n\n\tadd: function(time, amount, unit) {\n\t\treturn moment(time).add(amount, unit).valueOf();\n\t},\n\n\tdiff: function(max, min, unit) {\n\t\treturn moment.duration(moment(max).diff(moment(min))).as(unit);\n\t},\n\n\tstartOf: function(time, unit, weekday) {\n\t\ttime = moment(time);\n\t\tif (unit === 'isoWeek') {\n\t\t\treturn time.isoWeekday(weekday).valueOf();\n\t\t}\n\t\treturn time.startOf(unit).valueOf();\n\t},\n\n\tendOf: function(time, unit) {\n\t\treturn moment(time).endOf(unit).valueOf();\n\t},\n\n\t// DEPRECATIONS\n\n\t/**\n\t * Provided for backward compatibility with scale.getValueForPixel().\n\t * @deprecated since version 2.8.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\t_create: function(time) {\n\t\treturn moment(time);\n\t},\n} : {});\n\ncore_defaults._set('global', {\n\tplugins: {\n\t\tfiller: {\n\t\t\tpropagate: true\n\t\t}\n\t}\n});\n\nvar mappers = {\n\tdataset: function(source) {\n\t\tvar index = source.fill;\n\t\tvar chart = source.chart;\n\t\tvar meta = chart.getDatasetMeta(index);\n\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\tvar points = (visible && meta.dataset._children) || [];\n\t\tvar length = points.length || 0;\n\n\t\treturn !length ? null : function(point, i) {\n\t\t\treturn (i < length && points[i]._view) || null;\n\t\t};\n\t},\n\n\tboundary: function(source) {\n\t\tvar boundary = source.boundary;\n\t\tvar x = boundary ? boundary.x : null;\n\t\tvar y = boundary ? boundary.y : null;\n\n\t\treturn function(point) {\n\t\t\treturn {\n\t\t\t\tx: x === null ? point.x : x,\n\t\t\t\ty: y === null ? point.y : y,\n\t\t\t};\n\t\t};\n\t}\n};\n\n// @todo if (fill[0] === '#')\nfunction decodeFill(el, index, count) {\n\tvar model = el._model || {};\n\tvar fill = model.fill;\n\tvar target;\n\n\tif (fill === undefined) {\n\t\tfill = !!model.backgroundColor;\n\t}\n\n\tif (fill === false || fill === null) {\n\t\treturn false;\n\t}\n\n\tif (fill === true) {\n\t\treturn 'origin';\n\t}\n\n\ttarget = parseFloat(fill, 10);\n\tif (isFinite(target) && Math.floor(target) === target) {\n\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\ttarget = index + target;\n\t\t}\n\n\t\tif (target === index || target < 0 || target >= count) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tswitch (fill) {\n\t// compatibility\n\tcase 'bottom':\n\t\treturn 'start';\n\tcase 'top':\n\t\treturn 'end';\n\tcase 'zero':\n\t\treturn 'origin';\n\t// supported boundaries\n\tcase 'origin':\n\tcase 'start':\n\tcase 'end':\n\t\treturn fill;\n\t// invalid fill values\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nfunction computeBoundary(source) {\n\tvar model = source.el._model || {};\n\tvar scale = source.el._scale || {};\n\tvar fill = source.fill;\n\tvar target = null;\n\tvar horizontal;\n\n\tif (isFinite(fill)) {\n\t\treturn null;\n\t}\n\n\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t// controllers might still use it (e.g. the Smith chart).\n\n\tif (fill === 'start') {\n\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n\t} else if (fill === 'end') {\n\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\n\t} else if (model.scaleZero !== undefined) {\n\t\ttarget = model.scaleZero;\n\t} else if (scale.getBasePosition) {\n\t\ttarget = scale.getBasePosition();\n\t} else if (scale.getBasePixel) {\n\t\ttarget = scale.getBasePixel();\n\t}\n\n\tif (target !== undefined && target !== null) {\n\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\treturn target;\n\t\t}\n\n\t\tif (helpers$1.isFinite(target)) {\n\t\t\thorizontal = scale.isHorizontal();\n\t\t\treturn {\n\t\t\t\tx: horizontal ? target : null,\n\t\t\t\ty: horizontal ? null : target\n\t\t\t};\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction resolveTarget(sources, index, propagate) {\n\tvar source = sources[index];\n\tvar fill = source.fill;\n\tvar visited = [index];\n\tvar target;\n\n\tif (!propagate) {\n\t\treturn fill;\n\t}\n\n\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\tif (!isFinite(fill)) {\n\t\t\treturn fill;\n\t\t}\n\n\t\ttarget = sources[fill];\n\t\tif (!target) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (target.visible) {\n\t\t\treturn fill;\n\t\t}\n\n\t\tvisited.push(fill);\n\t\tfill = target.fill;\n\t}\n\n\treturn false;\n}\n\nfunction createMapper(source) {\n\tvar fill = source.fill;\n\tvar type = 'dataset';\n\n\tif (fill === false) {\n\t\treturn null;\n\t}\n\n\tif (!isFinite(fill)) {\n\t\ttype = 'boundary';\n\t}\n\n\treturn mappers[type](source);\n}\n\nfunction isDrawable(point) {\n\treturn point && !point.skip;\n}\n\nfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\tvar i;\n\n\tif (!len0 || !len1) {\n\t\treturn;\n\t}\n\n\t// building first area curve (normal)\n\tctx.moveTo(curve0[0].x, curve0[0].y);\n\tfor (i = 1; i < len0; ++i) {\n\t\thelpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n\t}\n\n\t// joining the two area curves\n\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n\t// building opposite area curve (reverse)\n\tfor (i = len1 - 1; i > 0; --i) {\n\t\thelpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n\t}\n}\n\nfunction doFill(ctx, points, mapper, view, color, loop) {\n\tvar count = points.length;\n\tvar span = view.spanGaps;\n\tvar curve0 = [];\n\tvar curve1 = [];\n\tvar len0 = 0;\n\tvar len1 = 0;\n\tvar i, ilen, index, p0, p1, d0, d1;\n\n\tctx.beginPath();\n\n\tfor (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n\t\tindex = i % count;\n\t\tp0 = points[index]._view;\n\t\tp1 = mapper(p0, index, view);\n\t\td0 = isDrawable(p0);\n\t\td1 = isDrawable(p1);\n\n\t\tif (d0 && d1) {\n\t\t\tlen0 = curve0.push(p0);\n\t\t\tlen1 = curve1.push(p1);\n\t\t} else if (len0 && len1) {\n\t\t\tif (!span) {\n\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\tlen0 = len1 = 0;\n\t\t\t\tcurve0 = [];\n\t\t\t\tcurve1 = [];\n\t\t\t} else {\n\t\t\t\tif (d0) {\n\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t}\n\t\t\t\tif (d1) {\n\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\tctx.closePath();\n\tctx.fillStyle = color;\n\tctx.fill();\n}\n\nvar plugin_filler = {\n\tid: 'filler',\n\n\tafterDatasetsUpdate: function(chart, options) {\n\t\tvar count = (chart.data.datasets || []).length;\n\t\tvar propagate = options.propagate;\n\t\tvar sources = [];\n\t\tvar meta, i, el, source;\n\n\t\tfor (i = 0; i < count; ++i) {\n\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\tel = meta.dataset;\n\t\t\tsource = null;\n\n\t\t\tif (el && el._model && el instanceof elements.Line) {\n\t\t\t\tsource = {\n\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\tchart: chart,\n\t\t\t\t\tel: el\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmeta.$filler = source;\n\t\t\tsources.push(source);\n\t\t}\n\n\t\tfor (i = 0; i < count; ++i) {\n\t\t\tsource = sources[i];\n\t\t\tif (!source) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\tsource.boundary = computeBoundary(source);\n\t\t\tsource.mapper = createMapper(source);\n\t\t}\n\t},\n\n\tbeforeDatasetDraw: function(chart, args) {\n\t\tvar meta = args.meta.$filler;\n\t\tif (!meta) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar ctx = chart.ctx;\n\t\tvar el = meta.el;\n\t\tvar view = el._view;\n\t\tvar points = el._children || [];\n\t\tvar mapper = meta.mapper;\n\t\tvar color = view.backgroundColor || core_defaults.global.defaultColor;\n\n\t\tif (mapper && color && points.length) {\n\t\t\thelpers$1.canvas.clipArea(ctx, chart.chartArea);\n\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\n\t\t\thelpers$1.canvas.unclipArea(ctx);\n\t\t}\n\t}\n};\n\nvar noop$1 = helpers$1.noop;\nvar valueOrDefault$d = helpers$1.valueOrDefault;\n\ncore_defaults._set('global', {\n\tlegend: {\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true,\n\t\treverse: false,\n\t\tweight: 1000,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\t\tonLeave: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t},\n\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('');\n\t\treturn text.join('');\n\t}\n});\n\n/**\n * Helper function to get the box width based on the usePointStyle option\n * @param {object} labelopts - the label options on the legend\n * @param {number} fontSize - the label font size\n * @return {number} width of the color box area\n */\nfunction getBoxWidth(labelOpts, fontSize) {\n\treturn labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ?\n\t\tfontSize :\n\t\tlabelOpts.boxWidth;\n}\n\n/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\nvar Legend = core_element.extend({\n\n\tinitialize: function(config) {\n\t\thelpers$1.extend(this, config);\n\n\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\tthis.legendHitBoxes = [];\n\n\t\t/**\n \t\t * @private\n \t\t */\n\t\tthis._hoveredItem = null;\n\n\t\t// Are we in doughnut mode which has a different data type\n\t\tthis.doughnutMode = false;\n\t},\n\n\t// These methods are ordered by lifecycle. Utilities then follow.\n\t// Any function defined here is inherited by all legend types.\n\t// Any function can be extended by the legend type\n\n\tbeforeUpdate: noop$1,\n\tupdate: function(maxWidth, maxHeight, margins) {\n\t\tvar me = this;\n\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\tme.beforeUpdate();\n\n\t\t// Absorb the master measurements\n\t\tme.maxWidth = maxWidth;\n\t\tme.maxHeight = maxHeight;\n\t\tme.margins = margins;\n\n\t\t// Dimensions\n\t\tme.beforeSetDimensions();\n\t\tme.setDimensions();\n\t\tme.afterSetDimensions();\n\t\t// Labels\n\t\tme.beforeBuildLabels();\n\t\tme.buildLabels();\n\t\tme.afterBuildLabels();\n\n\t\t// Fit\n\t\tme.beforeFit();\n\t\tme.fit();\n\t\tme.afterFit();\n\t\t//\n\t\tme.afterUpdate();\n\n\t\treturn me.minSize;\n\t},\n\tafterUpdate: noop$1,\n\n\t//\n\n\tbeforeSetDimensions: noop$1,\n\tsetDimensions: function() {\n\t\tvar me = this;\n\t\t// Set the unconstrained dimension before label rotation\n\t\tif (me.isHorizontal()) {\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.left = 0;\n\t\t\tme.right = me.width;\n\t\t} else {\n\t\t\tme.height = me.maxHeight;\n\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.top = 0;\n\t\t\tme.bottom = me.height;\n\t\t}\n\n\t\t// Reset padding\n\t\tme.paddingLeft = 0;\n\t\tme.paddingTop = 0;\n\t\tme.paddingRight = 0;\n\t\tme.paddingBottom = 0;\n\n\t\t// Reset minSize\n\t\tme.minSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t},\n\tafterSetDimensions: noop$1,\n\n\t//\n\n\tbeforeBuildLabels: noop$1,\n\tbuildLabels: function() {\n\t\tvar me = this;\n\t\tvar labelOpts = me.options.labels || {};\n\t\tvar legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n\t\tif (labelOpts.filter) {\n\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t});\n\t\t}\n\n\t\tif (me.options.reverse) {\n\t\t\tlegendItems.reverse();\n\t\t}\n\n\t\tme.legendItems = legendItems;\n\t},\n\tafterBuildLabels: noop$1,\n\n\t//\n\n\tbeforeFit: noop$1,\n\tfit: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar labelOpts = opts.labels;\n\t\tvar display = opts.display;\n\n\t\tvar ctx = me.ctx;\n\n\t\tvar labelFont = helpers$1.options._parseFont(labelOpts);\n\t\tvar fontSize = labelFont.size;\n\n\t\t// Reset hit boxes\n\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\tvar minSize = me.minSize;\n\t\tvar isHorizontal = me.isHorizontal();\n\n\t\tif (isHorizontal) {\n\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\tminSize.height = display ? 10 : 0;\n\t\t} else {\n\t\t\tminSize.width = display ? 10 : 0;\n\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t}\n\n\t\t// Increase sizes here\n\t\tif (display) {\n\t\t\tctx.font = labelFont.string;\n\n\t\t\tif (isHorizontal) {\n\t\t\t\t// Labels\n\n\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\tvar totalHeight = 0;\n\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\thelpers$1.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\tif (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) {\n\t\t\t\t\t\ttotalHeight += fontSize + labelOpts.padding;\n\t\t\t\t\t\tlineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t};\n\n\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t});\n\n\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t} else {\n\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\tvar currentColWidth = 0;\n\t\t\t\tvar currentColHeight = 0;\n\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\thelpers$1.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\tif (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) {\n\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get max width\n\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\tminSize.width += totalWidth;\n\t\t\t}\n\t\t}\n\n\t\tme.width = minSize.width;\n\t\tme.height = minSize.height;\n\t},\n\tafterFit: noop$1,\n\n\t// Shared Methods\n\tisHorizontal: function() {\n\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t},\n\n\t// Actually draw the legend on the canvas\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar labelOpts = opts.labels;\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar defaultColor = globalDefaults.defaultColor;\n\t\tvar lineDefault = globalDefaults.elements.line;\n\t\tvar legendWidth = me.width;\n\t\tvar lineWidths = me.lineWidths;\n\n\t\tif (opts.display) {\n\t\t\tvar ctx = me.ctx;\n\t\t\tvar fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar labelFont = helpers$1.options._parseFont(labelOpts);\n\t\t\tvar fontSize = labelFont.size;\n\t\t\tvar cursor;\n\n\t\t\t// Canvas setup\n\t\t\tctx.textAlign = 'left';\n\t\t\tctx.textBaseline = 'middle';\n\t\t\tctx.lineWidth = 0.5;\n\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\tctx.font = labelFont.string;\n\n\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\tvar hitboxes = me.legendHitBoxes;\n\n\t\t\t// current position\n\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Set the ctx for the box\n\t\t\t\tctx.save();\n\n\t\t\t\tvar lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\tctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor);\n\t\t\t\tctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\tctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\tctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\tctx.lineWidth = lineWidth;\n\t\t\t\tctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor);\n\n\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\tctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t}\n\n\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\tvar radius = boxWidth * Math.SQRT2 / 2;\n\t\t\t\t\tvar centerX = x + boxWidth / 2;\n\t\t\t\t\tvar centerY = y + fontSize / 2;\n\n\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\thelpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t} else {\n\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\tif (lineWidth !== 0) {\n\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t}\n\n\t\t\t\tctx.restore();\n\t\t\t};\n\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\tvar halfFontSize = fontSize / 2;\n\t\t\t\tvar xLeft = boxWidth + halfFontSize + x;\n\t\t\t\tvar yMiddle = y + halfFontSize;\n\n\t\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\n\n\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\tctx.moveTo(xLeft, yMiddle);\n\t\t\t\t\tctx.lineTo(xLeft + textWidth, yMiddle);\n\t\t\t\t\tctx.stroke();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Horizontal\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tif (isHorizontal) {\n\t\t\t\tcursor = {\n\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding,\n\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\tline: 0\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tcursor = {\n\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\tline: 0\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\thelpers$1.each(me.legendItems, function(legendItem, i) {\n\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\n\t\t\t\tvar width = boxWidth + (fontSize / 2) + textWidth;\n\t\t\t\tvar x = cursor.x;\n\t\t\t\tvar y = cursor.y;\n\n\t\t\t\t// Use (me.left + me.minSize.width) and (me.top + me.minSize.height)\n\t\t\t\t// instead of me.right and me.bottom because me.width and me.height\n\t\t\t\t// may have been changed since me.minSize was calculated\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tif (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {\n\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding;\n\t\t\t\t\t}\n\t\t\t\t} else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {\n\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\tcursor.line++;\n\t\t\t\t}\n\n\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\thitboxes[i].left = x;\n\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t// Fill the actual label\n\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor.x += width + labelOpts.padding;\n\t\t\t\t} else {\n\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t}\n\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getLegendItemAt: function(x, y) {\n\t\tvar me = this;\n\t\tvar i, hitBox, lh;\n\n\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t// See if we are touching one of the dataset boxes\n\t\t\tlh = me.legendHitBoxes;\n\t\t\tfor (i = 0; i < lh.length; ++i) {\n\t\t\t\thitBox = lh[i];\n\n\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t// Touching an element\n\t\t\t\t\treturn me.legendItems[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Handle an event\n\t * @private\n\t * @param {IEvent} event - The event to handle\n\t */\n\thandleEvent: function(e) {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\tvar hoveredItem;\n\n\t\tif (type === 'mousemove') {\n\t\t\tif (!opts.onHover && !opts.onLeave) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (type === 'click') {\n\t\t\tif (!opts.onClick) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\t// Chart event already has relative position in it\n\t\thoveredItem = me._getLegendItemAt(e.x, e.y);\n\n\t\tif (type === 'click') {\n\t\t\tif (hoveredItem && opts.onClick) {\n\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\topts.onClick.call(me, e.native, hoveredItem);\n\t\t\t}\n\t\t} else {\n\t\t\tif (opts.onLeave && hoveredItem !== me._hoveredItem) {\n\t\t\t\tif (me._hoveredItem) {\n\t\t\t\t\topts.onLeave.call(me, e.native, me._hoveredItem);\n\t\t\t\t}\n\t\t\t\tme._hoveredItem = hoveredItem;\n\t\t\t}\n\n\t\t\tif (opts.onHover && hoveredItem) {\n\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\topts.onHover.call(me, e.native, hoveredItem);\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction createNewLegendAndAttach(chart, legendOpts) {\n\tvar legend = new Legend({\n\t\tctx: chart.ctx,\n\t\toptions: legendOpts,\n\t\tchart: chart\n\t});\n\n\tcore_layouts.configure(chart, legend, legendOpts);\n\tcore_layouts.addBox(chart, legend);\n\tchart.legend = legend;\n}\n\nvar plugin_legend = {\n\tid: 'legend',\n\n\t/**\n\t * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\n\t * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\n\t * the plugin, which one will be re-exposed in the chart.js file.\n\t * https://github.com/chartjs/Chart.js/pull/2640\n\t * @private\n\t */\n\t_element: Legend,\n\n\tbeforeInit: function(chart) {\n\t\tvar legendOpts = chart.options.legend;\n\n\t\tif (legendOpts) {\n\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t}\n\t},\n\n\tbeforeUpdate: function(chart) {\n\t\tvar legendOpts = chart.options.legend;\n\t\tvar legend = chart.legend;\n\n\t\tif (legendOpts) {\n\t\t\thelpers$1.mergeIf(legendOpts, core_defaults.global.legend);\n\n\t\t\tif (legend) {\n\t\t\t\tcore_layouts.configure(chart, legend, legendOpts);\n\t\t\t\tlegend.options = legendOpts;\n\t\t\t} else {\n\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t}\n\t\t} else if (legend) {\n\t\t\tcore_layouts.removeBox(chart, legend);\n\t\t\tdelete chart.legend;\n\t\t}\n\t},\n\n\tafterEvent: function(chart, e) {\n\t\tvar legend = chart.legend;\n\t\tif (legend) {\n\t\t\tlegend.handleEvent(e);\n\t\t}\n\t}\n};\n\nvar noop$2 = helpers$1.noop;\n\ncore_defaults._set('global', {\n\ttitle: {\n\t\tdisplay: false,\n\t\tfontStyle: 'bold',\n\t\tfullWidth: true,\n\t\tpadding: 10,\n\t\tposition: 'top',\n\t\ttext: '',\n\t\tweight: 2000 // by default greater than legend (1000) to be above\n\t}\n});\n\n/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\nvar Title = core_element.extend({\n\tinitialize: function(config) {\n\t\tvar me = this;\n\t\thelpers$1.extend(me, config);\n\n\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\tme.legendHitBoxes = [];\n\t},\n\n\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\tbeforeUpdate: noop$2,\n\tupdate: function(maxWidth, maxHeight, margins) {\n\t\tvar me = this;\n\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\tme.beforeUpdate();\n\n\t\t// Absorb the master measurements\n\t\tme.maxWidth = maxWidth;\n\t\tme.maxHeight = maxHeight;\n\t\tme.margins = margins;\n\n\t\t// Dimensions\n\t\tme.beforeSetDimensions();\n\t\tme.setDimensions();\n\t\tme.afterSetDimensions();\n\t\t// Labels\n\t\tme.beforeBuildLabels();\n\t\tme.buildLabels();\n\t\tme.afterBuildLabels();\n\n\t\t// Fit\n\t\tme.beforeFit();\n\t\tme.fit();\n\t\tme.afterFit();\n\t\t//\n\t\tme.afterUpdate();\n\n\t\treturn me.minSize;\n\n\t},\n\tafterUpdate: noop$2,\n\n\t//\n\n\tbeforeSetDimensions: noop$2,\n\tsetDimensions: function() {\n\t\tvar me = this;\n\t\t// Set the unconstrained dimension before label rotation\n\t\tif (me.isHorizontal()) {\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.left = 0;\n\t\t\tme.right = me.width;\n\t\t} else {\n\t\t\tme.height = me.maxHeight;\n\n\t\t\t// Reset position before calculating rotation\n\t\t\tme.top = 0;\n\t\t\tme.bottom = me.height;\n\t\t}\n\n\t\t// Reset padding\n\t\tme.paddingLeft = 0;\n\t\tme.paddingTop = 0;\n\t\tme.paddingRight = 0;\n\t\tme.paddingBottom = 0;\n\n\t\t// Reset minSize\n\t\tme.minSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t},\n\tafterSetDimensions: noop$2,\n\n\t//\n\n\tbeforeBuildLabels: noop$2,\n\tbuildLabels: noop$2,\n\tafterBuildLabels: noop$2,\n\n\t//\n\n\tbeforeFit: noop$2,\n\tfit: function() {\n\t\tvar me = this;\n\t\tvar opts = me.options;\n\t\tvar display = opts.display;\n\t\tvar minSize = me.minSize;\n\t\tvar lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;\n\t\tvar fontOpts = helpers$1.options._parseFont(opts);\n\t\tvar textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0;\n\n\t\tif (me.isHorizontal()) {\n\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\tminSize.height = textSize;\n\t\t} else {\n\t\t\tminSize.width = textSize;\n\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t}\n\n\t\tme.width = minSize.width;\n\t\tme.height = minSize.height;\n\n\t},\n\tafterFit: noop$2,\n\n\t// Shared Methods\n\tisHorizontal: function() {\n\t\tvar pos = this.options.position;\n\t\treturn pos === 'top' || pos === 'bottom';\n\t},\n\n\t// Actually draw the title block on the canvas\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar ctx = me.ctx;\n\t\tvar opts = me.options;\n\n\t\tif (opts.display) {\n\t\t\tvar fontOpts = helpers$1.options._parseFont(opts);\n\t\t\tvar lineHeight = fontOpts.lineHeight;\n\t\t\tvar offset = lineHeight / 2 + opts.padding;\n\t\t\tvar rotation = 0;\n\t\t\tvar top = me.top;\n\t\t\tvar left = me.left;\n\t\t\tvar bottom = me.bottom;\n\t\t\tvar right = me.right;\n\t\t\tvar maxWidth, titleX, titleY;\n\n\t\t\tctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour\n\t\t\tctx.font = fontOpts.string;\n\n\t\t\t// Horizontal\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\ttitleY = top + offset;\n\t\t\t\tmaxWidth = right - left;\n\t\t\t} else {\n\t\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\n\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t}\n\n\t\t\tctx.save();\n\t\t\tctx.translate(titleX, titleY);\n\t\t\tctx.rotate(rotation);\n\t\t\tctx.textAlign = 'center';\n\t\t\tctx.textBaseline = 'middle';\n\n\t\t\tvar text = opts.text;\n\t\t\tif (helpers$1.isArray(text)) {\n\t\t\t\tvar y = 0;\n\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\n\t\t\t\t\ty += lineHeight;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tctx.fillText(text, 0, 0, maxWidth);\n\t\t\t}\n\n\t\t\tctx.restore();\n\t\t}\n\t}\n});\n\nfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\tvar title = new Title({\n\t\tctx: chart.ctx,\n\t\toptions: titleOpts,\n\t\tchart: chart\n\t});\n\n\tcore_layouts.configure(chart, title, titleOpts);\n\tcore_layouts.addBox(chart, title);\n\tchart.titleBlock = title;\n}\n\nvar plugin_title = {\n\tid: 'title',\n\n\t/**\n\t * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\n\t * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\n\t * the plugin, which one will be re-exposed in the chart.js file.\n\t * https://github.com/chartjs/Chart.js/pull/2640\n\t * @private\n\t */\n\t_element: Title,\n\n\tbeforeInit: function(chart) {\n\t\tvar titleOpts = chart.options.title;\n\n\t\tif (titleOpts) {\n\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t}\n\t},\n\n\tbeforeUpdate: function(chart) {\n\t\tvar titleOpts = chart.options.title;\n\t\tvar titleBlock = chart.titleBlock;\n\n\t\tif (titleOpts) {\n\t\t\thelpers$1.mergeIf(titleOpts, core_defaults.global.title);\n\n\t\t\tif (titleBlock) {\n\t\t\t\tcore_layouts.configure(chart, titleBlock, titleOpts);\n\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t} else {\n\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t}\n\t\t} else if (titleBlock) {\n\t\t\tcore_layouts.removeBox(chart, titleBlock);\n\t\t\tdelete chart.titleBlock;\n\t\t}\n\t}\n};\n\nvar plugins = {};\nvar filler = plugin_filler;\nvar legend = plugin_legend;\nvar title = plugin_title;\nplugins.filler = filler;\nplugins.legend = legend;\nplugins.title = title;\n\n/**\n * @namespace Chart\n */\n\n\ncore_controller.helpers = helpers$1;\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\ncore_helpers(core_controller);\n\ncore_controller._adapters = core_adapters;\ncore_controller.Animation = core_animation;\ncore_controller.animationService = core_animations;\ncore_controller.controllers = controllers;\ncore_controller.DatasetController = core_datasetController;\ncore_controller.defaults = core_defaults;\ncore_controller.Element = core_element;\ncore_controller.elements = elements;\ncore_controller.Interaction = core_interaction;\ncore_controller.layouts = core_layouts;\ncore_controller.platform = platform;\ncore_controller.plugins = core_plugins;\ncore_controller.Scale = core_scale;\ncore_controller.scaleService = core_scaleService;\ncore_controller.Ticks = core_ticks;\ncore_controller.Tooltip = core_tooltip;\n\n// Register built-in scales\n\ncore_controller.helpers.each(scales, function(scale, type) {\n\tcore_controller.scaleService.registerScaleType(type, scale, scale._defaults);\n});\n\n// Load to register built-in adapters (as side effects)\n\n\n// Loading built-in plugins\n\nfor (var k in plugins) {\n\tif (plugins.hasOwnProperty(k)) {\n\t\tcore_controller.plugins.register(plugins[k]);\n\t}\n}\n\ncore_controller.platform.initialize();\n\nvar src = core_controller;\nif (typeof window !== 'undefined') {\n\twindow.Chart = core_controller;\n}\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Chart\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\ncore_controller.Chart = core_controller;\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 */\ncore_controller.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 */\ncore_controller.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 */\ncore_controller.pluginService = core_controller.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 */\ncore_controller.PluginBase = core_controller.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 */\ncore_controller.canvasHelpers = core_controller.helpers.canvas;\n\n/**\n * Provided for backward compatibility, use Chart.layouts instead.\n * @namespace Chart.layoutService\n * @deprecated since version 2.7.3\n * @todo remove at version 3\n * @private\n */\ncore_controller.layoutService = core_controller.layouts;\n\n/**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart.LinearScaleBase\n * @deprecated since version 2.8\n * @todo remove at version 3\n * @private\n */\ncore_controller.LinearScaleBase = scale_linearbase;\n\n/**\n * Provided for backward compatibility, instead we should create a new Chart\n * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`).\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n */\ncore_controller.helpers.each(\n\t[\n\t\t'Bar',\n\t\t'Bubble',\n\t\t'Doughnut',\n\t\t'Line',\n\t\t'PolarArea',\n\t\t'Radar',\n\t\t'Scatter'\n\t],\n\tfunction(klass) {\n\t\tcore_controller[klass] = function(ctx, cfg) {\n\t\t\treturn new core_controller(ctx, core_controller.helpers.merge(cfg || {}, {\n\t\t\t\ttype: klass.charAt(0).toLowerCase() + klass.slice(1)\n\t\t\t}));\n\t\t};\n\t}\n);\n\nreturn src;\n\n})));\n"],"sourceRoot":""}